functions/mainfunctions.ps1

function Install-ProvCC {
    [CmdletBinding(       SupportsPaging = $false,
                   SupportsShouldProcess = $false,
                       PositionalBinding = $false)]
    Param (
        <# [Parameter(Mandatory = $true,
        HelpMessage = 'Select whether you want to create a new Automation account or use an existing account. WARNING: if you select NEW but use an Automation account name that already exists in your subscription, you will not be notified that your account is being updated. The pricing tier for the account will be set to free and any tags on the account will be erased.')
        ]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Complete', 'Incremential')]
        [string]$Mode = 'Incremential',
        #>

        [Parameter(Mandatory = $true,
            HelpMessage = 'The Provance ITSM Cloud Connenctor will be installed into this Automation account. If you want to install to an existing account, make sure the resource group matches and you have entered the correct name. The account name must be between 6 to 50 characters, and can contain only letters, numbers, and hyphens.')
        ]

        [ValidateNotNullOrEmpty()]
        [string]$ApplicationId,

        [ValidateNotNullOrEmpty()]
        [string]$ApplicationKey,

        [ValidatePattern('[0-9a-zA-Z-]{6,50}')]
        [ValidateNotNullOrEmpty()]
        [string]$AAName = "Provance-ITSM-Cloud-Connector",

        [Parameter(Mandatory = $true,
            HelpMessage = 'Specify the SubscriptionId in which this Azure Automation Account shall be installed')
        ]
        [ValidateNotNullOrEmpty()]
        [Guid]$SubscriptionId,

        [Parameter(Mandatory = $true,
            HelpMessage = 'Specify the Resource Group in which this Azure Automation Account shall be installed. If the Resource Group does not exist, it will be created')
        ]
        [ValidateNotNullOrEmpty()]
        [String]$ResourceGroupName,

        [Parameter(Mandatory = $true,
            HelpMessage = 'The Location specifies the region/datacenter where this Automation Account is located. This may impact the synchronization performance.')
        ]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('australiasoutheast', 'brazilsouth', 'centralindia', 'canadacentral', 'eastus', 'eastus2', 'japaneast', 'koreacentral', 'northeurope', 'northcentralus', 'southcentralus', 'southeastasia', 'uksouth', 'westcentralus', 'westeurope','westus2')]
        [string]$Location
    )
    begin {
        Write-Verbose "Checking Prerequisites"
        # Checking Prerequisites
        # Reset Prerequisites check variable
        [bool]$script:prereqsuccessful = $false
        #Write-verbose "Check if logged in to Azure by testing Get-AzureRMContext for SubscriptionId $($subscriptionID.Guid)"
        #Test-ProvCCTenantLogin
        
        try {    
            $contextSubscriptionName = (Get-AzureRmContext).Subscription.Name
            $contextSubscriptionId = (Get-AzureRmContext).Subscription.Id
        }
        catch {
            Write-Error "Could not detect AzureRMContext. You are not loggin to Azure from this session. `n Error: $($_)"
        }
        if (($($subscriptionID.Guid)) -ne $contextSubscriptionId) {
            Write-Error "You are logged in to Subscription $contextSubscriptionName with id $contextSubscriptionId, `n which does not match the subscription id $($subscriptionID.Guid) you specified as parameter. `n ThePowerShell Session of the installer needs to be authenticated to the Subscription where the Provance Cloud Connector shall be installed."
            break
        }
        else {
            Write-Verbose ".Logged on to correct Subscription with id $Subscriptionid"
        
            Write-Verbose "Test if ResourceGroup $resourceGroup exists, if not create"
            # Set PCC Tags
            $PCCTags = @{
                'PCC-DoNotSync' = 'False'
            }
            try {
                Get-AzureRmResourceGroup -Name $ResourceGroupName -ErrorAction Stop|Out-Null
                Set-AzureRmResourcegroup -Name $ResourceGroupName -Tag $PCCTags -ErrorAction Stop|Out-Null
            }
            catch {
                Write-Warning "ResourceGruop $ResourceGroupName did not exists, creating in location $location ..."
                New-AzureRmResourceGroup -Name $ResourceGroupName -Tag $PCCTags -Location $Location |Out-Null
            }

            Write-Verbose "..Prerequisites are met"
            $script:prereqsuccessful = $true
        }
    }
    process {
        try {
            #region Start deployment if Prerequ check was successful
            if ($prereqsuccessful -eq $true) {
                #region Deploy Azure Automation Account
                Write-Verbose ".Installing Provance ITSM Cloud Connector"
                Write-Verbose ".Testing Temp Location for Parameter File"
                if (Test-Path $env:temp) {
                    $pccparam = @{
                        'location'  = $Location
                        'sku'       = 'Basic'
                        'DoNotSync' = 'true'
                    }
                    Write-Verbose "..Customizing ARM Template Parameter File"
                    $armpath = split-path $psScriptRoot -Parent
                    $armparam = get-content $ARMPath\ARMTemplates\AzureAutomationAccountParameters.json|ConvertFrom-Json
                    $armparam.parameters.accountName.value = $AAName
                    $armparam.parameters.location.value = [string]$pccparam.location
                    $armparam.parameters.sku.value = [string]$pccparam.sku
                    $armparam.parameters.doNotSync.value = [string]$pccparam.DoNotSync
                    $armparam|convertto-JSON|set-content $env:temp\Paramfile.json -Force
                }
                else {
                    Write-Error "Could not Create temporary JSON Parameterfile $env:temp\Paramfile.json"
                }
                Write-Verbose "..Deploying Azure Automation Account with Name $($armparam).parameters.accountName"
                $resultPCC = New-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateFile "$armpath\ARMTemplates\AzureAutomationAccount.json" -TemplateParameterFile "$env:temp\Paramfile.json"
                Start-Sleep -Seconds 2
                "Azure Automation Account: $($resultpcc.Parameters.Values.value[0]) created"
                #endregion
                #region Module injection
                Write-Verbose '..Installing Modules into Azure Automation Accounts'
                foreach ($ConnectorModule in $ConnectorModules) {
                    $ModuleUri = Get-ProvCCGalleryModuleUri $ConnectorModule
                    Write-Verbose "...injecting Module $ConnectorModule into AutomationAccount $AAName"
                    $resultmodule = New-AzureRmAutomationModule -ResourceGroupName $ResourceGroupName -AutomationAccountName $AAName -Name $ConnectorModule -ContentLinkUri $ModuleUri
                    "PowerShell Gallery Module: $($resultmodule.Name) installed in Azure Automation Account $AAName"                
                }
                #endregion
                #region Create Schedules
                Write-Verbose "..creating Schedules into AutomationAccount $AAName"
                $ScheduleParamValues = 'AzureSubscriptionDefault-06:00', 'AzureComputeDefault-07:00', 'AzureServiceMapDefault-08:00'
                foreach ($ScheduleParamValue in $ScheduleParamValues) {
                    # Split Param Values to Name and start time
                    [string]$scheduleName = ($ScheduleParamValue -split '-')[0]
                    [string]$starttime = ($ScheduleParamValue -split '-')[1]
                
                    #Create param has table
                    $scheduleparam = @{
                        'ResourceGroupName'     = $ResourceGroupName
                        'AutomationAccountName' = $AAName
                        'Name'                  = $scheduleName
                        'StartTime'             = (Get-Date "$starttime").AddDays('1') 
                        'HourInterval'          = '4'
                        'Description'           = 'Created by Provance PCC Setup Script'    
                    }
                    #$scheduleparam.Starttime
                    $schedule = New-AzureRmAutomationSchedule @scheduleparam
                    Write-Verbose "Schedule: $($schedule.Name) created"
                }
                Write-Verbose -Message "Creating Schedule for PCC Maintenance"
                $maintscheduleparam = @{
                    'ResourceGroupName'     = $ResourceGroupName
                    'AutomationAccountName' = $AAName
                    'Name'                  = 'PCCUpdateModules'
                    'StartTime'             = (Get-Date "$starttime").AddDays('1') 
                    'DayInterval'          = '7'
                    'Description'           = 'Created by Provance PCC Setup Script, Schedules Module updates and other relevant connector maintenance'    
                }                
                New-AzureRmAutomationSchedule @maintscheduleparam|out-null
                Write-Verbose "Schedule: $($maintschedule.Name) created"
                #endregion
                #region Create Connection Types
                $ConnectionTypes = 'PCC-Azure-Subscription', 'PCC-Azure-LogAnalyticsWorkspace', 'PCC-Provance-ITSM', 'PCC-Azure-Compute', 'PCC-Azure-AutomationAccount'
                foreach ($ConnectionType in $ConnectionTypes) {
                    Write-Verbose "..creating Provance Cloud Connector Connection Type $ConnectionType"
                    $Conn = New-ProvCCConnectionType -AuthContext $token -SubscriptionId $SubscriptionId -ResourceGroupName $ResourceGroupName -AutomationAccountName $AAName -ConnTypeName $ConnectionType
                    $ConnName = ($Conn.id -split '/')[-1]
                    "ConnectionType: $ConnName created"
                }
                #endregion
                #region Create AzureAutomationAccount connection for self management
                $ThisAutomationaccount = @{
                    ConnectionTypeName    = 'PCC-Azure-AutomationAccount'
                    ConnectionName        = 'ThisAutomationAccount'
                    ResourceGroupName     = $ResourceGroupName
                    AutomationAccountName = $AAName
                    AARGName              = $ResourceGroupName
                    AAName                = $AAName
                    ApplicationId         = $ApplicationId
                    ApplicationKey        = $ApplicationKey
                    TenantId              = $($Token.TenantId)
                    TenantFQDN            = ($usercred.UserName -split '@'|Select-Object -Last 1)
                    SubscriptionId        = $SubscriptionId
                    SubscriptionName      = (Get-AzureRmSubscription -SubscriptionId $subscriptionid -TenantId $TenantId).Name
                }
                Write-verbose "Creating PCC Connection for Azure automation account"
                New-ProvCCConnection @ThisAutomationaccount -ErrorAction SilentlyContinue |Out-Null
                Write-Verbose "Connection: $($ThisAutomationaccount.ConnectionName) created"
                #endregion
                #region Creating Connection for Subscription of the Cloud-Connector
                $ThisSubscription = @{
                    ConnectionTypeName    = 'PCC-Azure-Subscription'
                    ConnectionName        = 'ThisSubscription'
                    AutomationAccountName = $AAName
                    ResourceGroupName     = $ResourceGroupName
                    ApplicationId         = $ApplicationId
                    ApplicationKey        = $ApplicationKey
                    TenantId              = $($Token.TenantId)
                    TenantName            = ($usercred.UserName -split '@'|Select-Object -Last 1)
                    TenantFQDN            = ($usercred.UserName -split '@'|Select-Object -Last 1)
                    SubscriptionId        = $SubscriptionId
                    SubscriptionName      = (Get-AzureRmSubscription -SubscriptionId $subscriptionid -TenantId $TenantId).Name
                }
                Write-verbose "Creating PCC Connection for current subscription"
                New-ProvCCConnection @ThisSubscription -ErrorAction SilentlyContinue |Out-Null
                Write-Verbose "Connection: $($ThisSubscription.ConnectionName) created"

                #endregion
                #region Creating runbooks
                write-verbose "..Importing Runbooks"
                $runBookPathroot = split-path $psScriptRoot -Parent
                $runbookpath = "$runbookpathroot" + "\runbooks"
                $runbooks = Get-Childitem -Path $runbookPath|select-object -ExpandProperty Name

                foreach ($runbook in $runbooks) {
                    $runbookparam = @{
                        'Name'                  = $runbook.Split('.')[0]
                        'ResourceGroupName'     = $ResourceGroupName 
                        'AutomationAccountName' = $AAName 
                        'Description'           = 'Created by Provance Cloud Connector Setup Script with New-ProvCC'
                        'LogProgress'           = $true
                        'Type'                  = 'PowerShell'
                        'Path'                  = "$runbookpath" + "\" + "$runbook"
                        'Published'             = $true
                    }
                    $importrunbook = Import-AzureRmAutomationRunbook @runbookparam
                    "Imported Runbook: $($importrunbook.Name)"
                }
                #endregion

                #region Create Maintenance Job
                $maintparam = @{
                    ResourceGroupName     = $ResourcegroupName
                    AutomationAccountName = $AAName
                }
                $Registermaintenance = @{
                    ResourceGroupName     = $ResourcegroupName
                    AutomationAccountName = $AAName
                    RunbookName           = 'Update-ProvCCModules'
                    ScheduleName          = $($Maintscheduleparam.Name)
                    parameters            = $maintparam
                }
                $Maintjob = Register-AzureRmAutomationScheduledRunbook @Registermaintenance
                Write-Verbose "Maintenance Job for runbook $($Maintjob.runbook) created"
                #endregion
                
                #region Create AzureRunAsAccount - Needed for updating Modules
                "!! IMPORTANT: Go to the just created Azure Automation Accoun in the Azure Portal and Click on --Create RunAsAccount--"
                "This enables the Auto-Update Feature of the Cloud Connector PowerShell Modules"
                #endregion
            }
            else {
                Write-Error 'Prerequisites are not met, see host-process log above for details or try using the -Verbose switch for more info.'
            }
        }
        catch {
            Write-Error "Could not deploy Provance ITSM Cloud Connector. `n Error: $_"
        }
    }
    end {
    }
}
function Get-ProvCCJobForecast {
    [CmdletBinding(     SupportsPaging = $false,
        SupportsShouldProcess = $false,
        PositionalBinding = $false)]

    [OutputType('Provance.Azure.PCC.JobForecast')]
    
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$RunbookName,
        
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ResourceGroupName,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$AutomationAccountName
    )

    try {
        #Test-PCCTenantLogin
        Write-Verbose -Message "Find the runbook and get its status"
        $RB = Get-AzureRmAutomationRunbook -Name $RunbookName -ResourceGroupName $ResourceGroupName -AutomationAccountName $AutomationAccountName

        if ($RB.State -ne 'Published') {
            Write-Warning -message "Runbook $RunbookName is not in `'Published`' state. Forecast stopped!"
        }
        else {
            Write-Verbose -Message "Find out if there are schedules linked"
            $TempSchedRBs = Get-AzureRmAutomationScheduledRunbook -Name $RB.Name -ResourceGroupName $ResourceGroupName -AutomationAccountName $AutomationAccountName

            Write-Verbose -Message "Find out if none of the schedules is enabled"
            Foreach ($TempSchedRB in $TempSchedRBs) {
                if ((Get-AzureRmAutomationSchedule -Name $TempSchedRB.ScheduleName -ResourceGroupName $ResourceGroupName -AutomationAccountName $AutomationAccountName).Isenabled -eq 'True') {
                    $AllStatus += 1
                }
            }

            if ($TempSchedRBs -eq $null) {
                Write-Warning -message "Runbook $RunbookName does not have any schedules linked to it. Forecast stopped!"
            } 
            elseif ($Allstatus -eq $null) {
                Write-Warning -Message "Runbook $RunbookName does not have any enabled schedules linked to it. Forecast stopped!"
            } 
            else {        
                Write-Verbose -Message "Runbook exists, is published and schedules are enabled"
                # Get JobIds
                Foreach ($TempSchedRB in $TempSchedRBs) {
                    [String[]]$JobIds += $TempSchedRB.JobScheduleId
                }
                Write-Verbose -Message "Find Scheduled Runbooks plus parameters"
                Foreach ($JobID in $JobIDs) {
                    $SchedRB = Get-AzureRmAutomationScheduledRunbook -JobScheduleId $JobId -ResourceGroupName $ResourceGroupName -AutomationAccountName $AutomationAccountName
                    $SchedRBs = [Array]$SchedRBs + $SchedRB
                    Write-Verbose -Message "Using JobID $JobId with Runbook $($SchedRB.RunbookName)"   
            
                    Write-Verbose -Message "Find Schedule Details"
                    foreach ($SchedRB in $SchedRBs) {
                        $Schedule = Get-AzurermAutomationSchedule -Name $SchedRB.ScheduleName -ResourceGroupName $ResourceGroupName -AutomationAccountName $AutomationAccountName
                    }
                    Write-Verbose "Prepare output depending on Connection Type"
                    switch ($runbookName) {
                        'Sync-AzureSubscriptionRunbook' {
                            $sourceConn = $($SchedRB.Parameters.SubscriptionConnArray)
                        }
                        'Sync-AzureComputeRunbook' {
                            $sourceConn = $($SchedRB.Parameters.ComputeConnArray)
                        }
                        'Sync-AzureOMSRunbook' {
                            $sourceConn = $($SchedRB.Parameters.OMSConnArray)
                        }
                    }
                    Write-Verbose -Message "Collect output"
                    $JobForecasthash = [ordered]@{
                        RunbookName    = $($SchedRB.RunbookName);
                        Source         = $SourceConn;
                        Target         = $($SchedRB.Parameters.ITSMConn);
                        ScheduleName   = $($SchedRB.ScheduleName);
                        ScheduleActive = If ($Schedule.IsEnabled) {"Y"} else {"N"};
                        NextRunTime    = Get-Date $Schedule.Nextrun.Ticks;
                        ExpiryTime     = if ($schedule.ExpiryTime.Year -eq '9999') {"Never"} else {Get-Date $Schedule.ExpiryTime.Ticks};
                        Timezone       = $Schedule.Timezone;
                    }
                    $Jobforecast = New-Object -TypeName psobject -Property $JobForecasthash
                    $JobForecast.PSObject.TypeNames.Insert(0, 'Provance.Azure.PCC.JobForecast')
                    write-verbose -Message "Found an upcoming Job with Schedule $Schedule.Name at $Schedule.Nextruntime"
                    $JobForecasts = [Array]$JobForecasts + $JobForecast
                }
            } 
            Write-Verbose -Message "Send output to console"
            $output = $JobForecasts|Sort-Object -Property 'NextRunTime'
            return $output
        }
    }
    catch {
        Write-Error -Message "Unable to get the Runbook Schedules `n Error: $($_)" -ErrorAction Stop
    }
}
function New-ProvCCConnection {
    [CmdletBinding(  SupportsPaging = $false,
              SupportsShouldProcess = $false)]
    [OutputType('Provance.Azure.PCC.Connection')]
    param(
        
        [parameter(mandatory = $true, Position = 0)]
        [ValidateSet('PCC-Provance-ITSM', 'PCC-Azure-Compute', 'PCC-Azure-LogAnalyticsWorkspace', 'PCC-Azure-Subscription', 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$ConnectionTypeName,
        
        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ConnectionName,
    
        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ResourcegroupName,

        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$AutomationAccountName,
        
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Compute')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$ApplicationId,
    
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Compute')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$ApplicationKey,
    
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription' )]
        [ValidateNotNullOrEmpty()]
        [String]$TenantName,
    
        [parameter(mandatory = $true)]
        [String]$TenantId,
    
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription' )]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount')]
        [String]$TenantFQDN,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription' )]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$SubscriptionName,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Compute')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace')]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-Subscription' )]
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$SubscriptionId,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Provance-ITSM' )]
        [ValidateNotNullOrEmpty()]
        [String]$UserName,
        
        [parameter(mandatory = $true, parameterSetName = 'PCC-Provance-ITSM' )]
        [ValidateNotNullOrEmpty()]
        [String]$InstanceURL,
        
        [parameter(mandatory = $true, parameterSetName = 'PCC-Provance-ITSM' )]
        [ValidateNotNullOrEmpty()]
        [SecureString]$Password,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount' )]
        [ValidateNotNullOrEmpty()]
        [String]$AARGName,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-AutomationAccount' )]
        [ValidateNotNullOrEmpty()]
        [String]$AAName,
        
        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace' )]
        [ValidateNotNullOrEmpty()]
        [String]$OMSRGName,

        [parameter(mandatory = $true, parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace' )]
        [ValidateNotNullOrEmpty()]   
        [String]$OmsWorkspace,
        
        [parameter(parameterSetName = 'PCC-Provance-ITSM')]
        [parameter(parameterSetName = 'PCC-Azure-Subscription')]
        [parameter(parameterSetName = 'PCC-Azure-LogAnalyticsWorkspace' )]
        [parameter(parameterSetName = 'PCC-Azure-AutomationAccount')]
        [ValidateNotNullOrEmpty()]
        [String]$APIVersion,

        [parameter(parameterSetName = 'PCC-Azure-Compute')]
        [ValidateNotNullOrEmpty()]
        [String]$APIVersionARMVM = '2017-12-01',

        [parameter(parameterSetName = 'PCC-Azure-Compute')]
        [ValidateNotNullOrEmpty()]
        [String]$APIVersionClassicVM = '2016-04-01'
    )
    try {
        #Test-ProvCCTenantLogin
        # Insert testing if this connection exists already

        Write-Verbose "Creating Connection Type $($PSCmdlet.ParameterSetName)"
        Switch ($ConnectionTypeName) {
            'PCC-Azure-AutomationAccount' {
                $ConnectionFieldData = @{
                    ApplicationId    = $ApplicationId
                    ApplicationKey   = $ApplicationKey
                    TenantId         = $TenantId
                    TenantFQDN       = $TenantFQDN
                    SubscriptionId   = $SubscriptionId
                    SubscriptionName = $SubscriptionName
                    AARGName         = $AAName
                    AAName           = $AARGName
                    APIVersion       = if (!($ApiVersion)) {'2015-10-31'} else {$ApiVersion}
                }
            }
            'PCC-Azure-Subscription' {
                $ConnectionFieldData = @{
                    ApplicationId    = $ApplicationId
                    ApplicationKey   = $ApplicationKey
                    TenantId         = $TenantId
                    TenantName       = $TenantName
                    TenantFQDN       = $TenantFQDN
                    SubscriptionId   = $SubscriptionId
                    SubscriptionName = $SubscriptionName
                    APIVersion       = if (!($ApiVersion)) {'2014-04-01'} else {$ApiVersion}
                }
            }
            'PCC-Azure-Compute' {
                $ConnectionFieldData = @{
                    ApplicationId       = $ApplicationId
                    ApplicationKey      = $ApplicationKey
                    TenantId            = $TenantId
                    SubscriptionId      = $Subscriptionid
                    APIVersionARMVM     = if (!($ApiVersionARMVM)) {'2017-12-01'} else {$ApiVersionARMVM}
                    APIVersionClassicVM = if (!($ApiVersionClassicVM)) {'2016-04-01'} else {$ApiVersionClassicVM}
                }
            }
            'PCC-Provance-ITSM' {
                $ConnectionFieldData = @{
                    ApplicationId = '1950a258-227b-4e31-a9cf-717495945fc2'
                    TenantId      = $TenantId
                    InstanceURL   = $InstanceURL
                    UserName      = $UserName
                    Password      = $Password
                    APIVersion    = if (!($ApiVersion)) {'v9.0'} else {$ApiVersion}
                }
            }
            'PCC-Azure-LogAnalyticsWorkspace' {
                $ConnectionFieldData = @{
                    ApplicationId  = $ApplicationId
                    ApplicationKey = $ApplicationKey
                    TenantId       = $TenantId
                    SubscriptionId = $Subscriptionid
                    OMSRGName      = $OMSRGName
                    OMSWorkspace   = $OMSWorkspace
                    APIVersion     = if (!($ApiVersion)) {'2015-11-01-preview'} else {$ApiVersion}
                }
            }
        }

        $Connectionparam = @{
            'Name'                  = $ConnectionName
            'ResourceGroupName'     = $ResourceGroupName
            'AutomationAccountName' = $AutomationAccountName
            'ConnectionTypeName'    = $($PSCmdlet.ParameterSetName)
            'ConnectionFieldValues' = $ConnectionFieldData
            'Description'           = 'Created with New-PCCConnection function from the Provance.PCCSetup Module'
        }
        New-AzureRmAutomationConnection @Connectionparam
    }
    catch {
        Write-Verbose -Message "StatusCode: $_.Exception.Response.StatusCode.value__"
        Write-Verbose -Message "StatusDescription: $_.Exception.Response.StatusDescription"
        Write-Error -Message "Unable to create new connection type `n Error: $($_)" -ErrorAction Stop
    }
}
function New-ProvCCJob {
    [CmdletBinding(SupportsPaging = $false,
            SupportsShouldProcess = $false,
                PositionalBinding = $false)]
    [OutputType('Provance.Azure.PCC.Job')]
    param(
        
        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$AutomationAccountName,
    
        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$RunbookName,

        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ResourcegroupName,

        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ScheduleName,

        [ValidateSet('PCC-Azure-Subscription', 'PCC-Azure-Compute', 'PCC-Azure-LogAnalyticsWorkspace')]
        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$SourceConnectionTypeName,

        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$SourceConnectionName,

        [parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$TargetConnectionName
        
    )
    try {
        Write-Verbose "Constructing Parameters ..."
        switch ($sourceConnectionTypeName) {
            'PCC-Azure-Subscription' {
                $RBParams = @{
                    SubscriptionConnArray = $SourceConnectionName
                    ITSMConn              = $TargetConnectionName
                }
            }
            'PCC-Azure-Compute' {
                $RBParams = @{
                    ComputeConnArray = $SourceConnectionName
                    ITSMConn         = $TargetConnectionName
                }
            }
            'PCC-Azure-LogAnalyticsWorkspace' {
                $RBParams = @{
                    OMSConnArray = $SourceConnectionName
                    ITSMConn     = $TargetConnectionName
                }
            }
        }
        $JobParam = @{
            ResourceGroupName     = $ResourcegroupName
            AutomationAccountName = $AutomationAccountName
            RunbookName           = $RunbookName
            ScheduleName          = $ScheduleName
            Parameters            = $RBParams
        }
        Write-Verbose "Creating Provance ITSM Cloud Connector Job for Runbook $runbookName with Schedule $ScheduleName with Source $SourceConnectionName and target $TargetConnectionName"
        Register-AzureRmAutomationScheduledRunbook @JobParam
        
    }
    catch {
        Write-Error "Job Creation failed: Error $($_)"
    }
}


# SIG # Begin signature block
# MIIaBQYJKoZIhvcNAQcCoIIZ9jCCGfICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQsOkUVMvbhsJZHAXa6ufq2jS
# kfmgghSZMIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE
# BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
# BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx
# MDUwMzA3MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw
# EQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEt
# MCsGA1UECxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMw
# MQYDVQQDEypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0g
# RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYusw
# ZLiBCGzDBNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz
# 6ojcnqOvK/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am
# +GZHY23ecSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1g
# O7GyQ5HYpDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQW
# OlDxSq7neTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB
# 0lL7AgMBAAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
# BjAdBgNVHQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqF
# BxBnKLbv9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDov
# L2NybC5nb2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0g
# ADAzMDEGCCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9z
# aXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyI
# BslQj6Zz91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwl
# TxFWMMS2RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKo
# cyQetawiDsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1
# KrKQ0U11GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkK
# rqeKM+2xLXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDABMIIFADCC
# A+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNV
# BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJm
# aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx
# MDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw
# EQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9n
# aWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxkdGVjaC5j
# b20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuFpDS1FuXL
# zOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE3ZNWjKRM
# XpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlVBv8KJAV+
# L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+MB5FcSM1
# /5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYXv32JgIBE
# Q+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMBAf8EBTAD
# AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+zWrZtj2z
# ZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYBBQUHAQEE
# LjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbS8w
# OwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9z
# ZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUFBwIBFito
# dHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMA0GCSqG
# SIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pNQdvBE+zc
# MQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0rjpf5Mqt
# JsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjOeT2pkb9U
# GBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQsPTIFwwK
# lhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ7nIMpBKG
# gc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7MIIFPDCCBCSgAwIBAgIJALbL
# wjYBUl1HMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
# QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
# b20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv
# c2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1
# dGhvcml0eSAtIEcyMB4XDTE3MTIxMTIwMzEwMVoXDTE4MDkwNjE1NDIwMFowfTEL
# MAkGA1UEBhMCQ0ExDzANBgNVBAgTBlF1ZWJlYzERMA8GA1UEBxMIR2F0aW5lYXUx
# JDAiBgNVBAoTG1Byb3ZhbmNlIFRlY2hub2xvZ2llcywgSW5jLjEkMCIGA1UEAxMb
# UHJvdmFuY2UgVGVjaG5vbG9naWVzLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOC
# AQ8AMIIBCgKCAQEAzv3zfbU437wH1fLprlbIGBtCLjMKf2XSIWgPIpymOhJeQP07
# H/dGlg8fy4vUJpWS3jwAAAiQfycR8IyCpGTZf1XiPLsdnw4WIwbaYYe6LylA8xhv
# 8d8Hassqp2LCZbBhm9ueLySqPM+DykABQOFPYbJVj/WDwd8/KaBCGZw0FXsl+AuB
# HeiZ89pjz4oFX+BXrM5/rvVHZuYD6W+UesxxibNrmuMf3JFzfh2Ttr+orMRRCCSt
# v0N87EAOkjZ52fIbsKptMHRaywZO1qGIWFlBSTBcCktMlKjVpbZkVCrY81eMhkzb
# +nOTpvAaUFNEESekdMveZA8XJoYQ3XoFXU8vjwIDAQABo4IBhTCCAYEwDAYDVR0T
# AQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwNQYD
# VR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5nb2RhZGR5LmNvbS9nZGlnMnM1LTMu
# Y3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwIwOTA3BggrBgEFBQcCARYraHR0
# cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwB
# BAEwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2Rh
# ZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRk
# eS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMw
# ojPX+2yz8LQsgM4wHQYDVR0OBBYEFOwFSw0KFV9Bs1UypkhJ4XNI/N9JMA0GCSqG
# SIb3DQEBCwUAA4IBAQASYv3417VLTHaQ/stRoHy/s4SSSovygnp2luUUChTuXQ9z
# SJxzrXwmNbdVZV1X1LrDWHhxTztwOPwDbV6TNSwKhBMTTSZQ9gJCbfQ/gwaqhvbG
# 3pFN62FcUHZ0B6xfWTqcxQ+eMLdAzbt52HMkLAGfaFKRiIllM079bxTZ6QiSNHQ5
# 76gDm0V16n3zvPFKA7wJyaWAQY2//UPrBP3B1zxElgock21I6OiLLIe7vBvLvvXw
# QuJe/QM+p4sr6OTJGI4OsLI9N4dLpC0gmbz1QCPIvkOQOFsB14bLiqzABSJEkvc8
# C+lF7ABlmdTLnsx+yePeC3Ka9+rKEGyetKKpFFCgMIIFfTCCBGWgAwIBAgIJAO+V
# wvSA4xuTMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
# QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxk
# IFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0YXJm
# aWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQgU2Vj
# dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTE3MTExNDA3MDAwMFoX
# DTIyMTExNDA3MDAwMFowgYcxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h
# MRMwEQYDVQQHEwpTY290dHNkYWxlMSQwIgYDVQQKExtTdGFyZmllbGQgVGVjaG5v
# bG9naWVzLCBMTEMxKzApBgNVBAMTIlN0YXJmaWVsZCBUaW1lc3RhbXAgQXV0aG9y
# aXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDm730Ku3SP
# yEahtiafyThSMSvGVFw6JhBrYkQYOcH10SjiERRWLn3DD51isWZDIrkxmTdy/zEt
# 2m0qf2odGk7KRPeO7OMlEbeGS4Cc11H7OvxG6VSADFbYTkrgGREeDgFxPA8WzeaJ
# YFVwJq7kcoFSGN797hHOoYsd/GkD/iqnEjNfYRUcKdaH9b/Yzjwjte6uba5Iepls
# Nx0eXWU+zy7bff21Qb1HQ0P0VTuYCbviRJknhKOZKSGuNhQ9CFDzMQbcbsbyx3+o
# v/iMaIGp7NHNlk/4hR1rFFmMwPRT/m123J8xGpoYBPPMOHyk15bF/1laR3kAr3fh
# bj0OQoUOUFIBAgMBAAGjggGpMIIBpTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE
# AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAdBgNVHQ4EFgQUnc8cgP4K1qL8
# WBg+p9NUQO7WFGEwHwYDVR0jBBgwFoAUJUWBaFAmOD07LSy+zWrZtj2zZmMwgYQG
# CCsGAQUFBwEBBHgwdjAqBggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxk
# dGVjaC5jb20vMEgGCCsGAQUFBzAChjxodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2gu
# Y29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZ19jYS1nMi5jcnQwVAYDVR0fBE0wSzBJ
# oEegRYZDaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L21h
# c3RlcnN0YXJmaWVsZDJpc3N1aW5nLmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4B
# BxcCMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20v
# cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAFJGgfPKVmOa5BUYGkgzgZUH
# APDVCxA0oDWH0E5+lQB0DlDHgv5G6O4Ju2dqL9TAJfhRAS0i+PaXwLOWbz/yxZc9
# jpCNDbVWIRIZdxzXvR7dOSvRPgWFxW1Msip51ys9TQV2ybVAyA+CjVwuNOALYWrT
# 2ZhQBEp47lbsLRag4VwYpydVkbfKa4Egad+0V0SHQrWxwnMaj/7PT+b8WilhTxTR
# XNWlxRlQ+9wla5Sqwn5PwafeJwv6eGS6nKC00cRPDQ6WDCo46VhOjkmv50J+o93p
# 9LM2hkFuoRMrR5O3D8Zcg1jbab4rTDT+f+Wn5eYn9PwbYB7e4WMjRafylm5E3Hox
# ggTWMIIE0gIBATCBwjCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmEx
# EzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
# MS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8x
# MzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg
# LSBHMgIJALbLwjYBUl1HMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKAC
# gAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx
# DjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQfnvds13aslhL6ADAwefuS
# LJhhJzANBgkqhkiG9w0BAQEFAASCAQB/1eXpCLccf6J6UDUg7T4bOlLxY5gVdklE
# W9LElrewcxrYds2CkRu5cpM5AUZGn66+p9HhaJG+i+WLF5fMeJkiQbA5OMXzDgWS
# 9Zb197wHRAeSFXd3qTH9lYXqdSNKZUir7vaUNY2eJMFqqBN2BWiCagbqUBG88gVk
# bg4jUMEhdMf0u1mvVCnmSFq3+UUVIMoXXSTdz2uPWXliy0Gy9QtlblyNTr7BORdV
# CPg/9Y5pm0gWBch8o+ekgFXf/nQ0+CHmsIszvXsLflDB+qN1UxJwZqxpwPjaXULR
# yJOpkW4ivvWh9++UroxIyztdas1zNQK/dnyNK+wa/PX3rkwUmJpKoYICbjCCAmoG
# CSqGSIb3DQEJBjGCAlswggJXAgEBMIHUMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UE
# CBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZp
# ZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0
# YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQg
# U2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyAgkA75XC9IDjG5MwCQYF
# Kw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF
# MQ8XDTE4MDUyMDEzNTg1NFowIwYJKoZIhvcNAQkEMRYEFN8wZ+Za/wYwxtOraP2u
# ClLIZcKLMA0GCSqGSIb3DQEBAQUABIIBAN07LO8GVdpkorFNrZaBcSPZYWkDQYmN
# R+4MDlbp0D5SHY+VBmD7K1AHgQYI0cWvbkqDdAfJfX9sntoZ3mhqjT06D8JyQuX2
# r0rnUMtejrUaalpigcrrKVSdNf9QJmej3LpKtopKX+YDW+0zXiHGtpCr7MEUP44i
# hVB2G1yu7kkUUndDtJYNW36/dpSNf74scAoebSttOx9DarNRH3Uq41gYchMcBKH0
# qIuuN8UGpc5W1qxqlYbmk+bK+y06rv5huOFi8nib+NMcPbyFYP0iJYdIcROa6C2j
# ox1WgZRSUyi4B8/SYFCtZ0XdnWt+5I6hhXgp4PQ/Y8+hcOvDSb63QFc=
# SIG # End signature block