PoshCode Archive  Artifact [671419b931]

Artifact 671419b93194618afe022cc73ce761f2910292a5837fefb3422c86e881d75ea7:

  • File AppxApps.ps1 — part of check-in [5970f78268] at 2018-06-10 13:59:35 on branch trunk — This module provides two functions: Get-AppxApp and Start-AppxApp, which allow you to explore and launch the “modern” apps for Windows 8+ (user: Tome Tanasovski size: 18727)

# encoding: ascii
# api: csharp
# title: AppxApps
# description: This module provides two functions: Get-AppxApp and Start-AppxApp, which allow you to explore and launch the “modern” apps for Windows 8+
# version: 0.1
# type: module
# author: Tome Tanasovski
# license: CC0
# function: Get-AppxApp
# x-poshcode-id: 5701
# x-derived-from-id: 5702
# x-archived: 2016-11-18T08:27:56
# x-published: 2016-01-21T21:54:00
#
#
#Require -module AppX

# Props to Tome Tanasovski and Howard Kapustein who went before me ...
# https://powertoe.wordpress.com/2012/11/02/get-a-list-of-metro-apps-and-launch-them-in-windows-8-using-powershell/
# http://poshcode.org/3740
# http://blogs.msdn.com/b/howardk/archive/2013/03/26/powershell-fun-parsing-for-protocols.aspx

# Additional references
# http://stackoverflow.com/questions/12925748/iapplicationactivationmanageractivateapplication-in-c
# IApplicationActivationManager https://msdn.microsoft.com/en-us/library/windows/desktop/hh706902%28v=vs.85%29.aspx
# 

Add-Type @"
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace Windows {
    public enum ActivateOptions
    {
        None = 0x00000000,  // No flags set
        DesignMode = 0x00000001,  // The application is being activated for design mode, and thus will not be able to
        // to create an immersive window. Window creation must be done by design tools which
        // load the necessary components by communicating with a designer-specified service on
        // the site chain established on the activation manager.  The splash screen normally
        // shown when an application is activated will also not appear.  Most activations
        // will not use this flag.
        NoErrorUI = 0x00000002,  // Do not show an error dialog if the app fails to activate.                                
        NoSplashScreen = 0x00000004,  // Do not show the splash screen when activating the app.
    }

    [ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IApplicationActivationManager
    {
        // Activates the specified immersive application for the "Launch" contract, passing the provided arguments
        // string into the application.  Callers can obtain the process Id of the application instance fulfilling this contract.
        IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
        IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId);
        IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId);
    }

    [ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]//Application Activation Manager
    public class ApplicationActivationManager : IApplicationActivationManager
    {
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/]
        public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        public extern IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId);
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        public extern IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId);
    }
}
"@

$Activator = new-object Windows.ApplicationActivationManager

Update-TypeData -TypeName Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage -DefaultDisplayProperty Name -DefaultDisplayPropertySet Name, Version, Publisher -EA 0
Update-TypeData -TypeName Microsoft.Windows.Appx.Application -DefaultDisplayProperty AppUserModelId -DefaultDisplayPropertySet PackageName, Id, Publisher, Protocols, Extensions -EA 0

