functions/Add-DoPxDnsRecord.ps1

<#############################################################################
The DoPx module provides a rich set of commands that extend the automation
capabilities of the Digital Ocean (DO) cloud service. These commands make it
easier to manage your Digital Ocean environment from Windows PowerShell. When
used with the LinuxPx module, you can manage all aspects of your environment
from one shell.
 
Copyright (c) 2014 Kirk Munro.
 
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
 
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License in the
license folder that is included in the SmaPx module. If not, see
<https://www.gnu.org/licenses/gpl.html>.
#############################################################################>


<#
.SYNOPSIS
    Creates a new DNS record in your DigitalOcean environment.
.DESCRIPTION
    The Add-DoPxDnsRecord command creates a new DNS record in your DigitalOcean environment.
 
    You can create A, AAAA, CNAME, MX, TXT, SRV, and NS records with this command. Select the appropriate switch to identify the type of record that you want to create.
.INPUTS
    None
.OUTPUTS
    digitalocean.domainrecord
.NOTES
    This command sends an HTTP POST request that includes your access token to a DigitalOcean REST API v2 endpoint. To learn more about the DigitalOcean REST API, consult the DigitalOcean API documentation online at https://developers.digitalocean.com.
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -A -HostName subdomain -IPv4Address 127.0.0.1
 
    This command creates a new A record for domain example.com, with the subdomain "subdomain" routed to IP address 127.0.0.1.
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -AAAA -HostName subdomain -IPv6Address 2001:db8::ff00:42:8329
 
    This command creates a new AAAA record for domain example.com, with the subdomain "subdomain" routed to IP address 2001:db8::ff00:42:8329.
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -CNAME -AliasName newalias -HostName hosttarget
 
    This command creates a new CNAME record for domain example.com, with the "newalias" alias routed to host "hosttarget".
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -MX -HostName 127.0.0.1 -Priority 5
 
    This command creates a new MX record for domain example.com, routing mail traffic to host 127.0.0.1 with a priority of 5.
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -TXT -RecordName recordname -Message 'arbitrary data here'
 
    This command creates a new TXT record for domain example.com, with the record named "recordname" containing the message "arbitrary data here".
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -SRV -ServiceName servicename -HostName targethost -Priority 0 -Port 1 -Weight 2
 
    This command creates a new SRV record for domain example.com, directing service requests for service "servicename" to host "targethost" on port 1 with a priority of 0 and a weight of 2.
.EXAMPLE
    PS C:\> $accessToken = ConvertTo-SecureString -String a91a22c7d3c572306e9d6ebfce5f1f697bd7fe8d910d9497ca0f75de2bb37a32 -AsPlainText -Force
    PS C:\> Set-DoPxDefaultAccessToken -AccessToken $accessToken
    PS C:\> Add-DoPxDnsRecord -DomainName example.com -NS -NameServer ns1.digitalocean.com
 
    This command creates a new NS record for domain example.com, identifying name server ns1.digitalocean.com as authoritative for the domain.
.LINK
    Get-DoPxDomain
.LINK
    Get-DoPxDnsRecord
.LINK
    Remove-DoPxDnsRecord
.LINK
    Rename-DoPxDnsRecord
#>

