AppVentiX.psm1
|
<#
.SYNOPSIS This PowerShell module, named AppVentiX, provides functions for managing AppVentiX application deployment. .NOTES Module : AppVentiX Author : John Billekens Copyright: (c) John Billekens Consultancy & AppVentiX #> #Unblock files Get-ChildItem -Path $PSScriptRoot | Unblock-File # Get public and private function definition files. $Public = @( Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction Ignore ) $Private = @( Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction Ignore ) # Dot source the files foreach ($import in @($Public + $Private)) { try { . $import.fullname } catch { Write-Error -Message "Failed to import function $($import.fullname): $_" } } # Set alias for Export-AppVentiXPublishingTaskReport New-Alias -Name Export-AppVentiXPublishing -Value Export-AppVentiXPublishingTaskReport -Force # Set alias for Export-AppVentiXSeamlessApplicationsReport New-Alias -Name Export-AppVentiXSeamlessApplications -Value Export-AppVentiXSeamlessApplicationsReport -Force $ModuleName = $($MyInvocation.MyCommand.Name) -replace '\.psm1$', '' $AppDataPath = [System.IO.Path]::Combine($env:APPDATA, $ModuleName) $Script:AppVentiXConfigFilePath = [System.IO.Path]::Combine($AppDataPath, "$ModuleName.json") $Script:AppVentiXModuleConfig = $null $Script:AppVentiXSQLManagementConnection = $null Update-AppVentiXConfigSettings #Set module specific variables # Layout-independent variables. The layout-dependent file path keys (PublishingTasksFilename, # MachineGroupsFilename, LicenseFilename, etc.) are populated from the layout map below and are # refreshed whenever the Configuration Store changes (see Set-AppVentiXLayout). $AppVentiX = [ordered]@{ CentralViewSettingsFilename = "${Env:PROGRAMDATA}\AppVentiX-CentralView\Settings.xml" AgentVersion = "Unknown" ConfigShare = $Script:AppVentiXModuleConfig.AppVentiX.ConfigShare LicenseValid = $false PublishingExeFilepath = "C:\Program Files\AppVentiX\AppVentiX Agent\AppVentiX Wrapper.exe" ADCache = @{} ManifestCache = @{} PackagePathCache = @{} MachineGroupCache = @{} AgentMSILocations = @( '#ConfigStore#\Agent\AppVentiX Agent.msi', 'C:\Program Files\AppVentiX\AppVentiX Central View\Agent\AppVentiX Agent.msi' ) } # Seed the layout-dependent keys with the default (v2) layout. The actual layout is detected and # (re)applied once the Configuration Store path is known, both here on import and in # Set-AppVentiXConfigShare. $defaultLayoutMap = Get-AppVentiXLayoutMap -Layout 'v2' foreach ($key in $defaultLayoutMap.Keys) { $AppVentiX[$key] = $defaultLayoutMap[$key] } New-Variable -Name AppVentiX -Value $AppVentiX -Scope Script -Force $Script:PSDefaultParameterValues['*-AdsiAD*:Port'] = 389 $Script:PSDefaultParameterValues['*-AdsiAD*:Server'] = $Env:USERDNSDOMAIN $Script:PSDefaultParameterValues['*-AdsiAD*:Credential'] = [System.Management.Automation.PSCredential]::Empty # Debug logging state (controlled by Enable-/Disable-AppVentiXDebugLogging). # Off by default. When enabled, crucial steps are written as JSONL to AppVentiX-PS-Debug.jsonl # in $Script:AppVentiXDebugLogPath. State is module-scoped (not a fragile global variable). $Script:AppVentiXDebugLogEnabled = $false $Script:AppVentiXDebugLogPath = $null $Script:AppVentiXDebugLogLastTimestamp = $null Add-Type -Assembly System.IO.Compression.FileSystem try { if ($Env:AppVentiXConfigShare) { Write-Verbose "Using ConfigShare from environment variable: $($Env:AppVentiXConfigShare)" $Script:AppVentiX.ConfigShare = $Env:AppVentiXConfigShare } elseif ($Env:AppVentiXSiteName) { Write-Verbose "Using AppVentiXSiteName from environment variable: $($Env:AppVentiXSiteName)" $centralViewSite = Get-AppVentiXSite | Where-Object { $_.SiteName -eq $Env:AppVentiXSiteName } | Select-Object -First 1 if ($centralViewSite) { $Script:AppVentiX.ConfigShare = $centralViewSite.Configurationshare } else { Write-Warning "No AppVentiX Central View site found with the name '$($Env:AppVentiXSiteName)' (from `$Env:AppVentiXSiteName). Falling back to the default Configuration Store detection." $Script:AppVentiX.ConfigShare = (Get-AppVentiXConfigShare).ConfigShare } } else { Write-Verbose "No ConfigShare or AppVentiXSiteName environment variable found. Falling back to the default Configuration Store detection." $Script:AppVentiX.ConfigShare = (Get-AppVentiXConfigShare).ConfigShare } # Detect the Configuration Store layout (v1/v2) and apply the matching relative file paths. $detectedLayout = Set-AppVentiXLayout -ConfigShare $Script:AppVentiX.ConfigShare Write-Verbose "AppVentiX Configuration Store layout detected on import: '$detectedLayout'" $ConfigShareCredential = [System.Management.Automation.PSCredential]::Empty if ($Env:AppVentiXConfigShareUsername -and $Env:AppVentiXConfigSharePassword) { try { $ConfigShareCredential = New-Object System.Management.Automation.PSCredential($Env:AppVentiXConfigShareUsername, (ConvertTo-SecureString $Env:AppVentiXConfigSharePassword -AsPlainText -Force)) } catch { Write-Warning "Failed to convert ConfigShare credential from environment variables. Please ensure that AppVentiXConfigShareUsername and AppVentiXConfigSharePassword are set correctly or run 'Set-AppVentiXConfigShare -ConfigShare $($Script:AppVentiX.ConfigShare) -Credential (Get-Credential) -AuthenticateConfigShare' first." $ConfigShareCredential = [System.Management.Automation.PSCredential]::Empty } } if ($ConfigShareCredential -ne [System.Management.Automation.PSCredential]::Empty) { try { Set-AppVentiXConfigShare -ConfigShare $Script:AppVentiX.ConfigShare -Credential $ConfigShareCredential -ErrorAction Stop } catch { Write-Warning "Failed to authenticate to ConfigShare with provided credentials. Please run 'Set-AppVentiXConfigShare -ConfigShare $($Script:AppVentiX.ConfigShare) -Credential (Get-Credential) -AuthenticateConfigShare' first." } } $ADParam = @{ AuthenticateConfigShare = $false } if ($Env:AppVentiXADDomainUsername -and $Env:AppVentiXADDomainPassword) { try { $ADParam.Credential = New-Object System.Management.Automation.PSCredential($Env:AppVentiXADDomainUsername, (ConvertTo-SecureString $Env:AppVentiXADDomainPassword -AsPlainText -Force)) $ADParam.AuthenticateConfigShare = $true } catch { Write-Warning "Failed to convert Active Directory credential from environment variables. Please ensure that AppVentiXADDomainUsername and AppVentiXADDomainPassword are set correctly or run 'Set-AppVentiXADCredential -Credential (Get-Credential) -AuthenticateConfigShare' first if you need to authenticate to the ConfigShare or 'Set-AppVentiXADCredential -Credential (Get-Credential) -Server your.domain.controller' if you need to authenticate to Active Directory." $ADParam.Credential = [System.Management.Automation.PSCredential]::Empty } } if ($Env:AppVentiXADDomainServer) { $ADParam.Server = $Env:AppVentiXADDomainServer } if ($Env:AppVentiXADDomainPort) { $ADParam.Port = $Env:AppVentiXADDomainPort } if ($null -ne $ADParam.Credential -and $ADParam.Credential -ne [System.Management.Automation.PSCredential]::Empty -and $ADParam.Server) { try { Set-AppVentiXADCredential @ADParam -ErrorAction Stop } catch { Write-Warning "Failed to authenticate to Active Directory with provided credentials. Please run 'Set-AppVentiXADCredential -Credential (Get-Credential) -AuthenticateConfigShare' first if you need to authenticate to the ConfigShare or 'Set-AppVentiXADCredential -Credential (Get-Credential) -Server your.domain.controller' if you need to authenticate to Active Directory." } } if (-not [String]::IsNullOrEmpty($($Script:AppVentiX.ConfigShare))) { if (Test-AppVentiXIsLicensed -ConfigShare $Script:AppVentiX.ConfigShare -ErrorAction Stop) { Write-AppVentiXLogEntry -Feature "UserAccess" -Action "Import-Module" -Details "AppVentiX module imported and connected to ConfigShare" } else { Write-Warning "AppVentiX is (possibly) not licensed. Please run 'Set-AppVentiXConfigShare -ConfigShare \\path.to\ConfigShare' first or define the '-ConfigShare \\path.to\ConfigShare' parameter for each function." } } else { Write-Warning "ConfigShare is not defined. Please run 'Set-AppVentiXConfigShare -ConfigShare \\path.to\ConfigShare' first or define the '-ConfigShare \\path.to\ConfigShare' parameter for each function." } try { $Script:AppVentiX.AgentVersion = Get-AppVentiXVersion -ConfigShare $Script:AppVentiX.ConfigShare } catch { Write-Verbose "Failed to detect AppVentiX Agent version." } } catch { Write-Warning "Caught an error while reading the Central View Settings, $($_.Exception.Message)" Write-Warning "Please run 'Set-AppVentiXConfigShare -ConfigShare `"\\path.to\ConfigShare`" first or define the '-ConfigShare `"\\path.to\ConfigShare`"' parameter for each function." Write-Warning "If you need to authenticate to the ConfigShare, please run 'Set-AppVentiXADCredential -Credential (Get-Credential) -AuthenticateConfigShare' first." } # SIG # Begin signature block # MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCHPuA1GQmesBKe # 2adyjZn73Ugd/YZtS75bmi58gHahuKCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ # lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv # c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD # Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH # or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD # PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV # qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70 # ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1 # vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3 # W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK # xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg # trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj # O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7 # swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ # T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn # LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c # Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF # xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx # AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8 # FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY # lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2 # 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY # uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al # GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk # ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAQyaRto # bic9sBX5AAAABDJpMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwODAyMTQxMjE5WhcNMjYwODA1 # MTQxMjE5WjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP # MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE # AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB # gQCll/19fsk+rc8B67sHzVS28pcjEP8/g44+bWhFKh6+e5kNbEihC6k7hc031BjK # 8jlXAma6ipNydOiWgvDvIBkvHiXkRwmAhjv2Lnh07d0JgZLhUVUjoJZxn/JMzgLW # a/RT/WqpaZJbDL+bJ7qrLBBVqMaCBSH6/cN4ZqzHX7Hkc1KWIOWU6PU8DUNSKtBI # IQzPVK2Z3YGesUA/VMuFx7LbI85LAsrKeSDd8ZchyOLtYvFR+CKx+p/BQBpHPMPX # ivhyjAO31ekph/nhpG9lfc/yFHFW+14ceinphUBSKxgOmngTZDh9UrsWzByjeDmJ # VmqENi3jd6uR2gHyqDt+aPJg/YnhuejUMLBlxDBeWkmbs4FkWPMpDMtLLs63dYr4 # BjlRrXaxKBlBUklto3fhjcfcshTkt1V98wxwCz53lJAgyYWL6GYp9acZ4drI50QX # v7X9caLHOoy+vp0nZr1tcUfSLjTZCFcYJ0eUqXproBYMrR6cIrYf5s2h/l2yt929 # 6FkCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG # A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6 # gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUwu0a4YXLoXLkOy08WT1L2aMHiKowHwYDVR0j # BBgwFoAUayVB3vtrfP0YgAotf492XapzPbgwZwYDVR0fBGAwXjBcoFqgWIZWaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl # MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEE # aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB # JTIwMDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # DQYJKoZIhvcNAQEMBQADggIBADh7xKhbPEm669VqbbgMBeFaOJ2Z3QUT/RFWTPU8 # fHlhpYjA2qFse+p0uPpoHjpQ4j3xjddA+CKde2a9c6fkP60TKsqGKCXmGu8UZZJa # 9tgfy0C4jnZe7rPtBu/svwcScvQUTw2oC6dbO5E/BQvWuW2+JSUHu8mzWK/0xgzv # ws8EFXbkegfBgTU8o3ElOItzOp0rc85tdVOJjgP9qhZGZPiPX70h7KipJmiyI49O # mmzg0xylkaTStAscDua+yO9bP52hm0STEekn5C5igv2UoBfmfSU9QyA/WZsoNO37 # ws2HcYoy8ajHuowrfvABE71Wb6bFvxHDeA/+TIaTO1cwjy+ihMdQVaJYqqyPg7n4 # VqnLWUPwevvUDBjOLha902HaCsbn07IBY6USSZIYWBJxPrk3AYahQZ4PxsWfz5LV # TxPHGBjxWhChPHQc0k6rBqNQdNgusiLPjTotERLrb83LSHPaZkF9Qsx7U/exN9CE # 7HPckcQYp/MS9zOVwsWXGftUYBf1edHWOnefhQIZwBWw2gT5cxtAJZPBEhQrK07V # MkLbl75N1WtV/CryONEz/D6lwoyqIfloCEC0l0RbQ3cfKcmN2B+HkFjXlVWpTpfF # LNUSizOkr1faHyy0aONspH/C3sSLA2w+8o2E/1wMCRBz0PlWNKWPYfH1Oy//bT43 # RGCpMIIGpTCCBI2gAwIBAgITMwAEMmkbaG4nPbAV+QAAAAQyaTANBgkqhkiG9w0B # AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0 # MB4XDTI2MDgwMjE0MTIxOVoXDTI2MDgwNTE0MTIxOVowaDELMAkGA1UEBhMCTkwx # FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE # ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN # BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEApZf9fX7JPq3PAeu7B81UtvKXIxD/ # P4OOPm1oRSoevnuZDWxIoQupO4XNN9QYyvI5VwJmuoqTcnToloLw7yAZLx4l5EcJ # gIY79i54dO3dCYGS4VFVI6CWcZ/yTM4C1mv0U/1qqWmSWwy/mye6qywQVajGggUh # +v3DeGasx1+x5HNSliDllOj1PA1DUirQSCEMz1Stmd2BnrFAP1TLhcey2yPOSwLK # ynkg3fGXIcji7WLxUfgisfqfwUAaRzzD14r4cowDt9XpKYf54aRvZX3P8hRxVvte # HHop6YVAUisYDpp4E2Q4fVK7Fswco3g5iVZqhDYt43erkdoB8qg7fmjyYP2J4bno # 1DCwZcQwXlpJm7OBZFjzKQzLSy7Ot3WK+AY5Ua12sSgZQVJJbaN34Y3H3LIU5LdV # ffMMcAs+d5SQIMmFi+hmKfWnGeHayOdEF7+1/XGixzqMvr6dJ2a9bXFH0i402QhX # GCdHlKl6a6AWDK0enCK2H+bNof5dsrfdvehZAgMBAAGjggHUMIIB0DAMBgNVHRMB # Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr # BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFMLt # GuGFy6Fy5DstPFk9S9mjB4iqMB8GA1UdIwQYMBaAFGslQd77a3z9GIAKLX+Pdl2q # cz24MGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy # MENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBLMEkG # BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQA4e8So # WzxJuuvVam24DAXhWjidmd0FE/0RVkz1PHx5YaWIwNqhbHvqdLj6aB46UOI98Y3X # QPginXtmvXOn5D+tEyrKhigl5hrvFGWSWvbYH8tAuI52Xu6z7Qbv7L8HEnL0FE8N # qAunWzuRPwUL1rltviUlB7vJs1iv9MYM78LPBBV25HoHwYE1PKNxJTiLczqdK3PO # bXVTiY4D/aoWRmT4j1+9IeyoqSZosiOPTpps4NMcpZGk0rQLHA7mvsjvWz+doZtE # kxHpJ+QuYoL9lKAX5n0lPUMgP1mbKDTt+8LNh3GKMvGox7qMK37wARO9Vm+mxb8R # w3gP/kyGkztXMI8vooTHUFWiWKqsj4O5+Fapy1lD8Hr71AwYzi4WvdNh2grG59Oy # AWOlEkmSGFgScT65NwGGoUGeD8bFn8+S1U8TxxgY8VoQoTx0HNJOqwajUHTYLrIi # z406LRES62/Ny0hz2mZBfULMe1P3sTfQhOxz3JHEGKfzEvczlcLFlxn7VGAX9XnR # 1jp3n4UCGcAVsNoE+XMbQCWTwRIUKytO1TJC25e+TdVrVfwq8jjRM/w+pcKMqiH5 # aAhAtJdEW0N3HynJjdgfh5BY15VVqU6XxSzVEoszpK9X2h8stGjjbKR/wt7EiwNs # PvKNhP9cDAkQc9D5VjSlj2Hx9Tsv/20+N0RgqTCCBygwggUQoAMCAQICEzMAAAAW # MZKNkgJle5oAAAAAABYwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx # MjlaFw0zMTAzMjYxODExMjlaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBBT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDK # VfrI2+gJMM/0bQ5OVKNdvOASzLbUUMvXuf+Vl7YGuofPaZHVo3gMHF5inT+GMSpI # cfIZ9qtXU1UG68ry8vNbQtOL4Nm30ifXpqI1+ByiAWLO1YT0WnzG7XPOuoTeeWsN # Zv5FmjxCsReBZvyzyzCyXZbu1EQfJxWTH4ebUwtAiW9rqMf9eDj/wYhiEfNteJV3 # ZFeibD2ztCHr9JhFdd97XbnCHgQoTIqc02X5xlRKtUGBa++OtHBBjiJ/uwBnzTkq # u4FjpZjQeJtrmda+ur1CT2jflWIB/ypn7u7V9tvW9wJbJYt/H2EtJ0GONWxJZ7TE # u8jWPindOO3lzPP7UtzS/mVDV94HucWaltmsra6zSG8BoEJ87IM8QSb7vfm/O41F # hYkUv89WIj5ES2O4kxyiMSfe95CMivCuYrRP2hKvx7egPMrWgDDBkxMLgrKZO9hR # NUMm8vk3w5b9SogHOyJVhxyFm8aFXfIxgqDF4S0g4bhbhnzljmSlCLlumMZcXFGD # jpF2tNoAu3VGFGYtHtTSNVKvZpgB3b4ynaoDkbPf+Wg4523jt4VneasBgZhC1srZ # I2NCnCBBfgjLq04pqEKAWEohyW2K29KSkkHvt5VaE1ac3Yt+oyiOzMS57tXwQDJL # GvLg/OXFO0VNvczDndfIfXYExB/ab2PuMSwd5VIBOwIDAQABo4IB3DCCAdgwDgYD # VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRrJUHe+2t8 # /RiACi1/j3ZdqnM9uDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C # AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl # oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z # b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy # MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp # ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB # DAUAA4ICAQAG1VBeVHTVRBljlcZD3IiMxwPyMjQyLNaEnVu5mODm2hRBJfH8GsBL # ATmrHAc8F47jmk5CnpUPiIguCbw6Z/KVj4Dsoiq228NSLMLewFfGMri7uwNGLISC # 5ccp8vUdADDEIsS2dE+QI9OwkDpv3XuUD7d+hAgcLVcMOl1AsfEZtsZenhGvSYUr # m/FuLq0BqEGL9GXM5c+Ho9q8o+Vn/S+GWQN2y+gkRO15s0kI05nUpq/dOD4ri9rg # Vs6tipEd0YZqGgD+CZNiaZWrDTOQbNPncd2F9qOsUa20miYruoT5PwJAaI+QQiTE # 2ZJeMJOkOpzhTUgqVMZwZidEUZKCqudaeQA08WwnkQMfKyHzaU8j48ULcU4hUwvM # sv7fSurOe9GAdRQCPvF8WcSK5oDHe8VVJM4tv6KKCm91HqLx9JamBgRI6R2SfY3n # u26EGznu0rCg/769z8xWm4PVcC2ZaL6VlKVqFp1NsN8YqMyf5t+bbGVb09noFKcJ # G/UwyGlxRmQBlfeBUQx5/ytlzZzsEnhrJF9fTAfje8j3OdX5lEnePTFQLRlvzZFB # qUXnIeQKv3fHQjC9m2fo/Z01DII/qp3d8LhGVUW0BCG04fRwHJNH8iqqCG/qofMv # +kym2AxBDnHzNgRjL60JOFiBgiurvLhYQNhB95KWojFA6shQnggkMTCCB54wggWG # oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG # A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE # AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy # MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ # Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji # 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN # cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I # u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ # 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm # JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG # 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF # xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc # Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b # Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV # FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K # 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p # nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME # GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl # bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo # b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC # hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl # JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv # Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U # q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0 # wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH # +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN # 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0 # byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN # OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx # 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+ # PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ # e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD # f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX # iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcyMIIXLgIBATBxMFoxCzAJBgNV # BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT # Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQCEzMABDJpG2huJz2w # FfkAAAAEMmkwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgk20Uz1kBHaMN # Dxu8bqK8xi+GiurhPmvJGnkFZs5c+nQwDQYJKoZIhvcNAQEBBQAEggGAmb4PqyZ1 # hWT2KiBh5KKhDV4as+mBDtSJqYW6YMlcgyzTl9506NW91tZI5/nQxQ2VlWdgEtPo # 7yyvIy4ceALf0N0AGmT0ESt2c1/Gjg9lAJreTICKZCkoxt6w/ZrhJR2gF8vX0VQx # 1K0OVZ9UMpcE49Y881J0teVMDhyDl47d46kOowlEuKKY5an7iSaA2rS38xMWaelZ # Ptqo61ril8JDGjAUxAFJJKrYR4bn4pVDOgduNCbzED7Yak9lp9x6lN6ry4YJo8XQ # LiKwvleGmmpNuyuFg+E2p5DLQeSwwQFH/MaZ7e1CC0oDebciqAVA0YB0xNsAJfkO # sLllFGHffGYZm7p4xIvuVujSB14iKlzUoALOLBI1JcHpgzzhqdgL6tDtuyy448lL # BOpdqBLmhSbrjdPKFLsU7UOmTH2mQ8CNxZg2ZkQ0Si2G9YIrqvLQZf063npW7ZaZ # KgvxA2lWw7L5/cqdryoyM4ME9JYBcudAhTeua1ivZsQaO0Hk9ofwAA4IoYIUsjCC # FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN # BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor # BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIBGyZY8kcnQ/80vFEvOoccuY8ApV # Rds9BXtncbTrJneeAgZqcNO2f7gYEzIwMjYwODA0MTMzNTA5LjkzNlowBIACAfSg # gemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr # BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG # A1UECxMeblNoaWVsZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxN # aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykw # ggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUA # MHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # SDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBD # ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTEx # MTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt # cGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnzn # UmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omF # io5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhI # kQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlk # pOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/ # pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqI # NGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQ # ZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFj # rhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWY # BunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liw # kGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo # 27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1Ud # DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNA # z3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0 # bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA # QTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBP # aKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUy # MFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggr # BgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj # YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy # dDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5 # r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdo # vkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2X # MOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWON # NboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb # 0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4K # Gag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFf # EV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/Kg # aXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88 # TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp # +o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7 # pmgAXVswggefMIIFh6ADAgECAhMzAAAAWXzacemNXvXAAAAAAABZMA0GCSqGSIb3 # DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGlu # ZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwMVoXDTI3MDEwNzE4NTkwMVowgeMxCzAJ # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv # c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs # ZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi # bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAKYu5/40eEX+hT+5jFa146bid3dA4LnXYntvkP3CGw4L # GARFhnvLMSJ/VtsubzDaeFnm7yb2KSM70WmHQprdCVqpvUH7l0uB4jNw7urLoAR9 # kKHLE0VlMlDStDSxUBI3qwsdrjvdmvV0k+9/njuDEiSlzJTf7Dowd1K3bO4beRya # FhR+Y8tymECOqlOAffYrG2wZdVM51+QSBSe+PEykr8C6OnnqSipuF8fZvCb6/huk # 0Zm6ZwsaixSHIAT2IEGvS7c63Im8jV3a8R0K6i2yiw0NNlnTSpwy/Zfv7iwsLBwh # fbjBTn+XOl6mPzDXQQ3V+SRP9xXbGKOsBTxzGid7aKAHw3o4Ahl9UGWLH9kNP3VU # okE6JYkjlfpuUGZ6gQyqDewfxD4VoYIlopt4HZ0xQvqajuJx+cr8LR/IZ56gLLmw # yMzde5+vtjBoilry/gSZwVGwgkvkIgpKPBQHGsSB0y3szr7Y7wEb6v0yZal1XUvW # nnz3inTaSWsCFrLPVwVmXy3ncY5/d25VpOkht+m697GWNbvsNOhAOHRaftE9j/hh # koM6RsyJfBLnhqMcA/wcavf5oj5NeyRQdGZeLKcls9csKS3sBUzPidxx2iiNH9CP # aDq/bLJEOXasYohXMnRinu+fUk81s8VO7DQSF6ffn5oqSHoV8lf1Ax6u+kdShb8B # AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUj5bnC18D0vlnSRhCOiODGGuXNnYwHwYD # VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr # BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0 # YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB # gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB # DAUAA4ICAQBEMhzC/ZcjpG/zURE7z2Yp5vrUxUjsE5Xa3t/2RGvESwvbmsk3bLHh # SFAajgo2XQ8xoGDP3sUhKCLPeICSbkVv6V8sSp8fJ8Jos6yrawf2YVis8tcV+OO7 # U9S6JGPQzpmPncfzQc4ne1fqZ4+HiKabIDEoFdddQT2Egkk9fzxCY/EZ52avJ27d # SfrI/IDmyn9V10O3iQpg2F+C9vNTrk7nVgoDoHa9+Q3pYr0IHGnSmt5irgGT436z # o5WnXP8FxMhswH1aiyiSZiVzhor10C9C52cP3C8/PEoMKUXstLjoPO0TMkeW/1Fr # 186KXD45QRgBo0xImgtWTdzWFnlD+p7+iDBIuSrNcRXDRYuq/aYZaDhWSI0SYdPI # WVh5XvXuWA31a8oQ0SO+oPa3Nk80k0864wiiyJ1KsbSnaaefg9vspeghrpY8ljCw # xfCUtx5HQRNgAJOI8IKACK4d014Mk0hlRO0lQVRHegqIg29K6Xqkc360W2ZJGUcs # tlKokkVj6KAHjGyrLRPzepYfiZUJq4gXyxbpvKb1XJ2FN2682aUoNXo9RyRK1ch0 # f66k6+yj88kzvuC7+vJWtNDs/UpIM6Hhm0kU64JUJ7MMEQcAc7kpft7Gm7YeRK+o # KgqUgYXCfmzbX8nJXJZnPa8ADWVsIqsuNAxCI0CZXkULofqo5Be6zzGCA9QwggPQ # AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n # IENBIDIwMjACEzMAAABZfNpx6Y1e9cAAAAAAAFkwDQYJYIZIAWUDBAIBBQCgggEt # MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgXVE4 # DV626Bo0Idu8JcAl0UnbiJBSoksMoZ5jZ801NgQwgd0GCyqGSIb3DQEJEAIvMYHN # MIHKMIHHMIGgBCDLRbqx24bpscXEJ+Hjj9xrcUVw7R8OyyMfSB2YGK3+vDB8MGWk # YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg # MjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTAiBCA40OhlAuikUm9h6VQw/abkkHjN # JdRODMJRDB7RYly3nDANBgkqhkiG9w0BAQsFAASCAgAcA0GsGTyX/KeOY/S8QSvp # oh1UUT2a/+6GAYzKJIDn+UcVGMr6HfM1BUKfsVfCsBisEq1B75fX2JdpZZDWKLT+ # vKaqxcVnceT4Swac8ewPCkneIt2d2eruVUWzLaqYPkItY5n1mRkR2YDXnbBakmrC # ixoON4KtUum3YSlVrVWZsaoxDQTMFJXYk5DgrKN3haUAPw49KjgUayqQGkpaD+RF # PClQv2Q6e/QEw44MroL2xH4xTo/JMXzHWqF/J9kHFRwXw2vIzDDxOs0JfS2QuXSC # k7r5mDCz5lVtqFgqeMJJ357ty9/+gWLpnXAtw4ln6/P3Ic6CHfKwTR7OXoUNSqJI # gNmWnQ5J8q/qjA5OsXU6yIGbx4Z1o/FuT4/UW0EGbDkbI4wLj4W8BMp+B8+DgsoC # 00fDpnh6/R5sbiypFltawJSgkbFsoD0Tt7KE4ecClZtZHxxJEWpra8sr42uV0ory # 8Cy6NAn9RL88LF4ej/68nf7XZbLyhn9IpBoHxSejYzGJuZZP7u34L2F0ZYgrBNUL # pztX3tLBW8R9+plGEUtT9FRQq36jthDGFWkBzCJHAC47xHB/0tniACCe5SP+91HT # +/C56q57H2yfM8tdbk1d+CIweaCHpREYL7KrM+bNO9O9F2R7j3XI1UeXziHBE0FZ # /kgCuaQqRSh6DGUbFz9Fng== # SIG # End signature block |