public/Set-AppVentiXPublishingTask.ps1

<#
    .SYNOPSIS
        Updates the properties of an AppVentiX publishing task.
 
    .DESCRIPTION
        The Set-AppVentiXPublishingTask function is used to update the properties of an existing AppVentiX publishing task. It allows you to modify the ID, MachineGroupFriendlyname, Group, and Priority of the task.
 
    .PARAMETER Id
        Specifies the ID of the publishing task to be updated. The ID must be a valid GUID.
 
    .PARAMETER MachineGroupFriendlyname
        Specifies the friendly name of the machine group associated with the publishing task. If this parameter is not provided, the machine group friendly name will not be changed.
 
    .PARAMETER Group
        Specifies the group name associated with the publishing task. The group name should contain the domain name and the group name, e.g., "DOMAIN.LOCAL\GROUP". If this parameter is not provided, the group name will not be changed.
 
    .PARAMETER Priority
        Specifies the priority of the publishing task. If this parameter is not provided, the priority will not be changed.
 
    .PARAMETER ConfigShare
        Specifies the configuration share path. If this parameter is not provided, the default configuration share path will be used.
 
    .EXAMPLE
        Set-AppVentiXPublishingTask -Id "12345678-1234-1234-1234-1234567890AB" -MachineGroupFriendlyname "MyMachineGroup" -Group "DOMAIN\GROUP" -Priority 1 -ConfigShare "\\server\share"
 
        This example updates the properties of the publishing task with the specified ID. It changes the machine group friendly name to "MyMachineGroup", the group name to "DOMAIN\GROUP", the priority to 1, and uses the specified configuration share path.
 
    .NOTES
        Function : Set-AppVentiXPublishingTask
        Author : John Billekens
        Copyright: (c) John Billekens Consultancy & AppVentiX
        Version : 2026.130.1000
        Requires : Valid AppVentiX license
#>


