Private/AllFunctions.ps1

function Add-ContentADKWinPE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return}
    if ([string]::IsNullOrWhiteSpace($WinPEADKPE)) {Return}
    $global:ReapplyLCU = $true
    #=================================================
    # Execute
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: WinPE.wim ADK Optional Components"

    $WinPEADKPE = $WinPEADKPE | Sort-Object Length
    foreach ($PackagePath in $WinPEADKPE) {
        if ($PackagePath -like "*WinPE-NetFx*") {
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }

    $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
    foreach ($PackagePath in $WinPEADKPE) {
        if ($PackagePath -like "*WinPE-PowerShell*") {
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }

    $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
    foreach ($PackagePath in $WinPEADKPE) {
        Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log"
        Write-Verbose "CurrentLog: $CurrentLog"
        if ($OSMajorVersion -eq 6) {
            dism /Image:"$MountWinPE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog"
        } else {
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentADKWinRE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return}
    if ([string]::IsNullOrWhiteSpace($WinPEADKRE)) {Return}
    $global:ReapplyLCU = $true
    #=================================================
    # Execute
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: WinRE.wim ADK Optional Components"

    $WinPEADKRE = $WinPEADKRE | Sort-Object Length
    foreach ($PackagePath in $WinPEADKRE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        if ($PackagePath -like "*WinPE-NetFx*") {
            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }

    $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
    foreach ($PackagePath in $WinPEADKRE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        if ($PackagePath -like "*WinPE-PowerShell*") {
            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
    foreach ($PackagePath in $WinPEADKRE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
        if ($OSMajorVersion -eq 6) {
            dism /Image:"$MountWinRE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog"
        } else {
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentADKWinSE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return}
    if ([string]::IsNullOrWhiteSpace($WinPEADKSE)) {Return}
    $global:ReapplyLCU = $true
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "WinPE: WinSE.wim ADK Optional Components"
    #=================================================
    # Execute
    #=================================================
    $WinPEADKSE = $WinPEADKSE | Sort-Object Length
    foreach ($PackagePath in $WinPEADKSE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        if ($PackagePath -like "*WinPE-NetFx*") {
            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
    foreach ($PackagePath in $WinPEADKSE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        if ($PackagePath -like "*WinPE-PowerShell*") {
            Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
    foreach ($PackagePath in $WinPEADKSE) {
        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log"
        Write-Verbose "CurrentLog: $CurrentLog"

        Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"
        if ($OSMajorVersion -eq 6) {
            dism /Image:"$MountWinSE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog.log"
        } else {
            Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentDriversOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # Task
    #=================================================
    if ($Drivers) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Drivers TASK"
        foreach ($Driver in $Drivers) {
            Write-Host " $SetOSDBuilderPathContent\$Driver" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversOS-Task.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            if ($OSMajorVersion -eq 6) {
                dism /Image:"$MountDirectory" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$Driver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog"
            } else {
                Try {Add-WindowsDriver -Driver "$SetOSDBuilderPathContent\$Driver" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null}
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }
    }
    #=================================================
    # Template
    #=================================================
    if ($DriverTemplates) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Drivers TEMPLATE"
        foreach ($Driver in $DriverTemplates) {
            Write-Host "$($Driver.FullName)" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversOS-Template.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            if ($OSMajorVersion -eq 6) {
                dism /Image:"$MountDirectory" /Add-Driver /Driver:"$($Driver.FullName)" /Recurse /ForceUnsigned /LogPath:"$CurrentLog"
            } else {
                Try {Add-WindowsDriver -Driver "$($Driver.FullName)" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null}
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }
    }
}
function Add-ContentDriversPE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # MountPaths
    #=================================================
    $MountPaths = @(
        $MountWinPE
        $MountWinRE
        $MountWinSE
    )
    #=================================================
    # Task
    #=================================================
    if ([string]::IsNullOrWhiteSpace($WinPEDrivers)) {Return}
    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Add-ContentDriversPE"
    foreach ($WinPEDriver in $WinPEDrivers) {
        Write-Host " $SetOSDBuilderPathContent\$WinPEDriver" -ForegroundColor DarkGray

        foreach ($MountPath in $MountPaths) {
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversPE-Task.log"
            Write-Verbose "CurrentLog: $CurrentLog"
    
            if ($OSMajorVersion -eq 6) {
                dism /Image:"$MountPath" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog"
            } else {
                Add-WindowsDriver -Path "$MountPath" -Driver "$SetOSDBuilderPathContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$CurrentLog" | Out-Null
            }
        }
    }
}
function Add-ContentExtraFilesOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # ABORT
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # TASK
    #=================================================
    if ($ExtraFiles) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Extra Files TASK"
        foreach ($ExtraFile in $ExtraFiles) {
        
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesOS-Task.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            Write-Host " $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray
            robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountDirectory" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
        }
    }
    #=================================================
    # TEMPLATE
    #=================================================
    if ($ExtraFilesTemplates) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Extra Files TEMPLATE"
        foreach ($ExtraFile in $ExtraFilesTemplates) {
        
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesOS-Template.log"
            Write-Verbose "CurrentLog: $CurrentLog"

            Write-Host "$($ExtraFile.FullName)" -ForegroundColor DarkGray
            robocopy "$($ExtraFile.FullName)" "$MountDirectory" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
        }
    }
}
function Add-ContentExtraFilesPE {
    [CmdletBinding()]
    param ()
    #=================================================
    # ABORT
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # TASK
    #=================================================
    if ($WinPEExtraFilesPE -or $WinPEExtraFilesRE -or $WinPEExtraFilesSE) {
        Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Extra Files TASK"
        foreach ($ExtraFile in $WinPEExtraFilesPE) {
            Write-Host " Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log"
            Write-Verbose "CurrentLog: $CurrentLog"
            #robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinPE" *.* /s /ndl /xx /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
            robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinPE" *.* /S /ZB /COPY:D /NODCOPY /XJ /NDL /NP /TEE /TS /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
        }
        foreach ($ExtraFile in $WinPEExtraFilesRE) {
            Write-Host " Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log"
            Write-Verbose "CurrentLog: $CurrentLog"
            robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinRE" *.* /S /ZB /COPY:D /NODCOPY /XJ /NDL /NP /TEE /TS /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
        }
        foreach ($ExtraFile in $WinPEExtraFilesSE) {
            Write-Host " Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray
            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log"
            Write-Verbose "CurrentLog: $CurrentLog"
            robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinSE" *.* /S /ZB /COPY:D /NODCOPY /XJ /NDL /NP /TEE /TS /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
        }
    } else {
        Return
    }
}
function Add-ContentScriptsOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # ABORT
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # TASK
    #=================================================
    if ($Scripts) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Scripts TASK"
        foreach ($Script in $Scripts) {
            if (Test-Path "$SetOSDBuilderPathContent\$Script") {
                Write-Host -ForegroundColor Cyan "Source: $SetOSDBuilderPathContent\$Script"
                Invoke-Expression "& '$SetOSDBuilderPathContent\$Script'"
            }
        }
    }
    #=================================================
    # TEMPLATE
    #=================================================
    if ($ScriptTemplates) {
        Show-ActionTime; Write-Host -ForegroundColor Green "OS: Scripts TEMPLATE"
        foreach ($Script in $ScriptTemplates) {
            if (Test-Path "$($Script.FullName)") {
                Write-Host -ForegroundColor Cyan "Source: $($Script.FullName)"
                Invoke-Expression "& '$($Script.FullName)'"
            }
        }
    }
}
function Add-ContentScriptsPE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # TASK
    #=================================================
    if ($WinPEScriptsPE -or $WinPEScriptsRE -or $WinPEScriptsSE) {
        Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Scripts TASK"
        foreach ($PSWimScript in $WinPEScriptsPE) {
            if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") {
                Write-Host " Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan
                (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('winpe.wim.log', 'WinPE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript"
                Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'"
            }
        }
        foreach ($PSWimScript in $WinPEScriptsRE) {
            if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") {
                Write-Host " Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan
                (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('winre.wim.log', 'WinRE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript"
                Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'"
            }
        }
        foreach ($PSWimScript in $WinPEScriptsSE) {
            if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") {
                Write-Host " Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan
                (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('MountSetup', 'MountWinSE') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript"
                (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('setup.wim.log', 'WinSE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript"
                Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'"
            }
        }
    }
}
function Add-ContentStartLayout {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($StartLayoutXML)) {Return}
    #=================================================
    # TASK
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Use Content StartLayout"
    Write-Host " $SetOSDBuilderPathContent\$StartLayoutXML" -ForegroundColor DarkGray
    Try {
        Copy-Item -Path "$SetOSDBuilderPathContent\$StartLayoutXML" -Destination "$MountDirectory\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Recurse -Force | Out-Null
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        Write-Warning "$ErrorMessage"
    }
}
function Add-ContentUnattEnd {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($UnattendXML)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Use Content Unattend"
    #=================================================
    # Execute
    #=================================================
    Write-Host " $SetOSDBuilderPathContent\$UnattendXML" -ForegroundColor DarkGray
    if (!(Test-Path "$MountDirectory\Windows\Panther")) {New-Item -Path "$MountDirectory\Windows\Panther" -ItemType Directory -Force | Out-Null}
    Copy-Item -Path "$SetOSDBuilderPathContent\$UnattendXML" -Destination "$MountDirectory\Windows\Panther\Unattend.xml" -Force
    
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentUnattend.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Try {Use-WindowsUnattend -UnattendPath "$SetOSDBuilderPathContent\$UnattendXML" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null}
    Catch {
        $ErrorMessage = $_.Exception.Message
        Write-Warning "$ErrorMessage"
    }
}
function Add-ContentPack {
    [CmdletBinding()]
    param (
        [ValidateSet(
            'MEDIA',
            'OSCapability',
            'OSDrivers',
            'OSExtraFiles',
            'OSLanguageFeatures',
            'OSLanguagePacks',
            'OSLocalExperiencePacks',
            'OSPackages',
            'OSPoshMods',
            'OSRegistry',
            'OSScripts',
            'OSStartLayout',
            'PEADK',
            'PEADKLang',
            'PEDaRT',
            'PEDrivers',
            'PEExtraFiles',
            'PEPackages',
            'PEPoshMods',
            'PERegistry',
            'PEScripts'
        )]
        [Alias('Type')]
        [string]$PackType = 'All'
    )
    #=================================================
    # ABORT
    #=================================================
    if (Get-IsTemplatesEnabled) {Return}
    if ($SkipContentPacks -eq $true) {Return}
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return}
    #=================================================
    # BUILD
    #=================================================
    if ($ContentPacks) {
        if ($ReleaseID -match '1909') {$MSUX = '1903'}
        elseif ($ReleaseID -match '20H2') {$MSUX = '2004'}
        elseif ($ReleaseID -match '21H1') {$MSUX = '2004'}
        elseif ($ReleaseID -match '21H2') {$MSUX = '2004'}
        elseif ($ReleaseID -match '22H2') {$MSUX = '2004'}
        else {$MSUX = $ReleaseID}
        #=================================================
        # MEDIA ContentPacks
        #=================================================
        if ($PackType -eq 'MEDIA') {
            Show-ActionTime; Write-Host -ForegroundColor Green "MEDIA ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\MEDIA"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackMEDIA -ContentPackContent $ContentPath
                }
            }
        }
        #=================================================
        # OS ContentPacks
        #=================================================
        if ($PackType -eq 'OSDrivers') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSDrivers ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSDrivers"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackOSDrivers -ContentPackContent $ContentPath
                }
            }
        }
        if ($PackType -eq 'OSExtraFiles') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSExtraFiles ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSExtraFiles"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackOSExtraFiles -ContentPackContent $ContentPath
                }
                Get-ChildItem "$ContentPackPath\All Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {Add-ContentPackOSExtraFiles -ContentPackContent "$($_.FullName)"}
                Get-ChildItem "$ContentPackPath\$OSArchitecture Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {Add-ContentPackOSExtraFiles -ContentPackContent "$($_.FullName)"}
            }
        }
        if ($PackType -eq 'OSCapability') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSCapability ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSCapability"

                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSCapability -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"

                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture RSAT")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture RSAT" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSCapability -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture RSAT" -RSAT
            }
        }
        if ($PackType -eq 'OSLanguageFeatures') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSLanguageFeatures ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLanguageFeatures"
                
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSLanguageFeatures -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
            }
        }
        if ($PackType -eq 'OSLanguagePacks') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSLanguagePacks ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLanguagePacks"
                
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSLanguagePacks -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
            }
        }
        if ($PackType -eq 'OSLocalExperiencePacks') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSLocalExperiencePacks ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLocalExperiencePacks"
                
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSLocalExperiencePacks -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
            }
        }
        if ($PackType -eq 'OSPackages') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSPackages ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPackages"
                
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSPackages -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
            }
        }
        if ($PackType -eq 'OSPoshMods') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSPoshMods ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPoshMods"

                if (! (Test-Path "$ContentPackPath\ProgramFiles")) {New-Item -Path "$ContentPackPath\ProgramFiles" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSPoshMods -ContentPackContent "$ContentPackPath\ProgramFiles"
            }
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPoshMods"

                if (! (Test-Path "$ContentPackPath\System")) {New-Item -Path "$ContentPackPath\System" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackOSPoshModsSystem -ContentPackContent "$ContentPackPath\System"
            }
        }
        if ($PackType -eq 'OSRegistry') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSRegistry ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSRegistry"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackOSRegistry -ContentPackContent $ContentPath
                }
            }
        }
        if ($PackType -eq 'OSScripts') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSScripts ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSScripts"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackOSScripts -ContentPackContent $ContentPath
                }
            }
        }
        if ($PackType -eq 'OSStartLayout') {
            Show-ActionTime; Write-Host -ForegroundColor Green "OSStartLayout ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSStartLayout"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackOSStartLayouts -ContentPackContent $ContentPath
                }
            }
        }
        #=================================================
        # WinPE ContentPacks
        #=================================================
        if ($PackType -eq 'PEADK') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEADK ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEADK"
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackPEADK -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
            }
        }
        if ($PackType -eq 'PEADKLang') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEADKLang ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEADKLang"
                if (! (Test-Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture")) {New-Item -Path "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackPEADK -ContentPackContent "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture" -Lang
            }
        }
        if ($PackType -eq 'PEDaRT') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEDaRT ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEDaRT"
                if (! (Test-Path $ContentPackPath)) {New-Item -Path $ContentPackPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackPEDaRT -ContentPackContent "$ContentPackPath"
            }
        }
        if ($PackType -eq 'PEDrivers') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEDrivers ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEDrivers"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackPEDrivers -ContentPackContent $ContentPath
                }
            }
        }
        if ($PackType -eq 'PEExtraFiles') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEExtraFiles ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEExtraFiles"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackPEExtraFiles -ContentPackContent $ContentPath
                }

                Get-ChildItem "$ContentPackPath\ALL Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {
                    Add-ContentPackPEExtraFiles -ContentPackContent "$($_.FullName)"
                }
                Get-ChildItem "$ContentPackPath\$OSArchitecture Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {
                    Add-ContentPackPEExtraFiles -ContentPackContent "$($_.FullName)"
                }
            }
        }
        if ($PackType -eq 'PEPoshMods') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEPoshMods ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEPoshMods"

                if (! (Test-Path "$ContentPackPath\ProgramFiles")) {New-Item -Path "$ContentPackPath\ProgramFiles" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackPEPoshMods -ContentPackContent "$ContentPackPath\ProgramFiles"
            }
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEPoshMods"
                
                if (! (Test-Path "$ContentPackPath\System")) {New-Item -Path "$ContentPackPath\System" -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                Add-ContentPackPEPoshModsSystem -ContentPackContent "$ContentPackPath\System"
            }
        }
        if ($PackType -eq 'PERegistry') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PERegistry ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PERegistry"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackPERegistry -ContentPackContent $ContentPath
                }
            }
        }
        if ($PackType -eq 'PEScripts') {
            Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: PEScripts ContentPack"
            foreach ($ContentPack in $ContentPacks) {
                $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEScripts"

                $ContentPaths = @(
                    "$ContentPackPath\ALL"
                    "$ContentPackPath\$OSArchitecture"
                    "$ContentPackPath\$UpdateOS $ReleaseID $OSArchitecture"
                )
                foreach ($ContentPath in $ContentPaths) {
                    if (! (Test-Path $ContentPath)) {New-Item -Path $ContentPath -ItemType Directory -Force -ErrorAction Ignore | Out-Null}
                    Add-ContentPackPEScripts -ContentPackContent $ContentPath
                }
            }
        }
    }
}
function Add-ContentPackMEDIA {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackMEDIA.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    robocopy "$ContentPackContent" "$OS" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
}
function Add-ContentPackOSDrivers {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
        #[string]$MountDirectory
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSDrivers.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.inf -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    if ($OSMajorVersion -eq 6) {
        dism /Image:"$MountDirectory" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog"
    } else {
        Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null
    }
}
function Add-ContentPackOSExtraFiles {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSExtraFiles.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    robocopy "$ContentPackContent" "$MountDirectory" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
}
function Add-ContentPackOSCapability {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent,
        [switch]$RSAT
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\FoDMetadata_Client.cab")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        $global:ReapplyLCU = $true
        Write-Host -ForegroundColor Cyan " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    if (Get-Command Get-WindowsCapability) {
        if ($RSAT.IsPresent) {
            if ((Get-Command Get-WindowsCapability).Parameters.ContainsKey('LimitAccess')) {
                Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -match 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
                    Write-Verbose "CurrentLog: $CurrentLog"
            
                    Write-Host -ForegroundColor DarkGray " $($_.Name)"
                    Try {
                        Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null
                    }
                    Catch {
                        if ($_.Exception.Message -match '0x800f081e') {
                            Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                        }
                        else {
                            Write-Warning $_.Exception.ErrorCode
                            Write-Warning $_.Exception.Message
                        }
                    }
                }
            }
            else {
                Get-WindowsCapability -Path $MountDirectory | Where-Object {$_.Name -match 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
                    Write-Verbose "CurrentLog: $CurrentLog"
            
                    Write-Host -ForegroundColor DarkGray " $($_.Name)"
                    Try {
                        Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LogPath $CurrentLog | Out-Null
                    }
                    Catch {
                        if ($_.Exception.Message -match '0x800f081e') {
                            Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                        }
                        else {
                            Write-Warning $_.Exception.ErrorCode
                            Write-Warning $_.Exception.Message
                        }
                    }
                }
            }
        }
        else {
            if ((Get-Command Get-WindowsCapability).Parameters.ContainsKey('LimitAccess')) {
                Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -notmatch 'Language'} | Where-Object {$_.Name -notmatch 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
                    Write-Verbose "CurrentLog: $CurrentLog"
            
                    Write-Host -ForegroundColor DarkGray " $($_.Name)"
                    Try {
                        Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null
                    }
                    Catch {
                        if ($_.Exception.Message -match '0x800f081e') {
                            Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                        }
                        else {
                            Write-Warning $_.Exception.ErrorCode
                            Write-Warning $_.Exception.Message
                        }
                    }
                }
            }
            else {
                Get-WindowsCapability -Path $MountDirectory | Where-Object {$_.Name -notmatch 'Language'} | Where-Object {$_.Name -notmatch 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
                    Write-Verbose "CurrentLog: $CurrentLog"
            
                    Write-Host -ForegroundColor DarkGray " $($_.Name)"
                    Try {
                        Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LogPath $CurrentLog | Out-Null
                    }
                    Catch {
                        if ($_.Exception.Message -match '0x800f081e') {
                            Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                        }
                        else {
                            Write-Warning $_.Exception.ErrorCode
                            Write-Warning $_.Exception.Message
                        }
                    }
                }
            }
        }
    }
