DeprecatedApiTranslator/vSphereRestApiTranslation.Tests.ps1
BeforeAll { function Test-ObjectsAreEqual { [CmdletBinding()] [OutputType([bool])] param ( [Parameter(Mandatory = $true)] [AllowNull()] [object] $Actual, [Parameter(Mandatory = $true)] [AllowNull()] [object] $Expected, [Parameter(Mandatory = $false)] [type] $ExpectedType, [Parameter(Mandatory = $false)] [int] $Depth = 10 ) process { $result = $true if ($null -ne $ExpectedType -and $Actual -IsNot $ExpectedType) { Write-Verbose -Message "The actual object's type [$($Actual.GetType())] doesn't match the expected one [$ExpectedType]" $result = $false } elseif ($Expected.GetType().IsPrimitive -or $Expected -Is [string]) { Write-Verbose -Message "Primitive type [$($Expected.GetType())] found" $result = ($Actual -eq $Expected) } else { Write-Verbose -Message "Complex type [$($Expected.GetType())] found" $expectedProperties = $Expected | Get-Member -MemberType Properties foreach ($property in $expectedProperties) { Write-Verbose -Message "Asserting property $($property.Name)" $expectedValue = $Expected | Select-Object -ExpandProperty $property.Name $actualValue = $Actual | Select-Object -ExpandProperty $property.Name Write-Verbose -Message "Expected value = $expectedValue" Write-Verbose -Message "Actual value = $actualValue" if ($expectedValue -eq $actualValue) { Write-Verbose -Message "Values are equal" continue } elseif ($Depth -eq -1) { $result = $true } else { $areObjectsEqual = Test-ObjectsAreEqual -Expected $expectedValue -Actual $actualValue -Depth ($Depth - 1) if (!$areObjectsEqual) { $result = $false break } } } } return $result } } } Describe 'Test Output translation' { Context 'Output Object Translation' { It 'Translates GetVM Operation Output' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/vm/{vm}' -operationVerb 'get' $vmInfoJson = '{"value":{"instant_clone_frozen":false,"cdroms":[{"value":{"start_connected":false,"backing":{"device_access_type":"PASSTHRU","type":"CLIENT_DEVICE"},"allow_guest_control":true,"label":"CD/DVD drive 1","state":"NOT_CONNECTED","type":"SATA","sata":{"bus":0,"unit":0}},"key":"16000"}],"memory":{"size_MiB":4,"hot_add_enabled":false},"disks":[{"value":{"scsi":{"bus":0,"unit":0},"backing":{"vmdk_file":"[local-0] testvm/testvm.vmdk","type":"VMDK_FILE"},"label":"Hard disk 1","type":"SCSI","capacity":8589934592},"key":"2000"}],"parallel_ports":[],"sata_adapters":[{"value":{"bus":0,"label":"SATA controller 0","type":"AHCI"},"key":"15000"}],"cpu":{"hot_remove_enabled":false,"count":2,"hot_add_enabled":false,"cores_per_socket":2},"scsi_adapters":[{"value":{"scsi":{"bus":0,"unit":7},"label":"SCSI controller 0","sharing":"NONE","type":"LSILOGICSAS"},"key":"1000"}],"power_state":"POWERED_OFF","floppies":[],"identity":{"name":"testvm","instance_uuid":"501d5a5f-8e1b-770a-8e76-ba9eb8c77043","bios_uuid":"421d24e8-732f-693d-653e-0492a4dea3b2"},"name":"testvm","nics":[{"value":{"start_connected":true,"backing":{"network_name":"VM Network","type":"STANDARD_PORTGROUP","network":"network-19"},"mac_address":"00:50:56:9d:2a:b5","mac_type":"ASSIGNED","allow_guest_control":true,"wake_on_lan_enabled":true,"label":"Network adapter 1","state":"NOT_CONNECTED","type":"E1000E"},"key":"4000"}],"boot":{"delay":0,"efi_legacy_boot":false,"retry_delay":10000,"enter_setup_mode":false,"network_protocol":"IPV4","type":"EFI","retry":false},"serial_ports":[],"boot_devices":[],"guest_OS":"WINDOWS_SERVER_2019","hardware":{"upgrade_policy":"NEVER","upgrade_status":"NONE","version":"VMX_19"}}}' $vmInfoObject = $vmInfoJson | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"instant_clone_frozen":false,"cdroms":{"16000":{"start_connected":false,"backing":{"device_access_type":"PASSTHRU","type":"CLIENT_DEVICE"},"allow_guest_control":true,"label":"CD/DVD drive 1","state":"NOT_CONNECTED","type":"SATA","sata":{"bus":0,"unit":0}}},"memory":{"size_MiB":4,"hot_add_enabled":false},"disks":{"2000":{"scsi":{"bus":0,"unit":0},"backing":{"vmdk_file":"[local-0] testvm/testvm.vmdk","type":"VMDK_FILE"},"label":"Hard disk 1","type":"SCSI","capacity":8589934592}},"parallel_ports":{},"sata_adapters":{"15000":{"bus":0,"label":"SATA controller 0","type":"AHCI"}},"cpu":{"hot_remove_enabled":false,"count":2,"hot_add_enabled":false,"cores_per_socket":2},"scsi_adapters":{"1000":{"scsi":{"bus":0,"unit":7},"label":"SCSI controller 0","sharing":"NONE","type":"LSILOGICSAS"}},"power_state":"POWERED_OFF","floppies":{},"identity":{"name":"testvm","instance_uuid":"501d5a5f-8e1b-770a-8e76-ba9eb8c77043","bios_uuid":"421d24e8-732f-693d-653e-0492a4dea3b2"},"name":"testvm","nics":{"4000":{"start_connected":true,"backing":{"network_name":"VM Network","type":"STANDARD_PORTGROUP","network":"network-19"},"mac_address":"00:50:56:9d:2a:b5","mac_type":"ASSIGNED","allow_guest_control":true,"wake_on_lan_enabled":true,"label":"Network adapter 1","state":"NOT_CONNECTED","type":"E1000E"}},"boot":{"delay":0,"efi_legacy_boot":false,"retry_delay":10000,"enter_setup_mode":false,"network_protocol":"IPV4","type":"EFI","retry":false},"serial_ports":{},"boot_devices":[],"guest_OS":"WINDOWS_SERVER_2019","hardware":{"upgrade_policy":"NEVER","upgrade_status":"NONE","version":"VMX_19"}}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-OutputBody $operationTranslationSchema $vmInfoObject # Assert Test-ObjectsAreEqual $actual $expected | Should -BeTrue } It 'Translates Appliance ListServices Operation Output' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/services' -operationVerb 'get' $servicesJson = '{"value":[{"value":{"description":"/etc/rc.local.shutdown Compatibility","state":"STOPPED"},"key":"appliance-shutdown"},{"value":{"description":"The tftp server serves files using the trivial file transfer protocol.","state":"STOPPED"},"key":"atftpd"}]}' $servicesObject = $servicesJson | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"appliance-shutdown":{"description":"/etc/rc.local.shutdown Compatibility","state":"STOPPED"},"atftpd":{"description":"The tftp server serves files using the trivial file transfer protocol.","state":"STOPPED"}}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-OutputBody $operationTranslationSchema $servicesObject # Assert Test-ObjectsAreEqual $actual $expected | Should -BeTrue } It 'Should translate GetChainCertificateManagementTrustedRootChains Operation Output with one element correctly' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/certificate-management/vcenter/trusted-root-chains/{chain}' -operationVerb 'get' $certChainJson = '{"value":{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-----END CERTIFICATE-----"]}}}' $certChainObject = $certChainJson | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-----END CERTIFICATE-----"]}}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-OutputBody $operationTranslationSchema $certChainObject # Assert Test-ObjectsAreEqual $actual $expected | Should -BeTrue } It 'Should translate GetChainCertificateManagementTrustedRootChains Operation Output with more than one element correctly' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/certificate-management/vcenter/trusted-root-chains/{chain}' -operationVerb 'get' $certChainJson = '{"value":{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-1-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----trusted-root-chains-2-----END CERTIFICATE-----"]}}}' $certChainObject = $certChainJson | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-1-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----trusted-root-chains-2-----END CERTIFICATE-----"]}}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-OutputBody $operationTranslationSchema $certChainObject # Assert Test-ObjectsAreEqual $actual $expected | Should -BeTrue } } } Describe 'Test Input Body Translation' { Context 'FindLibrarySpec Input Object Translation' { It 'Translates Input Object' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item?action=find' -operationVerb 'post' $inputSpec = '{"name":"lib-1"}' $inputSpecObject = $inputSpec | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"spec":{"name":"lib-1"}}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Body # Assert Test-ObjectsAreEqual $actual $expected | Should -BeTrue } It 'Translates Body Input Object with client_token moved to header' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item/download-session' -operationVerb 'post' $libraryItemId = '105dc95e-dd76-4398-91d2-cd0a7183bff3' $libraryItemIdOldBodyInput = [PSCustomObject] @{ 'create_spec' = @{ 'library_item_id' = $libraryItemId } } $libraryItemIdNewBodyInput = [PSCustomObject] @{ 'library_item_id' = $libraryItemId } # Act $actual = Convert-InputStructure $operationTranslationSchema $libraryItemIdNewBodyInput -InputType Body # Assert $actual | Should -Not -BeNullOrEmpty $actual.create_spec.library_item_id | Should -Be $libraryItemIdOldBodyInput.create_spec.library_item_id } } Context 'TagCategory Input Object Translation' { It "Should translate array with one item to an array of one item" { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/cis/tagging/category' -operationVerb 'post' $categoryCreateSpec = [PSCustomObject] @{ "associable_types" = @("VirtualMachine") "cardinality" = "MULTIPLE" "description" = "TestDescription" "name" = "TestCategory" } # Act $actual = Convert-InputStructure $operationTranslationSchema $categoryCreateSpec -InputType Body # Assert $actual | Should -Not -Be $null $actual.create_spec.associable_types -is [array] | Should -Be $true $actual.create_spec.associable_types.Count | Should -Be 1 $actual.create_spec.associable_types[0] | Should -Be $categoryCreateSpec.associable_types[0] $actual.create_spec.cardinality | Should -Be $categoryCreateSpec.cardinality $actual.create_spec.description | Should -Be $categoryCreateSpec.description $actual.create_spec.name | Should -Be $categoryCreateSpec.name } } } Describe 'Test Input Query Translation' { Context 'DatastoreFilterSpec Query Input Translation' { It 'Translates Query Input Object' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/datastore' -operationVerb 'get' $inputSpec = '{"names":["datastore-0"],"datastores":["ds-2"]}' $inputSpecObject = $inputSpec | ConvertFrom-JsonX -Depth 100 $expectedJson = '{"filter.names":["datastore-0"],"filter.datastores":["ds-2"]}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query # Assert $actual."filter.names".Count | Should -Be 1 $actual."filter.names" | Should -Be $expected."filter.names" $actual."filter.datastores" | Should -Be $expected."filter.datastores" $actual."filter.types" | Should -Be $null } It 'Should not translate Appliance Pending Query Params' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/update/pending' -operationVerb 'get' $expectedJson = '{"source_type":"test","url":"localhost"}' $expected = $expectedJson | ConvertFrom-JsonX -Depth 100 # Act $actual = Convert-InputStructure $operationTranslationSchema $expected -InputType Query # Assert $actual.source_type | Should -Be $expected.source_type $actual.url | Should -Be $expected.url } } } Describe 'Test Input Body to Query Translation' { Context 'RecoveryBackupLocationSpec Body to Query Input Translation' { It 'Translates Body to Query Input Object' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/recovery/backup/system-name?action=list' -operationVerb 'post' $inputSpec = '{"location":"https"}' $inputSpecObject = $inputSpec | ConvertFrom-JsonX # Act $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query # Assert $actual | Should -Not -Be $null $actual."loc_spec.location" | Should -Be 'https' } } Context 'RecoveryBackupLocationSpec and RecoveryBackupFilterSpec Body to Query Input Translation' { It 'Translates Body to Query Input Object' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/recovery/backup/system-name/{system_name}/archives?action=list' -operationVerb 'post' $inputSpec = '{"loc_spec":{"location":"https"},"filter_spec":{"max_results":10}}' $inputSpecObject = $inputSpec | ConvertFrom-JsonX # Act $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query # Assert $actual | Should -Not -Be $null $actual."loc_spec.location" | Should -Be 'https' $actual."filter_spec.max_results" | Should -Be 10 } } } Describe 'Test Input Query to Body Translation' { It 'Translates Query to Body Input simple type' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item/download-session/{download_session_id}/file?file_name' -operationVerb 'get' $fileName = 'my_custom_file_name.json' $fileNameBodyInput = [PSCustomObject] @{ 'file_name' = $fileName } $fileNameQueryInput = $fileName # Act $actual = Convert-InputStructure $operationTranslationSchema $fileNameQueryInput -InputType Body # Assert $actual | Should -Not -BeNullOrEmpty $actual.file_name | Should -Be $fileNameBodyInput.file_name } It 'Translates Query to Body Input array type' { # Arrange . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1') $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/inventory/network' -operationVerb 'get' $networks = @('network 1', 'network 2') $networksBodyInput = [PSCustomObject] @{ 'networks' = $networks } $networksQueryInput = $networks # Act $actual = Convert-InputStructure $operationTranslationSchema $networksQueryInput -InputType Body # Assert $actual | Should -Not -BeNullOrEmpty $actual.networks.Count | Should -Be $networksBodyInput.networks.Count $actual.networks | Should -Be $networksBodyInput.networks } } # SIG # Begin signature block # MIIrIAYJKoZIhvcNAQcCoIIrETCCKw0CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAUa+fwg0FUUgog # eO8Gcgn7HquDbijN7STwXHF0wfUl7KCCDdowggawMIIEmKADAgECAhAIrUCyYNKc # TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z # NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 # JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr # Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF # LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F # LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh # 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ # wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay # g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI # YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp # QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro # OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB # WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ # YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P # AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC # hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED # MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql # +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF # UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h # mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw # YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld # AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw # 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP # LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE # QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn # KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji # WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq # yK+p/pQd52MbOoZWeE4wggciMIIFCqADAgECAhAOxvKydqFGoH0ObZNXteEIMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjEwODEwMDAwMDAwWhcNMjMwODEw # MjM1OTU5WjCBhzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQ # BgNVBAcTCVBhbG8gQWx0bzEVMBMGA1UEChMMVk13YXJlLCBJbmMuMRUwEwYDVQQD # EwxWTXdhcmUsIEluYy4xITAfBgkqhkiG9w0BCQEWEm5vcmVwbHlAdm13YXJlLmNv # bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMD6lJG8OWkM12huIQpO # /q9JnhhhW5UyW9if3/UnoFY3oqmp0JYX/ZrXogUHYXmbt2gk01zz2P5Z89mM4gqR # bGYC2tx+Lez4GxVkyslVPI3PXYcYSaRp39JsF3yYifnp9R+ON8O3Gf5/4EaFmbeT # ElDCFBfExPMqtSvPZDqekodzX+4SK1PIZxCyR3gml8R3/wzhb6Li0mG7l0evQUD0 # FQAbKJMlBk863apeX4ALFZtrnCpnMlOjRb85LsjV5Ku4OhxQi1jlf8wR+za9C3DU # ki60/yiWPu+XXwEUqGInIihECBbp7hfFWrnCCaOgahsVpgz8kKg/XN4OFq7rbh4q # 5IkTauqFhHaE7HKM5bbIBkZ+YJs2SYvu7aHjw4Z8aRjaIbXhI1G+NtaNY7kSRrE4 # fAyC2X2zV5i4a0AuAMM40C1Wm3gTaNtRTHnka/pbynUlFjP+KqAZhOniJg4AUfjX # sG+PG1LH2+w/sfDl1A8liXSZU1qJtUs3wBQFoSGEaGBeDQIDAQABo4ICJTCCAiEw # HwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFIhC+HL9 # QlvsWsztP/I5wYwdfCFNMB0GA1UdEQQWMBSBEm5vcmVwbHlAdm13YXJlLmNvbTAO # BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCB # qjBToFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl # ZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu # aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQB # MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYI # KwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 # LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5j # cnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEACQAYaQI6Nt2KgxdN # 6qqfcHB33EZRSXkvs8O9iPZkdDjEx+2fgbBPLUvk9A7T8mRw7brbcJv4PLTYJDFo # c5mlcmG7/5zwTOuIs2nBGXc/uxCnyW8p7kD4Y0JxPKEVQoIQ8lJS9Uy/hBjyakeV # ef982JyzvDbOlLBy6AS3ZpXVkRY5y3Va+3v0R/0xJ+JRxUicQhiZRidq2TCiWEas # d+tLL6jrKaBO+rmP52IM4eS9d4Yids7ogKEBAlJi0NbvuKO0CkgOlFjp1tOvD4sQ # taHIMmqi40p4Tjyf/sY6yGjROXbMeeF1vlwbBAASPWpQuEIxrNHoVN30YfJyuOWj # zdiJUTpeLn9XdjM3UlhfaHP+oIAKcmkd33c40SFRlQG9+P9Wlm7TcPxGU4wzXI8n # Cw/h235jFlAAiWq9L2r7Un7YduqsheJVpGoXmRXJH0T2G2eNFS5/+2sLn98kN2Cn # J7j6C242onjkZuGL2/+gqx8m5Jbpu9P4IAeTC1He/mX9j6XpIu+7uBoRVwuWD1i0 # N5SiUz7Lfnbr6Q1tHMXKDLFdwVKZos2AKEZhv4SU0WvenMJKDgkkhVeHPHbTahQf # P1MetR8tdRs7uyTWAjPK5xf5DLEkXbMrUkpJ089fPvAGVHBcHRMqFA5egexOb6sj # tKncUjJ1xAAtAExGdCh6VD2U5iYxghycMIIcmAIBATB9MGkxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1 # c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEA7G # 8rJ2oUagfQ5tk1e14QgwDQYJYIZIAWUDBAIBBQCggZYwGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwKgYKKwYB # BAGCNwIBDDEcMBqhGIAWaHR0cDovL3d3dy52bXdhcmUuY29tLzAvBgkqhkiG9w0B # CQQxIgQgfTBHlBsxRV/ly8qB4fKpgXCxtd3619Cj9HfMYu3B+5wwDQYJKoZIhvcN # AQEBBQAEggGAOk6c7udaFV+8YomZLiqLYdTobJ6r9RXurWab11Y+y8Y7ugCxpXsu # cI6yBmHKxL6IwMFWq1RJlgZiL6R662k3EUz51lW8x3+WSVJ7QikCqcel/oFTYUkO # 09axRP+0922X9AKleTbDChQNyn+lUw596y0/4AwN+xpCSLER9FVrGeSFfk9sSTw7 # RGf6lmbwrwRJ2fTfL5S3MnPkxfY1WwgbbVxG+KnYt+EcCpYZ8Q+V5+FHZ3PhEVPt # MGF/goFbPFDAeOP26VUBeCtXKvbhcX/pqQSAcXbe2C3HaZYVISVUAHmbTh7bvzyz # iIxoDTE8YBAc8MDqM2NAEIedn98ac9ULKjFw4BCgsdDilnYawUURh8CVg0ykSlqw # 432YLubWcYNiC00grWwuG4OGn57REkQjAGncRE6qYq9wKic1ebOHPSEvkBTXJuZF # hjSZsVlnBX57GmKLBTI78y3tcqBbcIg52D4bbR4HUT0Hik0OTfHKDvvHyhYdj9bM # AQvimPm3N4V6oYIZ1zCCGdMGCisGAQQBgjcDAwExghnDMIIZvwYJKoZIhvcNAQcC # oIIZsDCCGawCAQMxDzANBglghkgBZQMEAgEFADCB3AYLKoZIhvcNAQkQAQSggcwE # gckwgcYCAQEGCSsGAQQBoDICAzAxMA0GCWCGSAFlAwQCAQUABCDpj0NuS/IU2cAM # lOOjvE9pub7TOenYJ2tEsfP9Y3kEqAIUQPfRNdWsNCczC7XAwVSGngELlcUYDzIw # MjEwOTE1MTIyNjAzWjADAgEBoFekVTBTMQswCQYDVQQGEwJCRTEZMBcGA1UECgwQ # R2xvYmFsU2lnbiBudi1zYTEpMCcGA1UEAwwgR2xvYmFsc2lnbiBUU0EgZm9yIEFk # dmFuY2VkIC0gRzSgghVkMIIGVTCCBD2gAwIBAgIQAQBGaVCmBKnZcOgd0k1BnzAN # BgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2ln # biBudi1zYTExMC8GA1UEAxMoR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBT # SEEzODQgLSBHNDAeFw0yMTA1MjcwOTU1MjNaFw0zMjA2MjgwOTU1MjJaMFMxCzAJ # BgNVBAYTAkJFMRkwFwYDVQQKDBBHbG9iYWxTaWduIG52LXNhMSkwJwYDVQQDDCBH # bG9iYWxzaWduIFRTQSBmb3IgQWR2YW5jZWQgLSBHNDCCAaIwDQYJKoZIhvcNAQEB # BQADggGPADCCAYoCggGBAN8waZh7lw1uo1S0OV9kWXUEIv5OaW/oF3R0pX1RGA5G # IB9oLrrlZdbJ0pGh7KT3Veqq7TvM+2KbhEKSejJM+fTyHPiY0bkxgSWtrVZnMqb+ # hzLzXMMtYvFNiQw3tH/rKuNgi29sPTHy7cldgJspnVXg4sT/6naTGB5sqat7yR4S # YdXA56Dm+JApMyy4v25ast3HB0PRO9swC7R4w+zq8aJUz2CTOMz3ZEP1zwgEFnDI # tNsO1AqKCNy7k8EdbvKMnOshNZ7/j7ywfsKEOH7mnWR6JqDxILG84dgqJZ0YUuRt # 1EwwCnjMLUaO7VcLP3mVUKcDsDODMrdAnvS0kpcTDFC3nqq0QU4LmInM+8QhRJAy # jkjyLEsMF+SEV1umrPuXg/mNZFTC7GpDHs8KdpKyEL/t1qMgD7XRMI4aQLE259CO # ePMTwC8LiJA7CGHjD61Hsw5UcJV/oEPUWsbdF5+UywCHaA7hrpPuLHIEGzIXkEvX # K4AlBR/lM/TowGgqeReg7wIDAQABo4IBmzCCAZcwDgYDVR0PAQH/BAQDAgeAMBYG # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMB0GA1UdDgQWBBSufnCBeCAUKa3yePhZANnM # piQCjjBMBgNVHSAERTBDMEEGCSsGAQQBoDIBHjA0MDIGCCsGAQUFBwIBFiZodHRw # czovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAJBgNVHRMEAjAAMIGQ # BggrBgEFBQcBAQSBgzCBgDA5BggrBgEFBQcwAYYtaHR0cDovL29jc3AuZ2xvYmFs # c2lnbi5jb20vY2EvZ3N0c2FjYXNoYTM4NGc0MEMGCCsGAQUFBzAChjdodHRwOi8v # c2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc3RzYWNhc2hhMzg0ZzQuY3J0 # MB8GA1UdIwQYMBaAFOoWxmnn48tXRTkzpPBAvtDDvWWWMEEGA1UdHwQ6MDgwNqA0 # oDKGMGh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vY2EvZ3N0c2FjYXNoYTM4NGc0 # LmNybDANBgkqhkiG9w0BAQsFAAOCAgEAf2Lo+tl3L0Jvaw/X3UVZPPR1egDsvfZv # DiNtLTNCchRPRJSBveuMAohMrH/HXc23xCSau5kBaApa6kVh07As132gF+5dgPEa # 4uf8sd8dMgQoDzaE1wlGLbZ+wEAVIhp5YWeXthKP0E9mLC5UKlgGrJlO/XWtVCYK # aP+SJ/g8uRltMIEmTIUs83Pcj+DlymRKe0cRTNqi1Lfx5FF65jmwIQcZ4PCMuXFw # fZHtNJ+LMZ4NxMY+Nitm1sBB1bIjSSLTvl+JNoxa1sVQqj8OTlQJtv4Nkdlx2J82 # PDSOiYO35PNmSs43kItdeuo+o+MHBz2UGRSe+rFnS+u2srcIb5KWRV1M7g5ZWotm # c2FFNkqGzmNDGW4GOglGOZB0xnMLXkLRzS8ibCQnpwICUZKNAbRdhcf4w0F13WSM # 8vOY7um3hwmnvQoTMDdiH1nnKXJ3aXV4kLDNHDpcahCGcvcAsjKXWXieTvizZv2v # K/yJtnWilAo3khNBdd31Pzqup6i0QtPZnFES8vJ61ivsnkwl2W2ckfQfAU9Ix+yP # +Vuq7PpcEXJgruw3cZS+XEmJTClt81c7GgBXvL6QLkJhgtXf/wCBlnwBVZO4YmTo # BoarVUpvM8Xz2lgFjd0B9TxVIYX+ezV5xX+y+9itvZ35VQokZHRhiiuXNl9WvfLX # 4Ox8/fnrktQwggZZMIIEQaADAgECAg0B7BySQN79LkBdfEd0MA0GCSqGSIb3DQEB # DAUAMEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFI2MRMwEQYDVQQK # EwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTE4MDYyMDAwMDAw # MFoXDTM0MTIxMDAwMDAwMFowWzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2Jh # bFNpZ24gbnYtc2ExMTAvBgNVBAMTKEdsb2JhbFNpZ24gVGltZXN0YW1waW5nIENB # IC0gU0hBMzg0IC0gRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDw # AuIwI/rgG+GadLOvdYNfqUdSx2E6Y3w5I3ltdPwx5HQSGZb6zidiW64HiifuV6PE # Ne2zNMeswwzrgGZt0ShKwSy7uXDycq6M95laXXauv0SofEEkjo+6xU//NkGrpy39 # eE5DiP6TGRfZ7jHPvIo7bmrEiPDul/bc8xigS5kcDoenJuGIyaDlmeKe9JxMP11b # 7Lbv0mXPRQtUPbFUUweLmW64VJmKqDGSO/J6ffwOWN+BauGwbB5lgirUIceU/kKW # O/ELsX9/RpgOhz16ZevRVqkuvftYPbWF+lOZTVt07XJLog2CNxkM0KvqWsHvD9WZ # uT/0TzXxnA/TNxNS2SU07Zbv+GfqCL6PSXr/kLHU9ykV1/kNXdaHQx50xHAotIB7 # vSqbu4ThDqxvDbm19m1W/oodCT4kDmcmx/yyDaCUsLKUzHvmZ/6mWLLU2EESwVX9 # bpHFu7FMCEue1EIGbxsY1TbqZK7O/fUF5uJm0A4FIayxEQYjGeT7BTRE6giunUln # EYuC5a1ahqdm/TMDAd6ZJflxbumcXQJMYDzPAo8B/XLukvGnEt5CEk3sqSbldwKs # DlcMCdFhniaI/MiyTdtk8EWfusE/VKPYdgKVbGqNyiJc9gwE4yn6S7Ac0zd0hNkd # Zqs0c48efXxeltY9GbCX6oxQkW2vV4Z+EDcdaxoU3wIDAQABo4IBKTCCASUwDgYD # VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOoWxmnn # 48tXRTkzpPBAvtDDvWWWMB8GA1UdIwQYMBaAFK5sBaOTE+Ki5+LXHNbH8H/IZ1Og # MD4GCCsGAQUFBwEBBDIwMDAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2Jh # bHNpZ24uY29tL3Jvb3RyNjA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLmds # b2JhbHNpZ24uY29tL3Jvb3QtcjYuY3JsMEcGA1UdIARAMD4wPAYEVR0gADA0MDIG # CCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5 # LzANBgkqhkiG9w0BAQwFAAOCAgEAf+KI2VdnK0JfgacJC7rEuygYVtZMv9sbB3DG # +wsJrQA6YDMfOcYWaxlASSUIHuSb99akDY8elvKGohfeQb9P4byrze7AI4zGhf5L # FST5GETsH8KkrNCyz+zCVmUdvX/23oLIt59h07VGSJiXAmd6FpVK22LG0LMCzDRI # RVXd7OlKn14U7XIQcXZw0g+W8+o3V5SRGK/cjZk4GVjCqaF+om4VJuq0+X8q5+dI # ZGkv0pqhcvb3JEt0Wn1yhjWzAlcfi5z8u6xM3vreU0yD/RKxtklVT3WdrG9KyC5q # ucqIwxIwTrIIc59eodaZzul9S5YszBZrGM3kWTeGCSziRdayzW6CdaXajR63Wy+I # Lj198fKRMAWcznt8oMWsr1EG8BHHHTDFUVZg6HyVPSLj1QokUyeXgPpIiScseeI8 # 5Zse46qEgok+wEr1If5iEO0dMPz2zOpIJ3yLdUJ/a8vzpWuVHwRYNAqJ7YJQ5NF7 # qMnmvkiqK1XZjbclIA4bUaDUY6qD6mxyYUrJ+kPExlfFnbY8sIuwuRwx773vFNgU # QGwgHcIt6AvGjW2MtnHtUiH+PvafnzkarqzSL3ogsfSsqh3iLRSd+pZqHcY8yvPZ # HL9TTaRHWXyVxENB+SXiLBB+gfkNlKd98rUJ9dhgckBQlSDUQ0S++qCV5yBZtnjG # pGqqIpswggVHMIIEL6ADAgECAg0B8kBCQM79ItvpbHH8MA0GCSqGSIb3DQEBDAUA # MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpH # bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTE5MDIyMDAwMDAwMFoX # DTI5MDMxODEwMDAwMFowTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0g # UjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCVB+hzymb57BTKezz3DQjxtEUL # LIK0SMbrWzyug7hBkjMUpG9/6SrMxrCIa8W2idHGsv8UzlEUIexK3RtaxtaH7k06 # FQbtZGYLkoDKRN5zlE7zp4l/T3hjCMgSUG1CZi9NuXkoTVIaihqAtxmBDn7Eirxk # TCEcQ2jXPTyKxbJm1ZCatzEGxb7ibTIGph75ueuqo7i/voJjUNDwGInf5A959eqi # HyrScC5757yTu21T4kh8jBAHOP9msndhfuDqjDyqtKT285VKEgdt/Yyyic/QoGF3 # yFh0sNQjOvddOsqi250J3l1ELZDxgc1Xkvp+vFAEYzTfa5MYvms2sjnkrCQ2t/Dv # thwTV5O23rL44oW3c6K4NapF8uCdNqFvVIrxclZuLojFUUJEFZTuo8U4lptOTloL # R/MGNkl3MLxxN+Wm7CEIdfzmYRY/d9XZkZeECmzUAk10wBTt/Tn7g/JeFKEEsAvp # /u6P4W4LsgizYWYJarEGOmWWWcDwNf3J2iiNGhGHcIEKqJp1HZ46hgUAntuA1iX5 # 3AWeJ1lMdjlb6vmlodiDD9H/3zAR+YXPM0j1ym1kFCx6WE/TSwhJxZVkGmMOeT31 # s4zKWK2cQkV5bg6HGVxUsWW2v4yb3BPpDW+4LtxnbsmLEbWEFIoAGXCDeZGXkdQa # J783HjIH2BRjPChMrwIDAQABo4IBJjCCASIwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud # EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK5sBaOTE+Ki5+LXHNbH8H/IZ1OgMB8GA1Ud # IwQYMBaAFI/wS3+oLkUkrk1Q+mOai97i3Ru8MD4GCCsGAQUFBwEBBDIwMDAuBggr # BgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3Jvb3RyMzA2BgNV # HR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL3Jvb3QtcjMu # Y3JsMEcGA1UdIARAMD4wPAYEVR0gADA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3 # dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQwFAAOCAQEA # SaxexYPzWsthKk2XShUpn+QUkKoJ+cR6nzUYigozFW1yhyJOQT9tCp4YrtviX/yV # 0SyYFDuOwfA2WXnzjYHPdPYYpOThaM/vf2VZQunKVTm808Um7nE4+tchAw+3Ttlb # YGpDtH0J0GBh3artAF5OMh7gsmyePLLCu5jTkHZqaa0a3KiJ2lhP0sKLMkrOVPs4 # 6TsHC3UKEdsLfCUn8awmzxFT5tzG4mE1MvTO3YPjGTrrwmijcgDIJDxOuFM8sRer # 5jUs+dNCKeZfYAOsQmGmsVdqM0LfNTGGyj43K9rE2iT1ThLytrm3R+q7IK1hFreg # M+Mtiae8szwBfyMagAk06TCCA18wggJHoAMCAQICCwQAAAAAASFYUwiiMA0GCSqG # SIb3DQEBCwUAMEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMw # EQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTA5MDMx # ODEwMDAwMFoXDTI5MDMxODEwMDAwMFowTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBS # b290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh # bFNpZ24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMJXaQeQZ4Ihb1 # wIO2hMoonv0FdhHFrYhy/EYCQ8eyip0EXyTLLkvhYIJG4VKrDIFHcGzdZNHr9Syj # D4I9DCuul9e2FIYQebs7E4B3jAjhSdJqYi8fXvqWaN+JJ5U4nwbXPsnLJlkNc96w # yOkmDoMVxu9bi9IEYMpJpij2aTv2y8gokeWdimFXN6x0FNx04Druci8unPvQu7/1 # PQDhBjPogiuuU6Y6FnOM3UEOIDrAtKeh6bJPkC4yYOlXy7kEkmho5TgmYHWyn3f/ # kRTvriBJ/K1AFUjRAjFhGV64l++td7dkmnq/X8ET75ti+w1s4FRpFqkD2m7pg5Nx # dsZphYIXAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ # MB0GA1UdDgQWBBSP8Et/qC5FJK5NUPpjmove4t0bvDANBgkqhkiG9w0BAQsFAAOC # AQEAS0DbwFCq/sgM7/eWVEVJu5YACUGssxOGhigHM8pr5nS5ugAtrqQK0/Xx8Q+K # v3NnSoPHRHt44K9ubG8DKY4zOUXDjuS5V2yq/BKW7FPGLeQkbLmUY/vcU2hnVj6D # uM81IcPJaP7O2sJTqsyQiunwXUaMld16WCgaLx3ezQA3QY/tRG3XUyiXfvNnBB4V # 14qWtNPeTCekTBtzc3b0F5nCH3oO4y0IrQocLP88q1UOD5F+NuvDV0m+4S4tfGCL # w0FREyOdzvcya5QBqJnnLDMfOjsl0oZAzjsshnjJYS8Uuu7bVW/fhO4FCU29KNhy # ztNiUGUe65KXgzHZs7XKR1g/XzGCA00wggNJAgEBMG8wWzELMAkGA1UEBhMCQkUx # GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExMTAvBgNVBAMTKEdsb2JhbFNpZ24g # VGltZXN0YW1waW5nIENBIC0gU0hBMzg0IC0gRzQCEAEARmlQpgSp2XDoHdJNQZ8w # DQYJYIZIAWUDBAIBBQCgggEvMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAt # BgkqhkiG9w0BCTQxIDAeMA0GCWCGSAFlAwQCAQUAoQ0GCSqGSIb3DQEBCwUAMC8G # CSqGSIb3DQEJBDEiBCDxFyCgYo38FrMKEYCtEEnV3Nt23CymtgZj2M1k/Evx6TCB # sAYLKoZIhvcNAQkQAi8xgaAwgZ0wgZowgZcEIBPW6cQg/21OJ1RyjGjneIJlZGfb # mhkPgWWX9n+2zMb5MHMwX6RdMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i # YWxTaWduIG52LXNhMTEwLwYDVQQDEyhHbG9iYWxTaWduIFRpbWVzdGFtcGluZyBD # QSAtIFNIQTM4NCAtIEc0AhABAEZpUKYEqdlw6B3STUGfMA0GCSqGSIb3DQEBCwUA # BIIBgAK37tv04j1HaJxD5nPCNZeQYbpCMUdO+b+0RhzxgIdN1AQrD1E0Ssd8tMhi # 3IOryJeSXoTyrRELzGFOuRSx0LEm8e+p4ipxPA1mS129dJ1KnzPwadRl7X6Ljj4V # OUhUljKR8FWKRmkdQ1UDUigOz783TA5S4C/UQrpgUmZXGxmwCS2FfTXvTr5ZPyOs # JCw4KJL0ZaxpwlalqGD2KL5CDZU9oSS1f79iGhiKw0qxFGIuUnGqV+HZSp4S+JYw # K8eVVsTkf4CNuGyQoFSk8SrY1nKj6P7seeyyp9KuR0q56nYh8LEt5jfqUWFow2gr # vN7TJBDClvs7afqatnkcj4UnG4g14qEX1KL1Azq9IsJ6EHU6UpVQjC4IlwIv0aWE # CYoyU2My3dnGe1+UY25ooDyyx9Ng9rnrrSjh8AkHG3JFphJPgOXjfeTx/x3KgDZL # 2JBiLzLseWlOA/lWffkGjoblpG1w0Lz2czqH08Onb3d/e+aQZMZOWn5Y4ZDA2WA/ # dsHegA== # SIG # End signature block |