Internal/Translation/Optimize-M365DocSection.ps1

Function Optimize-M365DocSection(){
    <#
    .DESCRIPTION
    This Script translates as many properties from the Graph API to names used in the UI.
 
    .PARAMETER Data
    M365 documentation section object which should be optimized.
 
     
    .PARAMETER ExcludeValues
    All values are replaced with an empty string.
 
    .EXAMPLE
    $docNew = Optimize-M365DocSection -Section $DocSection
 
    .NOTES
    Author: Thomas Kurth/baseVISION
    Date: 05.04.2021
 
    #>

    [OutputType('DocSection')]
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline,Mandatory)]
        [DocSection]$Section,
        [switch]$UseTranslationFiles,
        [switch]$UseCamelCase,
        [int]$MaxStringLengthSettings = 350,
        [switch]$ExcludeEmptyValues,
        [switch]$ExcludeValues,
        [String[]]$ExcludeProperties
    )
    Begin {

    }
    Process {
        ## Manual Variable Definition
        ########################################################
        #$DebugPreference = "Continue"
        $ScriptName = "Optimize-M365DocSection"


        #region Initialization
        ########################################################

        $DataNew = New-Object DocSection
        $DataNew.Title = $Section.Title
        $DataNew.Text = $Section.Text
        $DataNew.SubSections = @()
        $DataNew.Objects = @()
        $DataNew.Transpose = $Section.Transpose

        #endregion

        #region Translate
        ########################################################

        foreach($Section2 in $Section.SubSections){
            if($Section2){
                $DataNew.SubSections += Optimize-M365DocSection -Section $Section2 -UseTranslationFiles:$UseTranslationFiles -UseCamelCase:$UseCamelCase -MaxStringLengthSettings $MaxStringLengthSettings -ExcludeEmptyValues:$ExcludeEmptyValues -ExcludeValues:$ExcludeValues -ExcludeProperties $ExcludeProperties
            }
        }

        foreach($Object in $Section.Objects){
            
            $ObjectNew = New-Object -Type PSObject


            #Prepare File based translation
            $TypeName = $Object.'@odata.type'
            $TranslationFile = "$PSScriptRoot\..\..\Data\LabelTranslation\$TypeName.json"
            $translateJson = Get-Content $TranslationFile -ErrorAction SilentlyContinue
            if($null -eq $translateJson){
                $translateJson = "{}"
            }
            $translation = $translateJson | ConvertFrom-Json


        
            foreach($p in $Object.psobject.properties) {   
                # Skip excluded properties or empty values if specified.
                if($ExcludeProperties -contains $p.Name){
                    continue
                }
                if([string]::IsNullOrWhiteSpace($p.Value) -and $ExcludeEmptyValues){
                    continue
                }
                

                $Translated = $false
                $Name = $p.Name
                $Value = $p.Value


                #File based translation enabled and odata type available
                if($UseTranslationFiles -and (-not ([String]::IsNullOrWhiteSpace($TypeName)))){
                    if([String]::IsNullOrWhiteSpace($translation."$($p.Name)")){
                        $TranslationValue = switch($p.Name){
                            "displayName" { "Displayname" }
                            "lastModifiedDateTime" { "Modified at" }
                            "@odata.type" { "OData Type" }
                            "supportsScopeTags" { "Support for Scope Tags" }
                            "roleScopeTagIds" {  "Role Scopes Tags" }
                            "deviceManagementApplicabilityRuleOsEdition" {  "Applicability OS Edition" }
                            "deviceManagementApplicabilityRuleOsVersion" {  "Applicability OS Version" }
                            "deviceManagementApplicabilityRuleDeviceMode" {  "Applicability Device Mode" }
                            "createdDateTime" {  "Created at" }
                            "description" {  "Description" }
                            "version" {  "Version" }
                            "id" {'ID'}
                            default { '' }   
                        }
                        if(-not ([String]::IsNullOrWhiteSpace($TranslationValue))){
                            $Name = $TranslationValue
                            $Translated = $true
                        }

                        if([String]::IsNullOrWhiteSpace($TranslationValue)){
                            $ConfigSection = " "
                        } else {
                            $ConfigSection = "Metadata"
                        }
            
                        if($p.TypeNameOfValue -eq "System.Boolean"){
                            $TranslationObject = New-Object PSObject -Property @{
                                Name = $TranslationValue
                                Section = $ConfigSection
                                DataType = $p.TypeNameOfValue
                                ValueTrue = "Block"
                                ValueFalse = "Not Configured"
                            }
                        } else {
                            $TranslationObject = New-Object PSObject -Property @{
                                Name = $TranslationValue
                                Section = $ConfigSection
                                DataType = $p.TypeNameOfValue
                            }
                        }
                        
                        $translation | Add-Member Noteproperty -Name $p.Name -Value $TranslationObject -Force 
                        $translation | ConvertTo-Json | Out-File -FilePath $TranslationFile -Force
                        #Variable set for user information in main function
                        $Script:NewTranslationFiles += $TranslationFile
                    } else { 
                        #Only use translated value if not empty
                        if(-not ([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Name))){
                            if(([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Section))){
                                $Name = "$($translation."$($p.Name)".Name)"
                            } else {
                                $Name = "$($translation."$($p.Name)".Section)\$($translation."$($p.Name)".Name)"
                                $Name = $Name.Replace("/","\")
                            }
                            $Translated = $true
                        }
                    }
                }

                #Camelcase Translation
                if($Translated -eq $false -and $UseCamelCase){
                    #Only use Camel Case converter if not already translated.
                    $TempName = Convert-CamelCaseToDisplayName -Value $p.Name
                    if(-not ([String]::IsNullOrWhiteSpace($TempName))){
                        $Name = $TempName
                    } 
                }
                
                # Optimize Value
                if($p.TypeNameOfValue -eq "System.Boolean"){
                    if(-not ([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Name))){
                        if($p.Value -eq $true){
                            $Value = $translation."$($p.Name)".ValueTrue
                        } else {
                            $Value = $translation."$($p.Name)".ValueFalse
                        }
                    }
                } else {
                    $TempValue = Format-MsGraphData "$($p.Value)"
                    if($TempValue.Length -gt $MaxStringLengthSettings){
                        $Value = "$($TempValue.substring(0, $MaxStringLengthSettings))..."
                    } else {
                        $Value = "$($TempValue) "
                    }
                }
                if($null -eq $Value){
                    $Value = ""
                } else {
                    if($value.GetType().Name -ne "Boolean" -and $value.GetType().Name -ne "System.Boolean"){
                        $value = $value.Trim()
                    }
                }
                if(($ExcludeValues -and $p.Name -in @("Value","ValueName") -and $DataNew.Title -eq "Settings") -or ($ExcludeValues -and $DataNew.Title -ne "Settings")){
                    $Value = ""
                }
                
                try{
                    $ObjectNew | Add-Member Noteproperty $Name $Value -ErrorAction Stop
                } catch {
                    $ObjectNew | Add-Member Noteproperty "$Name`2" $Value -ErrorAction Stop
                }     
            }

            $DataNew.Objects += $ObjectNew
        }

        #endregion

        #region Finishing
        ########################################################
        
        return $DataNew

        if($Script:NewTranslationFiles.Count -gt 0 -and $Script:UseTranslation){
            Write-Information "You used the option to translate API properties. Some of the configurations of your tenant could not be translated because translations are missing."
            foreach($file in ($Script:NewTranslationFiles | Select-Object -Unique)){
                Write-Information " - $($file.Replace('Internal\..\',''))"
            }
            Write-Information "You can support the project by translating and submitting the files as issue on the project page. Then it will be included for the future."
            Write-Information "Follow the guide here https://github.com/ThomasKur/IntuneDocumentation/blob/master/AddTranslation.md" 
        }
        
        Write-Information "End Script $Scriptname"
        #endregion
    }
    End {

    }
}


    
# SIG # Begin signature block
# MIIoaQYJKoZIhvcNAQcCoIIoWjCCKFYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBA7mVUyQ/e/Cn2
# l+Ccw1TpyZXN9AtgIjxMjrzv9E7siKCCIWYwggWNMIIEdaADAgECAhAOmxiO+dAt
# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa
# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E
# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy
# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF
# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1
# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB
# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR
# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6
# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB
# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S
# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x
# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB
# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP
# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC
# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc
# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov
# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy
# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW
# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF
# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z
# twGpn1eqXijiuZQwggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0GCSqG
# SIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy
# dXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTlaMGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQg
# MjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C0Cit
# eLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce2vnS
# 1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0daE6ZM
# swEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6TSXBC
# Mo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoAFdE3
# /hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7OhD26j
# q22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM1bL5
# OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z8ujo
# 7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05huzU
# tw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNYmtwm
# KwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP/2NP
# TLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0TAQH/
# BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYDVR0j
# BBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8E
# PDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATANBgkq
# hkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95RysQDK
# r2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HLIvda
# qpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5BtfQ/g+
# lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnhOE7a
# brs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIhdXNS
# y0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV9zeK
# iwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/jwVYb
# KyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYHKi8Q
# xAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmCXBVm
# zGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l/aCn
# HwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZWeE4w
# gga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIx
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBH
# NDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVT
# MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1
# c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHTCphBcr48RsAcrHXbo0Zo
# dLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi
# 6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNg
# xVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBvMgEdgkFiDNYiOTx4OtiF
# cMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps0wjUjsZvkgFkriK9tUKJ
# m/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF83bRVFLeGkuAhHiGPMvS
# GmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1
# ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9
# MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydPpOjL6s36czwzsucuoKs7
# Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bG
# RinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6
# X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAd
# BgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJx
# XWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
# BwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
# aWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJo
# dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
# bDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQEL
# BQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxj
# aaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+IQhQE7jU/kXjjytJgnn0
# hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8Myb9rEVKChHyfpzee5kH0
# F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2th9y1IsA0QF8dTXqvcnT
# mpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKf
# ZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2Lr3ty9qIijanrUR3anzE
# wlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbh
# OhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG7uEBYTptMSbhdhGQDpOX
# gpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+NJpud/v4+7RWsWCiKi9EO
# LLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wG
# WqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszWkPZPubdcMIIG7TCCBNWg
# AwIBAgIQCE/cM09+RU7bww+P+ZIYNTANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG
# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0
# IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0Ex
# MB4XDTI2MDgwNTAwMDAwMFoXDTM3MTEwNDIzNTk1OVowYzELMAkGA1UEBhMCVVMx
# FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBTSEEy
# NTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIwMjYgMTCCAiIwDQYJKoZI
# hvcNAQEBBQADggIPADCCAgoCggIBALZ7pvLJ/s1K+NSbTGWz/TjGMPh8CQ6RucZC
# Lv5anHzWJjF/NWJrFIhy24fcpKXlgRiky4WAawDfU3YP0BMxt9l3Dm5oCG5Z69Aq
# EN1kgHg2epx+l+lZBcmJCcN0ASURML5uFIS80sZsDwO3BSkUxDjLJhBI+qiZP3ai
# xAC/qEGLjsBNlLol9VZ7pfGEXiMlneJIC5/YKuizVzNFKZZEeoy/0B8Zm+nzKBgS
# WG52lCO1w+nCg6XpCtklTJXeIg283hw7TmmsZXR+SMbjbrEOvZ3fP2VxIgeR28Y9
# 0ZStd3F9VuA5RVynb/whITPAo9b75Zr4Ta6Mj3URm26QZYMn/FnbuTegcoRcFEZ9
# FOqM5T6MTdtr/n74lIT/ug0eeOzmZ6QTFg33otX+bFRsIolvykE1jive4PuESaT8
# zzVeFWDAMDtozNgLctkGD1ZjkEyZtJrLl5ya0m5doH/ScpaZCZVl6pNUOCybMc/k
# xC6EAmSJY24L0yYKD1Nkddsnb/ItVKi/2nXpQNMu1PT5prW83vV8d67WowuUs0Hd
# Y4H8AMLGvdL/WHEj3ZnqMqAQQP9u3Ai9t+5eQ02GDwy0ODjdzi0xlp70W+ow63/0
# ++YDEX1M0iwgUHwbrJvfpklkZQvw3+kv3vUPItdwroczk9icflf55W1zOEKAcJVA
# IXpcMCU9AgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQUyWOK
# MC7USvtulPPm40B+9ezN4jAfBgNVHSMEGDAWgBTvb1NK6eQGfHrK4pBW9i/USezL
# TjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwgZUGCCsG
# AQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
# b20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp
# Q2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNy
# dDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln
# aUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5j
# cmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEB
# CwUAA4ICAQCNxTphHp1SCt+ZrAmAfn0oQLFr0mLywSLaDXQIENoyKqxrFbJblzCV
# P/pkXmwXOdrOpWygLzlT12os5ipDCy35RBCg2UMeApEtrfGhz45F4Wt4WGdNdIbR
# Wt3YTYJmpR+b7lr4d7Uwn+H600u4D7RnOGf8Wj4UNgAdZkfHhHv1mx9EVh71SJel
# cEN/oORSjXzdjfw1iZH9d8Nh/thn6hH23d+VsPAr6GAYyzSA02nXD1nYLI7Ijmiv
# +xLCiYC41DSFYL3GhTiy0PxpawPtGRyaBVGzq+UiTfM8pD7KVyF5aQyWP4KhVGUU
# Tnmm/RlYJoW3TiXA/+t0YcT2oRVBm3JETjajHug2AL+v5jhtKVnd3D0rbHXEu27o
# +Q8p4sEWPMqKDB+qbceb6T/6WcwTwXmQ9lOCLLYcsQeSWmvKqzpAec9etE14jOQA
# zLKWdE3w/TCaKtLRaRT7LCkRYVnhA2D73FLje1O5b3HR5eHs0NzU/+xX7NbEdcof
# y0W3Wdwd1XOqtlpg/JgwtKfZM5dqO94lbUveOiJBI+xZEbGRsMNbXmMREUTgu+Oc
# a7Y73MPWcslIx2VhkSKSXjDbD6rgg39H5Mh7QfieAIjWagkJNt68Yfim6cjEzVSi
# LSeZfdkr5dtFPTW6jATlWJdYeeDRGCyatf8R1hSjzSvdN8yWQPT9gzCCB3QwggVc
# oAMCAQICEATxuaBOthmGPBQf/T19vOkwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UE
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2Vy
# dCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENB
# MTAeFw0yMzEwMDkwMDAwMDBaFw0yNjExMjAyMzU5NTlaMHwxCzAJBgNVBAYTAkNI
# MRIwEAYDVQQIEwlTb2xvdGh1cm4xDjAMBgNVBAcTBU9sdGVuMRYwFAYDVQQKEw1i
# YXNlVklTSU9OIEFHMRkwFwYDVQQLExBJbnRlcm5hbCBTY3JpcHRzMRYwFAYDVQQD
# Ew1iYXNlVklTSU9OIEFHMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# ufaKcpNEghlaO8FJ9JxMxyWtjYDMzK6NEc/2Ey9j3eDKs5MtSDaH6jCZwVIoy0gh
# VM7qQp4mDq7VxTy+LF+EvKOUZ7cBFAM9BF+e0r7Wypq0zloEBB//7YJcnqgwzdco
# Fb2tv1NeVwgE5hzbjpp9ZGtp+WOr0PiDQT7uI7WHMz7CjyeZyBf06wkntnwneuKy
# N3XLzWnbJbwGR0ku+uWZyxni/IqO6Aif+r5fdOed2giizFVrDPJRZ8tu9od+DmAJ
# 7B8Am5Ki3EnxlEyHL3oOolignkrZlt+TyFDAOGyA2f1wV+3MhYCngGDIl+sjcQIB
# A8ObAULMU27iFgdtWmPc5NanibHRkUdXgXnWczMFmpTBnbwJV5CJGMDwBtSU8Tnb
# edOmpF6iIh+nKbxLEOVF90WPrG86rp6ou4BjHz+djua9GO/W3R3HmGCspMl53+r8
# 74zx+B01QRA78JDKdENaa6W9VOICHtZ8s1CISrjw7dvI45cmwopIBivVweCo5OXm
# r1eBcKFbsH2wtGdoO5h12aW7yXEm0sqYMWHRsN/DXgCbW5Aq7o1v7CSNpcSZW+wB
# Ncf9surdMLzwT6vbo3GwqbSxrjeLbHOinn9cV9e2ROA4E7PMQLlyPvffcXn9QWAv
# kTYm/gMbpXepQATcupfEzTnSmHMJwEbAqP0XqbcftckCAwEAAaOCAgMwggH/MB8G
# A1UdIwQYMBaAFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBRm81EbqiBD
# YIXuCPS2E6CaB1RXyjA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIB
# FhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeAMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9j
# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB
# NDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2Vy
# dC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQy
# MDIxQ0ExLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6
# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2
# U0hBMzg0MjAyMUNBMS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEA
# eDbtA8CjFmSEjjq3jgM7utHOhN56IwIVyL4RuVCxPyRwZ1qg9RRzK6LetRwQ969P
# TSXfJFNP1JWGHRkkmKUH/yk5AdTz8vTFLWeYQSrdY5tf246HMFzjassGQnRMdOUr
# IOf+yeGDRy7ktBZGWCIxRZWtT/naIl1lgplLx3O+a5iRV6eTGq20ns1mXnJHyjQ4
# YoPW77YigKFqeJ0Sc/7MzxO9soqr37pRHrgCjuZYso6ExRorvy8cXFINLF+2cyoi
# XXiimWbKA6gxWte+ZyRgGbgmYgTCDqGSH7bCyIJy7oHhcSU5mOauX4b1IgAVwJDf
# frZpQhcDgAy3w4USlO8wmZ616Kdvj1/FG6/7Wh1/3fyxdNfDGx8h2HA6C5wjbmMP
# NaxwS4Cua7MItgVQgHx3FrKLUkGZZoNogSKX3vXAkF1ezDOec8kOeJgHo148esAV
# py9mMWWBbwAbOnxyiC9uMs135xSxEkai2AFjfNYbIKmmEC6l21dNdxz3RRLJzbsB
# McWZ/IHHvD2L702sNDow4N13vDrZfT2G+TbRgzKfq2iCA3OXSMwwofz24RTxkDof
# BKb7ySKnnE6FZwe4u3NHoUOkfrsMyxpmugnOpFiRf2lK0Qzuu9W4sW0+4PEPnokM
# mvymlpDldO5AIqud0quQfdu70cmTzpHVPPMz9wCDR3AxggZZMIIGVQIBATB9MGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQg
# MjAyMSBDQTECEATxuaBOthmGPBQf/T19vOkwDQYJYIZIAWUDBAIBBQCggYQwGAYK
# KwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg
# 4WeKVRWF1rRKmd/pTXjessbfueXZU/g3GwtSFVE9lnYwDQYJKoZIhvcNAQEBBQAE
# ggIAmz2OLg9/L/15vPbLapxWwSOaaHMi7ibncuM5OUcRegUqRjLGaJn51WQc0myA
# FTzadMhfBkh3df8msa02fZC+I5LQBNCl5XR43ui2xf5z1ZYksYTe3e+O4g6jdm2I
# KP4Ag/t5wUkXsHhu23ilcj30oO2+J2C5hQ+veSUvKlgc6xwMVlRZl0IUr+nYdF/f
# Hxq0Mfa1oUgHCG48g+Vv5lDm+/83JhVZSFxEPExXLnoci/u8cFMkGBkOrH40pklH
# 1EArO9rKf1iD+6e3Px0STkkV7EoTVPaQDBANXStKGRnrlJhaZ4VCSyZxWIpLgNrK
# vPa6KRtrFkMH45PywfFhpa7CxIpI8Xde0NIqnlm/9LsfzYcg32GSbKUIld3mxMKu
# v0w6k6VgwHBOq4xhEG9DVA5TzUAEIng+A+cdzOUic3Te8I/BrIxmOrHDmaPJlP51
# ePOe6uad6NlJnWx7Zp1N4DNW+x5NZFPMvh55QGAtFO0X3RNMIFxyAEngKvYbW2Zr
# ZY/aZEKdqUlZ4k3F82J7lDhn0oXKu+0H0vfOFa4bCCUTKIlMTe+LGWE+z/G33iqg
# uaZARAinW6Psw85vn3z+avhhvvvSd/Re+r0RSga3RbyAXOGS2v+GMyDwlI61RNpZ
# /ty5NxQuFjLiua/xINpCXxETs1/ni4vdIOqwNH6WNVsaRfihggMmMIIDIgYJKoZI
# hvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln
# aUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0
# YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAIT9wzT35FTtvDD4/5khg1
# MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq
# hkiG9w0BCQUxDxcNMjYxMDA4MjM0NDQ5WjAvBgkqhkiG9w0BCQQxIgQgbtoLoyP3
# WdyaOeUwqbe6Z8Zup8GFQPWpkJgA7I14/HUwDQYJKoZIhvcNAQEBBQAEggIAaux9
# iApuYoCMmI8hXEkuCsVGITQsQ+SmCYY7Oa0nFeeG+QOMapMdDc4zK3lF5da5ll2a
# mN86xAqVACZfthBOh64WsH0qN7QRPKifFYZzcY832wKu1J1+o2z7pLpwyWfjpyQ1
# Te8HFBprUU6YVRc+akkZapGqSxoxJR1BrRnEcx5kUNmupUZwwsPeUx6Pm+qn3y97
# z/y3HwXXmlioH3LyXbkDYOpYAnRTZ1Pefq05yiXXqFnulRohSgbiou5hN4BPB+C+
# W3EOlKZiSz+v6cvOefLXZPfTbUD18nOJ4ChVZdi7mhAeYrw0FME8jATr5N7ySvx/
# CBFEGgAkAoHtTtaoMJZBRGRg0m9REGuG92U+zuzLBkioT82qe7ej5pWMDHMM/3x+
# Ia6c+R20KBtaH1WqOLgE5AXEFoLaJbwf3kfhQzzrwzl2HT6BVFuKZkaVcQ6Ff4RV
# yZJYoMGJ/26pDL2100y/PxMJRQT1NxBMBEm3I2gsKaITsuS0WYoAGlN2Xc4E/rWz
# Y9Rre4mgavol4h1pgsW4OdRvu3y+I0tbf9dCMhEeOHcj6jX3Zqn2XW/yz50P8z47
# SLH+wpsxecTMR77o3O7bWn9aZ0g9UQP+YUDptVsGteyyseHLoVfWApk7n7lS0wQx
# XxMNh9MxNKBiFqEtd3kngk8ATqyUxFMf6H4nGWQ=
# SIG # End signature block