AzureAD.psm1

$AzureMajorVersion = "1"

$AzureRMModules = @(
  "AzureRM.ApiManagement",
  "AzureRM.Automation",
  "AzureRM.Backup",
  "AzureRM.Batch",
  "AzureRM.Compute",
  "AzureRM.DataFactories",
  "AzureRM.DataLakeAnalytics",
  "AzureRM.DataLakeStore",
  "AzureRM.Dns",
  "AzureRM.HDInsight",
  "AzureRM.Insights",
  "AzureRM.KeyVault",
  "AzureRM.Network",
  "AzureRM.OperationalInsights",
  "AzureRM.RedisCache",
  "AzureRM.Resources",
  "AzureRM.SiteRecovery",
  "AzureRM.Sql",
  "AzureRM.Storage",
  "AzureRM.StreamAnalytics",
  "AzureRM.Tags",
  "AzureRM.TrafficManager",
  "AzureRM.UsageAggregates",
  "AzureRM.Websites"
)

function Test-AdminRights([string]$Scope)
{
  if ($Scope -ne "CurrentUser")
  {
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    $isAdmin = (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
    if($isAdmin -eq $false)
    {
      throw "Administrator rights are required to install or uninstall Microsoft Azure modules"
    }
  }
}

function CheckIncompatibleVersion([bool]$Force)
{
  $message = "An incompatible version of Azure Resource Manager PowerShell cmdlets is installed. Please uninstall Microsoft Azure PowerShell using the 'Control Panel' before installing these cmdlets. To install these cmdlets regardless of compatibility issues, execute 'Install-AzureRM -Force'."
  $path = ${env:ProgramFiles(x86)}
  if ($path -eq $null)
  {
    $path = ${env:ProgramFiles}
  }

  if ( Test-Path "$path\Microsoft SDKs\Azure\PowerShell\ResourceManager\AzureResourceManager\AzureResourceManager.psd1")
  {
    if ($Force)
    {
      Write-Warning $message
    }
    else
    {
      throw $message
    }
  }
}

function Install-ModuleWithVersionCheck([string]$Name,[string]$MajorVersion,[string]$Repository,[string]$Scope)
{
  $_MinVer = "$MajorVersion.0.0.0"
  $_MaxVer = "$MajorVersion.9999.9999.9999"
  $script:InstallCounter ++
  try {
    $_ExistingModule = Get-Module -ListAvailable -Name $Name
    $_ModuleAction = "installed"
    if ($_ExistingModule -ne $null)
    {
      Install-Module -Name $Name -Repository $Repository -Scope $Scope -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -Force -ErrorAction Stop
      $_ModuleAction = "updated"
    }
    else 
    {
      Install-Module -Name $Name -Repository $Repository -Scope $Scope -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Stop
    }
    $v = (Get-InstalledModule -Name $Name -ErrorAction Ignore)[0].Version.ToString()
    Write-Output "$Name $v $_ModuleAction [$script:InstallCounter/$($AzureRMModules.Count + 2)]..." 
  } catch {
    Write-Warning "Skipping $Name package..."
    Write-Warning $_
  }
}

<#
 .Synopsis
  Install Azure Resource Manager cmdlet modules
 
 .Description
  Installs all the available Azure Resource Manager cmdlet modules that have a matching major version.
 
 .Parameter MajorVersion
  Specifies the major version.
 
 .Parameter Repository
  Limit the search for "AzureRM" cmdlets in a specific repository.
  
 .Parameter Scope
  Specifies the parameter scope.
#>

function Update-AzureRM
{
  
  param(
  [Parameter(Position=0, Mandatory = $false)]
  [string]
  $MajorVersion = $AzureMajorVersion,
  [Parameter(Position=1, Mandatory = $false)]
  [string]
  $Repository = "PSGallery",
  [Parameter(Position=2, Mandatory = $false)]
  [ValidateSet("CurrentUser","AllUsers")]
  [string]
  $Scope = "AllUsers",
  [switch]
  $Force = $false)

  Test-AdminRights $Scope
  CheckIncompatibleVersion($Force.IsPresent)

  Write-Output "Installing AzureRM modules."

  $_InstallationPolicy = (Get-PSRepository -Name $Repository).InstallationPolicy
  $script:InstallCounter = 0

  try 
  {
    Set-PSRepository -Name $Repository -InstallationPolicy Trusted

    Install-ModuleWithVersionCheck "AzureRM.Profile" $MajorVersion $Repository $Scope
    Install-ModuleWithVersionCheck "Azure.Storage" $MajorVersion $Repository $Scope

    # Start new job
    $AzureRMModules | ForEach {
      Install-ModuleWithVersionCheck $_ $MajorVersion $Repository $Scope
    }    
  } finally {
    # Clean up
    Set-PSRepository -Name $Repository -InstallationPolicy $_InstallationPolicy
  }
}

<#
 .Synopsis
  Import Azure Resource Manager cmdlet modules
 
 .Description
  Imports all the Azure Resource Manager cmdlet modules that have a matching major version.
 
 .Parameter MajorVersion
  Specifies the major version.
#>

function Import-AzureRM
{
  param(
  [Parameter(Position=0, Mandatory = $false)]
  [string]
  $MajorVersion = $AzureMajorVersion)
  Write-Output "Importing AzureRM modules."

  $_MinVer = "$MajorVersion.0.0.0"
  $_MaxVer = "$MajorVersion.9999.9999.9999"

  $AzureRMModules | ForEach {
    $moduleName = $_
    $_MatchedModule = Get-InstalledModule -Name $moduleName -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Ignore | where {$_.Name -eq $moduleName}
    if ($_MatchedModule -ne $null) {
      try {
        Import-Module -Name $_MatchedModule.Name -RequiredVersion $_MatchedModule.Version -ErrorAction Stop
        Write-Output "$moduleName imported..." 
      } catch {
        Write-Warning "Skipping $Name module..."
        Write-Warning $_
      }
    }
  }
}

function Uninstall-ModuleWithVersionCheck([string]$Name,[string]$MajorVersion)
{
  $_MinVer = "$MajorVersion.0.0.0"
  $_MaxVer = "$MajorVersion.9999.9999.9999"
  # This is a workaround for a bug in PowerShellGet that uses "start with" matching for module name
  $_MatchedModule = Get-InstalledModule -Name $Name -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Ignore | where {$_.Name -eq $Name}
  if ($_MatchedModule -ne $null) {
    try {
      Remove-Module -Name $Name -Force -ErrorAction Ignore
      Uninstall-Module -Name $Name -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -Confirm:$false -ErrorAction Stop
      if ((Get-Module -Name $Name -ListAvailable) -eq $null)
      {
        Write-Output "$Name uninstalled..." 
      } 
      else 
      {
        Write-Output "$Name partially uninstalled..." 
      }
    } catch {
      Write-Warning "Skipping $Name package..."
      Write-Warning $_
    }
  }
}

<#
 .Synopsis
  Remove Azure Resource Manager cmdlet modules
 
 .Description
  Removes all installed Azure Resource Manager cmdlet modules that have a matching major version.
 
 .Parameter MajorVersion
  Specifies the major version.
#>

function Uninstall-AzureRM
{
  param(
  [Parameter(Position=0, Mandatory = $false)]
  [string]
  $MajorVersion = $AzureMajorVersion)

  Test-AdminRights "AllUsers"

  Write-Output "Uninstalling AzureRM modules."

  $AzureRMModules | ForEach {
    $moduleName = $_
    Uninstall-ModuleWithVersionCheck $_ $MajorVersion
  }

  Uninstall-ModuleWithVersionCheck "Azure.Storage" $MajorVersion
  Uninstall-ModuleWithVersionCheck "AzureRM.Profile" $MajorVersion
}

New-Alias -Name Install-AzureRM -Value Update-AzureRM
Export-ModuleMember -function * -Alias *
# SIG # Begin signature block
# MIIkCAYJKoZIhvcNAQcCoIIj+TCCI/UCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCBFeDIzihKuWTz
# dY+ooBtlQaurdm1U1EgLXqcBPfBHnKCCDY4wggYMMIID9KADAgECAhMzAAAAeAZm
# rCoRZAg+AAAAAAB4MA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTYwNTA5MjIwNjQ0WhcNMTcwODA5MjIwNjQ0WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDjjEkx/uc8hldkxl009SWe3pOrRROfVpkFxW96tHdc3MpiCk+NrfaezAF+GIJQ
# E/HRXqeWBPmHGHhQjPe4fHaSknPvZATMmour8PedpzOYh5kpJGo/g5N7wTrhTevA
# 0qFQ8Ztsl6yPHeEfBWp8oK7vfmb2Xg0ebfLeiUVEottoYnz0DJOqbAlL3meYZyye
# MrTCFQ2TVQjEITRhhlVjNjsw0uuKigYKCe/v6XD6/3n4JgvqxwWeVZzJjql4L1wE
# HV0JUxsez6GMXdxWI0/7cZl9bUQu6b84mya0u+1WZdXWXFfkxR4fspadu7/o+Pvy
# D3U+3rq6ypE+0EhEnxM5k0wfAgMBAAGjggGLMIIBhzArBgNVHSUEJDAiBggrBgEF
# BQcDAwYKKwYBBAGCN0wIAQYKKwYBBAGCN0wTATAdBgNVHQ4EFgQUx94Wiq/BhJ9h
# vcrn+CW7rfB9pjcwUQYDVR0RBEowSKRGMEQxDTALBgNVBAsTBE1PUFIxMzAxBgNV
# BAUTKjU0ODE2K2ZiMjIwNGUzLTg0MjEtNDhkNi1hNjQ3LTllMGQ0ODJmNzdlYzAf
# BgNVHSMEGDAWgBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BF
# hkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQ
# Q0EyMDExXzIwMTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcw
# AoZFaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RT
# aWdQQ0EyMDExXzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN
# AQELBQADggIBAKR7S0vtJ2GiJWqGxiajASpekSUj4YN6Bqd/zGvzEFJkonVR3IAh
# kPYH52WL8kl/JVdgg3bxPgz/NO9Nvs1jhFslTk7ZYG1BFoOz2yU98NV9uG3eD3JR
# t0tV2wl6dT9MpirfsNfnubh+EAYi1XySy+Nz7QazyUKjSljfx1tAgMmFC5qNe5VO
# PGyN2Eqp/swW2VuXGLHQoXNf1L9n9oM3xHDEh+aKgp6KvahKoXa9XGOM9GlSfSLS
# 0rZVLsOMDKu1dp9s1mYpWlj4h57L7M0OSwO5hMWYm5dAxQRUthjUazBvNv3iO1SQ
# haw/lAUo+zFrjVneUdYBj7PTJGyD5JV/wUdjeGEvsKorhNf2ykEg8Ivf6KnsSGAz
# aMojeBi/cpLQBZU0/42Jyn8xoQ2y+NPOqOsP0CcdelQXTWa46sy5qKhVAAeENyrd
# FlFwD3feiJiMPNPAGPQC15ovlUnWqIK1MxREitP4ubfghF/zdIloP9zEFTeQsKcV
# XAWinUsAjw5+HnElGhF+3kj9034qdSdxT524WvzWV5mj4wmRDMy+4tYakdz/32L/
# quBnYlpNf+4uldWIxETJjtly3Wnx8wcA+rQjLTvVIrOdXv4pzMc9emKzmHFBX7dm
# v8l5pbZDENZHPKBG0g/DKy8p/Rp0Hlc6I/mKZq2dG2gJ85mmVX7f1LPmMIIHejCC
# BWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJv
# b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcN
# MjYwNzA4MjEwOTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2
# WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSH
# fpRgJGyvnkmc6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQ
# z7NEt13YxC4Ddato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHml
# SSnnDb6gE3e+lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3o
# iU+EGvKhL1nkkDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6
# nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6ep
# ZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf
# 28AVs70b1FVL5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCn
# q47f7Fufr/zdsGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx
# 7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O
# 9JawvEagbJjS4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0G
# A1UdDgQWBBRIbmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMA
# dQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAW
# gBRyLToCMZBDuRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8v
# Y3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQy
# MDExXzIwMTFfMDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZC
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQy
# MDExXzIwMTFfMDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCB
# gzA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9k
# b2NzL3ByaW1hcnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABf
# AHAAbwBsAGkAYwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEB
# CwUAA4ICAQBn8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LR
# bYP+vj/oCso7v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r
# 4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb
# 7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6v
# mSiXmE0OPQvyCInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/
# sfQn+N4sOiBpmLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad2
# 5UAqZaPDXVJihsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUf
# FL5hYbXw3MYbBL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWx
# m6U/RXceNcbSoqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMj
# aHXmr/r8i+sLgOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7
# qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCFdAwghXM
# AgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAm
# BgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAB4Bmas
# KhFkCD4AAAAAAHgwDQYJYIZIAWUDBAIBBQCggbowGQYJKoZIhvcNAQkDMQwGCisG
# AQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcN
# AQkEMSIEIK8gGO7PLqUmbtfQn6GUOT/1Todgh2Slpd41VZ/f4ic5ME4GCisGAQQB
# gjcCAQwxQDA+oBqAGABBAHoAdQByAGUAQQBEAC4AcABzAG0AMaEggB5odHRwOi8v
# d3d3Lk1pY3Jvc29mdE9ubGluZS5jb20wDQYJKoZIhvcNAQEBBQAEggEARMx0YS10
# xx/AYS4qYMQcJmDCv3Xd+/SbInZt1FP5F5jcusI2ahw9vT6EdrkWa7togCAgbDb+
# yf3FxDr66rRwxu/mzg3fFBqO+qK2BBWrbvJ30n/PnpuFNsDNuz1d7urrwK8eZaBY
# xre22Gaai7a/hF7DDgeU/FfwXzE38oCKysbv7zqIE4tVeuKrGf9hlTevIjDVeEPD
# EM+w8jDEuslSrWbVDNo7HJmlOPd4X/RAD9j9BR8jsR2NkuMW4gMgZtXc0w1bLt5X
# B5iMjx9R2fYsoXiMjTkyMPRkeSTANgIeiuARp1LcFoseozESLPZOvekcAMk3k7wg
# gf221W20x+pAWaGCE04wghNKBgorBgEEAYI3AwMBMYITOjCCEzYGCSqGSIb3DQEH
# AqCCEycwghMjAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggE9BgsqhkiG9w0BCRABBKCC
# ASwEggEoMIIBJAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDMZnzO
# huIFC009xmCJDvaKzkom6OX2SGbe2pU4Sp2+UwIGV2l9TmATGBMyMDE2MDYyMTIz
# NTQxMS44NDlaMAcCAQGAAgH0oIG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVy
# IERTRSBFU046NzI4RC1DNDVGLUY5RUIxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFNlcnZpY2Wggg7RMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
# ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m
# K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm
# gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5
# hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm
# wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB
# wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE
# DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
# HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo
# dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D
# ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC
# hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1
# dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw
# gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j
# cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A
# UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL
# BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ
# at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1
# mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv
# SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/
# amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW
# hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua
# 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio
# SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH
# czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw
# 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P
# 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSMIIE2jCCA8Kg
# AwIBAgITMwAAAIeQ5+wn4Z9JdgAAAAAAhzANBgkqhkiG9w0BAQsFADB8MQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
# ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xNjAzMzAxOTI0MjVaFw0xNzA2MzAx
# OTI0MjVaMIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0w
# CwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046NzI4RC1DNDVG
# LUY5RUIxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEi
# MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0VU2FComMrvZi0BuV0cdNJDa5
# hnKwUyD7eC6sO/4ABRxo2UreFOADGzlkA/y5mOIZdzMcS7XNDK4Aep3MdJyn8bU4
# 2L1fBMf4z6LpDAPnLex7eF6KrTGxJpNT3OjnV2c7LMhVyfECFkdhLqvNU7/IWoRu
# nsta7vNxZzBFJobcp+x9Q5dQ9ABEynS5ySORVvwUewgrCjQ4IeMHcpyeKTB6NgUV
# DB/V2ygOBaOcYRKQoqRisLqdBQ0tGiOEYM6cmUJsGU+GQw6P8KyLMGrSVHWW6xni
# KY5YJH4i1Vf9XzanLvc6R4ZBxSEtjbpTlKKBEIFetP3HKFAOYgfOLiCUpToRAgMB
# AAGjggEbMIIBFzAdBgNVHQ4EFgQUToxIRaP/l1ITv7xeM34/hv++ZvowHwYDVR0j
# BBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0
# cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3Rh
# UENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0Ff
# MjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcD
# CDANBgkqhkiG9w0BAQsFAAOCAQEAX4NXpQpFkUcqMhYiOFkjtmMiaA6M54I9ciHm
# WpKZOAt0xNjaUY/7th91URBE61QxPb+oPCJfYBiocRrnY3Vae54w9BWmTP/Tj53x
# x7poOQ+yrzlCiE7F8iuIcscW4Xs+3uP7Wgw6sXU477Fr8dll5ytT4Z99ATAQtNeV
# zJ9UDijX68MdJ+Ihyliim0cBMLlq/QnmBZibiZh37DLy+jW3aaSctyby2rw7lpfx
# GLXeed+2ttpNQvwDgODJoYKtboGIK064YvdhyrCwyCNxKaNF4IRG3KFRR77k7xAv
# 7ilzoHpgdcgBb+Tkig7Nn8OrzOKGLjFYv3VKGvTbD0IPtc5/5aGCA3owggJiAgEB
# MIHjoYG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046NzI4RC1D
# NDVGLUY5RUIxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wi
# JQoBATAJBgUrDgMCGgUAAxUAd+UYX0PqLOMGRy1+N6PkcsJRt92ggcIwgb+kgbww
# gbkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsT
# BE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRTIEVTTjo1N0Y2LUMxRTAtNTU0QzEr
# MCkGA1UEAxMiTWljcm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkq
# hkiG9w0BAQUFAAIFANsT+8kwIhgPMjAxNjA2MjExNzQ1NDVaGA8yMDE2MDYyMjE3
# NDU0NVoweDA+BgorBgEEAYRZCgQBMTAwLjAKAgUA2xP7yQIBADALAgEAAgMIqrkC
# Af8wBwIBAAICFz8wCgIFANsVTUkCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYB
# BAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQACAwehIDANBgkqhkiG9w0BAQUFAAOC
# AQEAIGWATwSWZlxZe4ThkbmYc4IYrqymdT+x8O3Y0z+g7ivdxB2ODOCm17YmNYDv
# 2TOK1H9CTDYKVlKbiaKt7Ly817c6mKBchSx7rpast89MwRwn44jYc3BnhFzFabdJ
# gPRX/XxAydSnCi9pd7Y0igvZdK9YrmEBCF7tX30w7O1h6SETWNGxFUTcX/Y6LBe3
# hBDMZJ7JPRBLh3ggQ2oksZn8HGPnU2ucZL7lr/4Hd9ASlsJMh3qrgrTrJBVluEFM
# gx47hO9muRCJFsXqOdqZat9F6xbPTPd6IeqhQ36LzecqqXvtQBzz3Tw3d6Nuh4tP
# fRxUKJ2Fds8GruBU2ihDsu2wuDGCAvUwggLxAgEBMIGTMHwxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFBDQSAyMDEwAhMzAAAAh5Dn7Cfhn0l2AAAAAACHMA0GCWCGSAFlAwQC
# AQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkE
# MSIEIDbtdITyj+u4f5TU+uunPg9RRuCkfHc0JJFXYgxYV0MqMIHiBgsqhkiG9w0B
# CRACDDGB0jCBzzCBzDCBsQQUd+UYX0PqLOMGRy1+N6PkcsJRt90wgZgwgYCkfjB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAIeQ5+wn4Z9JdgAAAAAA
# hzAWBBSXh1MwwNr22aI8pQBcUW/xCTQZLTANBgkqhkiG9w0BAQsFAASCAQAeKXWr
# k57k+p+6UmJDXmsgYRgMHIXdW5pbPm17Ic0Cv/NQ4iTJBuBBmHHrOmQ/0FDZXefO
# Ga0htkvZAVFUC7qttBzi7zUVeJwfhGjGoOEdp0DLzmXjnefw/7wvDH7mc6GiHZQb
# wQ11GLF2YADMrs17xgLF0QUPH+PtGz2cwQtq5AYLgz33un8bS0Rcts8zMW43d6Si
# w5rEVOUFytnltR99uLAKcmE2Je7uFiBrED9w1OguQ+T8MZXruRsz6fXhikYPtGmH
# L2zrR9bfdLfb9c1uBRljIVZTkqQukGI7lLU89GBekOV3OTofLC2V3PWPGA3v6Wlw
# Db1zWT6cQZDDZQ/l
# SIG # End signature block