public/Get-AppVentiXContentStorePackage.ps1
|
<#
.SYNOPSIS Retrieves packages from the AppVentiX content shares. .DESCRIPTION The Get-AppVentiXContentStorePackage function scans the content shares configured for machine groups and retrieves information about App-V (.appv), MSIX (.msix), and connection group (.appg) packages. It returns package details including name, version, publisher, and connection group membership. Content shares may be SMB paths or 'azure://<account>/<container>[/<prefix>]' Azure Blob paths. For an Azure content share, manifest reads download each package to a local temp file first (a ZIP archive needs a local, seekable file to open), so scanning many/large packages over an Azure content share is slower than over SMB. .PARAMETER MachineGroupFriendlyName (Optional) Specifies the friendly name of the machine group to retrieve packages from. If not specified, packages from all machine groups are retrieved. .PARAMETER IncludeDependencies (Optional) When specified, includes packages located in Dependencies folders. By default, dependency packages are excluded from the results. .PARAMETER ListOnly (Optional) When specified, only lists what is present (Type, Filename, Fullname, MachineGroup, LastUpdated) - manifests are not opened and connection groups are not resolved, so Name/Version/Publisher/PackageId/VersionId/MemberOf stay empty. This skips every manifest/connection-group read (for an Azure content share, the per-package temp download too), so it is much faster when you only need to see what packages exist. .PARAMETER CachePackages (Optional) When specified, package manifest identity fields are cached in memory for the duration of the PowerShell session and reused on subsequent calls, avoiding a re-read of packages that have not changed. The cache is keyed on the file name together with its last write time and size, so a repackaged file (new content) is always re-read, and identical files synced across multiple content shares are only read once. The cache is module-scoped (not accessible outside the module) and is cleared when the module is reimported. Off by default. .PARAMETER ThrottleLimit (Optional) Specifies the maximum number of package manifests to read concurrently from the content share. Reading a manifest opens the package archive over the (usually remote) share, so scanning is network-latency bound and benefits from parallelism. Defaults to 16. Increase on high-latency shares; decrease to reduce load on the file server. .PARAMETER ConfigShare Specifies the path to the AppVentiX configuration share. You can omit this parameter if the configuration store was already set with Set-AppVentiXConfigShare, or when it can be detected automatically (for example on a machine where AppVentiX Central View is installed and configured). .EXAMPLE Get-AppVentiXContentStorePackage Retrieves all packages from all machine group content shares. .EXAMPLE Get-AppVentiXContentStorePackage -MachineGroupFriendlyName 'Production' Retrieves packages from the content shares of the 'Production' machine group. .EXAMPLE Get-AppVentiXContentStorePackage -IncludeDependencies Retrieves all packages including those in Dependencies folders. .EXAMPLE Get-AppVentiXContentStorePackage -ListOnly Lists Type/Filename/Fullname for every package without opening any manifests. .LINK Add-AppVentiXPackage .LINK New-AppVentiXConnectionGroup .LINK Get-AppVentiXMachineGroup .LINK New-AppVentiXPublishingTask .NOTES Function : Get-AppVentiXContentStorePackage Alias : Get-AppVentiXContentSharePackages (previous name, kept for compatibility) Author : John Billekens Copyright: (c) John Billekens Consultancy & AppVentiX Version : 2026.818.1900 Requires : Valid AppVentiX license #> function Get-AppVentiXContentStorePackage { [CmdletBinding(DefaultParameterSetName = 'All')] param( [Alias('FriendlyName')] [Parameter(ParameterSetName = 'Named')] [ValidateNotNullOrEmpty()] [String]$MachineGroupFriendlyName = "All Machine Groups", [switch]$IncludeDependencies, [switch]$ListOnly, [switch]$CachePackages, [ValidateRange(1, 128)] [Int]$ThrottleLimit = 16, [Parameter(DontShow, ParameterSetName = 'All')] [Parameter(DontShow, ParameterSetName = 'Named')] [ValidateNotNullOrEmpty()] [String]$ConfigShare = $Script:AppVentiX.ConfigShare ) Write-Verbose "Starting function 'Get-AppVentiXContentStorePackage'" if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) { if ($PSCmdlet.ParameterSetName -eq 'Named') { $machineGroups = Get-AppVentiXMachineGroup -ConfigShare $ConfigShare -Name $MachineGroupFriendlyName if ($machineGroup.FriendlyName -like "$MachineGroupFriendlyName") { $MachineGroupFriendlyName = $machineGroup.FriendlyName } else { Write-Error "Machine group `"$MachineGroupFriendlyName`" not found!" -ErrorAction Stop } } else { $machineGroups = Get-AppVentiXMachineGroup -ConfigShare $ConfigShare } $Packages = [System.Collections.Generic.List[object]]::new() $PackagesByFullName = [System.Collections.Generic.Dictionary[string, object]]::new([System.StringComparer]::OrdinalIgnoreCase) foreach ($machineGroup in $machineGroups) { foreach ($GroupContentShare in $machineGroup.GroupContentshares.ContentShare) { $AppvConnectionGroups = [System.Collections.Generic.List[object]]::new() Write-Verbose "[$($machineGroup.FriendlyName)] Processing Content Share $($GroupContentShare.Path)" $isAzureContentShare = $GroupContentShare.Path -match '^azure://' if ($isAzureContentShare) { $ContentShareFiles = Get-AppVentiXAzureContentShareItem -Path $GroupContentShare.Path -Include '*.appv', '*.msix', '*.appg' } else { $ContentShareFiles = Get-ChildItem -Path $GroupContentShare.Path -Include *.appv, *.msix, *.appg -Recurse } Write-AppVentiXDebugLog -Message 'Enumerated Content Share files' -Level Timing -Data @{ MachineGroup = "$($machineGroup.FriendlyName)" ContentSharePath = "$($GroupContentShare.Path)" FileCount = @($ContentShareFiles).Count } $ManifestFilesToScan = [System.Collections.Generic.List[string]]::new() # Keyed on filename, not FullName, so identical files synced across content shares share one cache entry. $ManifestCacheKeys = [System.Collections.Generic.Dictionary[string, string]]::new([System.StringComparer]::OrdinalIgnoreCase) foreach ($File in $ContentShareFiles) { $normalizedFullName = $File.FullName -replace '\\', '/' if ($IncludeDependencies.IsPresent -eq $false -and $normalizedFullName -like "*/Dependencies/*$($File.Name)") { Write-Verbose "Skipping dependency file: $($File.FullName)" continue } $package = [PSCustomObject]@{ Type = "ERROR" MachineGroup = $machineGroup.FriendlyName Name = $null Version = $null Publisher = $null LastUpdated = $File.LastWriteTime PackageId = $null VersionId = $null Filename = $File.Name Fullname = $File.FullName ContentSharePath = $GroupContentShare.Path MemberOf = @() } if ($File.Name -like "*.appv") { $package.Type = "APPV" $ManifestFilesToScan.Add($File.FullName) if ($CachePackages) { $ManifestCacheKeys[$File.FullName] = '{0}|{1}|{2}' -f $File.Name, $File.LastWriteTimeUtc.Ticks, $File.Length } } elseif ($File.Name -like "*.msix") { $package.Type = "MSIX" $ManifestFilesToScan.Add($File.FullName) if ($CachePackages) { $ManifestCacheKeys[$File.FullName] = '{0}|{1}|{2}' -f $File.Name, $File.LastWriteTimeUtc.Ticks, $File.Length } } elseif ($File.Name -like "*.appg") { $package.Type = "Group" Write-Verbose "Processing AppG package: $($File.FullName)" $AppvConnectionGroups.Add($File) } elseif ($File.Name -like "*.cim") { Write-Warning "CIM files are currently not supported within this function: $($File.FullName)" } elseif ($File.Name -like "*.vhd" -or $File.Name -like "*.vhdx") { Write-Warning "VHD/VHDX files are currently not supported within this function: $($File.FullName)" } else { Write-Warning "Unknown file type: $($File.FullName)" } $Packages.Add($package) $PackagesByFullName[$File.FullName] = $package } # -ListOnly skips this and the connection-group resolution below: no manifest/appg reads, no Azure download. if (-not $ListOnly -and $ManifestFilesToScan.Count -gt 0) { $manifestFailures = 0 $cacheHitCount = 0 # TargetFullName lets a cache hit (read under a different content share) still merge onto the right object. $ManifestResultsToApply = [System.Collections.Generic.List[object]]::new() $FilesToScan = [System.Collections.Generic.List[string]]::new() foreach ($file in $ManifestFilesToScan) { $cacheKey = $null if ($CachePackages -and $ManifestCacheKeys.TryGetValue($file, [ref]$cacheKey) -and $Script:AppVentiX.ManifestCache.ContainsKey($cacheKey)) { $ManifestResultsToApply.Add([PSCustomObject]@{ TargetFullName = $file; Manifest = $Script:AppVentiX.ManifestCache[$cacheKey] }) $cacheHitCount++ } else { $FilesToScan.Add($file) } } if ($FilesToScan.Count -gt 0) { Write-Verbose "[$($machineGroup.FriendlyName)] Reading $($FilesToScan.Count) manifest(s) from $($GroupContentShare.Path) ($cacheHitCount served from cache)" if ($isAzureContentShare) { # ZipArchive needs a local, seekable file; download each package to a temp file first. $tempFileMap = [System.Collections.Generic.Dictionary[string, string]]::new([System.StringComparer]::OrdinalIgnoreCase) try { foreach ($originalFullName in $FilesToScan) { $null = $originalFullName -match '^azure://(?<account>[^/]+)/(?<container>[^/]+)/(?<blob>.+)$' $tempPath = Save-AppVentiXAzureBlobItemToTempFile -StorageAccount $Matches.account -Container $Matches.container -Blob $Matches.blob $tempFileMap[$tempPath] = $originalFullName } foreach ($manifest in (Invoke-AppVentiXManifestScan -Path @($tempFileMap.Keys) -ThrottleLimit $ThrottleLimit)) { $originalFullName = $tempFileMap[$manifest.FullName] $ManifestResultsToApply.Add([PSCustomObject]@{ TargetFullName = $originalFullName; Manifest = $manifest }) if ($CachePackages -and $null -ne $manifest -and $manifest.Success -and -not [String]::IsNullOrEmpty($originalFullName) -and $ManifestCacheKeys.ContainsKey($originalFullName)) { $Script:AppVentiX.ManifestCache[$ManifestCacheKeys[$originalFullName]] = $manifest } } } finally { foreach ($tempPath in $tempFileMap.Keys) { Remove-Item -Path $tempPath -Force -ErrorAction SilentlyContinue } } } else { foreach ($manifest in (Invoke-AppVentiXManifestScan -Path $FilesToScan.ToArray() -ThrottleLimit $ThrottleLimit)) { $ManifestResultsToApply.Add([PSCustomObject]@{ TargetFullName = $manifest.FullName; Manifest = $manifest }) if ($CachePackages -and $null -ne $manifest -and $manifest.Success -and -not [String]::IsNullOrEmpty($manifest.FullName) -and $ManifestCacheKeys.ContainsKey($manifest.FullName)) { $Script:AppVentiX.ManifestCache[$ManifestCacheKeys[$manifest.FullName]] = $manifest } } } } foreach ($result in $ManifestResultsToApply) { $manifest = $result.Manifest if ($null -eq $manifest -or [String]::IsNullOrEmpty($result.TargetFullName)) { Write-Warning "Failed to read a package manifest. Error: $($manifest.Error)" $manifestFailures++ continue } $package = $null if (-not $PackagesByFullName.TryGetValue($result.TargetFullName, [ref]$package)) { continue } if (-not $manifest.Success) { Write-Warning "Failed to process $($package.Type) package: $($result.TargetFullName). Error: $($manifest.Error)" $manifestFailures++ continue } $package.Name = $manifest.Name $package.Version = $manifest.Version if ($package.Type -eq "APPV") { $package.PackageId = $manifest.PackageId $package.VersionId = $manifest.VersionId } elseif ($package.Type -eq "MSIX") { $package.Publisher = $manifest.Publisher } } Write-AppVentiXDebugLog -Message 'Read package manifests' -Level Timing -Data @{ MachineGroup = "$($machineGroup.FriendlyName)" ContentSharePath = "$($GroupContentShare.Path)" ManifestCount = $ManifestFilesToScan.Count ScannedCount = $FilesToScan.Count CacheHitCount = $cacheHitCount FailureCount = $manifestFailures ThrottleLimit = $ThrottleLimit } } if (-not $ListOnly) { foreach ($ConnectionGroup in $AppvConnectionGroups) { try { $connectionGroupXML = New-Object System.Xml.XmlDocument if ($isAzureContentShare) { $null = $ConnectionGroup.FullName -match '^azure://(?<account>[^/]+)/(?<container>[^/]+)/(?<blob>.+)$' $connectionGroupContent = Get-AppVentiXAzureBlobItem -ConfigShare $ConnectionGroup.FullName -Container $Matches.container -Blob $Matches.blob $connectionGroupXML.LoadXml($connectionGroupContent) } else { $connectionGroupXML.Load($ConnectionGroup.FullName) } } catch { # One bad .appg must not abort the whole scan. Write-Warning "Failed to load connection group: $($ConnectionGroup.FullName). Error: $($_.Exception.Message)" continue } $package = $null if (-not $PackagesByFullName.TryGetValue($ConnectionGroup.FullName, [ref]$package)) { Write-Warning "Connection group package object not found for: $($ConnectionGroup.FullName)" $connectionGroupXML = $null continue } $package.Name = $connectionGroupXML.AppConnectionGroup.DisplayName $package.PackageId = $connectionGroupXML.AppConnectionGroup.AppConnectionGroupId $package.VersionId = $connectionGroupXML.AppConnectionGroup.VersionGuid foreach ($item in $connectionGroupXML.AppConnectionGroup.Packages.Package) { foreach ($pkg in $Packages) { if ($pkg.PackageId -ieq $item.PackageId -and $pkg.VersionId -like $item.VersionId) { $pkg.MemberOf += $package.Name } } } $connectionGroupXML = $null } if ($AppvConnectionGroups.Count -gt 0) { Write-AppVentiXDebugLog -Message 'Resolved connection groups' -Level Timing -Data @{ MachineGroup = "$($machineGroup.FriendlyName)" ContentSharePath = "$($GroupContentShare.Path)" ConnectionGroupCount = $AppvConnectionGroups.Count } } } } } Write-AppVentiXDebugLog -Message 'Finished retrieving Content Share packages' -Level Timing -Data @{ PackageCount = $Packages.Count MachineGroupCount = @($machineGroups).Count } return $Packages } else { Write-Warning 'AppVentiX is not licensed!' } Write-Verbose "Ending function 'Get-AppVentiXContentStorePackage'" } # SIG # Begin signature block # MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCK3vgIEfM87vOx # NnEaMa9njqVe7luuOSK6NYplEC4vNKCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAVFa+Mx # nPl8dnBSAAAABUVrMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMwHhcNMjYwODIzMTUwNzQwWhcNMjYwODI2 # MTUwNzQwWjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP # MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE # AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB # gQCoadbs6imFdxUR/W4zTGNMajYt0uhSP6siFelP12UeMcqpLnM+jzrWbBkXnpvV # C3CJ75gTbLEbjkqJq9neO1rwbTFkres7QfaG/tj7Lo+Ba0QoDewim3jcL8gxoV4U # vgOoM7CBs5mhDAeOxIcGSx9RfJjM0/e/zo9JjamFYutQJ2Z+fs40huxp9eVz/QwV # xUMoWbMYlpehR3uqUOAsRV5yyUFKSYJGjQp58oEY65F0LOhrGV0PigEOEJLlWuZY # xdCuc0gPIc+AEfMFJi7/khSvi1+hjVqmzlcw+EOFcNDZogZp56kDonPdE+LTJOT6 # DRYxgs7QimSRnEpbczQIF+mBKJZQFUG8Hv7q71FmvphE7vmM+paEQf0tE1sRjbc/ # n6v8SvzczlUAjmuNzXhsVVnfTc6ASL4srCuAYY32MlpCqdPpyMkmehVmT/41MiO0 # lDzIH1icdEL8LlxaMOxlBmUujf0FimNGa9HEAJahVnJlmBB5CjW1DBjtsHnrvbNA # h3kCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG # A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6 # gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUhiOKuVKC578YpMALM2rV7N0KgIswHwYDVR0j # BBgwFoAUpEMMf3ZapYXnPo0oDwwXokVpcMYwZwYDVR0fBGAwXjBcoFqgWIZWaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl # MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEE # aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB # JTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # DQYJKoZIhvcNAQEMBQADggIBADilFl3qUVaak/QuSR/cBpymNfS8S+cj7D/FqE5Y # Jm7ZmMW5YafPfLzOWv7Jc6hepqk6ianoLwzrjMWVueMEO6skW3pnbGe7WyT/UmM5 # 3Xefaidp0OLnyDx2NpTiLw/Py5G9vF1qfPosOv+nxRxx4taC2JzmvThJ6FitcQ87 # VU6CBv6kfp80LFcoFN8RCEGURnOPwA/enDoWK1m+fvu0u4mT03uYzLJfJgkL8kqc # jUk0NnSmn+KJeJjAd1CI2vQov2ceH+D5HyTeS6TkAYmswiU0trf8VKEwGbe1GT95 # Lnr1WlVk5ZRmlZC+yzY261qIpv+dtUKb3+blW7nVKpPyIQHAyv4PPpkmq9MdW1Ia # b/BpwpL1Adok/zmdE9sheJB1FPYoexiI6iiBlxn7WFG9UiUChFxJn3DRGDEfVorN # qEwpbPLablTHphbkb0NhqWKfC0xt/Ut8kf1e1SA8CuLRGWa82nc0D0vGokLetE+w # FJMW0cREjPLCgXWzSgfCTCc7U93MIit6qjZWBIQgSetwphCkxzLPebpKKklmpyrK # wDXHFsBSakXECtX3iRJJduhXydnkbWY+gR0fWn0b5gW3VuFZZt/7bfahN/g1yiYJ # v7yaYtKcIk5jtDdnBP6OB3g5arFO61x3P56uP9GCnjVwmRHj0jo+oWfof57UI9bU # NvzoMIIGpTCCBI2gAwIBAgITMwAFRWvjMZz5fHZwUgAAAAVFazANBgkqhkiG9w0B # AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAz # MB4XDTI2MDgyMzE1MDc0MFoXDTI2MDgyNjE1MDc0MFowaDELMAkGA1UEBhMCTkwx # FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE # ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN # BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAqGnW7OophXcVEf1uM0xjTGo2LdLo # Uj+rIhXpT9dlHjHKqS5zPo861mwZF56b1Qtwie+YE2yxG45KiavZ3jta8G0xZK3r # O0H2hv7Y+y6PgWtEKA3sIpt43C/IMaFeFL4DqDOwgbOZoQwHjsSHBksfUXyYzNP3 # v86PSY2phWLrUCdmfn7ONIbsafXlc/0MFcVDKFmzGJaXoUd7qlDgLEVecslBSkmC # Ro0KefKBGOuRdCzoaxldD4oBDhCS5VrmWMXQrnNIDyHPgBHzBSYu/5IUr4tfoY1a # ps5XMPhDhXDQ2aIGaeepA6Jz3RPi0yTk+g0WMYLO0IpkkZxKW3M0CBfpgSiWUBVB # vB7+6u9RZr6YRO75jPqWhEH9LRNbEY23P5+r/Er83M5VAI5rjc14bFVZ303OgEi+ # LKwrgGGN9jJaQqnT6cjJJnoVZk/+NTIjtJQ8yB9YnHRC/C5cWjDsZQZlLo39BYpj # RmvRxACWoVZyZZgQeQo1tQwY7bB5672zQId5AgMBAAGjggHUMIIB0DAMBgNVHRMB # Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr # BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFIYj # irlSgue/GKTACzNq1ezdCoCLMB8GA1UdIwQYMBaAFKRDDH92WqWF5z6NKA8MF6JF # aXDGMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy # MENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkG # BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQA4pRZd # 6lFWmpP0Lkkf3AacpjX0vEvnI+w/xahOWCZu2ZjFuWGnz3y8zlr+yXOoXqapOomp # 6C8M64zFlbnjBDurJFt6Z2xnu1sk/1JjOd13n2onadDi58g8djaU4i8Pz8uRvbxd # anz6LDr/p8UcceLWgtic5r04SehYrXEPO1VOggb+pH6fNCxXKBTfEQhBlEZzj8AP # 3pw6FitZvn77tLuJk9N7mMyyXyYJC/JKnI1JNDZ0pp/iiXiYwHdQiNr0KL9nHh/g # +R8k3kuk5AGJrMIlNLa3/FShMBm3tRk/eS569VpVZOWUZpWQvss2NutaiKb/nbVC # m9/m5Vu51SqT8iEBwMr+Dz6ZJqvTHVtSGm/wacKS9QHaJP85nRPbIXiQdRT2KHsY # iOoogZcZ+1hRvVIlAoRcSZ9w0RgxH1aKzahMKWzy2m5Ux6YW5G9DYalinwtMbf1L # fJH9XtUgPAri0RlmvNp3NA9LxqJC3rRPsBSTFtHERIzywoF1s0oHwkwnO1PdzCIr # eqo2VgSEIEnrcKYQpMcyz3m6SipJZqcqysA1xxbAUmpFxArV94kSSXboV8nZ5G1m # PoEdH1p9G+YFt1bhWWbf+232oTf4NcomCb+8mmLSnCJOY7Q3ZwT+jgd4OWqxTutc # dz+erj/Rgp41cJkR49I6PqFn6H+e1CPW1Db86DCCBygwggUQoAMCAQICEzMAAAAY # DeuRVamKAJgAAAAAABgwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx # MzJaFw0zMTAzMjYxODExMzJaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBBT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDI # gNpgNFaiif2VWeWP5I6PnFXxJ/lB37fJR55GCvR7GLZBMkBijbiKVwgpBI3xM5nf # 484znH/qncJ+OCq6y3jgnQW+R8Zd7U+7LjlrmcskalzSQ0ghMxEpnBW8/HHs2V8Z # JzQk6HP+SDsbvsL7LdlH/eO2l4mknhDBwr0Z/Q966TvEth5b8kCxj1vqiV4YNthL # GRqZR9u2fK/yBMWu83p6O4uo2Edg++gEew5IL7vnnnKFqmSh/R9vPJy3WF1YcZew # AUx8sXZNUnx3ZhVg59l2LpitPiwzE6FMqIsqaEvVe3MzuFd2a/uWDZH6VbDyUiRK # 78mIg1DQYA9zDEyyBFcNI+nxVSzglvL6u7PRuNqgcV3sf6ELxw89ysQM/Z4R1hRF # WXRpyOWKKAKtfBHTk0UnNiPcxmLMMYs8jeUjOidfVPjTIry/UVwnwxdlkK85cZfB # EMYZ/DBNOwdomP459Y1n8izKkbhsa+p4lw+cQVxATBFx9ggR79HhryT7HDmpPLvk # JvBZ4wW4CW32UT2SMyDe28nIOU3m+hfHlVeKcLBQcym5VoRDjIcCVI7uqgGW2PNM # E0cfei8zCwCy6HCsssJWFS7eg/YbFhnATJcyWfMrkNuAbMfMN8Npg8crS6jVVowy # D0GG5zdgi+uQVcSK/638mA1xEYK3pnIoQgO09uuDBwIDAQABo4IB3DCCAdgwDgYD # VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSkQwx/dlql # hec+jSgPDBeiRWlwxjBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C # AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl # oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z # b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy # MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp # ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB # DAUAA4ICAQBxxyBW+X6mhdRiSwD9PMMWcGUAnx5/QUwnNvZdFGEX+4DRDIr9WCh4 # C87wHtw+lg1D3uzK10DstPX0LFLBFAC3vWMYX4ImXwoLhoR0xlN8mUdorJ3bgnpC # JWuI1531Z1rCwPuUrSkBxfOIGDk3p2ECb3Ho/xHi5PRSR/OUrWuQHwXiaXMTuXu3 # IRLezwVkZpFmNwYRD57R9Nx2F/yM7tzOY0Hh0hGCaYEK38/6FrS0SXadXWyDUCfn # 5XOGACRjUCnHx+JQUG0f4SHD+iblpAI0gl+ZHnVmdXXxHTZeTa0CYCIhFxKP2922 # s0g6zLmeiV13LWUmtt/UF7TrWXpMi2/0UNniaDoH7rnPGRV5xVX8uXy4sZii4asw # zqPM7Y7+mzcranqZ8EjZk5gjLhQ3A2sZaprlOu8CaRmyfcIiVH7zVfgAvm81MWXF # ziAf7my7QOvnyEFPGddq8MSfPtfRyw/Uq3uH6KpoaJNIfPYH6fceZSi53Rat1A9g # rExq3ROjhhSpTcchuBItAMNVPxoKNbUm+iR/X3XkL+9WQginjyHe+hXLclY8vAGX # FD1p40PqMIpAYsmEJBFKW9df4//1N5oQDr/FY9IBJl/oSS979i5rtT7NZz9KvYra # CPRBGs0QCy+sWvgQa0coM70QJVLeVwmSxUO/0od0w9Qry7bSLrxGoDCCB54wggWG # 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 # Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMCEzMABUVr4zGc+Xx2 # cFIAAAAFRWswDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgIktVo1NtjCZn # /K1H6vWf/zNHfP6Oo4sgS1mc3T1lM6QwDQYJKoZIhvcNAQEBBQAEggGATuZIuIyw # I+KuBssK+L0ceTZ47T2twnH2/EkNPWTz70kdXYfvcO9fyBB1/q6tNDOqTmW3wBFi # 7SdQE7/BHGwRqcxtilIUhF0zQ2boY+LdpzfvCmZwEnLNTv5dklq91dSnLoALDIwM # i8UFwy4hw5e4yrHVzYOoOWHMVzbtsT221TU92f95KPgqhDrPvvLAyNOCtYe3Hdiq # IXbS/iEFRwSzNykFm0ZEN8W26FsSui52rcuWNjg4mLqoPusk28ZbATPpzTnAoiiB # tv1LwFfqKh1Ia4ru0wcr7AtkL7Iu8s0M/HE/K6YjHBW80l3FxtX6F9Pq9PGdjiQv # RFkSh7enc0zBPbDeoClGvV1O05wYOKBWdG0c/5HoSWWszMq1vg1/JhakMNYxGzoE # QVjMWY+pkY8zQUuyX72e7TJo90VpvkZecrNaZAUZUDdNFxcmX7TmkechkJtvfnq2 # yW20fqVOKIxFtYiaTaOGHKEEG8glVUFXd9zenBDON/3GWzS+TwQ1fsizoYIUsjCC # FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN # BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor # BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIOM+FhLxNUEJJtSFky2EhiRotWwT # Lv8KLEgzg7PQL/AZAgZqdgn3KrsYEzIwMjYwODI1MTI0MTI3LjM1MVowBIACAfSg # 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 # MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgTZei # JRArJXE5KGDpPTW2LwXEU1pykkkO6Aj6Y09yisUwgd0GCyqGSIb3DQEJEAIvMYHN # MIHKMIHHMIGgBCDLRbqx24bpscXEJ+Hjj9xrcUVw7R8OyyMfSB2YGK3+vDB8MGWk # YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg # MjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTAiBCBNMxyNMghIztULxf42vjoKkQ8X # 8cCWRPfBWYJMtXuHsTANBgkqhkiG9w0BAQsFAASCAgBBcJCQR0ALdCT9i8cBasz0 # y6WnPw3pKtjX/ylKrty5+AdGFRTjqJvXyHFi587j0KMKg1JnUnrD9wN2EpamNmRR # dWyI2LBBPzUG39NG9d+4JMmh1jORWo5nOS61UN4vOjk106d2xfVIu1biiF0bJLW+ # kLLLESxpYzdu6UH0AakFHMFX8/RBYtWpaLLZ5NT+Pg8cijbqJPqdWx5qS5qhlpFC # yuxYMOX3duM7I/qdIUwNS53XkLDAwXANLoy2tWBEJrUepBJA1/Jm2a00TOSqN/oa # 5RmjyHuTpAmhAV5QF9vlpAJkBoeF3HmnR5EBdEvglhnClfqjf55yOUMzo7fc0Gxi # P66focXqZz0OyURNqsT2ksQVDFSX4HfOhPWfC646n0tw51A5dYVjed74HhUwkTl7 # QiOLjGgtIkhitu2cRbHM8+SZ1pI/jVQllGMwNXPSz6CVKvyePVzXEef+WJ8x230X # tCbEpoMa3ZcV1XekW1FIoxRlRo0yqy6Wg/CJQyOKIISeOkTUmqbBHgU03FVZeBED # Pqc2L05fV0MiTRpkRTpgJegRMAUogMnjleCkSnvBxtUIpHZpCryULT6KLzMOsE6o # B1BvKz42J2630XwElKaM8sbfJM0v/Vg0mo4d2QeOv4/kSlWrpb33M4B0chZm09b+ # UTu4wR2AeQNMirL7ulkeYA== # SIG # End signature block |