DSCResources/DCPP_SystemConfiguration/DCPP_SystemConfiguration.psm1

# Import the helper functions

Import-Module $PSScriptRoot\..\..\Misc\helper.psm1 -Verbose:$false

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."


    <#
    $returnValue = @{
        Category = [System.String]
        MultiCoreSupport = [System.String]
        IntelSpeedStep = [System.String]
        CStates = [System.String]
        IntelTurboBoost = [System.String]
        HyperThreadControl = [System.String]
        Password = [System.String]
        SecurePassword = [System.String]
        PathToKey = [System.String]
    }
 
    $returnValue
    #>

    
                   # Check if module DellBIOSprovider is already loaded. If not, load it.
   try{
    $bool = Confirm-DellPSDrive -verbose
    }
    catch 
    {
        write-Verbose $_
        $msg = "Get-TargetResource: $($_.Exception.Message)"
        Write-DellEventLog -Message $msg -EventID 1 -EntryType 'Error'
        write-Verbose "Exiting Get-TargetResource"
        return
    }
    if ($bool) {                      
        Write-Verbose "Dell PS-Drive DellSmbios is found."
    }
    else{
        $Message = “Get-TargetResource: Module DellBiosProvider was imported correctly."
        Write-DellEventLog -Message $Message -EventID 2 
    }

    $Get = get-childitem -path @("DellSmbios:\" + $Category)
     # Removing Verbose and Debug from output
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null

  
    $out = @{}   
    $Get | foreach-Object {$out.Add($_.Attribute, $_.CurrentValue)}
    $out.add('Category', $Category )
    $out

}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $WatchdogTimer,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MEMSSensors,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $KeyboardBacklightOnAc,
        
        [ValidateSet("Enabled","Disabled","Auto")]
        [System.String]
        $IntegratedAudio,
        
        [ValidateSet("Enabled","Disabled","Low","Medium","High")]
        [System.String]
        $InternalSpeaker,
        
        [ValidateSet("Enabled","Disabled","EnabledPxe","OnWithImageServerBoot","EnabledwithRPLBoot","EnabledwithISCSIBoot")]
        [System.String]
        $EmbNic1,
        
        [ValidateSet("Off","25","50","75","100","Auto")]
        [System.String]
        $KeyboardIllumination,
        
        [ValidateSet("Ata","Disabled","Ahci","Raid")]
        [System.String]
        $EmbSataRaid,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $PowerButton,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OnboardSoundDevice,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IoModule,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $CanBus,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UefiNwStack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata0,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata4,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata7,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas3,
        
        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel1,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel2,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel3,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel4,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel5,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel6,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel7,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel8,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $SmartErrors,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisOsdBtn,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd1FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd2FanEnable,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd3FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPowerShare,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Microphone,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DockSupportOnBattery,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UnobtrusiveMode,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Touchscreen,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MmioAbove4Gb,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IntegratedSas,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OptionalBootSequence,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $NearFieldComputing,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePxeNextBoot,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePXEasFirstBootDevice,

        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    if (-not(CheckModuleLoaded)) {
        Write-Verbose -Message 'Required module DellBiosProvider does not exist. Exiting.'
        return $true
    }

    $DellPSDrive = get-psdrive -name Dellsmbios
    if ( !$DellPSDrive)
    {
        $Message = "Drive DellSmbios is not found. Exiting."
        Write-Verbose $Message
        Write-DellEventLog -Message $Message -EventID 3 -EntryType "Error"
        return $true
    }
    $attributes_desired = $PSBoundParameters
    $atts = $attributes_desired

    $pathToCategory = $DellPSDrive.Name + ':\' + $atts["Category"]
    
    Dir $pathToCategory -verbose

    $atts.Remove("Verbose") | out-null
    $atts.Remove("Category") | out-null
    $atts.Remove("Debug") | out-null
    $securePwd=$atts["SecurePassword"]
    $passwordSet=$atts["Password"]
    $atts.Remove("Password") | Out-Null
    $atts.Remove("SecurePassword") | Out-Null
    $pathToKey=$atts["PathToKey"]
    if(-Not [string]::IsNullOrEmpty($pathToKey))
    {  
        if(Test-Path $pathToKey)
        {
        $key=Get-Content $pathToKey
        }
        else
        {
        $key=""
        }
    }
    $atts.Remove("PathToKey") | Out-Null
    
    #foreach($a in Import-Csv((Get-DellBIOSEncryptionKey)))
    #{
   # $key+=$a
   # }
    $atts.Keys | foreach-object { 
                   # $atts[$_]
                    $path = $pathToCategory + '\' + $($_)
                    $value = $atts[$_]
            if(-Not [string]::IsNullOrEmpty($securePwd))
            {                
            $pasvar=ConvertTo-SecureString $securePwd.ToString() -Key $key
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -PasswordSecure $pasvar
            }

            elseif(-Not [string]::IsNullOrEmpty($passwordSet))
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -Password $passwordSet
            }

            else
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue
            }
                    if ( $ev) { 
                        $cmdline = $ExecutionContext.InvokeCommand.ExpandString($ev.InvocationInfo.Line)
                        $Message = "An error occured in executing " + $cmdline + "`nError message: $($ev.ErrorDetails)"
                        Write-Verbose $Message
                        Write-DellEventLog -Message $Message -EventID 5 -EntryType "Error"
                    }
                    
                 }



}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $WatchdogTimer,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MEMSSensors,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $KeyboardBacklightOnAc,
        
        [ValidateSet("Enabled","Disabled","Auto")]
        [System.String]
        $IntegratedAudio,
        
        [ValidateSet("Enabled","Disabled","Low","Medium","High")]
        [System.String]
        $InternalSpeaker,
        
        [ValidateSet("Enabled","Disabled","EnabledPxe","OnWithImageServerBoot","EnabledwithRPLBoot","EnabledwithISCSIBoot")]
        [System.String]
        $EmbNic1,
        
        [ValidateSet("Ata","Disabled","Ahci","Raid")]
        [System.String]
        $EmbSataRaid,
        
        [ValidateSet("Off","25","50","75","100","Auto")]
        [System.String]
        $KeyboardIllumination,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $PowerButton,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OnboardSoundDevice,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IoModule,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $CanBus,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UefiNwStack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata0,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata4,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Sata7,
                
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Minisas3,
        
        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel1,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel2,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel3,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel4,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel5,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel6,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel7,

        [ValidateSet("Unused","ADCInput","DACOutput","DACAndADC","GPIO")]
        [System.String]
        $AnalogDigitalInterfaceModeChannel8,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $SmartErrors,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisOsdBtn,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd1FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd2FanEnable,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Hdd3FanEnable,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $LiquidCooler2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPowerShare,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Microphone,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DockSupportOnBattery,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UnobtrusiveMode,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Touchscreen,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd0,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $M2PcieSsd1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $MmioAbove4Gb,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $IntegratedSas,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $OptionalBootSequence,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $NearFieldComputing,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePxeNextBoot,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ForcePXEasFirstBootDevice,

        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    $Get = Get-TargetResource $PSBoundParameters['Category'] -verbose

    New-DellEventLog
 
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null
    $PSBoundParameters.Remove("Category") | out-null
    $PSBoundParameters.Remove("Password") | out-null
    $PSBoundParameters.Remove("SecurePassword") | out-null

    $attributes_desired = $PSBoundParameters

    $bool = $true

    foreach ($config_att in  $PSBoundParameters.GetEnumerator())
    {
        if ($Get.ContainsKey($config_att.Key)) {
            $currentvalue = $Get[$config_att.Key]
            $currentvalue_nospace = $currentvalue -replace " ", ""
            if ($config_att.Value -ne $currentvalue_nospace){
                $bool = $false
                $drift  = "`nCurrentValue: $currentvalue_nospace`nDesiredValue: $($config_att.value)"
                $message = "Configuration is drifted in category $Category for $($config_att.Key). $drift"
                write-verbose $message
                Write-DellEventLog -Message $message -EventID 4 -EntryType Warning
            
            }
            else {
                write-Debug "Configuration is same for $config_att."
            }
    }
    else
    {
        $message = "Unsupported attribute $($config_att)"
        Write-Verbose $message
    }
   }
   return $bool

}


