Skip to content

Commit

Permalink
.NET 7 content (#1062)
Browse files Browse the repository at this point in the history
* Maps (#926)

* Map.

* Fix broken links.

* Rename Essentials Map doc.

* Add to TOC.

* Moniker setup.

* Configure monikers.

* Fix range.

* Fix group config.

* Edits.

* Remove hard tabs.

* Remove hard tabs.

* Remove hard tabs.

* StrokeShape default is Rectangle in .NET 7 (#928)

* StrokeShape default changes from null to Rectangle in .NET 7.0

* Remove blank lines from UL.

* Move the text outside of the UL.

* App lifecycle updates (#960)

* .NET 7 iOS lifecycle additions.

* Fix tables.

* Edit.

* Edit.

* Remove monikers.

* Fix.

* Re-add table without scene kit.

* Restore full table.

* Edit.

* Backgrounding and DisplayDensityChanged event explanations.

* Edit.

* Tooltip support for views (#961)

* Tooltips.

* Limit to .NET 7 moniker.

* Edit.

* Clarify tooltip use on iOS.

* Pointer gesture recognizer (#962)

* Add more info to troubleshooting area (#921)

* update troubleshooting

* minor

* Fix local file playback on iOS/Mac Catalyst. (#923)

* Update troubleshooting.md (#925)

* Add Azure mobile apps MAUI quickstart link (#954)

* Typo fix - update to create a custom control using handlers article (#957)

- Fix case of (ReplaceCurrentItemWIthPlayerItem).
- Change (These requirements imply that that video...) to (These requirements imply that video...).

* Add links to each step's code in the tutorial (#955)

* adjust code; add link to sample

* Update gitignore to include vscode

* Update AllNotes.cs

* Pointer gesture recognizer.

* Edit.

* Edits.

* Use moniker.

* Expand section on GetPosition

* Edit.

Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com>
Co-authored-by: Muhab Abdelreheem <mabdulrahim2@outlook.sa>

* Tap gesture recognizer secondary button mask (#963)

* Secondary button mask on Mac and Windows.

* Edits.

* Fix link.

* Fix bookmark.

* Edit.

* Fix linting error.

* Menu item separators (#968)

* Menu separators.

* Fix monikers.

* Edit image.

* Context menu (#971)

* Context menus.

* Add section on displaying menu item icons.

* Edits.

* Fix linting errors.

* Add Windows warning. (#982)

* Window position and size (#984)

* Position and size a window.

* Remove OnDisplayDensityChanged

* Edit.

* Remove hard tabs.

* Specify WKWebViewConfiguration object on MauiMKWebView constructor (#988)

* MauiWKWebView configuration on iOS/Mac Catalyst.

* Edit.

* Edits.

* Move section.

* [NET 7] Remove the note about clean and redeploy to fix icons  (#983)

* remove workaround no longer needed

* swap delete to moniker

* .NET 7 doesn't require a subclassed AndroidMessageHandler (#1024)

* PointerOver visual state (#1027)

* Add PointerOver visual state.

* Fix typo.

* .NET 7 essentials updates (#1033)

* Unpackaged apps store data in a different location.

* Coarse or fine location can be specified on Android in .NET 7.

* Edit.

* Update date.

* No capabilities required on Window in .NET 7.

* Edit.

* Extend docs to include net7-based TFMs (#1049)

* Add .NET 7 support.

* Edit.

* Fix numbering.

* Add .NET 7 support.

* Edit.

* Edits.

* Fixes.

* Edit.

* Edit.

* Add .NET 7 support.

* Add .NET 7 support.

* More .NET 7.

* More .NET 7

* Fix typo.

* Remove moniker because you still need to clean the project.

* Fix linting error.

* .NET 7 updates (#1053)

* Update installation for .NET 7.

* Fix broken link.

* VSMac update.

* Test .NET 6/7 selector.

* Test

* Test

* Edits.

* Edits.

* New installations will have iOS/Android auto-selected.

* Update screenshots.

* Remove space in monikers.

* Fix sample link.

* Foldable devices with .NET MAUI (#1057)

* [foldable] TwoPaneView doc

* [foldable] address markdownlint warnings

* [foldable] address markdownlint warning

* [foldable] update sample link

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* [foldable] impl review feedback

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Update docs/user-interface/controls/twopaneview.md

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

Co-authored-by: David Britch <davidbritch@users.noreply.github.com>

* Deprecate MessagingCenter.

* Move note.

Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com>
Co-authored-by: Muhab Abdelreheem <mabdulrahim2@outlook.sa>
Co-authored-by: Craig Dunn <craig.dunn@microsoft.com>
  • Loading branch information
4 people authored Nov 8, 2022
1 parent e368836 commit 52074c2
Show file tree
Hide file tree
Showing 77 changed files with 2,551 additions and 178 deletions.
4 changes: 3 additions & 1 deletion .openpublishing.publish.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
"build_output_subfolder": "docs-maui-public",
"locale": "en-us",
"monikers": [],
"moniker_ranges": [],
"moniker_ranges": [
">=net-maui-6.0"
],
"open_to_public_contributors": true,
"xref_query_tags": [
"/dotnet",
Expand Down
4 changes: 4 additions & 0 deletions .openpublishing.redirection.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
{
"source_path": "docs/fundamentals/app-startup.md",
"redirect_url": "/dotnet/maui/fundamentals/single-project#app-entry-point"
},
{
"source_path": "docs/user-interface/menubar.md",
"redirect_url": "/dotnet/maui/user-interface/menu-bar"
}
]
}
18 changes: 15 additions & 3 deletions docs/TOC.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@
href: fundamentals/gestures/pan.md
- name: Pinch
href: fundamentals/gestures/pinch.md
- name: Pointer
href: fundamentals/gestures/pointer.md
- name: Swipe
href: fundamentals/gestures/swipe.md
- name: Tap
Expand Down Expand Up @@ -267,6 +269,8 @@
href: user-interface/controls/image.md
- name: Label
href: user-interface/controls/label.md
- name: Map
href: user-interface/controls/map.md
- name: ScrollView
href: user-interface/controls/scrollview.md
- name: Shapes
Expand Down Expand Up @@ -379,10 +383,12 @@
href: user-interface/controls/tableview.md
- name: ContentView
href: user-interface/controls/contentview.md
- name: Display a menu bar
href: user-interface/menubar.md
- name: TwoPaneView
href: user-interface/controls/twopaneview.md
- name: Display pop-ups
href: user-interface/pop-ups.md
- name: Display tooltips
href: user-interface/tooltips.md
- name: Fonts
href: user-interface/fonts.md
- name: Graphics
Expand Down Expand Up @@ -411,6 +417,12 @@
href: user-interface/images/images.md
- name: Splash screen
href: user-interface/images/splashscreen.md
- name: Menus
items:
- name: Display a context menu
href: user-interface/context-menu.md
- name: Display a menu bar
href: user-interface/menu-bar.md
- name: Shadows
href: user-interface/shadow.md
- name: Styles
Expand Down Expand Up @@ -447,7 +459,7 @@
href: platform-integration/appmodel/launcher.md
- name: Main thread
href: platform-integration/appmodel/main-thread.md
- name: Maps
- name: Map
href: platform-integration/appmodel/maps.md
- name: Permissions
href: platform-integration/appmodel/permissions.md
Expand Down
18 changes: 17 additions & 1 deletion docs/android/deployment/publish-cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,14 +118,16 @@ To publish your app, open a terminal and navigate to the folder for your .NET MA

| Parameter | Value |
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
| `-f` or `--framework` | The target framework, which is `net6.0-android`. |
| `-f` or `--framework` | The target framework, which is `net6.0-android` or `net7.0-android`. |
| `-c` or `--configuration` | The build configuration, which is `Release`. |
| `/p:AndroidSigningKeyPass` | This is the value used for the `<AndroidSigningKeyPass>` project setting, the password you provided when you created the keystore file. |
| `/p:AndroidSigningStorePass` | This is the value used for the `<AndroidSigningStorePass>` project setting, the password you provided when you created the keystore file. |

> [!WARNING]
> Attempting to publish a .NET MAUI solution will result in the `dotnet publish` command attempting to publish each project in the solution individually, which can cause issues when you've added other project types to your solution. Therefore, the `dotnet publish` command should be scoped to your .NET MAUI app project.
::: moniker range="=net-maui-6.0"

For example:

```console
Expand All @@ -134,6 +136,20 @@ dotnet publish -f:net6.0-android -c:Release /p:AndroidSigningKeyPass=mypassword

Publishing builds the app, and then copies the _aab_ and _apk_ files to the _bin\\Release\\net6.0-android\\publish_ folder. There are two _aab_ files, one unsigned and another signed. The signed variant has **-signed** in the file name.

::: moniker-end

::: moniker range="=net-maui-7.0"

For example:

```console
dotnet publish -f:net7.0-android -c:Release /p:AndroidSigningKeyPass=mypassword /p:AndroidSigningStorePass=mypassword
```

Publishing builds the app, and then copies the _aab_ and _apk_ files to the _bin\\Release\\net7.0-android\\publish_ folder. There are two _aab_ files, one unsigned and another signed. The signed variant has **-signed** in the file name.

::: moniker-end

For more information about the `dotnet publish` command, see [dotnet publish](/dotnet/core/tools/dotnet-publish).

To learn how to upload a signed Android App Bundle to the Google Play Store, see [Upload your app to the Play Console](https://developer.android.com/studio/publish/upload-bundle).
Expand Down
50 changes: 48 additions & 2 deletions docs/data-cloud/local-web-services.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: "Connect to local web services from Android emulators and iOS simulators"
description: "Learn how a .NET MAUI app running in the Android emulator or iOS simulator can consume a ASP.NET Core web service running locally."
ms.date: 06/22/2022
ms.date: 10/21/2022
---

# Connect to local web services from Android emulators and iOS simulators
Expand Down Expand Up @@ -159,6 +159,8 @@ This can be accomplished by passing configured versions of the native `HttpMessa

The following example shows a class that configures the `AndroidMessageHandler` class on Android and the `NSUrlSessionHandler` class on iOS to trust localhost communication over HTTPS:

::: moniker range="=net-maui-6.0"

```csharp
public class HttpsClientHandlerService
{
Expand Down Expand Up @@ -210,7 +212,51 @@ public class HttpsClientHandlerService
}
```

On Android, the `GetPlatformMessageHandler` method returns a `CustomAndroidMessageHandler` object that derives from `AndroidMessageHandler`. The `GetPlatformMessageHandler` method sets the `ServerCertificateCustomValidationCallback` property on a `CustomAndroidMessageHandler` object to a callback that ignores the result of the certificate security check for the local HTTPS development certificate.
On Android, the `GetPlatformMessageHandler` method returns a `CustomAndroidMessageHandler` object that derives from `AndroidMessageHandler`. The `GetPlatformMessageHandler` method sets the `ServerCertificateCustomValidationCallback` property on the `CustomAndroidMessageHandler` object to a callback that ignores the result of the certificate security check for the local HTTPS development certificate.

::: moniker-end

::: moniker range=">=net-maui-7.0"

```csharp
public class HttpsClientHandlerService
{
public HttpMessageHandler GetPlatformMessageHandler()
{
#if ANDROID
var handler = new Xamarin.Android.Net.AndroidMessageHandler();
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
{
if (cert != null && cert.Issuer.Equals("CN=localhost"))
return true;
return errors == System.Net.Security.SslPolicyErrors.None;
};
return handler;
#elif IOS
var handler = new NSUrlSessionHandler
{
TrustOverrideForUrl = IsHttpsLocalhost
};
return handler;
#else
throw new PlatformNotSupportedException("Only Android and iOS supported.");
#endif
}

#if IOS
public bool IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust trust)
{
if (url.StartsWith("https://localhost"))
return true;
return false;
}
#endif
}
```

On Android, the `GetPlatformMessageHandler` method returns an `AndroidMessageHandler` object. The `GetPlatformMessageHandler` method sets the `ServerCertificateCustomValidationCallback` property on the `AndroidMessageHandler` object to a callback that ignores the result of the certificate security check for the local HTTPS development certificate.

::: moniker-end

On iOS, the `GetPlatformMessageHandler` method returns a `NSUrlSessionHandler` object that sets its `TrustOverrideForUrl` property to a delegate named `IsHttpsLocalHost` that matches the signature of the `NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback` delegate. The `IsHttpsLocalHost` delegate returns `true` when the URL starts with `https://localhost`.

Expand Down
6 changes: 3 additions & 3 deletions docs/deployment/visual-studio-properties.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ The **Application** section describes some settings related to which platforms y
| Setting | Default value | Description |
| - | - | - |
| Target the iOS platform | Checked | Specifies that this project will target the iOS platform. |
| Target iOS Framework | `net6.0-ios` | The [Target Framework Moniker][tfm] used to target iOS.
| Target iOS Framework | `net6.0-ios` or `net7.0-ios` | The [Target Framework Moniker][tfm] used to target iOS.
| Minimum Target iOS Framework | `14.2` | The minimum version of iOS your app targets.

- **Android Targets**
Expand All @@ -38,7 +38,7 @@ The **Application** section describes some settings related to which platforms y
| Setting | Default value | Description |
| - | - | - |
| Target the Android platform | Checked | When checked, the .NET MAUI project will target and build an Android version of your app. Uncheck to disable the Android target. |
| Target Android Framework | `net6.0-android` | The [Target Framework Moniker][tfm] used to target Android.
| Target Android Framework | `net6.0-android` or `net7.0-android` | The [Target Framework Moniker][tfm] used to target Android.
| Minimum Target Android Framework | `21.0` | The minimum version of Android your app targets.

- **Windows Targets**
Expand All @@ -48,7 +48,7 @@ The **Application** section describes some settings related to which platforms y
| Setting | Default value | Description |
| - | - | - |
| Target the Windows platform | Checked | When checked, the .NET MAUI project will target and build a Windows version of your app. Uncheck to disable the Windows target. |
| Target Windows Framework | `net6.0-windows10.0.19041.0` | The [Target Framework Moniker][tfm] used to target Windows.
| Target Windows Framework | `net6.0-windows10.0.19041.0` or `net7.0-windows10.0.19041.0` | The [Target Framework Moniker][tfm] used to target Windows.
| Minimum Target Windows Framework | `10.0.17763.0` | The minimum version of Windows your app targets.

## Build
Expand Down
16 changes: 13 additions & 3 deletions docs/docfx.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
"LICENSE",
"LICENSE-CODE",
"ThirdPartyNotices.md"
]
],
"group": "net",
"src": "."
}
],
"resource": [
Expand All @@ -36,7 +38,9 @@
"_themes.pdf/**",
"**/docfx.json",
"_repo.en-us/**"
]
],
"group": "net",
"src": "."
}
],
"overwrite": [],
Expand Down Expand Up @@ -64,6 +68,12 @@
},
"template": [],
"dest": "docs-maui-public",
"markdownEngineName": "markdig"
"markdownEngineName": "markdig",
"groups": {
"net": {
"dest": "net-dest",
"moniker_range": ">=net-maui-6.0"
}
}
}
}
42 changes: 41 additions & 1 deletion docs/fundamentals/app-lifecycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,17 @@ These cross-platform events map to different platform events, and the following
| `Resumed` | `OnRestart` | `WillEnterForeground` | `Resumed` |
| `Destroying` | `OnDestroy` | `WillTerminate` | `Closed` |

In addition to these events, the `Window` class also has the following overridable methods:
In addition, the `Windows` class also defines a `Backgrounding` event that's raised on iOS and Mac Catalyst when the Window is closed or enters a background state. A `BackgroundingEventArgs` object accompanies this event, and any `string` state should be persisted to the `State` property of the `BackgroundingEventArgs` object, which the OS will preserve until it's time to resume the window. When the window is resumed the state is provided by the `IActivationState` argument to the `CreateWindow` override.

In addition to these events, the `Window` class also has the following overridable lifecycle methods:

- `OnCreated`, which is invoked when the `Created` event is raised.
- `OnActivated`, which is invoked when the `Activated` event is raised.
- `OnDeactivated`, which is invoked when the `Deactivated` event is raised.
- `OnStopped`, which is invoked when the `Stopped` event is raised.
- `OnResumed`, which is invoked when the `Resumed` event is raised.
- `OnDestroying`, which is invoked when the `Destroying` event is raised.
- `OnBackgrounding`, which is invoked when the `Backgrounding` event is raised.

To subscribe to the `Window` lifecycle events, override the `CreateWindow` method in your `App` class to create a `Window` instance on which you can subscribe to events:

Expand Down Expand Up @@ -189,18 +192,55 @@ For more information about the Android app lifecycle, see [Understand the Activi

The following table lists the .NET MAUI delegates that are invoked in response to iOS lifecycle events being raised:

::: moniker range="=net-maui-6.0"

| Delegate | Arguments | Description |
| -- | -- | -- |
| `ContinueUserActivity` | `UIKit.UIApplication`, `Foundation.NSUserActivity`, `UIKit.UIApplicationRestorationHandler` | Invoked when the app receives data associated with a user activity, such as transferring an activity from a different device using Handoff. |
| `DidEnterBackground` | `UIKit.UIApplication` | Invoked when the app has entered the background. |
| `FinishedLaunching` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when the app has launched. |
| `OnActivated` | `UIKit.UIApplication` | Invoked when the app is launched and every time the app returns to the foreground. |
| `OnResignActivation` | `UIKit.UIApplication` | Invoked when the app is about to enter the background, be suspended, or when the user receives an interruption such as a phone call or text. |
| `OpenUrl` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when the app should open a specified URL. |
| `PerformActionForShortcutItem` | `UIKit.UIApplication`, `UIKit.UIApplicationShortcutItem`, `UIKit.UIOperationHandler` | Invoked when a Home screen quick action is initiated. |
| `SceneDidDisconnect` | `UIKit.UIScene` | Invoked when a scene is removed from the app. |
| `SceneWillConnect` | `UIKit.UIScene`, `UIKit.UISceneSession`, `UIKit.UISceneConnectionOptions` | Invoked when a scene is added to the app. |
| `WillEnterForeground` | `UIKit.UIApplication` | Invoked if the app will be returning from a backgrounded state. |
| `WillFinishLaunching` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when app launching has begun, but state restoration has not yet occurred. |
| `WillTerminate` | `UIKit.UIApplication` | Invoked if the app is being terminated due to memory constraints, or directly by the user. |

::: moniker-end

::: moniker range=">=net-maui-7.0"

| Delegate | Arguments | Description |
| -- | -- | -- |
| `ApplicationSignificantTimeChange` | `UIKit.UIApplication` | Invoked when a significant time change occurs, such as midnight, carrier-changed time, or the start or stop of daylight savings. |
| `ContinueUserActivity` | `UIKit.UIApplication`, `Foundation.NSUserActivity`, `UIKit.UIApplicationRestorationHandler` | Invoked when the app receives data associated with a user activity, such as transferring an activity from a different device using Handoff. |
| `DidEnterBackground` | `UIKit.UIApplication` | Invoked when the app has entered the background. |
| `FinishedLaunching` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when the app has launched. |
| `OnActivated` | `UIKit.UIApplication` | Invoked when the app is launched and every time the app returns to the foreground. |
| `OnResignActivation` | `UIKit.UIApplication` | Invoked when the app is about to enter the background, be suspended, or when the user receives an interruption such as a phone call or text. |
| `OpenUrl` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when the app should open a specified URL. |
| `PerformActionForShortcutItem` | `UIKit.UIApplication`, `UIKit.UIApplicationShortcutItem`, `UIKit.UIOperationHandler` | Invoked when a Home screen quick action is initiated. |
| `SceneContinueUserActivity` | `UIKit.UIScene`, `Foundation.NSUserActivity` | Invoked to handle the specified Handoff-related activity. |
| `SceneDidDisconnect` | `UIKit.UIScene` | Invoked when a scene is removed from the app. |
| `SceneDidEnterBackground` | `UIKit.UIScene` | Invoked when a scene is running in the background and isn't onscreen. |
| `SceneDidFailToContinueUserActivity` | `UIKit.UIScene`, `string`, `Foundation.NSError` | Invoked to inform the user that the activity couldn't be completed. |
| `SceneDidUpdateUserActivity` | `UIKit.UIScene`, `Foundation.NSUserActivity` | Invoked when the specified activity is updated. |
| `SceneOnActivated` | `UIKit.UIScene` | Invoked when the scene becomes active and able to respond to user events. |
| `SceneOnResignActivation` | `UIKit.UIScene` | Invoked when the scene is about to resign the active state and stop responding to user events. |
| `SceneOpenUrl` | `UIKit.UIScene`, `Foundation.NSSet<UIKit.UIOpenUrlContext>` | Invoked when a scene asks to open one or more URLs. |
| `SceneRestoreInteractionState` | `UIKit.UIScene`, `Foundation.NSUserActivity` | Invoked to restore the activity state. |
| `SceneWillConnect` | `UIKit.UIScene`, `UIKit.UISceneSession`, `UIKit.UISceneConnectionOptions` | Invoked when a scene is added to the app. |
| `SceneWillContinueUserActivity` | `UIKit.UIScene`, `string` | Invoked to prepare to receive Handoff-related data. |
| `SceneWillEnterForeground` | `UIKit.UIScene` | Invoked when a scene is about to run in the foreground and become visible to the user. |
| `WillEnterForeground` | `UIKit.UIApplication` | Invoked if the app will be returning from a backgrounded state. |
| `WillFinishLaunching` | `UIKit.UIApplication`, `Foundation.NSDictionary` | Invoked when app launching has begun, but state restoration has not yet occurred. |
| `WillTerminate` | `UIKit.UIApplication` | Invoked if the app is being terminated due to memory constraints, or directly by the user. |
| `WindowSceneDidUpdateCoordinateSpace` | `UIKit.UIWindowScene`, `UIKit.IUICoordinateSpace`, `UIKit.UIInterfaceOrientation`, `UIKit.UITraitCollection` | Invoked when the size, orientation, or traits of a scene change. |

::: moniker-end

> [!IMPORTANT]
> Each delegate has a corresponding identically named extension method, that can be called to register a handler for the delegate.
Expand Down
Loading

0 comments on commit 52074c2

Please sign in to comment.