Public/Find-LnvUpdate.ps1
|
<#
.Synopsis Finds available updates based on the System Update content .Description This script allows users to search for updates for a specified machine type. -Defaults to Windows 10 updates -Requires users to enter at least a machine type -Can be called without identifiers so long as you use the right order -PackageType can be: 1: Application 2: Driver 3: Bios 4: Firmware -RebootType can be: 0: No reboot required 1: Forced reboot (update itself initiates the reboot) 3: Requires reboot (Thin Installer/System Update/CV initiates the reboot) 4: Forces shutdown (update itself initiates shutdown) 5: Delayed forced reboot (used for firmware, Thin Installer/System Update/CV will enforce reboot with dialog displaying count-down timer) -Severity can be: 1: Critical 2: Recommended 3: Optional Note: 9 can be used for these three parameters to represent 'All'. Multiples can be combined by seperating with comma, for example: "2,3,4" or "1,5" or "1,2" Find-LnvUpdate displays a grid-view of the result by default. A single selected update can be returned when the grid-view is closed. Therefore, execute the following to display the search results and then capture the selected update object: > $update = Find-LnvUpdate -MachineType 21DD -WindowsVersion 11 Then it is possible to view the attributes of the update like this: > $update ID : n3jw603w Name : Qualcomm Bluetooth Driver - 11 (21H2 or later) Category : Bluetooth and Modem Version : 2.0.0.488 PackageType : 2 Reboot : 3 Severity : 1 Descriptor : https://download.lenovo.com/pccbbs/mobiles/n3jw603w_2_.xml PackageExe : https://download.lenovo.com/pccbbs/mobiles/n3jw603w.exe It is then possible to get the executable or the package descriptor like this: > start $update.Descriptor To get an object list of all the updates, specify -ListAll .PARAMETER MachineType Mandatory: True .PARAMETER PackageType Mandatory: False .PARAMETER RebootType Mandatory: False .PARAMETER Severity Mandatory: False .PARAMETER WindowsVersion Mandatory: False .PARAMETER PackageID Mandatory: False .PARAMETER ListAll Mandatory: False .Example -Find-LnvUpdate -MachineType 20C1 -PackageType 2 -RebootType 1 -WindowsVersion 11 -ListAll .Example -Find-LnvUpdates 20C1 2 .Example -Find-LnvUpdate 20C1 -PackageType 2 #> function Find-LnvUpdate { param ( [ValidateLength (4,4)] [parameter(position = 0, Mandatory = $true, helpMessage = "Enter the four-charcter Machine Type")] [String] $MachineType, [parameter(position = 1, Mandatory = $false )][ValidateSet("1","2","3","4","9")] [String] $PackageType = "9", [parameter(position = 2, Mandatory = $false )][ValidateSet("0","1","3","4","5","9")] [String] $RebootType = "9", [parameter(position = 3, Mandatory = $false )][ValidateSet("1","2","3","9")] [String] $Severity = "9", [parameter(position = 4, Mandatory = $false )][ValidateSet("10","11")] [String] $WindowsVersion = "10", [parameter(position = 5, Mandatory = $false )][String] $PackageID = "", [parameter(position = 6, Mandatory = $false )][Switch] $ListAll ) $url_1 = "http://download.lenovo.com/catalog/" + $MachineType + "_win" + $WindowsVersion + ".xml" try { [xml]$systemUpdates_1 = Get-LnvXmlFilePvt $url_1 } catch { Write-Output $_ return } $locations_1 = $systemUpdates_1.packages.package.location $categories_1 = $systemUpdates_1.packages.package.category #Create table format to display information about the updates $tbl = New-Object System.Data.DataTable "Available Updates" $col0 = New-Object System.Data.DataColumn ID $col1 = New-Object System.Data.DataColumn Name $col2 = New-Object System.Data.DataColumn Category $col3 = New-Object System.Data.DataColumn Version $col4 = New-Object System.Data.DataColumn PackageType $col5 = New-Object System.Data.DataColumn Reboot $col6 = New-Object System.Data.DataColumn Severity $col7 = New-Object System.Data.DataColumn Descriptor $col8 = New-Object System.Data.DataColumn PackageExe $tbl.Columns.Add($col0) $tbl.Columns.Add($col1) $tbl.Columns.Add($col2) $tbl.Columns.Add($col3) $tbl.Columns.Add($col4) $tbl.Columns.Add($col5) $tbl.Columns.Add($col6) $tbl.Columns.Add($col7) $tbl.Columns.Add($col8) $counter = 0 #Go through the updates and find the filtered results $count = $locations_1.Count foreach ($update in $locations_1) { try { [xml] $up2 = Get-LnvXmlFilePvt $update } catch { Write-Output $_ $counter++ $percent_complete = (($counter/$count)*100) Write-Progress -Activity "Processing $count updates..." -PercentComplete $percent_complete continue # Write-Output -InputObject "Could not find the update descriptor file: $update" } $luPID = $up2.Package.id $luCat = $categories_1[$counter] $luName = $up2.Package.Title.Desc.InnerText $luVer = $up2.Package.version $luTyp = $up2.Package.PackageType.type $luReb = $up2.Package.Reboot.type $luSev = $up2.Package.Severity.type $luXml = $update $luExe = $update.Substring(0, $update.LastIndexOf('/') + 1) + ($up2.Package.Files.Installer.File.Name) if ((($PackageType -eq 9) -or ($PackageType -match $luTyp)) -and (($RebootType -eq 9) -or ($RebootType -match $luReb)) -and (($Severity -eq 9) -or ($Severity -match $luSev)) -and (($PackageID -eq "") -or ($PackageID.ToLower() -eq $luPID.ToLower()))) { $row = $tbl.NewRow() $row.ID = $luPID $row.Name = $luName $row.Category = $luCat $row.Version = $luVer $row.PackageType = $luTyp $row.Reboot = $luReb $row.Severity = $luSev $row.Descriptor = $luXml $row.PackageExe = $luExe $tbl.Rows.Add($row) } $counter++ $percent_complete = (($counter/$count)*100) Write-Progress -Activity "Processing $count updates..." -PercentComplete $percent_complete } if ($ListAll) { return $tbl } else { $selection = ($tbl | Out-GridView -OutputMode Single -Title 'Found updates') if ($null -ne $selection) { $selection } } } # SIG # Begin signature block # MIItfQYJKoZIhvcNAQcCoIItbjCCLWoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUnODBhiF2qkwXx+hrtUkMt50p # xjWggialMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B # AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz # 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS # 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7 # bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI # SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH # trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14 # Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2 # h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt # 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR # iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER # ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K # Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd # BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC # hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS # b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV # HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh # hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO # 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo # 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h # UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x # aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig # AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw # ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y # q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX # FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe # TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu # yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I # 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg # Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse # 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy # Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh # HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/ # Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID # AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p # bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY # ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN # Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4 # i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ # EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM # MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD # parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK # Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP # 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS # oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T # dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGrjCCBJagAwIBAgIQBzY3tyRU # fNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcN # MzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEy # NTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC # AgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+k # iPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+va # PcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RB # idx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn # 7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAx # E6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB # 3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNC # aJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklS # UPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP # 015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXi # YKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZ # MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCP # nshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQE # AwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j # cnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJ # YIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULh # sBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAl # NDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XN # Q1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ # 8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDn # mPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsd # CEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcm # a+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+ # 8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6 # KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAj # fwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucT # Dh3bNzgaoSv27dZ8/DCCBrAwggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJ # KoZIhvcNAQEMBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVow # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQ # KK14t13VOVkbsYhC9TOM6z2Bl3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a # +dLVZxpSTw6hV/yImcGRzIEDPk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oT # pkyzASAl8xDTi7L7CPCK4J0JwGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJ # cEIyj/vG6hzzZWiRok1MghFIUmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV # 0Tf+GgaUwnzI6hsy5srC9KejAw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EP # bqOrbZgGgxu3amct0r1EGpIQgY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzV # svk4EObqzpH1vtP7b5NhNFy8k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy # 6OjsCqewAyuRsjZ5vvetCB51pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG # 7NS3DVPQ+EfmdTCN7DCTdhSmW0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia # 3CYrAfSJTVnbeM+BSj5AR1/JgVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU// # Y09Mu6oNCFNBfFg9R7P6tuyMMgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNV # HSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy # dXN0ZWRSb290RzQuY3JsMBwGA1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0G # CSqGSIb3DQEBDAUAA4ICAQA6I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKx # AMqvbDAnExKekESfS/2eo3wm1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi # 91qqkM/1k2rj6yDR1VB5iJqKisG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D # +D6U/3Y5PZ7Umc9K3SjrXyahlVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4 # Ttpuuzad++UhU1rDyulq8aI+20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1 # c1LLRtjENByipUuNzW92NyyFPxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3 # N4qLCaHLC+kxGv8uGVw5ceG+nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PB # VhsrI/+PteqIe3Br5qC6/To/RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcq # LxDEDAhkPDOPriiMPMuPiAsNvzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJc # FWbMbA7KxYbD9iYzDAdLoNMHAmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9 # oKcfBnTn8tZSkP2vhUgh+Vc7tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4 # TjCCBrwwggSkoAMCAQICEAuuZrxaun+Vh8b56QTjMwQwDQYJKoZIhvcNAQELBQAw # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQTAeFw0yNDA5MjYwMDAwMDBaFw0zNTExMjUyMzU5NTlaMEIxCzAJBgNVBAYT # AlVTMREwDwYDVQQKEwhEaWdpQ2VydDEgMB4GA1UEAxMXRGlnaUNlcnQgVGltZXN0 # YW1wIDIwMjQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+anOf9pUh # q5Ywultt5lmjtej9kR8YxIg7apnjpcH9CjAgQxK+CMR0Rne/i+utMeV5bUlYYSuu # M4vQngvQepVHVzNLO9RDnEXvPghCaft0djvKKO+hDu6ObS7rJcXa/UKvNminKQPT # v/1+kBPgHGlP28mgmoCw/xi6FG9+Un1h4eN6zh926SxMe6We2r1Z6VFZj75MU/HN # mtsgtFjKfITLutLWUdAoWle+jYZ49+wxGE1/UXjWfISDmHuI5e/6+NfQrxGFSKx+ # rDdNMsePW6FLrphfYtk/FLihp/feun0eV+pIF496OVh4R1TvjQYpAztJpVIfdNsE # vxHofBf1BWkadc+Up0Th8EifkEEWdX4rA/FE1Q0rqViTbLVZIqi6viEk3RIySho1 # XyHLIAOJfXG5PEppc3XYeBH7xa6VTZ3rOHNeiYnY+V4j1XbJ+Z9dI8ZhqcaDHOoj # 5KGg4YuiYx3eYm33aebsyF6eD9MF5IDbPgjvwmnAalNEeJPvIeoGJXaeBQjIK13S # lnzODdLtuThALhGtyconcVuPI8AaiCaiJnfdzUcb3dWnqUnjXkRFwLtsVAxFvGqs # xUA2Jq/WTjbnNjIUzIs3ITVC6VBKAOlb2u29Vwgfta8b2ypi6n2PzP0nVepsFk8n # lcuWfyZLzBaZ0MucEdeBiXL+nUOGhCjl+QIDAQABo4IBizCCAYcwDgYDVR0PAQH/ # BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYD # VR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1N # hS9zKXaaL3WMaiCPnshvMB0GA1UdDgQWBBSfVywDdw4oFZBmpWNe7k+SH3agWzBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl # cnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggr # BgEFBQcBAQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu # Y29tMFgGCCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln # aUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0G # CSqGSIb3DQEBCwUAA4ICAQA9rR4fdplb4ziEEkfZQ5H2EdubTggd0ShPz9Pce4FL # Jl6reNKLkZd5Y/vEIqFWKt4oKcKz7wZmXa5VgW9B76k9NJxUl4JlKwyjUkKhk3aY # x7D8vi2mpU1tKlY71AYXB8wTLrQeh83pXnWwwsxc1Mt+FWqz57yFq6laICtKjPIC # YYf/qgxACHTvypGHrC8k1TqCeHk6u4I/VBQC9VK7iSpU5wlWjNlHlFFv/M93748Y # TeoXU/fFa9hWJQkuzG2+B7+bMDvmgF8VlJt1qQcl7YFUMYgZU1WM6nyw23vT6QSg # wX5Pq2m0xQ2V6FJHu8z4LXe/371k5QrN9FQBhLLISZi2yemW0P8ZZfx4zvSWzVXp # Ab9k4Hpvpi6bUe8iK6WonUSV6yPlMwerwJZP/Gtbu3CKldMnn+LmmRTkTXpFIEB0 # 6nXZrDwhCGED+8RsWQSIXZpuG4WLFQOhtloDRWGoCwwc6ZpPddOFkM2LlTbMcqFS # zm4cd0boGhBq7vkqI1uHRz6Fq1IX7TaRQuR+0BGOzISkcqwXu7nMpFu3mgrlgbAW # +BzikRVQ3K2YHcGkiKjA4gi4OA/kz1YCsdhIBHXqBzR0/Zd2QwQ/l4Gxftt/8wY3 # grcc/nS//TVkej9nmUYu83BDtccHHXKibMs/yXHhDXNkoPIdynhVAku7aRZOwqw6 # pDCCB1YwggU+oAMCAQICEAH2OVfKsi5/gxE0YVpt8UAwDQYJKoZIhvcNAQELBQAw # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTAeFw0yNDAyMjgwMDAwMDBaFw0yNTA1MjQyMzU5NTlaMF4xCzAJ # BgNVBAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEUMBIGA1UEBxMLTW9y # cmlzdmlsbGUxDzANBgNVBAoTBkxlbm92bzEPMA0GA1UEAxMGTGVub3ZvMIICIjAN # BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvQG1vNNHS34jqP4ExAKEkPeGrbyn # 0EAseZ0nI/OPSzjBWXtKkumwgsi6rqgRD7wCrxncDH5TtuW5pDbiYMffX3mwbM3Q # uzGPgyBcnd0eWr57yHKbPQ8j53QviIP6uX2C6H0HZujjVgWfjPwPkOfF8fqgl9dh # ZX8wVJvwJDUGLUzQMkyiIPV1/JmKUHnVi1ClEJBR4DSmv+6obQ01rlNaLK64RdeJ # iAnZmvnw+qo1N0bwG733A+OLEVhjMSvZ47/AhFvmLYPJ95mw4wa71a4E+2dGbR4i # N/3fX3Hr3+F4WCk1hy3F7RXTm5yr+IcNRwWtJ527jeRqxruWaWvJK8SPCwUcPWhg # qdzlGGzakCtwonIac0XC86ChEcau+3JYXuVD/fvXt0Gv9jXYEXN53P7QOhxyTpNz # p/ghLX3KSrK6pn4+niqb+cXPeyjbd+T29HjCQG9PGBwNRum7c8N5IcN68VHi8gdE # ecWjSmdPO9jguXQrHRuFkmEzf1wWHw5s9BR4TMwHT2O5D6PJZPcjAZakBoqehKPE # VAH0gMa2RICeTf1/ikuAOvFU9Q/in9F9jN0shDDz/SEoRU7OpD4C88gRGB8y0p0a # +EKCGFRT/drApdumRPmMQmMLREZDVOxNuN9irY3w5fql74cthz5bX6NkvvFpcJds # SD6M/bcEk6FKcyECAwEAAaOCAgMwggH/MB8GA1UdIwQYMBaAFGg34Ou2O/hfEYb7 # /mF7CIhl9E5CMB0GA1UdDgQWBBRagjd2MdLvV1XeyO0tkBGfG8YjWDA+BgNVHSAE # NzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0 # LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1 # BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3Js # MFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk # RzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDCBlAYIKwYBBQUH # AQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBc # BggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQwCQYD # VR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEAvEuiwGr7vMBryz2z53c2L9ZEaZGT # YQfZrOy9/lpeYpHJ0ongWlyYmeGgl1vxHQP8+0xHctTtTC3ZaBVk6n/d8/53JYi2 # gmOJF6RHYnlGK+/r+Js3mm3Xu57fZkrqQciV0flPqjNlMZ5VYWtfhgbEeqM1Fnsa # rk9owJzhpWeBAVKXUG3dnxaNWJrH5ykCCphW0lCpZ18qezRTEB6PoNas9Y/wJuCB # 1jwuse5N9kJjbJxG01dblVm4vbQhtH2+fS6hB6+c/8rBR/vh0hubJkFCc0n0YoBe # JRtsYxiWk2hTDklF/rRyic+WDg+nsMUKTliBnbLWLyQYYk11uLBSXAabv/Aj8ywC # DiPsf/13l+CdBhtiDKEx+Jofkn4LTGblVSSiVbpgyuKVooUwNnH26nBKlzgAfS25 # rpLAHAxjEW9rq81jQyXBYxSuETciZjv/J2DKkK22dNOURX4RpvPrF4wUkhAj6gmj # bRzZmhEZwWBlW6L1ljuYFXLqlx549BTiTEGf3SsBphOLkTS/I3FbQXrFbetXg42A # znsVcor/ejFU2EL7wMBjC2lS4RZgfRixOzSiGBCbDm+yhOAPD5vAZWYsOiyzjtSG # CDOpXjJdTqKkcWgU9NU85+p/2rCYzHCl09KuGDnOoqLmpJAI+HyzCK79s4eAlsjo # uUwbomBag565bEMxggZCMIIGPgIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBD # b2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAH2OVfKsi5/gxE0 # YVpt8UAwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJ # KoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQB # gjcCARUwIwYJKoZIhvcNAQkEMRYEFPV84ZvNQ/2Gpa/RWS1HK7vYWq7GMA0GCSqG # SIb3DQEBAQUABIICABijX8TGfIvnpzRHaPd5KvOoAiI/IBYoP963on6cwmJsoS+F # twQLYSFTr1EVkJSTTjlIsBH5a5OhnSvv82/7OYG4MLRxoD853xy+NeOUtAxC7wt9 # K3opdQKkfUgslPg89RYh3eYl757vLMYnns1H0/ilid9NyugfWnEzeH7hpgimrDEl # W8u/84rsoxXyLt5Q0HpAHUsGOcE8apHyFc0Svd/A9mpssT91080luUU8rdF7tGxD # NmchKck2uIBgo9QquWYtokpeXb+S6TjM4Rf9tpgbSl8SOSvU6LMUsee3Yck4DOyO # TBfqw0KXomlrEjj7q5xciXoSlezy6pugWHV8t1pEHPVQQuVzUd/8mszbLKP8KmjC # cbB7kE+6mausEk7d0vN33TyVYTh0BT26F/qCrY+IR7f3rs2Jbl8ihNHDXRtsANRg # BD93grDxxm26523EUHAN/kZ8A9TL3EQP6Xdcb2rPaHvSvTijPlze1R7ohn9SmvG/ # 3CdL7uJuW+F2BZj5FCZYYY8hwNZF0VPM7gcbuC/MzIb0J1DVTmJ7GiBrm2re7lVc # rh14WV2cWP2odX20v16iwwU2qXX75dQIQz/Ll7t1SBXZ7LBXJRnWLmxuN1lFDc82 # QNPG0AyBRajPo3FhHT489CKVVbAubJ8I33hFP1J7OPkFixkmB68Xys86u8TxoYID # IDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAV # BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVk # IEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQC65mvFq6f5WHxvnp # BOMzBDANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEw # HAYJKoZIhvcNAQkFMQ8XDTI0MTIxMTE0MjE1NVowLwYJKoZIhvcNAQkEMSIEIL61 # zCnr1Wf4EsnLaavxRvN2dHjJWW4LYDRzZwqvdcO/MA0GCSqGSIb3DQEBAQUABIIC # AARJ//G3dFQERFD6dYYJFkcd2qWYbs/ttPqQW7ZCsunPIZMOZGhMNOC304m1vJIG # 9lFvfna/NCdtqx9cbjRabmyP3qegbNheNx2O/Y0YqiRa8RpxcJLFDSWmmjvKx8Ow # BM8PUXPIGnflG1hYgb4qOZoZb0UtNoKUnY4Njs/yQzja20uo6lP/T/6991daRXSy # +nH+QJbc6d3uSdysAcMCI7FsybaRyikbhNK1okVK0+gHqtz4zH0DpdDVYvbzeX4Q # lpdlLs5Knu7EHbEtULPCTXoI13sz9hZcQgVQkOk44l0dc2c+0yJ7pSOPgU+SCRme # RICR/qnKyUzlceTtwV/ncYPaLwl7/eIKrxPAWC+V5P63dQVhXTrwprz78UmfCND3 # 7gQT2XjZoDD0GSnnqTVBauCTF7QCgFy4kqh3YR/zpb8Aa+M9HhZJ31Mtcps7X7qH # PiXSNSvjCy8Fd88dUmnkj2DIRw9rgpSRYU1p5XQHhVzmxG0xmYEQ5p02pQQ6P0Zd # EK5wM7xVdhHbgIFrLEqzbTzVRKH/YRiXNTEoaWOTh4hcrXuaR4MBlt3EOBHlfvfx # 2MlEYS8X5sl15G/8jI5HOky5BTwQvYM9PhjE45MxtqyT8WvYTZsG/vkh8BKfq503 # kLSSQv9te2OlhENDT70pEd3CPjzbo5HD64HlL+QK4wYz # SIG # End signature block |