Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
dustinmoris committed Aug 18, 2018
2 parents 4b5852e + 67b79f4 commit 6211728
Show file tree
Hide file tree
Showing 44 changed files with 1,987 additions and 669 deletions.
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
* text=auto
* text=auto
*.sh text eol=lf
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ language: csharp
sudo: required
dist: trusty

dotnet: 2.1.4
dotnet: 2.1.400
mono:
- 4.6.1
- 4.8.1
Expand All @@ -16,6 +16,7 @@ before_install:
- curl https://packages.microsoft.com/config/ubuntu/14.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
- sudo apt-get update
- sudo apt-get install -y powershell
- sudo pwsh ./install-dotnet.ps1

script:
- export FrameworkPathOverride=$(dirname $(which mono))/../lib/mono/4.5/
Expand Down
8 changes: 4 additions & 4 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build GoogleAuthApp",
"program": "${workspaceFolder}/samples/GoogleAuthApp/GoogleAuthApp/bin/Debug/netcoreapp2.0/GoogleAuthApp.dll",
"program": "${workspaceFolder}/samples/GoogleAuthApp/GoogleAuthApp/bin/Debug/netcoreapp2.1/GoogleAuthApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"console": "internalConsole",
Expand All @@ -22,7 +22,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build IdentityApp",
"program": "${workspaceFolder}/samples/IdentityApp/IdentityApp/bin/Debug/netcoreapp2.0/IdentityApp.dll",
"program": "${workspaceFolder}/samples/IdentityApp/IdentityApp/bin/Debug/netcoreapp2.1/IdentityApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"console": "internalConsole",
Expand All @@ -35,7 +35,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build JwtApp",
"program": "${workspaceFolder}/samples/JwtApp/JwtApp/bin/Debug/netcoreapp2.0/JwtApp.dll",
"program": "${workspaceFolder}/samples/JwtApp/JwtApp/bin/Debug/netcoreapp2.1/JwtApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"console": "internalConsole",
Expand All @@ -48,7 +48,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build SampleApp",
"program": "${workspaceFolder}/samples/SampleApp/SampleApp/bin/Debug/netcoreapp2.0/SampleApp.dll",
"program": "${workspaceFolder}/samples/SampleApp/SampleApp/bin/Debug/netcoreapp2.1/SampleApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"console": "internalConsole",
Expand Down
71 changes: 69 additions & 2 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,7 @@ The following sub modules and status code `HttpHandler` functions are available
| 201 | CREATED | `route "/" >=> Successful.CREATED someObj` |
| 202 | accepted | `route "/" >=> Successful.accepted (xml someObj)` |
| 202 | ACCEPTED | `route "/" >=> Successful.ACCEPTED someObj` |
| 204 | NO_CONTENT | `route "/" >=> Successful.NO_CONTENT` |

#### RequestErrors

Expand Down Expand Up @@ -1141,7 +1142,7 @@ let someHttpHandler : HttpHandler =

You can also access the query string through the `ctx.Request.Query` object which returns an `IQueryCollection` object which allows you to perform more actions on it.

