{
  "typeName" : "AWS::MediaConnect::Flow",
  "description" : "Resource Type definition for AWS::MediaConnect::Flow",
  "sourceUrl" : "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-mediaconnect.git",
  "properties" : {
    "FlowArn" : {
      "description" : "The Amazon Resource Name (ARN), a unique identifier for any AWS resource, of the flow.",
      "pattern" : "^arn:(aws[a-zA-Z-]*):mediaconnect:[a-z0-9-]+:[0-9]{12}:flow:[a-zA-Z0-9-]+:[a-zA-Z0-9_-]+$",
      "type" : "string"
    },
    "EgressIp" : {
      "description" : "The IP address from which video will be sent to output destinations.",
      "type" : "string"
    },
    "Name" : {
      "description" : "The name of the flow.",
      "type" : "string"
    },
    "AvailabilityZone" : {
      "description" : "The Availability Zone that you want to create the flow in. These options are limited to the Availability Zones within the current AWS.",
      "type" : "string"
    },
    "FlowAvailabilityZone" : {
      "description" : "The Availability Zone that you want to create the flow in. These options are limited to the Availability Zones within the current AWS.(ReadOnly)",
      "type" : "string"
    },
    "Source" : {
      "description" : "The source of the flow.",
      "$ref" : "#/definitions/Source"
    },
    "SourceFailoverConfig" : {
      "description" : "The source failover config of the flow.",
      "$ref" : "#/definitions/FailoverConfig"
    },
    "VpcInterfaces" : {
      "type" : "array",
      "description" : "The VPC interfaces that you added to this flow.",
      "items" : {
        "$ref" : "#/definitions/VpcInterface"
      }
    },
    "MediaStreams" : {
      "type" : "array",
      "description" : "The media streams associated with the flow. You can associate any of these media streams with sources and outputs on the flow.",
      "items" : {
        "$ref" : "#/definitions/MediaStream"
      }
    },
    "Maintenance" : {
      "description" : "The maintenance settings you want to use for the flow.",
      "$ref" : "#/definitions/Maintenance"
    },
    "SourceMonitoringConfig" : {
      "description" : "The source monitoring config of the flow.",
      "$ref" : "#/definitions/SourceMonitoringConfig"
    },
    "FlowSize" : {
      "type" : "string",
      "description" : "Determines the processing capacity and feature set of the flow. Set this optional parameter to LARGE if you want to enable NDI sources or outputs on the flow.",
      "enum" : [ "MEDIUM", "LARGE", "LARGE_4X" ]
    },
    "NdiConfig" : {
      "description" : "Specifies the configuration settings for NDI sources and outputs. Required when the flow includes NDI sources or outputs.",
      "$ref" : "#/definitions/NdiConfig"
    },
    "FlowNdiMachineName" : {
      "type" : "string",
      "description" : "A prefix for the names of the NDI sources that the flow creates.(ReadOnly)"
    },
    "EncodingConfig" : {
      "description" : "The encoding configuration to apply to the NDI source content when transcoding it to a transport stream (TS) for downstream distribution. You can choose between several predefined encoding profiles based on common use cases.",
      "$ref" : "#/definitions/EncodingConfig"
    },
    "Tags" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Tag"
      },
      "description" : "Key-value pairs that can be used to tag this flow.",
      "insertionOrder" : false
    }
  },
  "definitions" : {
    "Source" : {
      "description" : "The settings for the source of the flow.",
      "type" : "object",
      "properties" : {
        "SourceArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):mediaconnect:[a-z0-9-]+:[0-9]{12}:source:[a-zA-Z0-9-]+:[a-zA-Z0-9_-]+$",
          "description" : "The ARN of the source."
        },
        "Decryption" : {
          "$ref" : "#/definitions/Encryption",
          "description" : "The type of decryption that is used on the content ingested from this source."
        },
        "Description" : {
          "type" : "string",
          "description" : "A description for the source. This value is not used or seen outside of the current AWS Elemental MediaConnect account."
        },
        "EntitlementArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):mediaconnect:[a-z0-9-]+:[0-9]{12}:entitlement:[a-zA-Z0-9-]+:[a-zA-Z0-9_-]+$",
          "description" : "The ARN of the entitlement that allows you to subscribe to content that comes from another AWS account. The entitlement is set by the content originator and the ARN is generated as part of the originator's flow."
        },
        "GatewayBridgeSource" : {
          "$ref" : "#/definitions/GatewayBridgeSource",
          "description" : "The source configuration for cloud flows receiving a stream from a bridge."
        },
        "IngestIp" : {
          "type" : "string",
          "description" : "The IP address that the flow will be listening on for incoming content."
        },
        "IngestPort" : {
          "type" : "integer",
          "description" : "The port that the flow will be listening on for incoming content."
        },
        "MaxBitrate" : {
          "type" : "integer",
          "description" : "The smoothing max bitrate for RIST, RTP, and RTP-FEC streams."
        },
        "MaxLatency" : {
          "type" : "integer",
          "description" : "The maximum latency in milliseconds. This parameter applies only to RIST-based and Zixi-based streams."
        },
        "MaxSyncBuffer" : {
          "type" : "integer",
          "description" : "The size of the buffer (in milliseconds) to use to sync incoming source data."
        },
        "MediaStreamSourceConfigurations" : {
          "type" : "array",
          "description" : "The media stream that is associated with the source, and the parameters for that association.",
          "items" : {
            "$ref" : "#/definitions/MediaStreamSourceConfiguration"
          }
        },
        "MinLatency" : {
          "type" : "integer",
          "description" : "The minimum latency in milliseconds."
        },
        "Name" : {
          "type" : "string",
          "description" : "The name of the source."
        },
        "NdiSourceSettings" : {
          "$ref" : "#/definitions/NdiSourceSettings",
          "description" : "The settings for the NDI flow source. This includes the exact name of the upstream NDI sender that you want to connect to your flow source."
        },
        "Protocol" : {
          "type" : "string",
          "enum" : [ "zixi-push", "rtp-fec", "rtp", "rist", "srt-listener", "srt-caller", "st2110-jpegxs", "cdi", "ndi-speed-hq" ],
          "description" : "The protocol that is used by the source."
        },
        "RouterIntegrationState" : {
          "type" : "string",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "RouterIntegrationTransitDecryption" : {
          "$ref" : "#/definitions/FlowTransitEncryption"
        },
        "SenderIpAddress" : {
          "type" : "string",
          "description" : "The IP address that the flow communicates with to initiate connection with the sender for fujitsu-qos protocol."
        },
        "SenderControlPort" : {
          "type" : "integer",
          "description" : "The port that the flow uses to send outbound requests to initiate connection with the sender for fujitsu-qos protocol."
        },
        "StreamId" : {
          "type" : "string",
          "description" : "The stream ID that you want to use for this transport. This parameter applies only to Zixi-based streams."
        },
        "SourceIngestPort" : {
          "type" : "string",
          "description" : "The port that the flow will be listening on for incoming content.(ReadOnly)"
        },
        "SourceListenerAddress" : {
          "type" : "string",
          "description" : "Source IP or domain name for SRT-caller protocol."
        },
        "SourceListenerPort" : {
          "type" : "integer",
          "description" : "Source port for SRT-caller protocol."
        },
        "VpcInterfaceName" : {
          "type" : "string",
          "description" : "The name of the VPC Interface this Source is configured with."
        },
        "WhitelistCidr" : {
          "type" : "string",
          "description" : "The range of IP addresses that should be allowed to contribute content to your source. These IP addresses should be in the form of a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16."
        },
        "Tags" : {
          "type" : "array",
          "items" : {
            "$ref" : "#/definitions/Tag"
          },
          "description" : "Key-value pairs that can be used to tag this source.",
          "insertionOrder" : false
        }
      },
      "additionalProperties" : false
    },
    "Encryption" : {
      "type" : "object",
      "description" : "Information about the encryption of the flow.",
      "properties" : {
        "Algorithm" : {
          "type" : "string",
          "enum" : [ "aes128", "aes192", "aes256" ],
          "description" : "The type of algorithm that is used for the encryption (such as aes128, aes192, or aes256)."
        },
        "ConstantInitializationVector" : {
          "type" : "string",
          "description" : "A 128-bit, 16-byte hex value represented by a 32-character string, to be used with the key for encrypting content. This parameter is not valid for static key encryption."
        },
        "DeviceId" : {
          "type" : "string",
          "description" : "The value of one of the devices that you configured with your digital rights management (DRM) platform key provider. This parameter is required for SPEKE encryption and is not valid for static key encryption."
        },
        "KeyType" : {
          "type" : "string",
          "enum" : [ "speke", "static-key", "srt-password" ],
          "description" : "The type of key that is used for the encryption. If no keyType is provided, the service will use the default setting (static-key).",
          "default" : "static-key"
        },
        "Region" : {
          "type" : "string",
          "description" : "The AWS Region that the API Gateway proxy endpoint was created in. This parameter is required for SPEKE encryption and is not valid for static key encryption."
        },
        "ResourceId" : {
          "type" : "string",
          "description" : "An identifier for the content. The service sends this value to the key server to identify the current endpoint. The resource ID is also known as the content ID. This parameter is required for SPEKE encryption and is not valid for static key encryption."
        },
        "RoleArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):iam::[0-9]{12}:role/[a-zA-Z0-9_+=,.@-]+$",
          "description" : "The ARN of the role that you created during setup (when you set up AWS Elemental MediaConnect as a trusted entity)."
        },
        "SecretArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:[a-zA-Z0-9/_+=.@-]+$",
          "description" : " The ARN of the secret that you created in AWS Secrets Manager to store the encryption key. This parameter is required for static key encryption and is not valid for SPEKE encryption."
        },
        "Url" : {
          "type" : "string",
          "description" : "The URL from the API Gateway proxy that you set up to talk to your key server. This parameter is required for SPEKE encryption and is not valid for static key encryption."
        }
      },
      "additionalProperties" : false,
      "required" : [ "RoleArn" ]
    },
    "FailoverConfig" : {
      "type" : "object",
      "description" : "The settings for source failover",
      "properties" : {
        "State" : {
          "type" : "string",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "RecoveryWindow" : {
          "type" : "integer",
          "description" : "Search window time to look for dash-7 packets"
        },
        "FailoverMode" : {
          "type" : "string",
          "description" : "The type of failover you choose for this flow. MERGE combines the source streams into a single stream, allowing graceful recovery from any single-source loss. FAILOVER allows switching between different streams.",
          "enum" : [ "MERGE", "FAILOVER" ]
        },
        "SourcePriority" : {
          "type" : "object",
          "description" : "The priority you want to assign to a source. You can have a primary stream and a backup stream or two equally prioritized streams.",
          "properties" : {
            "PrimarySource" : {
              "type" : "string",
              "description" : "The name of the source you choose as the primary source for this flow."
            }
          },
          "required" : [ "PrimarySource" ],
          "additionalProperties" : false
        }
      },
      "additionalProperties" : false
    },
    "GatewayBridgeSource" : {
      "type" : "object",
      "description" : "The source configuration for cloud flows receiving a stream from a bridge.",
      "properties" : {
        "BridgeArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):mediaconnect:[a-z0-9-]+:[0-9]{12}:bridge:[a-zA-Z0-9-]+:[a-zA-Z0-9_-]+$",
          "description" : "The ARN of the bridge feeding this flow."
        },
        "VpcInterfaceAttachment" : {
          "$ref" : "#/definitions/VpcInterfaceAttachment",
          "description" : "The name of the VPC interface attachment to use for this bridge source."
        }
      },
      "additionalProperties" : false,
      "required" : [ "BridgeArn" ]
    },
    "VpcInterfaceAttachment" : {
      "type" : "object",
      "description" : "The settings for attaching a VPC interface to an resource.",
      "properties" : {
        "VpcInterfaceName" : {
          "type" : "string",
          "description" : "The name of the VPC interface to use for this resource."
        }
      },
      "additionalProperties" : false
    },
    "VpcInterface" : {
      "type" : "object",
      "description" : "The details of a VPC interface.",
      "properties" : {
        "Name" : {
          "type" : "string",
          "description" : "Immutable and has to be a unique against other VpcInterfaces in this Flow."
        },
        "NetworkInterfaceType" : {
          "type" : "string",
          "description" : "The type of network adapter that you want MediaConnect to use on this interface. If you don't set this value, it defaults to ENA.",
          "enum" : [ "ena", "efa" ]
        },
        "RoleArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):iam::[0-9]{12}:role/[a-zA-Z0-9_+=,.@-]+$",
          "description" : "Role Arn MediaConnect can assume to create ENIs in customer's account."
        },
        "SecurityGroupIds" : {
          "type" : "array",
          "description" : "Security Group IDs to be used on ENI.",
          "items" : {
            "type" : "string"
          }
        },
        "SubnetId" : {
          "type" : "string",
          "description" : "Subnet must be in the AZ of the Flow"
        },
        "NetworkInterfaceIds" : {
          "type" : "array",
          "description" : "IDs of the network interfaces created in customer's account by MediaConnect.",
          "items" : {
            "type" : "string"
          }
        },
        "Tags" : {
          "type" : "array",
          "items" : {
            "$ref" : "#/definitions/Tag"
          },
          "description" : "Key-value pairs that can be used to tag this VPC interface.",
          "insertionOrder" : false
        }
      },
      "additionalProperties" : false,
      "required" : [ "Name", "RoleArn", "SecurityGroupIds", "SubnetId" ]
    },
    "Maintenance" : {
      "type" : "object",
      "description" : "The maintenance setting of a flow.",
      "properties" : {
        "MaintenanceDay" : {
          "type" : "string",
          "description" : "A day of a week when the maintenance will happen. Use Monday/Tuesday/Wednesday/Thursday/Friday/Saturday/Sunday.",
          "enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]
        },
        "MaintenanceStartHour" : {
          "type" : "string",
          "description" : "UTC time when the maintenance will happen. Use 24-hour HH:MM format. Minutes must be 00. Example: 13:00. The default value is 02:00."
        }
      },
      "additionalProperties" : false,
      "required" : [ "MaintenanceDay", "MaintenanceStartHour" ]
    },
    "MediaStream" : {
      "type" : "object",
      "description" : "A single track or stream of media that contains video, audio, or ancillary data. After you add a media stream to a flow, you can associate it with sources and outputs on that flow, as long as they use the CDI protocol or the ST 2110 JPEG XS protocol. Each source or output can consist of one or many media streams.",
      "properties" : {
        "MediaStreamId" : {
          "type" : "integer",
          "description" : "A unique identifier for the media stream."
        },
        "MediaStreamType" : {
          "type" : "string",
          "description" : "The type of media stream.",
          "enum" : [ "video", "audio", "ancillary-data" ]
        },
        "VideoFormat" : {
          "type" : "string",
          "description" : "The resolution of the video.",
          "enum" : [ "2160p", "1080p", "1080i", "720p", "480p" ]
        },
        "MediaStreamName" : {
          "type" : "string",
          "description" : "A name that helps you distinguish one media stream from another."
        },
        "Description" : {
          "type" : "string",
          "description" : "A description that can help you quickly identify what your media stream is used for."
        },
        "Attributes" : {
          "$ref" : "#/definitions/MediaStreamAttributes",
          "description" : "Attributes that are related to the media stream."
        },
        "ClockRate" : {
          "type" : "integer",
          "description" : "The sample rate for the stream. This value in measured in kHz."
        },
        "Fmt" : {
          "type" : "integer",
          "description" : "The format type number (sometimes referred to as RTP payload type) of the media stream. MediaConnect assigns this value to the media stream. For ST 2110 JPEG XS outputs, you need to provide this value to the receiver."
        },
        "Tags" : {
          "type" : "array",
          "items" : {
            "$ref" : "#/definitions/Tag"
          },
          "description" : "Key-value pairs that can be used to tag this media stream.",
          "insertionOrder" : false
        }
      },
      "additionalProperties" : false,
      "required" : [ "MediaStreamId", "MediaStreamType", "MediaStreamName" ]
    },
    "MediaStreamAttributes" : {
      "type" : "object",
      "description" : "Attributes that are related to the media stream.",
      "properties" : {
        "Fmtp" : {
          "$ref" : "#/definitions/Fmtp",
          "description" : "A set of parameters that define the media stream."
        },
        "Lang" : {
          "type" : "string",
          "description" : "The audio language, in a format that is recognized by the receiver."
        }
      },
      "additionalProperties" : false
    },
    "Fmtp" : {
      "type" : "object",
      "description" : "A set of parameters that define the media stream.",
      "properties" : {
        "ExactFramerate" : {
          "type" : "string",
          "description" : "The frame rate for the video stream, in frames/second. For example: 60000/1001."
        },
        "Colorimetry" : {
          "type" : "string",
          "description" : "The format used for the representation of color.",
          "enum" : [ "BT601", "BT709", "BT2020", "BT2100", "ST2065-1", "ST2065-3", "XYZ" ]
        },
        "ScanMode" : {
          "type" : "string",
          "description" : "The type of compression that was used to smooth the video's appearance.",
          "enum" : [ "progressive", "interlace", "progressive-segmented-frame" ]
        },
        "Tcs" : {
          "type" : "string",
          "description" : "The transfer characteristic system (TCS) that is used in the video.",
          "enum" : [ "SDR", "PQ", "HLG", "LINEAR", "BT2100LINPQ", "BT2100LINHLG", "ST2065-1", "ST428-1", "DENSITY" ]
        },
        "Range" : {
          "type" : "string",
          "description" : "The encoding range of the video.",
          "enum" : [ "NARROW", "FULL", "FULLPROTECT" ]
        },
        "Par" : {
          "type" : "string",
          "description" : "The pixel aspect ratio (PAR) of the video."
        },
        "ChannelOrder" : {
          "type" : "string",
          "description" : "The format of the audio channel."
        }
      },
      "additionalProperties" : false
    },
    "MediaStreamSourceConfiguration" : {
      "type" : "object",
      "description" : "The media stream that is associated with the source, and the parameters for that association.",
      "properties" : {
        "EncodingName" : {
          "type" : "string",
          "description" : "The format that was used to encode the data. For ancillary data streams, set the encoding name to smpte291. For audio streams, set the encoding name to pcm. For video, 2110 streams, set the encoding name to raw. For video, JPEG XS streams, set the encoding name to jxsv.",
          "enum" : [ "jxsv", "raw", "smpte291", "pcm" ]
        },
        "InputConfigurations" : {
          "type" : "array",
          "description" : "The media streams that you want to associate with the source.",
          "items" : {
            "$ref" : "#/definitions/InputConfiguration"
          }
        },
        "MediaStreamName" : {
          "type" : "string",
          "description" : "A name that helps you distinguish one media stream from another."
        }
      },
      "additionalProperties" : false,
      "required" : [ "EncodingName", "MediaStreamName" ]
    },
    "InputConfiguration" : {
      "type" : "object",
      "description" : "The transport parameters associated with an incoming media stream.",
      "properties" : {
        "InputPort" : {
          "type" : "integer",
          "description" : "The port that the flow listens on for an incoming media stream."
        },
        "Interface" : {
          "$ref" : "#/definitions/Interface",
          "description" : "The VPC interface where the media stream comes in from."
        }
      },
      "additionalProperties" : false,
      "required" : [ "InputPort", "Interface" ]
    },
    "Interface" : {
      "type" : "object",
      "description" : "The VPC interface that you want to use for the media stream associated with the output.",
      "properties" : {
        "Name" : {
          "type" : "string",
          "description" : "The name of the VPC interface that you want to use for the media stream associated with the output."
        }
      },
      "additionalProperties" : false,
      "required" : [ "Name" ]
    },
    "SourceMonitoringConfig" : {
      "type" : "object",
      "description" : "The settings for source monitoring.",
      "properties" : {
        "ThumbnailState" : {
          "type" : "string",
          "description" : "The state of thumbnail monitoring.",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "ContentQualityAnalysisState" : {
          "type" : "string",
          "description" : "Indicates whether content quality analysis is enabled or disabled.",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "AudioMonitoringSettings" : {
          "type" : "array",
          "description" : "Contains the settings for audio stream metrics monitoring.",
          "items" : {
            "$ref" : "#/definitions/AudioMonitoringSetting"
          }
        },
        "VideoMonitoringSettings" : {
          "type" : "array",
          "description" : "Contains the settings for video stream metrics monitoring.",
          "items" : {
            "$ref" : "#/definitions/VideoMonitoringSetting"
          }
        }
      },
      "additionalProperties" : false
    },
    "AudioMonitoringSetting" : {
      "type" : "object",
      "description" : "Specifies the configuration for audio stream metrics monitoring.",
      "properties" : {
        "SilentAudio" : {
          "$ref" : "#/definitions/SilentAudio"
        }
      },
      "additionalProperties" : false
    },
    "SilentAudio" : {
      "type" : "object",
      "description" : "Configures settings for the SilentAudio metric.",
      "properties" : {
        "State" : {
          "type" : "string",
          "description" : "Indicates whether the SilentAudio metric is enabled or disabled.",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "ThresholdSeconds" : {
          "type" : "integer",
          "description" : "Specifies the number of consecutive seconds of silence that triggers an event or alert."
        }
      },
      "additionalProperties" : false
    },
    "VideoMonitoringSetting" : {
      "type" : "object",
      "description" : "Specifies the configuration for video stream metrics monitoring.",
      "properties" : {
        "BlackFrames" : {
          "$ref" : "#/definitions/BlackFrames"
        },
        "FrozenFrames" : {
          "$ref" : "#/definitions/FrozenFrames"
        }
      },
      "additionalProperties" : false
    },
    "BlackFrames" : {
      "type" : "object",
      "description" : "Configures settings for the BlackFrames metric.",
      "properties" : {
        "State" : {
          "type" : "string",
          "description" : "Indicates whether the BlackFrames metric is enabled or disabled.",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "ThresholdSeconds" : {
          "type" : "integer",
          "description" : "Specifies the number of consecutive seconds of black frames that triggers an event or alert."
        }
      },
      "additionalProperties" : false
    },
    "FrozenFrames" : {
      "type" : "object",
      "description" : "Configures settings for the FrozenFrames metric.",
      "properties" : {
        "State" : {
          "type" : "string",
          "description" : "Indicates whether the FrozenFrames metric is enabled or disabled.",
          "enum" : [ "ENABLED", "DISABLED" ]
        },
        "ThresholdSeconds" : {
          "type" : "integer",
          "description" : "Specifies the number of consecutive seconds of a static image that triggers an event or alert."
        }
      },
      "additionalProperties" : false
    },
    "NdiConfig" : {
      "type" : "object",
      "description" : "Specifies the configuration settings for NDI sources and outputs. Required when the flow includes NDI sources or outputs.",
      "properties" : {
        "NdiDiscoveryServers" : {
          "type" : "array",
          "description" : "A list of up to three NDI discovery server configurations. While not required by the API, this configuration is necessary for NDI functionality to work properly.",
          "items" : {
            "$ref" : "#/definitions/NdiDiscoveryServerConfig"
          }
        },
        "NdiState" : {
          "$ref" : "#/definitions/NdiState",
          "description" : "A setting that controls whether NDI sources or outputs can be used in the flow. The default value is DISABLED. This value must be set as ENABLED for your flow to support NDI sources or outputs."
        },
        "MachineName" : {
          "type" : "string",
          "description" : "A prefix for the names of the NDI sources that the flow creates. If a custom name isn't specified, MediaConnect generates a unique 12-character ID as the prefix."
        }
      },
      "additionalProperties" : false
    },
    "NdiDiscoveryServerConfig" : {
      "type" : "object",
      "description" : "Specifies the configuration settings for individual NDI discovery servers. A maximum of 3 servers is allowed.",
      "properties" : {
        "VpcInterfaceAdapter" : {
          "type" : "string",
          "description" : "The identifier for the Virtual Private Cloud (VPC) network interface used by the flow."
        },
        "DiscoveryServerAddress" : {
          "type" : "string",
          "description" : "The unique network address of the NDI discovery server."
        },
        "DiscoveryServerPort" : {
          "type" : "integer",
          "description" : "The port for the NDI discovery server. Defaults to 5959 if a custom port isn't specified."
        }
      },
      "additionalProperties" : false,
      "required" : [ "DiscoveryServerAddress", "VpcInterfaceAdapter" ]
    },
    "NdiSourceSettings" : {
      "type" : "object",
      "properties" : {
        "SourceName" : {
          "type" : "string"
        }
      },
      "additionalProperties" : false
    },
    "NdiState" : {
      "type" : "string",
      "enum" : [ "ENABLED", "DISABLED" ]
    },
    "FlowTransitEncryption" : {
      "type" : "object",
      "description" : "The configuration that defines how content is encrypted during transit between the MediaConnect router and a MediaConnect flow.",
      "properties" : {
        "EncryptionKeyType" : {
          "$ref" : "#/definitions/FlowTransitEncryptionKeyType"
        },
        "EncryptionKeyConfiguration" : {
          "$ref" : "#/definitions/FlowTransitEncryptionKeyConfiguration"
        }
      },
      "required" : [ "EncryptionKeyConfiguration" ],
      "additionalProperties" : false
    },
    "FlowTransitEncryptionKeyConfiguration" : {
      "description" : "Configuration settings for flow transit encryption keys.",
      "oneOf" : [ {
        "type" : "object",
        "title" : "SecretsManager",
        "properties" : {
          "SecretsManager" : {
            "$ref" : "#/definitions/SecretsManagerEncryptionKeyConfiguration"
          }
        },
        "required" : [ "SecretsManager" ],
        "additionalProperties" : false
      }, {
        "type" : "object",
        "title" : "Automatic",
        "properties" : {
          "Automatic" : {
            "$ref" : "#/definitions/AutomaticEncryptionKeyConfiguration"
          }
        },
        "required" : [ "Automatic" ],
        "additionalProperties" : false
      } ]
    },
    "FlowTransitEncryptionKeyType" : {
      "type" : "string",
      "enum" : [ "SECRETS_MANAGER", "AUTOMATIC" ]
    },
    "SecretsManagerEncryptionKeyConfiguration" : {
      "type" : "object",
      "description" : "The configuration settings for transit encryption of a flow source using AWS Secrets Manager, including the secret ARN and role ARN.",
      "properties" : {
        "SecretArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:[a-zA-Z0-9/_+=.@-]+$",
          "description" : "The ARN of the AWS Secrets Manager secret used for transit encryption from the router output."
        },
        "RoleArn" : {
          "type" : "string",
          "pattern" : "^arn:(aws[a-zA-Z-]*):iam::[0-9]{12}:role/[a-zA-Z0-9_+=,.@-]+$",
          "description" : "The ARN of the IAM role used for transit encryption from the router output using AWS Secrets Manager."
        }
      },
      "required" : [ "RoleArn", "SecretArn" ],
      "additionalProperties" : false
    },
    "AutomaticEncryptionKeyConfiguration" : {
      "type" : "object",
      "description" : "Configuration settings for automatic encryption key management, where MediaConnect handles key creation and rotation.",
      "additionalProperties" : false
    },
    "EncodingConfig" : {
      "type" : "object",
      "properties" : {
        "EncodingProfile" : {
          "$ref" : "#/definitions/EncodingProfile"
        },
        "VideoMaxBitrate" : {
          "type" : "integer",
          "description" : "The maximum video bitrate to use when transcoding the NDI source to a Transport Stream. This parameter enables you to override the default video bitrate within the encoding profile's supported range. The supported range is 10,000,000 - 50,000,000 bits per second (bps). If you do not specify a value, MediaConnect uses the default value of 20,000,000 bps."
        }
      },
      "additionalProperties" : false
    },
    "EncodingProfile" : {
      "type" : "string",
      "description" : "The encoding profile to use when transcoding the NDI source to a Transport Stream. You can change this value while a flow is running.",
      "enum" : [ "DISTRIBUTION_H264_DEFAULT", "CONTRIBUTION_H264_DEFAULT" ]
    },
    "Tag" : {
      "type" : "object",
      "properties" : {
        "Key" : {
          "type" : "string"
        },
        "Value" : {
          "type" : "string"
        }
      },
      "required" : [ "Key", "Value" ],
      "additionalProperties" : false
    }
  },
  "required" : [ "Name", "Source" ],
  "additionalProperties" : false,
  "createOnlyProperties" : [ "/properties/Name", "/properties/AvailabilityZone", "/properties/Source/Name" ],
  "readOnlyProperties" : [ "/properties/FlowArn", "/properties/FlowAvailabilityZone", "/properties/Source/SourceArn", "/properties/Source/IngestIp", "/properties/Source/SourceIngestPort", "/properties/EgressIp", "/properties/FlowNdiMachineName" ],
  "deprecatedProperties" : [ "/properties/Source/SenderIpAddress", "/properties/Source/SenderControlPort", "/properties/Source/Decryption/ResourceId", "/properties/Source/Decryption/ConstantInitializationVector", "/properties/Source/Decryption/DeviceId", "/properties/Source/Decryption/Region", "/properties/Source/Decryption/Url" ],
  "primaryIdentifier" : [ "/properties/FlowArn" ],
  "resourceLink" : {
    "templateUri" : "/mediaconnect/home?region=${awsRegion}#/flows/${flowArn}",
    "mappings" : {
      "flowArn" : "/FlowArn"
    }
  },
  "handlers" : {
    "create" : {
      "permissions" : [ "mediaconnect:CreateFlow", "mediaconnect:AddFlowMediaStreams", "mediaconnect:AddFlowSources", "mediaconnect:AddFlowVpcInterfaces", "mediaconnect:DescribeFlow", "mediaconnect:TagResource", "mediaconnect:ListTagsForResource", "iam:PassRole" ]
    },
    "read" : {
      "permissions" : [ "mediaconnect:DescribeFlow", "mediaconnect:ListTagsForResource" ]
    },
    "update" : {
      "permissions" : [ "mediaconnect:DescribeFlow", "mediaconnect:UpdateFlow", "mediaconnect:UpdateFlowSource", "mediaconnect:UpdateFlowMediaStream", "mediaconnect:AddFlowMediaStreams", "mediaconnect:RemoveFlowMediaStream", "mediaconnect:AddFlowVpcInterfaces", "mediaconnect:RemoveFlowVpcInterface", "mediaconnect:TagResource", "mediaconnect:UntagResource", "mediaconnect:ListTagsForResource" ]
    },
    "delete" : {
      "permissions" : [ "mediaconnect:DescribeFlow", "mediaconnect:DeleteFlow", "mediaconnect:RemoveFlowMediaStream", "mediaconnect:RemoveFlowOutput", "mediaconnect:RemoveFlowSource", "mediaconnect:RemoveFlowVpcInterface", "mediaconnect:RevokeFlowEntitlement" ]
    },
    "list" : {
      "permissions" : [ "mediaconnect:ListFlows" ]
    }
  },
  "tagging" : {
    "cloudFormationSystemTags" : true,
    "permissions" : [ "mediaconnect:ListTagsForResource", "mediaconnect:TagResource", "mediaconnect:UntagResource" ],
    "tagOnCreate" : true,
    "tagProperty" : "/properties/Tags",
    "tagUpdatable" : true,
    "taggable" : true
  }
}