Octopus.Script exported 2017-04-10 by bobjwalker belongs to ‘IIS’ category.
Create an IIS virtual application (a virtual directory with an application pool)
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Virtual path
VirtualPath =
The name of the application to create. For example, to serve an application that will be available at /myapp
, enter myapp
. To create an application under a parent virtual directory or application, separate with slashes - for example: /applications/myapp
Physical path
PhysicalPath =
Physical folder that the application will serve files from. Example: C:\MyApp
.
Parent site
ParentSite =
The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:
Default Web Site
Application pool
ApplicationPoolName =
The name of the application pool that the application will run under.
Protocols
BindingProtocols = http
The protocols to use for the application
Require SSL
RequireSSL = False
Web site SSL settings
Client certificate
ClientCertificate = Ignore
(Require SSL) Defines how to handle client certificates if SSL is required.
Preload Enabled
PreloadEnabled = False
If true, sets the application to enable preloading.
Enable Anonymous authentication
EnableAnonymous = False
Whether IIS should allow anonymous authentication
Enable Basic authentication
EnableBasic = False
Whether IIS should allow basic authentication with a 401 challenge.
Enable Windows authentication
EnableWindows = False
Whether IIS should allow integrated Windows authentication with a 401 challenge.
Set Application Pool Settings
SetApplicationPoolSettings = False
If true, this will allow you to set the Application Pool CLR Version, identity using the .NET CLR Version, Identity, Username, and Password parameters. If false, the other four parameters will be ignored.
Application Pool .NET CLR Version
ApplicationPoolFrameworkVersion = v4.0
The version of the .NET common language runtime that this application pool will use.
Application Pool Identity
ApplicationPoolIdentityType = ApplicationPoolIdentity
Which built-in account will the application pool run under.
Application Pool Username
ApplicationPoolUsername =
The Windows/domain account of the custom user that the application pool will run under. Example: YOURDOMAIN\YourAccount. You will need to ensure that this user has permissions to run as an application pool.
Application Pool Password
ApplicationPoolPassword =
The password for the custom account given above.
Script body
Steps based on this template will execute the following PowerShell script.
## --------------------------------------------------------------------------------------
## Input
## --------------------------------------------------------------------------------------
$virtualPath = $OctopusParameters['VirtualPath']
$physicalPath = $OctopusParameters['PhysicalPath']
$applicationPoolName = $OctopusParameters['ApplicationPoolName']
$setApplicationPoolSettings = [boolean]::Parse($OctopusParameters['SetApplicationPoolSettings'])
$appPoolFrameworkVersion = $OctopusParameters["ApplicationPoolFrameworkVersion"]
$applicationPoolIdentityType = $OctopusParameters["ApplicationPoolIdentityType"]
$applicationPoolUsername = $OctopusParameters["ApplicationPoolUsername"]
$applicationPoolPassword = $OctopusParameters["ApplicationPoolPassword"]
$parentSite = $OctopusParameters['ParentSite']
$bindingProtocols = $OctopusParameters['BindingProtocols']
$authentication = $OctopusParameters['AuthenticationType']
$requireSSL = $OctopusParameters['RequireSSL']
$clientCertificate = $OctopusParameters['ClientCertificate']
$preloadEnabled = [boolean]::Parse($OctopusParameters['PreloadEnabled'])
$enableAnonymous = [boolean]::Parse($OctopusParameters['EnableAnonymous'])
$enableBasic = [boolean]::Parse($OctopusParameters['EnableBasic'])
$enableWindows = [boolean]::Parse($OctopusParameters['EnableWindows'])
## --------------------------------------------------------------------------------------
## Helpers
## --------------------------------------------------------------------------------------
# Helper for validating input parameters
function Validate-Parameter($foo, [string[]]$validInput, $parameterName) {
Write-Host "${parameterName}: ${foo}"
if (! $foo) {
throw "$parameterName cannot be empty, please specify a value"
}
if ($validInput) {
@($foo) | % {
if ($validInput -notcontains $_) {
throw "'$_' is not a valid input for '$parameterName'"
}
}
}
}
# Helper to run a block with a retry if things go wrong
$maxFailures = 5
$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4
function Execute-WithRetry([ScriptBlock] $command) {
$attemptCount = 0
$operationIncomplete = $true
while ($operationIncomplete -and $attemptCount -lt $maxFailures) {
$attemptCount = ($attemptCount + 1)
if ($attemptCount -ge 2) {
Write-Output "Waiting for $sleepBetweenFailures seconds before retrying..."
Start-Sleep -s $sleepBetweenFailures
Write-Output "Retrying..."
}
try {
& $command
$operationIncomplete = $false
} catch [System.Exception] {
if ($attemptCount -lt ($maxFailures)) {
Write-Output ("Attempt $attemptCount of $maxFailures failed: " + $_.Exception.Message)
}
else {
throw "Failed to execute command"
}
}
}
}
## --------------------------------------------------------------------------------------
## Configuration
## --------------------------------------------------------------------------------------
Validate-Parameter $virtualPath -parameterName "Virtual path"
Validate-Parameter $physicalPath -parameterName "Physical path"
Validate-Parameter $applicationPoolName -parameterName "Application pool"
Validate-Parameter $parentSite -parameterName "Parent site"
Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue
## --------------------------------------------------------------------------------------
## Run
## --------------------------------------------------------------------------------------
Write-Host "Getting web site $parentSite"
# Workaround to bug in Get-WebSite cmdlet which would return all sites
# See http://forums.iis.net/p/1167298/1943273.aspx / http://stackoverflow.com/a/6832577/785750
$site = Get-WebSite | where { $_.Name -eq $parentSite }
if (!$site) {
throw "The web site '$parentSite' does not exist. Please create the site first."
}
$path = $site.PhysicalPath;
$parts = $virtualPath -split "[/\\]"
$name = ""
for ($i = 0; $i -lt $parts.Length; $i++) {
$name = $name + "/" + $parts[$i]
$name = $name.TrimStart('/').TrimEnd('/')
if ($i -eq $parts.Length - 1) {
}
elseif ([string]::IsNullOrEmpty($name) -eq $false -and $name -ne "") {
Write-Host "Ensuring parent exists: $name"
$path = [IO.Path]::Combine($path, $parts[$i])
$app = Get-WebApplication -Name $name -Site $parentSite
if (!$app) {
$vdir = Get-WebVirtualDirectory -Name $name -site $parentSite
if (!$vdir) {
Write-Verbose "The application or virtual directory '$name' does not exist"
if([IO.Directory]::Exists([System.Environment]::ExpandEnvironmentVariables($path)) -eq $true)
{
Write-Verbose "Using physical path '$path' as parent"
}
else
{
throw "Failed to ensure parent"
}
}
else
{
$path = $vdir.PhysicalPath
}
}
else
{
$path = $app.PhysicalPath
}
}
}
$existing = Get-WebApplication -site $parentSite -Name $name
# Set App Pool
Execute-WithRetry {
Write-Verbose "Loading Application pool"
$pool = Get-Item "IIS:\AppPools\$ApplicationPoolName" -ErrorAction SilentlyContinue
if (!$pool) {
Write-Host "Application pool `"$ApplicationPoolName`" does not exist, creating..."
new-item "IIS:\AppPools\$ApplicationPoolName" -confirm:$false
$pool = Get-Item "IIS:\AppPools\$ApplicationPoolName"
} else {
Write-Host "Application pool `"$ApplicationPoolName`" already exists"
}
}
# Set App Pool Identity
Execute-WithRetry {
if($setApplicationPoolSettings)
{
Write-Host "Set application pool identity: $applicationPoolIdentityType"
if ($applicationPoolIdentityType -eq "SpecificUser") {
Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" -name processModel -value @{identitytype="SpecificUser"; username="$applicationPoolUsername"; password="$applicationPoolPassword"}
} else {
Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" -name processModel -value @{identitytype="$applicationPoolIdentityType"}
}
}
}
# Set .NET Framework
Execute-WithRetry {
if($setApplicationPoolSettings)
{
Write-Host "Set .NET framework version: $appPoolFrameworkVersion"
if($appPoolFrameworkVersion -eq "No Managed Code")
{
Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" managedRuntimeVersion ""
}
else
{
Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" managedRuntimeVersion $appPoolFrameworkVersion
}
}
}
Execute-WithRetry {
## Check if the physical path exits
if(!(Test-Path -Path $physicalPath)) {
Write-Host "Creating physical path '$physicalPath'"
New-Item -ItemType directory -Path $physicalPath
}
if (!$existing) {
Write-Host "Creating web application '$name'"
New-WebApplication -Site $parentSite -Name $name -ApplicationPool $applicationPoolName -PhysicalPath $physicalPath
Write-Host "Web application created"
} else {
Write-Host "The web application '$name' already exists. Updating physical path:"
Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name physicalPath -value $physicalPath
Write-Host "Physical path changed to: $physicalPath"
Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -Name applicationPool -Value $applicationPoolName
Write-Output "ApplicationPool changed to: $applicationPoolName"
}
Write-Host "Enabling '$bindingProtocols' protocols"
Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name enabledProtocols -value $bindingProtocols
$enabledIisAuthenticationOptions = $Authentication -split '\\s*[,;]\\s*'
try {
Execute-WithRetry {
Write-Output "Anonymous authentication enabled: $enableAnonymous"
Set-WebConfigurationProperty -filter /system.webServer/security/authentication/anonymousAuthentication -name enabled -value "$enableAnonymous" -PSPath IIS:\\ -location $parentSite/$virtualPath
}
Execute-WithRetry {
Write-Output "Windows authentication enabled: $enableWindows"
Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/windowsAuthentication -name enabled -value "$enableWindows" -PSPath IIS:\\ -location $parentSite/$virtualPath
}
Execute-WithRetry {
Write-Output "Basic authentication enabled: $enableBasic"
Set-WebConfigurationProperty -filter /system.webServer/security/authentication/basicAuthentication -name enabled -value "$enableBasic" -PSPath IIS:\\ -location $parentSite/$virtualPath
}
} catch [System.Exception] {
Write-Output "Authentication options could not be set. This can happen when there is a problem with your application's web.config. For example, you might be using a section that requires an extension that is not installed on this web server (such as URL Rewriting). It can also happen when you have selected an authentication option and the appropriate IIS module is not installed (for example, for Windows authentication, you need to enable the Windows Authentication module in IIS/Windows first)"
throw
}
Set-WebConfiguration -value "None" -filter "system.webserver/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\
if ($requireSSL -ieq "True")
{
Write-Output "Require SSL enabled: $requireSSL"
Set-WebConfiguration -value "Ssl" -filter "system.webserver/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\
Write-Output "Client certificate mode: $clientCertificate"
if ($clientCertificate -ieq "Accept") {
Set-WebConfigurationProperty -filter "system.webServer/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ -name "sslFlags" -value "Ssl,SslNegotiateCert"
}
if ($clientCertificate -ieq "Require") {
Set-WebConfigurationProperty -filter "system.webServer/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ -name "sslFlags" -value "Ssl,SslNegotiateCert,SslRequireCert"
}
}
try {
Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name preloadEnabled -value $preloadEnabled
Write-Output "Preload Enabled: $preloadEnabled"
} catch [System.Exception] {
if ($preloadEnabled) {
Write-Output "Preload Enabled: $preloadEnabled Could not be set. You may to install the Application Initialization feature"
throw
}
}
}
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "5b3e7576-44f8-4852-ae09-a45bd985c549",
"Name": "IIS Application - Create",
"Description": "Create an IIS virtual application (a virtual directory with an application pool)",
"Version": 37,
"ExportedAt": "2017-04-10T15:13:10.653Z",
"ActionType": "Octopus.Script",
"Author": "bobjwalker",
"Parameters": [
{
"Id": "679da415-996c-4ad3-87d5-bb8ce4e1f8d0",
"Name": "VirtualPath",
"Label": "Virtual path",
"HelpText": "The name of the application to create. For example, to serve an application that will be available at `/myapp`, enter `myapp`. To create an application under a parent virtual directory or application, separate with slashes - for example: `/applications/myapp`",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "3eecef84-fe72-4efc-98bf-42aa41a2d488",
"Name": "PhysicalPath",
"Label": "Physical path",
"HelpText": "Physical folder that the application will serve files from. Example: `C:\\MyApp`.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "f2b3a7ef-4d83-4692-a328-fc18cb85fd3e",
"Name": "ParentSite",
"Label": "Parent site",
"HelpText": "The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:\n\n Default Web Site",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "3cb9971e-a7f2-47e7-8201-fb25c3080bd0",
"Name": "ApplicationPoolName",
"Label": "Application pool",
"HelpText": "The name of the application pool that the application will run under.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "2a5d18bf-50ad-43c4-882b-9314ee2551b4",
"Name": "BindingProtocols",
"Label": "Protocols",
"HelpText": "The protocols to use for the application",
"DefaultValue": "http",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "07d979ef-c343-4c9c-8681-d3c06f451539",
"Name": "RequireSSL",
"Label": "Require SSL",
"HelpText": "Web site SSL settings",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "3a3a8fe8-9fb0-4db5-85c9-04141f33f32d",
"Name": "ClientCertificate",
"Label": "Client certificate",
"HelpText": "_(Require SSL)_ Defines how to handle client certificates if SSL is required.",
"DefaultValue": "Ignore",
"DisplaySettings": {
"Octopus.ControlType": "Select",
"Octopus.SelectOptions": "Ignore\nAccept\nRequire"
},
"Links": {}
},
{
"Id": "174299e5-38dc-4fe9-b25a-6a5bdad05b34",
"Name": "PreloadEnabled",
"Label": "Preload Enabled",
"HelpText": "If true, sets the application to enable preloading.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "1641d3e2-a1e5-4933-b993-6528f1764557",
"Name": "EnableAnonymous",
"Label": "Enable Anonymous authentication",
"HelpText": "Whether IIS should allow anonymous authentication",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "3a52b977-3ea6-482b-8e55-62efd0198b14",
"Name": "EnableBasic",
"Label": "Enable Basic authentication",
"HelpText": "Whether IIS should allow basic authentication with a 401 challenge.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "085a3183-30bc-499e-90bf-9b5bcdf0842a",
"Name": "EnableWindows",
"Label": "Enable Windows authentication",
"HelpText": "Whether IIS should allow integrated Windows authentication with a 401 challenge.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "de7b8dee-bf5a-48ea-99bc-f5b86fcdf118",
"Name": "SetApplicationPoolSettings",
"Label": "Set Application Pool Settings",
"HelpText": "If true, this will allow you to set the Application Pool CLR Version, identity using the .NET CLR Version, Identity, Username, and Password parameters. If false, the other four parameters will be ignored.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "dd301881-0cd6-40bf-98b4-36e13a587fe2",
"Name": "ApplicationPoolFrameworkVersion",
"Label": "Application Pool .NET CLR Version",
"HelpText": "The version of the .NET common language runtime that this application pool will use.",
"DefaultValue": "v4.0",
"DisplaySettings": {
"Octopus.ControlType": "Select",
"Octopus.SelectOptions": "v2.0|CLR v2.0 (.NET 2.0, 3.0, 3.5)\nv4.0|CLR v4.0 (.NET 4.0, 4.5, 4.6)\nNo Managed Code"
},
"Links": {}
},
{
"Id": "92cb9de4-f65f-4855-bc88-d89e6a748f3c",
"Name": "ApplicationPoolIdentityType",
"Label": "Application Pool Identity",
"HelpText": "Which built-in account will the application pool run under.",
"DefaultValue": "ApplicationPoolIdentity",
"DisplaySettings": {
"Octopus.ControlType": "Select",
"Octopus.SelectOptions": "ApplicationPoolIdentity|Application Pool Identity\nLocalService|Local Service\nLocalSystem|Local System\nNetworkService|Network Service\nSpecificUser|Custom user ..."
},
"Links": {}
},
{
"Id": "7cbeec84-7fad-46dd-98de-ed61531f8bb3",
"Name": "ApplicationPoolUsername",
"Label": "Application Pool Username",
"HelpText": "The Windows/domain account of the custom user that the application pool will run under. Example: YOURDOMAIN\\\\YourAccount. You will need to ensure that this user has permissions to run as an application pool.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "748a99a2-a9f4-46b2-b9b5-283a864171d3",
"Name": "ApplicationPoolPassword",
"Label": "Application Pool Password",
"HelpText": "The password for the custom account given above.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
},
"Links": {}
}
],
"Properties": {
"Octopus.Action.Script.ScriptBody": "## --------------------------------------------------------------------------------------\n## Input\n## --------------------------------------------------------------------------------------\n\n$virtualPath = $OctopusParameters['VirtualPath']\n$physicalPath = $OctopusParameters['PhysicalPath']\n$applicationPoolName = $OctopusParameters['ApplicationPoolName']\n$setApplicationPoolSettings = [boolean]::Parse($OctopusParameters['SetApplicationPoolSettings'])\n$appPoolFrameworkVersion = $OctopusParameters[\"ApplicationPoolFrameworkVersion\"]\n$applicationPoolIdentityType = $OctopusParameters[\"ApplicationPoolIdentityType\"]\n$applicationPoolUsername = $OctopusParameters[\"ApplicationPoolUsername\"]\n$applicationPoolPassword = $OctopusParameters[\"ApplicationPoolPassword\"]\n\n$parentSite = $OctopusParameters['ParentSite']\n$bindingProtocols = $OctopusParameters['BindingProtocols']\n$authentication = $OctopusParameters['AuthenticationType']\n$requireSSL = $OctopusParameters['RequireSSL']\n$clientCertificate = $OctopusParameters['ClientCertificate']\n\n$preloadEnabled = [boolean]::Parse($OctopusParameters['PreloadEnabled'])\n$enableAnonymous = [boolean]::Parse($OctopusParameters['EnableAnonymous'])\n$enableBasic = [boolean]::Parse($OctopusParameters['EnableBasic'])\n$enableWindows = [boolean]::Parse($OctopusParameters['EnableWindows'])\n\n## --------------------------------------------------------------------------------------\n## Helpers\n## --------------------------------------------------------------------------------------\n# Helper for validating input parameters\nfunction Validate-Parameter($foo, [string[]]$validInput, $parameterName) {\n Write-Host \"${parameterName}: ${foo}\"\n if (! $foo) {\n throw \"$parameterName cannot be empty, please specify a value\"\n }\n \n if ($validInput) {\n @($foo) | % { \n if ($validInput -notcontains $_) {\n throw \"'$_' is not a valid input for '$parameterName'\"\n }\n } \n } \n}\n\n# Helper to run a block with a retry if things go wrong\n$maxFailures = 5\n$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\nfunction Execute-WithRetry([ScriptBlock] $command) {\n $attemptCount = 0\n $operationIncomplete = $true\n\n while ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n $attemptCount = ($attemptCount + 1)\n\n if ($attemptCount -ge 2) {\n Write-Output \"Waiting for $sleepBetweenFailures seconds before retrying...\"\n Start-Sleep -s $sleepBetweenFailures\n Write-Output \"Retrying...\"\n }\n\n try {\n & $command\n\n $operationIncomplete = $false\n } catch [System.Exception] {\n if ($attemptCount -lt ($maxFailures)) {\n Write-Output (\"Attempt $attemptCount of $maxFailures failed: \" + $_.Exception.Message)\n \n }\n else {\n throw \"Failed to execute command\"\n }\n }\n }\n}\n\n## --------------------------------------------------------------------------------------\n## Configuration\n## --------------------------------------------------------------------------------------\nValidate-Parameter $virtualPath -parameterName \"Virtual path\"\nValidate-Parameter $physicalPath -parameterName \"Physical path\"\nValidate-Parameter $applicationPoolName -parameterName \"Application pool\"\nValidate-Parameter $parentSite -parameterName \"Parent site\"\n\n\nAdd-PSSnapin WebAdministration -ErrorAction SilentlyContinue\nImport-Module WebAdministration -ErrorAction SilentlyContinue\n\n\n## --------------------------------------------------------------------------------------\n## Run\n## --------------------------------------------------------------------------------------\n\nWrite-Host \"Getting web site $parentSite\"\n# Workaround to bug in Get-WebSite cmdlet which would return all sites\n# See http://forums.iis.net/p/1167298/1943273.aspx / http://stackoverflow.com/a/6832577/785750\n$site = Get-WebSite | where { $_.Name -eq $parentSite }\nif (!$site) {\n throw \"The web site '$parentSite' does not exist. Please create the site first.\"\n}\n\n$path = $site.PhysicalPath;\n$parts = $virtualPath -split \"[/\\\\]\"\n$name = \"\"\n\nfor ($i = 0; $i -lt $parts.Length; $i++) {\n $name = $name + \"/\" + $parts[$i]\n $name = $name.TrimStart('/').TrimEnd('/')\n if ($i -eq $parts.Length - 1) {\n \n }\n elseif ([string]::IsNullOrEmpty($name) -eq $false -and $name -ne \"\") {\n Write-Host \"Ensuring parent exists: $name\"\n \n $path = [IO.Path]::Combine($path, $parts[$i])\n $app = Get-WebApplication -Name $name -Site $parentSite\n\n if (!$app) {\n $vdir = Get-WebVirtualDirectory -Name $name -site $parentSite\n if (!$vdir) {\n Write-Verbose \"The application or virtual directory '$name' does not exist\"\n if([IO.Directory]::Exists([System.Environment]::ExpandEnvironmentVariables($path)) -eq $true)\n {\n Write-Verbose \"Using physical path '$path' as parent\"\n }\n else\n {\n throw \"Failed to ensure parent\"\n }\n }\n else\n {\n $path = $vdir.PhysicalPath\n }\n }\n else\n {\n $path = $app.PhysicalPath\n }\n }\n}\n\n$existing = Get-WebApplication -site $parentSite -Name $name\n\n# Set App Pool\nExecute-WithRetry { \n\tWrite-Verbose \"Loading Application pool\"\n\t$pool = Get-Item \"IIS:\\AppPools\\$ApplicationPoolName\" -ErrorAction SilentlyContinue\n\tif (!$pool) { \n\t\tWrite-Host \"Application pool `\"$ApplicationPoolName`\" does not exist, creating...\" \n\t\tnew-item \"IIS:\\AppPools\\$ApplicationPoolName\" -confirm:$false\n\t\t$pool = Get-Item \"IIS:\\AppPools\\$ApplicationPoolName\"\n\t} else {\n\t\tWrite-Host \"Application pool `\"$ApplicationPoolName`\" already exists\"\n\t}\n}\n\n# Set App Pool Identity\nExecute-WithRetry { \n\tif($setApplicationPoolSettings)\n {\n Write-Host \"Set application pool identity: $applicationPoolIdentityType\"\n if ($applicationPoolIdentityType -eq \"SpecificUser\") {\n Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" -name processModel -value @{identitytype=\"SpecificUser\"; username=\"$applicationPoolUsername\"; password=\"$applicationPoolPassword\"}\n } else {\n Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" -name processModel -value @{identitytype=\"$applicationPoolIdentityType\"}\n }\n }\n}\n\n# Set .NET Framework\nExecute-WithRetry { \n if($setApplicationPoolSettings)\n {\n Write-Host \"Set .NET framework version: $appPoolFrameworkVersion\" \n if($appPoolFrameworkVersion -eq \"No Managed Code\")\n {\n Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" managedRuntimeVersion \"\"\n }\n else\n {\n Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" managedRuntimeVersion $appPoolFrameworkVersion\n }\n }\n}\n\nExecute-WithRetry { \n ## Check if the physical path exits\n if(!(Test-Path -Path $physicalPath)) {\n Write-Host \"Creating physical path '$physicalPath'\"\n New-Item -ItemType directory -Path $physicalPath\n }\n\n if (!$existing) {\n Write-Host \"Creating web application '$name'\"\n New-WebApplication -Site $parentSite -Name $name -ApplicationPool $applicationPoolName -PhysicalPath $physicalPath\n Write-Host \"Web application created\"\n } else {\n Write-Host \"The web application '$name' already exists. Updating physical path:\"\n\n Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name physicalPath -value $physicalPath\n Write-Host \"Physical path changed to: $physicalPath\"\n\n Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -Name applicationPool -Value $applicationPoolName\n Write-Output \"ApplicationPool changed to: $applicationPoolName\"\n }\n \n Write-Host \"Enabling '$bindingProtocols' protocols\"\n Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name enabledProtocols -value $bindingProtocols\n\n $enabledIisAuthenticationOptions = $Authentication -split '\\\\s*[,;]\\\\s*'\n\n try {\n\n Execute-WithRetry { \n Write-Output \"Anonymous authentication enabled: $enableAnonymous\"\n Set-WebConfigurationProperty -filter /system.webServer/security/authentication/anonymousAuthentication -name enabled -value \"$enableAnonymous\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n } \n \n Execute-WithRetry { \n Write-Output \"Windows authentication enabled: $enableWindows\"\n Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/windowsAuthentication -name enabled -value \"$enableWindows\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n }\n\n Execute-WithRetry { \n Write-Output \"Basic authentication enabled: $enableBasic\"\n Set-WebConfigurationProperty -filter /system.webServer/security/authentication/basicAuthentication -name enabled -value \"$enableBasic\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n }\n\n } catch [System.Exception] {\n Write-Output \"Authentication options could not be set. This can happen when there is a problem with your application's web.config. For example, you might be using a section that requires an extension that is not installed on this web server (such as URL Rewriting). It can also happen when you have selected an authentication option and the appropriate IIS module is not installed (for example, for Windows authentication, you need to enable the Windows Authentication module in IIS/Windows first)\"\n throw\n }\n\n Set-WebConfiguration -value \"None\" -filter \"system.webserver/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ \n if ($requireSSL -ieq \"True\")\n {\n Write-Output \"Require SSL enabled: $requireSSL\"\n Set-WebConfiguration -value \"Ssl\" -filter \"system.webserver/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ \n Write-Output \"Client certificate mode: $clientCertificate\"\n if ($clientCertificate -ieq \"Accept\") {\n Set-WebConfigurationProperty -filter \"system.webServer/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ -name \"sslFlags\" -value \"Ssl,SslNegotiateCert\"\n }\n if ($clientCertificate -ieq \"Require\") {\n Set-WebConfigurationProperty -filter \"system.webServer/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ -name \"sslFlags\" -value \"Ssl,SslNegotiateCert,SslRequireCert\"\n }\n }\n \n try {\n Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name preloadEnabled -value $preloadEnabled\n Write-Output \"Preload Enabled: $preloadEnabled\"\n } catch [System.Exception] {\n if ($preloadEnabled) {\n Write-Output \"Preload Enabled: $preloadEnabled Could not be set. You may to install the Application Initialization feature\"\n throw\n }\n }\n}\n",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.RunOnServer": "false",
"Octopus.Action.Script.ScriptFileName": null,
"Octopus.Action.Package.FeedId": null,
"Octopus.Action.Package.PackageId": null
},
"Category": "IIS",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/iis-app-create.json",
"Website": "/step-templates/5b3e7576-44f8-4852-ae09-a45bd985c549",
"Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAF8hJREFUeNrsnXtwW2V6xhVLlmzJtuRL5Mv6lgt2jOMkxJkQtsWBgYbszgBZKPxTAtmZsvyzbZfpTDudMC0dys60MBs67LQDme1mCUxbaLNZoDtJFmaDA+QCXogdx7ET32JHtmTLlmTdIzt9dD5HkY4ulo7OOZKl9xmNR5alcySfn973eb/rmlu3bilIJLFVQP8CEoFFIrBIBBaJRGCRCCwSgUUiEVgkAotEYJFIBBaJwCIRWCQSgUUisEgEFolEYJEILBKBRSIRWCQCi0RgkUhpSkX/ghmXb9bpdd9cHJ93hT8SeoJWrWoq17H7VTrNWp0m/BFSTK3Jw3mFA2b7gMUBekDS9dswCRCDrK1aD8gay3W4TzzlHViA6evJOfCUDkkrcgbI2oxlO+orENIIrJwFy+0PAKYe8GS2I9PJeWoEsK51xs6GirwNY7kJFkjqHp3pmbDKzFO0EMDuX2/MwxiW46kQuY9x5r4ZGJ93405G3oa2UNnZUPlER0P+BLC8M+9AjZn3jEDWWV+xt7UWVozAylkhSyJXMhOGXw3aQWWB1+rcKk9+RPTKbbzW0DJG8x776PyZz8fODUy3L3ibZDsvvFcOJ8fVDJb9M0XApnB9u/wzWkXNCk3z8k/97hWPh9B1YnBK5hQJtpAcc8/aryqwfOMK++ngzfltbJISS7dNoX9g+abSJzBhx/om0sSrsuSiRsU/gi+gj5lqq3SaF3ZtzLHMuBrAcl1UmI8o5o4rvGOiHbNyX/BWsS8eYcDr3Z7RcUGtqfBq2xpfD3/E46+2uVtnnVv8AUO8Vz3SWvtkR0POhK4sBgvxCTxZjojJU7SqDyiMB+IlyjMjlqN/GHP7A6keVa2yNVd9VFo07g/oJ+b2sAB2zfJUArBY6Hqxa1Nu9EJmJVgwT6Y3FNbj8p0RWfI7P1EYn4tZPB7ru37iypSAowIspL/EMEXrme3r9m6qJbDERur6y0EXlRHB5je+HBMvZMa3z16dcflkKxj3b29e1Wkxa8CCkRr5ScaQ4uG17g1F5eMihi4BaizXvfRQ++plKwvACtiDUQq5L6uEyrHliELTFN0k8da5awJclwBpC5UHH968Si1XpsFC7rt6IIY9VxmCvif4hIzGMGTGxn/gPTbr8h3qviKsYDSWXfBzrsvtr85ttjIK1vV/DMYqxAYwVLIt2IyJO/FamJArA7YgZ76x4E9JS0Wer0fo0m3lpcV3e0a7RyzxXtRWre9at5Y1TSHIDVp/Y/NeVBV4i9XmUAMEikTcWdHar1K2MgcWQAEcUVYmhcYI4IXKUZ7icf0birq/4j12cnDqaM8onwO16smOhkdaI8o636Lrg0t/O+MaiT4wCJt1brW5W2ISplWbWWz7mwfXbamtJbDktWhzxxU33hDSFp+q62o7zguoZ0YssFzhgeqFXRurYnX/TTr6wFaCwy94m4YtTykLvM1VH+GORmVvrvoQEQ7MKQt8RSrb3rte2lLbTmBlwq5ZjgTbVCUtGMFWZFq8Pu/6p0/7cSc6UPF06MvvJz68xbHT6tzaUvOOzd1aWjSujuwUWlwq2rPhldXCVhaB9c2N+X6zbXzevdx0ZLbX6ke3N4yolC6NUmfUrS/TVJcXbaktM66QIuHbpMMLVQXSYmRbF9hCBowRqJDuwyh8/fMfmGy7NSobLDyPJ5DkC+gN2qGGilMJTg62/rT9X5vLGwisZAWzAsvCe3Bb42vIAotLwQuGO0gWQ9P7cQnZhIXOhkoY27gGTtJWsVjVIj9Bo9qF8b/9NNisn/7+4JRtN0tw4c9FnWiydQEpcKNWrdD5HVis/fMdPysv1hNYKwvl1dthTiUkg3awztDNfAa87cTcHt4TOusrQNj96+PEMOtvglcXtaQUqj6guOuXK5wX5eTt2HbNanr55FhH/ZsrorOylja/+Mf/kuVgZX4m9Pi8K0SVWmVrqTm6wfg+7gAp3GBm/VyOQLKIfi1rrvzR/1w4fmnUF/Dw/4ySc8dYkAAphGx79YcxAtXADxQD+5ZpZk1xnHpNi1zc9Ypx0S79x9f/RmAlktsfONR9JSwpGMZmH0VkgnWtNXQDL3y/fQHD5NyfVJZcxIPxDnJ+8le/+MOz5ybeQ8aJtET6YFwJVnMGydlCoPq6OaL5I8xgLfi/Cj4lbDwWS/ECCxX/x1+MnSWw4grxZjasZxfooNjWqs0otj3+6jlX+7x7E9yuXjtUWdKLYIYbnhP9vUfS9AVcZyfe+0XPgcuWT2KErnu+DY8fIrPFC1Sh5omIpqwB/MR3ZsD0PDK7Iomm0cQ6O/navMdOYCliJrJvTSYF1wzIcEGU4vAaw32zY2eJ5ka59gqCVihW4Q5jK7pcWr5+AdfJaz/7z95XJmyOiGdomhT3fCNJWgRb5wwx2mmLmiN85LUHWSoMLGm0nHnnWfhUhUMd6XmVwOIL37bfDr0CM4sqCTdkOjwII+XxG41lXynWLCF0hSKTJ7JnbYPxA7ww/BGeA+ufdv3dby8d65vgnxVpseWITJ8wLEBO2PvZHSDVUf9z8a7epZNDvyOwInSk579KigaVBT4EJMtCJ3JEddkFlNyawnnYrMVFLefl7cgaQ9P7L5ue55WEZse94b/yZtdYuL8CrFc/7edPhkaZ1nFaEssVH6zr8/rbdrCafS6xTtJn+ffsTIiZaW7onZp684tzME8shaEMvG793rq1xxe8zciDPWMvIdmVFQ/X6L8EVQwaLqr14s6w5Sm8KnqeFmt1VBV43dwA89DjWrXqxa5NbcYyfkNX3wNStUQw7bKF+n8+vnKid/q/g1XjUlG8EkR4TlTs/MvvvkwRK6hTw38NaJjPADHgYM61Ga5Wq55yeDbU6L9AEtQXD4dCETIIo4rdjzn7z+LYiZvJ1sVLi6gZX/3k0hneSATUa5LGLRissF5Fz+JpfNJizkqKfqpFxYUsrBAzMEDxl18fDiytqdD14xay5LgBF6e3CQUgYhUrxZETuU7ZDw3aoZDZEjanFOXngMXxo10b+WxJFLciK9BJe6+k/9Jzk+/9UfN9eR2xED+uzHg0qnme9QYu8O/62wBZnVvhq/DToB1E4puydVmdW0LPFHbqGO370sWtMLAcPovkV7Fg5MOBE3kdsU4MThUqTbd5anF6mxdvFeqLr25rfC2Ms5aQVQdbHn8Ns71js48hsIWGKAlja3zedfDhzXc6GSWKW2FgxRyGJbqGrO8oFHvzNGKhfvli7PcAxe7ZOG79PhCprzjVVPl/yHQoD3HjtR2wHp62usO4ISHiEZSNJenZFIAFyxVRKoKtu8RugygJB2tYhv+tssD26/5jeRqxft3/Xn3lx/6AHvW2vjhGr7OHC0uhgFRn6A65XSRENi6gquQiTHqabB3qvnLwobCBTZWPB9u3hg6I9lHDZmFYEkasev0Wsc7pvwXP+kTegYVwNef9RFkQtxUHhh2+KvwRbVjbdGgME+w8azgNtbYL0IDZDr8V4eWNzwWH2YgykCuyMydmKtSodNtr991Tt0+jzM3Vl+VLhadHPk3Qt49Y1Tf5FzyqYnZ6gMttja9vMH6QzkgBrVoVY7CNUaSIFWawfIuuQXMr6xwMaa1u/VPt/7yr4c9ylSpZwbpq/TjBX5EBU4pASJEoGIW9k7U6zUsPtfObTO2fBXuRxTdYI8ay83CNrKplseqxTX8PthQ5LZlSYe9Uf6FqOt5f8U+PLvQCCUeVLHgbhbU7NJXrIqrCZR/0K1ENVnPo7g37DIoS1Bz45nBNKr2PbH6yTGNU5LpkAuv06AcJE5M5qsbxbjTGfcm0/btrS3tg7a3OrSnh1bXeGOGrlmPpD0UeIx+2ds3FG41Tti4ELeRu1BxOz9N3Gx+88+UJBPr7+ycmJmS+6g0NDe3t7SqVatWD5V/qVcbPuvBS2xpfc/trnN4mthBoS807odaHcMGsWBz3ojzEX/Ht9wcMyYP1REcDbpFRkRuZLu7MxMg29xmXz2TrmnVuaa76CPXHluqIDPjVV19ZrVb5wwlQttvtXV1dqxusk0O/W9FoAxTWsaMIjlzYGTNdAilkzMqSi/DvXPYMgpikVd+/vZnv1n3jisv7xJ+NGDkMi60MiC8A4lZpzVGvf3voTw6HIyNUhZ+9srJyFYM1OPtFahZFZeeFq8UlDeITIhmSpsdf0zf54+SHX4IqWPVG3hR16UY3hEWsGw4rvlH4tiAP4iOMzT7aVHqnZ/rmzZuZtUGSgiVHVYg8mNLzW2qORscz1i3NJUFvSoN6X+zaxKcKVl26MTNhjVh27zew7SgJ8U2YmNsjz1rf+WLez0/0ijI1BWwBOPjflNw6akB+swJbiUQ6RXQ/m9lnxzfB6kz2y2Cz2dxut7hvSqPRSBecMgNWv/lzUY6DiDVseTrVJoa26jJ+rLKf5rWMi/0fvZPsJhx9AroHAJbo3qu4uDjXwJr3Xi5IL9/Cp6OwUhX4BAxqmHFGlpbG52KuBCmRZlzDlSUueCyWBPEpknlVc3NzaWmpyWTy+/3pvwe1Wl1XVyczVXKAVVCQ1qARhKix2ceC2UTQywcsDvfNxbgz8aXUpKPPFwhOckQNy2YfqVU2jeoZhWLllRcqOS0sLCB0IYAtLqa8h5lSqTTcVg56rPSHzDo8aXV9uP2Bd3tGYzSKSizfouv06Ft8XEp6uclIm5M8SCmn4Kdwu51OJzjz+XwejydBvoOXws/QC3PWvI/brqZjqhCrYs6sT0ndI5YZl4/tuSVD6HL4LJP23rMT78G5i3VMLSej8U47HCDjIZhfVeGsW3geRH2ePlXLCdFsF7aFCWq6hopToXkc2aMsJElWsG4uzQpz7v44287IrLvrDos4BzCvJG0D6S3FDWEvZIY9szKWXSCqshSsmB3Jq0JatbnO8BnxkY1gCS4JkQcFz8MR6fvgjTe8gpQVEUtYMThseTqd8eyigEVUZS9YwtoaQFVmwxUXMg1pTgQiSQiWN+BM9SUL3iY5d2VOGDiLCI7cSYUqUZboFCkbEhxpXcqMvwPWx4w7VSW9bN3RNNdQFEVSLAtDYMlk0q3BPWRa4ahY3jE7dhrLzmtU9oyDZdAOprmOI0lCsPhL6UVSNTT9LM+kA6/LpuezwdxoiapsBuvmojqehUOsii79YGuquF65wFJRvN2w5FGxeprIyF7z/p3Se1OqueoM3b5AcPilRmXrqP954l1lJNWUbXeWFKcUsWLIefNLk+2Bcu1AYr+CQAWk4N/Dl6+N3t1ETiGaDk3vB9m83ZRIWRGx1MqG6rKzo9zU8gS5pqP+TVy/LLQ1gHts9lFCJOvA0qq2AanqsvP49vMastnCfIqwzpPsbJCEF0xnYxICSyoNW55mbVS81MbN5Xpng/H90D4ALCFqY69bZAu/j/AmZ+slqlfyW9nlsdiEvlBxh8sT3uoItkJrIStuT1ItKRpHeAs/CB73cNPq8XJgxyIc3M+w5Sk8IkOcY34L0LMJEfFaT2zuVrYCANuUhcBSyfjV389NU7Fzy52PgQ/kR4N2ELd4QwnYRpgoEnkUKrhdT9j+kR5/DWgDYZJ2XbPl4+srToEbNroVWLOPg0oWfwohjsetzi14Swve5qqSi3nb0CohWE3l/OXqEL3Y+jAhyxUa1Y4LBjfG7YAS3K6iuuwC/sSAizeMUx3cjvujsIMHL7B05SQLXbyPGPOZoeGvNneLmDvnEFjL5l2dwsFBG65ca81RXAkggl/b6g6nVoSq7LBfOEj2LJGQzy340qbCxnLd9XlXkk9mXTqIWIheiD2IbQlsTTwhhi0GG+5bs+GfK3gxSwJrBa3VaZIHK5Qu2foZs84tAsBScC34MPvAC4dindwEVq6BBZvVMzkn7LWC+wqLw5Zbrg0uJ7kFh2K7ACu4UTrhXltSIaHzag4CS8wWh8waFN50U+TZxaVTrKyLuT2diIKL76h/Mz+Hz0vbQBpdGCYvY9l5id4VrjRs/gbjBxuM70va1gpwh6afzc+2e2nBQmHYKJQtGSaLsrZWSU8Bh2dx3EupUJJsmKp/Z/JwrdhSvz0kSqlnXSPb1qby/KEh8W1ZfX29VqvNKbDurtafHJwS8MKJuT0yjFrhbUYiUdBCNkzeafFWkhEnKae+wla2g9VZX5G14RrXe8q2W/qzFKVUHra0iM+6zOFKIU9fIdgS1ujA67eWIJbUyNPKldo2QVm/RFHmzXuaQWtoer+kQ0k9crWd5uGqNXJErB31FW8Lfa3FsVPDjcFavf9itodA8s/v6ekR/T0gvcocCOWIWFq1Kh2nxY2NkSS0yNPlUp2XA+dlGo/Vtd4ouG8HBmVwen9rzVHRxzYhQ6WzdXmSSrWlt7OzkzxWCjYrnYVlwRa3U6b4TdhSTyFMMIwxtyXfoiB7N9WlV8EF9/YN7VMqXpqWdshU3q4BId/Q5PvXG4/1pbXjI4tbuCEM1Bm6c3XUL5n31LRWp4mxv7cg2dytcF2iNJpLPeEnS4Yc5nLEUnB7nJ4ZsYhyKEQvi+PedEY7wbG5/TVST7le8DahpE0puOaGeZcVLBa0xGJLwDULIWWy7ZZtMUizY2f4pA8y71IFLXGvmYBXDVuelnOJ0bza/zJjYInotIQ5GDYFSOZPnYdj/TKwBun+7c1ibZYEp5VqA4RaZa8TNEcjHcHMEViSS6tWPdHRmMFEUyJ725I/oCew5NDeTbWNaQyH51n4VC+b/Jc5D21WxpbjfkG8zSnNKQ4ql99jsQKWwJJDTeU6sSrElGwWt2hHBuJHvq2FlMkNBACWKAkxJQuvzdDCtfmWDTO8MwUSoigVYpIbxGdQvjzz7xkGCwnxmc51YpRdhhWDFp4wZeu6bHo+I58031aeyfxeOl3rjaI0ma6Ya0qLxs2OnZlaPh4RK6+aSbNikyYkxHRWeUiy3UGtsmdw7XgAPTT9rDlvdqvLlt2/XuzalL6RX7GHJ7Mt4KFdgwgsOS2ICmylaeQTlPQWx86+yR/T9pZ5B5aC658++PDmdNhK0A5p0A5mw251BFbGisR02GLzeaKdFlvnmC52/oIlClvR07lg27kV/Wx0vfMXrPTZmrLtji7seev6kfIRrBBbVTohDT9sRe5otlR5Ob+PwIrB1k+/t1VYG4TJ1hW9jp47z8YXEFiJ2iBeeqhdQLs8nBbY4rn4OkM37U1PYN1h64VdG5/ZnnJ/Ymj97ZBqDd13p7jbBUmwVKviXe7dVNtWXXao+8qsK1mfxHWhBHdJDZ8ftirWqZJiqUitVqtUKgmsuJbrf/smkl/RdMHbxMt9q6IbWIrFbeWfYr9qwGJpcX/nuh31FW+du5Zk6ILTCp8sqizwybBuUZqSggCZw9UqA4uprVqffOiyOrciJ3IbBSyD2FZ3eGz20WxuiJdicVsy7ymErkOPdyYz2AYJkbc9BGIYKsTSonGDdpCa4yli8cU6rQfM9mN9EwMWR4JnsrW1AFNoLVNUiGput6Ys7JmmDQSyJTMerNaviNfiUtHE3B5YLjZEOFNDowqVK6cI2kAgG/E6MTiVYLFTqbf7SqAqneaJjoauJBp7aQOBbMQLtxmX78yIpXvEknyjl4R2sFDZ2VDZtW4t3lgGq0LyWOJ4L8QG3BDAukdneias7puL8r+NzvoK3HbUV6S0NzaZ91UTwBS7No7Pu5Afv56cE7YPWUr5DmcETChXBfOUG2uQ5sWXqalcx2b0u/0BQAaPj2CGjClKrgRDjdzxgdRaXT7ueZm/YN1xPGrVchjjlo1gnDHCXP5AKJ7xmINPCm0VW1VSBHq0haqmci27L34OpTVIc4QzCi8EVj6IRjeQJBGNbiBJIhrdQJJENLqBRKKItXpkMplEP2ZVVZVarSaw8lpTU1OiHxO+jcDKd9XW1op+TI1G7i4BAivrVFdXlwOfgsw7iSJWfoiGJpMkEQ1NJkkiGppMkkS5MTSZzDuJwCIRWCQCi0QisEgEFinLVVlZSWDloPR6fWFhYabOjlPjDRBYOSiVSnXfffdlhC2cFKfGG5DuFGtu3bpF1ziDCgQC09PTbrdbtjNqtdqamhpJqSKwSJQKSQQWiURgkQgsEoFFIrBIJAKLRGCRCCwSicAiEVgkAotEIrBIBBaJwCKRCCwSgUUisEgkAotEYJEILBKJwCJlq/5fgAEAh/kq2vedWKoAAAAASUVORK5CYII=",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Monday, April 10, 2017