function Add-DoPxDnsRecord {
    [CmdletBinding(SupportsShouldProcess=$true, DefaultParameterSetName='A')]
    [OutputType('digitalocean.domainrecord')]
    param(
        # The name of the domain to which this DNS record will be added.
        [Parameter(Position=0, Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [ValidateNotNullOrEmpty()]
        [Alias('Name')]
        [System.String]
        $DomainName,

        # Creates an A record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the A parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $A,

        # Creates an AAAA record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the AAAA parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $AAAA,

        # Creates a CNAME record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the CNAME parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $CNAME,

        # Creates a MX record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the MX parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $MX,

        # Creates a TXT record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the TXT parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $TXT,

        # Creates a SRV record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the SRV parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $SRV,

        # Creates a NS record.
        [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='NS')]
        [ValidateNotNull()]
        [ValidateScript({
            if (-not $_.IsPresent) {
                throw 'Passing false into the NS parameter is not supported.'
            }
            $true
        })]
        [System.Management.Automation.SwitchParameter]
        $NS,

        # The name of the new alias.
        [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $AliasName,

        # The name of the record.
        [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $RecordName,

        # The name for the service being configured.
        [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $ServiceName,

        # This parameter has different meanings for different DNS record types, as follows:
        #
        # -- A: The host name, or subdomain, to configure.
        #
        # -- AAAA: The host name, or subdomain, to configure.
        #
        # -- CNAME: The host name that will be given to clients requesting the alias.
        #
        # -- MX: The host name or IP address that mail should be routed to.
        #
        # -- SRV: The host name to direct requests for the service to.
        [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')]
        [Parameter(Position=2, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')]
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='CNAME')]
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')]
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $HostName,

        # The IPv4 IP address to route requests to.
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='A')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $IPv4Address,

        # The IPv6 IP address to route requests to.
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='AAAA')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $IPv6Address,

        # The arbitrary text message.
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='TXT')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $Message,

        # The name of a name server that is authoritative for the domain.
        [Parameter(Position=3, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='NS')]
        [ValidateNotNullOrEmpty()]
        [System.String]
        $NameServer,

        # The priority of the target host. Lower values have higher priority. Valid priorities are numbers between 0 and 65535.
        [Parameter(Position=4, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='MX')]
        [Parameter(Position=4, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNull()]
        [ValidateRange(0,65535)]
        [System.Int32]
        $Priority,

        # The port where the service is found on the target host. A valid port is an number between 1 and 65535.
        [Parameter(Position=5, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNull()]
        [ValidateRange(1,65535)]
        [System.Int32]
        $Port,

        # The relative weight of targets for the service that have the same priority. A larger value has a higher priority. Valid weights are between 0 and 65535.
        [Parameter(Position=6, Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName='SRV')]
        [ValidateNotNull()]
        [ValidateRange(0,65535)]
        [System.Int32]
        $Weight,

        # The access token for your DigitalOcean environment, in secure string format.
        [Parameter()]
        [ValidateNotNull()]
        [System.Security.SecureString]
        $AccessToken
    )
    process {
        try {
            switch ($PSCmdlet.ParameterSetName) {
                'A' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                type = 'A'
                                name = $HostName
                                data = $IPv4Address
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('A') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('IPv4Address') > $null

                            #endregion
                        }
                    }
                    break
                }
                'AAAA' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                type = 'AAAA'
                                name = $HostName
                                data = $IPv6Address
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('AAAA') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('IPv6Address') > $null

                            #endregion
                        }
                    }
                    break
                }
                'CNAME' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                type = 'CNAME'
                                name = $AliasName
                                data = $HostName
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('CNAME') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('AliasName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null

                            #endregion
                        }
                    }
                    break
                }
                'MX' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                    type = 'MX'
                                    data = $HostName
                                priority = $Priority
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('MX') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('Priority') > $null

                            #endregion
                        }
                    }
                    break
                }
                'TXT' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                type = 'TXT'
                                name = $RecordName
                                data = $Message
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('TXT') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('RecordName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('Message') > $null

                            #endregion
                        }
                    }
                    break
                }
                'SRV' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                    type = 'SRV'
                                    name = $ServiceName
                                    data = $HostName
                                    port = $Port
                                priority = $Priority
                                  weight = $Weight
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('SRV') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('ServiceName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('HostName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('Port') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('Priority') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('Weight') > $null

                            #endregion
                        }
                    }
                    break
                }
                'NS' {
                    Invoke-Snippet -Name ProxyFunction.Begin -Parameters @{
                        CommandName = 'New-DoPxObject'
                        CommandType = 'Function'
                        PreProcessScriptBlock = {
                            #region Identify the endpoint that is used when creating a DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['RelativeUri'] = 'domains'
                            $PSCmdlet.MyInvocation.BoundParameters['Id'] = $DomainName
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('DomainName') > $null
                            $PSCmdlet.MyInvocation.BoundParameters['RelatedObjectUri'] = 'records'

                            #endregion

                            #region Identify the properties that will be assigned to the new DNS record.

                            $PSCmdlet.MyInvocation.BoundParameters['Property'] = @{
                                type = 'NS'
                                data = $NameServer -replace '([^\.])$','$1.'
                            }
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('NS') > $null
                            $PSCmdlet.MyInvocation.BoundParameters.Remove('NameServer') > $null

                            #endregion
                        }
                    }
                    break
                }
            }
            Invoke-Snippet -Name ProxyFunction.Process.NoPipeline
            Invoke-Snippet -Name ProxyFunction.End
        } catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }
}

