ApexSQL DevOps toolkit - Sync

Octopus.Script exported 2020-08-20 by ApexSQLtechops belongs to ‘ApexSQL’ category.

The step will compare the database from a deployment package with the target database to create a schema synchronization script deployment resource

ApexSQL Diff is required

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Retrieve package from

PackageDownloadStepName =

Select the step from which the database package can be sourced

Export location

ExportPath =

The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step.

SQL Server

ServerName =

Provide the SQL Server name for the deployment target database

Database

Database =

Provide the name of the target database which will be used for comparison with source schema located in the deployment package in order to generate deployment resource.

Username

Username =

The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty

Password

Password =

Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used

Project file path

ProjectFilePath =

Use to import schema comparison options and objects filter template created with ApexSQL Diff. Application defaults will be used if not provided

See also: How to narrow schema comparison and synchronization to affected objects only

Additional parameters

Additional =

Enter any CLI options switches used with ApexSQL Diff. Options will override existing options imported from project file

See also: ApexSQL Diff Command Line Interface (CLI) switches

Script body

Steps based on this template will execute the following PowerShell script.

function Get-ApexSQLToolLocation
{
    param
    (
        [Parameter(Mandatory = $true)]
        [String] $ApplicationName
    )
    $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ApexSQL $($ApplicationName)_is1"
    if (Test-Path "HKLM:\$Key")
    {
		$ApplicationPath = (Get-ItemProperty -Path "HKLM:\$key" -Name InstallLocation).InstallLocation
	}
    else
    {
		$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)

		$regKey= $reg.OpenSubKey("$key")
		if ($regKey)
        {
			$ApplicationPath = $regKey.GetValue("InstallLocation")
		}
        else
        {
			$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)
			$regKey= $reg.OpenSubKey("$key")
			if ($regKey)
            {
				$ApplicationPath = $regKey.GetValue("InstallLocation")
			}
            else
            {
                return $null
			}
		}
	}
    if ($ApplicationPath)
    {
        return $ApplicationPath + "ApexSQL" + $ApplicationName.replace(' ','') + ".com"
    }
}

function AddArtifact() {
    Param(
        [Parameter(Mandatory = $true)]
        [string]$artifact
    )
    if (Test-Path $artifact) {
        New-OctopusArtifact $artifact
    }
}

function Get-ParamValue
{
    param
    (
        [Parameter(Mandatory = $true)]
        [String] $ParamName
    )
    if($OctopusParameters -and ($OctopusParameters["$($ParamName)"] -ne $null))
    {
        # set the variable value
        return $OctopusParameters["$($ParamName)"]
    }
    else
    {
        # warning
        return $null
    }
}

$exportPath = Get-ParamValue -ParamName 'ExportPath'
$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'
$s2 = Get-ParamValue -ParamName 'ServerName'
$d2 = Get-ParamValue -ParamName 'Database'
$u2 = Get-ParamValue -ParamName 'Username'
$p2 = Get-ParamValue -ParamName 'Password'
$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'
$additional = Get-ParamValue -ParamName 'Additional'

$projectId = $OctopusParameters["Octopus.Project.Id"]
$releaseNumber = $OctopusParameters["Octopus.Release.Number"]
$nugetPackageId = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId"]
$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber

if (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }

$FolderList = Get-ChildItem $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] -Directory

Foreach($f in $Folderlist){
if ($f.Name -like '*Script*')
	{
 		$DatabaseScripts = $f.Name
 	}
}

$sfPath = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] + '\' + $DatabaseScripts

if($null -eq $sfPath) {
    throw "Step: '$PackageDownloadStepName' didn't download any NuGet package."
}

$schemaSyncScript = "SchemaSyncScript.sql"
$schemaSyncSummary = "SchemaSyncSummary.log"
$schemaSyncReport = "SchemaSyncReport.html"


$creds2 = ''
if ($u2 -ne $null -and $p2 -ne $null)
{
    $creds2 = "/user2:`"$($u2)`" /password2:`"$($p2)`""
}

