diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4fae635..4b75ca2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -35,18 +35,332 @@ jobs: msbuild -t:Restore -p:Configuration=Release ./pack.ps1 -PackageOutputPath $packageOutputPath - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: packages path: ${{ env.RESULT_DIR }} + - name: Build Android APK + run: dotnet publish sample -c Release -f net9.0-android -p:RunAOTCompilation=true -p:AndroidPackageFormat=apk + - name: Upload Android APK artifact + uses: actions/upload-artifact@v4 + with: + name: android-apk + path: sample/bin/Release/net9.0-android/publish + + - name: Build Android Test Runner + run: dotnet publish tests/ui/android/UITests.Android.csproj -c Release -f net9.0 -o android-test-runner + + - name: Upload Android Test Runner artifact + uses: actions/upload-artifact@v4 + with: + name: android-test-runner + path: android-test-runner + - name: Build Windows sample + run: + dotnet publish sample -f net9.0-windows10.0.19041.0 -r win-x64 -p:WindowsPackageType=None -p:UseMonoRuntime=false -o windows-app + - name: Upload Windows sample artifact + uses: actions/upload-artifact@v4 + with: + name: windows-app + path: windows-app + - name: Build Windows test runner + run: dotnet publish tests/ui/windows -c Release -f net9.0 -o windows-test-runner + - name: Upload Windows test runner artifact + uses: actions/upload-artifact@v4 + with: + name: windows-test-runner + path: windows-test-runner + + build_ios_tests: + runs-on: macos-15 + needs: [build] + timeout-minutes: 60 + steps: + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Choose XCode 16.4 + run: | + ls /Applications | grep Xcode + sudo xcode-select -p + sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + global-json-file: global.json + source-url: "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Install MAUI workloads + run: | + dotnet workload restore + + - name: Build iOS for Simulator + run: dotnet build sample -c Release -f net9.0-ios -p:RuntimeIdentifier=iossimulator-arm64 -p:PublishAot=false + + - name: Build iOS Test Runner + run: dotnet publish tests/ui/ios/UITests.iOS.csproj -c Release -f net9.0 -o ios-test-runner + + - name: Upload iOS Test Runner artifact + uses: actions/upload-artifact@v4 + with: + name: ios-test-runner + path: ios-test-runner + - name: Upload iOS App artifact + uses: actions/upload-artifact@v4 + with: + name: ios-app + path: sample/bin/Release/net9.0-ios/iossimulator-arm64/* + + run_ios_tests: + runs-on: macos-15 + needs: [build_ios_tests] + timeout-minutes: 30 + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Choose XCode 16.4 + run: | + ls /Applications | grep Xcode + sudo xcode-select -p + sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + global-json-file: global.json + source-url: "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Download iOS App artifact + uses: actions/download-artifact@v4 + with: + name: ios-app + path: ios-app + + - name: Download iOS Test Runner artifact + uses: actions/download-artifact@v4 + with: + name: ios-test-runner + path: ios-test-runner + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '21' + + - name: Install Appium + run: npm install -g appium + + - name: Install XCUITest driver + run: appium driver install xcuitest + + - name: Start Appium server + run: nohup appium -a 127.0.0.1 -p 4723 > appium_log.txt 2>&1 & + + - name: Start iOS simulator + run: | + # Use iPhone SE (3rd generation) with iOS 18.5 + DEVICE_NAME="iPhone SE (3rd generation)" + IOS_VER="18.5" + # List all simulators and grep for both version and device name + echo "Available simulators:" + xcrun simctl list devices available + + # Find the device ID using a simpler approach + # First try to match both iOS version and device name + DEVICE_ID=$(xcrun simctl list devices available | grep -A 10 "iOS $IOS_VER" | grep "$DEVICE_NAME" | head -1 | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/') + + # If not found, try without version filtering as fallback + if [ -z "$DEVICE_ID" ]; then + echo "Device not found with exact iOS version, falling back to any version" + DEVICE_ID=$(xcrun simctl list devices available | grep "$DEVICE_NAME" | head -1 | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/') + fi + echo "Using simulator: $DEVICE_NAME with ID: $DEVICE_ID" + xcrun simctl boot "$DEVICE_ID" || echo "Simulator may already be booted" + echo "DEVICE_ID=$DEVICE_ID" >> $GITHUB_ENV + echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV + echo "Launched simulator: $DEVICE_NAME with ID: $DEVICE_ID" + + - name: Run Appium UI tests + run: | + export APPIUM_SCREENSHOTS_DIR="$(pwd)/Screenshots" && export APPIUM_RECORD_SCREEN="true" && export IOS_APP_PATH="$(pwd)/ios-app/APES.MAUI.Sample.app" && dotnet test ./ios-test-runner/UITests.iOS.dll --logger "trx;LogFileName=TestResults.trx" + + - name: Upload Test Results + if: always() + uses: actions/upload-artifact@v4 + with: + name: ios-test-results + path: | + **/TestResults.trx + **/Screenshots/*.png + **/Screenshots/*.mp4 + appium_log.txt + + android_ui_tests: + runs-on: ubuntu-latest + needs: [build] + timeout-minutes: 30 + steps: + - name: Enable KVM group permission for Linux runners + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '21' + + - name: Install Appium + run: npm install -g appium + + - name: Install UIAutomator2 driver + run: appium driver install uiautomator2 + + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Download Android APK artifact + uses: actions/download-artifact@v4 + with: + name: android-apk + path: ./android-apk + + - name: Download Appium Test Runner artifact + uses: actions/download-artifact@v4 + with: + name: android-test-runner + path: ./android-test-runner + + + - name: Start Appium server + run: nohup appium -a 127.0.0.1 -p 4723 > appium_log.txt 2>&1 & + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + global-json-file: global.json + + - name: Run Appium UI tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 35 + target: google_apis + arch: x86_64 + force-avd-creation: true + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim + disable-animations: true + script: | + ls -alhR ./android-apk + adb devices + + export APPIUM_SCREENSHOTS_DIR="$(pwd)/Screenshots" && export APPIUM_RECORD_SCREEN="true" && export ANDROID_APP_PATH="$PWD/android-apk/com.apes.maui.sample-Signed.apk" && dotnet test ./android-test-runner/UITests.Android.dll --logger "trx;LogFileName=TestResults.trx" + + - name: Upload Test Results + if: always() + uses: actions/upload-artifact@v4 + with: + name: appium-test-results + path: | + **/TestResults.trx + **/Screenshots/*.png + **/Screenshots/*.mp4 + appium_log.txt + + windows_ui_tests: + runs-on: windows-latest + needs: [build] + timeout-minutes: 30 + steps: + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Download Windows App artifact + uses: actions/download-artifact@v4 + with: + name: windows-app + path: windows-app + - name: Download Windows Test Runner artifact + uses: actions/download-artifact@v4 + with: + name: windows-test-runner + path: windows-test-runner + + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + global-json-file: global.json + source-url: "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" + env: + NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} + - name: Install Appium + run: npm install -g appium + - name: Install Windows driver + run: appium driver install windows + - name: Enable Developer Mode + shell: powershell + run: | + # Enable Developer Mode + reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1" + - name: Download FlaUI.WebDriver + shell: powershell + run: | + # Download FlaUI.WebDriver + $url = "https://github.com/FlaUI/FlaUI.WebDriver/releases/latest/download/FlaUI.WebDriver.exe" + $outputDir = "$env:TEMP\FlaUI" + $outputFile = "$outputDir\FlaUI.WebDriver.exe" + + # Create directory if it doesn't exist + New-Item -ItemType Directory -Force -Path "$outputDir" | Out-Null + + # Download the executable + Invoke-WebRequest -Uri $url -OutFile $outputFile + + # Ensure the executable has proper permissions + Write-Host "Downloaded FlaUI.WebDriver to $outputFile" + + - name: Run Windows UI tests + shell: powershell + run: | + $env:APPIUM_SCREENSHOTS_DIR = "$PWD\Screenshots" + $env:APPIUM_RECORD_SCREEN = "true" + $env:WINDOWS_APP_PATH = "$PWD\windows-app\APES.MAUI.Sample.exe" + $env:APPIUM_LOG_FILE_PATH = "$PWD\appium_log.txt" + $env:FLAUI_HOST = "http://localhost:5000" + + # Start flaui driver + Start-Process -FilePath "$env:TEMP\FlaUI\FlaUI.WebDriver.exe" -ArgumentList "--urls=$FLAUI_HOST" -NoNewWindow -PassThru + + dotnet test ./windows-test-runner/UITests.Windows.dll --logger "trx;LogFileName=TestResults.trx" + - name: Upload Test Results + if: always() + uses: actions/upload-artifact@v4 + with: + name: windows-test-results + path: | + **/TestResults.trx + **/Screenshots/*.png + **/Screenshots/*.mp4 + appium_log.txt + publish_to_github: runs-on: ubuntu-latest - needs: [ build ] + needs: [ build, android_ui_tests, run_ios_tests, windows_ui_tests ] environment: nuget steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: packages path: ${{ env.RESULT_DIR }} @@ -58,15 +372,15 @@ jobs: --skip-duplicate \ --api-key ${GITHUB_TOKEN} env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} publish_to_nuget: runs-on: ubuntu-latest - needs: [ build ] + needs: [ build, android_ui_tests, run_ios_tests, windows_ui_tests ] environment: nuget if: github.base_ref == '' # this would be set only on pull_request builds steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: packages path: ${{ env.RESULT_DIR }} @@ -78,5 +392,3 @@ jobs: --api-key ${NUGET_TOKEN} env: NUGET_TOKEN: ${{ secrets.NUGET_TOKEN }} - - \ No newline at end of file diff --git a/APES.UI.XF.sln b/APES.UI.XF.sln index 02be5b2..6f44dc3 100644 --- a/APES.UI.XF.sln +++ b/APES.UI.XF.sln @@ -7,25 +7,37 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8D069BC7-B62 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{44E54204-4497-43C1-AAF9-43AFFD5FB5F2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{44E54204-4497-43C1-AAF9-43AFFD5FB5F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "APES.UI.XF.Sample.Droid", "samples\APES.UI.XF.Sample.Android\APES.UI.XF.Sample.Droid.csproj", "{5554DA0B-60F6-4597-BC31-1BE586213822}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "unit", "tests\unit\unit.csproj", "{FF8B7181-F526-4624-A4E2-5AA3B809ED79}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "APES.UI.XF.Sample.iOS", "samples\APES.UI.XF.Sample.iOS\APES.UI.XF.Sample.iOS.csproj", "{E14A0543-9A1B-4740-9461-E71BE55382AB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.MAUI", "src\APES.MAUI.csproj", "{53559169-EC01-4D52-9348-092783E9E5F0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.UI.XF.Sample", "samples\APES.UI.XF.Sample\APES.UI.XF.Sample.csproj", "{63FBC12E-B6E2-466C-9A71-CEE149B125C0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.MAUI.Sample", "sample\APES.MAUI.Sample.csproj", "{6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.UI.XF.Tests", "tests\APES.UI.XF.Tests\APES.UI.XF.Tests.csproj", "{FF8B7181-F526-4624-A4E2-5AA3B809ED79}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITests.Android", "tests\ui\android\UITests.Android.csproj", "{D8A45F20-EE39-4010-9DBE-39E61DCB805D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.UI.XF", "src\APES.UI.XF.csproj", "{53559169-EC01-4D52-9348-092783E9E5F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITests.Windows", "tests\ui\windows\UITests.Windows.csproj", "{82241A91-6707-4D7A-8531-D80AE15D844F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "APES.UI.XF.Sample.Mac", "samples\APES.UI.XF.Sample.Mac\APES.UI.XF.Sample.Mac.csproj", "{F3219BAF-5883-4769-B32E-076DDFE71694}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITests.Shared", "tests\ui\shared\UITests.Shared.csproj", "{3A414DF6-84A0-4110-BD99-04232449BA75}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "APES.UI.XF.Sample.UWP", "samples\APES.UI.XF.Sample.UWP\APES.UI.XF.Sample.UWP.csproj", "{BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sln", "sln", "{278630DA-288B-4910-BF01-ED09346C577A}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props + flake.lock = flake.lock + flake.nix = flake.nix + GitVersion.yml = GitVersion.yml + global.json = global.json + LICENSE = LICENSE + nuget.config = nuget.config + pack.ps1 = pack.ps1 + README.md = README.md + shell.nix = shell.nix + shell_fhs.nix = shell_fhs.nix + EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APES.UI.MAUI.Sample", "samples\APES.UI.MAUI.Sample\APES.UI.MAUI.Sample.csproj", "{6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "APES.UI.Sample.Shared", "samples\APES.UI.Samples.Shared\APES.UI.Sample.Shared.csproj", "{7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITests.iOS", "tests\ui\ios\UITests.iOS.csproj", "{35622AC2-6128-41AE-92DF-9ECC68C24B0F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -52,143 +64,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM.Build.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM.Deploy.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM64.Build.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|ARM64.Deploy.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|x64.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|x86.ActiveCfg = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|x86.Build.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Debug|x86.Deploy.0 = Debug|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|Any CPU.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|Any CPU.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|Any CPU.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM64.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM64.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|ARM64.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhone.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhone.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhone.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhoneSimulator.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhoneSimulator.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|iPhoneSimulator.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x64.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x64.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x64.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x86.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x86.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.MonoDroid10|x86.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|Any CPU.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|Any CPU.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM64.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM64.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|ARM64.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhone.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhone.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhone.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x64.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x64.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x64.Deploy.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x86.ActiveCfg = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x86.Build.0 = Release|Any CPU - {5554DA0B-60F6-4597-BC31-1BE586213822}.Release|x86.Deploy.0 = Release|Any CPU - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|ARM64.ActiveCfg = Debug|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|iPhone.ActiveCfg = Debug|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|iPhone.Build.0 = Debug|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|iPhone.Deploy.0 = Debug|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|x64.Build.0 = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|Any CPU.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|Any CPU.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|ARM.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|ARM.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|ARM64.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|ARM64.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|iPhone.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|iPhone.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|x64.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|x64.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|x86.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.MonoDroid10|x86.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|Any CPU.Build.0 = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|ARM.ActiveCfg = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|ARM64.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|iPhone.ActiveCfg = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|iPhone.Build.0 = Release|iPhone - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|x64.ActiveCfg = Release|iPhoneSimulator - {E14A0543-9A1B-4740-9461-E71BE55382AB}.Release|x86.ActiveCfg = Release|iPhoneSimulator - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|ARM.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|ARM.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|ARM64.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|iPhone.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|x64.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|x64.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|x86.ActiveCfg = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Debug|x86.Build.0 = Debug|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|Any CPU.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|Any CPU.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|ARM.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|ARM.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|ARM64.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|ARM64.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|iPhone.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|iPhone.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|iPhoneSimulator.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|iPhoneSimulator.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|x64.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|x64.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|x86.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.MonoDroid10|x86.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|Any CPU.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|ARM.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|ARM.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|ARM64.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|ARM64.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|iPhone.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|iPhone.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|x64.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|x64.Build.0 = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|x86.ActiveCfg = Release|Any CPU - {63FBC12E-B6E2-466C-9A71-CEE149B125C0}.Release|x86.Build.0 = Release|Any CPU {FF8B7181-F526-4624-A4E2-5AA3B809ED79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FF8B7181-F526-4624-A4E2-5AA3B809ED79}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF8B7181-F526-4624-A4E2-5AA3B809ED79}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -273,97 +148,6 @@ Global {53559169-EC01-4D52-9348-092783E9E5F0}.Release|x64.Build.0 = Release|Any CPU {53559169-EC01-4D52-9348-092783E9E5F0}.Release|x86.ActiveCfg = Release|Any CPU {53559169-EC01-4D52-9348-092783E9E5F0}.Release|x86.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|ARM.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|ARM.Build.0 = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|ARM64.Build.0 = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|x64.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|x86.ActiveCfg = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Debug|x86.Build.0 = Debug|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|Any CPU.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|Any CPU.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|ARM.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|ARM.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|ARM64.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|ARM64.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|iPhone.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|iPhone.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|iPhoneSimulator.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|iPhoneSimulator.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|x64.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|x64.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|x86.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.MonoDroid10|x86.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|Any CPU.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|ARM.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|ARM.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|ARM64.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|ARM64.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|iPhone.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|iPhone.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|x64.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|x64.Build.0 = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|x86.ActiveCfg = Release|Any CPU - {F3219BAF-5883-4769-B32E-076DDFE71694}.Release|x86.Build.0 = Release|Any CPU - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|Any CPU.ActiveCfg = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|Any CPU.Build.0 = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|Any CPU.Deploy.0 = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|ARM.ActiveCfg = Debug|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|ARM.Build.0 = Debug|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|ARM.Deploy.0 = Debug|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|ARM64.ActiveCfg = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|iPhone.ActiveCfg = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x64.ActiveCfg = Debug|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x64.Build.0 = Debug|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x64.Deploy.0 = Debug|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x86.ActiveCfg = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x86.Build.0 = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Debug|x86.Deploy.0 = Debug|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|Any CPU.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|Any CPU.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|Any CPU.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM.ActiveCfg = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM.Build.0 = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM.Deploy.0 = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM64.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM64.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|ARM64.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhone.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhone.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhone.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhoneSimulator.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhoneSimulator.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|iPhoneSimulator.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x64.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x64.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x64.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x86.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x86.Build.0 = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.MonoDroid10|x86.Deploy.0 = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|Any CPU.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|Any CPU.Build.0 = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|Any CPU.Deploy.0 = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|ARM.ActiveCfg = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|ARM.Build.0 = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|ARM.Deploy.0 = Release|ARM - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|ARM64.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|iPhone.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|iPhoneSimulator.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x64.ActiveCfg = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x64.Build.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x64.Deploy.0 = Release|x64 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x86.ActiveCfg = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x86.Build.0 = Release|x86 - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44}.Release|x86.Deploy.0 = Release|x86 {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Debug|Any CPU.Build.0 = Debug|Any CPU {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU @@ -407,62 +191,144 @@ Global {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Release|x64.Build.0 = Release|Any CPU {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Release|x86.ActiveCfg = Release|Any CPU {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8}.Release|x86.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|ARM.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|ARM.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|ARM64.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|iPhone.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|x64.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|x64.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|x86.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Debug|x86.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|Any CPU.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|Any CPU.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|ARM.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|ARM.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|ARM64.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|ARM64.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|iPhone.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|iPhone.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|iPhoneSimulator.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|x64.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|x64.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|x86.ActiveCfg = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.MonoDroid10|x86.Build.0 = Debug|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|Any CPU.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|ARM.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|ARM.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|ARM64.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|ARM64.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|iPhone.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|iPhone.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|x64.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|x64.Build.0 = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|x86.ActiveCfg = Release|Any CPU - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E}.Release|x86.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|ARM.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|ARM64.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|iPhone.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|x64.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Debug|x86.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|Any CPU.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|Any CPU.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|ARM.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|ARM.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|ARM64.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|ARM64.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|iPhone.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|iPhone.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|iPhoneSimulator.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|x64.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|x64.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|x86.ActiveCfg = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.MonoDroid10|x86.Build.0 = Debug|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|Any CPU.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|ARM.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|ARM.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|ARM64.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|ARM64.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|iPhone.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|iPhone.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|x64.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|x64.Build.0 = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|x86.ActiveCfg = Release|Any CPU + {D8A45F20-EE39-4010-9DBE-39E61DCB805D}.Release|x86.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|ARM.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|ARM.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|ARM64.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|iPhone.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|x64.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|x64.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|x86.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Debug|x86.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|Any CPU.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|Any CPU.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|ARM.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|ARM.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|ARM64.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|ARM64.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|iPhone.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|iPhone.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|iPhoneSimulator.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|x64.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|x64.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|x86.ActiveCfg = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.MonoDroid10|x86.Build.0 = Debug|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|Any CPU.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|ARM.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|ARM.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|ARM64.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|ARM64.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|iPhone.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|iPhone.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|x64.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|x64.Build.0 = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|x86.ActiveCfg = Release|Any CPU + {82241A91-6707-4D7A-8531-D80AE15D844F}.Release|x86.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|ARM.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|ARM.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|ARM64.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|iPhone.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|x64.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|x64.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|x86.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Debug|x86.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|Any CPU.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|Any CPU.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|ARM.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|ARM.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|ARM64.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|ARM64.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|iPhone.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|iPhone.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|iPhoneSimulator.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|x64.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|x64.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|x86.ActiveCfg = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.MonoDroid10|x86.Build.0 = Debug|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|Any CPU.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|ARM.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|ARM.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|ARM64.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|ARM64.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|iPhone.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|iPhone.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|x64.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|x64.Build.0 = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|x86.ActiveCfg = Release|Any CPU + {35622AC2-6128-41AE-92DF-9ECC68C24B0F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {5554DA0B-60F6-4597-BC31-1BE586213822} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} - {E14A0543-9A1B-4740-9461-E71BE55382AB} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} - {63FBC12E-B6E2-466C-9A71-CEE149B125C0} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} {FF8B7181-F526-4624-A4E2-5AA3B809ED79} = {4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C} {53559169-EC01-4D52-9348-092783E9E5F0} = {8D069BC7-B62E-4349-9DE0-0BF140EE3FF9} - {F3219BAF-5883-4769-B32E-076DDFE71694} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} - {BC47ADDA-6CF9-44E5-ADCF-494F7A198E44} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} {6D3BEB7F-E3F6-41EF-8BDC-DF56EC39EBE8} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} - {7861BCE8-7C35-4EDC-B1D5-AEA7B99D4E7E} = {44E54204-4497-43C1-AAF9-43AFFD5FB5F2} + {D8A45F20-EE39-4010-9DBE-39E61DCB805D} = {4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C} + {82241A91-6707-4D7A-8531-D80AE15D844F} = {4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C} + {3A414DF6-84A0-4110-BD99-04232449BA75} = {4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C} + {35622AC2-6128-41AE-92DF-9ECC68C24B0F} = {4AD557F6-04AF-4ECC-A1EB-2BE1208AA94C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1F776336-20B3-431D-B3CD-8D07AA121CDA} diff --git a/Directory.Build.props b/Directory.Build.props index 9ebbd41..3616741 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ true + 9.0.80 diff --git a/Directory.Packages.props b/Directory.Packages.props index 4eb6830..c344bef 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,22 +1,16 @@ - - - - - - - + - - - - - - - + + + + + + + - + \ No newline at end of file diff --git a/README.md b/README.md index e4e5b25..71becab 100644 --- a/README.md +++ b/README.md @@ -3,73 +3,152 @@ [![Package nuget](https://github.com/anpin/ContextMenuContainer/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/anpin/ContextMenuContainer/actions/workflows/main.yml) [![Paypal](https://img.shields.io/badge/Donate%20with-PayPal-blue)](https://paypal.me/APEngineeringLLC?locale.x=en_US) -Native context menu for any MAUI and Xamarin.Forms view. -Supports Windows, Android, iOS and macOS. +# Native Context Menu for .NET MAUI -iOS | Android | macOs | Windows +Add native context menus to any view in your .NET MAUI application. Supports all major platforms: Windows, Android, iOS, macOS + +## Platform Preview + +iOS | Android | macOS | Windows :-------------------------:|:-------------------------:|:-------------------------:|:-------------------------: ![iOS](img/ios.gif) | ![Android](img/android.gif) | ![Mac](img/macos.gif) | ![UWP](img/uwp.png) -## How to use -1. Add namespace to your XAML file - `xmlns:apes="http://apes.ge"` -2. Add following line of code to your `App.xaml.cs` in order to preserve component during linking and resolve our namespace schema in XAML -``` - APES.UI.XF.ContextMenuContainer.Init(); + +## Installation + ``` -3. Extra step for UWP: add our assembly to Xamarin.Forms external assemblies in your UWP `App.xaml.cs` +dotnet add package ContextMenuContainer ``` - using System.Reflection; - ... - var extraAssemblies = new List(); - extraAssemblies.Add(typeof(APES.UI.XF.ContextMenuContainer).GetTypeInfo().Assembly); - Xamarin.Forms.Forms.Init(e, extraAssemblies); + +Or via NuGet Package Manager. + +## Setup + +1. Initialize the component in your `MauiProgram.cs` by adding the extension method: +```csharp +using APES.MAUI; + +var builder = MauiApp.CreateBuilder(); +builder + .UseMauiApp() + // Add this line to configure the context menu container + .ConfigureContextMenuContainer(); ``` -4. Wrap your view with `ContextMenuContainer`, define your context actions inline or bind from your ViewModel + +2. Add the namespace to your XAML file: +```xml +xmlns:apes="http://apes.ge" ``` -//Inline - + +## Basic Usage + +Wrap any view with the `ContextMenuContainer` and define your context menu items: + +### Inline menu items: + +```xml + - - + + - -//From binding - +``` + +### Binding menu items from ViewModel: + +```xml + - + ``` -## Icons -Cross-platform icons are really messy at this point, but you can put your assets to the coresponding folder on each platform and then bind to a `FileIconImageSource` from your ViewModel. Please refer to the sample folder for example. SVG is preferable. -## Known issues -- Using it in a `ViewCell` template of `ListView` might lead to issues with recognizing tap/select events from the list itself, so you might consider using TapGestureRecognizer on the template instead +## ContextMenuItem Properties + +| Property | Type | Description | +|----------|------|-------------| +| `Text` | string | The text label for the menu item | +| `Command` | ICommand | Command to execute when the item is tapped | +| `CommandParameter` | object | Parameter to pass to the command | +| `IsEnabled` | bool | Whether the item is enabled (default: true) | +| `IsDestructive` | bool | Marks the item as destructive (red text) | +| `Icon` | FileImageSource | Icon for the menu item | + +## Icons + +To use icons in your context menu items: + +1. Add platform-specific image assets to the appropriate folders +2. Bind to a `FileImageSource` from your ViewModel + +SVG format is recommended for best cross-platform support. + +## Known Issues + +- With Xamarin.Forms when used in a `CollectionView` or `ListView` item template, there may be conflicts with the collection's own tap/selection events. Consider using `TapGestureRecognizer` directly in these scenarios. + +## Roadmap -## To-Do - [x] Configure build scripts -- [ ] Refactor MAUI initialization -- [ ] Add visibility property -- [ ] Add highlight property -- [ ] Add support for shortcuts -- [ ] Add support of accessability features +- [x] MAUI migration and support +- [ ] Add visibility property +- [ ] Add highlight property +- [ ] Add support for keyboard shortcuts +- [ ] Improve accessibility features - [ ] Add support for submenus and separators -- [ ] Add font icons -- [ ] Cover it all with tests +- [ ] Add font icon support +- [x] Add comprehensive unit and UI tests -## If this plugin saves you time please consider donating via buttons below, so I can make it even better -[![Paypal](https://img.shields.io/badge/Donate%20with-PayPal-blue)](https://paypal.me/APEngineeringLLC?locale.x=en_US) +## Development & Contribution + +### Versioning and Releases + +This project uses [GitVersion](https://gitversion.net/) for automatic versioning based on Git history and tags. + +#### How to bump version for a new release: + +1. **Tag-based versioning**: Create a Git tag with the format `v{major}.{minor}.{patch}` to specify the exact version + ```bash + git tag v1.2.0 + git push origin v1.2.0 + ``` + +2. **Commit message-based versioning**: Include specific keywords in your commit message to trigger version increments + - Major version bump: `+semver:breaking` or `+semver:major` + - Minor version bump: `+semver:feature` or `+semver:minor` + - Patch version bump: `+semver:fix` or `+semver:patch` + +3. **Branch-based versioning**: The versioning behavior depends on the branch: + - `main` branch: Patch increments, creates release versions + - `develop` branch: Minor increments with `alpha` suffix + - `release/*` branch: No increment with `beta` suffix + - `feature/*` branch: Inherits version with branch name suffix + - `hotfix/*` branch: Patch increment with `beta` suffix + +### Contribution Process + +1. Fork the repository +2. Create your feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes with appropriate version bump keywords if needed +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +## Support Development +If this plugin saves you development time, please consider supporting its continued improvement: +[![Paypal](https://img.shields.io/badge/Donate%20with-PayPal-blue)](https://www.paypal.com/paypalme/PavelAnpin) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cb9805a --- /dev/null +++ b/flake.lock @@ -0,0 +1,118 @@ +{ + "nodes": { + "android-nixpkgs": { + "inputs": { + "devshell": "devshell", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1749932438, + "narHash": "sha256-zXHpbiCRv+h9+SLdC0H/6icbQVuTQTuT2wpw3FitCo8=", + "owner": "tadfisher", + "repo": "android-nixpkgs", + "rev": "04d5b7d7c59f93ebe89b522ff56da4d650ee5c5b", + "type": "github" + }, + "original": { + "owner": "tadfisher", + "repo": "android-nixpkgs", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": [ + "android-nixpkgs", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1741473158, + "narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=", + "owner": "numtide", + "repo": "devshell", + "rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "android-nixpkgs": "android-nixpkgs", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..394c245 --- /dev/null +++ b/flake.nix @@ -0,0 +1,33 @@ +{ + description = "basic dotnet MAUI shell"; + + inputs = { + + nixpkgs = { + url = "github:nixos/nixpkgs?ref=nixos-unstable"; + }; + + android-nixpkgs = { + url = "github:tadfisher/android-nixpkgs"; + }; + }; + + outputs = inputs@{ self, nixpkgs, android-nixpkgs, ... }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system ; + config = { + allowUnfree = true; + }; + }; + inherit (inputs.nixpkgs) lib; + in { + + devShells.${system} = { + default = import ./shell.nix {inherit pkgs android-nixpkgs;}; + fhs = import ./shell_fhs.nix {inherit pkgs android-nixpkgs;}; + }; + + }; +} diff --git a/global.json b/global.json index 086345c..ceecdf7 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,10 @@ { "sdk": { - "version": "8.0.100", - "rollForward": "latestMajor" + "version": "9.0.100", + "rollForward": "latestMinor" }, "msbuild-sdks": { - "MSBuild.Sdk.Extras": "3.0.44" + "MSBuild.Sdk.Extras": "3.0.44", + "Microsoft.Build.NoTargets" : "3.7.56" } } diff --git a/pack.ps1 b/pack.ps1 index 7611ba6..926875e 100644 --- a/pack.ps1 +++ b/pack.ps1 @@ -5,4 +5,4 @@ param( ) $ErrorActionPreference = "Stop" -msbuild .\src\APES.UI.XF.csproj -t:Build,Pack -p:Configuration=Release -p:PackageOutputPath="$PackageOutputPath" +msbuild .\src\APES.MAUI.csproj -t:Build,Pack -p:Configuration=Release -p:PackageOutputPath="$PackageOutputPath" diff --git a/samples/APES.UI.MAUI.Sample/APES.UI.MAUI.Sample.csproj b/sample/APES.MAUI.Sample.csproj similarity index 68% rename from samples/APES.UI.MAUI.Sample/APES.UI.MAUI.Sample.csproj rename to sample/APES.MAUI.Sample.csproj index e825546..bc7f01c 100644 --- a/samples/APES.UI.MAUI.Sample/APES.UI.MAUI.Sample.csproj +++ b/sample/APES.MAUI.Sample.csproj @@ -1,30 +1,30 @@ - net8.0-android - - $(TargetFrameworks);net8.0-windows10.0.19041 - Exe - APES.UI.MAUI.Sample - true - true - enable - true + net9.0-android + $(TargetFrameworks);net9.0-ios;net9.0-maccatalyst + $(TargetFrameworks);net9.0-windows10.0.19041.0 + Exe + APES.MAUI.Sample + true + true + enable + true false false - - APES.UI.MAUI.Sample + + APES.MAUI.Sample - - com.apes.ui.maui.sample - 381762DE-A6AE-4986-8C37-3A067AE03B2E + + com.apes.maui.sample + 381762DE-A6AE-4986-8C37-3A067AE03B2E - - 1.0 - 1 + + 1.0 + 1 - - True + + True 15.0 15.0 @@ -37,7 +37,7 @@ win10-x64 __WINDOWS__ - + true full false @@ -75,7 +75,6 @@ - - + diff --git a/samples/APES.UI.MAUI.Sample/App.xaml b/sample/App.xaml similarity index 85% rename from samples/APES.UI.MAUI.Sample/App.xaml rename to sample/App.xaml index a209a59..f52a983 100644 --- a/samples/APES.UI.MAUI.Sample/App.xaml +++ b/sample/App.xaml @@ -1,8 +1,8 @@  + xmlns:local="clr-namespace:APES.MAUI.Sample" + x:Class="APES.MAUI.Sample.App"> @@ -29,6 +29,7 @@ + diff --git a/sample/App.xaml.cs b/sample/App.xaml.cs new file mode 100644 index 0000000..c3879d6 --- /dev/null +++ b/sample/App.xaml.cs @@ -0,0 +1,19 @@ +// MIT License +// Copyright (c) 2021 Pavel Anpin + +using Microsoft.Maui.Controls; + +namespace APES.MAUI.Sample; + +public partial class App : Application +{ + public App() + { + InitializeComponent(); + } + + protected override Window CreateWindow(IActivationState? activationState) + { + return new Window( new NavPage(new MainPage())); + } +} diff --git a/samples/APES.UI.Samples.Shared/AsyncCommand.cs b/sample/AsyncCommand.cs similarity index 93% rename from samples/APES.UI.Samples.Shared/AsyncCommand.cs rename to sample/AsyncCommand.cs index 58167fd..f8324f9 100644 --- a/samples/APES.UI.Samples.Shared/AsyncCommand.cs +++ b/sample/AsyncCommand.cs @@ -1,5 +1,7 @@ -using System.Windows.Input; -namespace APES.UI.XF.Sample +using System; +using System.Threading.Tasks; +using System.Windows.Input; +namespace APES.MAUI.Sample { public class AsyncCommand : IAsyncCommand { diff --git a/sample/BoolToStringConverter.cs b/sample/BoolToStringConverter.cs new file mode 100644 index 0000000..cd5d627 --- /dev/null +++ b/sample/BoolToStringConverter.cs @@ -0,0 +1,31 @@ +using System.Globalization; + +namespace APES.MAUI.Sample; + +public class BoolToStringConverter : IValueConverter +{ + public string True { get; set; } + public string False { get; set; } + + public BoolToStringConverter() : this(string.Empty, string.Empty) + { + } + + public BoolToStringConverter(string True, string False) + { + this.True = True; + this.False = False; + } + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool) return (bool)value ? True : False; + else return string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string) return (string)value == True ? true : false; + else return false; + } +} diff --git a/samples/APES.UI.Samples.Shared/IAsyncCommand.cs b/sample/IAsyncCommand.cs similarity index 64% rename from samples/APES.UI.Samples.Shared/IAsyncCommand.cs rename to sample/IAsyncCommand.cs index 14d1ce1..d924819 100644 --- a/samples/APES.UI.Samples.Shared/IAsyncCommand.cs +++ b/sample/IAsyncCommand.cs @@ -1,5 +1,6 @@ -using System.Windows.Input; -namespace APES.UI.XF.Sample +using System.Threading.Tasks; +using System.Windows.Input; +namespace APES.MAUI.Sample { public interface IAsyncCommand : ICommand { diff --git a/samples/APES.UI.Samples.Shared/IErrorHandler.cs b/sample/IErrorHandler.cs similarity index 66% rename from samples/APES.UI.Samples.Shared/IErrorHandler.cs rename to sample/IErrorHandler.cs index f3ecfb0..c271592 100644 --- a/samples/APES.UI.Samples.Shared/IErrorHandler.cs +++ b/sample/IErrorHandler.cs @@ -1,4 +1,6 @@ -namespace APES.UI.XF.Sample +using System; + +namespace APES.MAUI.Sample { public interface IErrorHandler { diff --git a/sample/MainPage.xaml b/sample/MainPage.xaml new file mode 100644 index 0000000..3083cae --- /dev/null +++ b/sample/MainPage.xaml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + +