WSAPI/SystemInformationQueriesAndManagement.psm1
#################################################################################### ## © 2020,2021 Hewlett Packard Enterprise Development LP ## ## Permission is hereby granted, free of charge, to any person obtaining a ## copy of this software and associated documentation files (the "Software"), ## to deal in the Software without restriction, including without limitation ## the rights to use, copy, modify, merge, publish, distribute, sublicense, ## and/or sell copies of the Software, and to permit persons to whom the ## Software is furnished to do so, subject to the following conditions: ## ## The above copyright notice and this permission notice shall be included ## in all copies or substantial portions of the Software. ## ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR ## OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ## ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ## OTHER DEALINGS IN THE SOFTWARE. ## ## File Name: SystemInformationQueriesAndManagement.psm1 ## Description: System information queries and management cmdlets ## ## Created: February 2020 ## Last Modified: February 2020 ## History: v3.0 - Created ##################################################################################### $Info = "INFO:" $Debug = "DEBUG:" $global:VSLibraries = Split-Path $MyInvocation.MyCommand.Path [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ############################################################################################################################################ ## FUNCTION Get-System_WSAPI ############################################################################################################################################ Function Get-System_WSAPI { <# .SYNOPSIS Retrieve informations about the array. .DESCRIPTION Retrieve informations about the array. .EXAMPLE Get-System_WSAPI Retrieve informations about the array. .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Get-System_WSAPI LASTEDIT: February 2020 KEYWORDS: Get-System_WSAPI .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { #Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $Result = $null $dataPS = $null #Request $Result = Invoke-WSAPI -uri '/system' -type 'GET' -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { $dataPS = $Result.content | ConvertFrom-Json } if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS:successfully Executed" $Info return $dataPS } else { write-host "" write-host "FAILURE : While Executing Get-System_WSAPI" -foreground red write-host "" Write-DebugLog "FAILURE : While Executing Get-System_WSAPI" $Info return $Result.StatusDescription } } } #END Get-System_WSAPI ############################################################################################################################################ ## FUNCTION Update-System_WSAPI ############################################################################################################################################ Function Update-System_WSAPI { <# .SYNOPSIS Update storage system parameters .DESCRIPTION Update storage system parameters You can set all of the system parameters in one request, but some updates might fail. .EXAMPLE Update-System_WSAPI -RemoteSyslog $true .EXAMPLE Update-System_WSAPI -remoteSyslogHost "0.0.0.0" .EXAMPLE Update-System_WSAPI -PortFailoverEnabled $true .EXAMPLE Update-System_WSAPI -DisableDedup $true .EXAMPLE Update-System_WSAPI -OverProvRatioLimit 3 .EXAMPLE Update-System_WSAPI -AllowR5OnFCDrives $true .PARAMETER RemoteSyslog Enable (true) or disable (false) sending events to a remote system as syslog messages. .PARAMETER RemoteSyslogHost IP address of the systems to which events are sent as syslog messages. .PARAMETER RemoteSyslogSecurityHost Sets the hostname or IP address, and optionally the port, of the remote syslog servers to which security events are sent as syslog messages. .PARAMETER PortFailoverEnabled Enable (true) or disable (false) the automatic fail over of target ports to their designated partner ports. .PARAMETER FailoverMatchedSet Enable (true) or disable (false) the automatic fail over of matched-set VLUNs during a persistent port fail over. This does not affect host-see VLUNs, which are always failed over. .PARAMETER DisableDedup Enable or disable new write requests to TDVVs serviced by the system to be deduplicated. true – Disables deduplication false – Enables deduplication .PARAMETER DisableCompr Enable or disable the compression of all new write requests to the compressed VVs serviced by the system. True - The new writes are not compressed. False - The new writes are compressed. .PARAMETER OverProvRatioLimit The system, device types, and all CPGs are limited to the specified overprovisioning ratio. .PARAMETER OverProvRatioWarning An overprovisioning ratio, which when exceeded by the system, a device type, or a CPG, results in a warning alert. .PARAMETER AllowR5OnNLDrives Enable (true) or disable (false) support for RAID-5 on NL drives. .PARAMETER AllowR5OnFCDrives Enable (true) or disable (false) support for RAID-5 on FC drives. .PARAMETER ComplianceOfficerApproval Enable (true) or disable (false) compliance officer approval mode. .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Update-System_WSAPI LASTEDIT: February 2020 KEYWORDS: Update-System_WSAPI .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $RemoteSyslog, [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)] [System.String] $RemoteSyslogHost, [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)] [System.String] $RemoteSyslogSecurityHost, [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $PortFailoverEnabled, [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $FailoverMatchedSet, [Parameter(Position=5, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $DisableDedup, [Parameter(Position=6, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $DisableCompr, [Parameter(Position=7, Mandatory=$false, ValueFromPipeline=$true)] [int] $OverProvRatioLimit, [Parameter(Position=8, Mandatory=$false, ValueFromPipeline=$true)] [int] $OverProvRatioWarning, [Parameter(Position=9, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $AllowR5OnNLDrives, [Parameter(Position=10, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $AllowR5OnFCDrives, [Parameter(Position=11, Mandatory=$false, ValueFromPipeline=$true)] [boolean] $ComplianceOfficerApproval, [Parameter(Position=12, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { # Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $body = @{} $ObjMain=@{} If ($RemoteSyslog) { $Obj=@{} $Obj["remoteSyslog"] = $RemoteSyslog $ObjMain += $Obj } If ($RemoteSyslogHost) { $Obj=@{} $Obj["remoteSyslogHost"] = "$($RemoteSyslogHost)" $ObjMain += $Obj } If ($RemoteSyslogSecurityHost) { $Obj=@{} $Obj["remoteSyslogSecurityHost"] = "$($RemoteSyslogSecurityHost)" $ObjMain += $Obj } If ($PortFailoverEnabled) { $Obj=@{} $Obj["portFailoverEnabled"] = $PortFailoverEnabled $ObjMain += $Obj } If ($FailoverMatchedSet) { $Obj=@{} $Obj["failoverMatchedSet"] = $FailoverMatchedSet $ObjMain += $Obj } If ($DisableDedup) { $Obj=@{} $Obj["disableDedup"] = $DisableDedup $ObjMain += $Obj } If ($DisableCompr) { $Obj=@{} $Obj["disableCompr"] = $DisableCompr $ObjMain += $Obj } If ($OverProvRatioLimit) { $Obj=@{} $Obj["overProvRatioLimit"] = $OverProvRatioLimit $ObjMain += $Obj } If ($OverProvRatioWarning) { $Obj=@{} $Obj["overProvRatioWarning"] = $OverProvRatioWarning $ObjMain += $Obj } If ($AllowR5OnNLDrives) { $Obj=@{} $Obj["allowR5OnNLDrives"] = $AllowR5OnNLDrives $ObjMain += $Obj } If ($AllowR5OnFCDrives) { $Obj=@{} $Obj["allowR5OnFCDrives"] = $AllowR5OnFCDrives $ObjMain += $Obj } If ($ComplianceOfficerApproval) { $Obj=@{} $Obj["complianceOfficerApproval"] = $ComplianceOfficerApproval $ObjMain += $Obj } if($ObjMain.Count -gt 0) { $body["parameters"] = $ObjMain } $Result = $null #Request Write-DebugLog "Request: Request to Update-System_WSAPI (Invoke-WSAPI)." $Debug $Result = Invoke-WSAPI -uri '/system' -type 'PUT' -body $body -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS: Successfully Update storage system parameters." $Info # Results Get-System_WSAPI Write-DebugLog "End: Update-System_WSAPI" $Debug } else { write-host "" write-host "FAILURE : While Updating storage system parameters." -foreground red write-host "" Write-DebugLog "FAILURE : While Updating storage system parameters." $Info return $Result.StatusDescription } } End { } }#END Update-System_WSAPI ############################################################################################################################################ ## FUNCTION Get-Version_WSAPI ############################################################################################################################################ Function Get-Version_WSAPI { <# .SYNOPSIS Get version information. .DESCRIPTION Get version information. .EXAMPLE Get-Version_WSAPI Get version information. .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Get-Version_WSAPI LASTEDIT: February 2020 KEYWORDS: Get-Version_WSAPI .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { #Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $Result = $null $dataPS = $null $ip = $WsapiConnection.IPAddress $key = $WsapiConnection.Key $arrtyp = $global:ArrayType $APIurl = $Null if($arrtyp.ToLower() -eq "3par") { #$APIurl = "https://$($SANIPAddress):8080/api/v1" $APIurl = 'https://'+$ip+':8080/api' } Elseif(($arrtyp.ToLower() -eq "primera") -or ($arrtyp.ToLower() -eq "alletra9000")) { #$APIurl = "https://$($SANIPAddress):443/api/v1" $APIurl = 'https://'+$ip+':443/api' } else { return "Array type is Null." } #Construct header Write-DebugLog "Running: Constructing header." $Debug $headers = @{} $headers["Accept"] = "application/json" $headers["Accept-Language"] = "en" $headers["Content-Type"] = "application/json" $headers["X-HP3PAR-WSAPI-SessionKey"] = $key #Request if ($PSEdition -eq 'Core') { $Result = Invoke-WebRequest -Uri "$APIurl" -Headers $headers -Method GET -UseBasicParsing -SkipCertificateCheck } else { $Result = Invoke-WebRequest -Uri "$APIurl" -Headers $headers -Method GET -UseBasicParsing } if($Result.StatusCode -eq 200) { $dataPS = $Result.content | ConvertFrom-Json } if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS:successfully Executed" $Info return $dataPS } else { write-host "" write-host "FAILURE : While Executing Get-Version_WSAPI" -foreground red write-host "" Write-DebugLog "FAILURE : While Executing Get-Version_WSAPI" $Info return $Result.StatusDescription } } } #END Get-Version_WSAPI ############################################################################################################################################ ## FUNCTION Get-WSAPIConfigInfo ############################################################################################################################################ Function Get-WSAPIConfigInfo { <# .SYNOPSIS Get Getting WSAPI configuration information .DESCRIPTION Get Getting WSAPI configuration information .EXAMPLE Get-WSAPIConfigInfo Get Getting WSAPI configuration information .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Get-WSAPIConfigInfo LASTEDIT: February 2020 KEYWORDS: Get-WSAPIConfigInfo .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { #Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $Result = $null $dataPS = $null #Request $Result = Invoke-WSAPI -uri '/wsapiconfiguration' -type 'GET' -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { $dataPS = $Result.content | ConvertFrom-Json } if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS:successfully Executed" $Info return $dataPS } else { write-host "" write-host "FAILURE : While Executing Get-WSAPIConfigInfo" -foreground red write-host "" Write-DebugLog "FAILURE : While Executing Get-WSAPIConfigInfo" $Info return $Result.StatusDescription } } } #END Get-WSAPIConfigInfo ############################################################################################################################################ ## FUNCTION Get-Task_WSAPI ############################################################################################################################################ Function Get-Task_WSAPI { <# .SYNOPSIS Get the status of all or given tasks .DESCRIPTION Get the status of all or given tasks .EXAMPLE Get-Task_WSAPI Get the status of all tasks .EXAMPLE Get-Task_WSAPI -TaskID 101 Get the status of given tasks .PARAMETER TaskID Task ID .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Get-Task_WSAPI LASTEDIT: February 2020 KEYWORDS: Get-Task_WSAPI .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)] [System.String] $TaskID, [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { #Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $Result = $null $dataPS = $null #Build uri if($TaskID) { $uri = '/tasks/'+$TaskID #Request $Result = Invoke-WSAPI -uri $uri -type 'GET' -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { $dataPS = $Result.content | ConvertFrom-Json } } else { #Request $Result = Invoke-WSAPI -uri '/tasks' -type 'GET' -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { $dataPS = ($Result.content | ConvertFrom-Json).members } } if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS: Command Get-Task_WSAPI Successfully Executed" $Info return $dataPS } else { write-host "" write-host "FAILURE : While Executing Get-Task_WSAPI." -foreground red write-host "" Write-DebugLog "FAILURE : While Executing Get-Task_WSAPI." $Info return $Result.StatusDescription } } } #END Get-Task_WSAPI ############################################################################################################################################ ## FUNCTION Stop-OngoingTask_WSAPI ############################################################################################################################################ Function Stop-OngoingTask_WSAPI { <# .SYNOPSIS Cancels the ongoing task. .DESCRIPTION Cancels the ongoing task. .EXAMPLE Stop-OngoingTask_WSAPI -TaskID 1 .PARAMETER TaskID Task id. .PARAMETER WsapiConnection WSAPI Connection object created with Connection command .Notes NAME : Stop-OngoingTask_WSAPI LASTEDIT: February 2020 KEYWORDS: Stop-OngoingTask_WSAPI .Link http://www.hpe.com #Requires PS -Version 3.0 #> [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] [System.String] $TaskID, [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)] $WsapiConnection = $global:WsapiConnection ) Begin { # Test if connection exist Test-WSAPIConnection -WsapiConnection $WsapiConnection } Process { $body = @{} $body["action"] = 4 $Result = $null $uri = "/tasks/" + $TaskID #Request Write-DebugLog "Request: Request to Stop-OngoingTask_WSAPI : $TaskID (Invoke-WSAPI)." $Debug $Result = Invoke-WSAPI -uri $uri -type 'PUT' -body $body -WsapiConnection $WsapiConnection if($Result.StatusCode -eq 200) { write-host "" write-host "Cmdlet executed successfully" -foreground green write-host "" Write-DebugLog "SUCCESS: Successfully Cancels the ongoing task : $TaskID ." $Info # Results return $Result Write-DebugLog "End: Stop-OngoingTask_WSAPI." $Debug } else { write-host "" write-host "FAILURE : While Cancelling the ongoing task : $TaskID " -foreground red write-host "" Write-DebugLog "FAILURE : While Cancelling the ongoing task : $TaskID " $Info return $Result.StatusDescription } } End { } }#END Stop-OngoingTask_WSAPI Export-ModuleMember Get-System_WSAPI , Update-System_WSAPI , Get-Version_WSAPI , Get-WSAPIConfigInfo , Get-Task_WSAPI , Stop-OngoingTask_WSAPI # SIG # Begin signature block # MIIhzwYJKoZIhvcNAQcCoIIhwDCCIbwCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDfePcEucyrozVl # nfNopPu8gd29V9tADXq/dTuK4Ap7G6CCEKswggUpMIIEEaADAgECAhB4Lu4fcD9z # xUgD+jf1OoqlMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAkdCMRswGQYDVQQI # ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT # D1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2VjdGlnbyBSU0EgQ29kZSBTaWdu # aW5nIENBMB4XDTIxMDUyODAwMDAwMFoXDTIyMDUyODIzNTk1OVowgZAxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQHDAlQYWxvIEFsdG8x # KzApBgNVBAoMIkhld2xldHQgUGFja2FyZCBFbnRlcnByaXNlIENvbXBhbnkxKzAp # BgNVBAMMIkhld2xldHQgUGFja2FyZCBFbnRlcnByaXNlIENvbXBhbnkwggEiMA0G # CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDmclZSXJBXA55ijwwFymuq+Y4F/quF # mm2vRdEmjFhzRvTpnGjIYtVcG11ka4JGCROmNVDZGAelnqcXn5DKO710j5SICTBC # 5gXOLwga7usifs21W+lVT0BsZTiUnFu4hEhuFTlahJIEvPGVgO1GBcuItD2QqB4q # 9j15GDI5nGBSzIyJKMctcIalxsTSPG1kiDbLkdfsIivhe9u9m8q6NRqDUaYYQTN+ # /qGCqVNannMapH8tNHqFb6VdzUFI04t7kFtSk00AkdD6qUvA4u8mL2bUXAYz8K5m # nrFs+ckx5Yqdxfx68EO26Bt2qbz/oTHxE6FiVzsDl90bcUAah2l976ebAgMBAAGj # ggGQMIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4E # FgQUlC56g+JaYFsl5QWK2WDVOsG+pCEwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB # /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoG # A1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8v # c2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBz # BggrBgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5j # b20vU2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRw # Oi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAY+1n2UUlQU6Z # VoEVaZKqZf/zrM/d7Kbx+S/t8mR2E+uNXStAnwztElqrm3fSr+5LMRzBhrYiSmea # w9c/0c7qFO9mt8RR2q2uj0Huf+oAMh7TMuMKZU/XbT6tS1e15B8ZhtqOAhmCug6s # DuNvoxbMpokYevpa24pYn18ELGXOUKlqNUY2qOs61GVvhG2+V8Hl/pajE7yQ4diz # iP7QjMySms6BtZV5qmjIFEWKY+UTktUcvN4NVA2J0TV9uunDbHRt4xdY8TF/Clgz # Z/MQHJ/X5yX6kupgDeN2t3o+TrColetBnwk/SkJEsUit0JapAiFUx44j4w61Qanb # Zmi0tr8YGDCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcN # AQEMBQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3Rl # cjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQx # ITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAw # MDBaFw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3 # IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS # VFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0 # aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIAS # ZRc2DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3 # KBErR9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/ # owbxiBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41 # pqdmyHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpN # rkyKt1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5p # x2uMYJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVm # sSl8MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWI # zYS4sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/ # NVV0CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79 # dGMvsVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK6 # 1l9VLupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0j # BBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh # 2JvAnfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1Ud # IAQKMAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9k # b2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQo # MCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG # 9w0BAQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qof # nJYt7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrw # kZb+/UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx # 8VvwQQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdc # Ods/exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4Ux # FMToqWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBv # myYY0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMV # VGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENl # cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIz # NTk1OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl # cjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQw # IgYDVQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3 # DQEBAQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilA # hlRGdDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6 # DBmJqGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpy # vjg7Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52B # xHJAteJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G # 2flGHNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIB # YDAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6 # qFM6MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYB # Af8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgw # BgYEVR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5j # b20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYB # BQUHAQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20v # VVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9v # Y3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNve # aiqMm/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS # 9At3WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3 # ZLCmI2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1 # fqW4w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6f # ICUQDRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIe # Q3pFMcGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lk # uk/xYpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9 # V1DSyt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoK # C6W59J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLj # tXX4oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1q # V3AcPKRYLqPzW0sH3DJZ84enGm1YMYIQejCCEHYCAQEwgZAwfDELMAkGA1UEBhMC # R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y # ZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJT # QSBDb2RlIFNpZ25pbmcgQ0ECEHgu7h9wP3PFSAP6N/U6iqUwDQYJYIZIAWUDBAIB # BQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB # BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg # GR8EvwHQEMffw8UqKVQYG4YgKm0MaD+e/f/iZ1RmwwEwDQYJKoZIhvcNAQEBBQAE # ggEAn4gZrCmlltdk/uLNBrXxlI8XFqt/f7AwvJm29zBQb8RH0bR2SaNugrAjGBMQ # ZLfCy11Djyb82mcDH6VXPVXIF8NSHtKAAwe+pjmVn+fqGGUd58o+N8ZtmGJ6yo41 # CSEZQhC0yxj9nda/bWfMHGsAnlqEGasqjcZjgfXAxKYyuj7C6VsxYUnNwX+D83H0 # FX9TaFF86Lxdto5XftKlLAS1Yxa3EkadOB0NtAEqXJXrdMHYXgUAVOU/1VtRZiHF # GvpKk4QgF0q0S9y97iuNIZfcJWEFYk5Jyg+y0apaYOOLev/VuClUdKqT4Sjd7XPX # k/LXBPed9F37Fx6utDTUiRItnKGCDjwwgg44BgorBgEEAYI3AwMBMYIOKDCCDiQG # CSqGSIb3DQEHAqCCDhUwgg4RAgEDMQ0wCwYJYIZIAWUDBAIBMIIBDgYLKoZIhvcN # AQkQAQSggf4EgfswgfgCAQEGC2CGSAGG+EUBBxcDMDEwDQYJYIZIAWUDBAIBBQAE # IGpy1Dgh7j2faoPHetHFOYnPZpIf3sZgQ6Z7gD9istq2AhRovDWd629GRgGz09x5 # +OwIjlhEFxgPMjAyMTA2MTkwNTI1NTlaMAMCAR6ggYakgYMwgYAxCzAJBgNVBAYT # AlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3lt # YW50ZWMgVHJ1c3QgTmV0d29yazExMC8GA1UEAxMoU3ltYW50ZWMgU0hBMjU2IFRp # bWVTdGFtcGluZyBTaWduZXIgLSBHM6CCCoswggU4MIIEIKADAgECAhB7BbHUSWhR # RPfJidKcGZ0SMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYDVQQGEwJVUzEXMBUGA1UE # ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv # cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv # cml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290 # IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE2MDExMjAwMDAwMFoXDTMxMDEx # MTIzNTk1OVowdzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBv # cmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQD # Ex9TeW1hbnRlYyBTSEEyNTYgVGltZVN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0B # AQEFAAOCAQ8AMIIBCgKCAQEAu1mdWVVPnYxyXRqBoutV87ABrTxxrDKPBWuGmicA # MpdqTclkFEspu8LZKbku7GOz4c8/C1aQ+GIbfuumB+Lef15tQDjUkQbnQXx5HMvL # rRu/2JWR8/DubPitljkuf8EnuHg5xYSl7e2vh47Ojcdt6tKYtTofHjmdw/SaqPSE # 4cTRfHHGBim0P+SDDSbDewg+TfkKtzNJ/8o71PWym0vhiJka9cDpMxTW38eA25Hu # /rySV3J39M2ozP4J9ZM3vpWIasXc9LFL1M7oCZFftYR5NYp4rBkyjyPBMkEbWQ6p # PrHM+dYr77fY5NUdbRE6kvaTyZzjSO67Uw7UNpeGeMWhNwIDAQABo4IBdzCCAXMw # DgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwZgYDVR0gBF8wXTBb # BgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29t # L2NwczAlBggrBgEFBQcCAjAZGhdodHRwczovL2Quc3ltY2IuY29tL3JwYTAuBggr # BgEFBQcBAQQiMCAwHgYIKwYBBQUHMAGGEmh0dHA6Ly9zLnN5bWNkLmNvbTA2BgNV # HR8ELzAtMCugKaAnhiVodHRwOi8vcy5zeW1jYi5jb20vdW5pdmVyc2FsLXJvb3Qu # Y3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMIMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQD # ExBUaW1lU3RhbXAtMjA0OC0zMB0GA1UdDgQWBBSvY9bKo06FcuCnvEHzKaI4f4B1 # YjAfBgNVHSMEGDAWgBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsF # AAOCAQEAdeqwLdU0GVwyRf4O4dRPpnjBb9fq3dxP86HIgYj3p48V5kApreZd9KLZ # VmSEcTAq3R5hF2YgVgaYGY1dcfL4l7wJ/RyRR8ni6I0D+8yQL9YKbE4z7Na0k8hM # kGNIOUAhxN3WbomYPLWYl+ipBrcJyY9TV0GQL+EeTU7cyhB4bEJu8LbF+GFcUvVO # 9muN90p6vvPN/QPX2fYDqA/jU/cKdezGdS6qZoUEmbf4Blfhxg726K/a7JsYH6q5 # 4zoAv86KlMsB257HOLsPUqvR45QDYApNoP4nbRQy/D+XQOG/mYnb5DkUvdrk08Pq # K1qzlVhVBH3HmuwjA42FKtL/rqlhgTCCBUswggQzoAMCAQICEHvU5a+6zAc/oQEj # BCJBTRIwDQYJKoZIhvcNAQELBQAwdzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5 # bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3 # b3JrMSgwJgYDVQQDEx9TeW1hbnRlYyBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4X # DTE3MTIyMzAwMDAwMFoXDTI5MDMyMjIzNTk1OVowgYAxCzAJBgNVBAYTAlVTMR0w # GwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMg # VHJ1c3QgTmV0d29yazExMC8GA1UEAxMoU3ltYW50ZWMgU0hBMjU2IFRpbWVTdGFt # cGluZyBTaWduZXIgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB # AK8Oiqr43L9pe1QXcUcJvY08gfh0FXdnkJz93k4Cnkt29uU2PmXVJCBtMPndHYPp # PydKM05tForkjUCNIqq+pwsb0ge2PLUaJCj4G3JRPcgJiCYIOvn6QyN1R3AMs19b # jwgdckhXZU2vAjxA9/TdMjiTP+UspvNZI8uA3hNN+RDJqgoYbFVhV9HxAizEtavy # bCPSnw0PGWythWJp/U6FwYpSMatb2Ml0UuNXbCK/VX9vygarP0q3InZl7Ow28paV # gSYs/buYqgE4068lQJsJU/ApV4VYXuqFSEEhh+XetNMmsntAU1h5jlIxBk2UA0XE # zjwD7LcA8joixbRv5e+wipsCAwEAAaOCAccwggHDMAwGA1UdEwEB/wQCMAAwZgYD # VR0gBF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Qu # c3ltY2IuY29tL2NwczAlBggrBgEFBQcCAjAZGhdodHRwczovL2Quc3ltY2IuY29t # L3JwYTBABgNVHR8EOTA3MDWgM6Axhi9odHRwOi8vdHMtY3JsLndzLnN5bWFudGVj # LmNvbS9zaGEyNTYtdHNzLWNhLmNybDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO # BgNVHQ8BAf8EBAMCB4AwdwYIKwYBBQUHAQEEazBpMCoGCCsGAQUFBzABhh5odHRw # Oi8vdHMtb2NzcC53cy5zeW1hbnRlYy5jb20wOwYIKwYBBQUHMAKGL2h0dHA6Ly90 # cy1haWEud3Muc3ltYW50ZWMuY29tL3NoYTI1Ni10c3MtY2EuY2VyMCgGA1UdEQQh # MB+kHTAbMRkwFwYDVQQDExBUaW1lU3RhbXAtMjA0OC02MB0GA1UdDgQWBBSlEwGp # n4XMG24WHl87Map5NgB7HTAfBgNVHSMEGDAWgBSvY9bKo06FcuCnvEHzKaI4f4B1 # YjANBgkqhkiG9w0BAQsFAAOCAQEARp6v8LiiX6KZSM+oJ0shzbK5pnJwYy/jVSl7 # OUZO535lBliLvFeKkg0I2BC6NiT6Cnv7O9Niv0qUFeaC24pUbf8o/mfPcT/mMwnZ # olkQ9B5K/mXM3tRr41IpdQBKK6XMy5voqU33tBdZkkHDtz+G5vbAf0Q8RlwXWuOk # O9VpJtUhfeGAZ35irLdOLhWa5Zwjr1sR6nGpQfkNeTipoQ3PtLHaPpp6xyLFdM3f # RwmGxPyRJbIblumFCOjd6nRgbmClVnoNyERY3Ob5SBSe5b/eAL13sZgUchQk38cR # LB8AP8NLFMZnHMweBqOQX1xUiz7jM1uCD8W3hgJOcZ/pZkU/djGCAlowggJWAgEB # MIGLMHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlv # bjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29yazEoMCYGA1UEAxMfU3lt # YW50ZWMgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQe9Tlr7rMBz+hASMEIkFNEjAL # BglghkgBZQMEAgGggaQwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqG # SIb3DQEJBTEPFw0yMTA2MTkwNTI1NTlaMC8GCSqGSIb3DQEJBDEiBCBUqm9AYr9g # C2NfhZ2hACQIHRrRbrT8qSHue2MGSEwkIzA3BgsqhkiG9w0BCRACLzEoMCYwJDAi # BCDEdM52AH0COU4NpeTefBTGgPniggE8/vZT7123H99h+DALBgkqhkiG9w0BAQEE # ggEAKV+WxX1OtGE8JAMlyWv9g0cgzNjXrPc6hbwuUo9jRkSzQuSQ/63o0CGK3+Q8 # ur+ZR2q/v/lBw5jZFRM9OVqMdtlxzLYoW05OVOW3TLU9L2tUVJaR1bqqUom3RhaQ # WSU8VygbjSXuJQVaCSZgR51fJegJcy71YcFigK5cC5laQxJGt93D0RtByBYQ8wxU # SJ4vVSSMfcpMsUz/tybJPXeO02Xnyp1FF9S4cfIKMlkSSMHlztkj1kBaaHmmqxUw # FqSpzY4b4Sq01PPMbl/ogV967YZR1SYaYxJApjoosH4KMDoKi+QM/OFel44FP6Qe # A39vjWUm2FOrVLegWW9iD1+rqw== # SIG # End signature block |