$project = ''
if($projectFilePath -ne $null)
{
    $project = "/project: `"$($projectFilePath)`""
}

$additionalParams = ''
if($additional -ne $null)
{
    $additionalParams = $additional
}


$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Diff'
$toolParams = " /sf1:`"$($sfPath)`" /server2:`"$($s2)`" /database2:`"$($d2)`" $($creds2)"
$toolParams += " /ot:sql /on:`'$($exportPath)\$($schemaSyncScript)`'"
$toolParams += " /ot2:html /on2:`"$($exportPath)\$($schemaSyncReport)`""
$toolParams += " /cso:`"$($exportPath)\$($schemaSyncSummary)`""
$toolParams += " $($project)"
$toolParams += " $($additionalParams) /v /f"

Invoke-Expression -Command ("& `"$($toolLocation)`" $toolParams")

AddArtifact("$exportPath\$schemaSyncScript")
AddArtifact("$exportPath\$schemaSyncSummary")
AddArtifact("$exportPath\$schemaSyncReport")

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "3dfd5df3-2e9f-412b-93be-dcf4ef2d3da7",
  "Name": "ApexSQL DevOps toolkit - Sync",
  "Description": "The step will compare the database from a deployment package with the target database to create a schema synchronization script deployment resource\n\n[ApexSQL Diff](https://www.apexsql.com/sql-tools-diff.aspx) is required",
  "Version": 2,
  "ExportedAt": "2020-08-20T11:40:28.179Z",
  "ActionType": "Octopus.Script",
  "Author": "ApexSQLtechops",
  "Packages": [],
  "Parameters": [
    {
      "Id": "86778bfc-aab9-42ea-b67b-ee0c0fe1c203",
      "Name": "PackageDownloadStepName",
      "Label": "Retrieve package from",
      "HelpText": "Select the step from which the database package can be sourced",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "StepName"
      }
    },
    {
      "Id": "fd75e328-92da-4e88-bb1c-35504fdccf15",
      "Name": "ExportPath",
      "Label": "Export location",
      "HelpText": "The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step. ",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "a487d044-8a82-4065-bb1d-d7ccb5a65468",
      "Name": "ServerName",
      "Label": "SQL Server",
      "HelpText": "Provide the SQL Server name for the deployment target database",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "dca94a19-8d97-49b5-a4e5-21f32781df32",
      "Name": "Database",
      "Label": "Database",
      "HelpText": "Provide the name of the target database which will be used for comparison with source schema located in the deployment package in order to generate deployment resource. ",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "5465f0aa-7b85-4020-99f9-a9f45f7b39b3",
      "Name": "Username",
      "Label": "Username",
      "HelpText": "The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "5396a1bd-5f84-48cd-a452-135aa67a24a4",
      "Name": "Password",
      "Label": "Password",
      "HelpText": "Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "2a296435-ccf6-444d-8cb6-d0606eb1bce8",
      "Name": "ProjectFilePath",
      "Label": "Project file path",
      "HelpText": "Use to import schema comparison options and objects filter template created with ApexSQL Diff. Application defaults will be used if not provided\n\nSee also:\n[How to narrow schema comparison and synchronization to affected objects only](https://knowledgebase.apexsql.com/narrow-schema-comparison-synchronization-affected-objects/)\n",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "e3cfcc10-1e5c-4554-83ca-0d9db66c7848",
      "Name": "Additional",
      "Label": "Additional parameters",
      "HelpText": "Enter any CLI options switches used with ApexSQL Diff. Options will override existing options imported from project file\n\nSee also:\n[ApexSQL Diff Command Line Interface (CLI) switches](https://knowledgebase.apexsql.com/apexsql-diff-command-line-interface-cli-switches/)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "function Get-ApexSQLToolLocation\n{\n    param\n    (\n        [Parameter(Mandatory = $true)]\n        [String] $ApplicationName\n    )\n    $key = \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ApexSQL $($ApplicationName)_is1\"\n    if (Test-Path \"HKLM:\\$Key\")\n    {\n\t\t$ApplicationPath = (Get-ItemProperty -Path \"HKLM:\\$key\" -Name InstallLocation).InstallLocation\n\t}\n    else\n    {\n\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)\n\n\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\tif ($regKey)\n        {\n\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t}\n        else\n        {\n\t\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)\n\t\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\t\tif ($regKey)\n            {\n\t\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t\t}\n            else\n            {\n                return $null\n\t\t\t}\n\t\t}\n\t}\n    if ($ApplicationPath)\n    {\n        return $ApplicationPath + \"ApexSQL\" + $ApplicationName.replace(' ','') + \".com\"\n    }\n}\n\nfunction AddArtifact() {\n    Param(\n        [Parameter(Mandatory = $true)]\n        [string]$artifact\n    )\n    if (Test-Path $artifact) {\n        New-OctopusArtifact $artifact\n    }\n}\n\nfunction Get-ParamValue\n{\n    param\n    (\n        [Parameter(Mandatory = $true)]\n        [String] $ParamName\n    )\n    if($OctopusParameters -and ($OctopusParameters[\"$($ParamName)\"] -ne $null))\n    {\n        # set the variable value\n        return $OctopusParameters[\"$($ParamName)\"]\n    }\n    else\n    {\n        # warning\n        return $null\n    }\n}\n\n$exportPath = Get-ParamValue -ParamName 'ExportPath'\n$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'\n$s2 = Get-ParamValue -ParamName 'ServerName'\n$d2 = Get-ParamValue -ParamName 'Database'\n$u2 = Get-ParamValue -ParamName 'Username'\n$p2 = Get-ParamValue -ParamName 'Password'\n$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'\n$additional = Get-ParamValue -ParamName 'Additional'\n\n$projectId = $OctopusParameters[\"Octopus.Project.Id\"]\n$releaseNumber = $OctopusParameters[\"Octopus.Release.Number\"]\n$nugetPackageId = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId\"]\n$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber\n\nif (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }\n\n$FolderList = Get-ChildItem $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] -Directory\n\nForeach($f in $Folderlist){\nif ($f.Name -like '*Script*')\n\t{\n \t\t$DatabaseScripts = $f.Name\n \t}\n}\n\n$sfPath = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] + '\\' + $DatabaseScripts\n\nif($null -eq $sfPath) {\n    throw \"Step: '$PackageDownloadStepName' didn't download any NuGet package.\"\n}\n\n$schemaSyncScript = \"SchemaSyncScript.sql\"\n$schemaSyncSummary = \"SchemaSyncSummary.log\"\n$schemaSyncReport = \"SchemaSyncReport.html\"\n\n\n$creds2 = ''\nif ($u2 -ne $null -and $p2 -ne $null)\n{\n    $creds2 = \"/user2:`\"$($u2)`\" /password2:`\"$($p2)`\"\"\n}\n\n$project = ''\nif($projectFilePath -ne $null)\n{\n    $project = \"/project: `\"$($projectFilePath)`\"\"\n}\n\n$additionalParams = ''\nif($additional -ne $null)\n{\n    $additionalParams = $additional\n}\n\n\n$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Diff'\n$toolParams = \" /sf1:`\"$($sfPath)`\" /server2:`\"$($s2)`\" /database2:`\"$($d2)`\" $($creds2)\"\n$toolParams += \" /ot:sql /on:`'$($exportPath)\\$($schemaSyncScript)`'\"\n$toolParams += \" /ot2:html /on2:`\"$($exportPath)\\$($schemaSyncReport)`\"\"\n$toolParams += \" /cso:`\"$($exportPath)\\$($schemaSyncSummary)`\"\"\n$toolParams += \" $($project)\"\n$toolParams += \" $($additionalParams) /v /f\"\n\nInvoke-Expression -Command (\"& `\"$($toolLocation)`\" $toolParams\")\n\nAddArtifact(\"$exportPath\\$schemaSyncScript\")\nAddArtifact(\"$exportPath\\$schemaSyncSummary\")\nAddArtifact(\"$exportPath\\$schemaSyncReport\")",
    "Octopus.Action.EnabledFeatures": ""
  },
  "Category": "ApexSQL",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/apexsql-devops-toolkit-sync.json",
  "Website": "/step-templates/3dfd5df3-2e9f-412b-93be-dcf4ef2d3da7",
  "Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAhiklEQVR4nOzdB3hUVfo/8Pece++0dEISkpBCQi8CggQCUgRFQAX1p7isUpSiz/7XdUWWVUCj7oJIEUQRe5aOgIj0ECCQ3suQhBZIb4QkpJBkZu49/2cmoBghpMzMvTNzPs+z+zwKmfsG/Oacc+8572UJIUBR1L1hsQugKCmjAaGoVtCAUFQraEAoqhU0IBTVChoQimoFDQhFtYIGRCKStm8YInYN1J8h+qBQfJ9P8XSzA+WpWzw//e9hedfErof6HR1BRFasjpepQLlKzqFBdhxeVaxerRK7Jup3NCAiK0mPGalg8TwtDyBn2Jmn3/9ktNg1Ub+jARFZ2s5NrwkAWAAALRFAo3F5PXPvXiR2XVQzugYR0ZbJASOUHArXEXC48+8YBLeaEDyz6FDOKXGro4COIOI5uXtVFxkm6wj8Hg49BKBiebI2fvtGD/Gqo+6gARHJhdDQKUoZO4ZvMYDrCICSY4aot69/RqzaqN/RgIggInSdyp7VvdbEC/f89SaeAGaYVxN2feFg9uKoP6ABEUH2nk0vsQiN0d1n+ScQAgxGIzJ2rp8fEhJi7vKou9CAmFnyts8ClAyzXEcI19qtKoEA5gT8L4eijL5mLI9qgQbEzBL3bJzJMaiH8ICbh/q1Cceibk4lKbPMVRv1ZzQgZpSybb27HPDspvvNre6iH10adQKwwMxK2uXS3SwFUn9CA2ImuRGhOGnXF+8yCPVt65MnYggKCkzb2mWl/utNXCJ1D/QP3UzSj54YocBofhsGjz/gCQEZg15Mizg4xlS1UfdHA2ImFZnxsxHG9g9ae7RkGEUwyG8kpi4wVW3U/dGAmMHX032GcBhmaHgBOrLJSsMT4BDz5MZp/sEmKI9qBQ2IicWErlPJNPL/AGDPznwOQairA2LWJOz6jD48NCMaEBO7np3yuIyDybr2zq1a0H89h9DI8tT4p4xWHPVANCAmVpkVt0grAGuMPdM6ArgiM3EBQohuhzcTGhAT2jw1cAYiMJY30pECgRDAGEZ+NcVvbnlmhFE+k2odDYiJJGz/3E2OyHpAyM6YnysQUCoQ89+8tFQfY34udW80ICaScHjVS3KG6cF3cu3REk8AWAZ5pv/46V+M+sHUPdGAmMBPo3yUDnWq1zT32c7eWRqeAKu0e/XLF93tTXIB6jc0IEZWkBKLq53ZxQAwwFSHmUnzWeleXJ39+0XpcZyJLkPRgBhfeVZCf45h3hMAWFNeRwDACga9VZIRN8iU17F1NCBGlvrTpjkcBqWRlx5/ol+LIIQ49e7P55v2SraNBsSIvp3Sq7uCwExNy4PmJoBuH81lMf6/LVP8+pv8gjaKBsRIitPjVCwWVvEA3c3VSAk1Pxtxk2P2o2J1rFFvJ1PNaECMpFQdHyRj0Ms6gZj1Kbd+sJKz+Pndz00Za87r2goaECMIgRBI3b1xgVaEHnz6S2p5Ai69XRfFb/+cMX8F1o12VjSCH6f5BSPEnuAJiPZcgkGg0YLmmQWHC06IVYM1oiNIJ0Vv3eBGAH+GQLxw3CbDhFsXu2N9N5HrsCo0IJ2UsXvTFBXHjmjvUVpj069FlCwecGHPV8+KW4l1oQHphPjtn6tUCL3WoCMghYlqE08A8cK8pO0bnMWuxVrQgHSCesdnLwMmwQIhHTpKa2wCMZxffyRl58aFYtdiLWhAOih5+4ZeLINWCMS0W0raSx8SBYsXfzr/2QFi12INaEA6KHnH53/hGKa7qbeUtJe+HgaQu0uZerbYtVgDGpAOSOzl6iln0KwmnWm2s3dWI0+AI2Tmuum9A8SuxdLRgLRTREQIUvd2eh8h6COxweMPMCA/xyZ+5WX68LBTaEDa6eaRnNEMQrMlOnj8RkcIKDg0/dL5uPFi12LJaEDaqfx8zAKMkErKowfc3oIiAChK1DH0jlYn0IC0w+anfEbIWfKkRmor8/vQCQRYxEzaPLX7OLFrsVQ0IG0Us22jnYJwKwGQu9i1tAdGqIscuE9TdmxwErsWS0QD0kbV5+Oe5Bg8XivxtUdL+lFEzjDDi9Vx9KWgHUAD0kalmQmv84RY3B0hw3Z4QnDF+cRFe19EFle/2GhAHiQiAr6ZEvAiBhhloi4+JmfYggIw7GZdj1dz09KksCvGYtCAPEBiQaoni2EtAuN2SDQ3AUDBIvjPjcyz/mLXYkloQB4gdf+Wv3AM46Oz8INlgqEjI3ZX79r8V7FrsSQ0IK34/M1ecplON09rqXOrFgzb4UE3+7vJA7qIXYuloAG5j+L0OEZxRbcMAbT5pZuWgAAEAtOwojgjQSZ2LZaABuQ+itVxA+WIWSwAktR29s4SADCL0d9L1bFDxa7FEtCA3Efq7o3zGAapBAtfe7Sk/3YwAiZtO+3I2BY0IPfw+RTfQAViXmi0krVHS1oBgGXRjM1TAh4SuxapowFpoVgdr7JH7GqegJc1PzAQCHSVIbQ6bNdqR7FrkTLaF6uFd5/t8uQA3vWYhhck0YjBVPThl7MYyup1z70dfu2A2PVIFR1B7pJ86Bvcs8l5AU+sOxzwW0dGAZzlaAHtyHh/dAS5y1dTAx9TMXBIJ4BK7FrMhQFo0gnkhfnHrh4SuxYpoiPIbQm7vnLngF9DiO2EwwCBnGHIp8mha73ELkWKaEBuS9m2coadjH3YDK/2kBT996tgmL7x+zY/L3YtUkQDYuhxtd5RgWVzmsTuHyqSRp1h2Hw1jnZk/BMaEABI3fnFbAahIFsbPe5oftqDhqh3bvin2LVIjc0HZNvyGX1ZBr+ns8DDUMak/9kgY5j/d/zdhYPFrkVKbD4gjSkZs1kMnhbSh8FkDNvhMepSqA6fK3YtUmLTAXlqu3N3DqOZtrr2aEm/FuEQeu7LqT37iF2LVNhsQCJCN7Azdrl8iAHR9px/gHyViPw3eec3nNiVSIHNBqT6fPwYDjGzLP2koLHxAtFPtZ4pTj/3mNi1SIHNBqQiK24+QqCg8fgj0rwlnitTx74hdi1SYJMB+WKy32iOwU9qbX1lfh/6UZXDMOGbKYFTICJC7HJEZXMBSdq5yUHFMmsRIFexa5E0hBxZRlidWJzqInYpYrK5gJSkxzwjY3AQHT1apxMIyBAzYM/GtTb9UlCbC0hlVsICrSCJVwpKnpYQPNBdOT8EIZv77+QOm/nGcyMiYMvUgJcBYARP71y1iX6QxUCGdp/c42+FGfE2+UPFZgJyozCjO4dgPSFIaZN/0x0kEFAwLP6oODM+UOxaxGAzAcnY88ksOYPd6OjRPjwB4DA4Z+xY94rYtYjBJgIS8rSXChPlXEt58Y3UNPEEWOBeXv14oM29Y8TqA1KYEc95E8X7CKA3HTw6g/RwZcgnJWrb6sho9QEpV8c+JENosc5w/JrqKIEAknFoQXFG7AixazEnqw5ISEgIpO3YNBcjxNLRo3OI4dkhYlJ3bHxN7FrMyaoD4p2wtTfHwEyNrR4VNDL9n6Mc4xlfTfYbJnYt5mK1ASnauMoeA1lLANzErsVaEEKAF3hnBYPWH/9ijU1s1bHagHwR8ek4lYx92tJeuilNCHidFlgQwM7JCTz7Du09eNxYm9gOb1Wt/e/IDQ3FvZq6LGzCdGrVGUQQ9P8HSpUddO0zsMype2Ck/8Tnkp29e+7hXFwbxK7PHKyys+L30wKmMQh+5gmyqVuSxmIIhk4DTi6u4Bc0odq93/BvWa/eod2HBGWJXZu5Wd0IkrLzMy9AsBaAhqOtDD8kiQAMQiC3dwIHT98atz6DT3oPG3fEvd/DiXLHLpm3b2TZHKsLSGLo5zMcVGzfBrr4aBuBBw4BOHl0A87Np2zgM3PCnR8a8YGTk3uO2KVJgVUFJG7nRieOQ3OadM3d2emmxHvjeR3IGAbkdvbg4OZ1wb3/IxleIx472H1IcDJw8oti1yclVhWQrJ0b5zMID9cSQsPREiGGqRQWePDrEQhyz4AL/Z58KUzmGbjOxTcgX+zypMpqApKyY0N/FqF/8YRgGo5md9YWcpkMGLlS69ZzQJ2TX8/9fsPG71T69L3i6OFVAgA6seuUMqsJSNqOTXNkHHLX0iZwzcEQeEC8Dhw9vInKzSsxYOz0vX1nzN2PELomdn2WxCoC8s1Ylx5yxy4vamw5HISAwOuA41hglSpt14B+ub7Dx5936T14h5NPv8MqV9cmsUu0RBYfkLTQDSy2d/4YEPK3xmc6D2JYVwAAJjx079kH7Hv0v6hTdn1/zJx/RDL2jiVi12fpLD4guVkxY2UYv6izscNQ+tFCIZeDytFFwzk4qwPGP5PoOTDoiFPAADWrUOaZu56Cspu+ESkFa9LPX/xu7ZLnT5r7+qZi8QGpzEx8ncEMZwujh/57JDwPHPDg5tcLuvV5KNr30aeOezwyaR1CSKytH9zPp7Kf2n0q6/2zyblDiKBRrV0CVhMQi95q8s0TARPkcrRfJ4DVNjfT//0gIgDLcsDZOwje/YbmO/bou99ryNjj8m4Bcc5ubvpg8CKUZp9TUDXhp1PnXz9w5uKkgtJKmcBrAbNcHdGSWaWnllrFS0EtdgSJ2faZMytDaxEgF+vbBYEMUyiMDC+1ATsPX/AcGJTi2nv4J32mzTwLAOViVkcIkW/al/zv8MSCZXGpFw13zBgGA8aGzeH2wJDVa0Mj49+Z+6iodRqDxQakOivxGRlGQ5qs7DAUr9WAUqEAB3fvW3LXbjm9n3ghycGnzx5HL79zCqcuYu+gdY9MLZz1w+G02VEpVx6qrqkHBiNAzF2nJgQeMCPvt/LI2effmfvoV2IWawwWOcUKCUHYPykgUiAQbHnV35s+GCwI0L3/UPDoNyzOzr//Z4FPvBiOEKoUuza9xMyiPntPZf3vZEJeUG5BMSjk9399CEIYCMLJpY31Y0hESKNZCzUyixtBcjMTkFdsj4VYhoZZco+r39YWHAd2rh68q09Aos+ox2Pd+48IV3n4xbAKRbXYNerduNnw8MmkvLk//pI8Pf1SkS+v1bYaDjB8bwIAwg+5s7I3o1Ny1o1+OFCMNZJRWFxAKlNj/GQs/lAgIBe7lnZDzWsLxPNgZ28PSjdv8Box4UKPYeM+cBsy5jAA3BK7xLtw56/d+GT9tpj5R6MvOBpGOBYb/tcmhOcQZkJiM4sOjX44MNvUxZqKxU2xvniq57tOGFZaUiOGO6MFx7Hg4OGtdes56JrbwBE7PAaPTrR3945kZYo6sWu8i706pyIo9HDy3yKScp8tLK0yvCjaEAvUvl1uCHMAQuN/i8OWLzdVsaZmUQH5fnpfB5bXJekI6S12LW2h/7MVtE2GRbeTd4/qXhOm57v0G/6Jx6CRYQihG2LXdw/2+8/m/LB5b/wLGdn5wGABUDtD0RLBTD7RVo8oO7WyzGhVmpHFTLFK1NEc0TR9TBjUU8onPYggAIsxYJYhXTx9mlx69M/qPurxRKWb9w/u/YZdBoAqsWtsATVoeLcTcVefC/019bWsq2XDb1TdBI7FnQ6HAQFfwHYro9Jz/zZmsL/FLdgtJyAZSUNlLHqdJ9J8V4WhJY62CZwcHYGzcyr1GzUpsteYJ791GjQmSYKh+E1xRd0Tm/enrvn59PlB5RWVwGIEMs54TSiRfnrGyF6NSy8IHTPYP9JoH2wmFjHFCgkJAb/k/33NImahlNYe+tFC/zOWYRlwcPeu7dZrQKJP8JRIxs5pq3v/YcWc0k6yPzELymsH7j91cfbe8PRZeSXV3pqmRsPDPpPALAhEt/2NUT1nh4S8IJ2/wDawiIBseaz3YJW9EK7hSVexJ1fk9mlFwmvBydkZ7LwDm+y8/L/pNen/dngNGRPfho+QEUIUCKEaM5R7Lw6nE68t3fJzysKzKdfcCK8xjBqm/q+AIKaGCLcml50MiTPxpYxK8lOskxs/ceSU2k8IwaKGQ+B1wDIMyJRKUDq6VLj3HZrmOuTRg90HBSU5ePkltmM/1EBBEB5nGGa1iUv+gyaN1i7lUsXQI1EXV/8akRlcfqO2efqDzbNRByFwRKBYs3bnqRnvzJooxRsU9yT5EeSrKT2nO3DolyZenC4l+j8fXeMt6ObpDayLR3mfCU9FqQKGrPMeGhzTwY8cRAh5FCG02ciltqbvll/Sl209kvbypZwiYBnU3ju2RoFYBfC6qlllYR/tMv/VO0bSI0jC3i9lcgyLzHnWwzCFQs09WRmWBZfugfXuvQZGO/cavNclYEC0e7+h+QBQ34lLZCOEzNNSR6dz2RaW+ddIddmy8JhMj5raemAZLEo4wDAt1QBGdgs2hEYceGvueMmuz+4m6RHk+6l+zzOY3ckTMHkTuOYGBwQwCIBYGXHx7V3lFzRhX89J03c5ePWyuLfpXy6ofOLTbbGrzqXkPlxaXgEqBSeNRkgI84To5peGLQsVu5S2kOwIErdzfXdAzH/0i1pTXofXaYFjGJCr7MCuq2el99Dg806Bgz5hVC5xAcET6wBAa8rrG9vV4soxZ5IKl24/mjLuYt51B51WCyqFhJpMEmAQMB9+uu3suX+9Mu6q2OU8iGRHkG+n9PqHiiMbGk10W1fgecPawtPHF1x6DKhnunp9MXLhB8dZhcLiRovb7PeEq/++9Wj269Epl31lLDJsRZcizMpBp2lYVha+bKXYtTyIJEeQxB0burJYmKsx4rr8To8ojBAo7OzBsatHrs/ISXlOgYP3ufj2jnTyDcy0xB5RWq1OebHg5uydx8/PPRihHllRVQcKDhnnKbiJCPq1COZesQv48Mf6qx9IurGEJEeQb6cFfCTDeIUxFud31hYsAnB0cQHXPg9X+gRNPMJ49/nYb+DDVyy5KXN9fX23jT+lr9x7OnNeXuF1kLPt31AoGswC6LRfLHpx0D9CFj4t2UbKkhtBti54drAc4zc6e9aDCIJ+sgsKB0dw9PSrdfLvc6j3xOfPqDx8I+zdvQoAwGL7RF3NL3dS51a9+7+jGbNTswrda+vqQcZiywkHNJ88BIabk55ZtUO/5BS7nPuRXEA0xWmzlSzbVaPrWH9dwuuA6LRg38WNdB88stq5z5DQgc+/fgAhZHH7gO4lKbN43Mr/Ra5KvVg66mZNDcg5BjjWEl/gSwBh5BBzsXielAMiqSnW+ieGBrrKak7rCPi29WsMW8p53nB/38G5i+Dg6VMc8Oi0fIW7z2ZH7x6nnf36VFjanah7YPNKayYeOHdh3r6wzMnXim44a7VNwGBJ7ttsH8SWCLhmStmxj9PFLuVeJDOCZO79knHEN9cAQr5tXRUIOh2wiIB7Ny9w6TPkisIj4Jvhc986ghiZNb0JSfXjrylLj8ZdW3Eq7iJiMTEEwyrC0bxk8sSC3afrtobPWDx7kthNKf5EMgG5lhrzuJxDUx/03hvDDloigMqpC3F0c7/g88iEdP9Hn46SdfU6oXB0uWKuek2N5wWP1Iul074/lD4vPO5ScFVNHZIZtohYRzDuIIIOAHMTozJKn1gMcFDselqSTEDK02MXsBjLyT2Gj+Y7UTzIGBZkTs7gGzxZ6zt09AaHh8aucnJykuxZi06QrdkZG7rvZPaTVwvLQcYAcKbaii4FhGdi0wvfAAkGRBJrkK+nBk5WYLRbR4jznX/XfNaCGHbQqpxceJW7T47XkFEnvYaNj3L09j+jdHHXB0MjbuVGhWtv6fx/icics+OYem7mlZLujRoNNvSdsqS7Ux3G1COimbvz25f3jff3F7uY34g+giRs3ejKAqwGBM7N701DoG1sACcHO0AKOwgY9fhVj56DPvOb+sqPndwkKGlHYrMfP5tafnD3sRR5w60Gw45b1ppHjZYw2PECsyYhKjd6vL+/ZB4eij6CHA7ynl/tofy2SccDCAI4dvUQuvXsk8N28fnVf9zT55z9eqYqnd0KRC3SdJjL+ZXjvz2Y9tfTiVen5Rdfd9ePmliiW0RMDTMyYBp0/8iPWPq52LXcIWpAQhDCvk/6xsg4Lkjh3FXn/lBwYY9Hxq/pMnbiATtkJ5mfIiYScCjq6oot+xNeSswsUACvMd2RV4uBgGAmjbtZElwQu14Sd7REm2LVXy9iA14ascS3Vx8X9yFjvnP0DtzqOXj0ZUahKBWrJnO4Wdfosi8sw+9MWvGalIslk65XVIE+F8jmwwG3d/2QgVp7tyXxybn/DRrmL3pHRtEC0lhbrXxsybrKbv2HB0mlzaapaQkZ++XexE9/OJgaVF1XByxChrUG9TtECIsw86/I83k/Bw3zPy+BekSbYrkCgMWcTe4EXF6t8d0dljHzSFTW0gvXKlyaGpssatuU2TEcANGsKzn+3jtilyJWQPoSQp5ACElmMWYiisTs0nmb9yWvOJN0xbOuts7QkI1qA8wU625ph18/t0zUtagoUyxBEFwRQhbb0LgtUi+VjotKL16763jagMu5ZUqMCA1HexDwwnK0NiY977XgwX6inV8XJSAY42gxrmsmPlv2py7de/r83MSMq3YKOXv7eQadU7ULMXRknBWdlvdd8GC/M2KVIfpzEGtRVdvgFJNRMP147LX3j0dfDLxZWw/6UcM2noKbCOZAELR73ljQ8y8hL4jTkZEGxAiKq2rHrNsa9+H+U5mPNR9eQnTEMBbM1RHtrWdKT70vyihCA9IJWVcr/BMulL2141jq7OycEhetVmuIBR01jAgxQECIWzJnxNOLZz1WYfbL04B0zNGoC/O/+zVzWXR6jr9O0wRyjrXcw+0ShzklIKH61cJjIT+a+9o0IO10Kb/ypV0n1P/49dzFQYVlVXZAeEOnFMqEEAZCIGrZ3Ecn/31WsFlfU0cD0kYVlXXuXx/MWHw0+tKbWVeKFDIW7rwXnDIHxOqAb3qzJHy5WV8tTQPyADX1TV7ZeVVzNu2JfTk+o6B/dU2tYVMhHTPMTD+KABQtmTVi/OI5E8x2cpQGpBUlFTeHLdscsTI+u/yJ4pJSUMroOkNMiJUBaBs+LD65PMRs16QB+RNFQVnN4ONxOQu2HU2fnpN/vatG02Q42UiJzXCP8HL95ZOP1VwLLzTLFWlA/uhY7KUPth3NDIlIygGtppEGQ2oQC7yg+Xr5nEl/e/PlIJNvh6cBaWaXdql0yo+/pr1xJulqUMn1ajuMCF2ESxICxLD1QQPdph5YM+ecqa8m+pl0sZVU1HpFZVz/acOucyOzc4oYjrlzRoMuw6XJ0LjALjatcA4AmDwgNjuCVNY0BCZmFT/11c/J89IvFA+uq6+3rSYJlg6xZbKGxml551Ykm/QythiQqJT8YYfiru7Zdyo7sLryhlHfC06ZCWYBBOHUO7OCnlk8d7zJHh7a0hSLu1JQOeBQ5KWFO45nPF9cftNdq22i4bBUzR0ZJ0SrC6YtBthrqsvYREAIIa5hcTnvbtwV81b65euMTttkaK1D71BZOMLjWHXhQjBhQKx9imV/NqXgsZ/CM1ZEpxcMLyqtbO4gQvdOWQ/ENhC+6dXdy8fsHj9+vNE/3mpHkMrquke2h1/+YNfxjMcvXCmQyTlMO4hYJUEJwKxLyMfnxgMUG/vTrW4EKa2s8zl0Ov3JE0klyxPUeb4NjY307pS1Y2TQAHhx9bF/rjf2R1tTQGTZuTee2rArdlVY/LXedTU1wNImCbbBMGVmzhP3spGl29YatX+zNUyx2OSsov7x2WVrdh5LnXSloAITXkfDYUv0P+Qx9IUyl6Wx6qsfjRoUYLS3FVt0QAghXXacyHrrx0Opb6ZfLHBibjd+RnSLiO0hPAsgWxqdUvjzqEEBacb6WEudYtlFZRS99MvZi/88ei6zz43qOhb04aB3p2wb5oAImo2lYe+9ZayPtLiA5BRVDvjhYMbKAxFZkwuKy+X2KrnYJVESQjBbjjRNI0pOL88zxudZzBQrr6Ta/VJ+5cdbDiRPi8/I89ZoNEDDQbWECHEnDF4fnZb7yugh/p3egmIJAWHCU3If/35f0uqIlNyHtJomQwtPxkZfMkM9ABEAs/LnYjIKtowe4n+ysx/X0SmW0+1wmbI7u11+Wd1ju06eX7D3RNrUovKbjMDzhjt69Ek41RqEGSC8bv+HLwx6ceHCpx/w3uQHfFZHAkIIeRgAlAghU/XYVW3am/TvKHX5ipNRaSBnaSCo9iHA1BNBmFEW/u/wznxOR0eQO1Mzo91vvq1LrLpw9ncHU+dFpeb1vX6jSibjGDpiUO2HGBCAJL0za+RTS+aMK+vwx0jlLlbaxWK/Hw6lfR+dUTLxWkEJyFhMg0F1CmaVQHQVC4rD/vNdRz9D9IBU3rw19JezF2bvDst67vyVYl+tVkc3FVLGYejISGL/9ddHJr89Z2Jthz5CxIDg1JwbK779OeXv+8LTXQVtI3AsPZ9BGRlmBEJ0b5WeeG9TR77c7AHhBcExp/DmyB+PpC0Ki7n0bGFpFTLcmqO3bSlT0E/TCSp7+5Xg8UteefRCu7/czAHh9kdc2vnlTwn/p75UCAwS6DqDMjnEyEDHN6wqD1v+Xru/1kwBcTkcfeml7w+mzMu8Uj7sRnUN5hi6CKfMBQFBkFPrwE2s37e4XVtQTB6QovLa8d/8kvz1/tPZvUvLq4Az3CCmwaDMDLEgCNofli4YtujtFye3+fGEqQKC8ktrBvwamTNr94nUv+aXVvs2NjYAgzDNBiUSBIDZhpED3KYeWDcnoq1fZYq9WF0jMwpf++5g2j+PRWZ7AK8xvC6AoWc0KFER/URLGZtRtBAA2hwQY44gyoTMkpGHoy6vOBx5YWxh6Q2GvuWVkhzEVBBN/XOlZz6MbNNvN0ZACCHdvz+UvvbbA0kzc/KvG+5O0cbPlCRhFoAXope8PHxKWx4edmqKVV/f6HIw8tLMM6lFH52Jv+BWU9cArKHvFA0HJVGCDoDhgqMziqa9DbD7Qb+9wwG5kHt92qZ96e+ejr80urzihuEpOD2jQVkEgUcx6uI3oA0BafcU62Le9T6Ho64sCk/MezUtu8CJ1y/C6XSKsjAE4UZCdIvKwpZtbe33tScgDj+FqxdsP5b1dry6wJvXNRoaP0tkMzBFtY/hUJVQuviV4KAls8fm3++33SsgQwDgt7YpWp6XX8itfHl3WOaCgxGZw69X1TGICEBvTlGWDmEZ4FsN7xaeW/7JfX/P3QEhhLgSQoZijMNv/7PnytDokD1h6oVFZVXAMfS4K2VNEADDZGtrLgRVRH9/zztady/SFfrRA2Mck325zPFKWe3SrYdT5yZnF3Wrra0HjkE0HJSVIYAI9GbsAlbEpF99L3jwnzsy3h0QLwCoUF8uH/nx/2Lfj8+4Oq6+rsFweIm28aSsFRF4BiPuzej0wt3BgwNSWv76b1Oskoq6d7ceTn3kSMy1sVcKKlx5w0tmaDAo64cYFgS+4ZvSsOWL/vRrdwIy453tZyLTCtxA26SRyTggnWqWQlEWBBP9iv0mgGZmaVhI+d2/JPqZdIqSMjqHoqhW0IBQVCtoQCiqFTQgFNUKGhCKagUNCEW1ggaEolpBA0JRraABoahW0IBQVCtoQCiqFf8/AAD//2rYDWqT6z5BAAAAAElFTkSuQmCC",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Thursday, August 20, 2020