Export-ModuleMember -Function Add-DoPxDnsRecord
# SIG # Begin signature block
# MIIZIAYJKoZIhvcNAQcCoIIZETCCGQ0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUZ+pOZx1YpTrDDatPX+e6cQgM
# AYugghRWMIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0B
# AQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIG
# A1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhh
# d3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg
# Q0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJV
# UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFu
# dGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5Q
# WvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeC
# i2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4
# ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3
# +3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujI
# fKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAd
# BgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIG
# CCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1Ro
# YXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNV
# HQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0y
# MDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdf
# plKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y
# 0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhq
# IhKjURmDfrYwggSjMIIDi6ADAgECAhAOz/Q4yP6/NW4E2GqYGxpQMA0GCSqGSIb3
# DQEBBQUAMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh
# dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD
# QSAtIEcyMB4XDTEyMTAxODAwMDAwMFoXDTIwMTIyOTIzNTk1OVowYjELMAkGA1UE
# BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTQwMgYDVQQDEytT
# eW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIFNpZ25lciAtIEc0MIIBIjAN
# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomMLOUS4uyOnREm7Dv+h8GEKU5Ow
# mNutLA9KxW7/hjxTVQ8VzgQ/K/2plpbZvmF5C1vJTIZ25eBDSyKV7sIrQ8Gf2Gi0
# jkBP7oU4uRHFI/JkWPAVMm9OV6GuiKQC1yoezUvh3WPVF4kyW7BemVqonShQDhfu
# ltthO0VRHc8SVguSR/yrrvZmPUescHLnkudfzRC5xINklBm9JYDh6NIipdC6Anqh
# d5NbZcPuF3S8QYYq3AhMjJKMkS2ed0QfaNaodHfbDlsyi1aLM73ZY8hJnTrFxeoz
# C9Lxoxv0i77Zs1eLO94Ep3oisiSuLsdwxb5OgyYI+wu9qU+ZCOEQKHKqzQIDAQAB
# o4IBVzCCAVMwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO
# BgNVHQ8BAf8EBAMCB4AwcwYIKwYBBQUHAQEEZzBlMCoGCCsGAQUFBzABhh5odHRw
# Oi8vdHMtb2NzcC53cy5zeW1hbnRlYy5jb20wNwYIKwYBBQUHMAKGK2h0dHA6Ly90
# cy1haWEud3Muc3ltYW50ZWMuY29tL3Rzcy1jYS1nMi5jZXIwPAYDVR0fBDUwMzAx
# oC+gLYYraHR0cDovL3RzLWNybC53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNy
# bDAoBgNVHREEITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMjAdBgNV
# HQ4EFgQURsZpow5KFB7VTNpSYxc/Xja8DeYwHwYDVR0jBBgwFoAUX5r1blzMzHSa
# 1N197z/b7EyALt0wDQYJKoZIhvcNAQEFBQADggEBAHg7tJEqAEzwj2IwN3ijhCcH
# bxiy3iXcoNSUA6qGTiWfmkADHN3O43nLIWgG2rYytG2/9CwmYzPkSWRtDebDZw73
# BaQ1bHyJFsbpst+y6d0gxnEPzZV03LZc3r03H0N45ni1zSgEIKOq8UvEiCmRDoDR
# EfzdXHZuT14ORUZBbg2w6jiasTraCXEQ/Bx5tIB7rGn0/Zy2DBYr8X9bCT2bW+IW
# yhOBbQAuOA2oKY8s4bL0WqkBrxWcLC9JG9siu8P+eJRRw4axgohd8D20UaF5Mysu
# e7ncIAkTcetqGVvP6KUwVyyJST+5z3/Jvz4iaGNTmr1pdKzFHTx/kuDDvBzYBHUw
# ggUSMIID+qADAgECAhAN//fSWE4vjemplVn1wnAjMA0GCSqGSIb3DQEBBQUAMG8x
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29k
# ZSBTaWduaW5nIENBLTEwHhcNMTQxMDAzMDAwMDAwWhcNMTUxMDA3MTIwMDAwWjBo
# MQswCQYDVQQGEwJDQTEQMA4GA1UECBMHT250YXJpbzEPMA0GA1UEBxMGT3R0YXdh
# MRowGAYDVQQKExFLaXJrIEFuZHJldyBNdW5ybzEaMBgGA1UEAxMRS2lyayBBbmRy
# ZXcgTXVucm8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIANwog4/2
# JUJCJ1PKeXu8S+eBp1F8fHaVFVgMToGhyNz+UptqDVBIsOu21AXNd4s/3WqhOnOt
# yBvyn5thWNGCMB/XcX6/SdV8lSyg0swreiiR7ksJc1jK75aDJV2UE/mOiMtcWo01
# SQGddbF4FpK3LxbzjKGMPP7uI1TUFTxmdR8t8HaRlI7KcsZkckGffkboAm5CWDhZ
# d4f9YhVzZ8uV0jAN9i+mtmIOHTMMskQ7tZy17GkgyjiGrnMxy6VZ18hya062ZLcV
# 20LUqsUkjr0oNvf54KrhZrPQhULagcpKwmxw3hzDfvWov4yVLWdgWT6a+TUG8D39
# HUuVCpXG+OgZAgMBAAGjggGvMIIBqzAfBgNVHSMEGDAWgBR7aM4pqsAXvkl64eU/
# 1qf3RY81MjAdBgNVHQ4EFgQUG+clmaBur2rhO4i38pTJHCFSya0wDgYDVR0PAQH/
# BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMG0GA1UdHwRmMGQwMKAuoCyGKmh0
# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9hc3N1cmVkLWNzLWcxLmNybDAwoC6gLIYq
# aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL2Fzc3VyZWQtY3MtZzEuY3JsMEIGA1Ud
# IAQ7MDkwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRp
# Z2ljZXJ0LmNvbS9DUFMwgYIGCCsGAQUFBwEBBHYwdDAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEwGCCsGAQUFBzAChkBodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURDb2RlU2lnbmluZ0NBLTEu
# Y3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQADggEBACJI6tx95+XcEC6X
# EAxbRZjIXJ085IDdqWXImnfQ8To+yAeHM5kP506ddtzlztW9esOxqnhnfIAClB1e
# 1f/FAlgpxrEQ2IRCuUHuMfy4AxqRkD9jePVZ7NYKcKxJZ87iu32iuGT+phFip+ZP
# O9GkqDYkvzQmB74b7hQ3knn6qFLqUZ8njpSceIeC8PHINZmSx+v+KVkEavN/z0hF
# T9xYR2VPPjIIk3MnwtkyHhTWWxNoKGCg+BZV2mApwR9EsWJHVpiGru6DNfNwSQpB
# oIvMGOOL919XgE4J1B022xnAcnCCxoGjjSmBPb1TWemijGsGD2Je8/EALw9geBB9
# vbJvwn8wggajMIIFi6ADAgECAhAPqEkGFdcAoL4hdv3F7G29MA0GCSqGSIb3DQEB
# BQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV
# BAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQg
# SUQgUm9vdCBDQTAeFw0xMTAyMTExMjAwMDBaFw0yNjAyMTAxMjAwMDBaMG8xCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29kZSBT
# aWduaW5nIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcfPmg
# jwrKiUtTmjzsGSJ/DMv3SETQPyJumk/6zt/G0ySR/6hSk+dy+PFGhpTFqxf0eH/L
# er6QJhx8Uy/lg+e7agUozKAXEUsYIPO3vfLcy7iGQEUfT/k5mNM7629ppFwBLrFm
# 6aa43Abero1i/kQngqkDw/7mJguTSXHlOG1O/oBcZ3e11W9mZJRru4hJaNjR9H4h
# webFHsnglrgJlflLnq7MMb1qWkKnxAVHfWAr2aFdvftWk+8b/HL53z4y/d0qLDJG
# 2l5jvNC4y0wQNfxQX6xDRHz+hERQtIwqPXQM9HqLckvgVrUTtmPpP05JI+cGFvAl
# qwH4KEHmx9RkO12rAgMBAAGjggNDMIIDPzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0l
# BAwwCgYIKwYBBQUHAwMwggHDBgNVHSAEggG6MIIBtjCCAbIGCGCGSAGG/WwDMIIB
# pDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1y
# ZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMA
# ZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8A
# bgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAA
# dABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAA
# dABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0A
# ZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQA
# eQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgA
# ZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjASBgNVHRMBAf8E
# CDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29j
# c3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4
# MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk
# SURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln
# aUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQWBBR7aM4pqsAXvkl64eU/
# 1qf3RY81MjAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG
# 9w0BAQUFAAOCAQEAe3IdZP+IyDrBt+nnqcSHu9uUkteQWTP6K4feqFuAJT8Tj5uD
# G3xDxOaM3zk+wxXssNo7ISV7JMFyXbhHkYETRvqcP2pRON60Jcvwq9/FKAFUeRBG
# JNE4DyahYZBNur0o5j/xxKqb9to1U0/J8j3TbNwj7aqgTWcJ8zqAPTz7NkyQ53ak
# 3fI6v1Y1L6JMZejg1NrRx8iRai0jTzc7GZQY1NWcEDzVsRwZ/4/Ia5ue+K6cmZZ4
# 0c2cURVbQiZyWo0KSiOSQOiG3iLCkzrUm2im3yl/Brk8Dr2fxIacgkdCcTKGCZly
# CXlLnXFp9UH/fzl3ZPGEjb6LHrJ9aKOlkLEM/zGCBDQwggQwAgEBMIGDMG8xCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29kZSBT
# aWduaW5nIENBLTECEA3/99JYTi+N6amVWfXCcCMwCQYFKw4DAhoFAKB4MBgGCisG
# AQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFORh
# ye1YjEC6+fdachXyyXW48GSPMA0GCSqGSIb3DQEBAQUABIIBAJNs38VW/KWaZl2h
# SBcwL/Xl/AGmyuWwqFd5AwWaO7+PXBbT4KmLFHh8JDLuWKdVzwLuMe7DXqhji/dH
# yNd7j02VhiC1/EQ4pGfvSqgIwA0T4zyQOjcusHkiTQv08reYyRcSjc3w2gsipFS3
# C/MWfSQ6M5MWxodieB+b96JgQ8o9jYF0sZ5YJKZ2yRB9/Q4Lyq5wtFb27xijkAGb
# 63CB4qb1TUtzpXYZKXR4zskCCy7JHGhxBUWTnddQMi6ablpCeVxyqug1HgZTAm1K
# ylt1AiiT1JQqb5HGdo6Ki2L1aPpyoQsIZCCDJRTAaN1K0EPiNCa1RHalcdw5jc+l
# w8dxxuOhggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQG
# EwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5
# bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVu
# BNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
# BgkqhkiG9w0BCQUxDxcNMTQxMDA4MTQxOTQzWjAjBgkqhkiG9w0BCQQxFgQUgyOf
# THeSph7tUTQxYSEDg3n2lfgwDQYJKoZIhvcNAQEBBQAEggEANKmp+yDyzqN0Xkgn
# 1zR1vKeqEb2nH56oJRXZ4/3Ou57bDaLTVsm421M9nWR3w3qG8SACsmr2Zyz1NYz0
# n/YI518vBLgRSl8Wk9rf9Q1+a4bRgd0/FddVAMw3Or7VNCTMAvHVdQX6qLIgCtXz
# q5j37nMZda86pkhsiQWZ453wrhL8VOtwwVjGg623U0gsnMoTasIziDt73G0snQxd
# xf2nSrIMZsr4PGFxIMvLLc9nyNADRnh35nWuYLQ7x1c7hppy50mReY1yAB4v91JD
# iGzG+IwCRJV2p13mkaw4lDQm6SlHoOnaj/FbL4CHBkujBVmtJH1WulLEmRkchpU4
# B4wLGA==
# SIG # End signature block