AMPowerShellTemplate.psm1

<#
.Synopsis
   This function creates a new PowerShell Module, PowerShell Manifest file and default Pester tests including default PSScriptAnalyser tests for all files.
.DESCRIPTION
   Long description
.EXAMPLE
   New-AMPowerShellModule -Name MyModule -Path C:\MyPath\ -Author 'Flemming Rohde' -CompanyName Automize -Copyright 2018 -ModuleVersion 1.0.0.0 -Description testing -Verbose
.EXAMPLE
   Another example of how to use this cmdlet
.INPUTS
   Inputs to this cmdlet (if any)
.OUTPUTS
   Output from this cmdlet (if any)
.NOTES
   General notes
.COMPONENT
   The component this cmdlet belongs to
.ROLE
   The role this cmdlet belongs to
.FUNCTIONALITY
   The functionality that best describes this cmdlet
#>

Function New-AMPowerShellModule {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param(
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Name,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Path,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Author,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$CompanyName,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Copyright,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$ModuleVersion,
        [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Description
    )

    Begin {
    }
    Process {
        if ($pscmdlet.ShouldProcess("PowerShell Module name: $Name", "New")) {
            
            $ModuleFolderPath = New-Item -Path $Path -Name $Name -ItemType Directory -Verbose
            
            $VersionFolderPath = New-Item -Path $ModuleFolderPath -Name $ModuleVersion -ItemType Directory -Verbose
            
            New-Item -Path $VersionFolderPath -Name 'Tests' -ItemType Directory -Verbose

            Out-File -FilePath "$VersionFolderPath\$Name.psm1" -Encoding utf8 -Verbose

            $ModulePath = (Get-Module -Name AMPowerShellTemplate).path
            
            $CurrentLocation = Get-Location

            Push-Location -Path $ModulePath.Substring(0, $ModulePath.LastIndexOf("\"))

            $Parameters = Get-Content -Path .\DefaultTests.json | ConvertFrom-Json

            $Parameters.DefaultTests.Module.Content | Out-File -FilePath "$VersionFolderPath\Tests\$Name.tests.ps1" -Encoding utf8

            $ModuleManifestParams = @{
                RootModule        = "$Name.psm1"
                Path              = "$VersionFolderPath\$Name.psd1"
                GUID              = [System.Guid]::NewGuid()
                Author            = $Author
                CompanyName       = $CompanyName
                Copyright         = $Copyright
                ModuleVersion     = $ModuleVersion
                Description       = $Description
                FunctionsToExport = @() 
                CmdletsToExport   = @() 
                AliasesToExport   = @()
                Verbose           = $true
            }

            New-ModuleManifest @ModuleManifestParams 

            Push-Location $VersionFolderPath
            Invoke-Pester ".\Tests\$Name.tests.ps1"
            Set-Location $CurrentLocation
            
        }
    }
    End {
    }
}

<#
.Synopsis
   This function creates a new PowerShell Script and default Pester tests including default PSScriptAnalyser tests for all files.
.DESCRIPTION
   Long description
.EXAMPLE
  New-AMPowerShellScript -Name MyScript -Path C:\MyPath -Verbose
.EXAMPLE
   Another example of how to use this cmdlet
.INPUTS
   Inputs to this cmdlet (if any)
.OUTPUTS
   Output from this cmdlet (if any)
.NOTES
   General notes
.COMPONENT
   The component this cmdlet belongs to
.ROLE
   The role this cmdlet belongs to
.FUNCTIONALITY
   The functionality that best describes this cmdlet
#>

            Function New-AMPowerShellScript {
                [CmdletBinding(SupportsShouldProcess = $true)]
                param(
                    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Name,
                    [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Path
                )

                Begin {
                }
                Process {
                    if ($pscmdlet.ShouldProcess("PowerShell Script name: $Name", "New")) {
            
                        $ScriptFolderPath = New-Item -Path $Path -Name $Name -ItemType Directory -Verbose
    
                        Out-File -FilePath "$ScriptFolderPath\$Name.ps1" -Encoding utf8 -Verbose

                        $ModulePath = (Get-Module -Name AMPowerShellTemplate).path

                        $CurrentLocation = Get-Location

                        Push-Location -Path $ModulePath.Substring(0, $ModulePath.LastIndexOf("\"))

                        $Parameters = Get-Content -Path .\DefaultTests.json | ConvertFrom-Json

                        Push-Location $ScriptFolderPath

                        $Parameters.DefaultTests.Script.Content | Out-File -FilePath ".\$Name.tests.ps1" -Encoding utf8

                        Invoke-Pester
                        Set-Location $CurrentLocation
            
                    }
                }
                End {
                }

            }

            Export-ModuleMember -Function New-AMPowerShellModule

            Export-ModuleMember -Function New-AMPowerShellScript
# SIG # Begin signature block
# MIIcbQYJKoZIhvcNAQcCoIIcXjCCHFoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU81VFtM7Dj+2jYZnV4hmkCghd
# /LugghecMIIFJTCCBA2gAwIBAgIQBvr9sL154xnLx2xzI6KkMjANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MTAxNDAwMDAwMFoXDTE5MTAy
# MzEyMDAwMFowYjELMAkGA1UEBhMCREsxEzARBgNVBAgTClN5ZGRhbm1hcmsxEDAO
# BgNVBAcTB0tvbGRpbmcxFTATBgNVBAoTDEF1dG9taXplIFAvUzEVMBMGA1UEAxMM
# QXV0b21pemUgUC9TMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw9ot
# S4zzE1kP2SFLvYVXeM16FNJOMaESNYXUuE9rrzXUDyBpLA9EiCvOvnAaii1XvFfg
# 6OJpCppnNzrJCZ3rTdHm7Lf/P7LCQUk3Pc6xI5jHcLKUaINFo529+2yVqNPzqMJ/
# OgT2nxQiU6BaEwauK5xEbRwF/Fu3jZMvC7+1TM3MjO6aGnoey0kYaHrXdY+lqTlp
# QJ287vrYrJIsYZfrlYkEQTJe5wMx8QL6KvkMfXxeFoUVz9SIS9CPsYhHRYlEAWhD
# hgV+x/8l3Kpiu8lrsfpqQndS/rfS46sIhtmI2ppc2kWqvcXfAvxzVF/3P5p0JbbF
# hPBrjKE6V6C/nhKvHwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoKo6Xq
# cQPAYPkt9mV1DlgwHQYDVR0OBBYEFLZGaqf5X3DRHeeZ1xZYk5xr4MKDMA4GA1Ud
# DwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWgM6Ax
# hi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNy
# bDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1j
# cy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYc
# aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsGAQUF
# BwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME4G
# CCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRT
# SEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkq
# hkiG9w0BAQsFAAOCAQEANMxgqONAb/uyja3uk0w1n/9pNE82rs8Mt6HrB4N6Xe2Y
# EHD01OXq97y1wikMG/G5rD8N16S9LtQpI3YqmjukuKr96Rm8oPapw13hTyYYPouV
# Wkxm/jzEmvp6rkLXR4cX4+VRHbepyZRv3ATzH/3B9zu/wM54AmNShgpSobYC6YR1
# RdeaDI9kbQbv4x0qlkAGTiF4O5bzX3EQyOgx8LTF1WuKVQySTNukrC36XaCZ1TgG
# 1lG5M3/AV0Aw6f6RvzPZqwAypj2/ncuRJ19ElsMmXd7f3CMO/gJKV2yhr90yS0ik
# DHb1vm6mdP1QnBe/em2i40GF4tvCOKZAGm6+YLdruDCCBTAwggQYoAMCAQICEAQJ
# GBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEk
# MCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEy
# MDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp
# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMo
# RGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE6
# 20T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG
# +yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwg
# la4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q1
# 6XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTF
# jg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOC
# Ac0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNV
# HR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRB
# c3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZI
# AYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20v
# Q1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAf
# BgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOC
# AQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3
# sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsH
# DpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlx
# sQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy
# 62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQY
# hS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV6uYX
# 8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD
# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln
# aUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAyMjAw
# MDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYDVQQD
# ExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0BAQEF
# AAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxrf2uM
# nVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqoSyyR
# icxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5SEb3
# yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFkjePr
# +hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+naQKFZ
# OtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEwDgYD
# VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYBBQUH
# AgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcCAjCC
# AVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABp
# AGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBw
# AHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQ
# AC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQBy
# AHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0
# ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwBy
# AHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBl
# AG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e36K+
# Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8EdjB0
# MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk
# SURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzAB
# hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9j
# YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0MA0G
# CSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHtOhcZ
# cRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFdNC8f
# cbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOmksDT
# jjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg8cZ3
# BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewSGL33
# VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIBAgIQ
# Bv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJVUzEV
# MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t
# MSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEw
# MDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD
# ExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf7Syc
# +BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0/hhJ
# gv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI+QWX
# faPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCuWWYK
# xI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx2M8e
# CnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNVHQ8B
# Af8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcD
# AwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0BgpghkgB
# hv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20v
# c3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBu
# AHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0
# AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBl
# ACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAg
# AGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBn
# AHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBi
# AGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0
# AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjAL
# BglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRtMGsw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcw
# AoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElE
# Um9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNl
# cnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDov
# L2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDAd
# BgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReuir/SS
# y4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22Wymv
# Us9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVdFxc0
# ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkUW6aG
# MWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+X+Ee
# vAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R1ye3
# Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9alQgp
# ECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl
# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdp
# Q2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhAG+v2wvXnjGcvH
# bHMjoqQyMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkG
# CSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE
# AYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTLsy+CRFtzl5cFruzEXLC4XgiPDDANBgkq
# hkiG9w0BAQEFAASCAQAuqo+6MFG1OugvwgpNDC4OD6O8FHjShgJ3JZWBiSkkDcrX
# MIX00vP9Z81PXujFPH82L72byk2KddJUT6GWg6tPcBiIoS9kyeZVd24GVz8cE4WZ
# 8Oh4MItrYEfrYtUAxrB+eeMK7hxG2nc2VFG8BR/nQ1eMfNAxjIwLp7FvuFLAdeAD
# jVQcpejztnA3D9YdMuv+m7ZQQN0d7L3B3H5TUQBmuH+UmGRicapxaJCIozC5Xaxm
# mva4UGV4fdo9XjLk2zl0Cx5BnBffBo9gZK4uTbhDdDXUcCFydM+jufPE1qGcfDAG
# rklrowzjSPkL21M4E4KaBzoSDQ9PagGXaBfFZxIXoYICDzCCAgsGCSqGSIb3DQEJ
# BjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0
# IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNl
# cnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIaBQCg
# XTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xODAz
# MTUxMzM2MzJaMCMGCSqGSIb3DQEJBDEWBBT2AgHntDGVkoQl/A9wLlhlkauZUTAN
# BgkqhkiG9w0BAQEFAASCAQAThWoJg9kobAOVCTFIiGWsE6/7/acGhEj23QAzqOso
# NE4zpZuHheD82Osk6THuoaioK1LHlXdO275vvElS71QwpGGqNNMy7SXKpPIHB9M2
# zlXH2umYY3hH5Dm9hAVBPH+J2ZWl7QhMdmoBQxGDVzkFtjTf78HEQGcln35JmuA9
# RjWfQ44BDFTodHZMGnwrbWarwv5XOXZYcMb4y8cQ87t/mrs9fdvXiSCN5fKG51Ws
# vGBGoIMdRl1qBFGhp+ndS4IH8hABD4TdQ1+T7W6wn7GpFD2+i6oQ0X0BxZ5++hN8
# Ej/TrGe987XtrqsZODDOasVt9sinjfk5KNi5SfTLK5VP
# SIG # End signature block