function Get-AppxApp {
    #.Synopsis
    #   Finds Apps that are in Appx packages.
    #.Example
    #   Get-AppxApp Microsoft.*
    #
    #   Returns all of the apps with Microsoft. in their package name.
    #.Example
    #   Get-AppxApp -Protocol tel://
    #
    #   Returns applications that can handle the "tel"ephone protocol (i.e.: Skype)
    #.Example
    #   Get-AppxApp | Where Publisher -match Microsoft
    #
    #   Returns all apps where Microsoft is the publisher. This includes apps like the OneDrive FileManager which is published by CN=Microsoft Windows... and doesn't have "Microsoft." in it's package name (and thus, wouldn't be returned by the first query).
    param(
        # The name of the package (by default return all packages)
        [Parameter(Position=0)]
        $PackageName = "*",
        # The Application ID (by default return all applications)
        [Parameter(Position=1)]
        $AppId = "*",

        # The Protocol. This allows you to search for the app that implements a particular procol, such as skype:// or sms:// or tel://
        [Parameter(Position=2)]
        $Protocol
    )
    Get-AppXPackage $PackageName -pv Package |
        Get-AppxPackageManifest | % { 
            foreach($Application in $_.Package.Applications.Application) {
                if($Application.Id -like $AppId) {
                    if($Protocol -and !($Application.Extensions.Extension.Protocol.Name | ? { ($_ + "://") -match (($Protocol -replace '\*','.*') + "(://)?") })) {
                        continue
                    }

                    [PSCustomObject]@{
                        # Notice the secret magic property:
                        PSTypeName = "Microsoft.Windows.Appx.Application"
                        AppUserModelId = $Package.PackageFamilyName + "!" + $Application.Id
                        PackageName = $Package.Name
                        Publisher = $Package.Publisher
                        PublisherId = $Package.PublisherId
                        PackageFamilyName = $Package.PackageFamilyName
                        Id = $Application.Id
                        Protocols = @( $Application.Extensions.Extension.Protocol.Name | %{ $_ + "://" })
                        Extensions = @( $Application.Extensions.Extension.FileTypeAssociation.SupportedFileTypes.FileType )
                        Package = $Package
                    }
                }
            }
        }
}