function Set-AppVentiXPublishingTask {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [ValidateScript({
                if ( [guid]::TryParse("$_", $([ref][guid]::Empty)) ) {
                    $true
                } else {
                    throw [System.Management.Automation.ValidationMetadataException] "The ID '${_}' is not a valid GUID."
                }
            })]
        [ValidateNotNullOrEmpty()]
        [String]$Id,

        [Parameter()]
        [String[]]$MachineGroupFriendlyname,

        [Parameter()]
        [ValidateScript({
                $invalidGroups = $_ | Where-Object { $_ -notmatch '^.*\.*$' }
                if ($invalidGroups) {
                    throw "The following group names are invalid: $($invalidGroups -join ', ')"
                }
                return $true
            })]
        [String[]]$Group,

        [Parameter()]
        [int]$Priority,

        [Alias('Config', 'Share', 'AppVentixConfigShare')]
        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [String]$ConfigShare = $Script:AppVentix.ConfigShare
    )
    if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {

        $publishingTasksFullname = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentiX.PublishingTasksFilename
        Write-Verbose "Reading data from $($publishingTasksFullname)"
        $publishingTasksXml = New-Object -TypeName System.Xml.XmlDocument
        try {
            $publishingTasksXml.Load($publishingTasksFullname)
        } catch {
            Write-Verbose "Could not load the Publishing Tasks file, $($_.Exception.Message)"
            if (Test-Path -Path $publishingTasksFullname) {
                Write-Warning "The Publishing Tasks file exists but is not accessible!"
                throw "The Publishing Tasks file exists but is not accessible!"
            } else {
                Write-Warning "The Publishing Tasks file does not yet exists, creating a new file!"
            }
        }
        $publishingTasksXml = Format-AppVentiXPublishingTasksXml -XmlDocument $publishingTasksXml
        $publishingTask = $publishingTasksXml.SelectSingleNode("//Task[Id='$($Id)']")
        Write-Verbose "Function needs to change Group: $($PSBoundParameters.ContainsKey("Group"))"
        Write-Verbose "Function needs to change MachineGroupFriendlyname: $($PSBoundParameters.ContainsKey("MachineGroupFriendlyname"))"
        Write-Verbose "Function needs to change Priority: $($PSBoundParameters.ContainsKey("Priority"))"
        $isChanged = $false
        if (($publishingTask | Measure-Object).Count -eq 1) {
            if ($PSBoundParameters.ContainsKey("Group") -and (-not ([String]::IsNullOrEmpty($Group)) -or $Group.Count -gt 0)) {
                Write-Verbose "Group was changed to `"$($Group -join ', ')`""
                $groupSID = @()
                $NewADGroup = @()
                foreach ($ADGroup in $Group) {
                    if ($ADGroup -notmatch '^([\w-]+\.){1,}[\w-]+\\.+$') {
                        Write-Warning "The parameter -Group should contain the fully qualified domain name and the groupname, e.g. `"DOMAIN.LOCAL\GROUP`""
                        Write-Warning "Falling back on default (user dns) value: `"$($env:USERDNSDOMAIN)\$ADGroup`""
                        try {
                            if ($ADGroup -like "*\*") {
                                $null, $ADGroup = "$ADGroup".split('\')
                            }
                            $ADGroup = "$($env:USERDNSDOMAIN)\$ADGroup"
                            Write-Verbose "Group value modified to: `"$ADGroup`""
                        } catch {
                            $ADGroup = "$($env:USERDNSDOMAIN)\$ADGroup"
                            Write-Verbose "Group value modified to: `"$ADGroup`", but an error occurred: $($_.Exception.Message)"
                        }
                        if ($ADGroup -notmatch '^([\w-]+\.){1,}[\w-]+\\.+$') {
                            throw "Cannot determine fully qualified domain name for group `"$ADGroup`"! Please specify the fully qualified domain name and the groupname, e.g. `"DOMAIN.LOCAL\GROUP`""
                        }
                    } else {
                        Write-Verbose "Group value is valid: `"$ADGroup`""
                    }
                    $NewADGroup += $ADGroup
                    Write-Verbose "Continuing with Group value: `"$ADGroup`""
                }
                $CurrentADGroup = @($publishingTask.SelectNodes("Group"))
                if ($CurrentADGroup.Count -gt 0) {
                    foreach ($adGrp in $CurrentADGroup) {
                        Write-Verbose "Removing ADGroup element with value `"$($adGrp.InnerText)`" from the publishing task"
                        $null = $publishingTask.RemoveChild($adGrp)
                    }
                    Write-Verbose "Removed ADGroup element from the publishing task"
                } else {
                    Write-Warning "No ADGroup element found in the publishing task"
                }

                $CurrentADGroupSID = @($publishingTask.SelectNodes("ADGroupSID"))
                if ($CurrentADGroupSID.Count -gt 0) {
                    foreach ($adGrpSID in $CurrentADGroupSID) {
                        Write-Verbose "Removing ADGroupSID element with value `"$($adGrpSID.InnerText)`" from the publishing task"
                        $null = $publishingTask.RemoveChild($adGrpSID)
                    }
                    Write-Verbose "Removed ADGroupSID element from the publishing task"
                } else {
                    Write-Warning "No ADGroupSID element found in the publishing task"
                }
                if ($NewADGroup.Count -gt 0) {
                    Write-Verbose "Setting $($NewADGroup.Count) new Group values"
                    foreach ($ADGroup in $NewADGroup) {
                        Write-Verbose "Setting Group to `"$ADGroup`""
                        $null = $($publishingTask.AppendChild($publishingTasksXml.CreateElement("Group"))).AppendChild($publishingTasksXml.CreateTextNode($ADGroup))
                        try {
                            $groupSID = ''
                            Write-Verbose "Retrieving the SID for group `"$ADGroup`""
                            $groupSID = Get-GroupSID -GroupName $ADGroup -ErrorAction Stop
                            if ([String]::IsNullOrEmpty($groupSID)) {
                                Write-Warning "Could not retrieve the SID for group `"$ADGroup`"."
                                $groupSID = ""
                            } else {
                                Write-Verbose "The SID for group `"$ADGroup`" is `"$groupSID`""
                            }
                        } catch {
                            Write-Verbose "Could not retrieve the SID for group `"$ADGroup`", $($_.Exception.Message)"
                            $groupSID = ""
                        }
                        $null = $($publishingTask.AppendChild($publishingTasksXml.CreateElement("ADGroupSID"))).AppendChild($publishingTasksXml.CreateTextNode($groupSID))
                    }
                    Write-Verbose "Group was changed to `"$($NewADGroup -join ', ')`""
                } else {
                    Write-Warning "No Group value provided to set in the publishing task"
                }
                $isChanged = $true
            } else {
                Write-Verbose "Group was not changed"
            }
            if ($PSBoundParameters.ContainsKey("MachineGroupFriendlyname") -and (-not ([String]::IsNullOrEmpty($MachineGroupFriendlyname)) -or $MachineGroupFriendlyname.Count -gt 0)) {
                Write-Verbose "MachineGroupFriendlyname was changed to `"$MachineGroupFriendlyname`""
                Write-Verbose "Checking the machine group `"$MachineGroupFriendlyname`""
                if (([String]::IsNullOrEmpty($MachineGroupFriendlyname)) -or $MachineGroupFriendlyname.Count -eq 0 -or ($MachineGroupFriendlyname -contains 'All Machine Groups')) {
                    $MachineGroupFriendlyname = @('All Machine Groups')
                    $MachineGroup = 'All'
                } else {
                    try {
                        $machineGroupData = @()
                        foreach ($mg in $MachineGroupFriendlyname) {
                            $machineGroupResult = Get-AppVentiXMachineGroup -Name $mg -ConfigShare $ConfigShare
                            if ($null -eq $machineGroupResult.FriendlyName -or $machineGroupResult.FriendlyName -notlike $mg) {
                                throw "Machine group `"$mg`" not found!"
                            } else {
                                $machineGroupData += $machineGroupResult
                            }
                        }
                    } catch {
                        Write-Error $_
                        throw "Error retrieving machine group(s) `"$($MachineGroupFriendlyname -join ', ')`": $($_.Exception.Message)"
                    }
                    $MachineGroupFriendlyname = @($machineGroupData | Select-Object -ExpandProperty FriendlyName)
                    $machineGroup = @($machineGroupData | Select-Object -ExpandProperty GroupName)
                }
                #$adGroupSID = @($publishingTask.SelectNodes("ADGroupSID"))
                $CurrentMachineGroupFriendlyname = @($publishingTask.SelectNodes("MachineGroupFriendlyname"))
                $CurrentMachineGroup = @($publishingTask.SelectNodes("MachineGroup"))
                if ($CurrentMachineGroupFriendlyname.Count -gt 0) {
                    foreach ($mgfn in $CurrentMachineGroupFriendlyname) {
                        Write-Verbose "Removing MachineGroupFriendlyname element with value `"$($mgfn.InnerText)`" from the publishing task"
                        $null = $publishingTask.RemoveChild($mgfn)
                    }
                    Write-Verbose "Removed MachineGroupFriendlyname element from the publishing task"
                } else {
                    Write-Warning "No MachineGroupFriendlyname element found in the publishing task"
                }
                if ($CurrentMachineGroup.Count -gt 0) {
                    foreach ($mg in $CurrentMachineGroup) {
                        Write-Verbose "Removing MachineGroup element with value `"$($mg.InnerText)`" from the publishing task"
                        $null = $publishingTask.RemoveChild($mg)
                    }
                    Write-Verbose "Removed MachineGroup element from the publishing task"
                } else {
                    Write-Warning "No MachineGroup element found in the publishing task"
                }
                if ($MachineGroupFriendlyname.Count -gt 0) {
                    foreach ($mgfn in $MachineGroupFriendlyname) {
                        $null = $($publishingTask.AppendChild($publishingTasksXml.CreateElement("MachineGroupFriendlyname"))).AppendChild($publishingTasksXml.CreateTextNode($mgfn))
                        Write-Verbose "MachineGroupFriendlyname set to '$mgfn'"
                    }
                }
                if ($MachineGroup.Count -gt 0) {
                    foreach ($mg in $MachineGroup) {
                        $null = $($publishingTask.AppendChild($publishingTasksXml.CreateElement("MachineGroup"))).AppendChild($publishingTasksXml.CreateTextNode($mg))
                        Write-Verbose "MachineGroup set to '$mg'"
                    }
                }
                Write-Verbose "MachineGroupFriendlyname was changed to `"$($MachineGroupFriendlyname -join ', ')`""
                $isChanged = $true
            } else {
                Write-Verbose "MachineGroupFriendlyname was not changed"
            }

            if ($PSBoundParameters.ContainsKey("Priority") -and $Priority -ge 0) {
                $publishingTask.Priority = $Priority
                Write-Verbose "Priority was changed to `"$Priority`""
                $isChanged = $true
            } else {
                Write-Verbose "Priority was not changed"
            }
        } elseif (($publishingTask | Measure-Object).Count -gt 1) {
            Write-Error "Multiple Publishing Tasks with ID `"$Id`" found while expecting only one!" -ErrorAction Stop
        } else {
            Write-Error "The Publishing Task with ID `"$Id`" does not exist!" -ErrorAction Stop
        }
        if ($isChanged) {
            Write-Verbose "Saving the Publishing Tasks file"
            try {
                $publishingTasksXml.Save($publishingTasksFullname)
                Write-AppVentiXLogEntry -Feature Application -Action $($MyInvocation.MyCommand.Name) -Details "Changed the Publishing Task, Package name: `"$($publishingTask.Name)`", Path: `"$($publishingTask.Path)`"" -ConfigShare $ConfigShare
            } catch {
                Write-Error "Could not save the Publishing Tasks file, $($_.Exception.Message)"
                throw "Could not save the Publishing Tasks file, $($_.Exception.Message)"
            }
        } else {
            Write-Verbose "No changes were made to the Publishing Task with ID `"$Id`""
        }
    } else {
        Write-Warning 'AppVentiX is not licensed!'
    }
}

# SIG # Begin signature block
# MIImdwYJKoZIhvcNAQcCoIImaDCCJmQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBKGmDkuYIckU2i
# Q5jJBioPfO0U4Mi0Dn/q8GpaneuoVKCCIAowggYUMIID/KADAgECAhB6I67aU2mW
# D5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
# Ew9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUg
# U3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD
# VQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIwDQYJ
# KoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPvIhKA
# VD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlBnwDE
# JuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv2eNm
# GiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7CQKf
# OUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLgzb1g
# bL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ1AzC
# s1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwUtrYE
# 2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYadtn03
# 4ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0jBBgw
# FoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1SgLqz
# YZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGg
# P6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh
# bXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKGO2h0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jv
# b3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAN
# BgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVUacah
# RoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQUn73
# 3qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M/SFj
# eCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7KyUJ
# Go1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/mSiSU
# ice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ1c6F
# ibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALOz1Uj
# b0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7HpNi/
# KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUufrV64
# EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ7l93
# 9bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5vVye
# fQIwggZFMIIELaADAgECAhAIMk+dt9qRb2Pk8qM8Xl1RMA0GCSqGSIb3DQEBCwUA
# MFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMu
# QS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQTAeFw0yNDA0
# MDQxNDA0MjRaFw0yNzA0MDQxNDA0MjNaMGsxCzAJBgNVBAYTAk5MMRIwEAYDVQQH
# DAlTY2hpam5kZWwxIzAhBgNVBAoMGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5
# MSMwIQYDVQQDDBpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTCCAaIwDQYJKoZI
# hvcNAQEBBQADggGPADCCAYoCggGBAMslntDbSQwHZXwFhmibivbnd0Qfn6sqe/6f
# os3pKzKxEsR907RkDMet2x6RRg3eJkiIr3TFPwqBooyXXgK3zxxpyhGOcuIqyM9J
# 28DVf4kUyZHsjGO/8HFjrr3K1hABNUszP0o7H3o6J31eqV1UmCXYhQlNoW9FOmRC
# 1amlquBmh7w4EKYEytqdmdOBavAD5Xq4vLPxNP6kyA+B2YTtk/xM27TghtbwFGKn
# u9Vwnm7dFcpLxans4ONt2OxDQOMA5NwgcUv/YTpjhq9qoz6ivG55NRJGNvUXsM3w
# 2o7dR6Xh4MuEGrTSrOWGg2A5EcLH1XqQtkF5cZnAPM8W/9HUp8ggornWnFVQ9/6M
# ga+ermy5wy5XrmQpN+x3u6tit7xlHk1Hc+4XY4a4ie3BPXG2PhJhmZAn4ebNSBwN
# Hh8z7WTT9X9OFERepGSytZVeEP7hgyptSLcuhpwWeR4QdBb7dV++4p3PsAUQVHFp
# wkSbrRTv4EiJ0Lcz9P1HPGFoHiFAQQIDAQABo4IBeDCCAXQwDAYDVR0TAQH/BAIw
# ADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY2NzY2EyMDIxLmNybC5jZXJ0dW0u
# cGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0
# dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0uY29tMDUGCCsGAQUFBzAChilodHRw
# Oi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNlcjAfBgNVHSMEGDAW
# gBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNVHQ4EFgQUO6KtBpOBgmrlANVAnyiQ
# C6W6lJwwSwYDVR0gBEQwQjAIBgZngQwBBAEwNgYLKoRoAYb2dwIFAQQwJzAlBggr
# BgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVtLnBsL0NQUzATBgNVHSUEDDAKBggr
# BgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAEQsN8wg
# PMdWVkwHPPTN+jKpdns5AKVFjcn00psf2NGVVgWWNQBIQc9lEuTBWb54IK6Ga3hx
# QRZfnPNo5HGl73YLmFgdFQrFzZ1lnaMdIcyh8LTWv6+XNWfoyCM9wCp4zMIDPOs8
# LKSMQqA/wRgqiACWnOS4a6fyd5GUIAm4CuaptpFYr90l4Dn/wAdXOdY32UhgzmSu
# xpUbhD8gVJUaBNVmQaRqeU8y49MxiVrUKJXde1BCrtR9awXbqembc7Nqvmi60tYK
# lD27hlpKtj6eGPjkht0hHEsgzU0Fxw7ZJghYG2wXfpF2ziN893ak9Mi/1dmCNmor
# GOnybKYfT6ff6YTCDDNkod4egcMZdOSv+/Qv+HAeIgEvrxE9QsGlzTwbRtbm6gwY
# YcVBs/SsVUdBn/TSB35MMxRhHE5iC3aUTkDbceo/XP3uFhVL4g2JZHpFfCSu2TQr
# rzRn2sn07jfMvzeHArCOJgBW1gPqR3WrJ4hUxL06Rbg1gs9tU5HGGz9KNQMfQFQ7
# 0Wz7UIhezGcFcRfkIfSkMmQYYpsc7rfzj+z0ThfDVzzJr2dMOFsMlfj1T6l22GBq
# 9XQx0A4lcc5Fl9pRxbOuHHWFqIBD/BCEhwniOCySzqENd2N+oz8znKooSISStnkN
# aYXt6xblJF2dx9Dn89FK7d1IquNxOwt0tI5dMIIGYjCCBMqgAwIBAgIRAKQpO24e
# 3denNAiHrXpOtyQwDQYJKoZIhvcNAQEMBQAwVTELMAkGA1UEBhMCR0IxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBDQSBSMzYwHhcNMjUwMzI3MDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZb3Jrc2hpcmUxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBTaWduZXIgUjM2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA04SV9G6kU3jyPRBLeBIHPNyUgVNnYayfsGOyYEXrn3+SkDYTLs1crcw/
# ol2swE1TzB2aR/5JIjKNf75QBha2Ddj+4NEPKDxHEd4dEn7RTWMcTIfm492TW22I
# 8LfH+A7Ehz0/safc6BbsNBzjHTt7FngNfhfJoYOrkugSaT8F0IzUh6VUwoHdYDpi
# ln9dh0n0m545d5A5tJD92iFAIbKHQWGbCQNYplqpAFasHBn77OqW37P9BhOASdmj
# p3IijYiFdcA0WQIe60vzvrk0HG+iVcwVZjz+t5OcXGTcxqOAzk1frDNZ1aw8nFhG
# EvG0ktJQknnJZE3D40GofV7O8WzgaAnZmoUn4PCpvH36vD4XaAF2CjiPsJWiY/j2
# xLsJuqx3JtuI4akH0MmGzlBUylhXvdNVXcjAuIEcEQKtOBR9lU4wXQpISrbOT8ux
# +96GzBq8TdbhoFcmYaOBZKlwPP7pOp5Mzx/UMhyBA93PQhiCdPfIVOCINsUY4U23
# p4KJ3F1HqP3H6Slw3lHACnLilGETXRg5X/Fp8G8qlG5Y+M49ZEGUp2bneRLZoyHT
# yynHvFISpefhBCV0KdRZHPcuSL5OAGWnBjAlRtHvsMBrI3AAA0Tu1oGvPa/4yeei
# Ayu+9y3SLC98gDVbySnXnkujjhIh+oaatsk/oyf5R2vcxHahajMCAwEAAaOCAY4w
# ggGKMB8GA1UdIwQYMBaAFF9Y7UwxeqJhQo1SgLqzYZcZojKbMB0GA1UdDgQWBBSI
# YYyhKjdkgShgoZsx0Iz9LALOTzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIw
# ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEB
# AgEDCDAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZn
# gQwBBAIwSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2NybC5zZWN0aWdvLmNvbS9T
# ZWN0aWdvUHVibGljVGltZVN0YW1waW5nQ0FSMzYuY3JsMHoGCCsGAQUFBwEBBG4w
# bDBFBggrBgEFBQcwAoY5aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVi
# bGljVGltZVN0YW1waW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz
# cC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAYEAAoE+pIZyUSH5ZakuPVKK
# 4eWbzEsTRJOEjbIu6r7vmzXXLpJx4FyGmcqnFZoa1dzx3JrUCrdG5b//LfAxOGy9
# Ph9JtrYChJaVHrusDh9NgYwiGDOhyyJ2zRy3+kdqhwtUlLCdNjFjakTSE+hkC9F5
# ty1uxOoQ2ZkfI5WM4WXA3ZHcNHB4V42zi7Jk3ktEnkSdViVxM6rduXW0jmmiu71Z
# pBFZDh7Kdens+PQXPgMqvzodgQJEkxaION5XRCoBxAwWwiMm2thPDuZTzWp/gUFz
# i7izCmEt4pE3Kf0MOt3ccgwn4Kl2FIcQaV55nkjv1gODcHcD9+ZVjYZoyKTVWb4V
# qMQy/j8Q3aaYd/jOQ66Fhk3NWbg2tYl5jhQCuIsE55Vg4N0DUbEWvXJxtxQQaVR5
# xzhEI+BjJKzh3TQ026JxHhr2fuJ0mV68AluFr9qshgwS5SpN5FFtaSEnAwqZv3IS
# +mlG50rK7W3qXbWwi4hmpylUfygtYLEdLQukNEX1jiOKMIIGgjCCBGqgAwIBAgIQ
# NsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYD
# VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBS
# U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjEwMzIyMDAwMDAwWhcNMzgw
# MTE4MjM1OTU5WjBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p
# dGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFJvb3Qg
# UjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAiJ3YuUVnnR3d6Lkm
# gZpUVMB8SQWbzFoVD9mUEES0QUCBdxSZqdTkdizICFNeINCSJS+lV1ipnW5ihkQy
# C0cRLWXUJzodqpnMRs46npiJPHrfLBOifjfhpdXJ2aHHsPHggGsCi7uE0awqKggE
# /LkYw3sqaBia67h/3awoqNvGqiFRJ+OTWYmUCO2GAXsePHi+/JUNAax3kpqstbl3
# vcTdOGhtKShvZIvjwulRH87rbukNyHGWX5tNK/WABKf+Gnoi4cmisS7oSimgHUI0
# Wn/4elNd40BFdSZ1EwpuddZ+Wr7+Dfo0lcHflm/FDDrOJ3rWqauUP8hsokDoI7D/
# yUVI9DAE/WK3Jl3C4LKwIpn1mNzMyptRwsXKrop06m7NUNHdlTDEMovXAIDGAvYy
# nPt5lutv8lZeI5w3MOlCybAZDpK3Dy1MKo+6aEtE9vtiTMzz/o2dYfdP0KWZwZIX
# bYsTIlg1YIetCpi5s14qiXOpRsKqFKqav9R1R5vj3NgevsAsvxsAnI8Oa5s2oy25
# qhsoBIGo/zi6GpxFj+mOdh35Xn91y72J4RGOJEoqzEIbW3q0b2iPuWLA911cRxgY
# 5SJYubvjay3nSMbBPPFsyl6mY4/WYucmyS9lo3l7jk27MAe145GWxK4O3m3gEFEI
# kv7kRmefDR7Oe2T1HxAnICQvr9sCAwEAAaOCARYwggESMB8GA1UdIwQYMBaAFFN5
# v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBT2d2rdP/0BE/8WoWyCAi/QCj0U
# JTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUEDDAKBggr
# BgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0
# cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25B
# dXRob3JpdHkuY3JsMDUGCCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDov
# L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEADr5lQe1oRLjl
# ocXUEYfktzsljOt+2sgXke3Y8UPEooU5y39rAARaAdAxUeiX1ktLJ3+lgxtoLQhn
# 5cFb3GF2SSZRX8ptQ6IvuD3wz/LNHKpQ5nX8hjsDLRhsyeIiJsms9yAWnvdYOdEM
# q1W61KE9JlBkB20XBee6JaXx4UBErc+YuoSb1SxVf7nkNtUjPfcxuFtrQdRMRi/f
# InV/AobE8Gw/8yBMQKKaHt5eia8ybT8Y/Ffa6HAJyz9gvEOcF1VWXG8OMeM7Vy7B
# s6mSIkYeYtddU1ux1dQLbEGur18ut97wgGwDiGinCwKPyFO7ApcmVJOtlw9FVJxw
# /mL1TbyBns4zOgkaXFnnfzg4qbSvnrwyj1NiurMp4pmAWjR+Pb/SIduPnmFzbSN/
# G8reZCL4fvGlvPFk4Uab/JVCSmj59+/mB2Gn6G/UYOy8k60mKcmaAZsEVkhOFuoj
# 4we8CYyaR9vd9PGZKSinaZIkvVjbH/3nlLb0a7SBIkiRzfPfS9T+JesylbHa1LtR
# V9U/7m0q7Ma2CQ/t392ioOssXW7oKLdOmMBl14suVFBmbzrt5V5cQPnwtd3UOTpS
# 9oCG+ZZheiIvPgkDmA8FzPsnfXW5qHELB43ET7HHFHeRPRYrMBKjkb8/IN7Po0d0
# hQoF4TeMM+zYAJzoKQnVKOLg8pZVPT8wgga5MIIEoaADAgECAhEAmaOACiZVO2Wr
# 3G6EprPqOTANBgkqhkiG9w0BAQwFADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoT
# GVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0
# aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0
# d29yayBDQSAyMB4XDTIxMDUxOTA1MzIxOFoXDTM2MDUxODA1MzIxOFowVjELMAkG
# A1UEBhMCUEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIG
# A1UEAxMbQ2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAnSPPBDAjO8FGLOczcz5jXXp1ur5cTbq96y34vuTm
# flN4mSAfgLKTvggv24/rWiVGzGxT9YEASVMw1Aj8ewTS4IndU8s7VS5+djSoMcbv
# IKck6+hI1shsylP4JyLvmxwLHtSworV9wmjhNd627h27a8RdrT1PH9ud0IF+njvM
# k2xqbNTIPsnWtw3E7DmDoUmDQiYi/ucJ42fcHqBkbbxYDB7SYOouu9Tj1yHIohzu
# C8KNqfcYf7Z4/iZgkBJ+UFNDcc6zokZ2uJIxWgPWXMEmhu1gMXgv8aGUsRdaCtVD
# 2bSlbfsq7BiqljjaCun+RJgTgFRCtsuAEw0pG9+FA+yQN9n/kZtMLK+Wo837Q4QO
# ZgYqVWQ4x6cM7/G0yswg1ElLlJj6NYKLw9EcBXE7TF3HybZtYvj9lDV2nT8mFSkc
# SkAExzd4prHwYjUXTeZIlVXqj+eaYqoMTpMrfh5MCAOIG5knN4Q/JHuurfTI5XDY
# O962WZayx7ACFf5ydJpoEowSP07YaBiQ8nXpDkNrUA9g7qf/rCkKbWpQ5boufUnq
# 1UiYPIAHlezf4muJqxqIns/kqld6JVX8cixbd6PzkDpwZo4SlADaCi2JSplKShBS
# ND36E/ENVv8urPS0yOnpG4tIoBGxVCARPCg1BnyMJ4rBJAcOSnAWd18Jx5n858JS
# qPECAwEAAaOCAVUwggFRMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFN10XUwA
# 23ufoHTKsW73PMAywHDNMB8GA1UdIwQYMBaAFLahVDkCw6A/joq8+tT4HKbROg79
# MA4GA1UdDwEB/wQEAwIBBjATBgNVHSUEDDAKBggrBgEFBQcDAzAwBgNVHR8EKTAn
# MCWgI6Ahhh9odHRwOi8vY3JsLmNlcnR1bS5wbC9jdG5jYTIuY3JsMGwGCCsGAQUF
# BwEBBGAwXjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNv
# bTAyBggrBgEFBQcwAoYmaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2N0bmNh
# Mi5jZXIwOQYDVR0gBDIwMDAuBgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93
# d3cuY2VydHVtLnBsL0NQUzANBgkqhkiG9w0BAQwFAAOCAgEAdYhYD+WPUCiaU58Q
# 7EP89DttyZqGYn2XRDhJkL6P+/T0IPZyxfxiXumYlARMgwRzLRUStJl490L94C9L
# GF3vjzzH8Jq3iR74BRlkO18J3zIdmCKQa5LyZ48IfICJTZVJeChDUyuQy6rGDxLU
# UAsO0eqeLNhLVsgw6/zOfImNlARKn1FP7o0fTbj8ipNGxHBIutiRsWrhWM2f8pXd
# d3x2mbJCKKtl2s42g9KUJHEIiLni9ByoqIUul4GblLQigO0ugh7bWRLDm0CdY9rN
# LqyA3ahe8WlxVWkxyrQLjH8ItI17RdySaYayX3PhRSC4Am1/7mATwZWwSD+B7eMc
# ZNhpn8zJ+6MTyE6YoEBSRVrs0zFFIHUR08Wk0ikSf+lIe5Iv6RY3/bFAEloMU+vU
# BfSouCReZwSLo8WdrDlPXtR0gicDnytO7eZ5827NS2x7gCBibESYkOh1/w1tVxTp
# V2Na3PR7nxYVlPu1JPoRZCbH86gc96UTvuWiOruWmyOEMLOGGniR+x+zPF/2DaGg
# K2W1eEJfo2qyrBNPvF7wuAyQfiFXLwvWHamoYtPZo0LHuH8X3n9C+xN4YaNjt2yw
# zOr+tKyEVAotnyU9vyEVOaIYMk3IeBrmFnn0gbKeTTyYeEEUz/Qwt4HOUBCrW602
# NCmvO1nm+/80nLy5r0AZvCQxaQ4xggXDMIIFvwIBATBqMFYxCzAJBgNVBAYTAlBM
# MSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0Nl
# cnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQQIQCDJPnbfakW9j5PKjPF5dUTANBglg
# hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MC8GCSqGSIb3DQEJBDEiBCA+Ya18FIpx42hqfNA0EcIEPlPOtguFELYjmY6XDVTX
# 4jANBgkqhkiG9w0BAQEFAASCAYCGRf5OrHrd6Gs11xCWCbijlgTKm/1IG9DQ195M
# SGNYcJ/r2IiNJaKoJrmcYzg9iFw54XOv5YgcLK0yESvssj0SuPhrwtc3d16KbfZv
# /4rZPvzU1Sj9F9khoWXH+szF/bY9bbp7EjNcUY6dguLa0L8lVcU+wtJfI1MXTyGE
# GaTke/z7TN8AIAz2rZzENVzUgt2uedeENlVVqUTmzkVBw4kzO4uv7pcMUPb/xDD4
# MBjipIqC5kg/9ViwtIjT4hJsxwsa40fvdC7/4CojeCL1tQHKuH7946PVoCNWCPzC
# gzBVii5Z0NsE56a2BilayDNjAwZbVCpWOy0rG3o9UC0N9//hekXOKkWDBHFywi6D
# VaQujkXS5SZNdRKhPA35hvRc0o4jiMAYDeBui6mrYqMg2z5ZAGbNjECDJzk+pFHT
# N6IgWWXL0aIzmH78iac0dYkXkY9mRMNxptcb+pQw6sWpevsywtH1U2UPiTxtBzE1
# WoTxyid20dWMKI+XCV+ns5di1nqhggMjMIIDHwYJKoZIhvcNAQkGMYIDEDCCAwwC
# AQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSww
# KgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNgIRAKQp
# O24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJ
# KoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAxMzAxMTAyNDNaMD8GCSqGSIb3
# DQEJBDEyBDCPKKzQbhdrzaiKwwKkD0q68PAN6AwXxkUPJr9me6YhflrLQY15329U
# 2WWjthd96NowDQYJKoZIhvcNAQEBBQAEggIAiVj3O6hE7BIlC70jmYLAVP0oU/pN
# Y5b8nnRioUIbvK3sdwtt06O4Qo4LNnz6/Cfgk53OHDSjz0gYPsm67/9TqV34hyt2
# agZrl+D1bAcqxH6AxRFKYjaClgbM3osYAmoL35iv7j6Qvu2DKUW72n5VSrqgu6QA
# llP4+lMZSztc++UbvZ1ptR3ahDrlDZFRJwLSXUMXo/r0P7lGeWEzji6lkAD+9EQo
# ZlPcF31N6/CiBd5cUzJBXm4DhxfPffJW+aAoM3oWGbZBC751jtFt6RbF6q5ud23w
# 9mdiwWItJCAvQKLHo/98WvoLEzVXBwG2nftODGJwVzcNIcDVM69YahVdFx3q8HdV
# kJ79bsR6q4j+IO9CrlxIdGiIVAodpKasXTTVjQ/O3JSiW5pxD21bB+fSazTc0J+x
# T5TMr0ce9IP1oqpzqocWH6BEN8DqDeIa1H64xi+BBhonyHoclAufHeZp680+P4nS
# Xn9tl4pnq4m42VLVS+CPDPVV0ig/dMFKED/Fm29ylKILX4GO4Xto4zjyqk1aDNtI
# 8SgJDdSFbfLJbfnrTYTHXEfZKJccu7F2h9Vu08iM5Aa5DRKcKcRfaaCJvopP41L5
# 2CQZRg//A0J8Sj9f5E4Ei0HVEFKVX2UU9yBEF+MC3DG0X3gHxaxXYmtqo81xMPf9
# gUJRibUdRSvoKQQ=
# SIG # End signature block