Obs/scripts/Install-StandaloneObservability.ps1
##------------------------------------------------------------------ ## <copyright file="Install-StandaloneObservability.ps1" company="Microsoft"> ## Copyright (C) Microsoft. All rights reserved. ## </copyright> ##------------------------------------------------------------------ [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Medium", PositionalBinding = $false, DefaultParameterSetName = "DefaultSet")] param( [Parameter(Mandatory = $true)] [System.String] $ResourceGroupName, [Parameter(Mandatory = $true)] [System.String] $SubscriptionId, [Parameter(Mandatory = $true)] [System.String] $TenantId, [Parameter(Mandatory=$false)] [System.String] $RegistrationRegion = "eastus", [Parameter(Mandatory = $true, ParameterSetName = "DefaultSet")] [PSCredential] $RegistrationCredential, [Parameter(Mandatory = $true, ParameterSetName = "Interactive")] [Switch] $Interactive, [Parameter(Mandatory = $true, ParameterSetName = "PassThrough")] [Switch] $PassThrough, [Parameter(Mandatory = $true, ParameterSetName = "ServicePrincipal")] [PSCredential] $RegistrationSPCredential, [Parameter(Mandatory=$true)] [System.String] $FactoryLogShare, [Parameter(Mandatory=$false)] [System.String] $ClusterName, [Parameter(Mandatory=$false)] [System.String] $ObsRootFolderPath = "C:\StandaloneObservability", [Parameter(Mandatory=$false)] [Switch] $ParseOnce, [Parameter(Mandatory=$false)] [System.String] $Cloud = "AzureCloud", [Parameter(Mandatory=$false)] [System.String] $GcsRegion = "eastus", [Parameter(Mandatory=$false)] [System.Boolean] $SkipArcForServer = $false ) Import-Module "$PSScriptRoot\ExtensionHelper.psm1" Import-Module "$PSScriptRoot\StandaloneObservabilityHelper.psm1" Import-Module "$PSScriptRoot\StandaloneObservabilityConstants.psm1" try { $ErrorActionPreference = "Stop" $functionName = $MyInvocation.MyCommand.Name if ([string]::IsNullOrEmpty($ClusterName)) { Write-Host "ClusterName is empty. So setting it to computer name $($env:COMPUTERNAME)" $ClusterName = $env:COMPUTERNAME } if(-not (Test-Path -Path $ObsRootFolderPath -PathType Container)) { Write-Host "ObsRootFolderPath: $ObsRootFolderPath is not present. So creating it" New-Item -Path $ObsRootFolderPath -ItemType Directory -Force } $transcriptFileName = "{0}.{1:yyyy-MM-dd-hh-mm-ss}.log" -f $functionName, $(Get-Date) $transcriptFilePath = Join-Path -Path $ObsRootFolderPath -ChildPath $transcriptFileName Start-Transcript -Path $transcriptFilePath -Append $gmaPackageContentPath = Get-GmaPackageContentPath Import-Module "$gmaPackageContentPath\GMATenantJsonHelper.psm1" -Force Add-Type -Path "$gmaPackageContentPath\Microsoft.AzureStack.Observability.ObservabilityCommon.dll" ## Create pre-requisites for Extension New-GmaStateFolders -ObsRootFolderPath $ObsRootFolderPath Set-HandlerEnvInfo -ObsRootFolderPath $ObsRootFolderPath -CloudName $Cloud -RegionName $RegistrationRegion $parsingEnginePath = Join-Path -Path $global:ObsArtifactsPaths.ObservabilityAgent -ChildPath "LogParsingEngine" $parsingEngineScript = Join-Path -Path $global:extensionRootLocation -ChildPath "scripts\Invoke-ParsingEngine.ps1" $gcsEnvironment = "Prod" ## default environment ## Check if the reg key created for CI exists or not, if yes then change the GCSEnvironment to point to PPE. if (Test-RegKeyExists -Path "HKLM:\Software\Microsoft\SQMClient\" -Name "IsCIEnv") { $gcsEnvironment = "Ppe" } elseif (Get-IsArcAEnvironment) { $gcsEnvironment = "ArcAPpe" } $envInfoFilePath = "$gmaPackageContentPath\EnvironmentInfo.json" $tenantInfoContent = Get-Content $envInfoFilePath -Raw | ConvertFrom-Json $envInfo = $tenantInfoContent.$gcsEnvironment # Settings from EnvironmentInfo.json $gcsEndpoint = $envInfo.EndPoint $gcsAccount = $envInfo.Account $genevaConfigVersion = $envInfo.ConfigVersion ## Install Azure Connected Machine agent $StampId = Set-StampGuid $resourceName = "$(hostname)-$StampId" if ($skipArcForServer -eq $false) { Write-Host "$functionName Azure identity is not enabled. Going to install Arc for server agent" -Verbose if(-not (Get-Module -Name Az.Accounts -ListAvailable)) { Install-Module -Name Az.Accounts -AllowClobber -Force } if ($PSCmdlet.ParameterSetName -eq "ServicePrincipal") { Connect-AzAccount -Credential $RegistrationSPCredential -ServicePrincipal -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -RegistrationSPCredential $RegistrationSPCredential } elseif ($PSCmdlet.ParameterSetName -eq "Interactive") { Connect-AzAccount -UseDeviceAuthentication -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } elseif ($PSCmdlet.ParameterSetName -eq "PassThrough") { $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } else { Connect-AzAccount -Credential $RegistrationCredential -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } } ## Start Pipeline installation using Extension Install interface $deviceArmResourceUri = $PipelineConstants.DeviceArmUriFormat -f $SubscriptionId, $ResourceGroupName, $resourceName $osBuild = Get-OSBuildVersion $logFile = Get-HandlerLogFile Set-StandaloneScenarioRegistry -LogFile $logFile -ErrorAction Stop $configTypes = @([Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.Contract.TenantConfigType]::Telemetry, [Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.Contract.TenantConfigType]::Diagnostics) foreach($configType in $configTypes) { $gcsNameSpace = $envInfo.Namespaces.$configType [Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.TenantConfigRegistrySetter]::Current.SetTenantConfigRegistryKeys( $configType, "1.0", "AuthMSIToken", $gcsEndpoint, $gcsAccount, $gcsNameSpace, $GcsRegion, $genevaConfigVersion, $LocalPath, "true", "true", $GcsRegion, $deviceArmResourceUri, $StampId, $ClusterName, $osBuild, "1.0", $resourceName, $deviceArmResourceUri, $ClusterName, [string]::Empty) } Write-Host "Starting Install-Extension script with DeviceArmResourceUri: $deviceArmResourceUri StampId: $StampId ClusterName: $ClusterName CloudName: $Cloud RegistrationRegion: $RegistrationRegion" & "$PSScriptRoot\Install-Extension.ps1" ` -ErrorAction Stop if($LASTEXITCODE -ne 0) { Write-Error "Error during Extension installation $LASTEXITCODE" } & "$PSScriptRoot\Enable-Extension.ps1" if($LASTEXITCODE -ne 0) { Write-Error "Error during Extension enable $LASTEXITCODE" } # Sleep for sometime and check for GCS Config Wait-ForGcsConfigSync -TimeInSeconds 180 -LogFile $logFile $transcriptFolderPath = Join-Path -Path $(Get-LogFolderPath) -ChildPath $PipelineConstants.TranscriptsFolderName if($ParseOnce) { ## Run ParsingEngine with given log location Write-Host "Starting Parser scripts arguments: $parsingEngineScript -FactorySharePath $FactoryLogShare -ParsingEnginePackagePath $parsingEnginePath -GmaPackageContentPath $gmaPackageContentPath -TranscriptFolderPath $transcriptFolderPath" & $parsingEngineScript -FactorySharePath $FactoryLogShare ` -ParsingEnginePackagePath $parsingEnginePath ` -GmaPackageContentPath $gmaPackageContentPath ` -TranscriptFolderPath $transcriptFolderPath ` -ParseOnce ` -ErrorAction Stop } else { ## Create ParsingEngine scheduled tasks $scriptArguments = "-TaskName $($PipelineConstants.ParserScheduledTaskName) -FactorySharePath $FactoryLogShare -ParsingEnginePackagePath $parsingEnginePath -GmaPackageContentPath $gmaPackageContentPath -TranscriptFolderPath $transcriptFolderPath" Write-Host "Creating Parser scheduled task with arguments: $scriptArguments" New-ScheduledTaskForObservability -TaskName $PipelineConstants.ParserScheduledTaskName ` -TaskPath $PipelineConstants.ParserScheduledTaskPath ` -Description $PipelineConstants.ParserScheduledTaskDescription ` -ScriptPath $parsingEngineScript ` -ScriptArguments $scriptArguments ` -DisableOnRegistration ` -ErrorAction Stop ScheduledTasks\Enable-ScheduledTask -TaskPath $PipelineConstants.ParserScheduledTaskPath ` -TaskName $PipelineConstants.ParserScheduledTaskName ` -ErrorAction Stop } Set-Status -Name $functionName ` -Operation "Enabling succeeded" ` -Message "$functionName : Successfully enabled Standalone Observability pipeline components." ` -Status "success" ` -Code 0 Write-Host "Standalone Observability pipeline installation complete." Stop-Transcript -ErrorAction SilentlyContinue } catch { if ($null -eq (Get-Command -Verb Get -Noun ExceptionDetails) -and (-not [System.String]::IsNullOrEmpty($gmaPackageContentPath))) { Import-Module "$gmaPackageContentPath\GMATenantJsonHelper.psm1" -Force $exceptionDetails = Get-ExceptionDetails -ErrorObject $_ $errorMessage = "$functionName : Failed to enable Standalone Observability pipeline components. Exception is as follows: $exceptionDetails." Set-Status -Name $functionName ` -Operation "Enabling failed" ` -Message $errorMessage ` -Status "error" ` -Code 1 Write-Error $errorMessage Stop-Transcript -ErrorAction SilentlyContinue } else { Write-Error $_ } } # SIG # Begin signature block # MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCywLGufcqy116D # cq7k+EbWK7IXX2QZ53+4LyZdGjAsOaCCDXYwggX0MIID3KADAgECAhMzAAADrzBA # DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA # hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG # 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN # xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL # go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB # tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd # mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ # 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY # 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp # XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn # TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT # e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG # OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O # PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk # ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx # HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt # CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHNoXiXwVHsC/PqEnZc4ihBK # mnSgNWEnMC+w56DyHcVnMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAYiSex0i/nU0M7jtaYpQj81Dax1r0eHtepqWBuIMlbKDsAmh8uu2tQ9cI # 5//vTVk6kNyZmy34+XEPDYQTzlIizKS5LNNODIZG+dIOEedUK2TdTAwV+QZ+dEks # covcnTJ+xwIDteLmqzcJv/xErRBdTDmigM+LOB0JZoHxMsiVLavZKcLf6CQEnNKH # Vf268cJKOQTeAxCzCFz9CoYZoLfK9HSIEDM8vy6Y94bfUlfDtdvN19yK2qr5115A # xEJ8f4RJ7VvQgSZeWTda5jcxFXGjeVHsBF1Bq0aSGMOUgN9AL3bWNtFdf5oPEdh9 # 2ESEyRC0onr21V0IVktw1gBvRcCmhKGCF5YwgheSBgorBgEEAYI3AwMBMYIXgjCC # F34GCSqGSIb3DQEHAqCCF28wghdrAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq # hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCBFgbbgdtY7JBRi4bYjXYQvN70GtuBj3UtBDVhNFoD9UAIGZpVlf0qX # GBIyMDI0MDcyMzExMDMyMS4wMVowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy # aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAwLTA1 # RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC # Ee0wggcgMIIFCKADAgECAhMzAAAB88UKQ64DzB0xAAEAAAHzMA0GCSqGSIb3DQEB # CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDYw # MloXDTI1MDMwNTE4NDYwMlowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx # JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAwLTA1RTAtRDk0NzElMCMGA1UE # AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAP6fptrhK4H2JI7lYyFueCpgBv7Pch/M2lkhZL+yB9eG # UtiYaexS2sZfc5VyD7ySsl2LG41Qw7tkA6oJmxdSM7PzNyfVpQPkPavY+HNUqMe2 # K9YaAaPjHnCpZ7VCi/e8zPxYewqx9p0iVaN8EydUpWiY7JtDv7aNzhp/OPZclBBK # YT2NBGgGiAPCaplqR5icjHQSY665w+vrvhPr9hpM+IhiUZ/5dXa7qhAcCQwbnrFg # 9CKSK1COM1YcAN8GpsERqqmlqy3GlE1ziJ3ZLXFVDFxAZeOcCB55Vts9sCgQuFvD # 7PdV61HC4QUlHNPqFtYSC/P0sxg9JuKgcvzD5mJajfG7DdHt8myp7umqyePC+eI/ # ux8TW61+LuTQ1Bkym+I6z//bf0fp4Dog5W0XzDrqKkTvURitxI2s4aVObm6qr6zI # 7W51k54ozTFjvbw1wYMWqeO4U9sQSbr561kp+1T2PEsJLOpc5U7N2oDw7ldrcTjW # PezsyVMXhDsFitCZunGqFO9+4iVjAjYDN47c6K9x7MnAGPYVCBOJUdpy8xAOBIDs # Tm/K1qTT4wsGbQBxbgg96vwDiA4YP2hKmubIC7UnrAWQGt/ZKOf6J42roXHS1aPw # imDe5C9y6DfuNJp0XqrWtQRqg8hqNkIZWT6jnCfqu35zB0nf1ERTjdpYLCfQL5fH # AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUw2QV9qURUQyMDcCmhTH2oOsNCiQwHwYD # VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc # BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0 # cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC # B4AwDQYJKoZIhvcNAQELBQADggIBAN/EHI/80f7v29zeWI7hzudcz9QoVwCbnDrU # XFHE/EJdFeWI2NnuwOo0/QPNRMFT21LkOqSpFKIhXXmPurx7p6WDz9wPdu/Sxbga # j0AwviWEDkwGDfDMp2KF8nQT8cipwdfXWbC1ulOILayABSHv45mdv1PAkTulsQE8 # lBTHG4KJLn+vSzZBWKkGaL/wwRbZ4iLiYn68cjkMJoAaihPgDXn/ug2P3PLNEAFN # QgI02tLX0p+vIQ3l2HmSo4bhCBxr3DovsIv5K65NmLRJnxmrrmIraFDwgwA5XF7A # KkPiVkvo0OxU1LAE1c5SWzE4A7cbTA1P5wG6D8cPjcHsTah1V+zofYRgJnFRLWuB # F4Z3a6pDGBDbCsy5NvnKQ76p37ieFp//1I3eB62ia1CfkjOF8KStpPUqdkXxMjfJ # 7Vnemd6vQKf+nXkfvA3AOQECJn7aLP01QR5gt8wab28SsNUENEyMawT8eqpjtBNJ # O0O9Tv7NnBE8aOJhhQVdP5WCR90eIWkrDjZeybQx8vlo5rfUXIIzXv+k9MgpNGIq # wMXfvRLAjBkCNXOIP/1CEQUG72miMVQs5m/O4vmJIQkhyqilUDB1s12uhmLYc3yd # 8OPMlrwIxORB5J9CxCkqvzc6EGYTcwXazPyCp7eWhzTkNbwk29nfbwmmzcskIAu3 # StA8lic7MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG # 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy # MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw # MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az # /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2 # 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa # ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN # yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K # MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf # NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU # HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY # WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5 # C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8 # FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS # BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1 # Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw # UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB # hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO # mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w # a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr # BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3 # DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz # tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW # AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G # 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye # ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9 # 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j # dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ # KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB # Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP # Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp # e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1Aw # ggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046OEQwMC0wNUUwLUQ5NDcxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAG76 # BizYtGFrmkU7v2DcuR/ApGcooIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDqScacMCIYDzIwMjQwNzIzMDYwNTE2 # WhgPMjAyNDA3MjQwNjA1MTZaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOpJxpwC # AQAwCgIBAAICAQACAf8wBwIBAAICE/IwCgIFAOpLGBwCAQAwNgYKKwYBBAGEWQoE # AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq # hkiG9w0BAQsFAAOCAQEAhaDM+bkWkUg26jeP05THdVsarQnmu2yVtZr384SWlEHd # 1lEaIYmYTCSXeC2OlXwBi+JheXHRAHcQd4P8NWFakK1pgirK1NS8K/PHkq502fr/ # rVe5W3ApWquwpyBx3HwdIgZy1ospoG9VIbPu+mvS2bqWe+4FloWHemQic9bjJ/FV # rDawicmUHkew8Y0Xc/euDYkdvdBaND5MSvvSKhBVXh4uf9txs2XPvtQL67XYDywL # 5NBOO51bvj54TQn4kloTpdEW+Bq5WN+SWF7YnFevw6qXurYvDrj54NiizV+c0IH+ # CteQh3CK7zWRMPKR2eqm0BimgSYd/AV9reVmADhisDGCBA0wggQJAgEBMIGTMHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB88UKQ64DzB0xAAEAAAHz # MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw # LwYJKoZIhvcNAQkEMSIEIBZFcOAoUlDGtDYfe3zoWy404vg4Q23x+Zo3yA5wNSRt # MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgGLzZNIu24bhWSnzAGYmT9P5E # CHzjWwb9oM7DGDo7YugwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMAITMwAAAfPFCkOuA8wdMQABAAAB8zAiBCCQAmp8RF9aMQ3YcoaGXFM+yJhM # IGFtHiShC+yxyDwF9DANBgkqhkiG9w0BAQsFAASCAgCVVGJYN/VrugGXopbSjFhD # nQaeF57I0iNXpSIHOnGGV8q4g9mbKKY5RNLX/ftCGUkdMcG9Vz84Af+R1gmuTDRT # /Rzeh/Vigq04RqCdFR6fJ49cjJQQzzus2ewImMXOaWkqiPkXPdCHxV5CF31JZTkL # 2T3buhv11d2mgeLVucG1JBsxyofNKSuYt6C1nJYfUkvTCOxmI8n9Btq0q0AcIThc # jR1esDUJXmByJJhH/RBLXIGiiSueFCnQr00y0fB7d7xZOMUFS7XSA8RmEm4J09Bd # uFXS9imqO+xsjpoAk+jVXJ77yTJGT67RJZkbIi34W40Lxn5KJtZ4WQZQoIYdnQPQ # 6GJza+it36b95/nTlkGxyqmvWZ/DrvepWgVXRC0IOmcjQETHi1obW2rVQIBY+zlw # Z6RTqOJnbKpXF7IQ5DbsUh5EzbWxxiG8mgHXzHy4d7pnOevAt85MAAZH1c08fJQ3 # yc2mNVcYYtTS4yAbLqSaXYn8hKRMLwfncUB3I4T5nclvfbkQ7XkVPKdUdxhnFCQy # XXUqXco0wV57F2zeR3ksNSWpM9eET3wzW+Bpo4w55eOfX6xs7CS5oQHVkWQj5Ia+ # O7wgOYpv3aTvNzT25Rby54gb0zPykv/+jDsGTv7RLcx9bDMnfreweBnFJ45/WF5y # ojqBJLGUeW6eV7nCxx3tkg== # SIG # End signature block |