J81.NSToolkit.Config/Public/ns-functions-config-quic.ps1
function Invoke-NSUpdateQuicparam { <# .SYNOPSIS Update QUIC configuration. config Object. .DESCRIPTION Configuration for Citrix ADC QUIC parameters resource. .PARAMETER Quicsecrettimeout Rotation frequency, in seconds, for the secret used to generate address validation tokens that will be issued in QUIC Retry packets and QUIC NEW_TOKEN frames sent by the Citrix ADC. A value of 0 can be configured if secret rotation is not desired. Maximum value = 31536000 .EXAMPLE PS C:\>Invoke-NSUpdateQuicparam An example how to update quicparam config Object(s). .NOTES File Name : Invoke-NSUpdateQuicparam Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicparam/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [double]$Quicsecrettimeout ) begin { Write-Verbose "Invoke-NSUpdateQuicparam: Starting" } process { try { $payload = @{ } if ( $PSBoundParameters.ContainsKey('quicsecrettimeout') ) { $payload.Add('quicsecrettimeout', $quicsecrettimeout) } if ( $PSCmdlet.ShouldProcess("quicparam", "Update QUIC configuration. config Object") ) { $result = Invoke-NSNitroApi -NSSession $NSSession -Method PUT -NitroPath nitro/v1/config -Type quicparam -Payload $payload -GetWarning #HTTP Status Code on Success: 200 OK #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error Write-Output $result } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSUpdateQuicparam: Finished" } } function Invoke-NSUnsetQuicparam { <# .SYNOPSIS Unset QUIC configuration. config Object. .DESCRIPTION Configuration for Citrix ADC QUIC parameters resource. .PARAMETER Quicsecrettimeout Rotation frequency, in seconds, for the secret used to generate address validation tokens that will be issued in QUIC Retry packets and QUIC NEW_TOKEN frames sent by the Citrix ADC. A value of 0 can be configured if secret rotation is not desired. Maximum value = 31536000 .EXAMPLE PS C:\>Invoke-NSUnsetQuicparam An example how to unset quicparam config Object(s). .NOTES File Name : Invoke-NSUnsetQuicparam Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicparam Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [Boolean]$quicsecrettimeout ) begin { Write-Verbose "Invoke-NSUnsetQuicparam: Starting" } process { try { $payload = @{ } if ( $PSBoundParameters.ContainsKey('quicsecrettimeout') ) { $payload.Add('quicsecrettimeout', $quicsecrettimeout) } if ( $PSCmdlet.ShouldProcess("quicparam", "Unset QUIC configuration. config Object") ) { $response = Invoke-NSNitroApi -NSSession $NSSession -Method POST -Type quicparam -NitroPath nitro/v1/config -Action unset -Payload $payload -GetWarning #HTTP Status Code on Success: 200 OK #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error Write-Output $response } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSUnsetQuicparam: Finished" } } function Invoke-NSGetQuicparam { <# .SYNOPSIS Get QUIC configuration. config object(s). .DESCRIPTION Configuration for Citrix ADC QUIC parameters resource. .PARAMETER GetAll Retrieve all quicparam object(s). .PARAMETER Count If specified, the count of the quicparam object(s) will be returned. .PARAMETER Filter Specify a filter. -Filter @{ 'name'='<value>' } .PARAMETER ViewSummary When specified, only a summary of information is returned. .EXAMPLE PS C:\>Invoke-NSGetQuicparam Get data. .EXAMPLE PS C:\>Invoke-NSGetQuicparam -GetAll Get all quicparam data. .EXAMPLE PS C:\>Invoke-NSGetQuicparam -name <string> Get quicparam object by specifying for example the name. .EXAMPLE PS C:\>Invoke-NSGetQuicparam -Filter @{ 'name'='<value>' } Get quicparam data with a filter. .NOTES File Name : Invoke-NSGetQuicparam Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicparam/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(DefaultParameterSetName = "GetAll")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [hashtable]$Filter = @{ }, [Parameter(ParameterSetName = 'GetAll')] [Switch]$GetAll ) begin { Write-Verbose "Invoke-NSGetQuicparam: Beginning" } process { try { if ( $PsCmdlet.ParameterSetName -eq 'GetAll' ) { $query = @{ } Write-Verbose "Retrieving all quicparam objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicparam -NitroPath nitro/v1/config -Query $query -Summary:$ViewSummary -Filter $Filter -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'Count' ) { if ( $PSBoundParameters.ContainsKey('Count') ) { $query = @{ 'count' = 'yes' } } Write-Verbose "Retrieving total count for quicparam objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicparam -NitroPath nitro/v1/config -Query $query -Summary:$ViewSummary -Filter $Filter -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'GetByArgument' ) { Write-Verbose "Retrieving quicparam objects by arguments" $arguments = @{ } $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicparam -NitroPath nitro/v1/config -Arguments $arguments -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'GetByResource' ) { Write-Verbose "Retrieving quicparam configuration for property ''" } else { Write-Verbose "Retrieving quicparam configuration objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicparam -NitroPath nitro/v1/config -Summary:$ViewSummary -Query $query -Filter $Filter -GetWarning } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" $response = $null } Write-Output $response } end { Write-Verbose "Invoke-NSGetQuicparam: Ended" } } function Invoke-NSAddQuicprofile { <# .SYNOPSIS Add QUIC configuration. config Object. .DESCRIPTION Configuration for QUIC profile resource. .PARAMETER Name Name for the QUIC profile. Must begin with an ASCII alphanumeric or underscore (_) character, and must contain only ASCII alphanumeric, underscore, hash (#), period (.), space, colon (:), at (@),equals sign (=), and hyphen (-) characters. Cannot be changed after the profile is created. .PARAMETER Ackdelayexponent An integer value advertised by the Citrix ADC to the remote QUIC endpoint, indicating an exponent that the remote QUIC endpoint should use, to decode the ACK Delay field in QUIC ACK frames sent by the Citrix ADC. Maximum value = 20 .PARAMETER Activeconnectionidlimit An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum number of QUIC connection IDs from the remote QUIC endpoint, that the Citrix ADC is willing to store. Maximum value = 8 .PARAMETER Activeconnectionmigration Specify whether the Citrix ADC should allow the remote QUIC endpoint to perform active QUIC connection migration. Possible values = ENABLED, DISABLED .PARAMETER Congestionctrlalgorithm Specify the congestion control algorithm to be used for QUIC connections. The default congestion control algorithm is CUBIC. Possible values = Default, NewReno, CUBIC, BBR .PARAMETER Initialmaxdata An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial value, in bytes, for the maximum amount of data that can be sent on a QUIC connection. Maximum value = 67108864 .PARAMETER Initialmaxstreamdatabidilocal An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the Citrix ADC. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatabidiremote An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatauni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for unidirectional streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamsbidi An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of bidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Initialmaxstreamsuni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of unidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Maxackdelay An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum amount of time, in milliseconds, by which the Citrix ADC will delay sending acknowledgments. Maximum value = 2000 .PARAMETER Maxidletimeout An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum idle timeout, in seconds, for a QUIC connection. A QUIC connection will be silently discarded by the Citrix ADC if it remains idle for longer than the minimum of the idle timeout values advertised by the Citrix ADC and the remote QUIC endpoint, and three times the current Probe Timeout (PTO). Maximum value = 3600 .PARAMETER Maxudpdatagramsperburst An integer value, specifying the maximum number of UDP datagrams that can be transmitted by the Citrix ADC in a single transmission burst on a QUIC connection. Maximum value = 256 .PARAMETER Maxudppayloadsize An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the size of the largest UDP datagram payload, in bytes, that the Citrix ADC is willing to receive on a QUIC connection. Maximum value = 9188 .PARAMETER Newtokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC NEW_TOKEN frames sent by the Citrix ADC. Maximum value = 3600 .PARAMETER Retrytokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC Retry packets sent by the Citrix ADC. Maximum value = 120 .PARAMETER Statelessaddressvalidation Specify whether the Citrix ADC should perform stateless address validation for QUIC clients, by sending tokens in QUIC Retry packets during QUIC connection establishment, and by sending tokens in QUIC NEW_TOKEN frames after QUIC connection establishment. Possible values = ENABLED, DISABLED .PARAMETER PassThru Return details about the created quicprofile item. .EXAMPLE PS C:\>Invoke-NSAddQuicprofile -name <string> An example how to add quicprofile config Object(s). .NOTES File Name : Invoke-NSAddQuicprofile Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicprofile/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [Parameter(Mandatory)] [ValidatePattern('^(?>(?>[a-zA-Z0-9]|[_])+(?>[\x00-\x7F]|[_]|[#]|[.][ ]|[:]|[@]|[=]|[-])*)$')] [ValidateLength(1, 256)] [string]$Name, [double]$Ackdelayexponent = '3', [double]$Activeconnectionidlimit = '3', [ValidateSet('ENABLED', 'DISABLED')] [string]$Activeconnectionmigration = 'ENABLED', [ValidateSet('Default', 'NewReno', 'CUBIC', 'BBR')] [string]$Congestionctrlalgorithm = 'Default', [double]$Initialmaxdata = '1048576', [double]$Initialmaxstreamdatabidilocal = '262144', [double]$Initialmaxstreamdatabidiremote = '262144', [double]$Initialmaxstreamdatauni = '262144', [double]$Initialmaxstreamsbidi = '100', [double]$Initialmaxstreamsuni = '10', [double]$Maxackdelay = '20', [double]$Maxidletimeout = '180', [double]$Maxudpdatagramsperburst = '8', [double]$Maxudppayloadsize = '1472', [double]$Newtokenvalidityperiod = '300', [double]$Retrytokenvalidityperiod = '10', [ValidateSet('ENABLED', 'DISABLED')] [string]$Statelessaddressvalidation = 'ENABLED', [Switch]$PassThru ) begin { Write-Verbose "Invoke-NSAddQuicprofile: Starting" } process { try { $payload = @{ name = $name } if ( $PSBoundParameters.ContainsKey('ackdelayexponent') ) { $payload.Add('ackdelayexponent', $ackdelayexponent) } if ( $PSBoundParameters.ContainsKey('activeconnectionidlimit') ) { $payload.Add('activeconnectionidlimit', $activeconnectionidlimit) } if ( $PSBoundParameters.ContainsKey('activeconnectionmigration') ) { $payload.Add('activeconnectionmigration', $activeconnectionmigration) } if ( $PSBoundParameters.ContainsKey('congestionctrlalgorithm') ) { $payload.Add('congestionctrlalgorithm', $congestionctrlalgorithm) } if ( $PSBoundParameters.ContainsKey('initialmaxdata') ) { $payload.Add('initialmaxdata', $initialmaxdata) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidilocal') ) { $payload.Add('initialmaxstreamdatabidilocal', $initialmaxstreamdatabidilocal) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidiremote') ) { $payload.Add('initialmaxstreamdatabidiremote', $initialmaxstreamdatabidiremote) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatauni') ) { $payload.Add('initialmaxstreamdatauni', $initialmaxstreamdatauni) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsbidi') ) { $payload.Add('initialmaxstreamsbidi', $initialmaxstreamsbidi) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsuni') ) { $payload.Add('initialmaxstreamsuni', $initialmaxstreamsuni) } if ( $PSBoundParameters.ContainsKey('maxackdelay') ) { $payload.Add('maxackdelay', $maxackdelay) } if ( $PSBoundParameters.ContainsKey('maxidletimeout') ) { $payload.Add('maxidletimeout', $maxidletimeout) } if ( $PSBoundParameters.ContainsKey('maxudpdatagramsperburst') ) { $payload.Add('maxudpdatagramsperburst', $maxudpdatagramsperburst) } if ( $PSBoundParameters.ContainsKey('maxudppayloadsize') ) { $payload.Add('maxudppayloadsize', $maxudppayloadsize) } if ( $PSBoundParameters.ContainsKey('newtokenvalidityperiod') ) { $payload.Add('newtokenvalidityperiod', $newtokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('retrytokenvalidityperiod') ) { $payload.Add('retrytokenvalidityperiod', $retrytokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('statelessaddressvalidation') ) { $payload.Add('statelessaddressvalidation', $statelessaddressvalidation) } if ( $PSCmdlet.ShouldProcess("quicprofile", "Add QUIC configuration. config Object") ) { $result = Invoke-NSNitroApi -NSSession $NSSession -Method POST -NitroPath nitro/v1/config -Type quicprofile -Payload $payload -GetWarning #HTTP Status Code on Success: 201 Created #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error if ( $PSBoundParameters.ContainsKey('PassThru') ) { Write-Output (Invoke-NSGetQuicprofile -Filter $payload) } else { Write-Output $result } } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSAddQuicprofile: Finished" } } function Invoke-NSDeleteQuicprofile { <# .SYNOPSIS Delete QUIC configuration. config Object. .DESCRIPTION Configuration for QUIC profile resource. .PARAMETER Name Name for the QUIC profile. Must begin with an ASCII alphanumeric or underscore (_) character, and must contain only ASCII alphanumeric, underscore, hash (#), period (.), space, colon (:), at (@),equals sign (=), and hyphen (-) characters. Cannot be changed after the profile is created. .EXAMPLE PS C:\>Invoke-NSDeleteQuicprofile -Name <string> An example how to delete quicprofile config Object(s). .NOTES File Name : Invoke-NSDeleteQuicprofile Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicprofile/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [Parameter(Mandatory)] [string]$Name ) begin { Write-Verbose "Invoke-NSDeleteQuicprofile: Starting" } process { try { $arguments = @{ } if ( $PSCmdlet.ShouldProcess("$name", "Delete QUIC configuration. config Object") ) { $response = Invoke-NSNitroApi -NSSession $NSSession -Method DELETE -Type quicprofile -NitroPath nitro/v1/config -Resource $name -Arguments $arguments #HTTP Status Code on Success: 200 OK #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error Write-Output $response } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSDeleteQuicprofile: Finished" } } function Invoke-NSUpdateQuicprofile { <# .SYNOPSIS Update QUIC configuration. config Object. .DESCRIPTION Configuration for QUIC profile resource. .PARAMETER Name Name for the QUIC profile. Must begin with an ASCII alphanumeric or underscore (_) character, and must contain only ASCII alphanumeric, underscore, hash (#), period (.), space, colon (:), at (@),equals sign (=), and hyphen (-) characters. Cannot be changed after the profile is created. .PARAMETER Ackdelayexponent An integer value advertised by the Citrix ADC to the remote QUIC endpoint, indicating an exponent that the remote QUIC endpoint should use, to decode the ACK Delay field in QUIC ACK frames sent by the Citrix ADC. Maximum value = 20 .PARAMETER Activeconnectionidlimit An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum number of QUIC connection IDs from the remote QUIC endpoint, that the Citrix ADC is willing to store. Maximum value = 8 .PARAMETER Activeconnectionmigration Specify whether the Citrix ADC should allow the remote QUIC endpoint to perform active QUIC connection migration. Possible values = ENABLED, DISABLED .PARAMETER Congestionctrlalgorithm Specify the congestion control algorithm to be used for QUIC connections. The default congestion control algorithm is CUBIC. Possible values = Default, NewReno, CUBIC, BBR .PARAMETER Initialmaxdata An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial value, in bytes, for the maximum amount of data that can be sent on a QUIC connection. Maximum value = 67108864 .PARAMETER Initialmaxstreamdatabidilocal An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the Citrix ADC. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatabidiremote An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatauni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for unidirectional streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamsbidi An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of bidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Initialmaxstreamsuni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of unidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Maxackdelay An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum amount of time, in milliseconds, by which the Citrix ADC will delay sending acknowledgments. Maximum value = 2000 .PARAMETER Maxidletimeout An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum idle timeout, in seconds, for a QUIC connection. A QUIC connection will be silently discarded by the Citrix ADC if it remains idle for longer than the minimum of the idle timeout values advertised by the Citrix ADC and the remote QUIC endpoint, and three times the current Probe Timeout (PTO). Maximum value = 3600 .PARAMETER Maxudpdatagramsperburst An integer value, specifying the maximum number of UDP datagrams that can be transmitted by the Citrix ADC in a single transmission burst on a QUIC connection. Maximum value = 256 .PARAMETER Maxudppayloadsize An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the size of the largest UDP datagram payload, in bytes, that the Citrix ADC is willing to receive on a QUIC connection. Maximum value = 9188 .PARAMETER Newtokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC NEW_TOKEN frames sent by the Citrix ADC. Maximum value = 3600 .PARAMETER Retrytokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC Retry packets sent by the Citrix ADC. Maximum value = 120 .PARAMETER Statelessaddressvalidation Specify whether the Citrix ADC should perform stateless address validation for QUIC clients, by sending tokens in QUIC Retry packets during QUIC connection establishment, and by sending tokens in QUIC NEW_TOKEN frames after QUIC connection establishment. Possible values = ENABLED, DISABLED .PARAMETER PassThru Return details about the created quicprofile item. .EXAMPLE PS C:\>Invoke-NSUpdateQuicprofile -name <string> An example how to update quicprofile config Object(s). .NOTES File Name : Invoke-NSUpdateQuicprofile Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicprofile/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [Parameter(Mandatory)] [ValidatePattern('^(?>(?>[a-zA-Z0-9]|[_])+(?>[\x00-\x7F]|[_]|[#]|[.][ ]|[:]|[@]|[=]|[-])*)$')] [ValidateLength(1, 256)] [string]$Name, [double]$Ackdelayexponent, [double]$Activeconnectionidlimit, [ValidateSet('ENABLED', 'DISABLED')] [string]$Activeconnectionmigration, [ValidateSet('Default', 'NewReno', 'CUBIC', 'BBR')] [string]$Congestionctrlalgorithm, [double]$Initialmaxdata, [double]$Initialmaxstreamdatabidilocal, [double]$Initialmaxstreamdatabidiremote, [double]$Initialmaxstreamdatauni, [double]$Initialmaxstreamsbidi, [double]$Initialmaxstreamsuni, [double]$Maxackdelay, [double]$Maxidletimeout, [double]$Maxudpdatagramsperburst, [double]$Maxudppayloadsize, [double]$Newtokenvalidityperiod, [double]$Retrytokenvalidityperiod, [ValidateSet('ENABLED', 'DISABLED')] [string]$Statelessaddressvalidation, [Switch]$PassThru ) begin { Write-Verbose "Invoke-NSUpdateQuicprofile: Starting" } process { try { $payload = @{ name = $name } if ( $PSBoundParameters.ContainsKey('ackdelayexponent') ) { $payload.Add('ackdelayexponent', $ackdelayexponent) } if ( $PSBoundParameters.ContainsKey('activeconnectionidlimit') ) { $payload.Add('activeconnectionidlimit', $activeconnectionidlimit) } if ( $PSBoundParameters.ContainsKey('activeconnectionmigration') ) { $payload.Add('activeconnectionmigration', $activeconnectionmigration) } if ( $PSBoundParameters.ContainsKey('congestionctrlalgorithm') ) { $payload.Add('congestionctrlalgorithm', $congestionctrlalgorithm) } if ( $PSBoundParameters.ContainsKey('initialmaxdata') ) { $payload.Add('initialmaxdata', $initialmaxdata) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidilocal') ) { $payload.Add('initialmaxstreamdatabidilocal', $initialmaxstreamdatabidilocal) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidiremote') ) { $payload.Add('initialmaxstreamdatabidiremote', $initialmaxstreamdatabidiremote) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatauni') ) { $payload.Add('initialmaxstreamdatauni', $initialmaxstreamdatauni) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsbidi') ) { $payload.Add('initialmaxstreamsbidi', $initialmaxstreamsbidi) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsuni') ) { $payload.Add('initialmaxstreamsuni', $initialmaxstreamsuni) } if ( $PSBoundParameters.ContainsKey('maxackdelay') ) { $payload.Add('maxackdelay', $maxackdelay) } if ( $PSBoundParameters.ContainsKey('maxidletimeout') ) { $payload.Add('maxidletimeout', $maxidletimeout) } if ( $PSBoundParameters.ContainsKey('maxudpdatagramsperburst') ) { $payload.Add('maxudpdatagramsperburst', $maxudpdatagramsperburst) } if ( $PSBoundParameters.ContainsKey('maxudppayloadsize') ) { $payload.Add('maxudppayloadsize', $maxudppayloadsize) } if ( $PSBoundParameters.ContainsKey('newtokenvalidityperiod') ) { $payload.Add('newtokenvalidityperiod', $newtokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('retrytokenvalidityperiod') ) { $payload.Add('retrytokenvalidityperiod', $retrytokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('statelessaddressvalidation') ) { $payload.Add('statelessaddressvalidation', $statelessaddressvalidation) } if ( $PSCmdlet.ShouldProcess("quicprofile", "Update QUIC configuration. config Object") ) { $result = Invoke-NSNitroApi -NSSession $NSSession -Method PUT -NitroPath nitro/v1/config -Type quicprofile -Payload $payload -GetWarning #HTTP Status Code on Success: 200 OK #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error if ( $PSBoundParameters.ContainsKey('PassThru') ) { Write-Output (Invoke-NSGetQuicprofile -Filter $payload) } else { Write-Output $result } } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSUpdateQuicprofile: Finished" } } function Invoke-NSUnsetQuicprofile { <# .SYNOPSIS Unset QUIC configuration. config Object. .DESCRIPTION Configuration for QUIC profile resource. .PARAMETER Name Name for the QUIC profile. Must begin with an ASCII alphanumeric or underscore (_) character, and must contain only ASCII alphanumeric, underscore, hash (#), period (.), space, colon (:), at (@),equals sign (=), and hyphen (-) characters. Cannot be changed after the profile is created. .PARAMETER Ackdelayexponent An integer value advertised by the Citrix ADC to the remote QUIC endpoint, indicating an exponent that the remote QUIC endpoint should use, to decode the ACK Delay field in QUIC ACK frames sent by the Citrix ADC. Maximum value = 20 .PARAMETER Activeconnectionidlimit An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum number of QUIC connection IDs from the remote QUIC endpoint, that the Citrix ADC is willing to store. Maximum value = 8 .PARAMETER Activeconnectionmigration Specify whether the Citrix ADC should allow the remote QUIC endpoint to perform active QUIC connection migration. Possible values = ENABLED, DISABLED .PARAMETER Congestionctrlalgorithm Specify the congestion control algorithm to be used for QUIC connections. The default congestion control algorithm is CUBIC. Possible values = Default, NewReno, CUBIC, BBR .PARAMETER Initialmaxdata An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial value, in bytes, for the maximum amount of data that can be sent on a QUIC connection. Maximum value = 67108864 .PARAMETER Initialmaxstreamdatabidilocal An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the Citrix ADC. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatabidiremote An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for bidirectional QUIC streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamdatauni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial flow control limit, in bytes, for unidirectional streams initiated by the remote QUIC endpoint. Maximum value = 8388608 .PARAMETER Initialmaxstreamsbidi An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of bidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Initialmaxstreamsuni An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the initial maximum number of unidirectional streams the remote QUIC endpoint may initiate. Maximum value = 500 .PARAMETER Maxackdelay An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum amount of time, in milliseconds, by which the Citrix ADC will delay sending acknowledgments. Maximum value = 2000 .PARAMETER Maxidletimeout An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the maximum idle timeout, in seconds, for a QUIC connection. A QUIC connection will be silently discarded by the Citrix ADC if it remains idle for longer than the minimum of the idle timeout values advertised by the Citrix ADC and the remote QUIC endpoint, and three times the current Probe Timeout (PTO). Maximum value = 3600 .PARAMETER Maxudpdatagramsperburst An integer value, specifying the maximum number of UDP datagrams that can be transmitted by the Citrix ADC in a single transmission burst on a QUIC connection. Maximum value = 256 .PARAMETER Maxudppayloadsize An integer value advertised by the Citrix ADC to the remote QUIC endpoint, specifying the size of the largest UDP datagram payload, in bytes, that the Citrix ADC is willing to receive on a QUIC connection. Maximum value = 9188 .PARAMETER Newtokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC NEW_TOKEN frames sent by the Citrix ADC. Maximum value = 3600 .PARAMETER Retrytokenvalidityperiod An integer value, specifying the validity period, in seconds, of address validation tokens issued through QUIC Retry packets sent by the Citrix ADC. Maximum value = 120 .PARAMETER Statelessaddressvalidation Specify whether the Citrix ADC should perform stateless address validation for QUIC clients, by sending tokens in QUIC Retry packets during QUIC connection establishment, and by sending tokens in QUIC NEW_TOKEN frames after QUIC connection establishment. Possible values = ENABLED, DISABLED .EXAMPLE PS C:\>Invoke-NSUnsetQuicprofile -name <string> An example how to unset quicprofile config Object(s). .NOTES File Name : Invoke-NSUnsetQuicprofile Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicprofile Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [ValidatePattern('^(?>(?>[a-zA-Z0-9]|[_])+(?>[\x00-\x7F]|[_]|[#]|[.][ ]|[:]|[@]|[=]|[-])*)$')] [ValidateLength(1, 256)] [string]$Name, [Boolean]$ackdelayexponent, [Boolean]$activeconnectionidlimit, [Boolean]$activeconnectionmigration, [Boolean]$congestionctrlalgorithm, [Boolean]$initialmaxdata, [Boolean]$initialmaxstreamdatabidilocal, [Boolean]$initialmaxstreamdatabidiremote, [Boolean]$initialmaxstreamdatauni, [Boolean]$initialmaxstreamsbidi, [Boolean]$initialmaxstreamsuni, [Boolean]$maxackdelay, [Boolean]$maxidletimeout, [Boolean]$maxudpdatagramsperburst, [Boolean]$maxudppayloadsize, [Boolean]$newtokenvalidityperiod, [Boolean]$retrytokenvalidityperiod, [Boolean]$statelessaddressvalidation ) begin { Write-Verbose "Invoke-NSUnsetQuicprofile: Starting" } process { try { $payload = @{ name = $name } if ( $PSBoundParameters.ContainsKey('ackdelayexponent') ) { $payload.Add('ackdelayexponent', $ackdelayexponent) } if ( $PSBoundParameters.ContainsKey('activeconnectionidlimit') ) { $payload.Add('activeconnectionidlimit', $activeconnectionidlimit) } if ( $PSBoundParameters.ContainsKey('activeconnectionmigration') ) { $payload.Add('activeconnectionmigration', $activeconnectionmigration) } if ( $PSBoundParameters.ContainsKey('congestionctrlalgorithm') ) { $payload.Add('congestionctrlalgorithm', $congestionctrlalgorithm) } if ( $PSBoundParameters.ContainsKey('initialmaxdata') ) { $payload.Add('initialmaxdata', $initialmaxdata) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidilocal') ) { $payload.Add('initialmaxstreamdatabidilocal', $initialmaxstreamdatabidilocal) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatabidiremote') ) { $payload.Add('initialmaxstreamdatabidiremote', $initialmaxstreamdatabidiremote) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamdatauni') ) { $payload.Add('initialmaxstreamdatauni', $initialmaxstreamdatauni) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsbidi') ) { $payload.Add('initialmaxstreamsbidi', $initialmaxstreamsbidi) } if ( $PSBoundParameters.ContainsKey('initialmaxstreamsuni') ) { $payload.Add('initialmaxstreamsuni', $initialmaxstreamsuni) } if ( $PSBoundParameters.ContainsKey('maxackdelay') ) { $payload.Add('maxackdelay', $maxackdelay) } if ( $PSBoundParameters.ContainsKey('maxidletimeout') ) { $payload.Add('maxidletimeout', $maxidletimeout) } if ( $PSBoundParameters.ContainsKey('maxudpdatagramsperburst') ) { $payload.Add('maxudpdatagramsperburst', $maxudpdatagramsperburst) } if ( $PSBoundParameters.ContainsKey('maxudppayloadsize') ) { $payload.Add('maxudppayloadsize', $maxudppayloadsize) } if ( $PSBoundParameters.ContainsKey('newtokenvalidityperiod') ) { $payload.Add('newtokenvalidityperiod', $newtokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('retrytokenvalidityperiod') ) { $payload.Add('retrytokenvalidityperiod', $retrytokenvalidityperiod) } if ( $PSBoundParameters.ContainsKey('statelessaddressvalidation') ) { $payload.Add('statelessaddressvalidation', $statelessaddressvalidation) } if ( $PSCmdlet.ShouldProcess("$name", "Unset QUIC configuration. config Object") ) { $response = Invoke-NSNitroApi -NSSession $NSSession -Method POST -Type quicprofile -NitroPath nitro/v1/config -Action unset -Payload $payload -GetWarning #HTTP Status Code on Success: 200 OK #HTTP Status Code on Failure: 4xx <string> (for general HTTP errors) or 5xx <string> (for NetScaler-specific errors). The response payload provides details of the error Write-Output $response } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" throw $_ } } end { Write-Verbose "Invoke-NSUnsetQuicprofile: Finished" } } function Invoke-NSGetQuicprofile { <# .SYNOPSIS Get QUIC configuration. config object(s). .DESCRIPTION Configuration for QUIC profile resource. .PARAMETER Name Name for the QUIC profile. Must begin with an ASCII alphanumeric or underscore (_) character, and must contain only ASCII alphanumeric, underscore, hash (#), period (.), space, colon (:), at (@),equals sign (=), and hyphen (-) characters. Cannot be changed after the profile is created. .PARAMETER GetAll Retrieve all quicprofile object(s). .PARAMETER Count If specified, the count of the quicprofile object(s) will be returned. .PARAMETER Filter Specify a filter. -Filter @{ 'name'='<value>' } .PARAMETER ViewSummary When specified, only a summary of information is returned. .EXAMPLE PS C:\>Invoke-NSGetQuicprofile Get data. .EXAMPLE PS C:\>Invoke-NSGetQuicprofile -GetAll Get all quicprofile data. .EXAMPLE PS C:\>Invoke-NSGetQuicprofile -Count Get the number of quicprofile objects. .EXAMPLE PS C:\>Invoke-NSGetQuicprofile -name <string> Get quicprofile object by specifying for example the name. .EXAMPLE PS C:\>Invoke-NSGetQuicprofile -Filter @{ 'name'='<value>' } Get quicprofile data with a filter. .NOTES File Name : Invoke-NSGetQuicprofile Version : v2311.2021 Author : John Billekens Reference : https://developer-docs.netscaler.com/en-us/adc-nitro-api/current-release/configuration/quic/quicprofile/ Requires : PowerShell v5.1 and up NS 13.x and up. NS 12 and lower may work, not guaranteed (best effort). .LINK https://blog.j81.nl #> [CmdletBinding(DefaultParameterSetName = "GetAll")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPasswordParams', '')] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseBOMForUnicodeEncodedFile', '')] param( [Parameter(DontShow)] [Object]$NSSession = (Get-NSSession), [Parameter(ParameterSetName = 'GetByResource')] [ValidatePattern('^(?>(?>[a-zA-Z0-9]|[_])+(?>[\x00-\x7F]|[_]|[#]|[.][ ]|[:]|[@]|[=]|[-])*)$')] [ValidateLength(1, 256)] [string]$Name, [Parameter(ParameterSetName = 'Count', Mandatory)] [Switch]$Count, [hashtable]$Filter = @{ }, [Parameter(ParameterSetName = 'GetAll')] [Switch]$GetAll, [Parameter(ParameterSetName = 'GetAll')] [Parameter(ParameterSetName = 'Get')] [Switch]$ViewSummary ) begin { Write-Verbose "Invoke-NSGetQuicprofile: Beginning" } process { try { if ( $PsCmdlet.ParameterSetName -eq 'GetAll' ) { $query = @{ } Write-Verbose "Retrieving all quicprofile objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicprofile -NitroPath nitro/v1/config -Query $query -Summary:$ViewSummary -Filter $Filter -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'Count' ) { if ( $PSBoundParameters.ContainsKey('Count') ) { $query = @{ 'count' = 'yes' } } Write-Verbose "Retrieving total count for quicprofile objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicprofile -NitroPath nitro/v1/config -Query $query -Summary:$ViewSummary -Filter $Filter -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'GetByArgument' ) { Write-Verbose "Retrieving quicprofile objects by arguments" $arguments = @{ } $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicprofile -NitroPath nitro/v1/config -Arguments $arguments -GetWarning } elseif ( $PsCmdlet.ParameterSetName -eq 'GetByResource' ) { Write-Verbose "Retrieving quicprofile configuration for property 'name'" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicprofile -NitroPath nitro/v1/config -Resource $name -Summary:$ViewSummary -Filter $Filter -GetWarning } else { Write-Verbose "Retrieving quicprofile configuration objects" $response = Invoke-NSNitroApi -NSSession $NSSession -Method GET -Type quicprofile -NitroPath nitro/v1/config -Summary:$ViewSummary -Query $query -Filter $Filter -GetWarning } } catch { Write-Verbose "ERROR: $($_.Exception.Message)" $response = $null } Write-Output $response } end { Write-Verbose "Invoke-NSGetQuicprofile: Ended" } } # SIG # Begin signature block # MIIkmgYJKoZIhvcNAQcCoIIkizCCJIcCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCUed2577mm4kXN # H28kUlBd2yfqSnE0cvST+qoW77oSY6CCHl4wggTzMIID26ADAgECAhAsJ03zZBC0 # i/247uUvWN5TMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAkdCMRswGQYDVQQI # ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT # D1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2VjdGlnbyBSU0EgQ29kZSBTaWdu # aW5nIENBMB4XDTIxMDUwNTAwMDAwMFoXDTI0MDUwNDIzNTk1OVowWzELMAkGA1UE # BhMCTkwxEjAQBgNVBAcMCVZlbGRob3ZlbjEbMBkGA1UECgwSSm9oYW5uZXMgQmls # bGVrZW5zMRswGQYDVQQDDBJKb2hhbm5lcyBCaWxsZWtlbnMwggEiMA0GCSqGSIb3 # DQEBAQUAA4IBDwAwggEKAoIBAQCsfgRG81keOHalHfCUgxOa1Qy4VNOnGxB8SL8e # rjP9SfcF13McP7F1HGka5Be495pTZ+duGbaQMNozwg/5Dg9IRJEeBabeSSJJCbZo # SNpmUu7NNRRfidQxlPC81LxTVHxJ7In0MEfCVm7rWcri28MRCAuafqOfSE+hyb1Z # /tKyCyQ5RUq3kjs/CF+VfMHsJn6ZT63YqewRkwHuc7UogTTZKjhPJ9prGLTer8UX # UgvsGRbvhYZXIEuy+bmx/iJ1yRl1kX4nj6gUYzlhemOnlSDD66YOrkLDhXPMXLym # AN7h0/W5Bo//R5itgvdGBkXkWCKRASnq/9PTcoxW6mwtgU8xAgMBAAGjggGQMIIB # jDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4EFgQUZWMy # gC0i1u2NZ1msk2Mm5nJm5AswDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAw # EwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoGA1UdIARD # MEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGln # by5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3Js # LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBzBggrBgEF # BQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2Vj # dGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz # cC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEARjv9ieRocb1DXRWm3XtY # jjuSRjlvkoPd9wS6DNfsGlSU42BFd9LCKSyRREZVu8FDq7dN0PhD4bBTT+k6AgrY # KG6f/8yUponOdxskv850SjN2S2FeVuR20pqActMrpd1+GCylG8mj8RGjdrLQ3QuX # qYKS68WJ39WWYdVB/8Ftajir5p6sAfwHErLhbJS6WwmYjGI/9SekossvU8mZjZwo # Gbu+fjZhPc4PhjbEh0ABSsPMfGjQQsg5zLFjg/P+cS6hgYI7qctToo0TexGe32DY # fFWHrHuBErW2qXEJvzSqM5OtLRD06a4lH5ZkhojhMOX9S8xDs/ArDKgX1j1Xm4Tu # DjCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcNAQEMBQAw # ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G # A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV # BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAwMDBaFw0y # ODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNl # eTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1Qg # TmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1 # dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIASZRc2DsPb # CLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3KBErR9o5 # xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/owbxiBhq # kCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41pqdmyHJn # 2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpNrkyKt1ya # tLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5px2uMYJPe # xMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVmsSl8MoRj # VYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWIzYS4sT+k # OQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/NVV0CUnY # SVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79dGMvsVBl # CeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK61l9VLupc # xigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0jBBgwFoAU # oBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh2JvAnfKy # A2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQKMAgw # BgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNv # bS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQoMCYwJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0BAQwF # AAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qofnJYt7wNK # fq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrwkZb+/UNk # fv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx8VvwQQuY # AAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdcOds/exgN # Rc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4UxFMToqWpM # gLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBvmyYY0ILg # ln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpO # ZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVT # RVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmlj # YXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIzNTk1OVow # fDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G # A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQD # ExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilAhlRGdDFi # xRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6DBmJqGx7 # rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpyvjg7Y96P # v25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52BxHJAteJf # 7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G2flGHNyM # fHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIBYDAfBgNV # HSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6qFM6MdWK # vsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAw # HQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0g # ADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVNF # UlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUHAQEE # ajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNFUlRy # dXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVz # ZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNveaiqMm/EA # AB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS9At3Wpwq # QTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3ZLCmI2pZ # aFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1fqW4w2y1 # z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6fICUQDRn7 # UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIeQ3pFMcGc # TanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lkuk/xYpMo # JVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9V1DSyt39 # ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoKC6W59J7u # mDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLjtXX4oemO # CiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1qV3AcPKRY # LqPzW0sH3DJZ84enGm1YMIIG7DCCBNSgAwIBAgIQMA9vrN1mmHR8qUY2p3gtuTAN # BgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJz # ZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNU # IE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBB # dXRob3JpdHkwHhcNMTkwNTAyMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjB9MQswCQYD # VQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdT # YWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJTAjBgNVBAMTHFNlY3Rp # Z28gUlNBIFRpbWUgU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQDIGwGv2Sx+iJl9AZg/IJC9nIAhVJO5z6A+U++zWsB21hoEpc5Hg7Xr # xMxJNMvzRWW5+adkFiYJ+9UyUnkuyWPCE5u2hj8BBZJmbyGr1XEQeYf0RirNxFrJ # 29ddSU1yVg/cyeNTmDoqHvzOWEnTv/M5u7mkI0Ks0BXDf56iXNc48RaycNOjxN+z # xXKsLgp3/A2UUrf8H5VzJD0BKLwPDU+zkQGObp0ndVXRFzs0IXuXAZSvf4DP0REK # V4TJf1bgvUacgr6Unb+0ILBgfrhN9Q0/29DqhYyKVnHRLZRMyIw80xSinL0m/9NT # IMdgaZtYClT0Bef9Maz5yIUXx7gpGaQpL0bj3duRX58/Nj4OMGcrRrc1r5a+2kxg # zKi7nw0U1BjEMJh0giHPYla1IXMSHv2qyghYh3ekFesZVf/QOVQtJu5FGjpvzdeE # 8NfwKMVPZIMC1Pvi3vG8Aij0bdonigbSlofe6GsO8Ft96XZpkyAcSpcsdxkrk5WY # nJee647BeFbGRCXfBhKaBi2fA179g6JTZ8qx+o2hZMmIklnLqEbAyfKm/31X2xJ2 # +opBJNQb/HKlFKLUrUMcpEmLQTkUAx4p+hulIq6lw02C0I3aa7fb9xhAV3PwcaP7 # Sn1FNsH3jYL6uckNU4B9+rY5WDLvbxhQiddPnTO9GrWdod6VQXqngwIDAQABo4IB # WjCCAVYwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYE # FBqh+GEZIA/DQXdFKI7RNV8GEgRVMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E # CDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0g # ADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVNF # UlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUHAQEE # ajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNFUlRy # dXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVz # ZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAG1UgaUzXRbhtVOBkXXfA3oy # Cy0lhBGysNsqfSoF9bw7J/RaoLlJWZApbGHLtVDb4n35nwDvQMOt0+LkVvlYQc/x # QuUQff+wdB+PxlwJ+TNe6qAcJlhc87QRD9XVw+K81Vh4v0h24URnbY+wQxAPjeT5 # OGK/EwHFhaNMxcyyUzCVpNb0llYIuM1cfwGWvnJSajtCN3wWeDmTk5SbsdyybUFt # Z83Jb5A9f0VywRsj1sJVhGbks8VmBvbz1kteraMrQoohkv6ob1olcGKBc2NeoLvY # 3NdK0z2vgwY4Eh0khy3k/ALWPncEvAQ2ted3y5wujSMYuaPCRx3wXdahc1cFaJqn # yTdlHb7qvNhCg0MFpYumCf/RoZSmTqo9CfUFbLfSZFrYKiLCS53xOV5M3kg9mzSW # mglfjv33sVKRzj+J9hyhtal1H3G/W0NdZT1QgW6r8NDT/LKzH7aZlib0PHmLXGTM # ze4nmuWgwAxyh8FuTVrTHurwROYybxzrF06Uw3hlIDsPQaof6aFBnf6xuKBlKjTg # 3qj5PObBMLvAoGMs/FwWAKjQxH/qEZ0eBsambTJdtDgJK0kHqv3sMNrxpy/Pt/36 # 0KOE2See+wFmd7lWEOEgbsausfm2usg1XTN2jvF8IAwqd661ogKGuinutFoAsYyr # 4/kKyVRd1LlqdJ69SK6YMIIG9TCCBN2gAwIBAgIQOUwl4XygbSeoZeI72R0i1DAN # BgkqhkiG9w0BAQwFADB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBN # YW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExp # bWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0EwHhcN # MjMwNTAzMDAwMDAwWhcNMzQwODAyMjM1OTU5WjBqMQswCQYDVQQGEwJHQjETMBEG # A1UECBMKTWFuY2hlc3RlcjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD # VQQDDCNTZWN0aWdvIFJTQSBUaW1lIFN0YW1waW5nIFNpZ25lciAjNDCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKSTKFJLzyeHdqQpHJk4wOcO1NEc7GjL # AWTkis13sHFlgryf/Iu7u5WY+yURjlqICWYRFFiyuiJb5vYy8V0twHqiDuDgVmTt # oeWBIHIgZEFsx8MI+vN9Xe8hmsJ+1yzDuhGYHvzTIAhCs1+/f4hYMqsws9iMepZK # GRNcrPznq+kcFi6wsDiVSs+FUKtnAyWhuzjpD2+pWpqRKBM1uR/zPeEkyGuxmegN # 77tN5T2MVAOR0Pwtz1UzOHoJHAfRIuBjhqe+/dKDcxIUm5pMCUa9NLzhS1B7cuBb # /Rm7HzxqGXtuuy1EKr48TMysigSTxleGoHM2K4GX+hubfoiH2FJ5if5udzfXu1Cf # +hglTxPyXnypsSBaKaujQod34PRMAkjdWKVTpqOg7RmWZRUpxe0zMCXmloOBmvZg # ZpBYB4DNQnWs+7SR0MXdAUBqtqgQ7vaNereeda/TpUsYoQyfV7BeJUeRdM11EtGc # b+ReDZvsdSbu/tP1ki9ShejaRFEqoswAyodmQ6MbAO+itZadYq0nC/IbSsnDlEI3 # iCCEqIeuw7ojcnv4VO/4ayewhfWnQ4XYKzl021p3AtGk+vXNnD3MH65R0Hts2B0t # EUJTcXTC5TWqLVIS2SXP8NPQkUMS1zJ9mGzjd0HI/x8kVO9urcY+VXvxXIc6ZPFg # SwVP77kv7AkTAgMBAAGjggGCMIIBfjAfBgNVHSMEGDAWgBQaofhhGSAPw0F3RSiO # 0TVfBhIEVTAdBgNVHQ4EFgQUAw8xyJEqk71j89FdTaQ0D9KVARgwDgYDVR0PAQH/ # BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwSgYD # VR0gBEMwQTA1BgwrBgEEAbIxAQIBAwgwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9z # ZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQCMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6 # Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1JTQVRpbWVTdGFtcGluZ0NBLmNybDB0 # BggrBgEFBQcBAQRoMGYwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQuc2VjdGlnby5j # b20vU2VjdGlnb1JTQVRpbWVTdGFtcGluZ0NBLmNydDAjBggrBgEFBQcwAYYXaHR0 # cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggIBAEybZVj64HnP # 7xXDMm3eM5Hrd1ji673LSjx13n6UbcMixwSV32VpYRMM9gye9YkgXsGHxwMkysel # 8Cbf+PgxZQ3g621RV6aMhFIIRhwqwt7y2opF87739i7Efu347Wi/elZI6WHlmjl3 # vL66kWSIdf9dhRY0J9Ipy//tLdr/vpMM7G2iDczD8W69IZEaIwBSrZfUYngqhHmo # 1z2sIY9wwyR5OpfxDaOjW1PYqwC6WPs1gE9fKHFsGV7Cg3KQruDG2PKZ++q0kmV8 # B3w1RB2tWBhrYvvebMQKqWzTIUZw3C+NdUwjwkHQepY7w0vdzZImdHZcN6CaJJ5O # X07Tjw/lE09ZRGVLQ2TPSPhnZ7lNv8wNsTow0KE9SK16ZeTs3+AB8LMqSjmswaT5 # qX010DJAoLEZKhghssh9BXEaSyc2quCYHIN158d+S4RDzUP7kJd2KhKsQMFwW5kK # QPqAbZRhe8huuchnZyRcUI0BIN4H9wHU+C4RzZ2D5fjKJRxEPSflsIZHKgsbhHZ9 # e2hPjbf3E7TtoC3ucw/ZELqdmSx813UfjxDElOZ+JOWVSoiMJ9aFZh35rmR2kehI # /shVCu0pwx/eOKbAFPsyPfipg2I2yMO+AIccq/pKQhyJA9z1XHxw2V14Tu6fXiDm # CWp8KwijSPUV/ARP380hHHrl9Y4a1LlAMYIFkjCCBY4CAQEwgZAwfDELMAkGA1UE # BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2Fs # Zm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdv # IFJTQSBDb2RlIFNpZ25pbmcgQ0ECECwnTfNkELSL/bju5S9Y3lMwDQYJYIZIAWUD # BAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMx # DAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkq # hkiG9w0BCQQxIgQgsfJDpfFwH8gaGoctbK8N/GRC+MZ+xE5T2FZvAkWOvwkwDQYJ # KoZIhvcNAQEBBQAEggEAKXzceHspl4kKvMMoKeFfTTOSKETtxeJToL2Bh9ApPJXE # 6eEOIhEhtxQSrkVLYdgMbuQtlHIKO6iaeqdvsmkhcG6O7c8HYh1aj6+GmlnsAyLH # lz+nHcHXMGKMuByYjLxs4zoh0PMtEOwtarnDt4pzOmjwpehMGz7TLzg0uHeHf/pJ # O9M6GE35i59HNGgb0njcU1t/VIqJUaXvtJkIeupcOJuRSLS4dtUHHgtvQYxBtMRR # Y89nZr3zQSsJqLw6WRTW9WQfkBVMiG8KW8+mZjzMbWqy34UuFSAoBZqX9szS8KoW # HXt4pkhDyjGhUT4XT4oYTy63WWyFZaNLw34jSs6qeaGCA0swggNHBgkqhkiG9w0B # CQYxggM4MIIDNAIBATCBkTB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl # ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdv # IExpbWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0EC # EDlMJeF8oG0nqGXiO9kdItQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMx # CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMzExMjAyMDQzMTBaMD8GCSqG # SIb3DQEJBDEyBDCr52u7t9hlwxpjoLAx9410WNaD6e0X2A1jrG4ot5w1q6zFqAWv # h4mrZueMlcVHYf8wDQYJKoZIhvcNAQEBBQAEggIAgiT16LpHgEPb/lrDD24VzStE # V23k/6tAipMbg73BfgYgFpJW/c5GT2j2J0VY4/iBBO1cBIQGBRV+PA7ii9Y8HUNY # puXCQs0JOhen9CpazYqQ0WJFyBa6OP+raNhneTVUybPwx+qCjNqLASPd7CK7zJKQ # x4PIkaaqf5f5wbsp5L1vuWN28ySD3CcUg/Rwm3vDbh1+5S397LqxQGFpyvDxyfdo # wvHanleoxyEYpr1QPaZJ07EUgEtw+ZaKFk10xl5xzyLQs95pCCgsqP+Xt0cctW/o # BAvsafxz9ecoH2DMV0mqMMYTBblYC9GevuhaxfyeWysF0I4D3EjRKIsim0+mDtKK # QpusbY23LwVQzYnPQnmEASKEGe6nzOj07e8AbZ+WCYclOsdu2nd/572nzcBpDM5o # azgHdxMSnYv2I0cRnjovR7eWJ9bserlMGWpp08KiG++wf6cSHw0k0ROZeB8l2bXx # UK316Iy8bHOqG1e/m4SoZzXYbm/WV5wAa7Kz/YoYf7TbOJAw3g+bppvfFf+GSq4R # qD6Zt6xiSJtL/QpVQs90pQspW6ZCgREK1j3I8CztS7CQx50afCKeQjhJ3+BoT5Ym # 9I5yffWyIFA/JhgetVMlczd8HkaAFDu25Gtx3MYY919PmTYvmFyVv/190XbKZr4n # vENwGrcbYmqhMcB2zAw= # SIG # End signature block |