diff --git a/e2e-tests/capacitor.spec.ts b/e2e-tests/capacitor.spec.ts
new file mode 100644
index 0000000..d33fa6c
--- /dev/null
+++ b/e2e-tests/capacitor.spec.ts
@@ -0,0 +1,34 @@
+import { testSkipIfWindows, Timeout } from "./helpers/test_helper";
+
+testSkipIfWindows("capacitor upgrade and sync works", async ({ po }) => {
+ await po.setUp();
+ await po.sendPrompt("hi");
+ await po.getTitleBarAppNameButton().click();
+ await po.clickAppUpgradeButton({ upgradeId: "capacitor" });
+ await po.expectNoAppUpgrades();
+ await po.snapshotAppFiles({ name: "upgraded-capacitor" });
+
+ await po.page.getByTestId("capacitor-controls").waitFor({ state: "visible" });
+
+ // Test sync & open iOS functionality - the button contains "Sync & Open iOS"
+ const iosButton = po.page.getByRole("button", { name: /Sync & Open iOS/i });
+ await iosButton.click();
+
+ // In test mode, this should complete without error and return to idle state
+ // Wait for the button to be enabled again (not in loading state)
+ await po.page
+ .getByText("Sync & Open iOS")
+ .waitFor({ state: "visible", timeout: Timeout.LONG });
+
+ // Test sync & open Android functionality - the button contains "Sync & Open Android"
+ const androidButton = po.page.getByRole("button", {
+ name: /Sync & Open Android/i,
+ });
+ await androidButton.click();
+
+ // In test mode, this should complete without error and return to idle state
+ // Wait for the button to be enabled again (not in loading state)
+ await po.page
+ .getByText("Sync & Open Android")
+ .waitFor({ state: "visible", timeout: Timeout.LONG });
+});
diff --git a/e2e-tests/helpers/test_helper.ts b/e2e-tests/helpers/test_helper.ts
index 8d056dc..2af8097 100644
--- a/e2e-tests/helpers/test_helper.ts
+++ b/e2e-tests/helpers/test_helper.ts
@@ -286,6 +286,11 @@ export class PageObject {
}
async snapshotAppFiles({ name }: { name?: string } = {}) {
+ const currentAppName = await this.getCurrentAppName();
+ if (!currentAppName) {
+ throw new Error("No app selected");
+ }
+ const normalizedAppName = currentAppName.toLowerCase().replace(/-/g, "");
const appPath = await this.getCurrentAppPath();
if (!appPath || !fs.existsSync(appPath)) {
throw new Error(`App path does not exist: ${appPath}`);
@@ -298,7 +303,14 @@ export class PageObject {
filesData.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
const snapshotContent = filesData
- .map((file) => `=== ${file.relativePath} ===\n${file.content}`)
+ .map(
+ (file) =>
+ `=== ${file.relativePath.replace(normalizedAppName, "[[normalizedAppName]]")} ===\n${file.content
+ .split(normalizedAppName)
+ .join("[[normalizedAppName]]")
+ .split(currentAppName)
+ .join("[[appName]]")}`,
+ )
.join("\n\n");
if (name) {
@@ -643,7 +655,7 @@ export class PageObject {
async expectNoAppUpgrades() {
await expect(this.page.getByTestId("no-app-upgrades-needed")).toBeVisible({
- timeout: Timeout.MEDIUM,
+ timeout: Timeout.LONG,
});
}
diff --git a/e2e-tests/snapshots/capacitor.spec.ts_upgraded-capacitor.txt b/e2e-tests/snapshots/capacitor.spec.ts_upgraded-capacitor.txt
new file mode 100644
index 0000000..e66f5ed
--- /dev/null
+++ b/e2e-tests/snapshots/capacitor.spec.ts_upgraded-capacitor.txt
@@ -0,0 +1,7821 @@
+=== .gitignore ===
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+
+=== AI_RULES.md ===
+# Tech Stack
+
+- You are building a React application.
+- Use TypeScript.
+- Use React Router. KEEP the routes in src/App.tsx
+- Always put source code in the src folder.
+- Put pages into src/pages/
+- Put components into src/components/
+- The main page (default page) is src/pages/Index.tsx
+- UPDATE the main page to include the new components. OTHERWISE, the user can NOT see any components!
+- ALWAYS try to use the shadcn/ui library.
+- Tailwind CSS: always use Tailwind CSS for styling components. Utilize Tailwind classes extensively for layout, spacing, colors, and other design aspects.
+
+Available packages and libraries:
+
+- The lucide-react package is installed for icons.
+- You ALREADY have ALL the shadcn/ui components and their dependencies installed. So you don't need to install them again.
+- You have ALL the necessary Radix UI components installed.
+- Use prebuilt components from the shadcn/ui library after importing them. Note that these files shouldn't be edited, so make new components if you need to change them.
+
+
+=== android/.gitignore ===
+# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
+
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+# Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
+
+# Cordova plugins for Capacitor
+capacitor-cordova-android-plugins
+
+# Copied web assets
+app/src/main/assets/public
+
+# Generated Config files
+app/src/main/assets/capacitor.config.json
+app/src/main/assets/capacitor.plugins.json
+app/src/main/res/xml/config.xml
+
+
+=== android/app/.gitignore ===
+/build/*
+!/build/.npmkeep
+
+
+=== android/app/build.gradle ===
+apply plugin: 'com.android.application'
+
+android {
+ namespace "com.example.[[normalizedAppName]]"
+ compileSdk rootProject.ext.compileSdkVersion
+ defaultConfig {
+ applicationId "com.example.[[normalizedAppName]]"
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ aaptOptions {
+ // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+ // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
+ ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+ }
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+repositories {
+ flatDir{
+ dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+ }
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+ implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
+ implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
+ implementation project(':capacitor-android')
+ testImplementation "junit:junit:$junitVersion"
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
+ implementation project(':capacitor-cordova-android-plugins')
+}
+
+apply from: 'capacitor.build.gradle'
+
+try {
+ def servicesJSON = file('google-services.json')
+ if (servicesJSON.text) {
+ apply plugin: 'com.google.gms.google-services'
+ }
+} catch(Exception e) {
+ logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
+}
+
+
+=== android/app/build/.npmkeep ===
+
+
+=== android/app/proguard-rules.pro ===
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+
+=== android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java ===
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import android.content.Context;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.getcapacitor.app", appContext.getPackageName());
+ }
+}
+
+
+=== android/app/src/main/AndroidManifest.xml ===
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=== android/app/src/main/java/com/example/[[normalizedAppName]]/MainActivity.java ===
+package com.example.[[normalizedAppName]];
+
+import com.getcapacitor.BridgeActivity;
+
+public class MainActivity extends BridgeActivity {}
+
+
+=== android/app/src/main/res/drawable-land-hdpi/splash.png ===
+[binary hash="08cc34ad7713fe7ed58bceaa37b2387b670c53cd60264b4bd6442db3098e75dc"]
+
+=== android/app/src/main/res/drawable-land-mdpi/splash.png ===
+[binary hash="5cf98b4451bd99b20df26f9e608a46946118be6b0ae90762f9ca1786a30c76ff"]
+
+=== android/app/src/main/res/drawable-land-xhdpi/splash.png ===
+[binary hash="22f87e1e3bc89aa01a7dbc39c9a4db058cd0bf4ad3fe9f55712bf69eb997f4bf"]
+
+=== android/app/src/main/res/drawable-land-xxhdpi/splash.png ===
+[binary hash="42aa26392546fcdee1b8d3ac6d4b41bfcceb41dc6a4f3a3c30c24a8a8f4db862"]
+
+=== android/app/src/main/res/drawable-land-xxxhdpi/splash.png ===
+[binary hash="60393ce8636fd263e4e1fea3fd4ab2de948c6295e898fda9b50ac4e5283be809"]
+
+=== android/app/src/main/res/drawable-port-hdpi/splash.png ===
+[binary hash="c5015f4ba3628392b538386c5e210f0b94f352a3160adab934fd0311972137ca"]
+
+=== android/app/src/main/res/drawable-port-mdpi/splash.png ===
+[binary hash="07fa579e1c83e04ba7f9cbcbfcf41b68e15fe3638f2c44a04e58b809103e6b69"]
+
+=== android/app/src/main/res/drawable-port-xhdpi/splash.png ===
+[binary hash="b73049cb37fe76d6c11b87a796766bf6af0c85483b31eb6a921657b0d764a4b9"]
+
+=== android/app/src/main/res/drawable-port-xxhdpi/splash.png ===
+[binary hash="0c7f1212f25b7b90e9a6e1d320013e4ff3d3e03e634cbb07b7b7981cac51627f"]
+
+=== android/app/src/main/res/drawable-port-xxxhdpi/splash.png ===
+[binary hash="3db071a03b2f8ffe0dfd4170fc59842d53cd15bba5e88af59401d58efabf7827"]
+
+=== android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml ===
+
+
+
+
+
+
+
+
+
+
+
+
+
+=== android/app/src/main/res/drawable/ic_launcher_background.xml ===
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=== android/app/src/main/res/drawable/splash.png ===
+[binary hash="5cf98b4451bd99b20df26f9e608a46946118be6b0ae90762f9ca1786a30c76ff"]
+
+=== android/app/src/main/res/layout/activity_main.xml ===
+
+
+
+
+
+
+
+=== android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml ===
+
+
+
+
+
+
+=== android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml ===
+
+
+
+
+
+
+=== android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png ===
+[binary hash="32baa10d2632a4417454a579f992bd640e0a3cec79321423559b2c9940de58a9"]
+
+=== android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png ===
+[binary hash="bfcc1b0fa931b14bb241372c76ab4f04374b67d02363c98d9cb12edfdacdf5f3"]
+
+=== android/app/src/main/res/mipmap-hdpi/ic_launcher.png ===
+[binary hash="72b71c3581ca3b5a23b1c168d69b9d855b3f184fa079902a01f088eb4f0607d5"]
+
+=== android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png ===
+[binary hash="58e78a618778926b1f6d9472a6468de878de8530970934e94aab5ba4ba08cc00"]
+
+=== android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png ===
+[binary hash="0166fc333074c373fbd0ce6b5defd71552166165ac778121ca9c9dff6b83f0fc"]
+
+=== android/app/src/main/res/mipmap-mdpi/ic_launcher.png ===
+[binary hash="27ed3603010ebc278f64f8645741ab132ff517abb5308eb9df6c8e42a48956b2"]
+
+=== android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png ===
+[binary hash="6f88083b8166cc559102f7044688de7525287632ebe09ac45d001ac8bf4b3eae"]
+
+=== android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png ===
+[binary hash="40911a00922868686854a4804b93fd6e56b503664696de03f450bff690affb6d"]
+
+=== android/app/src/main/res/mipmap-xhdpi/ic_launcher.png ===
+[binary hash="d35dbfff175b83c13ef59cf924abfc810f7b6a158595d7417c5498ea8c7c7ed1"]
+
+=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png ===
+[binary hash="4a82bc1e9923576275869998925ce0ae021a79aa18b24a0dd87ad6b61ca85053"]
+
+=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png ===
+[binary hash="1ee4cd9ff371dcb2e3938097e434f6fb8731688ed7165e61fc63693ad5b2f455"]
+
+=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png ===
+[binary hash="ed346eb1e3f0280f15709393705899b3ff55c20b88f4e0308006b3c33cf5fe14"]
+
+=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png ===
+[binary hash="bd24fd383253bf8d43f0a81f11c071d76d1d555114376dd647cd9fb38fa0a9da"]
+
+=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png ===
+[binary hash="ab93096331e7cd8ec379f73f1e9adcaaa9ee1115c9f4ff10411a811fb9700174"]
+
+=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png ===
+[binary hash="87cb2f2ffe992652bb4fa768c73719a37b5852ab17fbf8e170e888f7a42b0761"]
+
+=== android/app/src/main/res/values/ic_launcher_background.xml ===
+
+
+ #FFFFFF
+
+
+=== android/app/src/main/res/values/strings.xml ===
+
+
+ [[appName]]
+ [[appName]]
+ com.example.[[normalizedAppName]]
+ com.example.[[normalizedAppName]]
+
+
+
+=== android/app/src/main/res/values/styles.xml ===
+
+
+
+
+
+
+
+
+
+
+
+
+=== android/app/src/main/res/xml/file_paths.xml ===
+
+
+
+
+
+
+=== android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java ===
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
+
+
+=== android/build.gradle ===
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.7.2'
+ classpath 'com.google.gms:google-services:4.4.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+apply from: "variables.gradle"
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
+
+
+=== android/gradle.properties ===
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+
+
+=== android/gradle/wrapper/gradle-wrapper.jar ===
+PK ! META-INF/LICENSEUT �Z[s�6~ϯ�hfg�FI���}Rc�U7�3���>B$(aC,@Z���=�(�N�u=�֢���s��w�J|�g��r��]�ΩW/��/e�6��v����n��(�}���g퇡��͛��0�����ݛ��ro^�������X݈ww�����n�����as[��������;|\�[7���z��>!��ō�u�P��_ymf�D3���iD�d'8�l��*Q���U�6V�Nªޚj,�q�Eổv�����D�[�Jl�b�J�
ȷf������A�{�[�
�z{�Xi��ջ� ̡SV�J�PG!�ao�����\Z1�� `ӝ�����K��j'qK�ϔ;< i��,IJ�� �z1^�
+j�xk0�`MSiU�А����]�JӶ����⠇=��
�⽱�G?��@�$�F�ͼ�ʼn+}�K�A��g�K�����BF����y)�'�����N��p_7�{�X!{E��Ӿ�d�9h�&�r�Ar���%պk�ʖ(���������
�����p�U.H�[ՁJ
��H��L.�Ì3qk�7;�ν��&��Q�y|x� ���[�<�'��,�6�[ )�՞FZoU�����ך,��hM��h��*8Xwe3�) Eg��V���Gg����hCpJ��G��~��_��h����Fe�q��7�¹�;�3p��P~�ִ��r/;�:$DE��M��4�c-�`�bz@/�䘐6�Ƅ2��?�"� �'��N����P�n�*-�p��c2��(�!iL8���R@w�1�t�X�� H�n� ���R�h�XJJ2�B@70��-/k2��-d���qPO��agX�a���E�+�� ��1��d�e�#X�Q 4���F �q���^� (����Q*V�F?DcnE��\8�u��� �5@
�̴�Q�+1��4>O�>���<��0�r�A���%lfJ
+X�w��]�}~����I���|�z��w$�W
�Z�c~�^Z���UV5Gȃ�3nтq��V]�k "[˒�D���h�3��:������}������)��
�.�Ҩ
+���b��L$H2lZN�"K�Q���M�m7n;h#��3Z�L���j�De��}���5��y��u�^��f^��˰H5��� 腭l(��uD>��[_`�FW�Ph���d!����R�+��%� u���� -+Y�
+��T�r��;*,!%�H��+��ȵr��L� �6�
8n9:��cKx�i�'B�T��S0���!�(���hF��J���&v(�rz��C(��Ȱ#�j�{K���|v��'�:;d�)On@���dS�e�
+� (�"$��}R:����ඥ{s�F�ѷs��*��]<~`Vb3rq��z����,GeURd!�3�8�@���z5�eB��5�A#��L��<�����5�����e3_�V�'
��є�g����a�`�X�q|�t ��qk���}#!��ЙK��'�X�}[N�#Y>��B9'la�5s�G�����+X��Z�!P$P�qCt-z>k�=�� l/����Ѧ���AP
�/��q�e�
+ f���죰����MӁ��ʈ]^������f�+��ܺ7;�^�Ք��� �ҡ��审
6���Id���tA8w��ڂ�L���-�P��bY��c/� �0��S�c�N� �|�~�
+V���8����(͈��?��h���z��6j�E ,�O��_8� ���v�S&�ñ�?Zb� ���4e
+ͨϔ�h��%/�*����+��V��|Ѻ
�Ċ�X�|24��[yL�v�B��:p� ����%Ha�@��
��Ċ
3%� ��s��un���D���C>�!R�e���-B��d6ˆ�*��b��Gd&%��-�5�P��8"?�S8ި*�Uch�$b�p��y�id�0� 3\L&�VA��<����džy��⢉RWA����L N_�+P�?G�2��4�� ˽���h����L}A�"�MM���V$���T"y�u6�K
+��VM�pd�8K&*�q4��N��8�{jv�M �����x蠊:r�z��J��/I�.H�|�x�"�aV6�zvt��>�x:�a��ͧ��Kk�i���`�Z��G^�2.��7T_���2L��wXFH57B9p�R|�i���o���`�������?���L=�2�x�h�v���i����P�CX�xte9��ٍ�_�1} ��ŹYd48�R�g��#��c�_A4���T����=��'X�ɥP�M��Ө
XxG ���MNj��!���|5�P�R����u�K�Z|� v9�$��n���R�-V��"5/i
+V$���wI�+���-j�6�/'νƹ@�l���L���,7�������=܋O��z��_�n��:���{/�?�?���;�o��p:��I4�J��ISќT�:B�K���ȞC,�~y�� ��^/W����/��߮�����ݯ�������B����
}`�e|\��ak��a��ns�Ֆo�Y �{�Tӭ��pW8
�5��H���5D�B�7����9�Dx� ���;S��&3��{V������,��?��9�}�r��<_b�@���`�a'��v6j 7Y@C>2�Ԯ���Ju]���b2ʍ��/����7zK�����<"�[�-���������9)8� .k4m�'�Z���t����Wҗ\��n=�}��b�W H`x��r^h@h����8��|g�U<�j�5>mtɚcĘ����;3��|bp��x�
+��؝1�A7���3e����� FT���-W#��c��
���[ ����r8�H�Oq^F���Q�%i���������s�0�kZ! /�H�:K�O{���t=�,|�-��roOAi�9�l��+�Z� ԑ��+��1�G�#ŝj;�jI��Y���0��O����A�A��W-p��_造������V2�� N�o�tMv9���!��@�`��%��nQ��IQ~&�=���1�9��6u�M�jhWx0����\ږ�(��hŔΣ���O���+�f������x{�d#�H6�d��EcF�.���������PK����
�' PK ! META-INF/MANIFEST.MFUT �M��LK-.�
K-*��ϳR0�3����-�I�M�+I,
+�d��Z)�%��*�%��r�r PKm�>=@ ? PK ! 1 org/gradle/cli/CommandLineArgumentException.classUT MO�J1�����^/sR��R�a�"H�SO-xO��46�.�n�>�o�I���P�,(:���}~� ��3x�ng�_�F��1�K��2��6��l�"�
��$�D��
+�:�6��R��}��Ȋ<��\\���y}�ۿ,�!"�D4�,Ni��S�n��E|2
�(�
ncЙg��x�
2�e^�ʋ�`,��'��¥S�t�Ui������4=����p*������M�+�tq���x�g��Y�'�]h�nZ�aИ�0��U0JR�v @��y�{���G�j
��PK�`zX! p PK ! &