// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;

namespace Pulumiverse.Fortios
{
    /// <summary>
    /// Configure shaping policies.
    /// 
    /// ## Example Usage
    /// 
    /// ```csharp
    /// using System.Collections.Generic;
    /// using System.Linq;
    /// using Pulumi;
    /// using Fortios = Pulumiverse.Fortios;
    /// 
    /// return await Deployment.RunAsync(() =&gt; 
    /// {
    ///     var trname = new Fortios.FirewallShapingpolicy("trname", new()
    ///     {
    ///         ClassId = 0,
    ///         DiffservForward = "disable",
    ///         DiffservReverse = "disable",
    ///         DiffservcodeForward = "000000",
    ///         DiffservcodeRev = "000000",
    ///         Dstaddrs = new[]
    ///         {
    ///             new Fortios.Inputs.FirewallShapingpolicyDstaddrArgs
    ///             {
    ///                 Name = "all",
    ///             },
    ///         },
    ///         Dstintfs = new[]
    ///         {
    ///             new Fortios.Inputs.FirewallShapingpolicyDstintfArgs
    ///             {
    ///                 Name = "port4",
    ///             },
    ///         },
    ///         Fosid = 1,
    ///         InternetService = "disable",
    ///         InternetServiceSrc = "disable",
    ///         IpVersion = "4",
    ///         Services = new[]
    ///         {
    ///             new Fortios.Inputs.FirewallShapingpolicyServiceArgs
    ///             {
    ///                 Name = "ALL",
    ///             },
    ///         },
    ///         Srcaddrs = new[]
    ///         {
    ///             new Fortios.Inputs.FirewallShapingpolicySrcaddrArgs
    ///             {
    ///                 Name = "all",
    ///             },
    ///         },
    ///         Status = "enable",
    ///         Tos = "0x00",
    ///         TosMask = "0x00",
    ///         TosNegate = "disable",
    ///     });
    /// 
    /// });
    /// ```
    /// 
    /// ## Import
    /// 
    /// Firewall ShapingPolicy can be imported using any of these accepted formats
    /// 
    /// ```sh
    ///  $ pulumi import fortios:index/firewallShapingpolicy:FirewallShapingpolicy labelname {{fosid}}
    /// ```
    /// 
    ///  If you do not want to import arguments of block$ export "FORTIOS_IMPORT_TABLE"="false"
    /// 
    /// ```sh
    ///  $ pulumi import fortios:index/firewallShapingpolicy:FirewallShapingpolicy labelname {{fosid}}
    /// ```
    /// 
    ///  $ unset "FORTIOS_IMPORT_TABLE"
    /// </summary>
    [FortiosResourceType("fortios:index/firewallShapingpolicy:FirewallShapingpolicy")]
    public partial class FirewallShapingpolicy : global::Pulumi.CustomResource
    {
        /// <summary>
        /// IDs of one or more application categories that this shaper applies application control traffic shaping to. The structure of `app_category` block is documented below.
        /// </summary>
        [Output("appCategories")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyAppCategory>> AppCategories { get; private set; } = null!;

        /// <summary>
        /// One or more application group names. The structure of `app_group` block is documented below.
        /// </summary>
        [Output("appGroups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyAppGroup>> AppGroups { get; private set; } = null!;

        /// <summary>
        /// IDs of one or more applications that this shaper applies application control traffic shaping to. The structure of `application` block is documented below.
        /// </summary>
        [Output("applications")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyApplication>> Applications { get; private set; } = null!;

        /// <summary>
        /// Traffic class ID.
        /// </summary>
        [Output("classId")]
        public Output<int> ClassId { get; private set; } = null!;

        /// <summary>
        /// Comments.
        /// </summary>
        [Output("comment")]
        public Output<string?> Comment { get; private set; } = null!;

        /// <summary>
        /// Enable to change packet's DiffServ values to the specified diffservcode-forward value. Valid values: `enable`, `disable`.
        /// </summary>
        [Output("diffservForward")]
        public Output<string> DiffservForward { get; private set; } = null!;

        /// <summary>
        /// Enable to change packet's reverse (reply) DiffServ values to the specified diffservcode-rev value. Valid values: `enable`, `disable`.
        /// </summary>
        [Output("diffservReverse")]
        public Output<string> DiffservReverse { get; private set; } = null!;

        /// <summary>
        /// Change packet's DiffServ to this value.
        /// </summary>
        [Output("diffservcodeForward")]
        public Output<string> DiffservcodeForward { get; private set; } = null!;

        /// <summary>
        /// Change packet's reverse (reply) DiffServ to this value.
        /// </summary>
        [Output("diffservcodeRev")]
        public Output<string> DiffservcodeRev { get; private set; } = null!;

        /// <summary>
        /// IPv6 destination address and address group names. The structure of `dstaddr6` block is documented below.
        /// </summary>
        [Output("dstaddr6s")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyDstaddr6>> Dstaddr6s { get; private set; } = null!;

        /// <summary>
        /// IPv4 destination address and address group names. The structure of `dstaddr` block is documented below.
        /// </summary>
        [Output("dstaddrs")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyDstaddr>> Dstaddrs { get; private set; } = null!;

        /// <summary>
        /// One or more outgoing (egress) interfaces. The structure of `dstintf` block is documented below.
        /// </summary>
        [Output("dstintfs")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyDstintf>> Dstintfs { get; private set; } = null!;

        /// <summary>
        /// Sort sub-tables, please do not set this parameter when configuring static sub-tables. Options: [ false, true, natural, alphabetical ]. false: Default value, do not sort tables; true/natural: sort tables in natural order. For example: [ a10, a2 ] -&gt; [ a2, a10 ]; alphabetical: sort tables in alphabetical order. For example: [ a10, a2 ] -&gt; [ a10, a2 ].
        /// </summary>
        [Output("dynamicSortSubtable")]
        public Output<string?> DynamicSortSubtable { get; private set; } = null!;

        /// <summary>
        /// Shaping policy ID.
        /// </summary>
        [Output("fosid")]
        public Output<int> Fosid { get; private set; } = null!;

        /// <summary>
        /// Apply this traffic shaping policy to user groups that have authenticated with the FortiGate. The structure of `groups` block is documented below.
        /// </summary>
        [Output("groups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyGroup>> Groups { get; private set; } = null!;

        /// <summary>
        /// Enable/disable use of Internet Services for this policy. If enabled, destination address and service are not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Output("internetService")]
        public Output<string> InternetService { get; private set; } = null!;

        /// <summary>
        /// Custom Internet Service group name. The structure of `internet_service_custom_group` block is documented below.
        /// </summary>
        [Output("internetServiceCustomGroups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceCustomGroup>> InternetServiceCustomGroups { get; private set; } = null!;

        /// <summary>
        /// Custom Internet Service name. The structure of `internet_service_custom` block is documented below.
        /// </summary>
        [Output("internetServiceCustoms")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceCustom>> InternetServiceCustoms { get; private set; } = null!;

        /// <summary>
        /// Internet Service group name. The structure of `internet_service_group` block is documented below.
        /// </summary>
        [Output("internetServiceGroups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceGroup>> InternetServiceGroups { get; private set; } = null!;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_id` block is documented below.
        /// </summary>
        [Output("internetServiceIds")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceId>> InternetServiceIds { get; private set; } = null!;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_name` block is documented below.
        /// </summary>
        [Output("internetServiceNames")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceName>> InternetServiceNames { get; private set; } = null!;

        /// <summary>
        /// Enable/disable use of Internet Services in source for this policy. If enabled, source address is not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Output("internetServiceSrc")]
        public Output<string> InternetServiceSrc { get; private set; } = null!;

        /// <summary>
        /// Custom Internet Service source group name. The structure of `internet_service_src_custom_group` block is documented below.
        /// </summary>
        [Output("internetServiceSrcCustomGroups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceSrcCustomGroup>> InternetServiceSrcCustomGroups { get; private set; } = null!;

        /// <summary>
        /// Custom Internet Service source name. The structure of `internet_service_src_custom` block is documented below.
        /// </summary>
        [Output("internetServiceSrcCustoms")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceSrcCustom>> InternetServiceSrcCustoms { get; private set; } = null!;

        /// <summary>
        /// Internet Service source group name. The structure of `internet_service_src_group` block is documented below.
        /// </summary>
        [Output("internetServiceSrcGroups")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceSrcGroup>> InternetServiceSrcGroups { get; private set; } = null!;

        /// <summary>
        /// Internet Service source ID. The structure of `internet_service_src_id` block is documented below.
        /// </summary>
        [Output("internetServiceSrcIds")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceSrcId>> InternetServiceSrcIds { get; private set; } = null!;

        /// <summary>
        /// Internet Service source name. The structure of `internet_service_src_name` block is documented below.
        /// </summary>
        [Output("internetServiceSrcNames")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyInternetServiceSrcName>> InternetServiceSrcNames { get; private set; } = null!;

        /// <summary>
        /// Apply this traffic shaping policy to IPv4 or IPv6 traffic. Valid values: `4`, `6`.
        /// </summary>
        [Output("ipVersion")]
        public Output<string> IpVersion { get; private set; } = null!;

        /// <summary>
        /// Shaping policy name.
        /// </summary>
        [Output("name")]
        public Output<string> Name { get; private set; } = null!;

        /// <summary>
        /// Per-IP traffic shaper to apply with this policy.
        /// </summary>
        [Output("perIpShaper")]
        public Output<string> PerIpShaper { get; private set; } = null!;

        /// <summary>
        /// Schedule name.
        /// </summary>
        [Output("schedule")]
        public Output<string> Schedule { get; private set; } = null!;

        /// <summary>
        /// Service and service group names. The structure of `service` block is documented below.
        /// </summary>
        [Output("services")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyService>> Services { get; private set; } = null!;

        /// <summary>
        /// IPv6 source address and address group names. The structure of `srcaddr6` block is documented below.
        /// </summary>
        [Output("srcaddr6s")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicySrcaddr6>> Srcaddr6s { get; private set; } = null!;

        /// <summary>
        /// IPv4 source address and address group names. The structure of `srcaddr` block is documented below.
        /// </summary>
        [Output("srcaddrs")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicySrcaddr>> Srcaddrs { get; private set; } = null!;

        /// <summary>
        /// One or more incoming (ingress) interfaces. The structure of `srcintf` block is documented below.
        /// </summary>
        [Output("srcintfs")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicySrcintf>> Srcintfs { get; private set; } = null!;

        /// <summary>
        /// Enable/disable this traffic shaping policy. Valid values: `enable`, `disable`.
        /// </summary>
        [Output("status")]
        public Output<string> Status { get; private set; } = null!;

        /// <summary>
        /// ToS (Type of Service) value used for comparison.
        /// </summary>
        [Output("tos")]
        public Output<string> Tos { get; private set; } = null!;

        /// <summary>
        /// Non-zero bit positions are used for comparison while zero bit positions are ignored.
        /// </summary>
        [Output("tosMask")]
        public Output<string> TosMask { get; private set; } = null!;

        /// <summary>
        /// Enable negated TOS match. Valid values: `enable`, `disable`.
        /// </summary>
        [Output("tosNegate")]
        public Output<string> TosNegate { get; private set; } = null!;

        /// <summary>
        /// Traffic shaper to apply to traffic forwarded by the firewall policy.
        /// </summary>
        [Output("trafficShaper")]
        public Output<string> TrafficShaper { get; private set; } = null!;

        /// <summary>
        /// Traffic shaper to apply to response traffic received by the firewall policy.
        /// </summary>
        [Output("trafficShaperReverse")]
        public Output<string> TrafficShaperReverse { get; private set; } = null!;

        /// <summary>
        /// IDs of one or more FortiGuard Web Filtering categories that this shaper applies traffic shaping to. The structure of `url_category` block is documented below.
        /// </summary>
        [Output("urlCategories")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyUrlCategory>> UrlCategories { get; private set; } = null!;

        /// <summary>
        /// Apply this traffic shaping policy to individual users that have authenticated with the FortiGate. The structure of `users` block is documented below.
        /// </summary>
        [Output("users")]
        public Output<ImmutableArray<Outputs.FirewallShapingpolicyUser>> Users { get; private set; } = null!;

        /// <summary>
        /// Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
        /// </summary>
        [Output("uuid")]
        public Output<string> Uuid { get; private set; } = null!;

        /// <summary>
        /// Specifies the vdom to which the resource will be applied when the FortiGate unit is running in VDOM mode. Only one vdom can be specified. If you want to inherit the vdom configuration of the provider, please do not set this parameter.
        /// </summary>
        [Output("vdomparam")]
        public Output<string?> Vdomparam { get; private set; } = null!;


        /// <summary>
        /// Create a FirewallShapingpolicy resource with the given unique name, arguments, and options.
        /// </summary>
        ///
        /// <param name="name">The unique name of the resource</param>
        /// <param name="args">The arguments used to populate this resource's properties</param>
        /// <param name="options">A bag of options that control this resource's behavior</param>
        public FirewallShapingpolicy(string name, FirewallShapingpolicyArgs args, CustomResourceOptions? options = null)
            : base("fortios:index/firewallShapingpolicy:FirewallShapingpolicy", name, args ?? new FirewallShapingpolicyArgs(), MakeResourceOptions(options, ""))
        {
        }

        private FirewallShapingpolicy(string name, Input<string> id, FirewallShapingpolicyState? state = null, CustomResourceOptions? options = null)
            : base("fortios:index/firewallShapingpolicy:FirewallShapingpolicy", name, state, MakeResourceOptions(options, id))
        {
        }

        private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
        {
            var defaultOptions = new CustomResourceOptions
            {
                Version = Utilities.Version,
                PluginDownloadURL = "github://api.github.com/pulumiverse/pulumi-fortios",
            };
            var merged = CustomResourceOptions.Merge(defaultOptions, options);
            // Override the ID if one was specified for consistency with other language SDKs.
            merged.Id = id ?? merged.Id;
            return merged;
        }
        /// <summary>
        /// Get an existing FirewallShapingpolicy resource's state with the given name, ID, and optional extra
        /// properties used to qualify the lookup.
        /// </summary>
        ///
        /// <param name="name">The unique name of the resulting resource.</param>
        /// <param name="id">The unique provider ID of the resource to lookup.</param>
        /// <param name="state">Any extra arguments used during the lookup.</param>
        /// <param name="options">A bag of options that control this resource's behavior</param>
        public static FirewallShapingpolicy Get(string name, Input<string> id, FirewallShapingpolicyState? state = null, CustomResourceOptions? options = null)
        {
            return new FirewallShapingpolicy(name, id, state, options);
        }
    }

    public sealed class FirewallShapingpolicyArgs : global::Pulumi.ResourceArgs
    {
        [Input("appCategories")]
        private InputList<Inputs.FirewallShapingpolicyAppCategoryArgs>? _appCategories;

        /// <summary>
        /// IDs of one or more application categories that this shaper applies application control traffic shaping to. The structure of `app_category` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyAppCategoryArgs> AppCategories
        {
            get => _appCategories ?? (_appCategories = new InputList<Inputs.FirewallShapingpolicyAppCategoryArgs>());
            set => _appCategories = value;
        }

        [Input("appGroups")]
        private InputList<Inputs.FirewallShapingpolicyAppGroupArgs>? _appGroups;

        /// <summary>
        /// One or more application group names. The structure of `app_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyAppGroupArgs> AppGroups
        {
            get => _appGroups ?? (_appGroups = new InputList<Inputs.FirewallShapingpolicyAppGroupArgs>());
            set => _appGroups = value;
        }

        [Input("applications")]
        private InputList<Inputs.FirewallShapingpolicyApplicationArgs>? _applications;

        /// <summary>
        /// IDs of one or more applications that this shaper applies application control traffic shaping to. The structure of `application` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyApplicationArgs> Applications
        {
            get => _applications ?? (_applications = new InputList<Inputs.FirewallShapingpolicyApplicationArgs>());
            set => _applications = value;
        }

        /// <summary>
        /// Traffic class ID.
        /// </summary>
        [Input("classId")]
        public Input<int>? ClassId { get; set; }

        /// <summary>
        /// Comments.
        /// </summary>
        [Input("comment")]
        public Input<string>? Comment { get; set; }

        /// <summary>
        /// Enable to change packet's DiffServ values to the specified diffservcode-forward value. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("diffservForward")]
        public Input<string>? DiffservForward { get; set; }

        /// <summary>
        /// Enable to change packet's reverse (reply) DiffServ values to the specified diffservcode-rev value. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("diffservReverse")]
        public Input<string>? DiffservReverse { get; set; }

        /// <summary>
        /// Change packet's DiffServ to this value.
        /// </summary>
        [Input("diffservcodeForward")]
        public Input<string>? DiffservcodeForward { get; set; }

        /// <summary>
        /// Change packet's reverse (reply) DiffServ to this value.
        /// </summary>
        [Input("diffservcodeRev")]
        public Input<string>? DiffservcodeRev { get; set; }

        [Input("dstaddr6s")]
        private InputList<Inputs.FirewallShapingpolicyDstaddr6Args>? _dstaddr6s;

        /// <summary>
        /// IPv6 destination address and address group names. The structure of `dstaddr6` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstaddr6Args> Dstaddr6s
        {
            get => _dstaddr6s ?? (_dstaddr6s = new InputList<Inputs.FirewallShapingpolicyDstaddr6Args>());
            set => _dstaddr6s = value;
        }

        [Input("dstaddrs", required: true)]
        private InputList<Inputs.FirewallShapingpolicyDstaddrArgs>? _dstaddrs;

        /// <summary>
        /// IPv4 destination address and address group names. The structure of `dstaddr` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstaddrArgs> Dstaddrs
        {
            get => _dstaddrs ?? (_dstaddrs = new InputList<Inputs.FirewallShapingpolicyDstaddrArgs>());
            set => _dstaddrs = value;
        }

        [Input("dstintfs", required: true)]
        private InputList<Inputs.FirewallShapingpolicyDstintfArgs>? _dstintfs;

        /// <summary>
        /// One or more outgoing (egress) interfaces. The structure of `dstintf` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstintfArgs> Dstintfs
        {
            get => _dstintfs ?? (_dstintfs = new InputList<Inputs.FirewallShapingpolicyDstintfArgs>());
            set => _dstintfs = value;
        }

        /// <summary>
        /// Sort sub-tables, please do not set this parameter when configuring static sub-tables. Options: [ false, true, natural, alphabetical ]. false: Default value, do not sort tables; true/natural: sort tables in natural order. For example: [ a10, a2 ] -&gt; [ a2, a10 ]; alphabetical: sort tables in alphabetical order. For example: [ a10, a2 ] -&gt; [ a10, a2 ].
        /// </summary>
        [Input("dynamicSortSubtable")]
        public Input<string>? DynamicSortSubtable { get; set; }

        /// <summary>
        /// Shaping policy ID.
        /// </summary>
        [Input("fosid")]
        public Input<int>? Fosid { get; set; }

        [Input("groups")]
        private InputList<Inputs.FirewallShapingpolicyGroupArgs>? _groups;

        /// <summary>
        /// Apply this traffic shaping policy to user groups that have authenticated with the FortiGate. The structure of `groups` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyGroupArgs> Groups
        {
            get => _groups ?? (_groups = new InputList<Inputs.FirewallShapingpolicyGroupArgs>());
            set => _groups = value;
        }

        /// <summary>
        /// Enable/disable use of Internet Services for this policy. If enabled, destination address and service are not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Input("internetService")]
        public Input<string>? InternetService { get; set; }

        [Input("internetServiceCustomGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupArgs>? _internetServiceCustomGroups;

        /// <summary>
        /// Custom Internet Service group name. The structure of `internet_service_custom_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupArgs> InternetServiceCustomGroups
        {
            get => _internetServiceCustomGroups ?? (_internetServiceCustomGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupArgs>());
            set => _internetServiceCustomGroups = value;
        }

        [Input("internetServiceCustoms")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceCustomArgs>? _internetServiceCustoms;

        /// <summary>
        /// Custom Internet Service name. The structure of `internet_service_custom` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceCustomArgs> InternetServiceCustoms
        {
            get => _internetServiceCustoms ?? (_internetServiceCustoms = new InputList<Inputs.FirewallShapingpolicyInternetServiceCustomArgs>());
            set => _internetServiceCustoms = value;
        }

        [Input("internetServiceGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceGroupArgs>? _internetServiceGroups;

        /// <summary>
        /// Internet Service group name. The structure of `internet_service_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceGroupArgs> InternetServiceGroups
        {
            get => _internetServiceGroups ?? (_internetServiceGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceGroupArgs>());
            set => _internetServiceGroups = value;
        }

        [Input("internetServiceIds")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceIdArgs>? _internetServiceIds;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_id` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceIdArgs> InternetServiceIds
        {
            get => _internetServiceIds ?? (_internetServiceIds = new InputList<Inputs.FirewallShapingpolicyInternetServiceIdArgs>());
            set => _internetServiceIds = value;
        }

        [Input("internetServiceNames")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceNameArgs>? _internetServiceNames;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_name` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceNameArgs> InternetServiceNames
        {
            get => _internetServiceNames ?? (_internetServiceNames = new InputList<Inputs.FirewallShapingpolicyInternetServiceNameArgs>());
            set => _internetServiceNames = value;
        }

        /// <summary>
        /// Enable/disable use of Internet Services in source for this policy. If enabled, source address is not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Input("internetServiceSrc")]
        public Input<string>? InternetServiceSrc { get; set; }

        [Input("internetServiceSrcCustomGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupArgs>? _internetServiceSrcCustomGroups;

        /// <summary>
        /// Custom Internet Service source group name. The structure of `internet_service_src_custom_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupArgs> InternetServiceSrcCustomGroups
        {
            get => _internetServiceSrcCustomGroups ?? (_internetServiceSrcCustomGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupArgs>());
            set => _internetServiceSrcCustomGroups = value;
        }

        [Input("internetServiceSrcCustoms")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomArgs>? _internetServiceSrcCustoms;

        /// <summary>
        /// Custom Internet Service source name. The structure of `internet_service_src_custom` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomArgs> InternetServiceSrcCustoms
        {
            get => _internetServiceSrcCustoms ?? (_internetServiceSrcCustoms = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomArgs>());
            set => _internetServiceSrcCustoms = value;
        }

        [Input("internetServiceSrcGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupArgs>? _internetServiceSrcGroups;

        /// <summary>
        /// Internet Service source group name. The structure of `internet_service_src_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupArgs> InternetServiceSrcGroups
        {
            get => _internetServiceSrcGroups ?? (_internetServiceSrcGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupArgs>());
            set => _internetServiceSrcGroups = value;
        }

        [Input("internetServiceSrcIds")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdArgs>? _internetServiceSrcIds;

        /// <summary>
        /// Internet Service source ID. The structure of `internet_service_src_id` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdArgs> InternetServiceSrcIds
        {
            get => _internetServiceSrcIds ?? (_internetServiceSrcIds = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdArgs>());
            set => _internetServiceSrcIds = value;
        }

        [Input("internetServiceSrcNames")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameArgs>? _internetServiceSrcNames;

        /// <summary>
        /// Internet Service source name. The structure of `internet_service_src_name` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameArgs> InternetServiceSrcNames
        {
            get => _internetServiceSrcNames ?? (_internetServiceSrcNames = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameArgs>());
            set => _internetServiceSrcNames = value;
        }

        /// <summary>
        /// Apply this traffic shaping policy to IPv4 or IPv6 traffic. Valid values: `4`, `6`.
        /// </summary>
        [Input("ipVersion")]
        public Input<string>? IpVersion { get; set; }

        /// <summary>
        /// Shaping policy name.
        /// </summary>
        [Input("name")]
        public Input<string>? Name { get; set; }

        /// <summary>
        /// Per-IP traffic shaper to apply with this policy.
        /// </summary>
        [Input("perIpShaper")]
        public Input<string>? PerIpShaper { get; set; }

        /// <summary>
        /// Schedule name.
        /// </summary>
        [Input("schedule")]
        public Input<string>? Schedule { get; set; }

        [Input("services", required: true)]
        private InputList<Inputs.FirewallShapingpolicyServiceArgs>? _services;

        /// <summary>
        /// Service and service group names. The structure of `service` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyServiceArgs> Services
        {
            get => _services ?? (_services = new InputList<Inputs.FirewallShapingpolicyServiceArgs>());
            set => _services = value;
        }

        [Input("srcaddr6s")]
        private InputList<Inputs.FirewallShapingpolicySrcaddr6Args>? _srcaddr6s;

        /// <summary>
        /// IPv6 source address and address group names. The structure of `srcaddr6` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcaddr6Args> Srcaddr6s
        {
            get => _srcaddr6s ?? (_srcaddr6s = new InputList<Inputs.FirewallShapingpolicySrcaddr6Args>());
            set => _srcaddr6s = value;
        }

        [Input("srcaddrs", required: true)]
        private InputList<Inputs.FirewallShapingpolicySrcaddrArgs>? _srcaddrs;

        /// <summary>
        /// IPv4 source address and address group names. The structure of `srcaddr` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcaddrArgs> Srcaddrs
        {
            get => _srcaddrs ?? (_srcaddrs = new InputList<Inputs.FirewallShapingpolicySrcaddrArgs>());
            set => _srcaddrs = value;
        }

        [Input("srcintfs")]
        private InputList<Inputs.FirewallShapingpolicySrcintfArgs>? _srcintfs;

        /// <summary>
        /// One or more incoming (ingress) interfaces. The structure of `srcintf` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcintfArgs> Srcintfs
        {
            get => _srcintfs ?? (_srcintfs = new InputList<Inputs.FirewallShapingpolicySrcintfArgs>());
            set => _srcintfs = value;
        }

        /// <summary>
        /// Enable/disable this traffic shaping policy. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("status")]
        public Input<string>? Status { get; set; }

        /// <summary>
        /// ToS (Type of Service) value used for comparison.
        /// </summary>
        [Input("tos")]
        public Input<string>? Tos { get; set; }

        /// <summary>
        /// Non-zero bit positions are used for comparison while zero bit positions are ignored.
        /// </summary>
        [Input("tosMask")]
        public Input<string>? TosMask { get; set; }

        /// <summary>
        /// Enable negated TOS match. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("tosNegate")]
        public Input<string>? TosNegate { get; set; }

        /// <summary>
        /// Traffic shaper to apply to traffic forwarded by the firewall policy.
        /// </summary>
        [Input("trafficShaper")]
        public Input<string>? TrafficShaper { get; set; }

        /// <summary>
        /// Traffic shaper to apply to response traffic received by the firewall policy.
        /// </summary>
        [Input("trafficShaperReverse")]
        public Input<string>? TrafficShaperReverse { get; set; }

        [Input("urlCategories")]
        private InputList<Inputs.FirewallShapingpolicyUrlCategoryArgs>? _urlCategories;

        /// <summary>
        /// IDs of one or more FortiGuard Web Filtering categories that this shaper applies traffic shaping to. The structure of `url_category` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyUrlCategoryArgs> UrlCategories
        {
            get => _urlCategories ?? (_urlCategories = new InputList<Inputs.FirewallShapingpolicyUrlCategoryArgs>());
            set => _urlCategories = value;
        }

        [Input("users")]
        private InputList<Inputs.FirewallShapingpolicyUserArgs>? _users;

        /// <summary>
        /// Apply this traffic shaping policy to individual users that have authenticated with the FortiGate. The structure of `users` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyUserArgs> Users
        {
            get => _users ?? (_users = new InputList<Inputs.FirewallShapingpolicyUserArgs>());
            set => _users = value;
        }

        /// <summary>
        /// Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
        /// </summary>
        [Input("uuid")]
        public Input<string>? Uuid { get; set; }

        /// <summary>
        /// Specifies the vdom to which the resource will be applied when the FortiGate unit is running in VDOM mode. Only one vdom can be specified. If you want to inherit the vdom configuration of the provider, please do not set this parameter.
        /// </summary>
        [Input("vdomparam")]
        public Input<string>? Vdomparam { get; set; }

        public FirewallShapingpolicyArgs()
        {
        }
        public static new FirewallShapingpolicyArgs Empty => new FirewallShapingpolicyArgs();
    }

    public sealed class FirewallShapingpolicyState : global::Pulumi.ResourceArgs
    {
        [Input("appCategories")]
        private InputList<Inputs.FirewallShapingpolicyAppCategoryGetArgs>? _appCategories;

        /// <summary>
        /// IDs of one or more application categories that this shaper applies application control traffic shaping to. The structure of `app_category` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyAppCategoryGetArgs> AppCategories
        {
            get => _appCategories ?? (_appCategories = new InputList<Inputs.FirewallShapingpolicyAppCategoryGetArgs>());
            set => _appCategories = value;
        }

        [Input("appGroups")]
        private InputList<Inputs.FirewallShapingpolicyAppGroupGetArgs>? _appGroups;

        /// <summary>
        /// One or more application group names. The structure of `app_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyAppGroupGetArgs> AppGroups
        {
            get => _appGroups ?? (_appGroups = new InputList<Inputs.FirewallShapingpolicyAppGroupGetArgs>());
            set => _appGroups = value;
        }

        [Input("applications")]
        private InputList<Inputs.FirewallShapingpolicyApplicationGetArgs>? _applications;

        /// <summary>
        /// IDs of one or more applications that this shaper applies application control traffic shaping to. The structure of `application` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyApplicationGetArgs> Applications
        {
            get => _applications ?? (_applications = new InputList<Inputs.FirewallShapingpolicyApplicationGetArgs>());
            set => _applications = value;
        }

        /// <summary>
        /// Traffic class ID.
        /// </summary>
        [Input("classId")]
        public Input<int>? ClassId { get; set; }

        /// <summary>
        /// Comments.
        /// </summary>
        [Input("comment")]
        public Input<string>? Comment { get; set; }

        /// <summary>
        /// Enable to change packet's DiffServ values to the specified diffservcode-forward value. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("diffservForward")]
        public Input<string>? DiffservForward { get; set; }

        /// <summary>
        /// Enable to change packet's reverse (reply) DiffServ values to the specified diffservcode-rev value. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("diffservReverse")]
        public Input<string>? DiffservReverse { get; set; }

        /// <summary>
        /// Change packet's DiffServ to this value.
        /// </summary>
        [Input("diffservcodeForward")]
        public Input<string>? DiffservcodeForward { get; set; }

        /// <summary>
        /// Change packet's reverse (reply) DiffServ to this value.
        /// </summary>
        [Input("diffservcodeRev")]
        public Input<string>? DiffservcodeRev { get; set; }

        [Input("dstaddr6s")]
        private InputList<Inputs.FirewallShapingpolicyDstaddr6GetArgs>? _dstaddr6s;

        /// <summary>
        /// IPv6 destination address and address group names. The structure of `dstaddr6` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstaddr6GetArgs> Dstaddr6s
        {
            get => _dstaddr6s ?? (_dstaddr6s = new InputList<Inputs.FirewallShapingpolicyDstaddr6GetArgs>());
            set => _dstaddr6s = value;
        }

        [Input("dstaddrs")]
        private InputList<Inputs.FirewallShapingpolicyDstaddrGetArgs>? _dstaddrs;

        /// <summary>
        /// IPv4 destination address and address group names. The structure of `dstaddr` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstaddrGetArgs> Dstaddrs
        {
            get => _dstaddrs ?? (_dstaddrs = new InputList<Inputs.FirewallShapingpolicyDstaddrGetArgs>());
            set => _dstaddrs = value;
        }

        [Input("dstintfs")]
        private InputList<Inputs.FirewallShapingpolicyDstintfGetArgs>? _dstintfs;

        /// <summary>
        /// One or more outgoing (egress) interfaces. The structure of `dstintf` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyDstintfGetArgs> Dstintfs
        {
            get => _dstintfs ?? (_dstintfs = new InputList<Inputs.FirewallShapingpolicyDstintfGetArgs>());
            set => _dstintfs = value;
        }

        /// <summary>
        /// Sort sub-tables, please do not set this parameter when configuring static sub-tables. Options: [ false, true, natural, alphabetical ]. false: Default value, do not sort tables; true/natural: sort tables in natural order. For example: [ a10, a2 ] -&gt; [ a2, a10 ]; alphabetical: sort tables in alphabetical order. For example: [ a10, a2 ] -&gt; [ a10, a2 ].
        /// </summary>
        [Input("dynamicSortSubtable")]
        public Input<string>? DynamicSortSubtable { get; set; }

        /// <summary>
        /// Shaping policy ID.
        /// </summary>
        [Input("fosid")]
        public Input<int>? Fosid { get; set; }

        [Input("groups")]
        private InputList<Inputs.FirewallShapingpolicyGroupGetArgs>? _groups;

        /// <summary>
        /// Apply this traffic shaping policy to user groups that have authenticated with the FortiGate. The structure of `groups` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyGroupGetArgs> Groups
        {
            get => _groups ?? (_groups = new InputList<Inputs.FirewallShapingpolicyGroupGetArgs>());
            set => _groups = value;
        }

        /// <summary>
        /// Enable/disable use of Internet Services for this policy. If enabled, destination address and service are not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Input("internetService")]
        public Input<string>? InternetService { get; set; }

        [Input("internetServiceCustomGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupGetArgs>? _internetServiceCustomGroups;

        /// <summary>
        /// Custom Internet Service group name. The structure of `internet_service_custom_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupGetArgs> InternetServiceCustomGroups
        {
            get => _internetServiceCustomGroups ?? (_internetServiceCustomGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGroupGetArgs>());
            set => _internetServiceCustomGroups = value;
        }

        [Input("internetServiceCustoms")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGetArgs>? _internetServiceCustoms;

        /// <summary>
        /// Custom Internet Service name. The structure of `internet_service_custom` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGetArgs> InternetServiceCustoms
        {
            get => _internetServiceCustoms ?? (_internetServiceCustoms = new InputList<Inputs.FirewallShapingpolicyInternetServiceCustomGetArgs>());
            set => _internetServiceCustoms = value;
        }

        [Input("internetServiceGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceGroupGetArgs>? _internetServiceGroups;

        /// <summary>
        /// Internet Service group name. The structure of `internet_service_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceGroupGetArgs> InternetServiceGroups
        {
            get => _internetServiceGroups ?? (_internetServiceGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceGroupGetArgs>());
            set => _internetServiceGroups = value;
        }

        [Input("internetServiceIds")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceIdGetArgs>? _internetServiceIds;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_id` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceIdGetArgs> InternetServiceIds
        {
            get => _internetServiceIds ?? (_internetServiceIds = new InputList<Inputs.FirewallShapingpolicyInternetServiceIdGetArgs>());
            set => _internetServiceIds = value;
        }

        [Input("internetServiceNames")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceNameGetArgs>? _internetServiceNames;

        /// <summary>
        /// Internet Service ID. The structure of `internet_service_name` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceNameGetArgs> InternetServiceNames
        {
            get => _internetServiceNames ?? (_internetServiceNames = new InputList<Inputs.FirewallShapingpolicyInternetServiceNameGetArgs>());
            set => _internetServiceNames = value;
        }

        /// <summary>
        /// Enable/disable use of Internet Services in source for this policy. If enabled, source address is not used.  Valid values: `enable`, `disable`.
        /// </summary>
        [Input("internetServiceSrc")]
        public Input<string>? InternetServiceSrc { get; set; }

        [Input("internetServiceSrcCustomGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupGetArgs>? _internetServiceSrcCustomGroups;

        /// <summary>
        /// Custom Internet Service source group name. The structure of `internet_service_src_custom_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupGetArgs> InternetServiceSrcCustomGroups
        {
            get => _internetServiceSrcCustomGroups ?? (_internetServiceSrcCustomGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGroupGetArgs>());
            set => _internetServiceSrcCustomGroups = value;
        }

        [Input("internetServiceSrcCustoms")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGetArgs>? _internetServiceSrcCustoms;

        /// <summary>
        /// Custom Internet Service source name. The structure of `internet_service_src_custom` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGetArgs> InternetServiceSrcCustoms
        {
            get => _internetServiceSrcCustoms ?? (_internetServiceSrcCustoms = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcCustomGetArgs>());
            set => _internetServiceSrcCustoms = value;
        }

        [Input("internetServiceSrcGroups")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupGetArgs>? _internetServiceSrcGroups;

        /// <summary>
        /// Internet Service source group name. The structure of `internet_service_src_group` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupGetArgs> InternetServiceSrcGroups
        {
            get => _internetServiceSrcGroups ?? (_internetServiceSrcGroups = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcGroupGetArgs>());
            set => _internetServiceSrcGroups = value;
        }

        [Input("internetServiceSrcIds")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdGetArgs>? _internetServiceSrcIds;

        /// <summary>
        /// Internet Service source ID. The structure of `internet_service_src_id` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdGetArgs> InternetServiceSrcIds
        {
            get => _internetServiceSrcIds ?? (_internetServiceSrcIds = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcIdGetArgs>());
            set => _internetServiceSrcIds = value;
        }

        [Input("internetServiceSrcNames")]
        private InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameGetArgs>? _internetServiceSrcNames;

        /// <summary>
        /// Internet Service source name. The structure of `internet_service_src_name` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameGetArgs> InternetServiceSrcNames
        {
            get => _internetServiceSrcNames ?? (_internetServiceSrcNames = new InputList<Inputs.FirewallShapingpolicyInternetServiceSrcNameGetArgs>());
            set => _internetServiceSrcNames = value;
        }

        /// <summary>
        /// Apply this traffic shaping policy to IPv4 or IPv6 traffic. Valid values: `4`, `6`.
        /// </summary>
        [Input("ipVersion")]
        public Input<string>? IpVersion { get; set; }

        /// <summary>
        /// Shaping policy name.
        /// </summary>
        [Input("name")]
        public Input<string>? Name { get; set; }

        /// <summary>
        /// Per-IP traffic shaper to apply with this policy.
        /// </summary>
        [Input("perIpShaper")]
        public Input<string>? PerIpShaper { get; set; }

        /// <summary>
        /// Schedule name.
        /// </summary>
        [Input("schedule")]
        public Input<string>? Schedule { get; set; }

        [Input("services")]
        private InputList<Inputs.FirewallShapingpolicyServiceGetArgs>? _services;

        /// <summary>
        /// Service and service group names. The structure of `service` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyServiceGetArgs> Services
        {
            get => _services ?? (_services = new InputList<Inputs.FirewallShapingpolicyServiceGetArgs>());
            set => _services = value;
        }

        [Input("srcaddr6s")]
        private InputList<Inputs.FirewallShapingpolicySrcaddr6GetArgs>? _srcaddr6s;

        /// <summary>
        /// IPv6 source address and address group names. The structure of `srcaddr6` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcaddr6GetArgs> Srcaddr6s
        {
            get => _srcaddr6s ?? (_srcaddr6s = new InputList<Inputs.FirewallShapingpolicySrcaddr6GetArgs>());
            set => _srcaddr6s = value;
        }

        [Input("srcaddrs")]
        private InputList<Inputs.FirewallShapingpolicySrcaddrGetArgs>? _srcaddrs;

        /// <summary>
        /// IPv4 source address and address group names. The structure of `srcaddr` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcaddrGetArgs> Srcaddrs
        {
            get => _srcaddrs ?? (_srcaddrs = new InputList<Inputs.FirewallShapingpolicySrcaddrGetArgs>());
            set => _srcaddrs = value;
        }

        [Input("srcintfs")]
        private InputList<Inputs.FirewallShapingpolicySrcintfGetArgs>? _srcintfs;

        /// <summary>
        /// One or more incoming (ingress) interfaces. The structure of `srcintf` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicySrcintfGetArgs> Srcintfs
        {
            get => _srcintfs ?? (_srcintfs = new InputList<Inputs.FirewallShapingpolicySrcintfGetArgs>());
            set => _srcintfs = value;
        }

        /// <summary>
        /// Enable/disable this traffic shaping policy. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("status")]
        public Input<string>? Status { get; set; }

        /// <summary>
        /// ToS (Type of Service) value used for comparison.
        /// </summary>
        [Input("tos")]
        public Input<string>? Tos { get; set; }

        /// <summary>
        /// Non-zero bit positions are used for comparison while zero bit positions are ignored.
        /// </summary>
        [Input("tosMask")]
        public Input<string>? TosMask { get; set; }

        /// <summary>
        /// Enable negated TOS match. Valid values: `enable`, `disable`.
        /// </summary>
        [Input("tosNegate")]
        public Input<string>? TosNegate { get; set; }

        /// <summary>
        /// Traffic shaper to apply to traffic forwarded by the firewall policy.
        /// </summary>
        [Input("trafficShaper")]
        public Input<string>? TrafficShaper { get; set; }

        /// <summary>
        /// Traffic shaper to apply to response traffic received by the firewall policy.
        /// </summary>
        [Input("trafficShaperReverse")]
        public Input<string>? TrafficShaperReverse { get; set; }

        [Input("urlCategories")]
        private InputList<Inputs.FirewallShapingpolicyUrlCategoryGetArgs>? _urlCategories;

        /// <summary>
        /// IDs of one or more FortiGuard Web Filtering categories that this shaper applies traffic shaping to. The structure of `url_category` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyUrlCategoryGetArgs> UrlCategories
        {
            get => _urlCategories ?? (_urlCategories = new InputList<Inputs.FirewallShapingpolicyUrlCategoryGetArgs>());
            set => _urlCategories = value;
        }

        [Input("users")]
        private InputList<Inputs.FirewallShapingpolicyUserGetArgs>? _users;

        /// <summary>
        /// Apply this traffic shaping policy to individual users that have authenticated with the FortiGate. The structure of `users` block is documented below.
        /// </summary>
        public InputList<Inputs.FirewallShapingpolicyUserGetArgs> Users
        {
            get => _users ?? (_users = new InputList<Inputs.FirewallShapingpolicyUserGetArgs>());
            set => _users = value;
        }

        /// <summary>
        /// Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
        /// </summary>
        [Input("uuid")]
        public Input<string>? Uuid { get; set; }

        /// <summary>
        /// Specifies the vdom to which the resource will be applied when the FortiGate unit is running in VDOM mode. Only one vdom can be specified. If you want to inherit the vdom configuration of the provider, please do not set this parameter.
        /// </summary>
        [Input("vdomparam")]
        public Input<string>? Vdomparam { get; set; }

        public FirewallShapingpolicyState()
        {
        }
        public static new FirewallShapingpolicyState Empty => new FirewallShapingpolicyState();
    }
}
