Src/Public/Export-LabImage.ps1


function Export-LabImage {
<#
    .SYNOPSIS
        Exports a lab image (.vhdx file) and creates Lability custom media registration document (.json file).
#>

    [CmdletBinding()]
    param (
        ## Lab media Id
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [System.String[]] $Id,

        # Specifies the export path location.
        [Parameter(Mandatory, ParameterSetName = 'Path', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias("PSPath")]
        [System.String] $Path,

        # Specifies a literal export location path.
        [Parameter(Mandatory, ParameterSetName = 'LiteralPath', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [System.String] $LiteralPath,

        ## Force the re(creation) of the master/parent image
        [Parameter(ValueFromPipelineByPropertyName)]
        [System.Management.Automation.SwitchParameter] $Force,

        ## Do not calculate media checksum.
        [Parameter()]
        [System.Management.Automation.SwitchParameter] $NoChecksum,

        ## Do not create Lability custom media regstration (json) file.
        [Parameter()]
        [System.Management.Automation.SwitchParameter] $NoRegistrationDocument
    )
    begin {

        try {

            if ($PSCmdlet.ParameterSetName -eq 'Path') {

                # Resolve any relative paths
                $Path = $PSCmdlet.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path);
            }
            else {

                $Path = $PSCmdlet.SessionState.Path.GetUnresolvedProviderPathFromPSPath($LiteralPath);
            }

            $pathItem = Get-Item -Path $Path
            if ($pathItem -isnot [System.IO.DirectoryInfo]) {
                throw "not a directory path"
            }
        }
        catch {

            Write-Error -ErrorRecord $_
        }

    }
    process {

        foreach ($mediaId in $Id) {

            try {

                $media = Resolve-LabMedia -Id $mediaId -ErrorAction Stop
                $image = Get-LabImage -Id $mediaId -ErrorAction Stop

                ## Copy vhd/x file to destination path
                $imageItem = Get-Item -Path $image.ImagePath
                $destinationVhdxPath = Join-Path -Path $Path -ChildPath $imageItem.Name
                if (-not (Test-Path -Path $destinationVhdxPath -PathType Leaf) -or $Force) {

                    Write-Verbose -Message ($localized.ExportingImage -f $image.ImagePath, $destinationVhdxPath)
                    Copy-Item -Path $image.ImagePath -Destination $destinationVhdxPath -Force

                    if (-not $NoRegistrationDocument) {

                        ## Create media registration json
                        $registerLabMedia = [ordered] @{
                            Id              = $media.Id
                            Filename        = $imageItem.Name
                            Description     = $media.Description
                            OperatingSystem = $media.OperatingSystem
                            Architecture    = $media.Architecture
                            MediaType       = 'VHD'
                            Uri             = $destinationVhdxPath -as [System.Uri]
                            CustomData      = $media.CustomData
                        }

                        if (-not $NoChecksum) {
                            Write-Verbose ($localized.CalculatingResourceChecksum -f $image.ImagePath)
                            $checksum = (Get-FileHash -Path $image.ImagePath -Algorithm MD5).Hash
                            $registerLabMedia['Checksum'] = $checksum
                        }

                        $registerLabMediaFilename = '{0}.json' -f $media.Id
                        $registerLabMediaPath = Join-Path -Path $Path -ChildPath $registerLabMediaFilename
                        Write-Verbose -Message ($localized.ExportingImageRegistrationFile -f $registerLabMediaPath)
                        ConvertTo-Json -InputObject $registerLabMedia |
                            Out-File -FilePath $registerLabMediaPath -Encoding ASCII -Force
                    }
                }
                else {

                    $errorMessage = $localized.FileAlreadyExistsError -f $destinationVhdxPath;
                    $ex = New-Object -TypeName System.InvalidOperationException -ArgumentList $errorMessage;
                    $errorCategory = [System.Management.Automation.ErrorCategory]::ResourceExists;
                    $errorRecord = New-Object System.Management.Automation.ErrorRecord $ex, 'FileExists', $errorCategory, $destinationVhdxPath;
                    $PSCmdlet.WriteError($errorRecord);
                }
            }
            catch {

                Write-Error -ErrorRecord $_
            }
        }
    }
}

# SIG # Begin signature block
# MIIdMgYJKoZIhvcNAQcCoIIdIzCCHR8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUX0OBCoqEZgRzWgj50c+pTkCp
# w6agghfKMIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw
# NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ
# tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4
# bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK
# fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK
# XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer
# vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0
# MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0
# dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk
# YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f
# BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
# ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz
# c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6
# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB
# LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH
# o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4
# eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h
# F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1
# FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X
# t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBTEwggQZ
# oAMCAQICEAqhJdbWMht+QeQF2jaXwhUwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X
# DTE2MDEwNzEyMDAwMFoXDTMxMDEwNzEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEx
# MC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFtcGluZyBD
# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3QMu5LzY9/3am6gpnF
# OVQoV7YjSsQOB0UzURB90Pl9TWh+57ag9I2ziOSXv2MhkJi/E7xX08PhfgjWahQA
# OPcuHjvuzKb2Mln+X2U/4Jvr40ZHBhpVfgsnfsCi9aDg3iI/Dv9+lfvzo7oiPhis
# EeTwmQNtO4V8CdPuXciaC1TjqAlxa+DPIhAPdc9xck4Krd9AOly3UeGheRTGTSQj
# MF287DxgaqwvB8z98OpH2YhQXv1mblZhJymJhFHmgudGUP2UKiyn5HU+upgPhH+f
# MRTWrdXyZMt7HgXQhBlyF/EXBu89zdZN7wZC/aJTKk+FHcQdPK/P2qwQ9d2srOlW
# /5MCAwEAAaOCAc4wggHKMB0GA1UdDgQWBBT0tuEgHf4prtLkYaWyoiWyyBc1bjAf
# BgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzASBgNVHRMBAf8ECDAGAQH/
# AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB5BggrBgEF
# BQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBD
# BggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2Ny
# bDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDig
# NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDBQBgNVHSAESTBHMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYc
# aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sBwEwDQYJKoZI
# hvcNAQELBQADggEBAHGVEulRh1Zpze/d2nyqY3qzeM8GN0CE70uEv8rPAwL9xafD
# DiBCLK938ysfDCFaKrcFNB1qrpn4J6JmvwmqYN92pDqTD/iy0dh8GWLoXoIlHsS6
# HHssIeLWWywUNUMEaLLbdQLgcseY1jxk5R9IEBhfiThhTWJGJIdjjJFSLK8pieV4
# H9YLFKWA1xJHcLN11ZOFk362kmf7U2GJqPVrlsD0WGkNfMgBsbkodbeZY4UijGHK
# eZR+WfyMD+NvtQEmtmyl7odRIeRYYJu6DC0rbaLEfrvEJStHAgh8Sa4TtuF8QkIo
# xhhWz0E0tmZdtnR79VYzIi8iNrJLokqV2PWmjlIwggawMIIEmKADAgECAhAIrUCy
# YNKcTJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAf
# BgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBa
# Fw0zNjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2Vy
# dCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25p
# bmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4IC
# DwAwggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc
# 9es0JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyA
# VxJrQ5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQ
# IXhFLqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/
# sk+FLEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na5
# 9zHh3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pg
# VItJwZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7Bzzosm
# JQayg9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQ
# okbIYViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jL
# chApQfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHM
# IRroOBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQAB
# o4IBWTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8R
# hvv+YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYD
# VR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGsw
# aTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUF
# BzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# Um9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2Vy
# dC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeB
# DAEDMAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bg
# Ahql+Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7
# FoFFUP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZ
# GM1hmYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG
# 3RywYFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5U
# bdldAhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WI
# IIJw8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956
# rEnPLqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuW
# TatEQOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3
# E+bnKD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60b
# hQjiWQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOIm
# YIbqyK+p/pQd52MbOoZWeE4wggbbMIIEw6ADAgECAhAEyswKPFRr9qgYCxGuzc8m
# MA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2Vy
# dCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25p
# bmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjExMDE5MDAwMDAwWhcNMjMx
# MTA0MjM1OTU5WjBgMQswCQYDVQQGEwJHQjEPMA0GA1UEBxMGTG9uZG9uMR8wHQYD
# VQQKExZWaXJ0dWFsIEVuZ2luZSBMaW1pdGVkMR8wHQYDVQQDExZWaXJ0dWFsIEVu
# Z2luZSBMaW1pdGVkMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAtbm3
# o57mQYxu0idSifhlyZaDVO0Zu0BnGTFZOtZLibBotgpKp7Be3k9WDyIbOiUHVaFY
# 7DG8aL8krpArj+3KJR49U5pLXcevNUQFLL18pi9lZ+e2w+dcBAfuJ30J760VtPDw
# AA7nmAff3f9o+tEB1ZnIeXzlPRyMz7YZS43sDeAft8p8jFzmM0jRtt9SXNxKcC0g
# nX6Cx0vw4AkxmMtreX/Igvj5VVq4M81E84CefWsU/IpqIL24xpxl3OOwZ53wzn+r
# PA3T9bj0PUyI/6VvONUIRD/EfODxurVdSDduLHsRag4+Q3xFvZm/WNqsr2qGv7LH
# T3uKPsjuPBo1Mz9fM/AfPwdEfM3xJ+Y1rBqUxnDhwYS97Fw3LM63lTKl3bN4TOFE
# JX8YPgC02J4vzYSIP0fwBBPyd7MtbiXzFvSoXnl0EQmjH+k4fjOCwn1tgWnI77NE
# T05Jd06F3Od52In9qIJ5Bhu4zlMFEQgE7JONOI4/Hl/dBzfNkyItMMRcNiPJAgMB
# AAGjggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNV
# HQ4EFgQUEr+p1bWwrT+zl6+TXhHWz9ewYuAwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwz
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5
# NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx
# Q0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRw
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT
# aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJ
# KoZIhvcNAQELBQADggIBAB35Ee2voPHjrdDlB80kocW2ZrVcKO5/POchPOvxL1ev
# XPdoaexNDCwXzM/6GXa4U1VhV+GqbeQ+JCZFXWbiycxqXEfi5fxj2sRzdF3CDoot
# FiqxK1eqz2W82KR5FX45LTsQMrg6O8kA2nb2eBxk6TWYUtS+3jtdS/nwDp/B/A+o
# l0CaD51hlzq9QY0NNkwsbZ+fKmIxinqEFF6ntaOmQNWS0EOtNQBYdlf0pNThBuPx
# ENsDtWRS56pg3qfl3+khteed8sFoyY/9g1Sofbc7DAQiYtTikmekA+s5WkHY1ewi
# SF/NcXSNNMNgbuAsizoMQ9NkJ/vMhs89+hNUe6Tlk9bFffOP9oh5z6Df/XHJslhN
# Y3DxWYQQxtqzZpAk/4GCJ8L9qdeEDvtulPp3p6VqNBxQPu98C46pfXgCX0vIieVy
# 3RZOhHD2JCytWNFWXJFvoo03akcyTumiq2+mew6ALwXKKtFeoDHfnzDkVsZRPqY4
# 9gECVKifY7Z7Usuf3SBOB6txOlzK15eMR2EIRsBSCPVZCevU9z51DP/GLZ6/kCDG
# 6hcu6isenIWAxWw1wiGv6HJpca73ummRYoUeKtNV8hg7ItlPimtrjjoT+0ciE8Oh
# uv5GDBqK0GE4ikCIUZyFg74ppkHV4q+YghXvubkwMSV7ymFRKhgcGQLlDXP+OaVQ
# MYIE0jCCBM4CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs
# IEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5n
# IFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAEyswKPFRr9qgYCxGuzc8mMAkGBSsO
# AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
# BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqG
# SIb3DQEJBDEWBBQq5BpyOMAr1m0/9vhZTZZyoiIsCjANBgkqhkiG9w0BAQEFAASC
# AYBLfsbgYtoUd11QkDU+dkq0tIEtqdwYD4wuko+PUMR9IQCwqTMfzIgc1hzmGK3e
# y0j7M7YjVfdGVLyccvqMaTv1vNZ/O1Hz01O1DzOUr2fGhuz+pfT4U7uXvuCOlWG0
# 3uzUWxktXjMTS9KFoQ7L+RUGX6KfjxCP/HwE5UR7jgYMTb3yNEaM9+Xzh9HNu7uX
# /6t2Zscx2Yan2lIBS2OVTXKZUqwv0OHzY5r+Iayy47JlUlkWdvq/VStKKRWetURm
# vJMtePFerJO5D1+weKDF1a402QnlwY9t1jG7U+DNpK5zfy0SnQY4jz7QpLbZtoX+
# yjbDO31wej/vj+AYD2VzVYswS0Rin3aiuibUx40Xz2Uk+8bUUYqwBkNybfuy5PHe
# pUBTsIEc2eyyV39eBXkh/IVkO9t4il7lxb2/l969M1TRuGGI+FoqbfI1Z+/Uzts+
# b0IgSLe/G852W98sudVVd9OuO2mi83gWAF7pFb47koKI/1qByPsSw6c9dZJHDLgb
# yn6hggIwMIICLAYJKoZIhvcNAQkGMYICHTCCAhkCAQEwgYYwcjELMAkGA1UEBhMC
# VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0
# LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFt
# cGluZyBDQQIQDUJK4L46iP9gQCHOFADw3TANBglghkgBZQMEAgEFAKBpMBgGCSqG
# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIyMDEwNjEwMDc1
# OFowLwYJKoZIhvcNAQkEMSIEIHUJMVdKYlM52nvntB9cuw8jCoSAuzBT4HUtttjy
# iz0iMA0GCSqGSIb3DQEBAQUABIIBAIPlI6EGCPexctPaHCXKIulb6pKjziHkcGPZ
# gu9O1kFf32JPH6M6YnCEm4D7bQtGLtcqRYeyvadRRpPMpVvKGKH4QaG6wMuGEj9P
# XVmnk3FDpjM+EACqQ8uvr77yL13SoneETRhVfv4f9xfedoqOTILPiY3/gWT5ZFVc
# nFwZt9Ucs2z52vvxFyWZEKlzlCe/83cE+y9hvmsxmrtwrv22X24bIcCI4GIBIUUo
# 24/0qrzZVd22QwRqxBoWYJeAUzGMq8k8dPY0Ljxb+HiNsZ/IUc5nAOuGso0AcS18
# mSXzNs2JVcjej1KqQtOVCRHeW9ufSHDzDzt9Vx6C9jzbqRqvbGk=
# SIG # End signature block