Export-ModuleMember -Function *-TargetResource


# SIG # Begin signature block
# MIIVSQYJKoZIhvcNAQcCoIIVOjCCFTYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA4Az6XVCkHKTAy
# E+pNcoeZJZG2c5xN+fUyz8o2O6G03qCCCiMwggTCMIIDqqADAgECAhANhLMrA8kb
# dRADSKysMihfMA0GCSqGSIb3DQEBCwUAMH8xCzAJBgNVBAYTAlVTMR0wGwYDVQQK
# ExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1c3Qg
# TmV0d29yazEwMC4GA1UEAxMnU3ltYW50ZWMgQ2xhc3MgMyBTSEEyNTYgQ29kZSBT
# aWduaW5nIENBMB4XDTE2MDEyMDAwMDAwMFoXDTE5MDIxODIzNTk1OVowWjELMAkG
# A1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRMwEQYDVQQHEwpSb3VuZCBSb2NrMRIw
# EAYDVQQKFAlEZWxsIEluYy4xEjAQBgNVBAMUCURlbGwgSW5jLjCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAIiB7p20xoJ8RMmDhIKNR/g0X6OhJWWiaLL6
# OY8sCfY9B8BhCOKzCgNQU+g5Jdu5GZ+J7G8S7evlJfhskLH4fhkGYjn4a1sPw/mD
# m/qMaE4n9WLaRourdOIIWgYftCGmjrlpTq7d4rYZ+Oo+iaQTR1OIrnJ7UbV6YYKp
# /buZ3pcrWAB7ox3UDeH/UigGP+QIix5mQrRmQLgZyJkg5V9EB/m2HYmQ+w13VNIf
# adxPklaF1sNMJTRwzKzqZru4N7goue63NAu8COhQ9+c8MIom+VjDVuDR01UY25vQ
# IVJ8Sbk3ORD20Eb6a7ZxVb29Lkn6/cOccCf6tuAe7sd9skZAbJsCAwEAAaOCAV0w
# ggFZMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeAMCsGA1UdHwQkMCIwIKAeoByG
# Gmh0dHA6Ly9zdi5zeW1jYi5jb20vc3YuY3JsMGEGA1UdIARaMFgwVgYGZ4EMAQQB
# MEwwIwYIKwYBBQUHAgEWF2h0dHBzOi8vZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUF
# BwICMBkMF2h0dHBzOi8vZC5zeW1jYi5jb20vcnBhMBMGA1UdJQQMMAoGCCsGAQUF
# BwMDMFcGCCsGAQUFBwEBBEswSTAfBggrBgEFBQcwAYYTaHR0cDovL3N2LnN5bWNk
# LmNvbTAmBggrBgEFBQcwAoYaaHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcnQwHwYD
# VR0jBBgwFoAUljtT8Hkzl699g+8uK8zKt4YecmYwHQYDVR0OBBYEFIb5/xrKh87H
# XzS6cRL1o7LqbfaDMA0GCSqGSIb3DQEBCwUAA4IBAQCFWAnqZghMKytZjfSKt94F
# eB/VfyFl+3tWhPN8SFkXUdIDljd3t5dggtIYAc7TPKfOr8JngIRQmM0lOyj/bzOM
# Chdb8nEbKV4R6krbF423gSVFcYoZsiCoqV2An5OrnnRDPPmgWs5wJvgwk/iGeEYE
# /DQE8J0hWVr4tTQVKRaCBM4DVfK4Z2Mp5BAewp9jxvDS/cuguTQdQP+mtYxmkkXU
# SyTq+olOm8YVPAw0tpRGbZjPdxK2++EIeVrTL7jscqhuMx8d985A4corhmQdZ7Un
# qTurFTSdgqxqZeJiYVFqhp1c9wbCwFuCSTyJiissW+BC4lt+N2oFOSieit7gnmP8
# MIIFWTCCBEGgAwIBAgIQPXjX+XZJYLJhffTwHsqGKjANBgkqhkiG9w0BAQsFADCB
# yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
# ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
# U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
# ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
# aG9yaXR5IC0gRzUwHhcNMTMxMjEwMDAwMDAwWhcNMjMxMjA5MjM1OTU5WjB/MQsw
# CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
# BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMDAuBgNVBAMTJ1N5bWFudGVjIENs
# YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
# ggEPADCCAQoCggEBAJeDHgAWryyx0gjE12iTUWAecfbiR7TbWE0jYmq0v1obUfej
# DRh3aLvYNqsvIVDanvPnXydOC8KXyAlwk6naXA1OpA2RoLTsFM6RclQuzqPbROlS
# Gz9BPMpK5KrA6DmrU8wh0MzPf5vmwsxYaoIV7j02zxzFlwckjvF7vjEtPW7ctZlC
# n0thlV8ccO4XfduL5WGJeMdoG68ReBqYrsRVR1PZszLWoQ5GQMWXkorRU6eZW4U1
# V9Pqk2JhIArHMHckEU1ig7a6e2iCMe5lyt/51Y2yNdyMK29qclxghJzyDJRewFZS
# AEjM0/ilfd4v1xPkOKiE1Ua4E4bCG53qWjjdm9sCAwEAAaOCAYMwggF/MC8GCCsG
# AQUFBwEBBCMwITAfBggrBgEFBQcwAYYTaHR0cDovL3MyLnN5bWNiLmNvbTASBgNV
# HRMBAf8ECDAGAQH/AgEAMGwGA1UdIARlMGMwYQYLYIZIAYb4RQEHFwMwUjAmBggr
# BgEFBQcCARYaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIw
# HBoaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYf
# aHR0cDovL3MxLnN5bWNiLmNvbS9wY2EzLWc1LmNybDAdBgNVHSUEFjAUBggrBgEF
# BQcDAgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRow
# GAYDVQQDExFTeW1hbnRlY1BLSS0xLTU2NzAdBgNVHQ4EFgQUljtT8Hkzl699g+8u
# K8zKt4YecmYwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwDQYJKoZI
# hvcNAQELBQADggEBABOFGh5pqTf3oL2kr34dYVP+nYxeDKZ1HngXI9397BoDVTn7
# cZXHZVqnjjDSRFph23Bv2iEFwi5zuknx0ZP+XcnNXgPgiZ4/dB7X9ziLqdbPuzUv
# M1ioklbRyE07guZ5hBb8KLCxR/Mdoj7uh9mmf6RWpT+thC4p3ny8qKqjPQQB6rqT
# og5QIikXTIfkOhFf1qQliZsFay+0yQFMJ3sLrBkFIqBgFT/ayftNTI/7cmd3/SeU
# x7o1DohJ/o39KK9KEr0Ns5cF3kQMFfo2KwPcwVAB8aERXRTl4r0nS1S+K4ReD6bD
# dAUK75fDiSKxH3fzvc1D1PFMqT+1i4SvZPLQFCExggp8MIIKeAIBATCBkzB/MQsw
# CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
# BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMDAuBgNVBAMTJ1N5bWFudGVjIENs
# YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQQIQDYSzKwPJG3UQA0isrDIoXzAN
# BglghkgBZQMEAgEFAKCBrDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQge/1hMIQJ
# k3h7oinpd7ot31/XESfCqGYLELS8E+6r9XIwQAYKKwYBBAGCNwIBDDEyMDCgFoAU
# AEQAZQBsAGwALAAgAEkAbgBjAC6hFoAUaHR0cDovL3d3dy5kZWxsLmNvbSAwDQYJ
# KoZIhvcNAQEBBQAEggEAWrXJ3Z5JKm56B6ZhOs7gtoHXOWzzZ+8OdJYbYxyExAFt
# ibA4lG5zAsGZ9dlHRLJqiQa4tjukX2zY8s5uvMP56coH2HdUIdahmYF5Ao5XOIxn
# y33ylV1Q0UPyAzo3p5CfGcAc+Xv2qfou8WriTkK2AqU6rDC4rHCjpgzjb6E31xza
# 2lwUmqlTPs0RvRMjYfJl1IJn8Uulp9x8ayz+NSotgyOZzVYF0rly5BzkRASn8pTv
# F/XZkgfrqK3XZ4436JG9PNBwVB1SZQr54Qs+i6mmCQwo/qw4wWWK4R+3o3H+HzZ/
# 3TfWM53ekE2ayZOKuCFbz76Kjn4wJvL3l16y2pRYs6GCCAowgggGBgorBgEEAYI3
# AwMBMYIH9jCCB/IGCSqGSIb3DQEHAqCCB+MwggffAgEDMQ8wDQYJYIZIAWUDBAIB
# BQAwbQYLKoZIhvcNAQkQAQSgXgRcMFoCAQEGCmCGSAGG/W4BBxgwMTANBglghkgB
# ZQMEAgEFAAQgm+rjX5cVsScClrOAi8JSL2mWj7MjvtbD07w2F3ElALUCBQUSLZYT
# GA8yMDE3MDcwNDExMjAxOVqgggTxMIIE7TCCA9WgAwIBAgIIPG49fSM2JU0wDQYJ
# KoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw
# EQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9n
# aWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
# dXRob3JpdHkgLSBHMjAeFw0xNjEyMTMwNzAwMDBaFw0yMTEyMTMwNzAwMDBaMIGI
# MQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRz
# ZGFsZTElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjErMCkG
# A1UEAxMiU3RhcmZpZWxkIFRpbWVzdGFtcCBBdXRob3JpdHkgLSBHMjCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMSt+zDfQd/+EDESIH4xIOLzJkCgOFq
# yWKYMsVjvYH7vCdlU0EAGu2AlzYiIjKbaGYLbQFtOf+ohaiLl6ewX04FImdW6c97
# 5Uoie+XnMGYOVySnWHIXv/q6fFX7Rgwh50vOMCDuKHCCpx3MrYU5g0kP3J+Psv9j
# E2Nc0jkOeHQadrpVTo8HGCWoz7XCLFIfCdjjWkoDLu4B0/9yehNaC+ZwrOy9cnUE
# NhnE/+0WMIoUdOLkD/Eq24ATVBVXBe7Q3o4/7hzYWPoABigrHpB6q1u1ILpB+Ze2
# K3rdWz4t93k+yqCybnZVFKuJZy53VS4PDszfiRHfIEZo2TZGBgIVfX8CAwEAAaOC
# AVAwggFMMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgbAMBYGA1UdJQEB/wQM
# MAoGCCsGAQUFBwMIMB0GA1UdDgQWBBTFhkohftnytX2hAaysXl3+FYL3vzAfBgNV
# HSMEGDAWgBR8DDIfp9kwf8R9aKNiqKHOqwdbJzA6BggrBgEFBQcBAQQuMCwwKgYI
# KwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnN0YXJmaWVsZHRlY2guY29tLzBGBgNVHR8E
# PzA9MDugOaA3hjVodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRv
# cnkvc2Zyb290LWcyLmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4BBxcCMDYwNAYI
# KwYBBQUHAgEWKGh0dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9y
# eS8wDQYJKoZIhvcNAQELBQADggEBAC1Tnm2HG1bh1d39Qe2NWq9CxxtZRHG3BR0h
# jgVznfEgv9I7fSQrnKbuE1q03r7BkLyZ57qQPIHN7Sm/DtfRpQ/XzO3V/SKcXcHp
# LSZNjCX38cTr4Bpnk0TzQFtCYiFGjEY66pvDLKOLdkpXqfdZjxCyhpAArlcH9EhO
# HEMjXDgJnurEtSG4G5RpS1/hA6BDI6+v/rgTCEuKUVCVMwkUWF5+elrNt2UN2SJA
# uwRwoYddTw3w68FU6YlPydL9DGxdS8UzP4udpfkuZGekvHm2nikbD+4J7NDXm4k9
# c2NzMwbdVlg7LDCoqVntapOQqZS4XMqSD6/eo/X14FBwhx4tB60xggJjMIICXwIB
# ATCBnDCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcT
# ClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIElu
# Yy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
# eSAtIEcyAgg8bj19IzYlTTANBglghkgBZQMEAgEFAKCBmDAaBgkqhkiG9w0BCQMx
# DQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTE3MDcwNDExMjAxOVowKwYL
# KoZIhvcNAQkQAgwxHDAaMBgwFgQUcUS1PxpdOR3drHG2ByGQjJsb8/YwLwYJKoZI
# hvcNAQkEMSIEILG/T/FCszr/SoL6XXg69sZlwT75i+7MyTVkov9w4y4kMA0GCSqG
# SIb3DQEBAQUABIIBALdCveOJfjB6diipOimuD9UaMKgFAapnBoQHT1vI8p3ty/VN
# Pp2IJrZvn5QwceY8+yyv/rhQNKLJVXTPGRwM2wYQX6IqFOSPj8Hm6oeIi26V9A+c
# IgsdNNsVO/GTya7Nzh9kPbach2/+YwLUjg1kkCsBBX/7JNoFsSHGqB8ktr1TQ14B
# p2euZNzvYbv+eNItDWQkairFi9hzTPbB3bIQz+I3yRy7hcBxhGdW0uTNUCbBjZWe
# DXPJWmipS7G4f4Nv1Iyz0jGdf5P2pMSKzOzJZ5VCo4WgDLx3ar49Kodj3HUQIEwT
# MiTLUl5uBegi5F4w1eMv5pbjIabiV0ZxB34jpVo=
# SIG # End signature block