Fisrt push
| @ -0,0 +1,43 @@ | ||||
| # Miscellaneous | ||||
| *.class | ||||
| *.log | ||||
| *.pyc | ||||
| *.swp | ||||
| .DS_Store | ||||
| .atom/ | ||||
| .buildlog/ | ||||
| .history | ||||
| .svn/ | ||||
| migrate_working_dir/ | ||||
| 
 | ||||
| # IntelliJ related | ||||
| *.iml | ||||
| *.ipr | ||||
| *.iws | ||||
| .idea/ | ||||
| 
 | ||||
| # The .vscode folder contains launch configuration and tasks you configure in | ||||
| # VS Code which you may wish to be included in version control, so this line | ||||
| # is commented out by default. | ||||
| #.vscode/ | ||||
| 
 | ||||
| # Flutter/Dart/Pub related | ||||
| **/doc/api/ | ||||
| **/ios/Flutter/.last_build_id | ||||
| .dart_tool/ | ||||
| .flutter-plugins | ||||
| .flutter-plugins-dependencies | ||||
| .pub-cache/ | ||||
| .pub/ | ||||
| /build/ | ||||
| 
 | ||||
| # Symbolication related | ||||
| app.*.symbols | ||||
| 
 | ||||
| # Obfuscation related | ||||
| app.*.map.json | ||||
| 
 | ||||
| # Android Studio will place build artifacts here | ||||
| /android/app/debug | ||||
| /android/app/profile | ||||
| /android/app/release | ||||
| @ -0,0 +1,45 @@ | ||||
| # This file tracks properties of this Flutter project. | ||||
| # Used by Flutter tool to assess capabilities and perform upgrades etc. | ||||
| # | ||||
| # This file should be version controlled and should not be manually edited. | ||||
| 
 | ||||
| version: | ||||
|   revision: "603104015dd692ea3403755b55d07813d5cf8965" | ||||
|   channel: "stable" | ||||
| 
 | ||||
| project_type: app | ||||
| 
 | ||||
| # Tracks metadata for the flutter migrate command | ||||
| migration: | ||||
|   platforms: | ||||
|     - platform: root | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: android | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: ios | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: linux | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: macos | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: web | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|     - platform: windows | ||||
|       create_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
|       base_revision: 603104015dd692ea3403755b55d07813d5cf8965 | ||||
| 
 | ||||
|   # User provided section | ||||
| 
 | ||||
|   # List of Local paths (relative to this file) that should be | ||||
|   # ignored by the migrate tool. | ||||
|   # | ||||
|   # Files that are not part of the templates will be ignored by default. | ||||
|   unmanaged_files: | ||||
|     - 'lib/main.dart' | ||||
|     - 'ios/Runner.xcodeproj/project.pbxproj' | ||||
| @ -0,0 +1,48 @@ | ||||
| # hmg_qline | ||||
| 
 | ||||
| A new Flutter project. | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| This project is a starting point for a Flutter application. | ||||
| 
 | ||||
| A few resources to get you started if this is your first Flutter project: | ||||
| 
 | ||||
| - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) | ||||
| - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) | ||||
| 
 | ||||
