DSCResources/DCPP_PowerManagement/DCPP_PowerManagement.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]
        $BlockDefinition
    )

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

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


    <#
    $returnValue = @{
        BlockDefinition = [System.String]
        Category = [System.String]
        AutoOn = [System.String]
        AutoOnHr = [System.UInt16]
        AutoOnMn = [System.UInt16]
        AutoOnSun = [System.String]
        AutoOnMon = [System.String]
        AutoOnTue = [System.String]
        AutoOnWed = [System.String]
        AutoOnThur = [System.String]
        AutoOnFri = [System.String]
        AutoOnSat = [System.String]
        DeepSleepCtrl = [System.String]
        FanSpeed = [System.String]
        FanSpeedLvl = [System.UInt16]
        UsbWake = [System.String]
        FanCtrlOvrd = [System.String]
        AcPwrRcvry = [System.String]
        WakeOnLan = [System.String]
        SfpwakeOnLan = [System.String]
        WakeOnAc = [System.String]
        WakeOnDock = [System.String]
        LidSwitch = [System.String]
        BlinkPowerSupply1LED = [System.String]
        BlinkPowerSupply2LED = [System.String]
        WlanAutoSense = [System.String]
        WwanAutoSense = [System.String]
        BlockSleep = [System.String]
        SleepMode = [System.String]
        PrimaryBattChargeCfg = [System.String]
        CustomChargeStart = [System.UInt16]
        CustomChargeStop = [System.UInt16]
        SliceBattChargeCfg = [System.String]
        ModBattChargeCfg = [System.String]
        DockBatteryChargeConfiguration = [System.String]
        IntlSmartConnect = [System.String]
        IntelReadyModeEn = [System.String]
        PeakShiftCfg = [System.String]
        PeakShiftBatteryThreshold = [System.UInt16]
        PeakShiftDayConfiguration = [System.String]
        StartTime = [System.String]
        EndTime = [System.String]
        ChargeStartTime = [System.String]
        AdvBatteryChargeCfg = [System.String]
        AdvancedBatteryChargeConfiguration = [System.String]
        Type_CBatteryOverloadProtection = [System.String]
        BeginningOfDay = [System.String]
        WorkPeriod = [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]
        $BlockDefinition,

        [System.String]
        $Category,

        [ValidateSet("EveryDay","Disabled","WeekDays","SelectDays")]
        [System.String]
        $AutoOn,

        [System.UInt16]
        $AutoOnHr,

        [System.UInt16]
        $AutoOnMn,
        
        [System.UInt16]
        $AutoWakePeriod,

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

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

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

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

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

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

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

        [ValidateSet("Disabled","S5Only","S4AndS5")]
        [System.String]
        $DeepSleepCtrl,

        [ValidateSet("Auto","High","Med","Low","MedHigh","MedLow")]
        [System.String]
        $FanSpeed,

        [System.UInt16]
        $FanSpeedLvl,

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

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

        [ValidateSet("Off","On","Last")]
        [System.String]
        $AcPwrRcvry,

        [ValidateSet("AddInCard","Onboard","Disabled","LanOnly","LanWithPxeBoot","WlanOnly","LanWlan")]
        [System.String]
        $WakeOnLan,

        [ValidateSet("SFP","LANSFP","SFPPXE")]
        [System.String]
        $SfpwakeOnLan,

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

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

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

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

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

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

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

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

        [ValidateSet("OSAutomaticSelection","ForceS3")]
        [System.String]
        $SleepMode,

        [ValidateSet("Auto","Standard","Express","PrimAcUse","Custom")]
        [System.String]
        $PrimaryBattChargeCfg,

        [System.UInt16]
        $CustomChargeStart,

        [System.UInt16]
        $CustomChargeStop,

        [ValidateSet("Standard","Express")]
        [System.String]
        $SliceBattChargeCfg,

        [ValidateSet("Standard","Express")]
        [System.String]
        $ModBattChargeCfg,

        [ValidateSet("Standard","Express")]
        [System.String]
        $DockBatteryChargeConfiguration,

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

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

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $PeakShiftCfg,
        
        [ValidateSet("LanOnly","Disabled","LanWithPxeBoot")]
        [System.String]
        $WakeOnLan2,

        [System.UInt16]
        $PeakShiftBatteryThreshold,

        [System.String]
        $PeakShiftDayConfiguration,

        [System.String]
        $StartTime,

        [System.String]
        $EndTime,

        [System.String]
        $ChargeStartTime,

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

        [System.String]
        $AdvancedBatteryChargeConfiguration,

        [ValidateSet("7.5Watts","15Watts")]
        [System.String]
        $Type_CBatteryOverloadProtection,

        [System.String]
        $BeginningOfDay,

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

        [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
    }

      
    $atts = $PSBoundParameters

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

    $atts.Remove("Verbose") | out-null
    $atts.Remove("Category") | out-null
    $atts.Remove("Debug") | out-null
    $atts.Remove("BlockDefinition") | out-null
    $startTime=$atts['StartTime']
    $endTime=$atts['EndTime']
    $chargeStartTime=$atts['ChargeStartTime']
    $atts.Remove("StartTime") | out-null
    $atts.Remove("EndTime") | out-null
    $atts.Remove("ChargeStartTime") | out-null
    $beginningOfDay=$atts['BeginningOfDay']
    $workPeriod=$atts['WorkPeriod']
    $atts.Remove("BeginningOfDay") | out-null
    $atts.Remove("WorkPeriod") | 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

    $atts.Keys | foreach-object {
                    
                    if($($_) -eq "PeakShiftDayConfiguration")
                    {
                     $path = $pathToCategory + '\' + $($_)
                    $value = $atts[$_]
                    if(-Not [string]::IsNullOrEmpty($securePwd))
                    {                
                    $pasvar=ConvertTo-SecureString $securePwd.ToString() -Key $key
                    Set-Item  -path $path -value $value -StartTime $startTime -EndTime $endTime -ChargeStartTime $chargeStartTime -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -PasswordSecure $pasvar
                    }

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

                    else
                    {
                    Set-Item  -path $path -value $value -StartTime $startTime -EndTime $endTime -ChargeStartTime $chargeStartTime -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"
                    }
                    }
                    
                    elseif($($_) -eq "AdvancedBatteryChargeConfiguration")
                    {
                     $path = $pathToCategory + '\' + $($_)
                    $value = $atts[$_]
                    
                    if(-Not [string]::IsNullOrEmpty($securePwd))
                    {                
                    $pasvar=ConvertTo-SecureString $securePwd.ToString() -Key $key
                    Set-Item  -path $path -value $value -BeginningOfDay $beginningOfDay -WorkPeriod $workPeriod -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -PasswordSecure $pasvar
                    }

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

                    else
                    {
                    Set-Item  -path $path -value $value -BeginningOfDay $beginningOfDay -WorkPeriod $workPeriod -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"
                    }
                    }
                    
                     else
                     {
                     $path=""
                        if($($_) -eq "Type_CBatteryOverloadProtection")
                    {
                    $path = $pathToCategory + '\' + "Type-CBatteryOverloadProtection"
                    }                     

                    else
                    {
                    $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]
        $BlockDefinition,

        [System.String]
        $Category,

        [ValidateSet("EveryDay","Disabled","WeekDays","SelectDays")]
        [System.String]
        $AutoOn,

        [System.UInt16]
        $AutoOnHr,

        [System.UInt16]
        $AutoOnMn,
        
        [System.UInt16]
        $AutoWakePeriod,

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

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

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

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

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

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

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

        [ValidateSet("Disabled","S5Only","S4AndS5")]
        [System.String]
        $DeepSleepCtrl,

        [ValidateSet("Auto","High","Med","Low","MedHigh","MedLow")]
        [System.String]
        $FanSpeed,

        [System.UInt16]
        $FanSpeedLvl,

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

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

        [ValidateSet("Off","On","Last")]
        [System.String]
        $AcPwrRcvry,

        [ValidateSet("AddInCard","Onboard","Disabled","LanOnly","LanWithPxeBoot","WlanOnly","LanWlan")]
        [System.String]
        $WakeOnLan,

        [ValidateSet("SFP","LANSFP","SFPPXE")]
        [System.String]
        $SfpwakeOnLan,

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

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

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

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

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

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

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

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

        [ValidateSet("OSAutomaticSelection","ForceS3")]
        [System.String]
        $SleepMode,

        [ValidateSet("Auto","Standard","Express","PrimAcUse","Custom")]
        [System.String]
        $PrimaryBattChargeCfg,

        [System.UInt16]
        $CustomChargeStart,

        [System.UInt16]
        $CustomChargeStop,

        [ValidateSet("Standard","Express")]
        [System.String]
        $SliceBattChargeCfg,

        [ValidateSet("Standard","Express")]
        [System.String]
        $ModBattChargeCfg,

        [ValidateSet("Standard","Express")]
        [System.String]
        $DockBatteryChargeConfiguration,

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

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

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

        [System.UInt16]
        $PeakShiftBatteryThreshold,

        [System.String]
        $PeakShiftDayConfiguration,

        [System.String]
        $StartTime,

        [System.String]
        $EndTime,

        [System.String]
        $ChargeStartTime,

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

        [System.String]
        $AdvancedBatteryChargeConfiguration,

        [ValidateSet("7.5Watts","15Watts")]
        [System.String]
        $Type_CBatteryOverloadProtection,

        [System.String]
        $BeginningOfDay,

        [System.String]
        $WorkPeriod,
                
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $SpeedShift,
        
        [ValidateSet("LanOnly","Disabled","LanWithPxeBoot")]
        [System.String]
        $WakeOnLan2,

        [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

    $startTime=$PSBoundParameters['StartTime']
    $endTime=$PSBoundParameters['EndTime']
    $chargestartTime=$PSBoundParameters['ChargeStartTime']
    $beginningOfDay=$PSBoundParameters['BeginningOfDay']
    $workPeriod=$PSBoundParameters['WorkPeriod']

    $PSBoundParameters.Remove("StartTime") | out-null
    $PSBoundParameters.Remove("EndTime") | out-null
    $PSBoundParameters.Remove("ChargeStartTime") | out-null
    $PSBoundParameters.Remove("BeginningOfDay") | out-null
    $PSBoundParameters.Remove("WorkPeriod") | out-null
    $PSBoundParameters.Remove("BlockDefinition") | out-null

   $bool = $true

  
   foreach ($config_att in  $PSBoundParameters.GetEnumerator())
   {
    if ($Get.ContainsKey($config_att.Key)) {
    if($config_att.Key -match "PeakShiftDayConfiguration")
    {
    $currentvalue = $Get[$config_att.Key]
    $whichDay=$config_att.Value


    if($whichDay -eq "Monday")
    {
    $iIndex=0
    }

    elseif($whichDay -eq "Tuesday")
    {
    $iIndex=1
    }

    elseif($whichDay -eq "Wednesday")
    {
    $iIndex=2
    }

        elseif($whichDay -eq "Thursday")
    {
    $iIndex=3
    }

        elseif($whichDay -eq "Friday")
    {
    $iIndex=4
    }

        elseif($whichDay -eq "Saturday")
    {
    $iIndex=5
    }

        elseif($whichDay -eq "Sunday")
    {
    $iIndex=6
    }

            if (($currentvalue[$iIndex].StartTime -ne $startTime) -or ($currentvalue[$iIndex].EndTime -ne $endTime) -or ($currentvalue[$iIndex].ChargeStartTime -ne $chargestartTime)){
            $bool = $false
            #$drift = "`nCurrentValue: $currentvalue_nospace`nDesiredValue: $($config_att.value)"
            $drift  = "`nCurrentValue: StartTime "+$currentvalue[$iIndex].StartTime+" EndTime "+$currentvalue[$iIndex].EndTime+" ChargeStartTime "+$currentvalue[$iIndex].ChargeStartTime+"`nDesiredValue: StartTime "+$startTime+" EndTime "+$endTime+" ChargeStartTime "+$chargestartTime
            $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."
        
        }

    }

    elseif($config_att.Key -match "AdvancedBatteryChargeConfiguration")
    {
    $currentvalue = $Get[$config_att.Key]
    $whichDay=$config_att.Value


    if($whichDay -eq "Monday")
    {
    $iIndex=0
    }

    elseif($whichDay -eq "Tuesday")
    {
    $iIndex=1
    }

    elseif($whichDay -eq "Wednesday")
    {
    $iIndex=2
    }

        elseif($whichDay -eq "Thursday")
    {
    $iIndex=3
    }

        elseif($whichDay -eq "Friday")
    {
    $iIndex=4
    }

        elseif($whichDay -eq "Saturday")
    {
    $iIndex=5
    }

        elseif($whichDay -eq "Sunday")
    {
    $iIndex=6
    }

            if (($currentvalue[$iIndex].BeginningOfDay -ne $beginningOfDay) -or ($currentvalue[$iIndex].WorkPeriod -ne $workPeriod)){
            $bool = $false
            #$drift = "`nCurrentValue: $currentvalue_nospace`nDesiredValue: $($config_att.value)"
            $drift  = "`nCurrentValue: BeginningOfDay "+$currentvalue[$iIndex].BeginningOfDay+" WorkPeriod "+$currentvalue[$iIndex].WorkPeriod+"`nDesiredValue: BeginningOfDay "+$beginningOfDay+" WorkPeriod "+$workPeriod
            $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
    {
     $currentvalue=""
    if($config_att.Key -match "Type_CBatteryOverloadProtection")
    {
    $currentvalue = $Get["Type-CBatteryOverloadProtection"]
    }
    else
    {
        $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
# MIIbFQYJKoZIhvcNAQcCoIIbBjCCGwICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAobZh4LxqOtTwx
# LOGi1r5SQObPHnLtmViLjo6aWmuPB6CCCiMwggTCMIIDqqADAgECAhANhLMrA8kb
# 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+1i4SvZPLQFCExghBIMIIQRAIBATCBkzB/MQsw
# CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
# BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMDAuBgNVBAMTJ1N5bWFudGVjIENs
# YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQQIQDYSzKwPJG3UQA0isrDIoXzAN
# BglghkgBZQMEAgEFAKCBrDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgWnh2bRld
# 4dZktN+5yOehYZpjE5BkmjizjSSzhTAIfdswQAYKKwYBBAGCNwIBDDEyMDCgFoAU
# AEQAZQBsAGwALAAgAEkAbgBjAC6hFoAUaHR0cDovL3d3dy5kZWxsLmNvbSAwDQYJ
# KoZIhvcNAQEBBQAEggEAUBeZP0VDRQrtmr730Frh/+UNxpGzdpfzvL3bvsnpunDJ
# 2VSPJzFIf5pBL9Lg9a1no0ORfsGZoQHOC7XRlRhS6eMb1I4yAjeVWauHzqlurTYm
# 63DmKHKH/VUiC0qcrXaYNwRX5UYY1SVRuBtWBsB8BF6rEPptMNv7zRrybi8ftGze
# on32t+3vpxHSD1opya8vCCAVjE+qwcNEtbDVOkLghu4m2mjJVu8CKqcofoO8+sWx
# BNQHTsSGmimPcaVYEIugTUbVcesT/Dh0x0MQtQLH/sl3OZzwLksvr9T0/IN1pS7T
# tXdz5iYtPgtrJDXn+KxlLdcItMWBIhJAvD3Uuz0th6GCDdYwgg3SBgorBgEEAYI3
# AwMBMYINwjCCDb4GCSqGSIb3DQEHAqCCDa8wgg2rAgEDMQ8wDQYJYIZIAWUDBAIB
# BQAwbQYLKoZIhvcNAQkQAQSgXgRcMFoCAQEGCmCGSAGG/W4BBxgwMTANBglghkgB
# ZQMEAgEFAAQglgBv1yHNmMFoAW9WuBExQG1S4DPWNC/T06PL5rCl5JYCBTEsxKKX
# GA8yMDE4MDUxNTA3MDAzNVqgggqFMIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0B
# AQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcT
# ClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIElu
# Yy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
# eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNV
# BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUw
# IwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypo
# dHRwOi8vY2VydHMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNV
# BAMTK1N0YXJmaWVsZCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIw
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9K
# yUhpgXVObST2yxcT+LBxWYR6ayuFpDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDY
# av9ZJ6t21vwLdGu4p64/xFT0tDFE3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDx
# UJuHrtQLEAX7J7oobRfpDtZNuTlVBv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/
# UsQwxaXJDgLFU793OGgGJMNmyDd+MB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3
# YISLdkuRJ3MUkuDq7o8W6o0OPnYXv32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSD
# AgMBAAGjggEsMIIBKDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
# BgNVHQ4EFgQUJUWBaFAmOD07LSy+zWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZ
# MH/EfWijYqihzqsHWycwOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRw
# Oi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0
# cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARF
# MEMwQQYEVR0gADA5MDcGCCsGAQUFBwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVs
# ZHRlY2guY29tL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8K
# qJOLGMfeQ2kTNCC+Tl94qGuc22pNQdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGI
# XFs+CFN69xpk37hQYcxTUUApS8L0rjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFf
# qhBJt2nk4NAfZKQrzR9voPiEJBjOeT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSA
# pAer+rKluYjdkf5lO6Sjeb6JTeHQsPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv
# 6VrcPuuUSvC33l8Odvr7+2kDRUBQ7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56
# gf0wrHofx1l7MIIFfTCCBGWgAwIBAgIJAO+VwvSA4xuTMA0GCSqGSIb3DQEBCwUA
# MIHGMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2Nv
# dHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEz
# MDEGA1UECxMqaHR0cDovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRv
# cnkvMTQwMgYDVQQDEytTdGFyZmllbGQgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhv
# cml0eSAtIEcyMB4XDTE3MTExNDA3MDAwMFoXDTIyMTExNDA3MDAwMFowgYcxCzAJ
# BgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxl
# MSQwIgYDVQQKExtTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBMTEMxKzApBgNVBAMT
# IlN0YXJmaWVsZCBUaW1lc3RhbXAgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQDm730Ku3SPyEahtiafyThSMSvGVFw6JhBrYkQY
# OcH10SjiERRWLn3DD51isWZDIrkxmTdy/zEt2m0qf2odGk7KRPeO7OMlEbeGS4Cc
# 11H7OvxG6VSADFbYTkrgGREeDgFxPA8WzeaJYFVwJq7kcoFSGN797hHOoYsd/GkD
# /iqnEjNfYRUcKdaH9b/Yzjwjte6uba5IeplsNx0eXWU+zy7bff21Qb1HQ0P0VTuY
# CbviRJknhKOZKSGuNhQ9CFDzMQbcbsbyx3+ov/iMaIGp7NHNlk/4hR1rFFmMwPRT
# /m123J8xGpoYBPPMOHyk15bF/1laR3kAr3fhbj0OQoUOUFIBAgMBAAGjggGpMIIB
# pTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIGwDAWBgNVHSUBAf8EDDAKBggr
# BgEFBQcDCDAdBgNVHQ4EFgQUnc8cgP4K1qL8WBg+p9NUQO7WFGEwHwYDVR0jBBgw
# FoAUJUWBaFAmOD07LSy+zWrZtj2zZmMwgYQGCCsGAQUFBwEBBHgwdjAqBggrBgEF
# BQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMEgGCCsGAQUFBzAC
# hjxodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2ZfaXNz
# dWluZ19jYS1nMi5jcnQwVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5zdGFy
# ZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L21hc3RlcnN0YXJmaWVsZDJpc3N1aW5n
# LmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4BBxcCMDYwNAYIKwYBBQUHAgEWKGh0
# dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeS8wDQYJKoZIhvcN
# AQELBQADggEBAFJGgfPKVmOa5BUYGkgzgZUHAPDVCxA0oDWH0E5+lQB0DlDHgv5G
# 6O4Ju2dqL9TAJfhRAS0i+PaXwLOWbz/yxZc9jpCNDbVWIRIZdxzXvR7dOSvRPgWF
# xW1Msip51ys9TQV2ybVAyA+CjVwuNOALYWrT2ZhQBEp47lbsLRag4VwYpydVkbfK
# a4Egad+0V0SHQrWxwnMaj/7PT+b8WilhTxTRXNWlxRlQ+9wla5Sqwn5PwafeJwv6
# eGS6nKC00cRPDQ6WDCo46VhOjkmv50J+o93p9LM2hkFuoRMrR5O3D8Zcg1jbab4r
# TDT+f+Wn5eYn9PwbYB7e4WMjRafylm5E3HoxggKbMIIClwIBATCB1DCBxjELMAkG
# A1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUx
# JTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMzAxBgNVBAsT
# Kmh0dHA6Ly9jZXJ0cy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzE0MDIG
# A1UEAxMrU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBH
# MgIJAO+VwvSA4xuTMA0GCWCGSAFlAwQCAQUAoIGYMBoGCSqGSIb3DQEJAzENBgsq
# hkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMTgwNTE1MDcwMDM1WjArBgsqhkiG
# 9w0BCRACDDEcMBowGDAWBBQNXjR81bN5Ps/q5rhg2w9VXb4kpTAvBgkqhkiG9w0B
# CQQxIgQgMzlZz2dj9JfZRfeTkPsG7eR5U3flzvHDbqR0eVVM1ZYwDQYJKoZIhvcN
# AQEBBQAEggEAt4VYKGN3KVOYr0IzeVitqnV4lKeCLXrSbZfafDNwq+UleuPVOGKa
# S5J37uwFeXQEkotyQ+sj+2DU70Di79JMUVOB83F3zx2s0/3gbJLgzSKnoCehzs5X
# KbA7fDzWwtj6daWCctS6SVGW7nVbGqRRkB3JECFw+MNXYOgmHgsYPI32ZQQnweNk
# EXlJXEQn8x/GV2krHLt8PlE8GRW2jUS0h14j8rqPFVTDinBHfgg1JyAcchNPAg1z
# sat78NJHqFMlF1nvydK+ZeBetMV1v6ns5Kgwf0w7bYXporZZB+bfWTJVM/UlhdMk
# NCtuVZqu07FxvEU4WMWhRRWpgW8N48KdKA==
# SIG # End signature block