Last but not least there is also a `HttpContext` extension method called `BindQueryString<'T>` which let's you bind an entire query string to an object of type `'T` (see [BindQueryString](#bindquerystring)).
Last but not least there is also a `HttpContext` extension method called `BindQueryString<'T>` which let's you bind an entire query string to an object of type `'T` (see [Binding Query Strings](#binding-query-strings)).

### Model Binding

Expand Down Expand Up @@ -1954,6 +1955,70 @@ let webApp =
]
```

#### evaluateUserPolicy

The `evaluateUserPolicy (policy : ClaimsPrincipal -> bool) (authFailedHandler : HttpHandler)` http handler checks if an authenticated user meets a given user policy. If the policy cannot be satisfied then the `authFailedHandler` will be executed:

```fsharp
let notLoggedIn =
RequestErrors.UNAUTHORIZED
"Basic"
"Some Realm"
"You must be logged in."
let accessDenied = setStatusCode 401 >=> text "Access Denied"
let mustBeLoggedIn = requiresAuthentication notLoggedIn
let mustBeJohn =
evaluateUserPolicy (fun u -> u.HasClaim (ClaimTypes.Name, "John")) accessDenied
let webApp =
choose [
route "/" >=> text "Hello World"
route "/john-only"
>=> mustBeLoggedIn
>=> mustBeJohn
>=> userHandler
]
```

#### authorizeByPolicyName

The `authorizeByPolicyName (policyName : string) (authFailedHandler : HttpHandler)` http handler checks if an authenticated user meets a given authorization policy. If the policy cannot be satisfied then the `authFailedHandler` will be executed:

```fsharp
let notLoggedIn =
RequestErrors.UNAUTHORIZED
"Basic"
"Some Realm"
"You must be logged in."
let accessDenied = setStatusCode 401 >=> text "Access Denied"
let mustBeLoggedIn = requiresAuthentication notLoggedIn
let mustBeOver21 =
authorizeByPolicyName "MustBeOver21" accessDenied
let webApp =
choose [
route "/" >=> text "Hello World"
route "/adults-only"
>=> mustBeLoggedIn
>=> mustBeOver21
>=> userHandler
]
```

#### authorizeByPolicy

The `authorizeByPolicy (policy : AuthorizationPolicy) (authFailedHandler : HttpHandler)` http handler checks if an authenticated user meets a given authorization policy. If the policy cannot be satisfied then the `authFailedHandler` will be executed.

See [authorizeByPolicyName](#authorizebypolicyname) for more information.

#### challenge

The `challenge (authScheme : string)` http handler will challenge the client to authenticate with a specific `authScheme`. This function is often used in combination with the `requiresAuthentication` http handler:
Expand Down Expand Up @@ -2536,6 +2601,8 @@ The second category of attributes are `Boolean` flags. There are not many but so
script [ _src "some.js"; _async ] []
```

There's also a wealth of [accessibility attributes](https://www.w3.org/TR/html-aria/) available under the `Giraffe.GiraffeViewEngine.Accessibility` module (needs to be explicitly opened).

### Text Content

Naturally the most frequent content in any HTML document is pure text:
Expand Down Expand Up @@ -3574,4 +3641,4 @@ module HttpHandlers =
let! handler = f a
return! handler next ctx
}
```
```
169 changes: 169 additions & 0 deletions Giraffe.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9E892FBB-74FD-464B-8939-6E4D9D70D99D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{152E856C-48EA-42A1-A5F4-960819BEC170}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "Giraffe", "src\Giraffe\Giraffe.fsproj", "{A16935F3-2E48-4D38-B08C-36E5ADE3B199}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "Giraffe.Tests", "tests\Giraffe.Tests\Giraffe.Tests.fsproj", "{2AF14B8E-56FF-4E54-99DA-C530D573814D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{34A76D42-035A-4CD1-85B2-EC01D9CE3571}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_misc", "_misc", "{CE10552A-F0F8-4C51-9CCF-4B0F160351E8}"
ProjectSection(SolutionItems) = preProject
giraffe-64x64.png = giraffe-64x64.png
giraffe.png = giraffe.png
jmeter-load-test.jmx = jmeter-load-test.jmx
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_docs", "_docs", "{39555F35-F514-4521-A3CC-1CFF95ED581E}"
ProjectSection(SolutionItems) = preProject
DOCUMENTATION.md = DOCUMENTATION.md
LICENSE = LICENSE
README.md = README.md
RELEASE_NOTES.md = RELEASE_NOTES.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_build", "_build", "{8F5B7963-8206-47B1-AD19-900229E2FBF5}"
ProjectSection(SolutionItems) = preProject
appveyor.yml = appveyor.yml
build.ps1 = build.ps1
build.sh = build.sh
global.json = global.json
NuGet.config = NuGet.config
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SampleApp", "SampleApp", "{E3500770-59F9-4526-9FFA-73E725C0008F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JwtApp", "JwtApp", "{8AC0E934-6177-4D6D-9520-6E0931E527B9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IdentityApp", "IdentityApp", "{3EE9B6D3-7ED6-43EE-9237-39E069042C65}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GoogleAuthApp", "GoogleAuthApp", "{53C796EB-20D2-4AF9-AAB9-130150005E21}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "GoogleAuthApp", "samples\GoogleAuthApp\GoogleAuthApp\GoogleAuthApp.fsproj", "{FE396475-56EA-48AC-87B8-97EF6A66612F}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "IdentityApp", "samples\IdentityApp\IdentityApp\IdentityApp.fsproj", "{3AAA2ECF-350F-4574-925F-21A909F41F42}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "JwtApp", "samples\JwtApp\JwtApp\JwtApp.fsproj", "{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "SampleApp", "samples\SampleApp\SampleApp\SampleApp.fsproj", "{61E7381C-C021-4048-A6F3-542E190F0D48}"
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "SampleApp.Tests", "samples\SampleApp\SampleApp.Tests\SampleApp.Tests.fsproj", "{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|x64.ActiveCfg = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|x64.Build.0 = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|x86.ActiveCfg = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Debug|x86.Build.0 = Debug|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|Any CPU.Build.0 = Release|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|x64.ActiveCfg = Release|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|x64.Build.0 = Release|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|x86.ActiveCfg = Release|Any CPU
{A16935F3-2E48-4D38-B08C-36E5ADE3B199}.Release|x86.Build.0 = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|x64.ActiveCfg = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|x64.Build.0 = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|x86.ActiveCfg = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Debug|x86.Build.0 = Debug|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|Any CPU.Build.0 = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|x64.ActiveCfg = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|x64.Build.0 = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|x86.ActiveCfg = Release|Any CPU
{2AF14B8E-56FF-4E54-99DA-C530D573814D}.Release|x86.Build.0 = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|x64.ActiveCfg = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|x64.Build.0 = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|x86.ActiveCfg = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Debug|x86.Build.0 = Debug|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|Any CPU.Build.0 = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|x64.ActiveCfg = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|x64.Build.0 = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|x86.ActiveCfg = Release|Any CPU
{FE396475-56EA-48AC-87B8-97EF6A66612F}.Release|x86.Build.0 = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|x64.ActiveCfg = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|x64.Build.0 = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|x86.ActiveCfg = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Debug|x86.Build.0 = Debug|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|Any CPU.Build.0 = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|x64.ActiveCfg = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|x64.Build.0 = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|x86.ActiveCfg = Release|Any CPU
{3AAA2ECF-350F-4574-925F-21A909F41F42}.Release|x86.Build.0 = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|x64.ActiveCfg = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|x64.Build.0 = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|x86.ActiveCfg = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Debug|x86.Build.0 = Debug|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|Any CPU.Build.0 = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|x64.ActiveCfg = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|x64.Build.0 = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|x86.ActiveCfg = Release|Any CPU
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7}.Release|x86.Build.0 = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|x64.ActiveCfg = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|x64.Build.0 = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|x86.ActiveCfg = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Debug|x86.Build.0 = Debug|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|Any CPU.Build.0 = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|x64.ActiveCfg = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|x64.Build.0 = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|x86.ActiveCfg = Release|Any CPU
{61E7381C-C021-4048-A6F3-542E190F0D48}.Release|x86.Build.0 = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|x64.ActiveCfg = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|x64.Build.0 = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|x86.ActiveCfg = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Debug|x86.Build.0 = Debug|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|Any CPU.Build.0 = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|x64.ActiveCfg = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|x64.Build.0 = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|x86.ActiveCfg = Release|Any CPU
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{A16935F3-2E48-4D38-B08C-36E5ADE3B199} = {9E892FBB-74FD-464B-8939-6E4D9D70D99D}
{2AF14B8E-56FF-4E54-99DA-C530D573814D} = {152E856C-48EA-42A1-A5F4-960819BEC170}
{E3500770-59F9-4526-9FFA-73E725C0008F} = {34A76D42-035A-4CD1-85B2-EC01D9CE3571}
{8AC0E934-6177-4D6D-9520-6E0931E527B9} = {34A76D42-035A-4CD1-85B2-EC01D9CE3571}
{3EE9B6D3-7ED6-43EE-9237-39E069042C65} = {34A76D42-035A-4CD1-85B2-EC01D9CE3571}
{53C796EB-20D2-4AF9-AAB9-130150005E21} = {34A76D42-035A-4CD1-85B2-EC01D9CE3571}
{FE396475-56EA-48AC-87B8-97EF6A66612F} = {53C796EB-20D2-4AF9-AAB9-130150005E21}
{3AAA2ECF-350F-4574-925F-21A909F41F42} = {3EE9B6D3-7ED6-43EE-9237-39E069042C65}
{BCD0E9C4-62AB-45B2-8362-A7AD1E4C03A7} = {8AC0E934-6177-4D6D-9520-6E0931E527B9}
{61E7381C-C021-4048-A6F3-542E190F0D48} = {E3500770-59F9-4526-9FFA-73E725C0008F}
{A878E197-31F3-4DBB-B8CC-6FBB4A53733E} = {E3500770-59F9-4526-9FFA-73E725C0008F}
EndGlobalSection
EndGlobal
Loading

0 comments on commit 6211728

Please sign in to comment.