| For help getting started with Flutter development, view the | ||||
| [online documentation](https://docs.flutter.dev/), which offers tutorials, | ||||
| samples, guidance on mobile development, and a full API reference. | ||||
| 
 | ||||
| for ticket generation:  LAB_PatientCallNo_Get | ||||
| 
 | ||||
| { | ||||
| "projectID": 15, | ||||
| "patientID": 123456905, | ||||
| "isVip": false, | ||||
| "isVidaPlus": false, | ||||
| "createdBy": 101, | ||||
| "apiKey": "EE17D21C7943485D9780223CCE55DCE5" | ||||
| } | ||||
| 
 | ||||
| for signalR call:  LAB_CallRequest_Update | ||||
| 
 | ||||
| { | ||||
| "projectID": 15, | ||||
| "roomNo": 11, | ||||
| "isVidaPlus": false, | ||||
| "editedBy": 101, | ||||
| "apiKey": "EE17D21C7943485D9780223CCE55DCE5" | ||||
| } | ||||
| 
 | ||||
| TicketCall: | ||||
| 
 | ||||
| {qType: 2, screenType: 1, connectionID: 10.20.10.30, data: {id: 85, patientID: 123456901, | ||||
| laB_QGroupID: 1, queueNo: LAB-54, counterBatchNo: 1, calledBy: 11, calledOn: 2024-12-19T11:58: | ||||
| 36.573, servedOn: null, patientName: Kholoud Khaled Bawaz, mobileNo: 0596117128, patientEmail: | ||||
| Test@unknown.com, preferredLang: 1, patientGender: 2, roomNo: null, isActive: true, createdBy: 101, | ||||
| createdOn: 2024-12-19T11:58:13.74, editedBy: 101, editedOn: 2024-12-19T11:58:36.573}} | ||||
| 
 | ||||
| ConfigCall:  | ||||
| 
 | ||||
| @ -0,0 +1,28 @@ | ||||
| # This file configures the analyzer, which statically analyzes Dart code to | ||||
| # check for errors, warnings, and lints. | ||||
| # | ||||
| # The issues identified by the analyzer are surfaced in the UI of Dart-enabled | ||||
| # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be | ||||
| # invoked from the command line by running `flutter analyze`. | ||||
| 
 | ||||
| # The following line activates a set of recommended lints for Flutter apps, | ||||
| # packages, and plugins designed to encourage good coding practices. | ||||
| include: package:flutter_lints/flutter.yaml | ||||
| 
 | ||||
| linter: | ||||
|   # The lint rules applied to this project can be customized in the | ||||
|   # section below to disable rules from the `package:flutter_lints/flutter.yaml` | ||||
|   # included above or to enable additional rules. A list of all available lints | ||||
|   # and their documentation is published at https://dart.dev/lints. | ||||
|   # | ||||
|   # Instead of disabling a lint rule for the entire project in the | ||||
|   # section below, it can also be suppressed for a single line of code | ||||
|   # or a specific dart file by using the `// ignore: name_of_lint` and | ||||
|   # `// ignore_for_file: name_of_lint` syntax on the line or in the file | ||||
|   # producing the lint. | ||||
|   rules: | ||||
|     # avoid_print: false  # Uncomment to disable the `avoid_print` rule | ||||
|     # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule | ||||
| 
 | ||||
| # Additional information about this file can be found at | ||||
| # https://dart.dev/guides/language/analysis-options | ||||
| @ -0,0 +1,13 @@ | ||||
| gradle-wrapper.jar | ||||
| /.gradle | ||||
| /captures/ | ||||
| /gradlew | ||||
| /gradlew.bat | ||||
| /local.properties | ||||
| GeneratedPluginRegistrant.java | ||||
| 
 | ||||
| # Remember to never publicly share your keystore. | ||||
| # See https://flutter.dev/to/reference-keystore | ||||
| key.properties | ||||
| **/*.keystore | ||||
| **/*.jks | ||||
| @ -0,0 +1,44 @@ | ||||
| plugins { | ||||
|     id "com.android.application" | ||||
|     id "kotlin-android" | ||||
|     // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. | ||||
|     id "dev.flutter.flutter-gradle-plugin" | ||||
| } | ||||
| 
 | ||||
| android { | ||||
|     namespace = "com.example.hmg_qline.hmg_qline" | ||||
|     compileSdk = flutter.compileSdkVersion | ||||
|     ndkVersion = "27.0.12077973" | ||||
| 
 | ||||
|     compileOptions { | ||||
|         sourceCompatibility = JavaVersion.VERSION_1_8 | ||||
|         targetCompatibility = JavaVersion.VERSION_1_8 | ||||
|     } | ||||
| 
 | ||||
|     kotlinOptions { | ||||
|         jvmTarget = JavaVersion.VERSION_1_8 | ||||
|     } | ||||
| 
 | ||||
|     defaultConfig { | ||||
|         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | ||||
|         applicationId = "com.example.hmg_qline.hmg_qline" | ||||
|         // You can update the following values to match your application needs. | ||||
|         // For more information, see: https://flutter.dev/to/review-gradle-config. | ||||
|         minSdk = flutter.minSdkVersion | ||||
|         targetSdk = flutter.targetSdkVersion | ||||
|         versionCode = flutter.versionCode | ||||
|         versionName = flutter.versionName | ||||
|     } | ||||
| 
 | ||||
|     buildTypes { | ||||
|         release { | ||||
|             // TODO: Add your own signing config for the release build. | ||||
|             // Signing with the debug keys for now, so `flutter run --release` works. | ||||
|             signingConfig = signingConfigs.debug | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| flutter { | ||||
|     source = "../.." | ||||
| } | ||||
| @ -0,0 +1,7 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <!-- The INTERNET permission is required for development. Specifically, | ||||
|          the Flutter tool needs it to communicate with the running application | ||||
|          to allow setting breakpoints, to provide hot reload, etc. | ||||
|     --> | ||||
|     <uses-permission android:name="android.permission.INTERNET"/> | ||||
| </manifest> | ||||
| @ -0,0 +1,68 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
| 
 | ||||
|     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> | ||||
|     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
| 
 | ||||
|     <queries> | ||||
|         <intent> | ||||
|             <action android:name="android.intent.action.TTS_SERVICE" /> | ||||
|         </intent> | ||||
|     </queries> | ||||
|     <application | ||||
|         android:label="QLine" | ||||
|         android:name="${applicationName}" | ||||
|         android:icon="@mipmap/ic_launcher"> | ||||
| 
 | ||||
|         <receiver | ||||
|             android:name="BootReceiver" | ||||
|             android:enabled="true" | ||||
|             android:exported="true" | ||||
|             android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.BOOT_COMPLETED" /> | ||||
|                 <action android:name="android.intent.action.QUICKBOOT_POWERON" /> | ||||
| 
 | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:exported="true" | ||||
|             android:launchMode="singleTop" | ||||
|             android:taskAffinity="" | ||||
|             android:theme="@style/LaunchTheme" | ||||
|             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" | ||||
|             android:hardwareAccelerated="true" | ||||
|             android:windowSoftInputMode="adjustResize"> | ||||
|             <!-- Specifies an Android theme to apply to this Activity as soon as | ||||
|                  the Android process has started. This theme is visible to the user | ||||
|                  while the Flutter UI initializes. After that, this theme continues | ||||
|                  to determine the Window background behind the Flutter UI. --> | ||||
|             <meta-data | ||||
|               android:name="io.flutter.embedding.android.NormalTheme" | ||||
|               android:resource="@style/NormalTheme" | ||||
|               /> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN"/> | ||||
|                 <category android:name="android.intent.category.LAUNCHER"/> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|         <!-- Don't delete the meta-data below. | ||||
|              This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> | ||||
|         <meta-data | ||||
|             android:name="flutterEmbedding" | ||||
|             android:value="2" /> | ||||
|     </application> | ||||
|     <!-- Required to query activities that can process text, see: | ||||
|          https://developer.android.com/training/package-visibility and | ||||
|          https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. | ||||
| 
 | ||||
|          In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> | ||||
|     <queries> | ||||
|         <intent> | ||||
|             <action android:name="android.intent.action.PROCESS_TEXT"/> | ||||
|             <data android:mimeType="text/plain"/> | ||||
|         </intent> | ||||
|     </queries> | ||||
| </manifest> | ||||
| @ -0,0 +1,15 @@ | ||||
| package com.example.hmg_qline.hmg_qline | ||||
| 
 | ||||
| import android.content.BroadcastReceiver | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| 
 | ||||
| class BootReceiver : BroadcastReceiver() { | ||||
|     override fun onReceive(context: Context, intent: Intent) { | ||||
|         if (intent.action == Intent.ACTION_BOOT_COMPLETED) { | ||||
|             val i = Intent(context, MainActivity::class.java) | ||||
|             i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) | ||||
|             context.startActivity(i) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,5 @@ | ||||
| package com.example.hmg_qline.hmg_qline | ||||
| 
 | ||||
| import io.flutter.embedding.android.FlutterActivity | ||||
| 
 | ||||
| class MainActivity: FlutterActivity() | ||||
| @ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Modify this file to customize your launch splash screen --> | ||||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:drawable="?android:colorBackground" /> | ||||
| 
 | ||||
|     <!-- You can insert your own image assets here --> | ||||
|     <!-- <item> | ||||
|         <bitmap | ||||
|             android:gravity="center" | ||||
|             android:src="@mipmap/launch_image" /> | ||||
|     </item> --> | ||||
| </layer-list> | ||||
| @ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Modify this file to customize your launch splash screen --> | ||||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:drawable="@android:color/white" /> | ||||
| 
 | ||||
|     <!-- You can insert your own image assets here --> | ||||
|     <!-- <item> | ||||
|         <bitmap | ||||
|             android:gravity="center" | ||||
|             android:src="@mipmap/launch_image" /> | ||||
|     </item> --> | ||||
| </layer-list> | ||||
| After Width: | Height: | Size: 544 B | 
| After Width: | Height: | Size: 442 B | 
| After Width: | Height: | Size: 721 B | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| @ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> | ||||
|     <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||
|         <!-- Show a splash screen on the activity. Automatically removed when | ||||
|              the Flutter engine draws its first frame --> | ||||
|         <item name="android:windowBackground">@drawable/launch_background</item> | ||||
|     </style> | ||||
|     <!-- Theme applied to the Android Window as soon as the process has started. | ||||
|          This theme determines the color of the Android Window while your | ||||
|          Flutter UI initializes, as well as behind your Flutter UI while its | ||||
|          running. | ||||
| 
 | ||||
|          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||
|     <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||
|         <item name="android:windowBackground">?android:colorBackground</item> | ||||
|     </style> | ||||
| </resources> | ||||
| @ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> | ||||
|     <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||
|         <!-- Show a splash screen on the activity. Automatically removed when | ||||
|              the Flutter engine draws its first frame --> | ||||
|         <item name="android:windowBackground">@drawable/launch_background</item> | ||||
|     </style> | ||||
|     <!-- Theme applied to the Android Window as soon as the process has started. | ||||
|          This theme determines the color of the Android Window while your | ||||
|          Flutter UI initializes, as well as behind your Flutter UI while its | ||||
|          running. | ||||
| 
 | ||||
|          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||
|     <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||
|         <item name="android:windowBackground">?android:colorBackground</item> | ||||
|     </style> | ||||
| </resources> | ||||
| @ -0,0 +1,7 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <!-- The INTERNET permission is required for development. Specifically, | ||||
|          the Flutter tool needs it to communicate with the running application | ||||
|          to allow setting breakpoints, to provide hot reload, etc. | ||||
|     --> | ||||
|     <uses-permission android:name="android.permission.INTERNET"/> | ||||
| </manifest> | ||||
| @ -0,0 +1,40 @@ | ||||
| buildscript { | ||||
|     ext.kotlin_version = '1.9.10' | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
| 
 | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:8.7.0' | ||||
|         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||
|     } | ||||
| } | ||||
| allprojects { | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
|     subprojects { | ||||
|         afterEvaluate { project -> | ||||
|             if (project.hasProperty('android')) { | ||||
|                 project.android { | ||||
|                     if (namespace == null) { | ||||
|                         namespace project.group | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| rootProject.buildDir = '../build' | ||||
| subprojects { | ||||
|     project.buildDir = "${rootProject.buildDir}/${project.name}" | ||||
|     project.evaluationDependsOn(':app') | ||||
| } | ||||
| 
 | ||||
| tasks.register("clean", Delete) { | ||||
|     delete rootProject.buildDir | ||||
| } | ||||
| @ -0,0 +1,3 @@ | ||||
| org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError | ||||
| android.useAndroidX=true | ||||
| android.enableJetifier=true | ||||
| @ -0,0 +1,7 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip | ||||
| networkTimeout=10000 | ||||
| validateDistributionUrl=true | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| @ -0,0 +1,27 @@ | ||||
| pluginManagement { | ||||
|     def flutterSdkPath = { | ||||
|         def properties = new Properties() | ||||
|         file("local.properties").withInputStream { properties.load(it) } | ||||
|         def flutterSdkPath = properties.getProperty("flutter.sdk") | ||||
|         assert flutterSdkPath != null, "flutter.sdk not set in local.properties" | ||||
|         return flutterSdkPath | ||||
|     }() | ||||
| 
 | ||||
|     includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") | ||||
| 
 | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|         gradlePluginPortal() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| plugins { | ||||
|     id "dev.flutter.flutter-plugin-loader" version "1.0.0" | ||||
|     id "com.android.application" version "8.7.0" apply false | ||||
|     id "org.jetbrains.kotlin.android" version "1.8.22" apply false | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| include ":app" | ||||
| @ -0,0 +1,33 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"> | ||||
|     <g clip-rule="evenodd" fill-rule="evenodd"> | ||||
|         <path | ||||
|             d="m10.5714 5.7738c-2.78119 0-5.03576 2.25457-5.03576 5.0357 0 .8311.20189 1.6171.55995 2.3098.12879.2491.3858.4056.66624.4056h8.09527c.4142 0 .75-.3358.75-.75v-1.4892-.4762c0-2.78113-2.2546-5.0357-5.0357-5.0357z" | ||||
|             fill="#E5B045" /> | ||||
|         <path | ||||
|             d="m10.5 5.77429v7.22571h-4.46407c-.32074-.6631-.50029-1.4068-.50029-2.1905 0-2.75731 2.21611-4.99704 4.96436-5.03521z" | ||||
|             fill="#e5b045" /> | ||||
|         <path | ||||
|             d="m11.5831 9.58331c-3.37338 0-6.18137 2.53149-6.39207 5.78539-1.68658.3293-2.98888 1.7661-2.98888 3.536 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11905c.5478 0 1.0705-.1149 1.5418-.3225 1.9561-.7122 3.3749-2.5408 3.3749-4.7132 0-2.8097-2.3637-5.0357-5.2143-5.0357-.18 0-.358.0088-.5336.0261-1.1384-1.7391-3.1458-2.88329-5.4188-2.88329z" | ||||
|             fill="#cfd8dc" /> | ||||
|         <path | ||||
|             d="m12 9.59621v12.91569h-4.28595-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.7699 1.3023-3.2067 2.98888-3.536.2107-3.2539 3.01869-5.78539 6.39207-5.78539.14 0 .279.00435.4169.0129z" | ||||
|             fill="#cfd8dc" /> | ||||
|         <path | ||||
|             d="m10.5714 1.4881c.4142 0 .75.33578.75.75v1.90476c0 .41421-.3358.75-.75.75s-.74997-.33579-.74997-.75v-1.90476c0-.41422.33577-.75.74997-.75z" | ||||
|             fill="#ff884d" /> | ||||
|         <g fill="#e57a45"> | ||||
|             <path | ||||
|                 d="m10.5 1.49146v3.39805c-.3807-.03596-.67859-.35652-.67859-.74665v-1.90476c0-.39013.29789-.71068.67859-.74664z" /> | ||||
|             <path | ||||
|                 d="m1.25 10.3333c0-.41417.33579-.74996.75-.74996h1.90476c.41422 0 .75.33579.75.74996 0 .4143-.33578.75-.75.75h-1.90476c-.41421 0-.75-.3357-.75-.75z" /> | ||||
|             <path | ||||
|                 d="m3.85063 4.08872c.29289-.29289.76776-.29289 1.06066 0l1.34687 1.34687c.29289.29289.29289.76777 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-1.34687-1.34687c-.2929-.29289-.2929-.76777 0-1.06066z" /> | ||||
|         </g> | ||||
|         <path | ||||
|             d="m17.2104 4.08872c-.2929-.29289-.7678-.29289-1.0607 0l-1.3468 1.34687c-.2929.29289-.2929.76777 0 1.06066s.7677.29289 1.0606 0l1.3469-1.34687c.2929-.29289.2929-.76777 0-1.06066z" | ||||
|             fill="#ff884d" /> | ||||
|         <path | ||||
|             d="m16.4881 10.3333c0-.41417.3358-.74996.75-.74996h1.9048c.4142 0 .75.33579.75.74996 0 .4143-.3358.75-.75.75h-1.9048c-.4142 0-.75-.3357-.75-.75z" | ||||
|             fill="#ff884d" /> | ||||
|     </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.4 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><g fill="#45B0E5"><path d="m12.0003 1.25c.4142 0 .75.33579.75.75v20c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-20c0-.41421.3358-.75.75-.75z"/><path d="m8.69303 1.87619c.33138-.24852.80148-.18137 1.05.15l2.25717 3.00953 2.2571-3.00953c.2485-.33137.7186-.39852 1.05-.15.3314.24853.3985.71863.15 1.05l-2.8467 3.79562c-.0237.03322-.0504.06479-.08.09431-.0627.06281-.1346.11257-.2119.14874-.1014.04773-.2103.07099-.3185.0709-.1082.00009-.2171-.02317-.3186-.0709-.0773-.03616-.1492-.08593-.2118-.14874-.0296-.02952-.0563-.06109-.08-.0943l-2.84677-3.79563c-.24852-.33137-.18137-.80147.15-1.05z"/><path d="m8.69303 22.1238c.33138.2485.80148.1814 1.05-.15l2.25717-3.0095 2.2571 3.0095c.2485.3314.7186.3985 1.05.15s.3985-.7186.15-1.05l-2.8467-3.7956c-.0237-.0332-.0504-.0648-.08-.0943-.0627-.0628-.1346-.1126-.2119-.1488-.1014-.0477-.2103-.0709-.3185-.0709s-.2171.0232-.3186.0709c-.0773.0362-.1492.086-.2118.1488-.0296.0295-.0563.0611-.08.0943l-2.84677 3.7956c-.24852.3314-.18137.8015.15 1.05z"/><path d="m2.69035 6.625c.2071-.35872.6658-.48162 1.02451-.27452l17.32054 10.00002c.3587.2071.4816.6658.2745 1.0245s-.6658.4816-1.0245.2745l-17.32054-9.99998c-.35871-.20711-.48162-.6658-.27451-1.02452z"/><path d="m1.57915 9.80218c-.04955-.41124.24366-.78478.6549-.83433l3.7349-.44998-1.47775-3.45951c-.16271-.38091.01418-.82161.39509-.98432.38092-.16272.82162.01418.98433.39509l1.86374 4.36314c.0169.03717.03089.07607.04166.11646.02307.08567.03022.17281.0229.25782-.0094.11175-.0437.21766-.09788.31134-.05404.09376-.12861.17642-.22069.24044-.06996.04884-.149.08622-.23473.10907-.04036.01087-.08104.01821-.12168.02216l-4.71046.56754c-.41124.0495-.78478-.2437-.83433-.65492z"/><path d="m19.1137 19.926c.3809-.1627.5578-.6034.3951-.9843l-1.4777-3.4596 3.7348-.4499c.4113-.0496.7045-.4231.655-.8344-.0496-.4112-.4231-.7044-.8344-.6549l-4.7104.5676c-.0407.0039-.0814.0112-.1217.0221-.0857.0229-.1648.0602-.2347.1091-.0921.064-.1667.1467-.2207.2404-.0542.0937-.0885.1996-.0979.3114-.0073.085-.0002.1721.0229.2578.0108.0404.0247.0793.0416.1164l1.8638 4.3632c.1627.3809.6034.5578.9843.3951z"/><path d="m2.69035 17.375c.2071.3587.6658.4816 1.02451.2745l17.32054-10.00001c.3587-.20711.4816-.6658.2745-1.02452s-.6658-.48163-1.0245-.27452l-17.32054 9.99995c-.35871.2072-.48162.6658-.27451 1.0246z"/><path d="m1.57915 14.1978c-.04955.4113.24366.7848.6549.8344l3.7349.4499-1.47775 3.4595c-.16271.381.01418.8217.39509.9844.38092.1627.82162-.0142.98433-.3951l1.86374-4.3632c.0169-.0371.03089-.076.04166-.1164.02307-.0857.03022-.1728.0229-.2578-.0094-.1118-.0437-.2177-.09788-.3114-.05404-.0938-.12861-.1764-.22069-.2404-.06996-.0489-.149-.0862-.23473-.1091-.04036-.0109-.08104-.0182-.12168-.0222l-4.71046-.5675c-.41124-.0495-.78478.2437-.83433.6549z"/><path d="m19.1137 4.07402c.3809.16271.5578.60341.3951.98433l-1.4777 3.4595 3.7348.44998c.4113.04955.7045.42309.655.83433-.0496.41124-.4231.70444-.8344.65494l-4.7104-.56756c-.0407-.00395-.0814-.01128-.1217-.02215-.0857-.02286-.1648-.06024-.2347-.10908-.0921-.06402-.1667-.14667-.2207-.24044-.0542-.09368-.0885-.19959-.0979-.31134-.0073-.08501-.0002-.17215.0229-.25782.0108-.04038.0247-.07928.0416-.11645l1.8638-4.36314c.1627-.38092.6034-.55781.9843-.3951z"/></g><path d="m12 1.25v21.5c-.4141-.0002-.7497-.3359-.7497-.75v-2.0358l-1.50726 2.0096c-.24853.3314-.71863.3985-1.05.15s-.39853-.7186-.15-1.05l2.70726-3.6096v-4.1653l-3.60728 2.0827-1.7724 4.1493c-.16271.3809-.60341.5578-.98433.3951-.38091-.1627-.5578-.6034-.39509-.9844l.98676-2.31-1.76308 1.0179c-.35872.2071-.81741.0842-1.02452-.2745-.20711-.3588-.0842-.8174.27452-1.0245l1.76296-1.0179-2.49378-.3004c-.41124-.0496-.70445-.4231-.65491-.8344.04955-.4112.42309-.7044.83433-.6549l4.47943.5397 3.60719-2.0826-3.60715-2.08261-4.47947.53971c-.41124.0495-.78478-.2437-.83433-.65493-.04954-.41124.24367-.78478.65491-.83432l2.49383-.30046-1.76301-1.01787c-.35872-.20711-.48163-.6658-.27452-1.02452s.6658-.48163 1.02452-.27452l1.76306 1.0179-.98674-2.31002c-.16271-.38092.01418-.82161.39509-.98432.38092-.16272.82162.01417.98433.39509l1.77238 4.14925 3.6073 2.08262v-4.16515l-2.70726-3.60965c-.24853-.33137-.18137-.80148.15-1.05.33137-.24853.80147-.18137 1.05.15l1.50726 2.00965v-2.03585c0-.41411.3356-.74984.7497-.75z" fill="#45b0e5"/></g></svg> | ||||
| After Width: | Height: | Size: 4.3 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m7.39024 1.73781c-2.03065 0-3.67683 1.64617-3.67683 3.67683v8.60306c-.90458.9259-1.46341 2.1941-1.46341 3.5921 0 2.8388 2.30137 5.1402 5.14024 5.1402 2.83886 0 5.14026-2.3014 5.14026-5.1402 0-1.398-.5588-2.6662-1.4634-3.5921v-8.60306c0-2.03066-1.6462-3.67683-3.67686-3.67683z" fill="#cfd8dc"/><path d="m7.5 1.73942v21.00948c-.03649.0007-.07308.0011-.10976.0011-2.83887 0-5.14024-2.3014-5.14024-5.1402 0-1.398.55883-2.6662 1.46341-3.5921v-8.60306c0-2.03066 1.64618-3.67683 3.67683-3.67683.03672 0 .07331.00054.10976.00161z" fill="#cfd8dc"/><path d="m7.39018 14.9085c-1.49184 0-2.70122 1.2094-2.70122 2.7013 0 1.4918 1.20938 2.7012 2.70122 2.7012 1.49185 0 2.70122-1.2094 2.70122-2.7012 0-1.4919-1.20937-2.7013-2.70122-2.7013z" fill="#ee4d4d"/><path d="m7.5 14.9107v5.3981c-.03642.0014-.07303.0022-.10982.0022-1.49184 0-2.70122-1.2094-2.70122-2.7012 0-1.4919 1.20938-2.7013 2.70122-2.7013.03679 0 .0734.0008.10982.0022z" fill="#d64545"/><path d="m15.1954 5.64024c-1.4919 0-2.7013 1.20938-2.7013 2.70122 0 1.49185 1.2094 2.70124 2.7013 2.70124 1.4918 0 2.7012-1.20939 2.7012-2.70124 0-1.49184-1.2094-2.70122-2.7012-2.70122z" fill="#E5B045"/><path d="m17.892 8.5h-5.3933c.0821 1.41805 1.258 2.5427 2.6967 2.5427 1.4386 0 2.6145-1.12465 2.6966-2.5427z" fill="#e5b045"/><path d="m15.1951 1.25c.4142 0 .75.33579.75.75v1.95122c0 .41421-.3358.75-.75.75s-.75-.33579-.75-.75v-1.95122c0-.41421.3358-.75.75-.75z" fill="#ff884d"/><path d="m15.1951 11.9817c.4142 0 .75.3358.75.75v1.9512c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-1.9512c0-.4142.3358-.75.75-.75z" fill="#e57a45"/><path d="m17.7693 10.9155c.2929-.2929.7678-.2929 1.0607 0l1.3797 1.3797c.2929.2929.2929.7678 0 1.0607s-.7678.2929-1.0607 0l-1.3797-1.3797c-.2929-.2929-.2929-.7678 0-1.0607z" fill="#e57a45"/><path d="m20.2095 3.32705c-.2929-.2929-.7677-.2929-1.0606 0l-1.3797 1.37972c-.2929.29289-.2929.76776 0 1.06066.2929.29289.7677.29289 1.0606 0l1.3797-1.37972c.2929-.2929.2929-.76777 0-1.06066z" fill="#ff884d"/><path d="m18.8354 8.34146c0-.41421.3357-.75.75-.75h1.9512c.4142 0 .75.33579.75.75s-.3358.75-.75.75h-1.9512c-.4143 0-.75-.33579-.75-.75z" fill="#ff884d"/><path d="m22.2698 8.5c-.0727.33807-.3734.59146-.7332.59146h-1.9512c-.3598 0-.6605-.25339-.7332-.59146z" fill="#e57a45"/></g></svg> | ||||
| After Width: | Height: | Size: 2.3 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Ka_bah" data-name="Ka'bah"><path d="m57 12v39l-25 8-25-8v-39l25-7z" fill="#1a1a1a"/><path d="m7 12 25-7 25 7-25 8z" fill="#4d4d4d"/><path d="m32 20-18.33-5.87 18.33-5.13 18.33 5.13z" fill="#333"/><path d="m57 12v39l-12 3.84-9 2.88-4 1.28v-39z"/><path d="m45 38v16.84l-7.83 2.51-1.17.37v-16.72z" fill="#f8be31"/><path d="m36 29.62-4 1.28-4-1.28v4l4 1.28 4-1.28z" fill="#fbd63b"/><path d="m36 29.62-4 1.28v4l4-1.28z" fill="#f8be31"/><path d="m42 27.75-2 2.25 2 2 2-2z" fill="#f8be31"/><path d="m22 27.75-2 2.25 2 2 2-2z" fill="#fbd63b"/><path d="m54 23.86v4l-6 1.92v-4z" fill="#f8be31"/><path d="m10 23.86v4l6 1.92v-4z" fill="#fbd63b"/><path d="m57 14.9v4l-25 8-25-8v-4l25 8z" fill="#fbd63b"/><path d="m57 19-25 8v-4.1l25-7.9z" fill="#f8be31"/><path d="m45 38v16.84l-7.83 2.51a15.3966 15.3966 0 0 0 4.83-4.67 15.5638 15.5638 0 0 0 2.56-7.61z" fill="#f7a62b"/></g></svg> | ||||
| After Width: | Height: | Size: 959 B | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m11.1071 1.25c-3.37334 0-6.18133 2.53144-6.39203 5.78536-1.68658.32932-2.98888 1.76608-2.98888 3.53604 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11901c.5479 0 1.0705-.1149 1.5419-.3225 1.956-.7122 3.3748-2.5408 3.3748-4.71324 0-2.80971-2.3637-5.03572-5.2143-5.03572-.1799 0-.358.00883-.5336.0261-1.1383-1.73901-3.1458-2.88324-5.4188-2.88324z" fill="#cfd8dc"/><path d="m12 1.30962v12.86898h-4.76191-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.76996 1.3023-3.20672 2.98888-3.53604.2107-3.25392 3.01869-5.78536 6.39203-5.78536.3028 0 .6009.02031.8929.05962z" fill="#cfd8dc"/><path d="m7.57334 15.1387c.37049.1853.52065.6358.33541 1.0063l-1.42857 2.8571c-.18524.3705-.63575.5207-1.00623.3354-.37048-.1852-.52065-.6357-.33541-1.0062l1.42857-2.8572c.18524-.3704.63575-.5206 1.00623-.3354z" fill="#45b0e5"/><path d="m12.3356 15.1387c.3705.1853.5207.6358.3354 1.0063l-1.4285 2.8571c-.1853.3705-.6358.5207-1.0063.3354-.37044-.1852-.52061-.6357-.33537-1.0062l1.42857-2.8572c.1852-.3704.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/><path d="m17.0975 15.1387c.3704.1853.5206.6358.3354 1.0063l-1.4286 2.8571c-.1853.3705-.6358.5207-1.0062.3354-.3705-.1852-.5207-.6357-.3355-1.0062l1.4286-2.8572c.1853-.3704.6358-.5206 1.0063-.3354z" fill="#4dc4ff"/><path d="m8.52609 18.472c.37048.1853.52065.6358.33541 1.0062l-1.42858 2.8572c-.18524.3705-.63574.5206-1.00623.3354-.37048-.1852-.52065-.6357-.33541-1.0062l1.42858-2.8572c.18524-.3705.63574-.5206 1.00623-.3354z" fill="#45b0e5"/><path d="m13.2879 18.472c.3705.1853.5207.6358.3354 1.0062l-1.4286 2.8572c-.1852.3705-.6357.5206-1.0062.3354s-.5206-.6357-.3354-1.0062l1.4286-2.8572c.1852-.3705.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/><path d="m12 19.3708v3.209c-.2218.1819-.5384.2276-.8115.091-.3705-.1852-.5206-.6357-.3354-1.0062zm0-4.3114v2.4277l-.7575 1.515c-.1853.3705-.6358.5207-1.0063.3354-.37044-.1852-.52061-.6357-.33537-1.0062l1.42857-2.8572c.1313-.2625.3958-.4144.6706-.4147z" fill="#45b0e5"/><path d="m18.0497 18.472c.3705.1853.5207.6358.3354 1.0062l-1.4285 2.8572c-.1853.3705-.6358.5206-1.0063.3354s-.5206-.6357-.3354-1.0062l1.4286-2.8572c.1852-.3705.6357-.5206 1.0062-.3354z" fill="#4dc4ff"/></g></svg> | ||||
| After Width: | Height: | Size: 2.3 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m12 1.25c.4142 0 .75.33579.75.75v4.54545c0 .41422-.3358.75-.75.75s-.75-.33578-.75-.75v-4.54545c0-.41421.3358-.75.75-.75z" fill="#ff884d"/><path d="m12 16.7046c.4142 0 .75.3357.75.75v4.5454c0 .4142-.3358.75-.75.75s-.75-.3358-.75-.75v-4.5454c0-.4143.3358-.75.75-.75z" fill="#ff884d"/><g fill="#e57a45"><path d="m12 1.25c-.4142 0-.75.33579-.75.75v4.27273c0 .41421.3358.75.75.75z"/><path d="m12 16.9773c-.4142 0-.75.3358-.75.75v4.2727c0 .4142.3358.75.75.75z"/><path d="m4.39843 4.39859c.2929-.29289.76777-.29289 1.06066 0l3.21413 3.21413c.29289.29289.29289.76776 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-3.21413-3.21413c-.29289-.29289-.29289-.76776 0-1.06066z"/></g><path d="m15.3266 15.3266c.2929-.2929.7678-.2929 1.0607 0l3.2141 3.2141c.2929.2929.2929.7678 0 1.0607-.2929.2928-.7678.2928-1.0607 0l-3.2141-3.2142c-.2929-.2929-.2929-.7677 0-1.0606z" fill="#ff884d"/><path d="m19.6011 4.39859c-.2929-.29289-.7678-.29289-1.0607 0l-3.2141 3.21413c-.2929.29289-.2929.76776 0 1.06066.2929.29289.7678.29289 1.0607 0l3.2141-3.21413c.2929-.29289.2929-.76776 0-1.06066z" fill="#ff884d"/><path d="m8.67337 15.3266c-.29289-.2929-.76776-.2929-1.06066 0l-3.21412 3.2141c-.29289.2929-.29289.7678 0 1.0607.2929.2928.76777.2928 1.06066 0l3.21412-3.2142c.2929-.2929.2929-.7677 0-1.0606z" fill="#e57a45"/><path d="m1.25 12c0-.4142.33579-.75.75-.75h4.54545c.41422 0 .75.3358.75.75s-.33578.75-.75.75h-4.54545c-.41421 0-.75-.3358-.75-.75z" fill="#e57a45"/><path d="m16.7043 12c0-.4142.3358-.75.75-.75h4.5455c.4142 0 .75.3358.75.75s-.3358.75-.75.75h-4.5455c-.4142 0-.75-.3358-.75-.75z" fill="#ff884d"/><path d="m12.0004 5.79544c-3.42663 0-6.2045 2.77787-6.2045 6.20456 0 3.4267 2.77787 6.2045 6.2045 6.2045 3.4267 0 6.2046-2.7778 6.2046-6.2045 0-3.42669-2.7779-6.20456-6.2046-6.20456z" fill="#E5B045"/><path d="m12 5.79547v12.40913c-3.42672 0-6.20459-2.7779-6.20459-6.2046 0-3.42666 2.77787-6.20453 6.20459-6.20453z" fill="#e5b045"/></g></svg> | ||||
| After Width: | Height: | Size: 2.0 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m10.5714 5.7738c-2.78119 0-5.03576 2.25457-5.03576 5.0357 0 .8311.20189 1.6171.55995 2.3098.12879.2491.3858.4056.66624.4056h8.09527c.4142 0 .75-.3358.75-.75v-1.4892-.4762c0-2.78113-2.2546-5.0357-5.0357-5.0357z" fill="#E5B045"/><path d="m10.5 5.77429v7.22571h-4.46407c-.32074-.6631-.50029-1.4068-.50029-2.1905 0-2.75731 2.21611-4.99704 4.96436-5.03521z" fill="#e5b045"/><path d="m11.5831 9.58331c-3.37338 0-6.18137 2.53149-6.39207 5.78539-1.68658.3293-2.98888 1.7661-2.98888 3.536 0 2.0208 1.69742 3.6072 3.72619 3.6072h1.78571 10.11905c.5478 0 1.0705-.1149 1.5418-.3225 1.9561-.7122 3.3749-2.5408 3.3749-4.7132 0-2.8097-2.3637-5.0357-5.2143-5.0357-.18 0-.358.0088-.5336.0261-1.1384-1.7391-3.1458-2.88329-5.4188-2.88329z" fill="#cfd8dc"/><path d="m12 9.59621v12.91569h-4.28595-1.78571c-2.02877 0-3.72619-1.5864-3.72619-3.6072 0-1.7699 1.3023-3.2067 2.98888-3.536.2107-3.2539 3.01869-5.78539 6.39207-5.78539.14 0 .279.00435.4169.0129z" fill="#cfd8dc"/><path d="m10.5714 1.4881c.4142 0 .75.33578.75.75v1.90476c0 .41421-.3358.75-.75.75s-.74997-.33579-.74997-.75v-1.90476c0-.41422.33577-.75.74997-.75z" fill="#ff884d"/><g fill="#e57a45"><path d="m10.5 1.49146v3.39805c-.3807-.03596-.67859-.35652-.67859-.74665v-1.90476c0-.39013.29789-.71068.67859-.74664z"/><path d="m1.25 10.3333c0-.41417.33579-.74996.75-.74996h1.90476c.41422 0 .75.33579.75.74996 0 .4143-.33578.75-.75.75h-1.90476c-.41421 0-.75-.3357-.75-.75z"/><path d="m3.85063 4.08872c.29289-.29289.76776-.29289 1.06066 0l1.34687 1.34687c.29289.29289.29289.76777 0 1.06066-.2929.29289-.76777.29289-1.06066 0l-1.34687-1.34687c-.2929-.29289-.2929-.76777 0-1.06066z"/></g><path d="m17.2104 4.08872c-.2929-.29289-.7678-.29289-1.0607 0l-1.3468 1.34687c-.2929.29289-.2929.76777 0 1.06066s.7677.29289 1.0606 0l1.3469-1.34687c.2929-.29289.2929-.76777 0-1.06066z" fill="#ff884d"/><path d="m16.4881 10.3333c0-.41417.3358-.74996.75-.74996h1.9048c.4142 0 .75.33579.75.74996 0 .4143-.3358.75-.75.75h-1.9048c-.4142 0-.75-.3357-.75-.75z" fill="#ff884d"/></g></svg> | ||||
| After Width: | Height: | Size: 2.1 KiB | 
| @ -0,0 +1 @@ | ||||
| <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m14.1957 16.8961c-.394 0-.7135.3194-.7135.7134 0 .3941.3195.7135.7135.7135h7.3174c.4143 0 .75.3358.75.75s-.3357.75-.75.75h-7.3174c-1.2225 0-2.2135-.991-2.2135-2.2135 0-1.2224.991-2.2134 2.2135-2.2134h.4878c.4143 0 .75.3357.75.75 0 .4142-.3357.75-.75.75z" fill="#8b98a6"/><path d="m17.6105 21.25c-.394 0-.7135-.3194-.7135-.7135 0-.394.3195-.7135.7135-.7135h4.3905c.4142 0 .75-.3358.75-.75s-.3358-.75-.75-.75h-4.3905c-1.2225 0-2.2135.991-2.2135 2.2135s.991 2.2135 2.2135 2.2135h.4878c.4143 0 .75-.3358.75-.75s-.3357-.75-.75-.75z" fill="#8b98a6"/><path d="m12 17.8913v-.5635c.1384-1.0894 1.0687-1.9317 2.1957-1.9317h.4879c.4142 0 .75.3357.75.75 0 .4142-.3358.75-.75.75h-.4879c-.394 0-.7135.3194-.7135.7134 0 .3941.3195.7135.7135.7135h3.4119.0029 1.3895v1.5h-1.3911c-.3933.0009-.7119.32-.7119.7135 0 .3941.3195.7135.7135.7135h.4878c.4143 0 .75.3358.75.75s-.3357.75-.75.75h-.4878c-1.2225 0-2.2135-.991-2.2135-2.2135 0-.2496.0414-.4896.1175-.7135h-1.3188c-1.127 0-2.0573-.8423-2.1957-1.9317z" fill="#7d8995"/><path d="m3.70066 15.9224c.39295.131.60532.5557.47434.9487l-.97566 2.9269c-.13098.393-.55572.6054-.94868.4744s-.60533-.5558-.47434-.9487l.97565-2.927c.13099-.3929.55573-.6053.94869-.4743z" fill="#45b0e5"/><path d="m7.11546 15.9224c.39296.131.60533.5557.47434.9487l-.97566 2.9269c-.13098.393-.55572.6054-.94868.4744s-.60533-.5558-.47434-.9487l.97566-2.927c.13098-.3929.55572-.6053.94868-.4743z" fill="#4dc4ff"/><path d="m6.5 15.9863v4.0284c-.1889.2487-.52178.3619-.83452.2577-.39296-.131-.60533-.5558-.47434-.9487l.97565-2.927c.05995-.1798.18142-.3218.33321-.4104z" fill="#45b0e5"/><path d="m10.5303 15.9224c.3929.131.6053.5557.4743.9487l-.9757 2.9269c-.13094.393-.55568.6054-.94864.4744s-.60533-.5558-.47434-.9487l.97565-2.927c.13099-.3929.55573-.6053.94873-.4743z" fill="#4dc4ff"/><path d="m16.6342 1.24902c-3.647.00029-6.6034 2.95687-6.6034 6.60395 0 .18488.0076.36815.0225.54949.0094.11306.0442.22252.102.32016l2.5968 4.39048c.0575.0972.1363.1802.2303.2427 1.0464.6957 2.3032 1.1011 3.6523 1.1011 2.7484 0 5.103-1.6787 6.0976-4.0639.1243-.2981.0438-.64238-.1999-.85442-.2437-.21205-.5958-.24423-.8739-.07988-.614.36283-1.3299.5712-2.0968.5712-.1399 0-.2779-.0069-.4137-.0204-2.0854-.20702-3.7146-1.96764-3.7146-4.10785 0-1.34996.6472-2.54855 1.6513-3.30301.258-.19384.3631-.53101.2609-.83712s-.3887-.51252-.7114-.5125z" fill="#E5B045"/><path d="m16.3634 8.5h-6.2928c.0173.07382.0458.14481.0846.21044l2.5969 4.39046c.0575.0972.1362.1802.2303.2427 1.0464.6958 2.3031 1.1011 3.6523 1.1011 2.7484 0 5.103-1.6787 6.0975-4.0638.1244-.2982.0438-.64245-.1999-.8545-.2437-.21204-.5958-.24422-.8739-.07987-.6139.36282-1.3298.57127-2.0967.57127-.1399 0-.2779-.007-.4138-.02045-1.1205-.11126-2.1094-.67109-2.7845-1.49735z" fill="#e5b045"/><path d="m7.30514 6.1273c-2.11887 0-3.94284 1.49742-4.19586 3.51307-1.04955.29212-1.85928 1.20703-1.85928 2.35913 0 1.4051 1.2044 2.4574 2.57936 2.4574h1.09761 6.21983c.371 0 .7265-.075 1.0487-.2116 1.2952-.4623 2.2624-1.6542 2.2624-3.0995 0-1.87656-1.6139-3.3111-3.494-3.3111-.0636 0-.1268.00162-.1897.00481-.77-1.0448-2.04614-1.71221-3.46906-1.71221z" fill="#cfd8dc"/><path d="m8 6.16899v8.27571h-3.07303-1.09761c-1.37496 0-2.57936-1.0523-2.57936-2.4574 0-1.152.80973-2.06697 1.85928-2.35909.25302-2.01565 2.07699-3.51307 4.19586-3.51307.23621 0 .46838.0184.69486.05385z" fill="#cfd8dc"/></g></svg> | ||||
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 11 KiB | 
| @ -0,0 +1,6 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="28.704" height="36.818" viewBox="0 0 28.704 36.818"> | ||||
|   <g id="doctor_10_" data-name="doctor (10)" transform="translate(-5.291)"> | ||||
|     <path id="Path_5102" data-name="Path 5102" d="M21.572,0a8,8,0,1,0,7.994,8A8,8,0,0,0,21.572,0Z" transform="translate(-1.931)" fill="#52964f"/> | ||||
|     <path id="Path_5103" data-name="Path 5103" d="M25.819,23.474a17.6,17.6,0,0,1,.584,4.767c1.176,1.042,4.261,4.115,3.59,7.147a3.551,3.551,0,0,1-2.485,2.52.767.767,0,0,1-.5-1.452,2.072,2.072,0,0,0,1.477-1.362c.459-2.079-1.842-4.6-3.122-5.726-1.531.743-4.426,2.567-4.538,4.654a2.057,2.057,0,0,0,1.055,1.742.767.767,0,1,1-.863,1.269A3.545,3.545,0,0,1,19.3,33.9c.174-3.241,4.41-5.449,5.592-6a20.9,20.9,0,0,0-.759-4.869.855.855,0,0,1-.008-.125,13.292,13.292,0,0,0-3.5-.48H18.657a13.318,13.318,0,0,0-3.9.585.7.7,0,0,1-.043.164,33.366,33.366,0,0,0-2.471,8.754,3.142,3.142,0,1,1-1.546-.035,37.409,37.409,0,0,1,2.081-8.085A13.373,13.373,0,0,0,5.291,35.793v5.482a.766.766,0,0,0,.767.767h27.17A.776.776,0,0,0,34,41.264V35.793a13.392,13.392,0,0,0-8.177-12.319Z" transform="translate(0 -5.223)" fill="#52964f"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.1 KiB | 
| @ -0,0 +1,6 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="54.029" height="58" viewBox="0 0 54.029 58"> | ||||
|   <g id="doctor_2_" data-name="Doctor (2)" transform="translate(-4.985 -3)"> | ||||
|     <path id="Path_57" data-name="Path 57" d="M49.73,40,47,39.43c1.51,3,.89,5.33,1,7.71a4,4,0,1,1-2,0c-.2-2.18.71-5.24-1.72-8.24l-6.36-1.23a13.83,13.83,0,0,1-11.84,0L19.72,38.9A7.68,7.68,0,0,0,18,43.77v.33a5.21,5.21,0,0,1,4.11,4.16l.95,5.2a3,3,0,0,1-.65,2.46c-1.19,1.44-2.83,1-3.41,1.08V55c.6-.07,1.42.21,1.87-.36a1,1,0,0,0,.22-.82l-.95-5.2a3.19,3.19,0,0,0-6.28,0l-.95,5.2a1,1,0,0,0,1,1.18H15v2H13.9a3.006,3.006,0,0,1-2.96-3.54l1-5.2A5.21,5.21,0,0,1,16,44.1v-.33a9.61,9.61,0,0,1,1-4.34L14.27,40A9.05,9.05,0,0,0,7.1,47.32L5,59.83A1,1,0,0,0,6,61H27.42a1,1,0,0,0,1-1.16l-3-18.57,5.83,4.32a1,1,0,0,0,1.18,0l6.24-4.42-3,18.65a1,1,0,0,0,1,1.16H58a1,1,0,0,0,1-1.17L56.9,47.32A9.05,9.05,0,0,0,49.73,40Z" fill="#ec1c2b"/> | ||||
|     <path id="Path_58" data-name="Path 58" d="M39.77,34.13A11.94,11.94,0,0,0,44,25.9,5,5,0,0,0,46,17c.34-1.32,1.76-7.65-1.32-10.73-2.3-2.27-5.8-1.78-7.3-1.42C36.66,4.09,35.1,3,32,3,27.65,3,20.38,3,18.11,7.55c-1.79,3.57-1,8.35-.7,10a5,5,0,0,0,2.64,8.36,11.94,11.94,0,0,0,4.18,8.23,9.74,9.74,0,0,0-7.2,5.3l2.69-.53A7.73,7.73,0,0,1,25.77,36h1.45a12,12,0,0,0,9.56,0h1.45a7.73,7.73,0,0,1,6.05,2.9l2.69.52A9.77,9.77,0,0,0,39.77,34.13ZM44,18.35l.25-.08A3,3,0,0,1,44,23.82ZM20,23.82a3,3,0,0,1-1-5.07l1-.34ZM32,35A10,10,0,0,1,22,25V20a41.82,41.82,0,0,0,8.24-1,11.86,11.86,0,0,0,5.47-3.11c1.56,2.55,4.81,3.78,6.29,4.23V25A10,10,0,0,1,32,35Z" fill="#ec1c2b"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.5 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| @ -0,0 +1,7 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="36.818" height="36.818" viewBox="0 0 36.818 36.818"> | ||||
|   <g id="_x30_6" transform="translate(-2 -2)"> | ||||
|     <path id="Path_5097" data-name="Path 5097" d="M7.26,16.753a3.945,3.945,0,1,1,5.26,0v3.389c4.5-.973,5.26-4.465,5.26-6.683C17.779,8.9,14.633,2,9.89,2S2,8.9,2,13.459c0,2.218.761,5.71,5.26,6.683Z" transform="translate(0 0)" fill="#3c86d0"/> | ||||
|     <path id="Path_5098" data-name="Path 5098" d="M19.149,31.354a2.63,2.63,0,1,0-2.264-3.945H12.575a2.632,2.632,0,0,1-2.63-2.63V23.464a1.315,1.315,0,0,0,1.315-1.315V19.52A1.315,1.315,0,0,0,9.945,18.2V14.26a1.267,1.267,0,0,0-.067-.33,2.63,2.63,0,1,0-2.5,0,1.267,1.267,0,0,0-.067.33V18.2A1.315,1.315,0,0,0,6,19.52v2.63a1.315,1.315,0,0,0,1.315,1.315v1.315a5.266,5.266,0,0,0,5.26,5.26h4.311A2.621,2.621,0,0,0,19.149,31.354Z" transform="translate(1.26 2.205)" fill="#3c86d0"/> | ||||
|     <path id="Path_5099" data-name="Path 5099" d="M31.409,18H16.945A3.949,3.949,0,0,0,13,21.945V23.26h1.026a3.945,3.945,0,1,1,0,5.26H13v1.315a3.949,3.949,0,0,0,3.945,3.945H31.409a3.949,3.949,0,0,0,3.945-3.945v-7.89A3.949,3.949,0,0,0,31.409,18Zm-5.26,10.52a2.63,2.63,0,1,1,2.63-2.63A2.632,2.632,0,0,1,26.149,28.52Zm5.26-.657a.657.657,0,0,1-1.315,0V23.917a.657.657,0,0,1,1.315,0Zm2.63,0a.657.657,0,0,1-1.315,0V23.917a.657.657,0,1,1,1.315,0Z" transform="translate(3.464 5.039)" fill="#3c86d0"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
| @ -0,0 +1,5 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="39.381" height="52.784" viewBox="0 0 39.381 52.784"> | ||||
|   <g id="Nurse" transform="translate(-5.723 -2.226)"> | ||||
|     <path id="Path_59" data-name="Path 59" d="M45.087,45.928V27.887a19.741,19.741,0,0,0-6.162-14.293L40.6,9.762a1.916,1.916,0,0,0-.529-2.24,25.573,25.573,0,0,0-15.1-5.3,23.107,23.107,0,0,0-14.425,5.26A1.914,1.914,0,0,0,9.918,9.64l1.566,4.4A19.736,19.736,0,0,0,5.746,27.889V45.93S4.893,54.321,13.537,55c0,0,5.061.341,7.6-4.018A13.249,13.249,0,0,1,12.018,38.44l-.084-5.787a1.917,1.917,0,0,1,.416-3.811c6,.657,10.4-.165,12.745-2.366a5.938,5.938,0,0,0,1.878-4.354,1.943,1.943,0,0,1,2.037-1.83,1.881,1.881,0,0,1,1.788,1.83c0,.029.218,3.652,2.562,5.651a6.749,6.749,0,0,0,5.285,1.3,1.912,1.912,0,0,1,2.108,1.7,1.949,1.949,0,0,1-2.23,2.137l.031,5.513a13.242,13.242,0,0,1-8.9,12.5c2.577,4.606,7.927,4.055,7.927,4.055,8.24-1.1,7.511-9.048,7.511-9.048ZM31.294,11.995a.869.869,0,0,1-.87.868H27.564v2.832a.87.87,0,0,1-.868.87h-2.56a.87.87,0,0,1-.868-.87V12.863H20.407a.869.869,0,0,1-.87-.868V9.475a.871.871,0,0,1,.87-.87h2.861V5.779a.869.869,0,0,1,.868-.87H26.7a.869.869,0,0,1,.868.87V8.6h2.861a.871.871,0,0,1,.87.87Z" transform="translate(0 0)" fill="#1f8d24"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.2 KiB | 
| @ -0,0 +1,3 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="34.908" height="36.818" viewBox="0 0 34.908 36.818"> | ||||
|   <path id="blood-test" d="M33.07,14.711H24.688v3.537H26.1a.522.522,0,0,1,0,1.043H24.688v2.618H27.95a.522.522,0,0,1,0,1.043H24.688V25.57H26.1a.522.522,0,0,1,0,1.043H24.688V30.6h4.62a10.235,10.235,0,0,0,4.806,5.97v4.011a5.235,5.235,0,0,1-10.47,0V14.7a2.079,2.079,0,0,1-1.829-2.06V11.075A2.078,2.078,0,0,1,23.89,9h9.978a2.078,2.078,0,0,1,2.075,2.075v1.562a2.079,2.079,0,0,1-1.829,2.06v4.042a10.224,10.224,0,0,0-1.043.669v-4.7ZM46.976,36.933l1.384-1.384a1.179,1.179,0,0,1,1.662,0l6.359,6.359a1.179,1.179,0,0,1,0,1.662L55,44.954a1.179,1.179,0,0,1-1.662,0l-6.359-6.359a1.179,1.179,0,0,1,0-1.662ZM39.082,21.193a6.463,6.463,0,1,0,6.463,6.463,6.463,6.463,0,0,0-6.463-6.463Zm1.5,9.109a2.125,2.125,0,0,1-3,0c-.824-.824-.609-2.474,0-3.468l1.5-2.442,1.5,2.442c.609.993.824,2.644,0,3.468Zm7.666-2.646a9.163,9.163,0,1,0-3.653,7.322l1.446,1.446a2.223,2.223,0,0,1,.2-.228l1.384-1.384a2.213,2.213,0,0,1,.228-.2L46.4,33.167a9.123,9.123,0,0,0,1.842-5.511Zm-9.164,7.506a7.506,7.506,0,1,1,7.506-7.506,7.506,7.506,0,0,1-7.506,7.506Z" transform="translate(-21.815 -9)" fill="#c99609" fill-rule="evenodd"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 16 KiB | 
| @ -0,0 +1,6 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="36.819" height="36.819" viewBox="0 0 36.819 36.819"> | ||||
|   <g id="syringe_3_" data-name="syringe (3)" transform="translate(0.002 0)"> | ||||
|     <path id="Path_5100" data-name="Path 5100" d="M20.326,80.649A1.079,1.079,0,1,0,18.8,82.175l1.548,1.548L17.83,86.241l1.733,1.733A1.079,1.079,0,1,1,18.038,89.5L16.3,87.767l-2.518,2.518,1.733,1.733a1.079,1.079,0,1,1-1.525,1.525l-1.733-1.733L9.743,94.329l1.733,1.733A1.079,1.079,0,0,1,9.95,97.588L8.217,95.854,6.768,97.3a3.367,3.367,0,0,0-.993,2.4v4.373L.314,109.534A1.079,1.079,0,0,0,1.84,111.06L7.3,105.6h4.373a3.368,3.368,0,0,0,2.4-.993l13.58-13.581L29.2,92.573a1.079,1.079,0,0,0,1.525-1.525Z" transform="translate(0 -74.556)" fill="#ea2864"/> | ||||
|     <path id="Path_5101" data-name="Path 5101" d="M375.793,7.669,368.441.316a1.079,1.079,0,1,0-1.526,1.525l2.914,2.914L365.58,9l1.525,1.525,4.249-4.249,2.914,2.914a1.079,1.079,0,0,0,1.526-1.526Z" transform="translate(-339.292 0)" fill="#ea2864"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 985 B | 
| @ -0,0 +1,8 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="58" height="36.818" viewBox="0 0 58 36.818"> | ||||
|   <g id="heart-rate" transform="translate(-6.46 -15.787)"> | ||||
|     <path id="Path_5093" data-name="Path 5093" d="M45.091,35.4,39.9,28.233l-5.416,6.781a2.626,2.626,0,0,1-3.743.364l-4.858-4.1L23.814,35.64a4.3,4.3,0,0,1-3.869,2.446H19.16l12.88,12.88L46.422,36.584A4.254,4.254,0,0,1,45.091,35.4Z" transform="translate(1.694 1.639)" fill="#d02127"/> | ||||
|     <path id="Path_5094" data-name="Path 5094" d="M23.617,31.245A3.427,3.427,0,0,1,28.93,30.1l4.255,3.6,4.927-6.167a3.427,3.427,0,0,1,5.462.125l5.518,7.623h1.183a11.817,11.817,0,0,0-17.352-16.02A11.819,11.819,0,0,0,16.21,35.966l.228.228h4.824Z" transform="translate(0.866 0)" fill="#d02127"/> | ||||
|     <path id="Path_5095" data-name="Path 5095" d="M8.258,33.723a1.8,1.8,0,0,0,0,3.607H20.91L17.3,33.723Z" transform="translate(0 2.425)" fill="#d02127"/> | ||||
|     <path id="Path_5096" data-name="Path 5096" d="M57.729,32.913H46.09l-2.97,3.027a4.208,4.208,0,0,0,2.128.58H57.729a1.8,1.8,0,0,0,0-3.607Z" transform="translate(4.933 2.316)" fill="#d02127"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.1 KiB | 
| @ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="iso-8859-1"?> | ||||
| <!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||
| 	 viewBox="0 0 297 297" style="enable-background:new 0 0 297 297;" xml:space="preserve"> | ||||
| <path d="M251.01,277.015h-17.683l-0.002-31.559c0-31.639-17.358-60.726-48.876-81.901c-3.988-2.682-6.466-8.45-6.466-15.055 | ||||
| 	s2.478-12.373,6.464-15.053c31.52-21.178,48.878-50.264,48.88-81.904V19.985h17.683c5.518,0,9.992-4.475,9.992-9.993 | ||||
| 	c0-5.518-4.475-9.992-9.992-9.992H45.99c-5.518,0-9.992,4.475-9.992,9.992c0,5.519,4.475,9.993,9.992,9.993h17.683v31.558 | ||||
| 	c0,31.642,17.357,60.729,48.875,81.903c3.989,2.681,6.467,8.448,6.467,15.054c0,6.605-2.478,12.373-6.466,15.053 | ||||
| 	c-31.519,21.176-48.876,50.263-48.876,81.903v31.559H45.99c-5.518,0-9.992,4.475-9.992,9.993c0,5.519,4.475,9.992,9.992,9.992 | ||||
| 	h205.02c5.518,0,9.992-4.474,9.992-9.992C261.002,281.489,256.527,277.015,251.01,277.015z M138.508,110.362 | ||||
| 	c0-5.518,4.474-9.993,9.992-9.993s9.992,4.475,9.992,9.993v17.664c0,5.519-4.474,9.992-9.992,9.992s-9.992-4.474-9.992-9.992 | ||||
| 	V110.362z M141.433,173.956c1.858-1.857,4.436-2.927,7.064-2.927c2.628,0,5.206,1.069,7.064,2.927 | ||||
| 	c1.868,1.859,2.928,4.438,2.928,7.065s-1.06,5.206-2.928,7.064c-1.858,1.858-4.436,2.928-7.064,2.928 | ||||
| 	c-2.628,0-5.206-1.069-7.064-2.928c-1.859-1.858-2.928-4.437-2.928-7.064S139.573,175.816,141.433,173.956z M86.94,277.112 | ||||
| 	c8.152-30.906,50.161-64.536,55.405-68.635c3.614-2.826,8.692-2.828,12.309,0c5.244,4.1,47.252,37.729,55.404,68.635H86.94z"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.7 KiB | 
| @ -0,0 +1,3 @@ | ||||
| description: This file stores settings for Dart & Flutter DevTools. | ||||
| documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states | ||||
| extensions: | ||||
| @ -0,0 +1,34 @@ | ||||
| **/dgph | ||||
| *.mode1v3 | ||||
| *.mode2v3 | ||||
| *.moved-aside | ||||
| *.pbxuser | ||||
| *.perspectivev3 | ||||
| **/*sync/ | ||||
| .sconsign.dblite | ||||
| .tags* | ||||
| **/.vagrant/ | ||||
| **/DerivedData/ | ||||
| Icon? | ||||
| **/Pods/ | ||||
| **/.symlinks/ | ||||
| profile | ||||
| xcuserdata | ||||
| **/.generated/ | ||||
| Flutter/App.framework | ||||
| Flutter/Flutter.framework | ||||
| Flutter/Flutter.podspec | ||||
| Flutter/Generated.xcconfig | ||||
| Flutter/ephemeral/ | ||||
| Flutter/app.flx | ||||
| Flutter/app.zip | ||||
| Flutter/flutter_assets/ | ||||
| Flutter/flutter_export_environment.sh | ||||
| ServiceDefinitions.json | ||||
| Runner/GeneratedPluginRegistrant.* | ||||
| 
 | ||||
| # Exceptions to above rules. | ||||
| !default.mode1v3 | ||||
| !default.mode2v3 | ||||
| !default.pbxuser | ||||
| !default.perspectivev3 | ||||
| @ -0,0 +1,26 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
|   <key>CFBundleDevelopmentRegion</key> | ||||
|   <string>en</string> | ||||
|   <key>CFBundleExecutable</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundleIdentifier</key> | ||||
|   <string>io.flutter.flutter.app</string> | ||||
|   <key>CFBundleInfoDictionaryVersion</key> | ||||
|   <string>6.0</string> | ||||
|   <key>CFBundleName</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundlePackageType</key> | ||||
|   <string>FMWK</string> | ||||
|   <key>CFBundleShortVersionString</key> | ||||
|   <string>1.0</string> | ||||
|   <key>CFBundleSignature</key> | ||||
|   <string>????</string> | ||||
|   <key>CFBundleVersion</key> | ||||
|   <string>1.0</string> | ||||
|   <key>MinimumOSVersion</key> | ||||
|   <string>12.0</string> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1 @@ | ||||
| #include "Generated.xcconfig" | ||||
| @ -0,0 +1 @@ | ||||
| #include "Generated.xcconfig" | ||||
| @ -0,0 +1,616 @@ | ||||
| // !$*UTF8*$! | ||||
| { | ||||
| 	archiveVersion = 1; | ||||
| 	classes = { | ||||
| 	}; | ||||
| 	objectVersion = 54; | ||||
| 	objects = { | ||||
| 
 | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||
| 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; | ||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | ||||
| 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; | ||||
| 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; | ||||
| 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; | ||||
| 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; | ||||
| /* End PBXBuildFile section */ | ||||
| 
 | ||||
| /* Begin PBXContainerItemProxy section */ | ||||
| 		331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 97C146E61CF9000F007C117D /* Project object */; | ||||
| 			proxyType = 1; | ||||
| 			remoteGlobalIDString = 97C146ED1CF9000F007C117D; | ||||
| 			remoteInfo = Runner; | ||||
| 		}; | ||||
| /* End PBXContainerItemProxy section */ | ||||
| 
 | ||||
| /* Begin PBXCopyFilesBuildPhase section */ | ||||
| 		9705A1C41CF9048500538489 /* Embed Frameworks */ = { | ||||
| 			isa = PBXCopyFilesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			dstPath = ""; | ||||
| 			dstSubfolderSpec = 10; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			name = "Embed Frameworks"; | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXCopyFilesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXFileReference section */ | ||||
| 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; | ||||
| 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | ||||
| 		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; | ||||
| 		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | ||||
| 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | ||||
| 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; | ||||
| 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | ||||
| 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
| /* End PBXFileReference section */ | ||||
| 
 | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		97C146EB1CF9000F007C117D /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXFrameworksBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXGroup section */ | ||||
| 		331C8082294A63A400263BE5 /* RunnerTests */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				331C807B294A618700263BE5 /* RunnerTests.swift */, | ||||
| 			); | ||||
| 			path = RunnerTests; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		9740EEB11CF90186004384FC /* Flutter */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, | ||||
| 				9740EEB21CF90195004384FC /* Debug.xcconfig */, | ||||
| 				7AFA3C8E1D35360C0083082E /* Release.xcconfig */, | ||||
| 				9740EEB31CF90195004384FC /* Generated.xcconfig */, | ||||
| 			); | ||||
| 			name = Flutter; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146E51CF9000F007C117D = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				9740EEB11CF90186004384FC /* Flutter */, | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 				331C8082294A63A400263BE5 /* RunnerTests */, | ||||
| 			); | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146EF1CF9000F007C117D /* Products */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146EE1CF9000F007C117D /* Runner.app */, | ||||
| 				331C8081294A63A400263BE5 /* RunnerTests.xctest */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146F01CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146FA1CF9000F007C117D /* Main.storyboard */, | ||||
| 				97C146FD1CF9000F007C117D /* Assets.xcassets */, | ||||
| 				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, | ||||
| 				97C147021CF9000F007C117D /* Info.plist */, | ||||
| 				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, | ||||
| 				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, | ||||
| 				74858FAE1ED2DC5600515810 /* AppDelegate.swift */, | ||||
| 				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, | ||||
| 			); | ||||
| 			path = Runner; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
| 
 | ||||
| /* Begin PBXNativeTarget section */ | ||||
| 		331C8080294A63A400263BE5 /* RunnerTests */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; | ||||
| 			buildPhases = ( | ||||
| 				331C807D294A63A400263BE5 /* Sources */, | ||||
| 				331C807F294A63A400263BE5 /* Resources */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 				331C8086294A63A400263BE5 /* PBXTargetDependency */, | ||||
| 			); | ||||
| 			name = RunnerTests; | ||||
| 			productName = RunnerTests; | ||||
| 			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; | ||||
| 			productType = "com.apple.product-type.bundle.unit-test"; | ||||
| 		}; | ||||
| 		97C146ED1CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; | ||||
| 			buildPhases = ( | ||||
| 				9740EEB61CF901F6004384FC /* Run Script */, | ||||
| 				97C146EA1CF9000F007C117D /* Sources */, | ||||
| 				97C146EB1CF9000F007C117D /* Frameworks */, | ||||
| 				97C146EC1CF9000F007C117D /* Resources */, | ||||
| 				9705A1C41CF9048500538489 /* Embed Frameworks */, | ||||
| 				3B06AD1E1E4923F5004D2608 /* Thin Binary */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			name = Runner; | ||||
| 			productName = Runner; | ||||
| 			productReference = 97C146EE1CF9000F007C117D /* Runner.app */; | ||||
| 			productType = "com.apple.product-type.application"; | ||||
| 		}; | ||||
| /* End PBXNativeTarget section */ | ||||
| 
 | ||||
| /* Begin PBXProject section */ | ||||
| 		97C146E61CF9000F007C117D /* Project object */ = { | ||||
| 			isa = PBXProject; | ||||
| 			attributes = { | ||||
| 				BuildIndependentTargetsInParallel = YES; | ||||
| 				LastUpgradeCheck = 1510; | ||||
| 				ORGANIZATIONNAME = ""; | ||||
| 				TargetAttributes = { | ||||
| 					331C8080294A63A400263BE5 = { | ||||
| 						CreatedOnToolsVersion = 14.0; | ||||
| 						TestTargetID = 97C146ED1CF9000F007C117D; | ||||
| 					}; | ||||
| 					97C146ED1CF9000F007C117D = { | ||||
| 						CreatedOnToolsVersion = 7.3.1; | ||||
| 						LastSwiftMigration = 1100; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; | ||||
| 			compatibilityVersion = "Xcode 9.3"; | ||||
| 			developmentRegion = en; | ||||
| 			hasScannedForEncodings = 0; | ||||
| 			knownRegions = ( | ||||
| 				en, | ||||
| 				Base, | ||||
| 			); | ||||
| 			mainGroup = 97C146E51CF9000F007C117D; | ||||
| 			productRefGroup = 97C146EF1CF9000F007C117D /* Products */; | ||||
| 			projectDirPath = ""; | ||||
| 			projectRoot = ""; | ||||
| 			targets = ( | ||||
| 				97C146ED1CF9000F007C117D /* Runner */, | ||||
| 				331C8080294A63A400263BE5 /* RunnerTests */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| 
 | ||||
| /* Begin PBXResourcesBuildPhase section */ | ||||
| 		331C807F294A63A400263BE5 /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		97C146EC1CF9000F007C117D /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, | ||||
| 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, | ||||
| 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, | ||||
| 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXResourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXShellScriptBuildPhase section */ | ||||
| 		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			alwaysOutOfDate = 1; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", | ||||
| 			); | ||||
| 			name = "Thin Binary"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; | ||||
| 		}; | ||||
| 		9740EEB61CF901F6004384FC /* Run Script */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			alwaysOutOfDate = 1; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Run Script"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | ||||
| 		}; | ||||
| /* End PBXShellScriptBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| 		331C807D294A63A400263BE5 /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		97C146EA1CF9000F007C117D /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, | ||||
| 				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXSourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXTargetDependency section */ | ||||
| 		331C8086294A63A400263BE5 /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 97C146ED1CF9000F007C117D /* Runner */; | ||||
| 			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| /* End PBXTargetDependency section */ | ||||
| 
 | ||||
| /* Begin PBXVariantGroup section */ | ||||
| 		97C146FA1CF9000F007C117D /* Main.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C146FB1CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = Main.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C147001CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = LaunchScreen.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXVariantGroup section */ | ||||
| 
 | ||||
| /* Begin XCBuildConfiguration section */ | ||||
| 		249021D3217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = NO; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		249021D4217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		331C8088294A63A400263BE5 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		331C8089294A63A400263BE5 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		331C808A294A63A400263BE5 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				GENERATE_INFOPLIST_FILE = YES; | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline.RunnerTests; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		97C147031CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = dwarf; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_TESTABILITY = YES; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = NO; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_DYNAMIC_NO_PIC = NO; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_OPTIMIZATION_LEVEL = 0; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147041CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_USER_SCRIPT_SANDBOXING = NO; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				SWIFT_COMPILATION_MODE = wholemodule; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-O"; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		97C147061CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147071CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.hmgqline.hmgQline; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| /* End XCBuildConfiguration section */ | ||||
| 
 | ||||
| /* Begin XCConfigurationList section */ | ||||
| 		331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				331C8088294A63A400263BE5 /* Debug */, | ||||
| 				331C8089294A63A400263BE5 /* Release */, | ||||
| 				331C808A294A63A400263BE5 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147031CF9000F007C117D /* Debug */, | ||||
| 				97C147041CF9000F007C117D /* Release */, | ||||
| 				249021D3217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147061CF9000F007C117D /* Debug */, | ||||
| 				97C147071CF9000F007C117D /* Release */, | ||||
| 				249021D4217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* End XCConfigurationList section */ | ||||
| 	}; | ||||
| 	rootObject = 97C146E61CF9000F007C117D /* Project object */; | ||||
| } | ||||
| @ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "self:"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,98 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Scheme | ||||
|    LastUpgradeVersion = "1510" | ||||
|    version = "1.3"> | ||||
|    <BuildAction | ||||
|       parallelizeBuildables = "YES" | ||||
|       buildImplicitDependencies = "YES"> | ||||
|       <BuildActionEntries> | ||||
|          <BuildActionEntry | ||||
|             buildForTesting = "YES" | ||||
|             buildForRunning = "YES" | ||||
|             buildForProfiling = "YES" | ||||
|             buildForArchiving = "YES" | ||||
|             buildForAnalyzing = "YES"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|                BuildableName = "Runner.app" | ||||
|                BlueprintName = "Runner" | ||||
|                ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </BuildActionEntry> | ||||
|       </BuildActionEntries> | ||||
|    </BuildAction> | ||||
|    <TestAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES"> | ||||
|       <MacroExpansion> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </MacroExpansion> | ||||
|       <Testables> | ||||
|          <TestableReference | ||||
|             skipped = "NO" | ||||
|             parallelizable = "YES"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "331C8080294A63A400263BE5" | ||||
|                BuildableName = "RunnerTests.xctest" | ||||
|                BlueprintName = "RunnerTests" | ||||
|                ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </TestableReference> | ||||
|       </Testables> | ||||
|    </TestAction> | ||||
|    <LaunchAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       launchStyle = "0" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       ignoresPersistentStateOnLaunch = "NO" | ||||
|       debugDocumentVersioning = "YES" | ||||
|       debugServiceExtension = "internal" | ||||
|       allowLocationSimulation = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </LaunchAction> | ||||
|    <ProfileAction | ||||
|       buildConfiguration = "Profile" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES" | ||||
|       savedToolIdentifier = "" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       debugDocumentVersioning = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </ProfileAction> | ||||
|    <AnalyzeAction | ||||
|       buildConfiguration = "Debug"> | ||||
|    </AnalyzeAction> | ||||
|    <ArchiveAction | ||||
|       buildConfiguration = "Release" | ||||
|       revealArchiveInOrganizer = "YES"> | ||||
|    </ArchiveAction> | ||||
| </Scheme> | ||||
| @ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "group:Runner.xcodeproj"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,13 @@ | ||||
| import Flutter | ||||
| import UIKit | ||||
| 
 | ||||
| @main | ||||
| @objc class AppDelegate: FlutterAppDelegate { | ||||
|   override func application( | ||||
|     _ application: UIApplication, | ||||
|     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | ||||
|   ) -> Bool { | ||||
|     GeneratedPluginRegistrant.register(with: self) | ||||
|     return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,122 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "83.5x83.5", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-83.5x83.5@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "1024x1024", | ||||
|       "idiom" : "ios-marketing", | ||||
|       "filename" : "Icon-App-1024x1024@1x.png", | ||||
|       "scale" : "1x" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 11 KiB | 
| After Width: | Height: | Size: 295 B | 
| After Width: | Height: | Size: 406 B | 
| After Width: | Height: | Size: 450 B | 
| After Width: | Height: | Size: 282 B | 
| After Width: | Height: | Size: 462 B | 
| After Width: | Height: | Size: 704 B | 
| After Width: | Height: | Size: 406 B | 
| After Width: | Height: | Size: 586 B | 
| After Width: | Height: | Size: 862 B | 
| After Width: | Height: | Size: 862 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 762 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| @ -0,0 +1,23 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "universal", | ||||
|       "filename" : "LaunchImage@3x.png", | ||||
|       "scale" : "3x" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 68 B | 
| After Width: | Height: | Size: 68 B | 
| After Width: | Height: | Size: 68 B | 
| @ -0,0 +1,5 @@ | ||||
| # Launch Screen Assets | ||||
| 
 | ||||
| You can customize the launch screen with your own desired assets by replacing the image files in this directory. | ||||
| 
 | ||||
| You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. | ||||
| @ -0,0 +1,37 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--View Controller--> | ||||
|         <scene sceneID="EHf-IW-A2E"> | ||||
|             <objects> | ||||
|                 <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <subviews> | ||||
|                             <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> | ||||
|                             </imageView> | ||||
|                         </subviews> | ||||
|                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||||
|                         <constraints> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> | ||||
|                         </constraints> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|             <point key="canvasLocation" x="53" y="375"/> | ||||
|         </scene> | ||||
|     </scenes> | ||||
|     <resources> | ||||
|         <image name="LaunchImage" width="168" height="185"/> | ||||
|     </resources> | ||||
| </document> | ||||
| @ -0,0 +1,26 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--Flutter View Controller--> | ||||
|         <scene sceneID="tne-QT-ifu"> | ||||
|             <objects> | ||||
|                 <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|         </scene> | ||||
|     </scenes> | ||||
| </document> | ||||
| @ -0,0 +1,49 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CFBundleDevelopmentRegion</key> | ||||
| 	<string>$(DEVELOPMENT_LANGUAGE)</string> | ||||
| 	<key>CFBundleDisplayName</key> | ||||
| 	<string>Hmg Qline</string> | ||||
| 	<key>CFBundleExecutable</key> | ||||
| 	<string>$(EXECUTABLE_NAME)</string> | ||||
| 	<key>CFBundleIdentifier</key> | ||||
| 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||||
| 	<key>CFBundleInfoDictionaryVersion</key> | ||||
| 	<string>6.0</string> | ||||
| 	<key>CFBundleName</key> | ||||
| 	<string>hmg_qline</string> | ||||
| 	<key>CFBundlePackageType</key> | ||||
| 	<string>APPL</string> | ||||
| 	<key>CFBundleShortVersionString</key> | ||||
| 	<string>$(FLUTTER_BUILD_NAME)</string> | ||||
| 	<key>CFBundleSignature</key> | ||||
| 	<string>????</string> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
| 	<key>LSRequiresIPhoneOS</key> | ||||
| 	<true/> | ||||
| 	<key>UILaunchStoryboardName</key> | ||||
| 	<string>LaunchScreen</string> | ||||
| 	<key>UIMainStoryboardFile</key> | ||||
| 	<string>Main</string> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>CADisableMinimumFrameDurationOnPhone</key> | ||||
| 	<true/> | ||||
| 	<key>UIApplicationSupportsIndirectInputEvents</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1 @@ | ||||
| #import "GeneratedPluginRegistrant.h" | ||||
| @ -0,0 +1,12 @@ | ||||
| import Flutter | ||||
| import UIKit | ||||
| import XCTest | ||||
| 
 | ||||
| class RunnerTests: XCTestCase { | ||||
| 
 | ||||
|   func testExample() { | ||||
|     // If you add code to the Runner application, consider adding tests here. | ||||
|     // See https://developer.apple.com/documentation/xctest for more information about using XCTest. | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,243 @@ | ||||
| import 'dart:async'; | ||||
| import 'dart:convert'; | ||||
| import 'dart:developer'; | ||||
| import 'dart:io'; | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:http/io_client.dart'; | ||||
| import 'package:hmg_qline/constants/app_constants.dart'; | ||||
| import 'package:hmg_qline/utilities/api_exception.dart'; | ||||
| 
 | ||||
| typedef FactoryConstructor<U> = U Function(dynamic); | ||||
| 
 | ||||
| abstract class ApiClient { | ||||
|   Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject, | ||||
|       {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}); | ||||
| 
 | ||||
|   Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}); | ||||
| 
 | ||||
|   Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}); | ||||
| 
 | ||||
|   Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}); | ||||
| } | ||||
| 
 | ||||
| class ApiClientImp implements ApiClient { | ||||
|   @override | ||||
|   Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject, | ||||
|       {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { | ||||
|     var headers0 = {'Accept': 'application/json'}; | ||||
|     if (headers != null && headers.isNotEmpty) { | ||||
|       headers0.addAll(headers); | ||||
|     } | ||||
| 
 | ||||
|     var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: headers0, retryTimes: retryTimes); | ||||
|     try { | ||||
|       if (!kReleaseMode) { | ||||
|         log("statusCode:${response.statusCode}"); | ||||
|       } | ||||
|       var jsonData = jsonDecode(response.body); | ||||
|       return factoryConstructor(jsonData); | ||||
|     } catch (ex) { | ||||
|       log(ex.toString()); | ||||
|       log("exception:$ex"); | ||||
|       throw APIException(APIException.badResponseFormat, arguments: ex); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { | ||||
|     String? requestBody; | ||||
|     if (jsonObject != null) { | ||||
|       requestBody = jsonEncode(jsonObject); | ||||
|       if (headers == null) { | ||||
|         headers = {'Content-Type': 'application/json'}; | ||||
|       } else { | ||||
|         headers['Content-Type'] = 'application/json'; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); | ||||
|   } | ||||
| 
 | ||||
|   Future<Response> _postForResponse( | ||||
|     String url, | ||||
|     requestBody, { | ||||
|     String? token, | ||||
|     Map<String, dynamic>? queryParameters, | ||||
|     Map<String, String>? headers, | ||||
|     int retryTimes = 0, | ||||
|   }) async { | ||||
|     try { | ||||
|       var headers0 = <String, String>{}; | ||||
|       if (token != null) { | ||||
|         headers0['Authorization'] = 'Bearer $token'; | ||||
|       } | ||||
| 
 | ||||
|       if (headers != null && headers.isNotEmpty) { | ||||
|         headers0.addAll(headers); | ||||
|       } | ||||
| 
 | ||||
|       if (queryParameters != null) { | ||||
|         var queryString = Uri(queryParameters: queryParameters).query; | ||||
|         url = '$url?$queryString'; | ||||
|       } | ||||
|       Response response; | ||||
| 
 | ||||
|       response = await _post(Uri.parse(url), body: requestBody, headers: headers0).timeout(const Duration(seconds: 100)); | ||||
| 
 | ||||
|       if (!kReleaseMode) { | ||||
|         logger.d("------URL------"); | ||||
|         logger.i(url); | ||||
|         logger.d("------Payload------"); | ||||
|         logger.i(jsonDecode(requestBody)); | ||||
|         logger.d("------Response------"); | ||||
|         logger.i(jsonDecode(response.body)); | ||||
|       } | ||||
|       if (response.statusCode >= 200 && response.statusCode < 500) { | ||||
|         var jsonData = jsonDecode(response.body); | ||||
|         if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { | ||||
|           return await _postForResponse(url, requestBody, token: '', queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); | ||||
|         } | ||||
|         return response; | ||||
|       } else { | ||||
|         throw APIError.throwAPIException(response); | ||||
|       } | ||||
|     } on SocketException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         log('will retry after 3 seconds...'); | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } on HttpException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         log('will retry after 3 seconds...'); | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } on TimeoutException catch (e) { | ||||
|       throw APIException(APIException.timeout, arguments: e); | ||||
|     } on ClientException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         log('will retry after 3 seconds...'); | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } catch (ex) { | ||||
|       log("exception1:$ex"); | ||||
|       throw APIException(APIException.badResponseFormat, arguments: ex); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   bool _certificateCheck(X509Certificate cert, String host, int port) => true; | ||||
| 
 | ||||
|   Future<T> _withClient<T>(Future<T> Function(Client) fn) async { | ||||
|     var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; | ||||
|     var client = IOClient(httpClient); | ||||
|     try { | ||||
|       return await fn(client); | ||||
|     } finally { | ||||
|       client.close(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); | ||||
| 
 | ||||
|   @override | ||||
|   Future<U> getJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, | ||||
|       {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { | ||||
|     var headers0 = {'Accept': 'application/json'}; | ||||
|     if (headers != null && headers.isNotEmpty) { | ||||
|       headers0.addAll(headers); | ||||
|     } | ||||
|     var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: headers0, retryTimes: retryTimes); | ||||
|     try { | ||||
|       var jsonData = jsonDecode(response.body); | ||||
|       return factoryConstructor(jsonData); | ||||
|     } catch (ex) { | ||||
|       log("exception:${response.body}"); | ||||
|       throw APIException(APIException.badResponseFormat, arguments: ex); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { | ||||
|     if (headers == null) { | ||||
|       headers = {'Content-Type': 'application/json'}; | ||||
|     } else { | ||||
|       headers['Content-Type'] = 'application/json'; | ||||
|     } | ||||
|     return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); | ||||
|   } | ||||
| 
 | ||||
|   bool isFirstCall = true; | ||||
| 
 | ||||
|   Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { | ||||
|     try { | ||||
|       var headers0 = <String, String>{}; | ||||
|       if (token != null) { | ||||
|         headers0['Authorization'] = 'Bearer $token'; | ||||
|       } | ||||
| 
 | ||||
|       if (headers != null && headers.isNotEmpty) { | ||||
|         headers0.addAll(headers); | ||||
|       } | ||||
|       if (queryParameters != null) { | ||||
|         String queryString = Uri(queryParameters: queryParameters).query; | ||||
|         if (isFirstCall) url = '$url?$queryString'; | ||||
|       } | ||||
| 
 | ||||
|       if (!kReleaseMode) { | ||||
|         logger.i(url); | ||||
|         logger.i("$queryParameters"); | ||||
|       } | ||||
|       var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60)); | ||||
| 
 | ||||
|       if (!kReleaseMode) { | ||||
|         logger.i(jsonDecode(response.body)); | ||||
|       } | ||||
|       if (response.statusCode >= 200 && response.statusCode < 500) { | ||||
|         var jsonData = jsonDecode(response.body); | ||||
|         if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { | ||||
|           isFirstCall = false; | ||||
|           return await _getForResponse(url, token: '', queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); | ||||
|         } | ||||
|         return response; | ||||
|       } else { | ||||
|         throw APIError.throwAPIException(response); | ||||
|       } | ||||
|     } on SocketException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         log('will retry after 3 seconds...'); | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } on HttpException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         log('will retry after 3 seconds...'); | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } on TimeoutException catch (e) { | ||||
|       throw APIException(APIException.timeout, arguments: e); | ||||
|     } on ClientException catch (e) { | ||||
|       if (retryTimes > 0) { | ||||
|         await Future.delayed(const Duration(seconds: 3)); | ||||
|         return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); | ||||
|       } else { | ||||
|         throw APIException(APIException.other, arguments: e); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers)); | ||||
| } | ||||
| @ -0,0 +1,56 @@ | ||||
| // import 'package:firebase_crashlytics/firebase_crashlytics.dart'; | ||||
| // import 'package:flutter/material.dart'; | ||||
| 
 | ||||
| import 'package:connectivity_plus/connectivity_plus.dart'; | ||||
| import 'package:flutter_tts/flutter_tts.dart'; | ||||
| import 'package:get_it/get_it.dart'; | ||||
| import 'package:hmg_qline/api/api_client.dart'; | ||||
| import 'package:hmg_qline/repositories/screen_details_repo.dart'; | ||||
| import 'package:hmg_qline/repositories/signalR_repo.dart'; | ||||
| import 'package:hmg_qline/services/audio_service.dart'; | ||||
| import 'package:hmg_qline/services/cache_service.dart'; | ||||
| import 'package:hmg_qline/services/connectivity_service.dart'; | ||||
| import 'package:hmg_qline/services/text_to_speech_service.dart'; | ||||
| import 'package:hmg_qline/view_models/queuing_view_model.dart'; | ||||
| import 'package:hmg_qline/view_models/screen_config_view_model.dart'; | ||||
| import 'package:just_audio/just_audio.dart'; | ||||
| import 'package:shared_preferences/shared_preferences.dart'; | ||||
| 
 | ||||
| final getIt = GetIt.instance; | ||||
| 
 | ||||
| class AppDependencies { | ||||
|   static Future<void> addDependencies() async { | ||||
|     //api client | ||||
|     getIt.registerSingleton<ApiClient>(ApiClientImp()); | ||||
| 
 | ||||
|     //repos | ||||
|     getIt.registerSingleton<SignalrRepo>(SignalrRepoImp()); | ||||
|     getIt.registerSingleton<ScreenDetailsRepo>(ScreenDetailsRepoImp(apiClientInstance: getIt.get<ApiClient>())); | ||||
| 
 | ||||
|     //ThirdPartyServices | ||||
|     getIt.registerSingleton<ConnectivityService>(ConnectivityServiceImp(connectivityInstance: Connectivity())); | ||||
|     getIt.registerSingleton<CacheService>(CacheServiceImp(preferencesInstance: await SharedPreferences.getInstance())); | ||||
|     getIt.registerSingleton<AudioService>(AudioServiceImp(audioPlayerInstance: AudioPlayer())); | ||||
|     getIt.registerSingleton<TextToSpeechService>(TextToSpeechServiceImp(textToSpeechInstance: FlutterTts())); | ||||
| 
 | ||||
|     //ViewModels | ||||
| 
 | ||||
|     getIt.registerSingleton<ScreenConfigViewModel>( | ||||
|       ScreenConfigViewModel( | ||||
|         screenDetailsRepo: getIt.get<ScreenDetailsRepo>(), | ||||
|         cacheService: getIt.get<CacheService>(), | ||||
|         connectivityService: getIt.get<ConnectivityService>(), | ||||
|       ), | ||||
|     ); | ||||
| 
 | ||||
|     getIt.registerSingleton<QueuingViewModel>( | ||||
|       QueuingViewModel( | ||||
|         screenDetailsRepo: getIt.get<ScreenDetailsRepo>(), | ||||
|         cacheService: getIt.get<CacheService>(), | ||||
|         textToSpeechService: getIt.get<TextToSpeechService>(), | ||||
|         audioService: getIt.get<AudioService>(), | ||||
|         signalrRepo: getIt.get<SignalrRepo>(), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,15 @@ | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:hmg_qline/views/main_queue_screen/main_queue_screen.dart'; | ||||
| import 'package:hmg_qline/views/splash_screen/splash_screen.dart'; | ||||
| 
 | ||||
| class AppRoutes { | ||||
|   //User | ||||
|   static const String splash = "/splash"; | ||||
|   static const String mainQueueScreen = "/mainQueueScreen"; | ||||
|   static const String initialRoute = splash; | ||||
| 
 | ||||
|   static final Map<String, WidgetBuilder> routes = { | ||||
|     splash: (context) => const SplashScreen(), | ||||
|     mainQueueScreen: (context) => const MainQueueScreen(), | ||||
|   }; | ||||
| } | ||||
| @ -0,0 +1,104 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:logger/logger.dart'; | ||||
| 
 | ||||
| bool useTestIP = true; | ||||
| Logger logger = Logger(printer: PrettyPrinter(printEmojis: false, colors: true, dateTimeFormat: DateTimeFormat.none)); | ||||
| 
 | ||||
| class AppStrings { | ||||
|   static String poweredBy = "Powered By"; | ||||
|   static String appName = "QLine"; | ||||
|   static String fontName = "Poppins"; | ||||
|   static String noInternetConnection = "No Internet Connection"; | ||||
|   static String awaitingArrival = "Awaiting Patients Arrival"; | ||||
| } | ||||
| 
 | ||||
| class AppColors { | ||||
|   //TextColors | ||||
|   static Color greyColor = const Color(0xFF2B353E); | ||||
|   static Color darkGreyColor = const Color(0x3A1E2326); | ||||
|   static Color blueColor = const Color(0xFF3C86D0); | ||||
|   static Color redColor = Colors.red; | ||||
|   static Color greenColor = Colors.green; | ||||
|   static Color yellowColor = const Color(0xFFC99609); | ||||
|   static Color brownColor = const Color(0xFF460707); | ||||
|   static Color blackColor = Colors.black54; | ||||
| 
 | ||||
|   //Decoration | ||||
| 
 | ||||
|   static BoxDecoration configWidgetDecoration = BoxDecoration( | ||||
|     color: Colors.white, | ||||
|     borderRadius: BorderRadius.circular(12), | ||||
|     boxShadow: [ | ||||
|       BoxShadow( | ||||
|         color: Colors.grey.withOpacity(0.2), | ||||
|         blurRadius: 4, | ||||
|         offset: const Offset(4, 4), // Shadow position | ||||
|       ), | ||||
|       BoxShadow( | ||||
|         color: Colors.grey.withOpacity(0.2), | ||||
|         blurRadius: 4, | ||||
|         offset: const Offset(-4, -4), // Shadow position | ||||
|       ), | ||||
|     ], | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| class AppAssets { | ||||
|   static String hmgLogo = "assets/images/hmglogo.svg"; | ||||
|   static String noInternetImage = "assets/images/undraw_connected_world_wuay.png"; | ||||
|   static String cloudLogo = "assets/images/cloud_logo.png"; | ||||
| 
 | ||||
|   //IconPaths | ||||
|   static String vitalSignIcon = "assets/images/vitalsign_icon.svg"; | ||||
|   static String nebulizationIcon = "assets/images/nebulization_icon.svg"; | ||||
|   static String doctorIcon = "assets/images/doctor_icon.svg"; | ||||
|   static String procedureIcon = "assets/images/procedure_icon.svg"; | ||||
|   static String vaccinationIcon = "assets/images/vaccination_icon.svg"; | ||||
| 
 | ||||
|   //Widgets | ||||
|   static String mosqueIcon = "assets/icons/mosque.svg"; | ||||
|   static String weatherIcon = "assets/icons/weather.svg"; | ||||
| 
 | ||||
|   static String cloudIcon = "assets/icons/cloudy.svg"; | ||||
|   static String coldIcon = "assets/icons/cold.svg"; | ||||
|   static String hotIcon = "assets/icons/hot.svg"; | ||||
|   static String rainIcon = "assets/icons/rainy.svg"; | ||||
|   static String sunnyIcon = "assets/icons/sunny.svg"; | ||||
|   static String windIcon = "assets/icons/windy.svg"; | ||||
| 
 | ||||
|   //Tones | ||||
| 
 | ||||
|   static String callTone = "assets/tones/call_tone.mp3"; | ||||
| } | ||||
| 
 | ||||
| class AppConstants { | ||||
|   static int maxSmallScreen = 660; | ||||
|   static String onlyNumbers = "[0-9]"; | ||||
|   static String onlyLetters = "[a-zA-Z &'\"]"; | ||||
|   static String onlyDate = "[0-9/]"; | ||||
|   static String apiKey = 'EE17D21C7943485D9780223CCE55DCE5'; | ||||
|   static String testIP = '10.20.10.30'; | ||||
|   static int thresholdForListUI = 3; | ||||
| } | ||||
| 
 | ||||
| class ApiConstants { | ||||
|   static String baseUrl = 'https://ms.hmg.com/nscapi'; | ||||
|   static String baseUrlHub = '$baseUrl/PatientCallingHub'; | ||||
|   static String baseUrlApi = '$baseUrl/api'; | ||||
|   static String baseUrlApiPatientCall = '$baseUrlApi/PatientCall'; | ||||
|   static String commonConfigGet = '$baseUrlApiPatientCall/Common_Config_GetByIP'; | ||||
|   static String waitingAreaScreenConfigGet = '$baseUrlApiPatientCall/WaitingAreaScreen_Config_Get'; | ||||
|   static String rssFeedGet = '$baseUrlApiPatientCall/RssFeed_Get'; | ||||
|   static String getWeatherForecastBy5Days = "$baseUrlApiPatientCall/WeatherForecast_GetBy5Days"; | ||||
|   static String prayerTimeToday = "$baseUrlApiPatientCall/PrayerTime_Today"; | ||||
|   static String ticketCallRequestUpdate = "$baseUrlApiPatientCall/CallRequest_QueueUpdate"; | ||||
| 
 | ||||
|   // Signal R Constants | ||||
| 
 | ||||
|   static String sendQLinePatientCall = "SendQLinePatientCall"; | ||||
|   static String sendQLineConfig = "SendQLineConfig"; | ||||
| } | ||||
| 
 | ||||
| class CacheConstants { | ||||
|   static String lastTimeUpdated = "lastTimeUpdated"; | ||||
| } | ||||
| @ -0,0 +1,51 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:hmg_qline/view_models/screen_config_view_model.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| import 'package:hmg_qline/config/dependency_injection.dart'; | ||||
| import 'package:hmg_qline/config/routes.dart'; | ||||
| import 'package:hmg_qline/constants/app_constants.dart'; | ||||
| import 'package:hmg_qline/view_models/queuing_view_model.dart'; | ||||
| import 'package:hmg_qline/views/view_helpers/size_config.dart'; | ||||
| import 'package:wakelock_plus/wakelock_plus.dart'; | ||||
| 
 | ||||
| void main() async { | ||||
|   WidgetsFlutterBinding.ensureInitialized(); | ||||
|   await AppDependencies.addDependencies(); | ||||
|   WakelockPlus.enable(); | ||||
|   runApp(const MyApp()); | ||||
| } | ||||
| 
 | ||||
| class MyApp extends StatelessWidget { | ||||
|   const MyApp({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return LayoutBuilder( | ||||
|       builder: (context, constraints) { | ||||
|         return OrientationBuilder(builder: (context, orientation) { | ||||
|           SizeConfig().init(constraints, orientation); | ||||
|           SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); | ||||
|           return MultiProvider( | ||||
|               providers: [ | ||||
|                 ChangeNotifierProvider<ScreenConfigViewModel>(create: (context) => getIt.get<ScreenConfigViewModel>()), | ||||
|                 ChangeNotifierProvider<QueuingViewModel>(create: (context) => getIt.get<QueuingViewModel>()), | ||||
|               ], | ||||
|               child: MaterialApp( | ||||
|                 showSemanticsDebugger: false, | ||||
|                 title: AppStrings.appName, | ||||
|                 theme: ThemeData( | ||||
|                   fontFamily: AppStrings.fontName, | ||||
|                   colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.grey).copyWith( | ||||
|                     surface: const Color.fromRGBO(255, 255, 255, 1), | ||||
|                   ), | ||||
|                 ), | ||||
|                 initialRoute: AppRoutes.initialRoute, | ||||
|                 routes: AppRoutes.routes, | ||||
|                 debugShowCheckedModeBanner: false, | ||||
|               )); | ||||
|         }); | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| class GenericRespModel { | ||||
|   GenericRespModel({ | ||||
|     this.data, | ||||
|     this.messageStatus, | ||||
|     this.totalItemsCount, | ||||
|     this.message, | ||||
|   }); | ||||
| 
 | ||||
|   dynamic data; | ||||
|   int? messageStatus; | ||||
|   int? totalItemsCount; | ||||
|   String? message; | ||||
| 
 | ||||
|   factory GenericRespModel.fromJson(Map<String, dynamic> json) { | ||||
|     if (json.containsKey('StatusMessage')) { | ||||
|       if ((json['StatusMessage'] as String).contains('Internal server error')) { | ||||
|         // Utils.showToast("${json['StatusMessage']}"); | ||||
|       } | ||||
|     } | ||||
|     return GenericRespModel( | ||||
|       data: json["data"], | ||||
|       messageStatus: json["messageStatus"], | ||||
|       totalItemsCount: json["totalItemsCount"], | ||||
|       message: json["message"], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,173 @@ | ||||
| import 'dart:ui'; | ||||
| import 'package:hmg_qline/utilities/enums.dart'; | ||||
| import 'package:hmg_qline/utilities/extensions.dart'; | ||||
| 
 | ||||
| class GlobalConfigurationsModel { | ||||
|   int? id; | ||||
|   int? configType; | ||||
|   String? description; | ||||
|   int? counterStart; | ||||
|   int? counterEnd; | ||||
|   int? concurrentCallDelaySec; | ||||
|   int? voiceType; | ||||
|   String? voiceTypeText; | ||||
|   LanguageEnum screenLanguageEnum = LanguageEnum.english; | ||||
|   String? screenLanguageText; | ||||
|   TextDirection textDirection = TextDirection.ltr; | ||||
|   LanguageEnum voiceLanguageEnum = LanguageEnum.english; | ||||
|   String? voiceLanguageText; | ||||
|   int? screenMaxDisplayPatients; | ||||
|   bool? isNotiReq; | ||||
|   int? prioritySMS; | ||||
|   int? priorityWhatsApp; | ||||
|   int? priorityEmail; | ||||
|   String ticketNoText = "Ticket Number"; | ||||
|   String postVoiceText = "Please Visit Counter"; | ||||
|   String? roomText; | ||||
|   String? queueNoText; | ||||
|   String? callForText; | ||||
|   String? currentServeText; | ||||
|   String maxText = ""; | ||||
|   String minText = ""; | ||||
|   String nextPrayerText = ""; | ||||
|   String weatherText = "Weather"; | ||||
|   String? fajarText; | ||||
|   String? dhuhrText; | ||||
|   String? asarText; | ||||
|   String? maghribText; | ||||
|   String? ishaText; | ||||
|   bool? isActive; | ||||
|   int? createdBy; | ||||
|   String? createdOn; | ||||
|   dynamic editedBy; | ||||
|   dynamic editedOn; | ||||
|   bool isToneReq = false; | ||||
|   bool isVoiceReq = false; | ||||
|   int orientationType = 1; | ||||
|   bool? isTurnOn; | ||||
|   int? waitingAreaType; | ||||
|   int? gender; | ||||
|   bool isWeatherReq = false; | ||||
|   bool isPrayerTimeReq = false; | ||||
|   bool isRssFeedReq = false; | ||||
|   int? qType; | ||||
|   int? screenType; | ||||
|   int? projectID; | ||||
|   double? projectLatitude; | ||||
|   double? projectLongitude; | ||||
|   int? cityKey; | ||||
| 
 | ||||
|   GlobalConfigurationsModel({ | ||||
|     this.id, | ||||
|     this.configType, | ||||
|     this.description, | ||||
|     this.counterStart, | ||||
|     this.counterEnd, | ||||
|     this.concurrentCallDelaySec, | ||||
|     this.voiceType, | ||||
|     this.voiceTypeText, | ||||
|     this.screenLanguageEnum = LanguageEnum.english, | ||||
|     this.screenLanguageText, | ||||
|     this.textDirection = TextDirection.ltr, | ||||
|     this.voiceLanguageEnum = LanguageEnum.english, | ||||
|     this.voiceLanguageText, | ||||
|     this.screenMaxDisplayPatients, | ||||
|     this.isNotiReq, | ||||
|     this.prioritySMS, | ||||
|     this.priorityWhatsApp, | ||||
|     this.priorityEmail, | ||||
|     this.ticketNoText = "Ticket Number", | ||||
|     this.postVoiceText = "Please Visit Counter", | ||||
|     this.roomText, | ||||
|     this.queueNoText, | ||||
|     this.callForText, | ||||
|     this.currentServeText, | ||||
|     this.maxText = "", | ||||
|     this.minText = "", | ||||
|     this.nextPrayerText = "", | ||||
|     this.weatherText = "Weather", | ||||
|     this.fajarText, | ||||
|     this.dhuhrText, | ||||
|     this.asarText, | ||||
|     this.maghribText, | ||||
|     this.ishaText, | ||||
|     this.isActive, | ||||
|     this.createdBy, | ||||
|     this.createdOn, | ||||
|     this.editedBy, | ||||
|     this.editedOn, | ||||
|     this.isToneReq = false, | ||||
|     this.isVoiceReq = false, | ||||
|     this.orientationType = 1, | ||||
|     this.isTurnOn, | ||||
|     this.waitingAreaType, | ||||
|     this.gender, | ||||
|     this.isWeatherReq = false, | ||||
|     this.isPrayerTimeReq = false, | ||||
|     this.isRssFeedReq = false, | ||||
|     this.qType, | ||||
|     this.screenType, | ||||
|     this.projectID, | ||||
|     this.projectLatitude, | ||||
|     this.projectLongitude, | ||||
|     this.cityKey, | ||||
|   }); | ||||
| 
 | ||||
|   GlobalConfigurationsModel.fromJson(Map<String, dynamic> json) { | ||||
|     id = json['id']; | ||||
|     configType = json['configType']; | ||||
|     description = json['description']; | ||||
|     counterStart = json['counterStart']; | ||||
|     counterEnd = json['counterEnd']; | ||||
|     concurrentCallDelaySec = json['concurrentCallDelaySec']; | ||||
|     voiceType = json['voiceType']; | ||||
|     voiceTypeText = json['voiceTypeText']; | ||||
|     screenLanguageEnum = (json['screenLanguage'] as int).toLanguageEnum(); | ||||
|     screenLanguageText = json['screenLanguageText']; | ||||
|     textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr; | ||||
|     voiceLanguageEnum = (json['voiceLanguage'] as int).toLanguageEnum(); | ||||
|     voiceLanguageText = json['voiceLanguageText']; | ||||
|     screenMaxDisplayPatients = json['screenMaxDisplayPatients']; | ||||
|     isNotiReq = json['isNotiReq']; | ||||
|     prioritySMS = json['prioritySMS']; | ||||
|     priorityWhatsApp = json['priorityWhatsApp']; | ||||
|     priorityEmail = json['priorityEmail']; | ||||
|     ticketNoText = json['ticketNoText'] ?? "Ticket Number"; | ||||
|     postVoiceText = json['postVoiceText'] ?? "Please Visit Counter"; | ||||
|     roomText = json['roomText']; | ||||
|     queueNoText = json['queueNoText']; | ||||
|     callForText = json['callForText']; | ||||
|     currentServeText = json['currentServeText']; | ||||
|     maxText = json['maxText'] ?? ""; | ||||
|     minText = json['minText'] ?? ""; | ||||
|     nextPrayerText = json['nextPrayerText'] ?? ""; | ||||
|     weatherText = json['weatherText'] ?? "Weather"; | ||||
|     fajarText = json['fajarText']; | ||||
|     dhuhrText = json['dhuhrText']; | ||||
|     asarText = json['asarText']; | ||||
|     maghribText = json['maghribText']; | ||||
|     ishaText = json['ishaText']; | ||||
|     isActive = json['isActive']; | ||||
|     createdBy = json['createdBy']; | ||||
|     createdOn = json['createdOn']; | ||||
|     editedBy = json['editedBy']; | ||||
|     editedOn = json['editedOn']; | ||||
|     // isToneReq = json['isToneReq'] ?? false; | ||||
|     // isVoiceReq = json['isVoiceReq'] ?? false; | ||||
|     isToneReq = true; | ||||
|     isVoiceReq = true; | ||||
|     orientationType = json['orientationType'] ?? 1; | ||||
|     isTurnOn = json['isTurnOn']; | ||||
|     waitingAreaType = json['waitingAreaType']; | ||||
|     gender = json['gender']; | ||||
|     isWeatherReq = json['isWeatherReq'] ?? false; | ||||
|     isPrayerTimeReq = json['isPrayerTimeReq'] ?? false; | ||||
|     isRssFeedReq = json['isRssFeedReq'] ?? false; | ||||
|     qType = json['qType']; | ||||
|     screenType = json['screenType']; | ||||
|     projectID = json['projectID']; | ||||
|     projectLatitude = json['projectLatitude']; | ||||
|     projectLongitude = json['projectLongitude']; | ||||
|     cityKey = json['cityKey']; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,49 @@ | ||||
| import 'package:intl/intl.dart'; | ||||
| 
 | ||||
| class PrayersWidgetModel { | ||||
|   int? fajr; | ||||
|   String? sunrise; | ||||
|   int? dhuhr; | ||||
|   int? asr; | ||||
|   String? sunset; | ||||
|   int? maghrib; | ||||
|   int? isha; | ||||
|   String? imsak; | ||||
|   String? midnight; | ||||
|   String? firstthird; | ||||
|   String? lastthird; | ||||
|   String? dateFor; | ||||
| 
 | ||||
|   PrayersWidgetModel({this.fajr, this.sunrise, this.dhuhr, this.asr, this.sunset, this.maghrib, this.isha, this.imsak, this.midnight, this.firstthird, this.lastthird, this.dateFor}); | ||||
| 
 | ||||
|   PrayersWidgetModel.fromJson(Map<String, dynamic> json) { | ||||
|     fajr = dateTimeConversion(json['dateFor'], json['fajr']); | ||||
|     sunrise = json['sunrise']; | ||||
|     dhuhr = dateTimeConversion(json['dateFor'], getDhuhrData(json), isForDhuhr: true); | ||||
|     asr = dateTimeConversion(json['dateFor'], json['asr']); | ||||
|     sunset = json['sunset']; | ||||
|     maghrib = dateTimeConversion(json['dateFor'], json['maghrib']); | ||||
|     isha = dateTimeConversion(json['dateFor'], json['isha']); | ||||
|     imsak = json['imsak']; | ||||
|     midnight = json['midnight']; | ||||
|     firstthird = json['firstthird']; | ||||
|     lastthird = json['lastthird']; | ||||
|     dateFor = json['dateFor']; | ||||
|   } | ||||
| 
 | ||||
|   static String getDhuhrData(dynamic json) { | ||||
|     return (json['dhuhr'] as String).contains('PM') ? json['dhuhr'] : json['dhuhr'] + ' PM'; | ||||
|   } | ||||
| 
 | ||||
|   static dateTimeConversion(String date, String time, {bool isForDhuhr = false}) { | ||||
|     if (isForDhuhr) { | ||||
|       return DateFormat('DD MMM yyyy hh:mm a').parse("$date $time").millisecondsSinceEpoch; | ||||
|     } | ||||
|     return DateFormat('DD MMM yyyy hh:mm').parse("$date $time").millisecondsSinceEpoch; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return 'PrayersWidgetModel{fajr: $fajr, sunrise: $sunrise, dhuhr: $dhuhr, asr: $asr, sunset: $sunset, maghrib: $maghrib, isha: $isha, imsak: $imsak, midnight: $midnight, firstthird: $firstthird, lastthird: $lastthird, dateFor: $dateFor}'; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,15 @@ | ||||
| class RssFeedModel { | ||||
|   String? rssFeed; | ||||
| 
 | ||||
|   RssFeedModel({this.rssFeed}); | ||||
| 
 | ||||
|   RssFeedModel.fromJson(Map<String, dynamic> json) { | ||||
|     rssFeed = json['rssFeed']; | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     final Map<String, dynamic> data = <String, dynamic>{}; | ||||
|     data['rssFeed'] = rssFeed; | ||||
|     return data; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,122 @@ | ||||
| import 'dart:developer'; | ||||
| 
 | ||||
| import 'package:hmg_qline/utilities/date_utils.dart'; | ||||
| import 'package:hmg_qline/utilities/enums.dart'; | ||||
| import 'package:hmg_qline/utilities/extensions.dart'; | ||||
| 
 | ||||
| class TicketDetailsModel { | ||||
|   QTypeEnum? qTypeEnum; | ||||
|   ScreenTypeEnum? screenTypeEnum; | ||||
|   String? connectionID; | ||||
|   TicketData? ticketModel; | ||||
| 
 | ||||
|   TicketDetailsModel({this.qTypeEnum, this.screenTypeEnum, this.connectionID, this.ticketModel}); | ||||
| 
 | ||||
|   TicketDetailsModel.fromJson(Map<String, dynamic> json) { | ||||
|     qTypeEnum = json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : null; | ||||
|     screenTypeEnum = json['screenType'] != null ? (json['screenType'] as int).toScreenTypeEnum() : null; | ||||
|     connectionID = json['connectionID']; | ||||
|     ticketModel = json['data'] != null ? TicketData.fromJson(json['data']) : null; | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     final Map<String, dynamic> data = <String, dynamic>{}; | ||||
|     data['qType'] = qTypeEnum; | ||||
|     data['screenType'] = screenTypeEnum; | ||||
|     data['connectionID'] = connectionID; | ||||
|     if (ticketModel != null) { | ||||
|       data['data'] = ticketModel!.toJson(); | ||||
|     } | ||||
|     return data; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class TicketData { | ||||
|   int? id; | ||||
|   int? patientID; | ||||
|   int? laBQGroupID; | ||||
|   String? queueNo; | ||||
|   int? counterBatchNo; | ||||
|   int? calledBy; | ||||
|   String? calledOn; | ||||
|   String? servedOn; | ||||
|   String? patientName; | ||||
|   String? mobileNo; | ||||
|   String? patientEmail; | ||||
|   int? preferredLang; | ||||
|   int? patientGender; | ||||
|   String? roomNo; | ||||
|   bool? isActive; | ||||
|   int? createdBy; | ||||
|   int? editedBy; | ||||
|   DateTime? editedOn; | ||||
|   DateTime? createdOn; | ||||
| 
 | ||||
|   TicketData( | ||||
|       {this.id, | ||||
|       this.patientID, | ||||
|       this.laBQGroupID, | ||||
|       this.queueNo, | ||||
|       this.counterBatchNo, | ||||
|       this.calledBy, | ||||
|       this.calledOn, | ||||
|       this.servedOn, | ||||
|       this.patientName, | ||||
|       this.mobileNo, | ||||
|       this.patientEmail, | ||||
|       this.preferredLang, | ||||
|       this.patientGender, | ||||
|       this.roomNo, | ||||
|       this.isActive, | ||||
|       this.createdBy, | ||||
|       this.createdOn, | ||||
|       this.editedBy, | ||||
|       this.editedOn}); | ||||
| 
 | ||||
|   TicketData.fromJson(Map<String, dynamic> json) { | ||||
|     log("typoe: ${json['preferredLang'].runtimeType}"); | ||||
|     id = json['id']; | ||||
|     patientID = json['patientID']; | ||||
|     laBQGroupID = json['laB_QGroupID']; | ||||
|     queueNo = json['queueNo']; | ||||
|     counterBatchNo = json['counterBatchNo']; | ||||
|     calledBy = json['calledBy']; | ||||
|     calledOn = json['calledOn']; | ||||
|     servedOn = json['servedOn']; | ||||
|     patientName = json['patientName']; | ||||
|     mobileNo = json['mobileNo']; | ||||
|     patientEmail = json['patientEmail']; | ||||
|     preferredLang = (json['preferredLang'] != null && json['preferredLang'].trim() != "" )? int.parse(json['preferredLang']) : 1; | ||||
|     patientGender = json['patientGender'] ?? 1; | ||||
|     roomNo = json['roomNo']; | ||||
|     isActive = json['isActive']; | ||||
|     createdBy = json['createdBy']; | ||||
|     editedBy = json['editedBy']; | ||||
|     editedOn = json['editedOn'] != null ? (json['editedOn'] as String).toDateTime() : DateTime.now(); | ||||
|     createdOn = json['createdOn'] != null ? (json['createdOn'] as String).toDateTime() : DateTime.now(); | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     final Map<String, dynamic> data = <String, dynamic>{}; | ||||
|     data['id'] = id; | ||||
|     data['patientID'] = patientID; | ||||
|     data['laB_QGroupID'] = laBQGroupID; | ||||
|     data['queueNo'] = queueNo; | ||||
|     data['counterBatchNo'] = counterBatchNo; | ||||
|     data['calledBy'] = calledBy; | ||||
|     data['calledOn'] = calledOn; | ||||
|     data['servedOn'] = servedOn; | ||||
|     data['patientName'] = patientName; | ||||
|     data['mobileNo'] = mobileNo; | ||||
|     data['patientEmail'] = patientEmail; | ||||
|     data['preferredLang'] = preferredLang; | ||||
|     data['patientGender'] = patientGender; | ||||
|     data['roomNo'] = roomNo; | ||||
|     data['isActive'] = isActive; | ||||
|     data['createdBy'] = createdBy; | ||||
|     data['createdOn'] = createdOn; | ||||
|     data['editedBy'] = editedBy; | ||||
|     data['editedOn'] = editedOn; | ||||
|     return data; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,65 @@ | ||||
| import 'package:hmg_qline/constants/app_constants.dart'; | ||||
| 
 | ||||
| class WeathersWidgetModel { | ||||
|   int? id; | ||||
|   String? headline; | ||||
|   double? maxTemp; | ||||
|   double? minTemp; | ||||
|   String? iconPhrase; | ||||
|   String? forecastDate; | ||||
|   int? cityID; | ||||
|   String? forecastDay; | ||||
|   String? createDateTime; | ||||
|   double? windSpeed; | ||||
|   String? windDirection; | ||||
|   double? windDegrees; | ||||
|   String? weatherIconPath; | ||||
| 
 | ||||
|   WeathersWidgetModel({ | ||||
|     this.id, | ||||
|     this.headline, | ||||
|     this.maxTemp, | ||||
|     this.minTemp, | ||||
|     this.iconPhrase, | ||||
|     this.forecastDate, | ||||
|     this.cityID, | ||||
|     this.forecastDay, | ||||
|     this.createDateTime, | ||||
|     this.windSpeed, | ||||
|     this.windDirection, | ||||
|     this.windDegrees, | ||||
|     this.weatherIconPath, | ||||
|   }); | ||||
| 
 | ||||
|   WeathersWidgetModel.fromJson(Map<String, dynamic> json) { | ||||
|     id = json['id']; | ||||
|     headline = json['headline']; | ||||
|     maxTemp = json['maxTemp']; | ||||
|     minTemp = json['minTemp']; | ||||
|     iconPhrase = json['iconPhrase']; | ||||
|     forecastDate = json['forecastDate']; | ||||
|     cityID = json['cityID']; | ||||
|     forecastDay = json['forecastDay']; | ||||
|     createDateTime = json['createDateTime']; | ||||
|     windSpeed = json['windSpeed']; | ||||
|     windDirection = json['windDirection']; | ||||
|     windDegrees = json['windDegrees']; | ||||
|     weatherIconPath = getWeatherIconPath(json['iconPhrase']); | ||||
|   } | ||||
| 
 | ||||
|   String getWeatherIconPath(String iconPhrase) { | ||||
|     if (iconPhrase == "Rain" || iconPhrase == "Showers" || iconPhrase == "ThunderStorms") { | ||||
|       return AppAssets.rainIcon; | ||||
|     } else if (iconPhrase == "Hot") { | ||||
|       return AppAssets.hotIcon; | ||||
|     } else if (iconPhrase == "Windy") { | ||||
|       return AppAssets.windIcon; | ||||
|     } else if (iconPhrase == "Cloudy" || iconPhrase == "Mostly cloudy" || iconPhrase == "Intermittent clouds") { | ||||
|       return AppAssets.cloudIcon; | ||||
|     } else if (iconPhrase == "Sunny" || iconPhrase == "Mostly sunny" || iconPhrase == "Partly sunny" || iconPhrase == "Hazy sunshine") { | ||||
|       return AppAssets.sunnyIcon; | ||||
|     } else { | ||||
|       return AppAssets.weatherIcon; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,53 @@ | ||||
| class WidgetsConfigModel { | ||||
|   int? waitingAreaID; | ||||
|   String? waitingAreaName; | ||||
|   int? projectID; | ||||
|   double? projectLatitude; | ||||
|   double? projectLongitude; | ||||
|   int? cityKey; | ||||
|   bool isWeatherReq = false; | ||||
|   bool isPrayerTimeReq = false; | ||||
|   bool isRssFeedReq = false; | ||||
| 
 | ||||
|   WidgetsConfigModel({ | ||||
|     this.waitingAreaID, | ||||
|     this.waitingAreaName, | ||||
|     this.isWeatherReq = false, | ||||
|     this.isPrayerTimeReq = false, | ||||
|     this.isRssFeedReq = false, | ||||
|     this.projectID, | ||||
|     this.projectLatitude, | ||||
|     this.projectLongitude, | ||||
|     this.cityKey, | ||||
|   }); | ||||
| 
 | ||||
|   WidgetsConfigModel.fromJson(Map<String, dynamic> json) { | ||||
|     waitingAreaID = json['waitingAreaID']; | ||||
|     waitingAreaName = json['waitingAreaName']; | ||||
|     isRssFeedReq = json['isRssFeedReq'] ?? false; | ||||
|     isWeatherReq = json['isWeatherReq'] ?? false; | ||||
|     isPrayerTimeReq = json['isPrayerTimeReq'] ?? false; | ||||
|     projectID = json['projectID']; | ||||
|     projectLatitude = json['projectLatitude']; | ||||
|     projectLongitude = json['projectLongitude']; | ||||
|     cityKey = json['cityKey']; | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     final Map<String, dynamic> data = <String, dynamic>{}; | ||||
|     data['waitingAreaID'] = waitingAreaID; | ||||
|     data['waitingAreaName'] = waitingAreaName; | ||||
|     data['isWeatherReq'] = isWeatherReq; | ||||
|     data['isPrayerTimeReq'] = isPrayerTimeReq; | ||||
|     data['projectID'] = projectID; | ||||
|     data['projectLatitude'] = projectLatitude; | ||||
|     data['projectLongitude'] = projectLongitude; | ||||
|     data['cityKey'] = cityKey; | ||||
|     return data; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   String toString() { | ||||
|     return 'WidgetsConfigModel{waitingAreaID: $waitingAreaID, waitingAreaName: $waitingAreaName, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, projectLatitude: $projectLatitude,projectLongitude: $projectLongitude, cityKey: $cityKey}'; | ||||
|   } | ||||
| } | ||||