<# if ($RSAT.IsPresent) {
        Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -match 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
     
            Write-Host -ForegroundColor Gray " $($_.Name)"
            Try {
                Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {
                    Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                } else {
                    Write-Warning $_.Exception.ErrorCode
                    Write-Warning $_.Exception.Message
                }
            }
        }
    } else {
        Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -notmatch 'Language'} | Where-Object {$_.Name -notmatch 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
     
            Write-Host -ForegroundColor Gray " $($_.Name)"
            Try {
                Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {
                    Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose
                } else {
                    Write-Warning $_.Exception.ErrorCode
                    Write-Warning $_.Exception.Message
                }
            }
        }
    } #>

<# $OSFeaturesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Name | Select-Object Name, FullName, Directory
    Pause
    Get-WindowsCapability -Offline -Path $MountDirectory
    foreach ($item in $OSFeaturesFiles) {
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($item.Name).log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Write-Host "$($item.FullName)" -ForegroundColor DarkGray
 
        if ($MountDirectory) {
            Try {Add-WindowsCapability -Name $item.FullName -Path $MountDirectory -Source $item.Directory -LimitAccess -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
            Try {Add-WindowsPackage -PackagePath "$($item.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    } #>

}
function Add-ContentPackOSLanguageFeatures {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $OSLanguageFeaturesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName

    foreach ($OSLanguageFeaturesFile in $OSLanguageFeaturesFiles) {
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLanguageFeatures-$($OSLanguageFeaturesFile.Name).log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Write-Host "$($OSLanguageFeaturesFile.FullName)" -ForegroundColor DarkGray

        if ($MountDirectory) {
            Try {
                $global:ReapplyLCU = $true
                Add-WindowsPackage -PackagePath "$($OSLanguageFeaturesFile.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentPackOSLanguagePacks {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $OSLanguagePacksFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File | Sort-Object Length -Descending | Select-Object Name, FullName

    foreach ($OSLanguagePacksFile in $OSLanguagePacksFiles) {
        $global:ReapplyLCU = $true
        $global:UpdateLanguageContent = $true
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLanguagePacks-$($OSLanguagePacksFile.Name).log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Write-Host "$($OSLanguagePacksFile.FullName)" -ForegroundColor DarkGray

        if ($MountDirectory) {
            Try {Add-WindowsPackage -PackagePath "$($OSLanguagePacksFile.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentPackOSLocalExperiencePacks {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $OSLocalExperiencePacksFiles = Get-ChildItem "$ContentPackContent" *.appx -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName

    foreach ($OSLocalExperiencePacksFile in $OSLocalExperiencePacksFiles) {
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLocalExperiencePacks-$($OSLocalExperiencePacksFile.Name).log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Write-Host "$($OSLocalExperiencePacksFile.FullName)" -ForegroundColor DarkGray

        if ($MountDirectory) {
            $LicensePath = "$((Get-Item $OSLocalExperiencePacksFile.FullName).Directory.FullName)\License.xml"
            if (!(Test-Path $LicensePath)) {
                Write-Warning "Unable to find Appx License at $LicensePath"
            } else {
                Try {
                    $global:ReapplyLCU = $true
                    Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath $OSLocalExperiencePacksFile.FullName -LicensePath $LicensePath -LogPath $CurrentLog | Out-Null
                }
                Catch {$ErrorMessage = $_.Exception.$ErrorMessage; Write-Warning "$CurrentLog"; Write-Host "$ErrorMessage"}
            }
        }
    }
}
function Add-ContentPackOSPackages {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $OSPackagesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Name | Select-Object Name, FullName

    foreach ($item in $OSPackagesFiles) {
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSPackages-$($item.Name).log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Write-Host "$($item.FullName)" -ForegroundColor DarkGray

        if ($MountDirectory) {
            Try {
                $global:ReapplyLCU = $true
                Add-WindowsPackage -PackagePath "$($item.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentPackOSPoshMods {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    Write-Warning "OSPoshMods is being deprecated in the near future"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSPoshMods.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    robocopy "$ContentPackContent" "$MountDirectory\Program Files\WindowsPowerShell\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
}
function Add-ContentPackOSPoshModsSystem {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    Write-Warning "OSPoshModsSystem is being deprecated in the near future"
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSPoshModsSystem.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    robocopy "$ContentPackContent" "$MountDirectory\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
}
function Add-ContentPackOSRegistry {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent,

        [switch]$ShowRegContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # Test-OSDContentPackOSRegistry
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    } else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }

    #======================================================================================
    # Mount-OfflineRegistryHives
    #======================================================================================
    if (($MountDirectory) -and (Test-Path "$MountDirectory" -ErrorAction SilentlyContinue)) {
        if (Test-Path "$MountDirectory\Users\Default\NTUser.dat") {
            Write-Verbose "Loading Offline Registry Hive Default User" 
            Start-Process reg -ArgumentList "load HKLM\OfflineDefaultUser $MountDirectory\Users\Default\NTUser.dat" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path "$MountDirectory\Windows\System32\Config\DEFAULT") {
            Write-Verbose "Loading Offline Registry Hive DEFAULT" 
            Start-Process reg -ArgumentList "load HKLM\OfflineDefault $MountDirectory\Windows\System32\Config\DEFAULT" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path "$MountDirectory\Windows\System32\Config\SOFTWARE") {
            Write-Verbose "Loading Offline Registry Hive SOFTWARE" 
            Start-Process reg -ArgumentList "load HKLM\OfflineSoftware $MountDirectory\Windows\System32\Config\SOFTWARE" -Wait -WindowStyle Hidden -ErrorAction Stop
        }
        if (Test-Path "$MountDirectory\Windows\System32\Config\SYSTEM") {
            Write-Verbose "Loading Offline Registry Hive SYSTEM" 
            Start-Process reg -ArgumentList "load HKLM\OfflineSystem $MountDirectory\Windows\System32\Config\SYSTEM" -Wait -WindowStyle Hidden -ErrorAction Stop
        }
        $OSDContentPackTemp = "$env:TEMP\$(Get-Random)"
        if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null}
    }

    #======================================================================================
    # Get-RegFiles
    #======================================================================================
    [array]$ContentPackContentFiles = @()
    [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName

    #======================================================================================
    # Add-ContentPackOSRegistryFiles
    #======================================================================================
    foreach ($OSDRegistryRegFile in $ContentPackContentFiles) {
        $OSDRegistryImportFile = $OSDRegistryRegFile.FullName

        if ($MountDirectory) {
            $RegFileContent = Get-Content -Path $OSDRegistryImportFile
            $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg"

            $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem'
            $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault'
            $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force
        }

        Write-Host "$OSDRegistryImportFile"  -ForegroundColor DarkGray
        if ($ShowRegContent.IsPresent){
            $OSDContentPackRegFileContent = @()
            $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile
            foreach ($Line in $OSDContentPackRegFileContent) {
                Write-Host "$Line" -ForegroundColor Gray
            }
        }
        Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
    }
    
    #======================================================================================
    # Remove-OSDContentPackTemp
    #======================================================================================
    if ($MountDirectory) {
        if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null}
    }

    #======================================================================================
    # Dismount-RegistryHives
    #======================================================================================
    Dismount-OSDOfflineRegistry -MountPath $MountDirectory
}
function Add-ContentPackOSScripts {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # TEST
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {Write-Host -ForegroundColor Cyan " $ContentPackContent"}
    #======================================================================================
    # BUILD
    #======================================================================================
    $ContentPackOSScripts = Get-ChildItem "$ContentPackContent" *.ps1 -File -Recurse | Select-Object -Property FullName
    foreach ($ContentPackOSScript in $ContentPackOSScripts) {
        Write-Host "$($ContentPackOSScript.FullName)" -ForegroundColor DarkGray
        Invoke-Expression "& '$($ContentPackOSScript.FullName)'"
    }
}
function Add-ContentPackOSStartLayouts {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # TEST
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # BUILD
    #======================================================================================
    $ContentPackOSStartLayouts = Get-ChildItem "$ContentPackContent\*.xml" -File | Select-Object -Property FullName
    foreach ($ContentPackOSStartLayout in $ContentPackOSStartLayouts) {
        Write-Host -ForegroundColor Cyan " $($ContentPackOSStartLayout.FullName)"
        Try {
            Copy-Item -Path "$($ContentPackOSStartLayout.FullName)" -Destination "$MountDirectory\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Recurse -Force | Out-Null
        }
        Catch {
            $ErrorMessage = $_.Exception.Message
            Write-Warning "$ErrorMessage"
        }
    }
}
function Add-ContentPackPEADK {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent,

        [string]$MountPath,

        [switch]$Lang

        #[ValidateSet('MDT','Recovery','WinPE')]
        #[string]$WinPEOutput,

        #[ValidateSet('WinPE','WinRE')]
        #[string]$SourceWim
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    if ($Lang.IsPresent) {
        $global:ReapplyLCU = $true
        $global:UpdateLanguageContent = $true
    }
    #======================================================================================
    # Import
    #======================================================================================
    $ADKFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File | Sort-Object Length -Descending | Select-Object Name, FullName
    $ADKFilesSub = Get-ChildItem "$ContentPackContent\*\*" -Include *.cab -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName

    if ($ScriptName -eq 'New-PEBuild') {
        if ($WinPEOutput -eq 'MDT') {}
        if ($WinPEOutput -eq 'Recovery') {}
        if ($WinPEOutput -eq 'WinPE') {}

        if ($SourceWim -eq 'WinPE') {
            $ADKFiles = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'}
            $ADKFilesSub = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'}
        }

        if ($SourceWim -eq 'WinRE') {
            $ADKFiles = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'}
            $ADKFilesSub = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'}
        }

        foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -eq 'lp.cab'}) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name)"
            if ($MountDirectory) {
                Try {
                    Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null
                }
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }

        foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -ne 'lp.cab'}) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name)"
            if ($MountDirectory) {
                Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null}
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }

        foreach ($ADKFile in $ADKFilesSub | Where-Object {$_.Name -eq 'lp.cab'}) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name)"
            if ($MountDirectory) {
                Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null}
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }

        foreach ($ADKFile in $ADKFilesSub | Where-Object {$_.Name -ne 'lp.cab'}) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Verbose "CurrentLog: $CurrentLog"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name)"
            if ($MountDirectory) {
                Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null}
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            }
        }
        Return
    }

    foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -notmatch 'Setup'}) {
        Write-Host -ForegroundColor Cyan " $($ADKFile.Name)"
        if ($MountWinPE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
        if ($MountWinRE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
        if ($MountWinSE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }

    $ADKFilesWinPE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'}
    $ADKFilesWinRE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'}
    $ADKFilesWinSE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'legacysetup'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'}

    foreach ($ADKFile in $ADKFilesWinPE | Where-Object {$_.Name -eq 'lp.cab'}) {
        if ($MountWinPE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinPE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($ADKFile in $ADKFilesWinRE | Where-Object {$_.Name -eq 'lp.cab'}) {
        if ($MountWinRE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinRE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($ADKFile in $ADKFilesWinSE | Where-Object {$_.Name -eq 'lp.cab'}) {
        if ($MountWinSE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinSE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }

    foreach ($ADKFile in $ADKFilesWinPE | Where-Object {$_.Name -ne 'lp.cab'}) {
        if ($MountWinPE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinPE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($ADKFile in $ADKFilesWinRE | Where-Object {$_.Name -ne 'lp.cab'}) {
        if ($MountWinRE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinRE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($ADKFile in $ADKFilesWinSE | Where-Object {$_.Name -ne 'lp.cab'}) {
        if ($MountWinSE) {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log"
            Write-Host -ForegroundColor Cyan " $($ADKFile.Name) (WinSE)"
            Try {
                Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-ContentPackPEDaRT {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # TEST
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\Tools$($OSArchitecture).cab")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Cyan " $ContentPackContent\Tools$($OSArchitecture).cab"
    }
    #======================================================================================
    # BUILD
    #======================================================================================
    $MicrosoftDartCab = "$ContentPackContent\Tools$($OSArchitecture).cab"
    if (Test-Path $MicrosoftDartCab) {
        if ($MountWinPE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinPE" | Out-Null}
        if ($MountWinRE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinRE" | Out-Null}
        if ($MountWinSE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinSE" | Out-Null}

        $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig.dat')
        if (Test-Path $MicrosoftDartConfig) {
            if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force}
        }

        $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig8.dat')
        if (Test-Path $MicrosoftDartConfig) {
            if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force}
        }

        if ($ScriptName -eq 'New-OSBuild') {
            if (Test-Path "$MountWinPE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinPE\Windows\System32\winpeshl.ini" -Force}
            (Get-Content "$MountWinRE\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountWinRE\Windows\System32\winpeshl.ini"
            if (Test-Path "$MountWinSE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinSE\Windows\System32\winpeshl.ini" -Force}
        }

        if ($ScriptName -eq 'New-PEBuild') {
            if ($WinPEOutput -eq 'Recovery') {
                (Get-Content "$MountDirectory\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountDirectory\Windows\System32\winpeshl.ini"
            }
        }
    }
    else {
        Write-Warning "Microsoft DaRT do not exist in $MicrosoftDartCab"
    }
}
function Add-ContentPackPEDrivers {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEDrivers.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.inf -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    if ($OSMajorVersion -eq 6) {
        if ($MountWinPE) {dism /Image:"$MountWinPE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null}
        if ($MountWinRE) {dism /Image:"$MountWinRE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null}
        if ($MountWinSE) {dism /Image:"$MountWinSE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null}
    }
    else {
        if ($MountWinPE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinPE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null}
        if ($MountWinRE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinRE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null}
        if ($MountWinSE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinSE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null}
    }
}
function Add-ContentPackPEExtraFiles {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEExtraFiles.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}
    #Save-WindowsImage -Path $MountWinPE | Out-Null
    if ($MountWinPE) {
        #robocopy "$ContentPackContent" "$MountWinPE" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
        robocopy "$ContentPackContent" "$MountWinPE" *.* /S /B /COPY:D /NODCOPY /XJ /FP /NS /NC /NDL /NJH /NJS /NP /TEE /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
        #xcopy "$ContentPackContent" "$MountWinPE" /F /C /H /E /R /Y /J
        #Copy-Item "$ContentPackContent\*" -Destination "$MountWinPE\" -Recurse -Force
    }
    if ($MountWinRE) {
        #robocopy "$ContentPackContent" "$MountWinRE" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
        robocopy "$ContentPackContent" "$MountWinRE" *.* /S /B /COPY:D /NODCOPY /XJ /FP /NS /NC /NDL /NJH /NJS /NP /TEE /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
    }
    if ($MountWinSE) {
        #robocopy "$ContentPackContent" "$MountWinSE" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null
        robocopy "$ContentPackContent" "$MountWinSE" *.* /S /B /COPY:D /NODCOPY /XJ /FP /NS /NC /NDL /NJH /NJS /NP /TEE /XX /R:0 /W:0 /LOG+:"$CurrentLog" | Out-Null
    }
    #Start-Sleep -Seconds 1
}
function Add-ContentPackPEPoshMods {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEPoshMods.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    if ($MountWinPE) {robocopy "$ContentPackContent" "$MountWinPE\Program Files\WindowsPowerShell\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
    if ($MountWinRE) {robocopy "$ContentPackContent" "$MountWinRE\Program Files\WindowsPowerShell\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
    if ($MountWinSE) {robocopy "$ContentPackContent" "$MountWinSE\Program Files\WindowsPowerShell\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
}
function Add-ContentPackPEPoshModsSystem {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #======================================================================================
    # Test
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Import
    #======================================================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEPoshModsSystem.log"
    Write-Verbose "CurrentLog: $CurrentLog"

    Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host -ForegroundColor Gray "$($_.FullName)"}

    if ($MountWinPE) {robocopy "$ContentPackContent" "$MountWinPE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
    if ($MountWinRE) {robocopy "$ContentPackContent" "$MountWinRE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
    if ($MountWinSE) {robocopy "$ContentPackContent" "$MountWinSE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null}
}
function Add-ContentPackPERegistry {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent,
        [switch]$ShowRegContent
    )
    #======================================================================================
    # Test-OSDContentPackPERegistry
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {
        Write-Host -ForegroundColor Gray " $ContentPackContent"
    }
    #======================================================================================
    # Mount-OfflineRegistryHives
    #======================================================================================
    if (($MountWinPE) -and (Test-Path "$MountWinPE" -ErrorAction SilentlyContinue)) {
        Mount-OSDOfflineRegistryPE -MountPath $MountWinPE
    }
    else {
        Return
    }
    $OSDContentPackTemp = "$env:TEMP\$(Get-Random)"
    if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null}
    #======================================================================================
    # Get-RegFiles
    #======================================================================================
    [array]$ContentPackContentFiles = @()
    [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName
    #======================================================================================
    # Add-ContentPackPERegistryFiles
    #======================================================================================
    foreach ($OSDRegistryRegFile in $ContentPackContentFiles) {
        $OSDRegistryImportFile = $OSDRegistryRegFile.FullName

        if ($MountWinPE) {
            $RegFileContent = Get-Content -Path $OSDRegistryImportFile
            $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg"

            $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem'
            $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault'
            $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force
        }

        Write-Host "$OSDRegistryImportFile"  -ForegroundColor DarkGray
        if ($ShowRegContent.IsPresent){
            $OSDContentPackRegFileContent = @()
            $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile
            foreach ($Line in $OSDContentPackRegFileContent) {
                Write-Host "$Line" -ForegroundColor Gray
            }
        }
        Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
    }
    #======================================================================================
    # Remove-OSDContentPackTemp
    #======================================================================================
    if ($MountWinPE) {
        if (Test-Path $OSDContentPackTemp) {
            Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null
        }
    }
    #======================================================================================
    # Dismount-RegistryHives
    #======================================================================================
    Dismount-OSDOfflineRegistry -MountPath $MountWinPE
    #======================================================================================
    # Mount-OfflineRegistryHives
    #======================================================================================
    if (($MountWinRE) -and (Test-Path "$MountWinRE" -ErrorAction SilentlyContinue)) {
        Mount-OSDOfflineRegistryPE -MountPath $MountWinRE
    }
    else {
        Return
    }
    $OSDContentPackTemp = "$env:TEMP\$(Get-Random)"
    if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null}
    #======================================================================================
    # Get-RegFiles
    #======================================================================================
    [array]$ContentPackContentFiles = @()
    [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName
    #======================================================================================
    # Add-ContentPackPERegistryFiles
    #======================================================================================
    foreach ($OSDRegistryRegFile in $ContentPackContentFiles) {
        $OSDRegistryImportFile = $OSDRegistryRegFile.FullName

        if ($MountWinRE) {
            $RegFileContent = Get-Content -Path $OSDRegistryImportFile
            $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg"

            $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem'
            $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault'
            $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force
        }

        Write-Host "$OSDRegistryImportFile"  -ForegroundColor DarkGray
        if ($ShowRegContent.IsPresent){
            $OSDContentPackRegFileContent = @()
            $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile
            foreach ($Line in $OSDContentPackRegFileContent) {
                Write-Host "$Line" -ForegroundColor Gray
            }
        }
        Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
    }
    #======================================================================================
    # Remove-OSDContentPackTemp
    #======================================================================================
    if ($MountWinRE) {
        if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null}
    }
    #======================================================================================
    # Dismount-RegistryHives
    #======================================================================================
    Dismount-OSDOfflineRegistry -MountPath $MountWinRE
        #======================================================================================
    # Mount-OfflineRegistryHives
    #======================================================================================
    if (($MountWinSE) -and (Test-Path "$MountWinSE" -ErrorAction SilentlyContinue)) {
        Mount-OSDOfflineRegistryPE -MountPath $MountWinSE
    }
    else {
        Return
    }
    $OSDContentPackTemp = "$env:TEMP\$(Get-Random)"
    if (!(Test-Path $OSDContentPackTemp)) {
        New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null
    }
    #======================================================================================
    # Get-RegFiles
    #======================================================================================
    [array]$ContentPackContentFiles = @()
    [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName
    #======================================================================================
    # Add-ContentPackPERegistryFiles
    #======================================================================================
    foreach ($OSDRegistryRegFile in $ContentPackContentFiles) {
        $OSDRegistryImportFile = $OSDRegistryRegFile.FullName

        if ($MountWinSE) {
            $RegFileContent = Get-Content -Path $OSDRegistryImportFile
            $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg"

            $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware'
            $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem'
            $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault'
            $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force
        }

        Write-Host "$OSDRegistryImportFile"  -ForegroundColor DarkGray
        if ($ShowRegContent.IsPresent){
            $OSDContentPackRegFileContent = @()
            $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile
            foreach ($Line in $OSDContentPackRegFileContent) {
                Write-Host "$Line" -ForegroundColor Gray
            }
        }
        Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
    }
    
    #======================================================================================
    # Remove-OSDContentPackTemp
    #======================================================================================
    if ($MountWinSE) {
        if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null}
    }
    #======================================================================================
    # Dismount-RegistryHives
    #======================================================================================
    Dismount-OSDOfflineRegistry -MountPath $MountWinSE
}
function Add-ContentPackPEScripts {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$ContentPackContent
    )
    #Write-Host -ForegroundColor DarkGray "AutoApply Content $ContentPackContent"
    #======================================================================================
    # TEST
    #======================================================================================
    if (!(Test-Path "$ContentPackContent\*")) {
        Write-Host -ForegroundColor DarkGray " $ContentPackContent"
        Return
    }
    else {Write-Host -ForegroundColor Cyan " $ContentPackContent"}
    #======================================================================================
    # BUILD
    #======================================================================================
    $ContentPackPEScripts = Get-ChildItem "$ContentPackContent" *.ps1 -File -Recurse | Select-Object -Property FullName
    foreach ($ContentPackPEScript in $ContentPackPEScripts) {
        Write-Host "$($ContentPackPEScript.FullName)" -ForegroundColor DarkGray
        Invoke-Expression "& '$($ContentPackPEScript.FullName)'"
    }
}
function Add-FeaturesOnDemandOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ([string]::IsNullOrWhiteSpace($FeaturesOnDemand)) {Return}
    #=================================================
    # Execute
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Features On Demand"
    foreach ($FOD in $FeaturesOnDemand) {
        $global:ReapplyLCU = $true
        Write-Host " $SetOSDBuilderPathContent\$FOD" -ForegroundColor DarkGray
        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-FeaturesOnDemandOS.log"
        Write-Verbose "CurrentLog: $CurrentLog"
        Try {
            Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$FOD" -LogPath "$CurrentLog" | Out-Null
        }
        Catch {
            if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
            Write-Verbose "OSDBuilder: Review the log for more information" -Verbose
            Write-Verbose "$CurrentLog" -Verbose
        }
    }
    #=================================================
    # PostAction
    #=================================================
    #Update-CumulativeOS -Force
    #Invoke-DismCleanupImage
}
function Add-LanguageFeaturesOnDemandOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($LanguageFeatures)) {Return}
    #=================================================
    # Execute
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Features On Demand"
    foreach ($Update in $LanguageFeatures | Where-Object {$_ -notlike "*Speech*"}) {
        $global:ReapplyLCU = $true
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log"
            Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*TextToSpeech*"}) {
        $global:ReapplyLCU = $true
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log"
            Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
    foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*Speech*" -and $_ -notlike "*TextToSpeech*"}) {
        $global:ReapplyLCU = $true
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log"
            Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null}
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        }
    }
}
function Add-LanguageInterfacePacksOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($LanguageInterfacePacks)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Interface Packs"
    #=================================================
    # Execute
    #=================================================
    foreach ($Update in $LanguageInterfacePacks) {
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageInterfacePacksOS.log"
            Try {
                $global:ReapplyLCU = $true
                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null
            }
            Catch {
                if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
                Write-Verbose "$CurrentLog" -Verbose
            }
        } else {
            Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update"
        }
    }
}
function Add-LanguagePacksOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($LanguagePacks)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Packs"
    #=================================================
    # Execute
    #=================================================
    foreach ($Update in $LanguagePacks) {
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            if ($Update -like "*.cab") {
                Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray

                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguagePacksOS.log"
                Try {
                    $global:ReapplyLCU = $true
                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null
                }
                Catch {
                    if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}

                    Write-Verbose "$CurrentLog" -Verbose
                }
            } elseif ($Update -like "*.appx") {
                Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray
                Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LicensePath "$((Get-Item $SetOSDBuilderPathContent\$Update).Directory.FullName)\License.xml" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguagePacksOS.log" | Out-Null
            }
        } else {
            Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update"
        }
    }
}
function Add-LocalExperiencePacksOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($LocalExperiencePacks)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Local Experience Packs"
    #=================================================
    # Execute
    #=================================================
    foreach ($Update in $LocalExperiencePacks) {
        if (Test-Path "$SetOSDBuilderPathContent\$Update") {
            Write-Host " $SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray
            $global:ReapplyLCU = $true
            Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LicensePath "$((Get-Item $SetOSDBuilderPathContent\$Update).Directory.FullName)\License.xml" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LocalExperiencePacksOS.log" | Out-Null
        } else {
            Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update"
        }
    }
}
function Add-WindowsPackageOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    #=================================================
    # Task
    #=================================================
    if ([string]::IsNullOrWhiteSpace($Packages)) {Return}
    Show-ActionTime; Write-Host -ForegroundColor Green "OS: Add Packages"
    foreach ($PackagePath in $Packages) {
        Write-Host -ForegroundColor Gray " $SetOSDBuilderPathContent\$PackagePath"

        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackageOS.log"
        Try {
            $global:ReapplyLCU = $true
            Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null
        }
        Catch {
            if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose}
            Write-Verbose "OSDBuilder: Review the log for more information" -Verbose
            Write-Verbose "$CurrentLog" -Verbose
        }
    }
}
function Copy-MediaLanguageSources {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($OSMajorVersion -ne 10) {Return}
    if ([string]::IsNullOrWhiteSpace($LanguageCopySources)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Language Sources"
    #=================================================
    # Execute
    #=================================================
    foreach ($LanguageSource in $LanguageCopySources) {
        $CurrentLanguageSource = Get-OSMedia -Revision OK | Where-Object {$_.OSMFamily -eq $LanguageSource} | Select-Object -Property FullName
        Write-Host "Copying Language Resources from $($CurrentLanguageSource.FullName)" -ForegroundColor DarkGray
        robocopy "$($CurrentLanguageSource.FullName)\OS" "$OS" *.* /s /xf *.wim /ndl /xc /xn /xo /xf /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Copy-MediaLanguageSources.log" | Out-Null
    }
    #=================================================
}
function Copy-MediaOperatingSystem {
    [CmdletBinding()]
    param ()
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "MEDIA: Copy Operating System to $WorkingPath"
    #=================================================
    # Execute
    #=================================================
    #Copy-Item -Path "$OSMediaPath\*" -Destination "$WorkingPath" -Exclude ('*.wim','*.iso','*.vhd','*.vhx') -Recurse -Force | Out-Null
    robocopy "$OSMediaPath" "$WorkingPath" *.* /s /r:0 /w:0 /nfl /ndl /xf *.wim *.iso *.vhd *.vhx *.vhdx | Out-Null
    if (Test-Path "$WorkingPath\ISO") {Remove-Item -Path "$WorkingPath\ISO" -Force -Recurse | Out-Null}
    if (Test-Path "$WorkingPath\VHD") {Remove-Item -Path "$WorkingPath\VHD" -Force -Recurse | Out-Null}
    #Copy-Item -Path "$OSMediaPath\OS\sources\install.wim" -Destination "$WimTemp\install.wim" -Force | Out-Null
    robocopy "$OSMediaPath\OS\sources" "$WimTemp" install.wim /r:0 /w:0 /nfl /ndl | Out-Null
    #Copy-Item -Path "$OSMediaPath\WinPE\*.wim" -Destination "$WimTemp" -Exclude boot.wim -Force | Out-Null
    robocopy "$OSMediaPath\WinPE" "$WimTemp" *.wim /r:0 /w:0 /nfl /ndl /xf boot.wim | Out-Null
}
function Disable-WindowsOptionalFeatureOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ([string]::IsNullOrWhiteSpace($DisableFeature)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Disable Windows Optional Feature"
    #=================================================
    # Execute
    #=================================================
    foreach ($FeatureName in $DisableFeature) {
        Write-Host  -ForegroundColor DarkGray " $FeatureName"
        Try {
            Disable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Disable-WindowsOptionalFeature.log" | Out-Null
        }
        Catch {
            $ErrorMessage = $_.Exception.Message
            Write-Warning "$ErrorMessage"
        }
    }
    #=================================================
}
function Dismount-InstallwimOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Dismount from $MountDirectory"
    #=================================================
    # Execute
    #=================================================
    if ($WaitDismount.IsPresent){[void](Read-Host 'Press Enter to Continue')}
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WindowsImage.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Start-Sleep -Seconds 10
    try {
        Dismount-WindowsImage -Path "$MountDirectory" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null
    }
    catch {
        Write-Warning "Could not dismount Install.wim ... Waiting 30 seconds ..."
        Start-Sleep -Seconds 30
        Dismount-WindowsImage -Path "$MountDirectory" -Save -LogPath "$CurrentLog" | Out-Null
    }
    #=================================================
}
function Dismount-OSDOfflineRegistry {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$MountPath
    )
    #======================================================================================
    # Dismount-RegistryHives
    #======================================================================================
    if (($MountPath) -and (Test-Path "$MountPath" -ErrorAction SilentlyContinue)) {
        if (Test-Path -Path "HKLM:\OfflineDefaultUser") {
            Write-Verbose "Unloading Registry HKLM\OfflineDefaultUser" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineDefaultUser" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineDefault") {
            Write-Verbose "Unloading Registry HKLM\OfflineDefault" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineDefault" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineSoftware") {
            Write-Verbose "Unloading Registry HKLM\OfflineSoftware" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineSoftware" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineSystem") {
            Write-Verbose "Unloading Registry HKLM\OfflineSystem" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineSystem" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }

        if (Test-Path -Path "HKLM:\OfflineDefaultUser") {
            Write-Verbose "Unloading Registry HKLM\OfflineDefaultUser (Second Attempt)" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineDefaultUser" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineDefault") {
            Write-Verbose "Unloading Registry HKLM\OfflineDefault (Second Attempt)" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineDefault" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineSoftware") {
            Write-Verbose "Unloading Registry HKLM\OfflineSoftware (Second Attempt)" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineSoftware" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }
        if (Test-Path -Path "HKLM:\OfflineSystem") {
            Write-Verbose "Unloading Registry HKLM\OfflineSystem (Second Attempt)" 
            Start-Process reg -ArgumentList "unload HKLM\OfflineSystem" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        }

        if (Test-Path -Path "HKLM:\OfflineDefaultUser") {
            Write-Warning "HKLM:\OfflineDefaultUser could not be dismounted. Open Regedit and unload the Hive manually"
            Pause
        }
        if (Test-Path -Path "HKLM:\OfflineDefault") {
            Write-Warning "HKLM:\OfflineDefault could not be dismounted. Open Regedit and unload the Hive manually"
            Pause
        }
        if (Test-Path -Path "HKLM:\OfflineSoftware") {
            Write-Warning "HKLM:\OfflineSoftware could not be dismounted. Open Regedit and unload the Hive manually"
            Pause
        }
        if (Test-Path -Path "HKLM:\OfflineSystem") {
            Write-Warning "HKLM:\OfflineSystem could not be dismounted. Open Regedit and unload the Hive manually"
            Pause
        }
    }
}
function Dismount-WimsPE {
    [CmdletBinding()]
    param (
        [string]$OSMediaPath
    )
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "WinPE: Dismount-WimsPE"
    #=================================================
    # Execute
    #=================================================
    Start-Sleep -Seconds 10
    
    Write-Verbose "$MountWinPE"
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinPE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    try {
        Dismount-WindowsImage -Path "$MountWinPE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null
    }
    catch {
        Write-Warning "Could not dismount WinPE ... Waiting 30 seconds ..."
        Start-Sleep -Seconds 30
        Dismount-WindowsImage -Path "$MountWinPE" -Save -LogPath "$CurrentLog" | Out-Null
    }
    
    Write-Verbose "$MountWinRE"
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinRE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    try {
        Dismount-WindowsImage -Path "$MountWinRE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null
    }
    catch {
        Write-Warning "Could not dismount WinRE ... Waiting 30 seconds ..."
        Start-Sleep -Seconds 30
        Dismount-WindowsImage -Path "$MountWinRE" -Save -LogPath "$CurrentLog" | Out-Null
    }
    
    Write-Verbose "$MountWinSE"
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinSE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    try {
        Dismount-WindowsImage -Path "$MountWinSE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null
    }
    catch {
        Write-Warning "Could not dismount WinSE ... Waiting 30 seconds ..."
        Start-Sleep -Seconds 30
        Dismount-WindowsImage -Path "$MountWinSE" -Save -LogPath "$CurrentLog" | Out-Null
    }
    #=================================================
}
function Enable-NetFXOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ($EnableNetFX3 -ne $true) {Return}
    if ($OSMajorVersion -ne 10) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Enable NetFX 3.5"
    #=================================================
    # Execute
    #=================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Enable-NetFXOS.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Try {
        Enable-WindowsOptionalFeature -Path "$MountDirectory" -FeatureName NetFX3 -All -LimitAccess -Source "$OS\sources\sxs" -LogPath "$CurrentLog" | Out-Null
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        Write-Warning "$ErrorMessage"
    }
    #=================================================
    # Post Action
    #=================================================
    Update-DotNetOS -Force
    Update-CumulativeOS -Force
    #=================================================
}
function Enable-WindowsOptionalFeatureOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if ($ScriptName -ne 'New-OSBuild') {Return}
    if ([string]::IsNullOrWhiteSpace($EnableFeature)) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Enable Windows Optional Feature"
    #=================================================
    # Execute
    #=================================================
    foreach ($FeatureName in $EnableFeature) {
        Write-Host -ForegroundColor Gray " $FeatureName"
        Try {
            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Enable-WindowsOptionalFeatureOS.log"
            Write-Verbose "CurrentLog: $CurrentLog"
            Enable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -All -LogPath "$CurrentLog" | Out-Null
        }
        Catch {
            $ErrorMessage = $_.Exception.Message
            Write-Warning "$ErrorMessage"
        }
    }
    #=================================================
    # Post Action
    #=================================================
    Update-CumulativeOS -Force
    Invoke-DismCleanupImage
    #=================================================
}
function Enable-WinREWiFi {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-OSDCloudOSMedia')) {Return}
    if ($WinREWiFi -ne $true) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Enable WinREWiFi"
    #=================================================
    # Execute
    #=================================================
    if ($OSArchitecture -eq 'x64') {
        $OSDCatalogIntelWirelessDriver = Get-OSDCatalogIntelWirelessDriver | `
            Where-Object {($_.OSVersion -match '10.0')} | `
            Where-Object {($_.OSArch -match 'x64')} | `
            Select-Object -First 1
        $IntelWirelessDriverUrl = $OSDCatalogIntelWirelessDriver.DriverUrl
    }
    else {
        $OSDCatalogIntelWirelessDriver = Get-OSDCatalogIntelWirelessDriver | `
            Where-Object {($_.OSVersion -match '10.0')} | `
            Where-Object {($_.OSArch -match 'x86')} | `
            Select-Object -First 1
        $IntelWirelessDriverUrl = $OSDCatalogIntelWirelessDriver.DriverUrl
    }

    if (Test-WebConnection -Uri $IntelWirelessDriverUrl) {
        $SaveWebFile = Save-WebFile -SourceUrl $IntelWirelessDriverUrl
        if (Test-Path $SaveWebFile.FullName) {
            $DriverCab = Get-Item -Path $SaveWebFile.FullName
            $ExpandPath = Join-Path $DriverCab.Directory $DriverCab.BaseName
            Write-Verbose -Verbose "Expanding Intel Wireless Drivers to $ExpandPath"

            Expand-Archive -Path $DriverCab -DestinationPath $ExpandPath -Force
            Add-WindowsDriver -Path $MountWinRE -Driver $ExpandPath -Recurse -ForceUnsigned -Verbose
        }
    }
    else {
        Write-Warning "Unable to connect to $IntelWirelessDriverUrl"
    }
}
function Enable-WinPEOSDCloud {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild') -and ($ScriptName -ne 'New-OSDCloudOSMedia')) {Return}
    if ($WinPEOSDCloud -ne $true) {Return}
    #=================================================
    # Header
    #=================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Enable OSDCloud"
    #=================================================
    # MountPaths
    #=================================================
    $MountPaths = @(
        $MountWinPE
        $MountWinRE
        $MountWinSE
    )
    #=======================================================================
    # PowerShell Execution Policy
    #=======================================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "Set WinPE PowerShell ExecutionPolicy to Bypass"
    foreach ($MountPath in $MountPaths) {
        $null = Set-WindowsImageExecutionPolicy -Path $MountPath -ExecutionPolicy Bypass
    }
    #=======================================================================
    # Enable PowerShell Gallery
    #=======================================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "Enable WinPE PowerShell Gallery"
    foreach ($MountPath in $MountPaths) {
        $null = Enable-PEWindowsImagePSGallery -Path $MountPath
    }

$RegistryConsole = @'
Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\Default\Console]
"ColorTable00"=dword:000c0c0c
"ColorTable01"=dword:00da3700
"ColorTable02"=dword:000ea113
"ColorTable03"=dword:00dd963a
"ColorTable04"=dword:001f0fc5
"ColorTable05"=dword:00981788
"ColorTable06"=dword:00009cc1
"ColorTable07"=dword:00cccccc
"ColorTable08"=dword:00767676
"ColorTable09"=dword:00ff783b
"ColorTable10"=dword:000cc616
"ColorTable11"=dword:00d6d661
"ColorTable12"=dword:005648e7
"ColorTable13"=dword:009e00b4
"ColorTable14"=dword:00a5f1f9
"ColorTable15"=dword:00f2f2f2
"CtrlKeyShortcutsDisabled"=dword:00000000
"CursorColor"=dword:ffffffff
"CursorSize"=dword:00000019
"DefaultBackground"=dword:ffffffff
"DefaultForeground"=dword:ffffffff
"EnableColorSelection"=dword:00000000
"ExtendedEditKey"=dword:00000001
"ExtendedEditKeyCustom"=dword:00000000
"FaceName"="Consolas"
"FilterOnPaste"=dword:00000001
"FontFamily"=dword:00000036
"FontSize"=dword:00140000
"FontWeight"=dword:00000000
"ForceV2"=dword:00000000
"FullScreen"=dword:00000000
"HistoryBufferSize"=dword:00000032
"HistoryNoDup"=dword:00000000
"InsertMode"=dword:00000001
"LineSelection"=dword:00000001
"LineWrap"=dword:00000001
"LoadConIme"=dword:00000001
"NumberOfHistoryBuffers"=dword:00000004
"PopupColors"=dword:000000f5
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:23290078
"ScreenColors"=dword:00000007
"ScrollScale"=dword:00000001
"TerminalScrolling"=dword:00000000
"TrimLeadingZeros"=dword:00000000
"WindowAlpha"=dword:000000ff
"WindowSize"=dword:001e0078
"WordDelimiters"=dword:00000000
 
[HKEY_LOCAL_MACHINE\Default\Console\%SystemRoot%_System32_cmd.exe]
"FaceName"="Consolas"
"FilterOnPaste"=dword:00000000
"FontSize"=dword:00100000
"FontWeight"=dword:00000190
"LineSelection"=dword:00000000
"LineWrap"=dword:00000000
"WindowAlpha"=dword:00000000
"WindowPosition"=dword:00000000
"WindowSize"=dword:00110054
 
[HKEY_LOCAL_MACHINE\Default\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe]
"ColorTable05"=dword:00562401
"ColorTable06"=dword:00f0edee
"FaceName"="Consolas"
"FilterOnPaste"=dword:00000000
"FontFamily"=dword:00000036
"FontSize"=dword:00140000
"FontWeight"=dword:00000190
"LineSelection"=dword:00000000
"LineWrap"=dword:00000000
"PopupColors"=dword:000000f3
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:03e8012c
"ScreenColors"=dword:00000056
"WindowAlpha"=dword:00000000
"WindowSize"=dword:0020006c
 
[HKEY_LOCAL_MACHINE\Default\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe]
"ColorTable05"=dword:00562401
"ColorTable06"=dword:00f0edee
"FaceName"="Consolas"
"FilterOnPaste"=dword:00000000
"FontFamily"=dword:00000036
"FontSize"=dword:00140000
"FontWeight"=dword:00000190
"LineSelection"=dword:00000000
"LineWrap"=dword:00000000
"PopupColors"=dword:000000f3
"QuickEdit"=dword:00000001
"ScreenBufferSize"=dword:03e8012c
"ScreenColors"=dword:00000056
"WindowAlpha"=dword:00000000
"WindowSize"=dword:0020006c
'@

    #=======================================================================
    # Registry Fixes
    #=======================================================================
    Show-ActionTime; Write-Host -ForegroundColor Green "Modifying WinPE CMD and PowerShell Console settings"
    $RegistryConsole | Out-File -FilePath "$env:TEMP\RegistryConsole.reg" -Encoding ascii -Width 2000 -Force

    foreach ($MountPath in $MountPaths) {
        Start-Process reg -ArgumentList "load HKLM\Default $MountPath\Windows\System32\Config\DEFAULT" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        Start-Process reg -ArgumentList "import $env:TEMP\RegistryConsole.reg" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
        Start-Process reg -ArgumentList "unload HKLM\Default" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue
    }
    #=======================================================================
    # OSD Module
    #=======================================================================
    Write-Host -ForegroundColor Yellow "Saving OSD PowerShell Module to mounted WinPE at Program Files\WindowsPowerShell\Modules"
    if ($ScriptName -ne 'New-PEBuild') {
        Save-Module -Name OSD -Path "$MountWinPE\Program Files\WindowsPowerShell\Modules" -Force
        Save-Module -Name OSD -Path "$MountWinRE\Program Files\WindowsPowerShell\Modules" -Force
        Save-Module -Name OSD -Path "$MountWinSE\Program Files\WindowsPowerShell\Modules" -Force
    }
    else {
        Save-Module -Name OSD -Path "$MountDirectory\Program Files\WindowsPowerShell\Modules" -Force
    }
}
function Expand-DaRTPE {
    [CmdletBinding()]
    param ()
    #=================================================
    # Abort
    #=================================================
    if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return}
    if ([string]::IsNullOrWhiteSpace($WinPEDaRT)) {Return}
    #=================================================
    # Header
    #=================================================
    $MicrosoftDartCab = "$SetOSDBuilderPathContent\$WinPEDaRT"
    Show-ActionTime; Write-Host -ForegroundColor Green "Microsoft DaRT: $MicrosoftDartCab"
    #=================================================
    # Execute
    #=================================================
    if (Test-Path "$MicrosoftDartCab") {
        if ($MountWinPE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinPE" | Out-Null}
        if ($MountWinRE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinRE" | Out-Null}
        if ($MountWinSE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinSE" | Out-Null}

        $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig.dat')
        if (Test-Path $MicrosoftDartConfig) {
            if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force}
        }

        $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig8.dat')
        if (Test-Path $MicrosoftDartConfig) {
            if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force}
            if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force}
        }

        if ($ScriptName -eq 'New-OSBuild') {
            if (Test-Path "$MountWinPE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinPE\Windows\System32\winpeshl.ini" -Force}
            (Get-Content "$MountWinRE\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountWinRE\Windows\System32\winpeshl.ini"
            if (Test-Path "$MountWinSE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinSE\Windows\System32\winpeshl.ini" -Force}
        }

        if ($ScriptName -eq 'New-PEBuild') {
            if ($WinPEOutput -eq 'Recovery') {
                (Get-Content "$MountDirectory\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountDirectory\Windows\System32\winpeshl.ini"
            } else {
                if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force}
            }
        }
    } else {Write-Warning "Microsoft DaRT do not exist in $MicrosoftDartCab"}
}
function Export-InstallwimOS {
    [CmdletBinding()]
    param ()
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "OS: Export to $OS\sources\install.wim"
    #=================================================
    # Execute
    #=================================================
    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$WimTemp\install.wim" -SourceIndex 1 -DestinationImagePath "$OS\sources\install.wim" -LogPath "$CurrentLog" | Out-Null
}
function Export-PEBootWim {
    [CmdletBinding()]
    param (
        [string]$OSMediaPath
    )
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "WinPE: Rebuild $OSMediaPath\OS\sources\boot.wim"
    #=================================================
    # Execute
    #=================================================
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinPE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winpe.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\boot.wim" -LogPath "$CurrentLog" | Out-Null
    
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinSE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winse.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\boot.wim" -Setbootable -LogPath "$CurrentLog" | Out-Null
    Copy-Item -Path "$OSMediaPath\WinPE\boot.wim" -Destination "$OSMediaPath\OS\sources\boot.wim" -Force | Out-Null
}
function Export-PEWims {
    [CmdletBinding()]
    param (
        [string]$OSMediaPath
    )
    #=================================================
    # Header
    #=================================================
    Show-ActionTime
    Write-Host -ForegroundColor Green "WinPE: Export WIMs to $OSMediaPath\WinPE"
    #=================================================
    # Execute
    #=================================================
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinPE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winpe.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winpe.wim" -LogPath "$CurrentLog" | Out-Null
    
    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinRE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winre.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winre.wim" -LogPath "$CurrentLog" | Out-Null

    $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinSE.log"
    Write-Verbose "CurrentLog: $CurrentLog"
    Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winse.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winse.wim" -LogPath "$CurrentLog" | Out-Null
}
function Export-SessionsXmlOS {
    [CmdletBinding()]
    param (
        [string]$OSMediaPath
    )
    Write-Verbose "$OSMediaPath\Sessions.xml"
    Copy-Item "$OSMediaPath\Sessions.xml" "$OSMediaPath\info\Sessions.xml" -Force | Out-Null

    [xml]$SessionsXML = Get-Content -Path "$OSMediaPath\info\Sessions.xml"

    $Sessions = $SessionsXML.SelectNodes('Sessions/Session') | ForEach-Object {
        New-Object -Type PSObject -Property @{
            Id = $_.Tasks.Phase.package.id
            KBNumber = $_.Tasks.Phase.package.name
            TargetState = $_.Tasks.Phase.package.targetState
            Client = $_.Client
            Complete = $_.Complete
            Status = $_.Status
        }
    }
    
    $Sessions = $Sessions | Where-Object {$_.Id -like "Package*"}
    $Sessions = $Sessions | Select-Object -Property Id, KBNumber, TargetState, Client, Status, Complete | Sort-Object Complete -Descending

    $Sessions | Out-File "$OSMediaPath\Sessions.txt"
    $Sessions | Out-File "$OSMediaPath\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.txt"
    $Sessions | Export-Clixml -Path "$OSMediaPath\info\xml\Sessions.xml"
    $Sessions | Export-Clixml -Path "$OSMediaPath\info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.xml"
    $Sessions | ConvertTo-Json | Out-File "$OSMediaPath\info\json\Sessions.json"
    $Sessions | ConvertTo-Json | Out-File "$OSMediaPath\info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.json"

    Remove-Item "$OSMediaPath\Sessions.xml" -Force | Out-Null
}
function Get-FeatureUpdateDownloads {
    $FeatureUpdateDownloads = @()
    $FeatureUpdateDownloads = Get-WSUSXML -Catalog FeatureUpdate
<# $CatalogsXmls = @()
    $CatalogsXmls = Get-ChildItem "$($MyInvocation.MyCommand.Module.ModuleBase)\CatalogsESD\*" -Include *.xml
    foreach ($CatalogsXml in $CatalogsXmls) {
        $FeatureUpdateDownloads += Import-Clixml -Path "$($CatalogsXml.FullName)"
    } #>

    #=================================================
    # Get Downloadeds
    #=================================================
    foreach ($Download in $FeatureUpdateDownloads) {
        $FullUpdatePath = Join-Path $SetOSDBuilderPathFeatureUpdates $Download.FileName
        if (Test-Path $FullUpdatePath) {
            $Download.OSDStatus = "Downloaded"
        }
    }
    #=================================================
    # Return
    #=================================================
    $FeatureUpdateDownloads = $FeatureUpdateDownloads | Select-Object -Property * | Sort-Object -Property CreationDate -Descending
    Return $FeatureUpdateDownloads
}
function Get-IsContentPacksEnabled {
    [CmdletBinding()]
    param ()
    if ($global:SetOSDBuilder.AllowContentPacks -eq $false) {Return $false}
    if (Test-Path $SetOSDBuilderPathTemplates\Drivers) {Return $false}
    if (Test-Path $SetOSDBuilderPathTemplates\ExtraFiles) {Return $false}
    if (Test-Path $SetOSDBuilderPathTemplates\Registry) {Return $false}
    if (Test-Path $SetOSDBuilderPathTemplates\Scripts) {Return $false}
    Return $true
}
function Get-IsTemplatesEnabled {
    #Is Templates Content enabled
    [CmdletBinding()]
    param ()
    if (Test-Path $SetOSDBuilderPathTemplates\Drivers) {Return $true}
    if (Test-Path $SetOSDBuilderPathTemplates\ExtraFiles) {Return $true}
    if (Test-Path $SetOSDBuilderPathTemplates\Registry) {Return $true}
    if (Test-Path $SetOSDBuilderPathTemplates\Scripts) {Return $true}
    Return $false
}
function Get-OSBuildTask {
    [CmdletBinding()]
    param (
        [switch]$GridView
    )

    Begin {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN"

        #=================================================
        Write-Verbose '19.1.1 Initialize OSDBuilder'
        #=================================================
        Get-OSDBuilder -CreatePaths -HideDetails

        #=================================================
        Write-Verbose '19.1.1 Gather All OSBuildTask'
        #=================================================
        $AllOSBuildTasks = @()
        $AllOSBuildTasks = Get-ChildItem -Path $SetOSDBuilderPathTasks OSBuild*.json -File | Select-Object -Property *
    }

    Process {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) PROCESS"

        $OSBuildTask = foreach ($Item in $AllOSBuildTasks) {
            #=================================================
            #Write-Verbose '19.1.1 Get Windows Image Information'
            #=================================================
            $OSBuildTaskPath = $($Item.FullName)
            Write-Verbose "OSBuildTask Full Path: $OSBuildTaskPath"
            $OSBTask = @()
            $OSBTask = Get-Content "$($Item.FullName)" | ConvertFrom-Json

            $OSBTaskProps = @()
            $OSBTaskProps = Get-Item "$($Item.FullName)" | Select-Object -Property *
            
            if ([System.Version]$OSBTask.TaskVersion -lt [System.Version]"19.1.3.0") {
                $ObjectProperties = @{
                    LastWriteTime       = $OSBTaskProps.LastWriteTime
                    TaskName            = $OSBTask.TaskName
                    TaskVersion         = $OSBTask.TaskVersion
                    OSMediaName         = $OSBTask.MediaName
                    FullName            = $Item.FullName
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
                Write-Verbose ""
            }

            if ([System.Version]$OSBTask.TaskVersion -gt [System.Version]"19.1.3.0") {
                if ($OSBTask.ReleaseId -match '2009') {$OSBTask.ReleaseId = '20H2'}

                if ($null -eq $OSBTask.Languages) {
                    Write-Warning "Reading Task: $OSBuildTaskPath"
                    Write-Warning "Searching for OSMFamily: $($OSBTask.OSMFamily)"
                    $LangUpdate = Get-OSMedia | Where-Object {$_.OSMFamilyV1 -eq $OSBTask.OSMFamily} | Select-Object -Last 1
                    Write-Warning "Adding Language: $($LangUpdate.Languages)"
                    $OSBTask | Add-Member -Type NoteProperty -Name 'Languages' -Value "$LangUpdate.Languages"
                    $OSBTask.Languages = $LangUpdate.Languages
                    $OSBTask.OSMFamily = $OSBTask.InstallationType + " " + $OSBTask.EditionId + " " + $OSBTask.Arch + " " + [string]$OSBTask.Build + " " + $OSBTask.Languages
                    Write-Warning "Updating OSMFamily: $($OSBTask.OSMFamily)"
                    Write-Warning "Updating Task: $OSBuildTaskPath"
                    $OSBTask | ConvertTo-Json | Out-File $OSBuildTaskPath
                    Write-Host ""
                }

                $ObjectProperties = @{
                    TaskType            = $OSBTask.TaskType
                    TaskVersion         = $OSBTask.TaskVersion
                    TaskName            = $OSBTask.TaskName
                    TaskGuid            = $OSBTask.TaskGuid
                    CustomName          = $OSBTask.CustomName
                    SourceOSMedia       = $OSBTask.Name
                    ImageName           = $OSBTask.ImageName
                    Arch                = $OSBTask.Arch
                    ReleaseId           = $OSBTask.ReleaseId
                    UBR                 = $OSBTask.UBR
                    Languages           = $OSBTask.Languages
                    EditionId           = $OSBTask.EditionId
                    FullName            = $Item.FullName
                    LastWriteTime       = $OSBTaskProps.LastWriteTime
                    CreatedTime         = [datetime]$OSBTask.CreatedTime
                    ModifiedTime        = [datetime]$OSBTask.ModifiedTime
                    OSMFamily           = $OSBTask.OSMFamily
                    OSMGuid             = $OSBTask.OSMGuid
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
                Write-Verbose ""
            }
        }

        #=================================================
        #Write-Verbose '19.1.3 Output'
        #=================================================
        if ($GridView.IsPresent) {$OSBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,Languages,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName | Out-GridView -PassThru -Title 'OSBuildTask'}
        else {$OSBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,Languages,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName }
    }

    End {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) END"
    }
}
function Get-OSDFromJson
{
    param(
        [