function Start-AppxApp {
    #.Synopsis
    #   Start a modern Windows application based on it's PackageName, fully-qualified AppUserModelId or protocol URL
    #.Example
    #   Start-AppxApp *ZuneMusic
    #
    #   Finds the Microsoft.ZuneMusic app and starts it
    #.Example
    #   Get-AppxApp *Zune* | Start-AppxApp
    #
    #   Finds all the Zune apps (ZuneVideo and ZuneMusic) and starts them
    [CmdletBinding(DefaultParameterSetName="ByName")]
    param(
        # A PackageName with only one application that's startable, such as Microsoft.ZuneMusic or Microsoft.SkypeApp
        [Parameter(Mandatory=$true, Position=0, ParameterSetName="ByName")]
        [Alias("Name")]
        [string]$PackageName,

        # The full AppUserModelId is composed of the package name, the publisher id, and the app id, such as Microsoft.ZuneMusic_8wekyb3d8bbwe!Microsoft.ZuneMusic
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, ParameterSetName="PackagePublisherApplicationID")]
        [ValidateScript({if($_ -match ".*_.*!.*") { $true } else { throw "Invalid AppUserModelId. Should be: PackageName_PublisherId!AppId"}})]
        [string]$AppUserModelId,

        # The protocol URI is the easiest way to start an app. If you have a modern app with a protocol, you can just use Start-Process, you don't even need to use Start-AppxApp!
        [Parameter(Mandatory=$true, ParameterSetName="Protocol")]
        [Alias("Protocols")]
        [ValidateScript({if($_ -match "\w+://.*") { $true } else { throw "Invalid Protocol. Should start with: protocol://"}})]
        [string]$Protocol
    )
    if($AppUserModelId) {
        $Null = $Activator.ActivateApplication($AppUserModelId, $null, [Win8.ActivateOptions]::None, [ref]0)
    }
    if($PackageName) {
        $Apps = @(Get-AppxApp -PackageName $PackageName)
        if($Apps.Count -gt 1) {
            Write-Warning "'$PackageName' matched multiple apps: $($Apps.AppUserModelId)"
        } else {
            $Null = $Activator.ActivateApplication($Apps[0].AppUserModelId, $null, [Win8.ActivateOptions]::None, [ref]0)
        }
    }
    if($Protocol) {
        start $Protocol
    }
}
# SIG # Begin signature block
# MIIarwYJKoZIhvcNAQcCoIIaoDCCGpwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2MJikmM/4GrXdZILVrmXDo91
# 7gagghXlMIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0B
# AQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIG
# A1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhh
# d3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg
# Q0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJV
# UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFu
# dGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5Q
# WvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeC
# i2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4
# ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3
# +3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujI
# fKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAd
# BgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIG
# CCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1Ro
# YXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNV
# HQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0y
# MDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdf
# plKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y
# 0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhq
# IhKjURmDfrYwggSjMIIDi6ADAgECAhAOz/Q4yP6/NW4E2GqYGxpQMA0GCSqGSIb3
# DQEBBQUAMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh
# dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD
# QSAtIEcyMB4XDTEyMTAxODAwMDAwMFoXDTIwMTIyOTIzNTk1OVowYjELMAkGA1UE
# BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTQwMgYDVQQDEytT
# eW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIFNpZ25lciAtIEc0MIIBIjAN
# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomMLOUS4uyOnREm7Dv+h8GEKU5Ow
# mNutLA9KxW7/hjxTVQ8VzgQ/K/2plpbZvmF5C1vJTIZ25eBDSyKV7sIrQ8Gf2Gi0
# jkBP7oU4uRHFI/JkWPAVMm9OV6GuiKQC1yoezUvh3WPVF4kyW7BemVqonShQDhfu
# ltthO0VRHc8SVguSR/yrrvZmPUescHLnkudfzRC5xINklBm9JYDh6NIipdC6Anqh
# d5NbZcPuF3S8QYYq3AhMjJKMkS2ed0QfaNaodHfbDlsyi1aLM73ZY8hJnTrFxeoz
# C9Lxoxv0i77Zs1eLO94Ep3oisiSuLsdwxb5OgyYI+wu9qU+ZCOEQKHKqzQIDAQAB
# o4IBVzCCAVMwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO
# BgNVHQ8BAf8EBAMCB4AwcwYIKwYBBQUHAQEEZzBlMCoGCCsGAQUFBzABhh5odHRw
# Oi8vdHMtb2NzcC53cy5zeW1hbnRlYy5jb20wNwYIKwYBBQUHMAKGK2h0dHA6Ly90
# cy1haWEud3Muc3ltYW50ZWMuY29tL3Rzcy1jYS1nMi5jZXIwPAYDVR0fBDUwMzAx
# oC+gLYYraHR0cDovL3RzLWNybC53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNy
# bDAoBgNVHREEITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMjAdBgNV
# HQ4EFgQURsZpow5KFB7VTNpSYxc/Xja8DeYwHwYDVR0jBBgwFoAUX5r1blzMzHSa
# 1N197z/b7EyALt0wDQYJKoZIhvcNAQEFBQADggEBAHg7tJEqAEzwj2IwN3ijhCcH
# bxiy3iXcoNSUA6qGTiWfmkADHN3O43nLIWgG2rYytG2/9CwmYzPkSWRtDebDZw73
# BaQ1bHyJFsbpst+y6d0gxnEPzZV03LZc3r03H0N45ni1zSgEIKOq8UvEiCmRDoDR
# EfzdXHZuT14ORUZBbg2w6jiasTraCXEQ/Bx5tIB7rGn0/Zy2DBYr8X9bCT2bW+IW
# yhOBbQAuOA2oKY8s4bL0WqkBrxWcLC9JG9siu8P+eJRRw4axgohd8D20UaF5Mysu
# e7ncIAkTcetqGVvP6KUwVyyJST+5z3/Jvz4iaGNTmr1pdKzFHTx/kuDDvBzYBHUw
# ggahMIIFiaADAgECAhAEGmrbrKa+TCtV79czahr8MA0GCSqGSIb3DQEBBQUAMG8x
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFzc3VyZWQgSUQgQ29k
# ZSBTaWduaW5nIENBLTEwHhcNMTQwMjIyMDAwMDAwWhcNMTUwMjI3MTIwMDAwWjBt
# MQswCQYDVQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxFzAVBgNVBAcTDldlc3Qg
# SGVucmlldHRhMRgwFgYDVQQKEw9Kb2VsIEguIEJlbm5ldHQxGDAWBgNVBAMTD0pv
# ZWwgSC4gQmVubmV0dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM8E
# fbdCOjy20LSGQEOL52ebfCHUYNkjQguadix9q8ByycbrBo8SXag1WS/YJB+kUu/C
# HRmFI2J9OL/Kqbq7dRgIQuu756e7JsBunrceqULPvb4EeAhOyWx3/YmvpqcaAA3V
# vgVzFr3NIa4f1e+IA1bPmzlaSMmDvvUpSkYyVc56sPd3Yytil3IoL6mUO5s8onqN
# 094Sdo9EtM+lFUlHI1L7dt1xMyr4GtKM2y1y2AFJcyIgWVZxigNWdRipUZ50mtlO
# FZURIQ8E7hbBp9oW9VOtm7nPHOGR8Z0/G/XkQdPGGnbXNuCq/ADKrVa7DP1B98nx
# lvh6ofrL9G8exAcIBiUCAwEAAaOCAzkwggM1MB8GA1UdIwQYMBaAFHtozimqwBe+
# SXrh5T/Wp/dFjzUyMB0GA1UdDgQWBBRbh3rg73KuDFhfQln3hUB0VztYUTAOBgNV
# HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwcwYDVR0fBGwwajAzoDGg
# L4YtaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL2Fzc3VyZWQtY3MtMjAxMWEuY3Js
# MDOgMaAvhi1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vYXNzdXJlZC1jcy0yMDEx
# YS5jcmwwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwDATCCAaQwOgYIKwYB
# BQUHAgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9y
# eS5odG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYA
# IAB0AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkA
# dAB1AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAA
# RABpAGcAaQBDAGUAcgB0ACAAQwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAA
# UgBlAGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAA
# dwBoAGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4A
# ZAAgAGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkA
# bgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wgYIGCCsGAQUFBwEBBHYwdDAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEwGCCsGAQUFBzAC
# hkBodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURD
# b2RlU2lnbmluZ0NBLTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQAD
# ggEBACKXZpuArXbbsKPqc/tVw6+W/vU9xwhNwxNKMno5f7ugWYDkBVyt0zw3fgPZ
# OIRyIR7Jcg2WxL30K20AMd3J+N4981HqWghI8Qp5Z1JL2b2msLmX3VbR1n9625Nd
# 2hHcUw3SXhgaBrsRo49YsWqzJWCCGyeaOOI+V08K94yztTol9k7jxuODkIbGGaey
# OH35AZ1NBH4kcp7pScVytdQYU536dfe9gUglawXqWIseNXEShMZCazDbe5yNDe17
# e3RvR8TJH+0gQw09tHWGTuUnC7sL1JgA7FvoypbQp4VCTSxZaK5jZdhxcLcys7nl
# zQTTOnk4iKHsd1RjiKeNGQEATGkwggajMIIFi6ADAgECAhAPqEkGFdcAoL4hdv3F
# 7G29MA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp
# Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMTAyMTExMjAwMDBaFw0yNjAy
# MTAxMjAwMDBaMG8xCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQCcfPmgjwrKiUtTmjzsGSJ/DMv3SETQPyJumk/6zt/G0ySR/6hS
# k+dy+PFGhpTFqxf0eH/Ler6QJhx8Uy/lg+e7agUozKAXEUsYIPO3vfLcy7iGQEUf
# T/k5mNM7629ppFwBLrFm6aa43Abero1i/kQngqkDw/7mJguTSXHlOG1O/oBcZ3e1
# 1W9mZJRru4hJaNjR9H4hwebFHsnglrgJlflLnq7MMb1qWkKnxAVHfWAr2aFdvftW
# k+8b/HL53z4y/d0qLDJG2l5jvNC4y0wQNfxQX6xDRHz+hERQtIwqPXQM9HqLckvg
# VrUTtmPpP05JI+cGFvAlqwH4KEHmx9RkO12rAgMBAAGjggNDMIIDPzAOBgNVHQ8B
# Af8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMwggHDBgNVHSAEggG6MIIBtjCC
# AbIGCGCGSAGG/WwDMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2Vy
# dC5jb20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6C
# AVIAQQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBp
# AGMAYQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABh
# AG4AYwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBD
# AFAAUwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5
# ACAAQQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABs
# AGkAYQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABv
# AHIAYQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBj
# AGUALjASBgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
# Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5k
# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQW
# BBR7aM4pqsAXvkl64eU/1qf3RY81MjAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
# pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAe3IdZP+IyDrBt+nnqcSHu9uUkteQ
# WTP6K4feqFuAJT8Tj5uDG3xDxOaM3zk+wxXssNo7ISV7JMFyXbhHkYETRvqcP2pR
# ON60Jcvwq9/FKAFUeRBGJNE4DyahYZBNur0o5j/xxKqb9to1U0/J8j3TbNwj7aqg
# TWcJ8zqAPTz7NkyQ53ak3fI6v1Y1L6JMZejg1NrRx8iRai0jTzc7GZQY1NWcEDzV
# sRwZ/4/Ia5ue+K6cmZZ40c2cURVbQiZyWo0KSiOSQOiG3iLCkzrUm2im3yl/Brk8
# Dr2fxIacgkdCcTKGCZlyCXlLnXFp9UH/fzl3ZPGEjb6LHrJ9aKOlkLEM/zGCBDQw
# ggQwAgEBMIGDMG8xCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xLjAsBgNVBAMTJURpZ2lDZXJ0IEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBLTECEAQaatuspr5MK1Xv1zNqGvwwCQYF
# Kw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD
# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJ
# KoZIhvcNAQkEMRYEFJwEYzYyC2wCV6Sm5cdwkV4q5j4aMA0GCSqGSIb3DQEBAQUA
# BIIBALpvM4N4pFKqEMZCkZW8Sj2dpdBudB5kxv/PdSv0woN2n/2W+sXZe8tyH4Pq
# Qjy+JYRHP9+i+SgHSX+B4b1HtT73a8JSclUKufhWdXYmG/M5gRgkS0XzvHo9FCjW
# AyHxf5R2OPnHHWUeWsZLr4gFqOEXiraktorb+mJC8WxeORP8Yxr6KGfsc5lqPbvF
# SSgArchgwt5SFt1UkwMuDss4NRunzvzIhi/JoIKuDafvdU6YUBlg63ydBb4UjeOr
# SMCZ7JsB9pQvO96V80xkzgmARpcnX6skZUJaQPllAx0cbqogrfqNv0MHKomXFNsZ
# L+GvhR3MPxPGtdB4avZxonzvsi6hggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQC
# AQEwcjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRp
# b24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0Eg
# LSBHMgIQDs/0OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkD
# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTUwMTIxMjE1MzQ0WjAjBgkq
# hkiG9w0BCQQxFgQUItjNPDtLLJIVdn9SxUlwpCyg3JcwDQYJKoZIhvcNAQEBBQAE
# ggEAdufRXImHpJfjrIv2Qh9hrw2KLa5wE88tl5BFSIvgTlkRcGEyUTaH9rjIidLQ
# 9EXkcpTfdGYOcXI4sl1Qi3n062IqBLJ0zAqN66QwfGR1b/1YBRbJJDI0sSR+3O7i
# RTPMo/x8dzQmZlUPAKgOUXhW+53lTrr63p4a5BNRp+WnCI0LCQgDpBgDnBySrG4g
# qS+s7KrnDhfARxZrNMx8CrZUt8w+PSnDHxNykM9zmM1PwjxVFw25Zi0rWhuTQsCx
# QI3YGrzeK30qzddXjguRb9Vsw3VEQLKuBabnODrnLYod5wt3BulP5icuepD7CM/l
# bFb3t9E/FYKpIgtwl2R6GOCCmQ==
# SIG # End signature block