From 39a6d878170001bd53793a9dc022ffd2a7ee984a Mon Sep 17 00:00:00 2001 From: baldeau Date: Tue, 5 Mar 2024 00:34:31 +0100 Subject: [PATCH] up --- .DS_Store | Bin 10244 -> 12292 bytes .mermaid-config.json | 8 + .../02_raspberryPi.md => .mermaid.css | 0 .vscode/settings.json | 22 +- .vscode/tasks.json | 16 + Bachelor.bib | 339 ++++++++- Makefile | 12 +- README.md | 3 + assets/flutter/archdiagram.png | Bin 0 -> 113530 bytes assets/mermaid/Caption.pdf | Bin 0 -> 27052 bytes assets/mermaid/Caption.png | Bin 0 -> 12884 bytes chapters/.DS_Store | Bin 8196 -> 6148 bytes chapters/00_pandoc/00_pandoc.md | 91 +-- chapters/00_pandoc/01_dart.md | 31 + chapters/01_titel/00_titlepage.md | 48 +- chapters/01_titel/01_abstract.md | 27 + chapters/01_titel/02_toc.md | 10 + .../02_einleitung/00_motivation_relevanz.md | 71 ++ chapters/02_einleitung/01_zielsetzung.md | 12 + chapters/03_grundlagen/01_eLinux.md | 18 - chapters/03_grundlagen/01_linux.md | 172 +++++ chapters/03_grundlagen/02_flutter.md | 127 ++++ chapters/03_grundlagen/03_i2c_bus.md | 0 chapters/03_grundlagen/04_spi_bus.md | 0 chapters/03_grundlagen/05_yocto_linux.md | 17 - chapters/03_grundlagen/06_flutter.md | 35 - .../05_analyse_und_design/00_anforderungen.md | 13 + .../05_analyse_und_design/01_architektur.md | 29 + chapters/05_yocto/01_pi_image.md | 0 chapters/05_yocto/02_meta_flutter.md | 0 chapters/05_yocto/03_network_manager.md | 0 chapters/05_yocto/04_hot_reload_embedder.md | 0 chapters/05_yocto/05_qemu_linux.md | 0 chapters/06_flutter/.DS_Store | Bin 6148 -> 0 bytes chapters/06_flutter/02_home.md | 0 chapters/06_flutter/03_material_demo.md | 0 chapters/06_flutter/04_liste.md | 0 chapters/06_flutter/05_kartenansicht.md | 0 chapters/06_flutter/06_einstellungen.md | 0 chapters/06_flutter/08_matrix.md | 0 chapters/06_flutter/09_video.md | 0 chapters/06_flutter/10_flame.md | 0 chapters/06_flutter/led.md | 0 .../.DS_Store | Bin .../00_entwicklungsumgebung.md | 76 ++ .../01_programmierung.md} | 15 + .../.DS_Store | Bin .../01_vergleich.md | 0 .../02_bewertung.md | 0 .../03_zusammenfassung_ausblick.md | 0 chapters/08_01_references/00_mermaid | 23 + chapters/08_01_references/01_code | 2 + chapters/08_01_references/02_image | 8 + chapters/08_literatur/00_literature.md | 2 + code/flutter_architecture/.gitignore | 43 ++ code/flutter_architecture/.metadata | 42 ++ code/flutter_architecture/README.md | 16 + .../analysis_options.yaml | 28 + code/flutter_architecture/android/.gitignore | 13 + .../android/app/build.gradle | 67 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 + .../flutter_architecture/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../flutter_architecture/android/build.gradle | 30 + .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 29 + code/flutter_architecture/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../ios/Flutter/Debug.xcconfig | 1 + .../ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 617 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/Info.plist | 49 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../ios/RunnerTests/RunnerTests.swift | 12 + code/flutter_architecture/lib/main.dart | 74 ++ code/flutter_architecture/linux/.gitignore | 1 + .../flutter_architecture/linux/CMakeLists.txt | 145 ++++ .../linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + code/flutter_architecture/linux/main.cc | 6 + .../linux/my_application.cc | 104 +++ .../linux/my_application.h | 18 + code/flutter_architecture/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 695 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 +++++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../macos/Runner/Release.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 12 + code/flutter_architecture/pubspec.lock | 188 +++++ code/flutter_architecture/pubspec.yaml | 90 +++ .../test/widget_test.dart | 30 + code/flutter_architecture/web/favicon.png | Bin 0 -> 917 bytes .../web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes code/flutter_architecture/web/index.html | 59 ++ code/flutter_architecture/web/manifest.json | 35 + harvard-right.csl | 6 + notes.md | 20 + temp_file | 433 +++++++++++ 167 files changed, 5291 insertions(+), 147 deletions(-) create mode 100644 .mermaid-config.json rename chapters/03_grundlagen/02_raspberryPi.md => .mermaid.css (100%) create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 assets/flutter/archdiagram.png create mode 100644 assets/mermaid/Caption.pdf create mode 100644 assets/mermaid/Caption.png create mode 100644 chapters/00_pandoc/01_dart.md delete mode 100644 chapters/03_grundlagen/01_eLinux.md create mode 100644 chapters/03_grundlagen/01_linux.md create mode 100644 chapters/03_grundlagen/02_flutter.md delete mode 100644 chapters/03_grundlagen/03_i2c_bus.md delete mode 100644 chapters/03_grundlagen/04_spi_bus.md delete mode 100644 chapters/03_grundlagen/05_yocto_linux.md delete mode 100644 chapters/03_grundlagen/06_flutter.md create mode 100644 chapters/05_analyse_und_design/00_anforderungen.md create mode 100644 chapters/05_analyse_und_design/01_architektur.md delete mode 100644 chapters/05_yocto/01_pi_image.md delete mode 100644 chapters/05_yocto/02_meta_flutter.md delete mode 100644 chapters/05_yocto/03_network_manager.md delete mode 100644 chapters/05_yocto/04_hot_reload_embedder.md delete mode 100644 chapters/05_yocto/05_qemu_linux.md delete mode 100644 chapters/06_flutter/.DS_Store delete mode 100644 chapters/06_flutter/02_home.md delete mode 100644 chapters/06_flutter/03_material_demo.md delete mode 100644 chapters/06_flutter/04_liste.md delete mode 100644 chapters/06_flutter/05_kartenansicht.md delete mode 100644 chapters/06_flutter/06_einstellungen.md delete mode 100644 chapters/06_flutter/08_matrix.md delete mode 100644 chapters/06_flutter/09_video.md delete mode 100644 chapters/06_flutter/10_flame.md delete mode 100644 chapters/06_flutter/led.md rename chapters/{05_yocto => 06_implementierung}/.DS_Store (100%) create mode 100644 chapters/06_implementierung/00_entwicklungsumgebung.md rename chapters/{06_flutter/01_architecture.md => 06_implementierung/01_programmierung.md} (83%) rename chapters/{07_fazit => 07_zusammenfassung_und_ausblick}/.DS_Store (100%) rename chapters/{07_fazit => 07_zusammenfassung_und_ausblick}/01_vergleich.md (100%) rename chapters/{07_fazit => 07_zusammenfassung_und_ausblick}/02_bewertung.md (100%) rename chapters/{07_fazit => 07_zusammenfassung_und_ausblick}/03_zusammenfassung_ausblick.md (100%) create mode 100644 chapters/08_01_references/00_mermaid create mode 100644 chapters/08_01_references/01_code create mode 100644 chapters/08_01_references/02_image create mode 100644 code/flutter_architecture/.gitignore create mode 100644 code/flutter_architecture/.metadata create mode 100644 code/flutter_architecture/README.md create mode 100644 code/flutter_architecture/analysis_options.yaml create mode 100644 code/flutter_architecture/android/.gitignore create mode 100644 code/flutter_architecture/android/app/build.gradle create mode 100644 code/flutter_architecture/android/app/src/debug/AndroidManifest.xml create mode 100644 code/flutter_architecture/android/app/src/main/AndroidManifest.xml create mode 100644 code/flutter_architecture/android/app/src/main/kotlin/com/example/flutter_architecture/MainActivity.kt create mode 100644 code/flutter_architecture/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 code/flutter_architecture/android/app/src/main/res/drawable/launch_background.xml create mode 100644 code/flutter_architecture/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 code/flutter_architecture/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 code/flutter_architecture/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 code/flutter_architecture/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 code/flutter_architecture/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 code/flutter_architecture/android/app/src/main/res/values-night/styles.xml create mode 100644 code/flutter_architecture/android/app/src/main/res/values/styles.xml create mode 100644 code/flutter_architecture/android/app/src/profile/AndroidManifest.xml create mode 100644 code/flutter_architecture/android/build.gradle create mode 100644 code/flutter_architecture/android/gradle.properties create mode 100644 code/flutter_architecture/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 code/flutter_architecture/android/settings.gradle create mode 100644 code/flutter_architecture/ios/.gitignore create mode 100644 code/flutter_architecture/ios/Flutter/AppFrameworkInfo.plist create mode 100644 code/flutter_architecture/ios/Flutter/Debug.xcconfig create mode 100644 code/flutter_architecture/ios/Flutter/Release.xcconfig create mode 100644 code/flutter_architecture/ios/Runner.xcodeproj/project.pbxproj create mode 100644 code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 code/flutter_architecture/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 code/flutter_architecture/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 code/flutter_architecture/ios/Runner/AppDelegate.swift create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 code/flutter_architecture/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 code/flutter_architecture/ios/Runner/Base.lproj/Main.storyboard create mode 100644 code/flutter_architecture/ios/Runner/Info.plist create mode 100644 code/flutter_architecture/ios/Runner/Runner-Bridging-Header.h create mode 100644 code/flutter_architecture/ios/RunnerTests/RunnerTests.swift create mode 100644 code/flutter_architecture/lib/main.dart create mode 100644 code/flutter_architecture/linux/.gitignore create mode 100644 code/flutter_architecture/linux/CMakeLists.txt create mode 100644 code/flutter_architecture/linux/flutter/CMakeLists.txt create mode 100644 code/flutter_architecture/linux/flutter/generated_plugin_registrant.cc create mode 100644 code/flutter_architecture/linux/flutter/generated_plugin_registrant.h create mode 100644 code/flutter_architecture/linux/flutter/generated_plugins.cmake create mode 100644 code/flutter_architecture/linux/main.cc create mode 100644 code/flutter_architecture/linux/my_application.cc create mode 100644 code/flutter_architecture/linux/my_application.h create mode 100644 code/flutter_architecture/macos/.gitignore create mode 100644 code/flutter_architecture/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 code/flutter_architecture/macos/Flutter/Flutter-Release.xcconfig create mode 100644 code/flutter_architecture/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 code/flutter_architecture/macos/Runner.xcodeproj/project.pbxproj create mode 100644 code/flutter_architecture/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 code/flutter_architecture/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 code/flutter_architecture/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 code/flutter_architecture/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 code/flutter_architecture/macos/Runner/AppDelegate.swift create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 code/flutter_architecture/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 code/flutter_architecture/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 code/flutter_architecture/macos/Runner/Configs/Debug.xcconfig create mode 100644 code/flutter_architecture/macos/Runner/Configs/Release.xcconfig create mode 100644 code/flutter_architecture/macos/Runner/Configs/Warnings.xcconfig create mode 100644 code/flutter_architecture/macos/Runner/DebugProfile.entitlements create mode 100644 code/flutter_architecture/macos/Runner/Info.plist create mode 100644 code/flutter_architecture/macos/Runner/MainFlutterWindow.swift create mode 100644 code/flutter_architecture/macos/Runner/Release.entitlements create mode 100644 code/flutter_architecture/macos/RunnerTests/RunnerTests.swift create mode 100644 code/flutter_architecture/pubspec.lock create mode 100644 code/flutter_architecture/pubspec.yaml create mode 100644 code/flutter_architecture/test/widget_test.dart create mode 100644 code/flutter_architecture/web/favicon.png create mode 100644 code/flutter_architecture/web/icons/Icon-192.png create mode 100644 code/flutter_architecture/web/icons/Icon-512.png create mode 100644 code/flutter_architecture/web/icons/Icon-maskable-192.png create mode 100644 code/flutter_architecture/web/icons/Icon-maskable-512.png create mode 100644 code/flutter_architecture/web/index.html create mode 100644 code/flutter_architecture/web/manifest.json create mode 100644 notes.md create mode 100644 temp_file diff --git a/.DS_Store b/.DS_Store index 56da70fdf24cf4fb96e1f16562b547fe8490fd6b..1a3c99b6d57a593540c150667cde216fb17b499e 100644 GIT binary patch delta 613 zcmZuvK}#E95Ph4hW+hwQO}5c=lV-uF5t4MXkx;Q97DMq6u!=WDiAE!CvPMmzEu|iW zo@Gw$AvZ5xBOF@Up#A05V)k9Nw+S zoIU|Y_}rLE2KhtaSmfYZ0XAX6;#@`Tyfsc{S{(2iMEWsWrZweRw-pSzAxV^kNtzk^ zNprgD&c{0fl@yh}KdI0=MW$E!uL%*`aIk~glI?6)ZKujC%#Q_D9RBSefEE(dA8#4W z|3$ct@RY;T2dLo)IiIJ2L&lC7$>S{=u>WU8r;lUg9*4J18~d;s%`;2Af11YBVQMEz zgScYxj@wP-0<^BG)O%W_FRB`r&}8is);^}|s799&m5Qmjc26+KEp438hJLD9Rw-*( zMe{?}ct2~IS)(-joNn~u_@AaXt4B@SY3{L{=j{+yP-b5iQ9+rOV{z(5WO7my>44YL zzt)id49|>B?D`AUC=*T5MXK68H3o&GD=XhZ=0Cdy&s?8@?*R@znJ}kv|F6((^@22# cE(o9(vM%zYB&w%B)9aY#K6?B$pglx*2SLx8u>b%7 delta 290 zcmZokXbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~3gIoUvmMH0woumxg9pg03VB10ZS z3PV0aGK1b`LB?-vlNA`(Zf56T;b64g%%kvxeexQ0-idQ9Ci4pXWMllvz`%5F@&f^h z%_@Qu8QB;d!TjAq5tG>j1t+Tr|CsC|qQ)u<7X2t}r?X0SpA v1#Tei3i24x(chUT^XnM00{z3#FxgQ@nu7`AbB)OfIx{yjs=jA}c!C`OtUE%y diff --git a/.mermaid-config.json b/.mermaid-config.json new file mode 100644 index 0000000..6017c06 --- /dev/null +++ b/.mermaid-config.json @@ -0,0 +1,8 @@ +{ + "theme": "neutral", + "fontFamily": "Times New Roman", + "actorFontFamily": "Times New Roman", + "noteFontFamily": "Times New Roman", + "messageFontFamily": "Times New Roman", + "personFontFamily": "Times New Roman" +} \ No newline at end of file diff --git a/chapters/03_grundlagen/02_raspberryPi.md b/.mermaid.css similarity index 100% rename from chapters/03_grundlagen/02_raspberryPi.md rename to .mermaid.css diff --git a/.vscode/settings.json b/.vscode/settings.json index 301d8ad..5a24e30 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,13 @@ { - "folder-path-color.folders": [ - { "path": "chapters/01", "symbol": "SR", "tooltip": "Source files" }, - { "path": "chapters/02", "symbol": "T", "tooltip": "Common" }, - { "path": "chapters/03", "symbol": "T", "tooltip": "Common" }, - { "path": "chapters/04", "symbol": "T", "tooltip": "Common" }, - { "path": "chapters/05", "symbol": "T", "tooltip": "Common" }, - { "path": "chapters/06", "symbol": "T", "tooltip": "Common" }, - { "path": "chapters/07", "symbol": "T", "tooltip": "Common" }, - ] -} \ No newline at end of file + "folder-path-color.folders": [ + { "path": "chapters/01", "symbol": "SR", "tooltip": "01" }, + { "path": "chapters/02", "symbol": "T", "tooltip": "02" }, + { "path": "chapters/03", "symbol": "T", "tooltip": "03" }, + { "path": "chapters/04", "symbol": "T", "tooltip": "04" }, + { "path": "chapters/05", "symbol": "T", "tooltip": "05" }, + { "path": "chapters/06", "symbol": "T", "tooltip": "06" }, + { "path": "chapters/07", "symbol": "T", "tooltip": "07" } + ], + "cSpell.enabled": true, + "cSpell.enableFiletypes": ["markdown_latex_combined"] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..e6efec9 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "make", + "type": "shell", + "command": "make", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/Bachelor.bib b/Bachelor.bib index c0a4f67..80459d5 100644 --- a/Bachelor.bib +++ b/Bachelor.bib @@ -1,3 +1,25 @@ +@online{0andriyAnswerWhatMinimum2015, + title = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?"}, + shorttitle = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?}, + author = {0andriy}, + date = {2015-01-14}, + url = {https://stackoverflow.com/a/27950451}, + urldate = {2024-02-19}, + organization = {{Stack Overflow}}, + file = {/Users/fabian/Zotero/storage/HNIIPU6S/what-is-the-minimum-amount-of-ram-required-to-run-linux-kernel-on-an-embedded-de.html} +} + +@online{3ClauseBSDLicense2011, + title = {The 3-{{Clause BSD License}}}, + date = {2011-05-22T22:21:11+00:00}, + url = {https://opensource.org/license/bsd-3-clause/}, + urldate = {2024-02-18}, + abstract = {Note: This license has also been called the “New BSD License” or “Modified BSD License”. See also the 2-clause BSD License. Copyright {$<$}YEAR{$>$} {$<$}COPYRIGHT HOLDER{$>$} R…}, + langid = {american}, + organization = {{Open Source Initiative}}, + file = {/Users/fabian/Zotero/storage/ZHWXNYXB/bsd-3-clause.html} +} + @online{bizzottoComparisonPopularFlutter2023, title = {A {{Comparison}} of {{Popular Flutter App Architectures}}}, author = {Bizzotto, Andrea}, @@ -10,6 +32,53 @@ file = {/Users/fabian/Zotero/storage/DUDXBAGD/comparison-flutter-app-architectures.html} } +@article{dechenshawSystemsSystemsCyberPhysical2016, + title = {Systems of {{Systems}}, {{Cyber-Physical Systems}}, the {{Internet-of-Things}}…whatever {{Next}}?}, + author = {family=C Henshaw, given=Michael J., prefix=de, useprefix=true}, + date = {2016}, + journaltitle = {INSIGHT}, + volume = {19}, + number = {3}, + pages = {51--54}, + issn = {2156-4868}, + doi = {10.1002/inst.12109}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/inst.12109}, + urldate = {2024-02-15}, + abstract = {This paper considers the concepts of systems of systems, cyber-physical systems, and the Internet-of-things. Although originating from different domains and perspectives, there is considerable convergence of the three concepts in terms of future complex systems, and it is concluded that the Internet-of-things is essentially a cyber-physical system of systems which will require new approaches in systems engineering to be developed.}, + langid = {english}, + file = {/Users/fabian/Zotero/storage/L4V53253/inst.html} +} + +@article{dibattistaModellingDiseaseTransmission, + title = {Modelling Disease Transmission from Touchscreen User Interfaces}, + author = {Di Battista, Andrew and Nicolaides, Christos and Georgiou, Orestis}, + journaltitle = {Royal Society Open Science}, + shortjournal = {R Soc Open Sci}, + volume = {8}, + number = {7}, + eprint = {34350020}, + eprinttype = {pmid}, + pages = {210625}, + issn = {2054-5703}, + doi = {10.1098/rsos.210625}, + url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8316822/}, + urldate = {2024-02-22}, + abstract = {The extensive use of touchscreens for all manner of human–computer interactions has made them plausible instruments of touch-mediated disease transmission. To that end, we employ stochastic simulations to model human–fomite interaction with a distinct focus on touchscreen interfaces. The timings and frequency of interactions from within a closed population of infectious and susceptible individuals was modelled using a queuing network. A pseudo-reproductive number R was used to compare outcomes under various parameter conditions. We then apply the simulation to a specific real-world scenario; namely that of airport self-check-in and baggage drop. A counterintuitive result was that R decreased with increased touch rates required for touchscreen interaction. Additionally, as one of few parameters to be controlled, the rate of cleaning/disinfecting screens plays an essential role in mitigating R, though alternative technological strategies could prove more effective. The simulation model developed provides a foundation for future advances in more sophisticated fomite disease-transmission modelling.}, + pmcid = {PMC8316822}, + file = {/Users/fabian/Zotero/storage/UY4WG89R/Di Battista et al_Modelling disease transmission from touchscreen user interfaces.pdf} +} + +@online{dikkyryanpratamaWhatLinuxDistribution, + title = {What {{Is Linux Distribution}}?}, + author = {{Dikky Ryan Pratama}}, + url = {https://www.alibabacloud.com/blog/what-is-linux-distribution_599979}, + urldate = {2024-02-22}, + abstract = {The article explains what a Linux distribution is, its main characteristics and components, how it caters to a wide range of users and purposes.}, + langid = {english}, + organization = {{Alibaba Cloud Community}}, + file = {/Users/fabian/Zotero/storage/LAGSLH4P/what-is-linux-distribution_599979.html} +} + @online{FlutterArchitecturalOverviewb, title = {Flutter Architectural Overview}, url = {https://docs.flutter.dev/resources/architectural-overview}, @@ -28,8 +97,62 @@ file = {/Users/fabian/Zotero/storage/V9T5LLK6/inside-flutter.html} } -@online{IntroductionDeclarativeUI, +@online{FlutterGPU, + title = {Flutter {{GPU}}}, + url = {https://github.com/flutter/flutter/wiki/Flutter-GPU}, + urldate = {2024-02-15}, + abstract = {Flutter makes it easy and fast to build beautiful apps for mobile and beyond - flutter/flutter}, + langid = {english}, + organization = {{GitHub}}, + file = {/Users/fabian/Zotero/storage/VVZT5YJA/Flutter-GPU.html} +} + +@online{FlutterWeiSuoYouPingMuChuangZaoJingCai, + title = {Flutter: 为所有屏幕创造精彩}, + shorttitle = {Flutter}, + url = {https://flutter.cn/}, + urldate = {2024-02-23}, + abstract = {Flutter 官方文档中文版,包含 SDK 下载、最新特性介绍、代码示例、开发文档、中文社区等内容。}, + langid = {chinese} +} + +@online{ganssleWhatEmbedded2008, + title = {What's {{Embedded}}?}, + author = {Ganssle, Jack}, + date = {2008-03-17T13:06:00+00:00}, + url = {https://www.embedded.com/whats-embedded/}, + urldate = {2024-02-22}, + abstract = {At the 2004 ESC Wind River's Jerry Fiddler claimed that there is no real embedded systems market. He felt that it was all about "the device," and in}, + langid = {american}, + organization = {{Embedded.com}}, + file = {/Users/fabian/Zotero/storage/XNVLRL6Q/whats-embedded.html} +} + +@online{gardeFlutterRaspberryPi2018, + title = {Flutter on {{Raspberry Pi}} (Mostly) from {{Scratch}}}, + author = {Garde, Chinmay}, + date = {2018-11-30T11:44:00}, + url = {https://medium.com/flutter/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1}, + urldate = {2023-11-13}, + abstract = {This document describes an experiment in porting the Flutter engine to a target that is currently not supported. That fact that I used a…}, + langid = {english}, + organization = {{Flutter}}, + file = {/Users/fabian/Zotero/storage/3K7HX2EI/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1.html} +} + +@online{googleinc.FutterBuildAny, + title = {Futter - {{Build}} for Any Screen}, + author = {{Google Inc.}}, + url = {https://flutter.dev/}, + urldate = {2024-02-22}, + abstract = {Flutter transforms the entire app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase.}, + langid = {english}, + file = {/Users/fabian/Zotero/storage/FUSDYG34/flutter.dev.html} +} + +@online{googleinc.IntroductionDeclarativeUI, title = {Introduction to Declarative {{UI}}}, + author = {{Google Inc.}}, url = {https://docs.flutter.dev/get-started/flutter-for/declarative}, urldate = {2024-02-13}, abstract = {Explains the difference between a declarative and imperative programming style.}, @@ -37,6 +160,101 @@ file = {/Users/fabian/Zotero/storage/F6LI3FTY/declarative.html} } +@book{hajianFlutterEngineering2024, + title = {Flutter Engineering}, + author = {Hajian, Majid}, + date = {2024-01-18}, + publisher = {{Staten House}}, + abstract = {Become a Flutter professional using tactics explained from a software engineer's perspective.This book covers various software engineering topics in Flutter and is divided into five parts, each addressing specific areas of interest and expertise.Foundation of Flutter Engineering introduces software engineering concepts specifically relevant to Flutter. It starts by explaining the fundamental principles of Flutter and how they work and then moves on to demonstrate how these concepts can be applied within the Flutter framework. This section also covers coding design patterns that help readers develop a foundational understanding of the subject matter.Architecture: beginning with basic principles and progressing onto different styles and patterns in architectural design. It covers essential concepts such as concurrency, parallelism, dependency injection, and state management. Additionally, this section explores the architectural factors involved in developing offline apps, guiding readers on strategic thinking and decision-making in software architecture.Processes part covers rules and guidelines, continuous delivery and integration, testing methodologies, and effective documentation practices in a comprehensive manner. This section gives readers the knowledge needed to streamline and efficiently develop apps.Ethical Engineering discusses the OWASP Top 10 security risks, privacy standards, and accessibility considerations. The section emphasizes creating inclusive and secure applications that value user privacy.Advancing UI Development explores adaptive and responsive UIs and sophisticated topics like custom painting, shaders, internationalization, localization, and effective theming in Flutter. This section enhances the reader’s skills in creating visually appealing and user-friendly interfaces.Whether a beginner or an experienced developer, this book can offer you something to learn.}, + isbn = {9798889405528}, + langid = {Englisch}, + pagetotal = {547} +} + +@book{heathEmbeddedSystemsDesign2002, + title = {Embedded Systems Design}, + author = {Heath, Steve}, + date = {2002}, + publisher = {{Elsevier}}, + isbn = {0-08-047756-9} +} + +@online{HowGitObject, + title = {How {{Git}} Object Deduplication Works in {{GitLab}} | {{GitLab}}}, + url = {https://docs.gitlab.com/ee/development/git_object_deduplication.html}, + urldate = {2024-02-19}, + abstract = {GitLab product documentation.}, + langid = {american}, + file = {/Users/fabian/Zotero/storage/4GAFAAXS/git_object_deduplication.html} +} + +@online{IntroductionDeclarativeUIa, + title = {Introduction to Declarative {{UI}}}, + url = {https://docs.flutter.dev/get-started/flutter-for/declarative}, + urldate = {2024-02-18}, + abstract = {Explains the difference between a declarative and imperative programming style.}, + langid = {english}, + file = {/Users/fabian/Zotero/storage/HRKBSWAK/declarative.html} +} + +@letter{itoYoctoTimeZone2018, + type = {E-mail}, + title = {[Yocto] Time Zone}, + author = {Ito, Takayasu}, + year = {Wed Oct 24 17:56:10 PDT 2018}, + url = {https://docs.yoctoproject.org/pipermail/yocto/2018-October/042964.html}, + urldate = {2024-03-04}, + file = {/Users/fabian/Zotero/storage/5RDNK486/042964.html} +} + +@article{korogluComparisonKeypadsTouchscreen2015, + title = {Comparison of Keypads and Touch-Screen Mobile Phones/Devices as Potential Risk for Microbial Contamination}, + author = {Koroglu, Mehmet and Gunal, Selami and Yildiz, Fatma and Savas, Mehtap and Ozer, Ali and Altindis, Mustafa}, + date = {2015-12-30}, + journaltitle = {Journal of Infection in Developing Countries}, + shortjournal = {J Infect Dev Ctries}, + volume = {9}, + number = {12}, + eprint = {26719936}, + eprinttype = {pmid}, + pages = {1308--1314}, + issn = {1972-2680}, + doi = {10.3855/jidc.6171}, + abstract = {INTRODUCTION: Touch-screen mobile phones/devices (TMPs/Ds) are increasingly used in hospitals. They may act as a mobile reservoir for microbial pathogens. The rates of microbial contamination of TMPs/Ds and keypad mobile phones (KMPs) with respect to different variables including use by healthcare workers (HCWs)/non-HCWs and the demographic characteristics of users were investigated. METHODOLOGY: A total of 205 mobile phones/devices were screened for microbial contamination: 76 devices belonged to HCWs and 129 devices belonged to the non-HCW group. By rubbing swabs to front screen, back, keypad, and metallic surfaces of devices, 444 samples were collected. RESULTS: Of 205 mobile phones/devices, 143 (97.9\%) of the TMPs/Ds and 58 (98.3\%) of the KMPs were positive for microbial contamination, and there were no significant differences in contamination rates between these groups, although TMPs/Ds had significantly higher microbial load than KMPs (p {$<$}0.05). The significant difference in this analysis was attributable to the screen size of mobile phones ≥ 5". Microbial contamination rates increased significantly as phone size increased (p {$<$}0.05). Higher numbers of coagulase-negative Staphylococci (CNS) were isolated from KMPs than TMPs/Ds (p = 0.049). The incidence of Enterococcus spp. was higher on the KMPs of HCWs, and methicillin resistant CNS was higher from the TMPs/Ds of non-HCWs (p {$<$}0.05). Isolation of CNS, Streptococcus spp. and Escherichia coli was higher from the TMPs/Ds of HCWs (p {$<$}0.05). CONCLUSIONS: We found no significant difference between TMP/Ds and KMPs in terms of microbial contamination, but TMP/Ds harboured more colonies and total microbial counts increased with screen size.}, + langid = {english}, + keywords = {Adult,Bacteria,Cross-Sectional Studies,Environmental Microbiology,Equipment Contamination,Fungi,Health Personnel,Hospitals,Humans,Male,Middle Aged,Prospective Studies,Telecommunications,Young Adult}, + file = {/Users/fabian/Zotero/storage/TFSCZX36/Koroglu et al_2015_Comparison of keypads and touch-screen mobile phones-devices as potential risk.pdf} +} + +@book{leeIntroductionEmbeddedSystems2016, + title = {Introduction to Embedded Systems: {{A}} Cyber-Physical Systems Approach}, + author = {Lee, Edward Ashford and Seshia, Sanjit Arunkumar}, + date = {2016}, + publisher = {{MIT press}}, + isbn = {0-262-53381-2} +} + +@article{leePresentFutureCyberPhysical2015, + title = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}: {{A Focus}} on {{Models}}}, + shorttitle = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}}, + author = {Lee, Edward A.}, + date = {2015-03}, + journaltitle = {Sensors}, + volume = {15}, + number = {3}, + pages = {4837--4869}, + publisher = {{Multidisciplinary Digital Publishing Institute}}, + issn = {1424-8220}, + doi = {10.3390/s150304837}, + url = {https://www.mdpi.com/1424-8220/15/3/4837}, + urldate = {2024-02-15}, + abstract = {This paper is about better engineering of cyber-physical systems (CPSs) through better models. Deterministic models have historically proven extremely useful and arguably form the kingpin of the industrial revolution and the digital and information technology revolutions. Key deterministic models that have proven successful include differential equations, synchronous digital logic and single-threaded imperative programs. Cyber-physical systems, however, combine these models in such a way that determinism is not preserved. Two projects show that deterministic CPS models with faithful physical realizations are possible and practical. The first project is PRET, which shows that the timing precision of synchronous digital logic can be practically made available at the software level of abstraction. The second project is Ptides (programming temporally-integrated distributed embedded systems), which shows that deterministic models for distributed cyber-physical systems have practical faithful realizations. These projects are existence proofs that deterministic CPS models are possible and practical.}, + issue = {3}, + langid = {english}, + keywords = {clock synchronization,cyber-physical systems,distributed systems,PRET machines,real-time systems,time synchronization}, + file = {/Users/fabian/Zotero/storage/IGCKHF3Y/Lee_2015_The Past, Present and Future of Cyber-Physical Systems.pdf} +} + @online{linuxfoundationYoctoProject162024, title = {The {{Yocto Project}} ® 4.0.16 Documentation}, author = {{Linux Foundation}}, @@ -46,6 +264,62 @@ file = {/Users/fabian/Zotero/storage/WWAQWEK2/singleindex.html} } +@book{marwedelEmbeddedSystemDesign2021, + title = {Embedded System Design: Embedded Systems Foundations of Cyber-Physical Systems, and the Internet of Things}, + author = {Marwedel, Peter}, + date = {2021}, + publisher = {{Springer Nature}}, + isbn = {3-030-60910-3} +} + +@article{oszutowska-mazurekAssociationsKnowledgeBehaviours2021, + title = {The {{Associations}} between {{Knowledge}} and {{Behaviours Related}} to {{Touch Screens}} and {{Microbiological Threats}} among {{IT Students}}’}, + author = {Oszutowska-Mazurek, Dorota and Fastowicz, Jaroslaw and Mazurek, Przemyslaw}, + date = {2021-09-02}, + journaltitle = {International Journal of Environmental Research and Public Health}, + shortjournal = {Int J Environ Res Public Health}, + volume = {18}, + number = {17}, + eprint = {34501860}, + eprinttype = {pmid}, + pages = {9269}, + issn = {1661-7827}, + doi = {10.3390/ijerph18179269}, + url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8431698/}, + urldate = {2024-02-22}, + abstract = {Current issue like the COVID–19 pandemic show how elementary knowledge and hygiene behaviours are important for ordinary people. Microbiological hazards, not just viruses, can be transmitted in various ways through touch screens. For ordinary users, there is a wide range of behaviours that affect the ability to transfer microbial hazards (viruses, bacteria and fungi). The purpose of the paper is to analyse the association between knowledge and behaviour of touch screen users based on surveys. This paper presents selected results of a survey conducted at the end of 2019 (pre–COVID–19 survey). The survey was conducted on a group of 172 IT school students. The relationship between responses using a 2D linear model regression and clustering is used. Most respondents believe that bacteria were more common than viruses on touch screens. The respondents declare altruism in terms of a greater willingness to lend their smartphone, rather than to use someone else’s. An interesting result is that respondents often lend their smartphone to others, while being aware that viruses or bacteria are present on the touch screens. The results can be used in terms of changes in the education process of smartphone users in relation to microbiological hazards.}, + pmcid = {PMC8431698}, + file = {/Users/fabian/Zotero/storage/4GH3EW8M/Oszutowska-Mazurek et al_2021_The Associations between Knowledge and Behaviours Related to Touch Screens and.pdf} +} + +@article{palKeypadMobilePhones2013, + title = {Keypad Mobile Phones Are Associated with a Significant Increased Risk of Microbial Contamination Compared to Touch Screen Phones}, + author = {Pal, Pallavi and Roy, Ashoke and Moore, Ginny and Muzslay, Monika and Lee, Elaine and Alder, Sarah and Wilson, Peter and Powles, Tom and Wilson, Peter and Kelly, John}, + date = {2013-03-01}, + journaltitle = {Journal of Infection Prevention}, + shortjournal = {Journal of Infection Prevention}, + volume = {14}, + number = {2}, + pages = {65--68}, + publisher = {{SAGE Publications}}, + issn = {1757-1774}, + doi = {10.1177/1757177413475903}, + url = {https://doi.org/10.1177/1757177413475903}, + urldate = {2024-02-22}, + abstract = {The use of mobile phones in the clinical environment by healthcare workers has become widespread. Despite evidence that these devices can harbour pathogenic micro-organisms there is little guidance on how to reduce contamination. Recently touchscreen phones with a single flat surface have been introduced. We hypothesise that bacterial contamination of phones used in hospitals will be lower on touchscreen devices compared to keypad devices. Sixty seven mobile phones belonging to health care workers were sampled. The median colony count for touchscreen phones and keypad devices was 0·09 colony forming units (cfu)/cm2 (interquartile range (IQR) 0.05–0·14) and 0·77 cfu/cm2 (IQR range 0·45–3.52) respectively. Colony counts were significantly higher on the keypad phones (Fisher’s exact test p{$<$}0.001). Multivariate analysis showed the type of phone (keypad vs. touch screen) was associated with increased colony counts (F-statistic 14.13: p{$<$}0.001). Overall, nine (13\%) phones grew either meticillin resistant Staphylococcus aureus or vancomycin resistant enterococci. Eight (24\%) keypad phones were contaminated with these organisms compared with one touch screen phone (3\%). Our data indicate that touchscreen mobile phones are less contaminated than their keypad counterparts, and they are less likely to harbour pathogenic bacteria in the clinical setting.}, + langid = {english}, + file = {/Users/fabian/Zotero/storage/44QLMR8K/Pal et al_2013_Keypad mobile phones are associated with a significant increased risk of.pdf} +} + +@online{Puro, + title = {Puro}, + url = {https://puro.dev/}, + urldate = {2024-02-20}, + abstract = {A comments widget built on GitHub Discussions.}, + langid = {english}, + file = {/Users/fabian/Zotero/storage/GEQ4Q3EP/widget.html} +} + @online{ReactiveManifesto, title = {The {{Reactive Manifesto}}}, url = {https://www.reactivemanifesto.org/}, @@ -53,6 +327,32 @@ file = {/Users/fabian/Zotero/storage/FJSMEDYJ/www.reactivemanifesto.org.html} } +@online{ReleaseV0Rev, + title = {Release v0.0.6: {{Rev}} Alpha Branch Version to 0.0.6, Flutter 0.0.26 (\#10010) · Flutter/Flutter}, + shorttitle = {Release v0.0.6}, + url = {https://github.com/flutter/flutter/releases/tag/v0.0.6}, + urldate = {2024-02-18}, + abstract = {VERSION: 0.0.6 flutter: 0.0.26 flutter\_driver: 0.0.4 flutter\_test: 0.0.4}, + langid = {english}, + organization = {{GitHub}}, + file = {/Users/fabian/Zotero/storage/DJJMSGJK/v0.0.html} +} + +@online{richardstallmanWhyGNULinux, + title = {Why {{GNU}}/{{Linux}}?}, + author = {{Richard Stallman}}, + url = {https://www.gnu.org/gnu/why-gnu-linux.en.html}, + urldate = {2024-02-19}, + file = {/Users/fabian/Zotero/storage/4YEIHLEH/why-gnu-linux.en.html} +} + +@online{RpifirmwareAddFirmware, + title = {Rpi-Firmware: Add Firmware for Zero 2w by Classabbyamp · {{Pull Request}} \#39123 · Void-Linux/Void-Packages}, + url = {https://github.com/void-linux/void-packages/pull/39123}, + urldate = {2024-02-23}, + file = {/Users/fabian/Zotero/storage/QWUKGL4U/39123.html} +} + @online{Skia, title = {Skia}, url = {https://skia.org/}, @@ -63,6 +363,17 @@ file = {/Users/fabian/Zotero/storage/NV4BSHXY/skia.org.html} } +@online{theflutterauthorsEngineShellPlatform, + title = {Engine/Shell/Platform/Embedder/Embedder.h at 436f9707b94774d1d049c04b8cda9d81d85aa4a8 · Flutter/Engine}, + author = {{The Flutter Authors}}, + url = {https://github.com/flutter/engine/blob/436f9707b94774d1d049c04b8cda9d81d85aa4a8/shell/platform/embedder/embedder.h}, + urldate = {2024-02-22}, + abstract = {The Flutter engine. Contribute to flutter/engine development by creating an account on GitHub.}, + langid = {english}, + organization = {{GitHub}}, + file = {/Users/fabian/Zotero/storage/SQZ53EIM/embedder.html} +} + @video{theflutterwayFlutterRubberDuck2022, entrysubtype = {video}, title = {Before {{Flutter}} | {{Rubber Duck Engineering}} | {{Episode}} \#100}, @@ -74,6 +385,19 @@ abstract = {Tonight we'll talk about the years leading up to Flutter and how Adam and I worked on a variety of projects for the web which inspired what Flutter would become, including at least 3 frameworks in JS, how we briefly thought "shake to reload" was our killer feature, how for more than the first 6 months of the project Flutter was DOM-based and network loaded and much more. Gonna be amazing. Slides: https://docs.google.com/presentation/...} } +@online{valleyWhatLinuxOverview2020, + title = {What {{Is Linux}}: {{An Overview}} of the {{Linux Operating System}}}, + shorttitle = {What {{Is Linux}}}, + author = {family=valley, given=The, prefix=info, useprefix=false}, + date = {2020-04-11T14:46:55}, + url = {https://medium.com/@theinfovalley097/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5}, + urldate = {2024-02-19}, + abstract = {What is Linux: An Overview of the Linux Operating System}, + langid = {english}, + organization = {{Medium}}, + file = {/Users/fabian/Zotero/storage/L97SMPU5/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5.html} +} + @article{weiserComputer21stCentury1999, title = {The Computer for the 21st Century}, author = {Weiser, Mark}, @@ -91,6 +415,13 @@ file = {/Users/fabian/Zotero/storage/8CCSE83J/Weiser - 1999 - The computer for the 21st century.pdf} } +@online{WhatWouldYou, + title = {What Would You like to See Most in Minix?}, + url = {https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ}, + urldate = {2024-02-19}, + file = {/Users/fabian/Zotero/storage/6TCWJW3N/SwRavCzVE7gJ.html} +} + @online{WorkingJSONFlutter2021, title = {Working with {{JSON}} in {{Flutter While Using}} Json\_annotations and Json\_serializable {{Modules}} in 2022 | {{John Maeda}}’s {{Blog}}}, date = {2021-06-22}, @@ -101,3 +432,9 @@ organization = {{https://maeda.pm/}}, file = {/Users/fabian/Zotero/storage/ND8L5RU6/working-with-json-in-flutter-while-using-json_annotations-and-json_serializable-modules-in-2022.html} } + +@online{zotero-649, + url = {https://tagesschau.api.bund.dev/openapi.yaml}, + urldate = {2024-03-03}, + file = {/Users/fabian/Zotero/storage/MBRFKF6W/openapi.html} +} diff --git a/Makefile b/Makefile index 4fd4e95..22edeb7 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,4 @@ -SHELL:=/bin/bash -MARKDOWN_FILES := $(shell find chapters -type f -name "*.md" | sort | tr '\n' ' ') -BACHELOR_TEXT := @cat $(MARKDOWN_FILES) +export MERMAID_FILTER_FORMAT:=pdf all: local @@ -11,11 +9,15 @@ help: dir: mkdir -p out +tmp: + cat $$(find chapters -type f -name "*.md" | sort) | grep -vw '' > /tmp/bachelor-build + + bachelor: @cat $(MARKDOWN_FILES) -local: dir +local: dir tmp @echo "Building paper" - MERMAID_FILTER_FORMAT=pdf pandoc -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --lua-filter columns.lua --citeproc -s $(MARKDOWN_FILES) -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=11pt --highlight-style tango --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections + pandoc -f markdown+implicit_figures --strip-comments --listings -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --filter py-pandoc-include-code --lua-filter columns.lua --citeproc -s /tmp/bachelor-build -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=12pt --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections -Vindent=false clean: rm -rf out diff --git a/README.md b/README.md new file mode 100644 index 0000000..c458182 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Flutter als Entwicklungsplattform für eingebettete Linux Systeme + +## Eine Fallstudie diff --git a/assets/flutter/archdiagram.png b/assets/flutter/archdiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..148cf7b5ae23b8747e780ea8cd0284ea420c61e3 GIT binary patch literal 113530 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

X2Mn(jW%}q0*V&Tvjln}7D+5G%wJ~M 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 diff --git a/chapters/00_pandoc/00_pandoc.md b/chapters/00_pandoc/00_pandoc.md index 2bf7b0c..ccd2fbe 100644 --- a/chapters/00_pandoc/00_pandoc.md +++ b/chapters/00_pandoc/00_pandoc.md @@ -1,55 +1,57 @@ --- header-includes: | - \usepackage[T1]{fontenc} - \usepackage[usefilenames,RMstyle={Text,Semibold},SSstyle={Text,Semibold},TTstyle={Text,Semibold},DefaultFeatures={Ligatures=Common}]{plex-otf} - \usepackage[a4paper,bindingoffset=0.2in,% - left=4cm,right=2cm,top=2cm,bottom=2cm,% - footskip=.25in]{geometry} - \usepackage{fancyhdr} - \usepackage[utf8]{inputenc} - \usepackage{tikz} - \usetikzlibrary{snakes,arrows,shapes} - \usepackage{amsmath} - \usepackage{pgfplots} - \usepackage{pgfplotstable} - \pgfplotsset{compat=1.8} - \usepackage{multicol,lipsum} - \usepackage{listings} - \usepackage{wrapfig} - \usepackage[font=small,labelfont=bf]{caption} - \usepackage{graphicx} - \usepackage{xcolor,stackengine} - \usepackage{colortbl} - \usepackage{tcolorbox} - \usepackage{lastpage} - \usepackage{subcaption} - \usepackage{tabularx} - \usepackage{biblatex} - \usepackage{float} - \usepackage{refract} - \usepackage{svg} - \usepackage{setspace} - \usepackage{titling} + \usepackage[T1]{fontenc} + \usepackage[a4paper,bindingoffset=0in,left=4cm,right=2cm,top=2cm,bottom=2cm,footskip=.25in]{geometry} + \usepackage{fancyhdr} + \usepackage[utf8]{inputenc} + \usepackage{tikz} + \usetikzlibrary{snakes,arrows,shapes} + \usepackage{amsmath} + \usepackage{pgfplots} + \usepackage{pgfplotstable} + \pgfplotsset{compat=1.8} + \usepackage{multicol,lipsum} + \usepackage{listings} + \usepackage{wrapfig} + \usepackage[font=small,labelfont=bf,tableposition=top, position=above]{caption} + \usepackage{graphicx} + \usepackage{xcolor,stackengine} + \usepackage{colortbl} + \usepackage{tcolorbox} + \usepackage{lastpage} + \usepackage{subcaption} + \usepackage{tabularx} + \usepackage{biblatex} + \usepackage{float} + \usepackage{refract} + \usepackage{svg} + \usepackage{setspace} + \usepackage{titling} + \usepackage{abstract} \usepackage{fvextra} \usepackage{emoji} + \usepackage{fontspec} + \usepackage{dirtree} + \usepackage{etoolbox} + \setmainfont{Times New Roman} \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}} - \newcommand{\hideFromPandoc}[1]{#1} - \hideFromPandoc{ - \let\Begin\begin - \let\End\end - } - \makeatletter - \def\fps@figure{h} - \makeatother -nocite: | - @* + \newcommand{\hideFromPandoc}[1]{#1} + \hideFromPandoc{ + \let\Begin\begin + \let\End\end + } + \makeatletter + \def\fps@figure{h} + \makeatother --- +\captionsetup[figure]{position=above} + \setstretch{1.5} \setemojifont{Twemoji Mozilla} -\renewcommand{\familydefault}{\sfdefault} + \graphicspath{ {./img/} } @@ -59,6 +61,8 @@ nocite: | \renewcommand{\comment}[1]{\hspace{2em}{\small\textit{#1}}\bigskip\par} +\renewcommand{\lstlistingname}{Auflistung} + \newcommand\palbox[1]{{\sffamily\fboxsep=5pt\relax\fboxrule=1pt\relax\footnotesize% \fcolorbox{gray!50}{gray!10}{% \stackengine{4pt}{% @@ -77,3 +81,8 @@ frame=single, breaklines=true, postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space}, } + +\apptocmd{\dirtree}{\bigskip}{}{} +\pretocmd{\dirtree}{\bigskip}{}{} + +\newcommand{\mkbibnodate}{n\adddot d\adddot} diff --git a/chapters/00_pandoc/01_dart.md b/chapters/00_pandoc/01_dart.md new file mode 100644 index 0000000..b6d3d8c --- /dev/null +++ b/chapters/00_pandoc/01_dart.md @@ -0,0 +1,31 @@ +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95, 0.95, 0.96} + +\lstset{ +backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, +keywordstyle=\color{magenta}, +numberstyle=\tiny\color{codegray}, +stringstyle=\color{codepurple}, +basicstyle=\ttfamily\footnotesize, +breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, +showtabs=false, + tabsize=2, +morestring=\*[d]{"} +} + +\lstset{ +emph=[1]{var, String, int, List, void, Future, await, if, else, throw, async, true, false}, +emphstyle=[1]{\color{codepurple}}, +emph=[2]{findAllElements,findElements, setState, send, fromPath, add, parse, bytesToString}, +emphstyle=[2]{\color{magenta}} +} diff --git a/chapters/01_titel/00_titlepage.md b/chapters/01_titel/00_titlepage.md index feacd26..4642fdd 100644 --- a/chapters/01_titel/00_titlepage.md +++ b/chapters/01_titel/00_titlepage.md @@ -2,31 +2,39 @@ \begin{titlepage} \begin{center} -\Large Hochschule Rhein-Waal \\ -\vspace{2.5cm} -\Large Proposal für die Bachelorarbeit \\ -\vspace{2.5cm} -\huge \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\ -\vspace{1.0cm} -\Large Fabian Baldeau \\ -\vspace{2.5cm} -\vspace{0.25cm} -\textsc{Studiengang}\\ -\vspace{0.25cm} -\textsc{Medieninformatik}\\ -\vspace{2.5cm} -\textsc{Gutachter}\\ -\vspace{0.25cm} -\textsc{Prof. Dr.-Ing. Ido Iurgel}\\ -\vspace{0.25cm} -\textsc{Prof. Dr. Kai Essig}\\ +Hochschule Rhein-Waal \\ +Fakultät Kommunikation und Umwelt \\ +Prof Dr.-Ing. Ido Iurgel \\ +Prof Dr. Kai Essig \\ +\vspace{3cm} +\Large \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\ +\vspace{2.0cm} +\normalsize Bachelorarbeit \\ +im Studiengang \\ +Medieninformatik \\ +Zur Erlangung des akademischen Grades \\ +\vspace{2.0cm} +Bachelor of Science \\ +\vspace{2.0cm} +vorgelegt von\\ +Fabian Baldeau \\ +\vspace{1.5cm} +Matrikelnummer: \\ +27516 \\ +\vspace{1.5cm} +Abgabedatum: \\ +xx. xxxx 2024 \\ \vspace{2cm} \end{center} \end{titlepage} -\pagenumbering{Roman} +\pagenumbering{roman} \fancyhf{} -\fancyhead[C]{\thepage} + + + +\fancyhead[C]{} +\fancyfoot[R]{\thepage} \renewcommand{\headrulewidth}{0pt} \pagestyle{fancy} diff --git a/chapters/01_titel/01_abstract.md b/chapters/01_titel/01_abstract.md index e69de29..5c19f4e 100644 --- a/chapters/01_titel/01_abstract.md +++ b/chapters/01_titel/01_abstract.md @@ -0,0 +1,27 @@ +\addtocounter{page}{1} + +\begin{abstract} +Die Integration von Flutter's plattformübergreifenden +UI-Fähigkeiten mit der Anpassungsfähigkeit von Embedded +Linux verspricht die Rationalisierung der Entwicklung +von Benutzeroberflächen (UIs) für eingebettete Systeme. +Diese Arbeit untersucht die Eignung von Flutter in +diesem Kontext durch eine Fallstudie: die Entwicklung +eines Flutter App Prototyps auf einem Raspberry +Pi mit einer angepassten eingebetteten Linux Distribution. +Leistungsmesswerte, Benutzerfreundlichkeit und der +Entwicklungsprozess werden bewertet. Die Ergebnisse +zeigen, dass Flutter, wenn es angepasst wird, +erfolgreich zur Erstellung von attraktiven und benutzerfreundlichen +eingebetteten Schnittstellen mit wenigen Kompromissen +bei der Leistung genutzt werden kann. + +Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer +prototypischen Anwendung mit Flutter für ein eingebettetes Linux System. +Dabei wurde ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in +eingebetteten Linux Systemen genutzt werden kann und es wurde anhand der +prototypischen Anwendung untersucht, wie gut Flutter für diesen +Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung +zeigen ein großes Potential für die Nutzung von Flutter in eingebetteten +Linux Systemen. +\end{abstract} diff --git a/chapters/01_titel/02_toc.md b/chapters/01_titel/02_toc.md index b4245c6..4efd4db 100644 --- a/chapters/01_titel/02_toc.md +++ b/chapters/01_titel/02_toc.md @@ -1,6 +1,16 @@ +\pagebreak \tableofcontents \pagebreak +\listoffigures + +\pagebreak + +\renewcommand\lstlistlistingname{Auflistungsverzeichnis} +\lstlistoflistings + +\pagebreak + + + +# Einleitung + +## Motivation + +Die Entwicklung moderner und ansprechender Benutzeroberflächen (GUIs) für eingebettete +Linux-Systeme ist eine Herausforderung. Herkömmliche GUI-Toolkits stoßen häufig an +ihre Grenzen, wenn es um die Erfüllung der Anforderungen an Leistung, +plattformübergreifende Kompatibilität und Design geht. Flutter [@googleinc.FutterBuildAny], +ein quelloffenes Benutzerschnittstellen-Entwicklungs-Kit von Google, +stellt eine vielversprechende Alternative dar. Es zeichnet sich durch native Kompilierung +für hohe Performance und geringen Ressourcenverbrauch, eine flexible Architektur, +die an verschiedene Plattformen angepasst werden kann, und seinen Fokus auf moderne +und intuitive Benutzeroberflächen aus. + +## Relevanz + +In dieser Arbeit wird der Einsatz von Flutter für die Entwicklung von GUIs für +eingebettete Linux-Systeme untersucht. Die Arbeit leistet einen wichtigen Beitrag +zu diesem Forschungsbereich, indem sie: + +- die Leistungsmerkmale von Flutter auf eingebetteter Hardware detailliert untersucht + und wertvolle Hinweise für die Auswahl des richtigen Toolkits liefert. +- den Entwicklungsprozess detailliert beschreibt und Herausforderungen sowie + bewährte Praktiken bei der Verwendung von Flutter in einem eingebetteten Linux-Kontext aufzeigt. +- eine reale eingebettete GUI mit Flutter implementiert und dabei die Fähigkeiten und + potenziellen Anwendungsfälle des Toolkits hervorhebt. + +Die Ergebnisse dieser Arbeit sind relevant für Entwickler +im Bereich eingebetteter Systeme, die moderne, +performante und ansprechende GUIs für Linux-basierte Geräte entwickeln möchten. + +## Zielsetzung + +Ziel der Arbeit ist es, die Potenziale und Herausforderungen von +Flutter im Bereich der GUI-Entwicklung für eingebettete Linux-Systeme +zu beleuchten und Entwicklern wertvolle Hinweise für die Auswahl des +richtigen Toolkits zu liefern. + +## Problemstellung + +Beantwortet werden soll die Frage, inwieweit sich Flutter für die Entwicklung von GUIs +für eingebettete Linux-Systeme eignet. Dazu wird in dieser Arbeit geklärt: +Wie einfach und effizient ist die Entwicklung und Wartung von GUIs mit Flutter? +Welche Auswirkungen hat Flutter auf die Performance und den Ressourcenverbrauch im +eingebetteten Kontext? Wie hoch ist der Lernaufwand für Entwickler? Welche Community +und Support-Ressourcen stehen für Flutter-Entwickler zur Verfügung? Um diese Fragen +zu beantworten wird die folgende Methodik angewendet. + +## Methodik + +Um die Forschungsfrage zu beantworten, wird eine Literaturrecherche, +eine experimentelle Untersuchung und eine Auswertung der Untersuchung durchgeführt. +In der Literaturrecherche werden aktuelle wissenschaftliche Quellen zu GUI-Entwicklung +für eingebettete Systeme und Flutter ausgewertet. Die experimentelle Untersuchung +umfasst die Implementierung einer realen eingebetteten GUI mit Flutter und die +Bewertung der Performance, des Ressourcenverbrauchs und der Benutzerfreundlichkeit +der GUI. Die Ergebnisse der Literaturrecherche und der experimentellen Untersuchung +werden in einem Bewertungsschema zusammengefasst und abschließend bewertet. Basierend +auf den Ergebnissen wird ein Leitfaden für die Entwicklung von GUIs für eingebettete +Linux-Systeme mit Flutter erstellt. + +## Struktur der Arbeit + +Zu ergänzen wenn Arbeit fertig ist... + +## Problematik + +Zu ergänzen falls nötig... diff --git a/chapters/02_einleitung/01_zielsetzung.md b/chapters/02_einleitung/01_zielsetzung.md index e69de29..ccc272c 100644 --- a/chapters/02_einleitung/01_zielsetzung.md +++ b/chapters/02_einleitung/01_zielsetzung.md @@ -0,0 +1,12 @@ + + + diff --git a/chapters/03_grundlagen/01_eLinux.md b/chapters/03_grundlagen/01_eLinux.md deleted file mode 100644 index 78c67b4..0000000 --- a/chapters/03_grundlagen/01_eLinux.md +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/chapters/03_grundlagen/01_linux.md b/chapters/03_grundlagen/01_linux.md new file mode 100644 index 0000000..c56bdf4 --- /dev/null +++ b/chapters/03_grundlagen/01_linux.md @@ -0,0 +1,172 @@ + + +\pagebreak + +# Grundlagen + +## Eingebettete Systeme + +Traditionelle Ansichten über Computer beschreiben sie oft als +eigenständige Geräte wie Desktops oder Laptops. Im Gegensatz dazu +skizzierte Mark Weiser in seinem einflussreichen Paper +"The Computer of the 21st Century" 1999 eine Vision des "Ubiquitous Computing". [@weiserComputer21stCentury1999] +Diese Vision beschreibt eine Welt, in der nahtlos integrierte Geräte in unserem +Leben "verschwinden". Eingebettete Systeme verkörpern heute diese Philosophie. +Sie sind keine Allzweckcomputer, sondern spezialisierte Computer, die +in Geräten und Systemen eingebettet sind. Sie sind in der Regel auf eine +spezielle Aufgabe oder Funktion zugeschnitten und sind oft in +Geräten des täglichen Lebens zu finden. + +Beispiele für eingebettete Systeme finden sich in allen Lebensbereichen: + +- **Automobilindustrie**: Infotainment System +- **Industrie**: Automatisierungssysteme, Steuerung von Maschinen +- **Medizintechnik**: Medizinische Geräte, Diagnosegeräte +- **Haushaltsgeräte**: Waschmaschinen, Kühlschränke +- **Consumer Electronics**: Smartphones, Smartwatches + +Eingebettete Systeme sind oft auf Echtzeitfähigkeit, Energieeffizienz +und Zuverlässigkeit ausgelegt. Sie sind in der Regel nicht so leistungsfähig +wie Desktop- oder Server-Computer, aber sie sind in der Lage, spezialisierte +Aufgaben zu erfüllen. + +Auch Experten fällt eine klare Definition von eingebetteten Systemen +in der heutigen Zeit nicht leicht, wie auch Jack Ganssle, ein +Experte für eingebettete Systeme mit über 30 Jahre Berufserfahrung, +in einem Blog Beitrag schreibt. [@ganssleWhatEmbedded2008] +So konnte man laut Ganssle früher Systeme, die mit einem Mikrocontroller oder +Mikroprozessor ausgestattet sind und in einem Gerät eingebettet sind, +klar als eingebettete Systeme bezeichnen. +Doch heutzutage werden oft auch Systeme, die mit einem vollwertigen +Betriebssystem ausgestattet sind, als eingebettete Systeme bezeichnet. +Dazu gehört das Linux Betriebssystem, welches in vielen eingebetteten +Systemen zum Einsatz kommt und auch Windows ist laut Ganssle in +eingebetteten Systemen anzutreffen. Als weiteres Beispiel dazu +nennt er das Handy, welches als es nur zum telefonieren genutzt wurde +klar als eingebettetes System bezeichnet werden konnte, doch heutzutage +ist es ein vollwertiger Computer, der auch als solcher +für eine Vielzahl von anderen Funktionen genutzt werden kann. + +\pagebreak + +In weiterer Literatur zu eingebetteten Systemen finden sich +die folgenden Definitionen: + +> "An embedded system is a microprocessor based system that is +> built to control a function or a range of functions." [@heathEmbeddedSystemsDesign2002] + +> "Embedded systems are information processing systems embedded into enclosing products." +> [@marwedelEmbeddedSystemDesign2021] + +Auch aus diesen Definitionen geht hervor, dass die Definition von eingebetteten +Systemen nicht eindeutig ist. Da es sowohl eine Funktion oder eine Reihe von +Funktionen steuern kann, als auch speziell ein System ist, das in ein Produkt +eingebettet ist. + +Ein eingebettetes System ist also meistens ein Computersystem, das spezialisiert +ist auf eine bestimmte Funktion oder Aufgabe. Mittlerweile heißt das jedoch auch, +dass es sich oft um Systeme handelt, welche eigentlich vollwertige Computer sind und +daher viele Funktionen ausführen könnten, doch der Hersteller oder Entwickler das +System auf gezielte Funktionen beschränkt. So würde ein Bankautomat mit eingebetteten Linux +nur auf die speziellen Aufgaben beschränkt werden, welche ein Bankautomat zu erfüllen hat, obwohl er +eigentlich ein vollwertiger Computer sein könnte und viele weitere Funktionen ausführen könnte. +Besonders bei eingebetteten Systemen mit Touchscreens könnte eine schier unendliche Anzahl von +Funktionen auf dem Display angezeigt und angesteuert werden. Daher kommt die Definition +eines eingebetteten Systems auch auf die Definition des Systems vom Hersteller oder Entwickler an. + + + +## Linux + +Linux ist die Bezeichnung für ein freies und quelloffenes Betriebssystem, +das auf dem Linux-Kernel und dem GNU-Betriebssystem basiert. Hinter der +Bezeichnung GNU steht das GNU-Projekt, das 1983 von Richard Stallman +ins Leben gerufen wurde. Das GNU-Projekt hat das Ziel, ein vollständig +freies Betriebssystem zu entwickeln, das auf freier Software basiert. +Im allgemeinen Sprachgebrauch wird Linux oft als Bezeichnung für das +gesamte Betriebssystem genutzt, obwohl es sich eigentlich um das +Betriebssystem GNU/Linux handelt. Richard Stallman, der Gründer des +GNU-Projekts und der Free Software Foundation, erläutert in einem +Blog-Beitrag, dass es wichtig wäre, GNU zu erwähnen, da es viele +der Kernkomponenten des Betriebssystems zusammen mit dem Linux-Kernel +bildet und dass die Bezeichnung GNU/Linux diesen wichtigen Beitrag +anerkennt. Zudem würde es dabei helfen, die Idee des GNU-Projekts +und der Free Software Foundation zu verbreiten. [@richardstallmanWhyGNULinux] + +In der Arbeit wird die Bezeichnung "Linux" für das Betriebssystem +verwendet, da es sich um die allgemein gebräuchliche Bezeichnung +handelt und die Bezeichnung "GNU/Linux" in der Literatur und im +allgemeinen Sprachgebrauch nicht so verbreitet ist. Besonders im +eingebetteten Bereich wird es allgemein als "Eingebettetes Linux" +bezeichnet und nicht als "Eingebettetes GNU/Linux". + +Linux gehört zu den weltweit am weitesten verbreiteten Betriebssystemen +und zählt zur Gruppe von "unixoide" oder unix-ähnlichen Betriebssystemen, +da es Konzepte des 1969 von Bell Laboratories entwickelten Betriebssystems +Unix aufgreift. + +Nutzer von Linux verwendet oft eine sogenannte "Distribution" von Linux +wie Ubuntu. Eine Linux-Distribution, auch als Distro bezeichnet, ist ein vollständiges +Betriebssystem, das auf dem Linux-Kernel aufbaut. Der Kernel ist das +Herzstück des Betriebssystems. Zusätzlich zum Kernel gibt es weitere +wichtige Bestandteile einer Distro, wie Systembibliotheken, Dienstprogramme +und Softwareanwendungen. Die Auswahl dieser wird vom Ersteller der Distro +getroffen. Distros gibt es in vielen Varianten, jede mit ihren eigenen +Zielen, Zielgruppen und Softwareauswahl. Das bedeutet, dass es für viele +verschiedene Anwendungsfälle eine passende Distro gibt. [@dikkyryanpratamaWhatLinuxDistribution] + +### Eingebettetes Linux + +Unter eingebetteten Linux versteht man die Nutzung des +Linux-Betriebssystems im Umfeld eingebetteter Systeme. Der +einzige wesentliche Unterschied zu dem normalen Linux-Betriebssystem +ist dabei, dass das System auf die speziellen Anforderungen +eingebetteter Systeme zugeschnitten ist und vor allem +sparsamer mit den Ressourcen umgeht. Es hält jedoch nichts davon ab, +jede Art von Linux-Distribution auf einem eingebetteten System zu +installieren und als "eingebettetes Linux" zu betreiben. Um jedoch +das volle Potenzial eines eingebetteten Systems auszuschöpfen, ist +es ratsam, eine speziell für eingebettete Systeme entwickelte +Linux-Distribution zu verwenden. Yocto ist ein Projekt mit +dem eine solche spezielle Distribution für eingebettete Systeme +erstellt werden kann. + +### Das Yocto Projekt + +Yocto ist ein Open-Source-Projekt der Linux Foundation, das es ermöglicht, +maßgeschneiderte Linux-Distributionen für eingebettete Systeme +zu erstellen. Es bietet hierzu eine Sammlung von Tools, Vorlagen und +Methoden, die vor allem auf die Prinzipien der quellbasierten +Linux-Distribution Gentoo basieren. Eine quellbasierte Distribution +ist eine Linux-Distribution, die aus den Quellcodes der Software +zusammengestellt wird. Das bedeutet, dass die Software auf dem +Zielgerät aus den Quellcodes kompiliert wird und nicht aus +vorkompilierten Binärdateien installiert wird. Dies ermöglicht +eine hohe Flexibilität und Anpassbarkeit der Distribution und +Software. Yocto erweitert dieses Prinzip speziell auf eingebettete +Systeme. Es ist keine fertige Distribution, sondern ein Framework, +mit dem eigene Distributionen speziell für eingebettete Systeme erstellt werden können. +[@linuxfoundationYoctoProject162024] diff --git a/chapters/03_grundlagen/02_flutter.md b/chapters/03_grundlagen/02_flutter.md new file mode 100644 index 0000000..0fe49ae --- /dev/null +++ b/chapters/03_grundlagen/02_flutter.md @@ -0,0 +1,127 @@ + + + + +## Flutter + +Flutter ist ein von Google entwickeltes +quelloffenes Benutzerschnittstellen-Entwicklungs-Kit, +welches die effiziente Entwicklung ansprechender +Benutzeroberflächen für mobile, Web- und +Desktop-Anwendungen ermöglichen soll. Es wurde +2017 von Google veröffentlicht und ist +BSD-lizenziert [@3ClauseBSDLicense2011]. + +Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme +stellt die effiziente Anwendungsentwicklung vor Herausforderungen. +Plattformübergreifende Frameworks wie Flutter zielen darauf ab, +diese Herausforderungen zu mildern, indem sie ein einheitliches +Toolset zum Erstellen von Benutzeroberflächen (GUIs) bereitstellen, +die nahtlos über verschiedene Plattformen hinweg funktionieren. +Dieses Kapitel befasst sich mit der grundlegenden Architektur +von Flutter. + +### Flutters Architektur + +Flutter verwendet eine modulare, geschichtete Architektur. Dieses +Design besteht aus unabhängigen Bibliotheken, die jeweils von der +darunter liegenden Schicht abhängig sind, was lose Kopplung und +Flexibilität gewährleistet. Dieser Ansatz fördert die Anpassbarkeit +und die Möglichkeit, Framework-Komponenten nach Bedarf zu ersetzen. [@FlutterArchitecturalOverviewb] + +Die folgende Abbildung \ref{flutterArch} zeigt die Architektur von Flutter: + +\pagebreak + +```{=latex} +\begin{figure}[ht] +\centering +\caption{Flutter Architektur} +\includegraphics[width=9cm]{assets/flutter/archdiagram.png} +\label{flutterArch} + + +\caption*{ +``` + +Quelle: @FlutterArchitecturalOverviewb + +```{=latex} +} +\end{figure} +``` + +Das Kernelement von Flutter ist die Engine, die in C/C++ geschrieben +ist. Sie ist für das Rastern zusammengesetzter Szenen verantwortlich, +sobald ein neues Bild gezeichnet werden muss. Sie übernimmt alle +Aufgaben zur Darstellung der Benutzeroberfläche. + +Auf der Engine liegt das Flutter-Framework, das in der Programmiersprache +Dart geschrieben ist. Diese Ebene bietet ein modernes, reaktives Framework, +das zum Aufbau der Benutzeroberfläche verwendet wird. In der Entwicklung +von Flutter Anwendungen wird meistens nur diese Flutter-Framework Ebene +verwendet und die komplette Flutter Anwendung wird meist nur im +Framework Teil in Dart geschrieben. + +Die niedrigste Ebene ist der Embedder, dessen Aufgabe es ist, +die Rendering-Fläche bereitzustellen, die Eingaben zu verarbeiten +und Zugriff zu Dart Anwendungs-Snapshots zu ermöglichen. [@gardeFlutterRaspberryPi2018] +Die Flutter Engine hat hierzu eine C API, welche in einer einzelnen +C Header-Datei definiert ist. [@theflutterauthorsEngineShellPlatform] Diese API Punkte müssen von dem +Embedder angesprochen werden. + + + +### Deklarative Programmierung in Flutter + +Deklarative Programmierung ist ein Programmierparadigma, bei dem +der Programmierer den gewünschten Endzustand der Anwendung +beschreibt, anstatt die Schritte zu definieren, die zur Erreichung +dieses Zustands erforderlich sind. Dieses Paradigma ist in Flutter +zentral, da es die Entwicklung von Benutzeroberflächen erleichtert. +Die Benutzeroberfläche wird als Baum von Widgets dargestellt, die +jeweils den gewünschten Zustand der Benutzeroberfläche beschreiben. +Wenn sich der Zustand ändert, wird der Baum der Widgets neu +gerendert, um den neuen Zustand widerzuspiegeln. [@googleinc.IntroductionDeclarativeUI] + +\lstinputlisting[language=Java, caption=Beispiel für deklarative Programmierung mit Flutter, linerange={65-73}, captionpos=t] +{code/flutter_architecture/lib/main.dart} + +Wie im Code-Beispiel zu erkennen definiert der Entwickler hier +ein neues Widget `TextWidget`, welches einen Text als Parameter erhält +und diesen als Text-Widget mit dem im Parameter übergebenen Text +zurückgibt. Dieses Widget wird dann in der "build" Methode erstellt. +An einer gegebenen Stelle im Code kann der Entwickler nun dieses +`TextWidget` folgendermaßen verwenden: + +```{#test .dart .number-lines caption="Nutzung des TextWidgets" captionpos=t} +TextWidget("Hello World"); +``` + +Hier wird der Text "Hello World" als Parameter an das `TextWidget` +übergeben und das Widget wird an der beliebigen Stelle in der Anwendung +angezeigt wo es so eingesetzt wurde. Wenn nun aber eine dynamische +Variable an den Text übergeben werden soll, kann dies einfach +durch die folgende Deklaration geschehen: + +```{.dart .number-lines caption="Nutzung des TextWidgets mit dynamischer Variable" captionpos=t} +String text = "Hello World"; +TextWidget(text); +``` + +Falls nun die Variable `text` sich ändert, wird das `TextWidget` +automatisch neu gerendert und der neue Text wird angezeigt. +Der Entwickler muss sich also nicht darum kümmern, dass das Widget +neu gerendert wird, das ist deklarative Programmierung in Flutter. +Das Framework übernimmt das für den Entwickler automatisch. diff --git a/chapters/03_grundlagen/03_i2c_bus.md b/chapters/03_grundlagen/03_i2c_bus.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/03_grundlagen/04_spi_bus.md b/chapters/03_grundlagen/04_spi_bus.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/03_grundlagen/05_yocto_linux.md b/chapters/03_grundlagen/05_yocto_linux.md deleted file mode 100644 index e7839d7..0000000 --- a/chapters/03_grundlagen/05_yocto_linux.md +++ /dev/null @@ -1,17 +0,0 @@ -# Yocto Environment - -## Poky - -## Metadata - -## Open-Embedded Project - -## Bitbake - -## Board support package - -## Meta-Flutter - -# Setting up the build environment and building the image - -# Flashing the image on Target diff --git a/chapters/03_grundlagen/06_flutter.md b/chapters/03_grundlagen/06_flutter.md deleted file mode 100644 index 9517853..0000000 --- a/chapters/03_grundlagen/06_flutter.md +++ /dev/null @@ -1,35 +0,0 @@ - - -# Flutter - -Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme -stellt die effiziente Anwendungsentwicklung vor Herausforderungen. -Plattformübergreifende Frameworks wie Flutter zielen darauf ab, -diese Herausforderungen zu mildern, indem sie ein einheitliches -Toolset zum Erstellen von Benutzeroberflächen (UIs) bereitstellen, -die nahtlos über verschiedene Plattformen hinweg funktionieren. -Dieses Kapitel befasst sich mit der grundlegenden Architektur, -den Vorteilen und Überlegungen zur Verwendung von Flutter für -die Anwendungsentwicklung. [@theflutterwayFlutterRubberDuck2022] - -Was ist Flutter [@FlutterArchitecturalOverviewb] - -test [@weiserComputer21stCentury1999] - -```{#test .dart .number-lines caption="Example Dart test"} -import 'package:retry/retry.dart'; - -final response = await retry( - // Make a GET request - () => http.get('https://google.com').timeout(Duration(seconds: 5)), - // Retry on SocketException or TimeoutException - retryIf: (e) => e is SocketException || e is TimeoutException, -); -print(response.body); -``` - -Nice Dart highlighting! - -![](./assets/skizzen/led.png) - -WORKING :) diff --git a/chapters/05_analyse_und_design/00_anforderungen.md b/chapters/05_analyse_und_design/00_anforderungen.md new file mode 100644 index 0000000..c67a809 --- /dev/null +++ b/chapters/05_analyse_und_design/00_anforderungen.md @@ -0,0 +1,13 @@ +\pagebreak + +# Analyse und Design + +## Anforderungen + +### Anwendungseinsatz + +### Anwendungsfunktionen + +### Abgrenzungskriterien + +### Benutzeroberfläche diff --git a/chapters/05_analyse_und_design/01_architektur.md b/chapters/05_analyse_und_design/01_architektur.md new file mode 100644 index 0000000..5d31cd9 --- /dev/null +++ b/chapters/05_analyse_und_design/01_architektur.md @@ -0,0 +1,29 @@ +## Architektur + +### Analyse + +### Design + +- three-layer architecture [@hajianFlutterEngineering2024, 219] + +\begin{figure}[ht] +\centering +\begin{minipage}{7cm} +\dirtree{% +.1 lib/. +.2 common. +.2 constants. +.2 features. +.3 benchmark. +.3 home. +.3 settings. + +.3 system\_information. +.2 localization. +} +\end{minipage} +\caption{Example caption} + + +\caption*{Quelle: hier Quellangabe} +\end{figure} diff --git a/chapters/05_yocto/01_pi_image.md b/chapters/05_yocto/01_pi_image.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/05_yocto/02_meta_flutter.md b/chapters/05_yocto/02_meta_flutter.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/05_yocto/03_network_manager.md b/chapters/05_yocto/03_network_manager.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/05_yocto/04_hot_reload_embedder.md b/chapters/05_yocto/04_hot_reload_embedder.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/05_yocto/05_qemu_linux.md b/chapters/05_yocto/05_qemu_linux.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/.DS_Store b/chapters/06_flutter/.DS_Store deleted file mode 100644 index dd579218046b0459511be6b58b74d0d73e05bff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%T59@6g@>^2)H1+abq%HK*U#cHxgX9_5+ZYKpY@JFfM2BKllrNpDR80wlO@) z)~LCcw5RRdbMN#F(@p`n#-djTssKtXg2ghch{<&+8&(J-!gCs9hAxH}VUGTWw+)yA zroeAgK;GSb9HWjF+E{*nyL^im9O60Z~iIefSU~ix?Bll7mtVP-5y<9Si*FjWxiDifA_qL?D z%>0VHXEH>w?Ru@U>g2WX!24`(dsa^LT4wFiyU#3<`RIRP*_TwaKcE2jY_U?sqt&K> zDPRhGD zF!$)`aN+RbLS`3EC{D98exmMhsYk0#0aIXAfgRti%Km?|{rta5vYshm3j8YtT(NoA zY;a0pZ{3)j?6nEYJ&Tz5_b3hu*wwpQ3bvL DZG)pb diff --git a/chapters/06_flutter/02_home.md b/chapters/06_flutter/02_home.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/03_material_demo.md b/chapters/06_flutter/03_material_demo.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/04_liste.md b/chapters/06_flutter/04_liste.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/05_kartenansicht.md b/chapters/06_flutter/05_kartenansicht.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/06_einstellungen.md b/chapters/06_flutter/06_einstellungen.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/08_matrix.md b/chapters/06_flutter/08_matrix.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/09_video.md b/chapters/06_flutter/09_video.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/10_flame.md b/chapters/06_flutter/10_flame.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/06_flutter/led.md b/chapters/06_flutter/led.md deleted file mode 100644 index e69de29..0000000 diff --git a/chapters/05_yocto/.DS_Store b/chapters/06_implementierung/.DS_Store similarity index 100% rename from chapters/05_yocto/.DS_Store rename to chapters/06_implementierung/.DS_Store diff --git a/chapters/06_implementierung/00_entwicklungsumgebung.md b/chapters/06_implementierung/00_entwicklungsumgebung.md new file mode 100644 index 0000000..330cc0e --- /dev/null +++ b/chapters/06_implementierung/00_entwicklungsumgebung.md @@ -0,0 +1,76 @@ +# Implementierung + +## Grundaufbau + +### Entwicklungsumgebung + +### Flutter Version Management + +Zur Installation von Flutter und Dart empfiehlt +sich ein Version Manager. Der bekannteste Version +Manager ist FVM (Flutter Version Management), doch +der neuere Manager Puro bietet viele Vorteile. + +MacOS und Linux + +```bash +curl -o- https://puro.dev/install.sh | PURO_VERSION="1.4.4" bash +``` + +Windows + +```powershell +Invoke-WebRequest -Uri "https://puro.dev/builds/1.4.4/windows-x64/puro.exe" -OutFile "$env:temp\puro.exe"; &"$env:temp\puro.exe" install-puro --promote +``` + +Puro Optimierungen: + +- parallel git clone and engine download +- global cache for git history +- global cache for engine versions + +With other approaches, each Flutter repository is in its own folder, requiring you to download and store the git history, engine, and framework of each version: + +Puro implements a technology similar to GitLab's object deduplication to avoid downloading the same git objects over and over again. It also uses symlinks to share the same engine version between multiple installations: + +```bash +puro use -g stable +``` + +```bash +puro create bachelor_elinux 3.19.0 +``` + +```bash +puro use bachelor_elinux +``` + +`.puro.json`: + +```json +{ + "env": "bachelor_elinux" +} +``` + +`.vscode/settings.json` + +```json +{ + "dart.flutterSdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter", + "dart.sdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter/bin/cache/dart-sdk" +} +``` + +```bash +puro flutter --version +``` + +```bash +Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision bae5e49bc2 (6 days ago) • 2024-02-13 17:46:18 -0800 +Engine • revision 04817c99c9 +Tools • Dart 3.3.0 • DevTools 2.31.1 +``` + +## Setup von Raspberry Pi diff --git a/chapters/06_flutter/01_architecture.md b/chapters/06_implementierung/01_programmierung.md similarity index 83% rename from chapters/06_flutter/01_architecture.md rename to chapters/06_implementierung/01_programmierung.md index 7666118..2095e32 100644 --- a/chapters/06_flutter/01_architecture.md +++ b/chapters/06_implementierung/01_programmierung.md @@ -60,3 +60,18 @@ Caveats Experimental: Not considered production-ready for every use-case (as might be expected with projects pushing Flutter’s boundaries). Limited APIs: Compared to mainstream platforms, Flutter’s full suite of plugins and packages might not be compatible without extra platform channel work on your end. --> + + diff --git a/chapters/07_fazit/.DS_Store b/chapters/07_zusammenfassung_und_ausblick/.DS_Store similarity index 100% rename from chapters/07_fazit/.DS_Store rename to chapters/07_zusammenfassung_und_ausblick/.DS_Store diff --git a/chapters/07_fazit/01_vergleich.md b/chapters/07_zusammenfassung_und_ausblick/01_vergleich.md similarity index 100% rename from chapters/07_fazit/01_vergleich.md rename to chapters/07_zusammenfassung_und_ausblick/01_vergleich.md diff --git a/chapters/07_fazit/02_bewertung.md b/chapters/07_zusammenfassung_und_ausblick/02_bewertung.md similarity index 100% rename from chapters/07_fazit/02_bewertung.md rename to chapters/07_zusammenfassung_und_ausblick/02_bewertung.md diff --git a/chapters/07_fazit/03_zusammenfassung_ausblick.md b/chapters/07_zusammenfassung_und_ausblick/03_zusammenfassung_ausblick.md similarity index 100% rename from chapters/07_fazit/03_zusammenfassung_ausblick.md rename to chapters/07_zusammenfassung_und_ausblick/03_zusammenfassung_ausblick.md diff --git a/chapters/08_01_references/00_mermaid b/chapters/08_01_references/00_mermaid new file mode 100644 index 0000000..91a6127 --- /dev/null +++ b/chapters/08_01_references/00_mermaid @@ -0,0 +1,23 @@ +```{=latex} +\begin{center} +``` + +```{.mermaid loc=assets/mermaid caption="Caption" #fig:reference-name} +graph LR + A[Flutter] -- Engine --> B((SKIA)) + A --> C(Facebook) + B --> D{Twitter} + C --> D +``` + +```{=latex} +\end{center} +``` + +\begin{figure}[ht] +\centering +\caption{Example caption} + + +\caption*{Quelle: hier Quellangabe} +\end{figure} diff --git a/chapters/08_01_references/01_code b/chapters/08_01_references/01_code new file mode 100644 index 0000000..8738834 --- /dev/null +++ b/chapters/08_01_references/01_code @@ -0,0 +1,2 @@ +\lstinputlisting[language=Java, caption=Beispiel öpvn, linerange={65-73}] +{code/flutter_architecture/lib/main.dart} diff --git a/chapters/08_01_references/02_image b/chapters/08_01_references/02_image new file mode 100644 index 0000000..11f3155 --- /dev/null +++ b/chapters/08_01_references/02_image @@ -0,0 +1,8 @@ +\begin{figure}[ht] +\centering +\includegraphics[scale=1]{assets/flutter/archdiagram.png} +\caption{Example caption} + + +\caption*{Quelle: hier Quellangabe} +\end{figure} \ No newline at end of file diff --git a/chapters/08_literatur/00_literature.md b/chapters/08_literatur/00_literature.md index 8e4b4b1..394d08f 100644 --- a/chapters/08_literatur/00_literature.md +++ b/chapters/08_literatur/00_literature.md @@ -1,3 +1,5 @@ \pagebreak # Literaturverzeichnis + +\setstretch{1.0} diff --git a/code/flutter_architecture/.gitignore b/code/flutter_architecture/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/code/flutter_architecture/.gitignore @@ -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 diff --git a/code/flutter_architecture/.metadata b/code/flutter_architecture/.metadata new file mode 100644 index 0000000..068aba9 --- /dev/null +++ b/code/flutter_architecture/.metadata @@ -0,0 +1,42 @@ +# 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: "41456452f29d64e8deb623a3c927524bcf9f111b" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + - platform: android + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + - platform: ios + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + - platform: linux + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + - platform: macos + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + - platform: web + create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + + # 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' diff --git a/code/flutter_architecture/README.md b/code/flutter_architecture/README.md new file mode 100644 index 0000000..cc9d49c --- /dev/null +++ b/code/flutter_architecture/README.md @@ -0,0 +1,16 @@ +# flutter_architecture + +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. diff --git a/code/flutter_architecture/analysis_options.yaml b/code/flutter_architecture/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/code/flutter_architecture/analysis_options.yaml @@ -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 diff --git a/code/flutter_architecture/android/.gitignore b/code/flutter_architecture/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/code/flutter_architecture/android/.gitignore @@ -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/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/code/flutter_architecture/android/app/build.gradle b/code/flutter_architecture/android/app/build.gradle new file mode 100644 index 0000000..5170d83 --- /dev/null +++ b/code/flutter_architecture/android/app/build.gradle @@ -0,0 +1,67 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.flutter_architecture" + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.flutter_architecture" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + 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 '../..' +} + +dependencies {} diff --git a/code/flutter_architecture/android/app/src/debug/AndroidManifest.xml b/code/flutter_architecture/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/code/flutter_architecture/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/code/flutter_architecture/android/app/src/main/AndroidManifest.xml b/code/flutter_architecture/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1d612bc --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/android/app/src/main/kotlin/com/example/flutter_architecture/MainActivity.kt b/code/flutter_architecture/android/app/src/main/kotlin/com/example/flutter_architecture/MainActivity.kt new file mode 100644 index 0000000..f344ca1 --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/kotlin/com/example/flutter_architecture/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.flutter_architecture + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/code/flutter_architecture/android/app/src/main/res/drawable-v21/launch_background.xml b/code/flutter_architecture/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/code/flutter_architecture/android/app/src/main/res/drawable/launch_background.xml b/code/flutter_architecture/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/code/flutter_architecture/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/code/flutter_architecture/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/code/flutter_architecture/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/code/flutter_architecture/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/code/flutter_architecture/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/android/app/src/main/res/values-night/styles.xml b/code/flutter_architecture/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/code/flutter_architecture/android/app/src/main/res/values/styles.xml b/code/flutter_architecture/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/code/flutter_architecture/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/code/flutter_architecture/android/app/src/profile/AndroidManifest.xml b/code/flutter_architecture/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/code/flutter_architecture/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/code/flutter_architecture/android/build.gradle b/code/flutter_architecture/android/build.gradle new file mode 100644 index 0000000..e83fb5d --- /dev/null +++ b/code/flutter_architecture/android/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/code/flutter_architecture/android/gradle.properties b/code/flutter_architecture/android/gradle.properties new file mode 100644 index 0000000..598d13f --- /dev/null +++ b/code/flutter_architecture/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/code/flutter_architecture/android/gradle/wrapper/gradle-wrapper.properties b/code/flutter_architecture/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3c472b9 --- /dev/null +++ b/code/flutter_architecture/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/code/flutter_architecture/android/settings.gradle b/code/flutter_architecture/android/settings.gradle new file mode 100644 index 0000000..7cd7128 --- /dev/null +++ b/code/flutter_architecture/android/settings.gradle @@ -0,0 +1,29 @@ +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 + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/code/flutter_architecture/ios/.gitignore b/code/flutter_architecture/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/code/flutter_architecture/ios/.gitignore @@ -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 diff --git a/code/flutter_architecture/ios/Flutter/AppFrameworkInfo.plist b/code/flutter_architecture/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/code/flutter_architecture/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/code/flutter_architecture/ios/Flutter/Debug.xcconfig b/code/flutter_architecture/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/code/flutter_architecture/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/code/flutter_architecture/ios/Flutter/Release.xcconfig b/code/flutter_architecture/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/code/flutter_architecture/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/code/flutter_architecture/ios/Runner.xcodeproj/project.pbxproj b/code/flutter_architecture/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..00758c8 --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,617 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 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 */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* 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 = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 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 = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 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 = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 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 = 1430; + 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 = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + 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)"; + DEVELOPMENT_TEAM = T67F6A44RM; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture; + 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; + baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + 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.flutterArchitecture.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; + baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + 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.flutterArchitecture.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; + baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + 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.flutterArchitecture.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; + 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; + 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; + 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; + 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)"; + DEVELOPMENT_TEAM = T67F6A44RM; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture; + 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)"; + DEVELOPMENT_TEAM = T67F6A44RM; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture; + 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 */; +} diff --git a/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/code/flutter_architecture/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/code/flutter_architecture/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..87131a0 --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/ios/Runner.xcworkspace/contents.xcworkspacedata b/code/flutter_architecture/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/code/flutter_architecture/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/code/flutter_architecture/ios/Runner/AppDelegate.swift b/code/flutter_architecture/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/code/flutter_architecture/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@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) + } +} diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -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" + } +} diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -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" + } +} diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -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. \ No newline at end of file diff --git a/code/flutter_architecture/ios/Runner/Base.lproj/LaunchScreen.storyboard b/code/flutter_architecture/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/ios/Runner/Base.lproj/Main.storyboard b/code/flutter_architecture/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/ios/Runner/Info.plist b/code/flutter_architecture/ios/Runner/Info.plist new file mode 100644 index 0000000..ada7fee --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Flutter Architecture + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + flutter_architecture + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/code/flutter_architecture/ios/Runner/Runner-Bridging-Header.h b/code/flutter_architecture/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/code/flutter_architecture/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/code/flutter_architecture/ios/RunnerTests/RunnerTests.swift b/code/flutter_architecture/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/code/flutter_architecture/ios/RunnerTests/RunnerTests.swift @@ -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. + } + +} diff --git a/code/flutter_architecture/lib/main.dart b/code/flutter_architecture/lib/main.dart new file mode 100644 index 0000000..d22489a --- /dev/null +++ b/code/flutter_architecture/lib/main.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + title: Text(widget.title), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + TextWidget(text: _counter.toString()), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), + ); + } +} + +// start snippet declarative_example +class TextWidget extends StatelessWidget { + const TextWidget({required this.text, super.key}); + final String text; + + @override + Widget build(BuildContext context) { + return Text(text); + } +} +// end snippet declarative_example diff --git a/code/flutter_architecture/linux/.gitignore b/code/flutter_architecture/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/code/flutter_architecture/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/code/flutter_architecture/linux/CMakeLists.txt b/code/flutter_architecture/linux/CMakeLists.txt new file mode 100644 index 0000000..75b1193 --- /dev/null +++ b/code/flutter_architecture/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "flutter_architecture") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.flutter_architecture") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/code/flutter_architecture/linux/flutter/CMakeLists.txt b/code/flutter_architecture/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/code/flutter_architecture/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/code/flutter_architecture/linux/flutter/generated_plugin_registrant.cc b/code/flutter_architecture/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/code/flutter_architecture/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/code/flutter_architecture/linux/flutter/generated_plugin_registrant.h b/code/flutter_architecture/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/code/flutter_architecture/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/code/flutter_architecture/linux/flutter/generated_plugins.cmake b/code/flutter_architecture/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..2e1de87 --- /dev/null +++ b/code/flutter_architecture/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/code/flutter_architecture/linux/main.cc b/code/flutter_architecture/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/code/flutter_architecture/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/code/flutter_architecture/linux/my_application.cc b/code/flutter_architecture/linux/my_application.cc new file mode 100644 index 0000000..032f3c6 --- /dev/null +++ b/code/flutter_architecture/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "flutter_architecture"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "flutter_architecture"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/code/flutter_architecture/linux/my_application.h b/code/flutter_architecture/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/code/flutter_architecture/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/code/flutter_architecture/macos/.gitignore b/code/flutter_architecture/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/code/flutter_architecture/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/code/flutter_architecture/macos/Flutter/Flutter-Debug.xcconfig b/code/flutter_architecture/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/code/flutter_architecture/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/code/flutter_architecture/macos/Flutter/Flutter-Release.xcconfig b/code/flutter_architecture/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/code/flutter_architecture/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/code/flutter_architecture/macos/Flutter/GeneratedPluginRegistrant.swift b/code/flutter_architecture/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..cccf817 --- /dev/null +++ b/code/flutter_architecture/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/code/flutter_architecture/macos/Runner.xcodeproj/project.pbxproj b/code/flutter_architecture/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7235b0b --- /dev/null +++ b/code/flutter_architecture/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,695 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* flutter_architecture.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "flutter_architecture.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* flutter_architecture.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* flutter_architecture.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_architecture.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_architecture"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_architecture.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_architecture"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_architecture.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_architecture"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/code/flutter_architecture/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/flutter_architecture/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/flutter_architecture/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/code/flutter_architecture/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/code/flutter_architecture/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..f999e47 --- /dev/null +++ b/code/flutter_architecture/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/macos/Runner.xcworkspace/contents.xcworkspacedata b/code/flutter_architecture/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/code/flutter_architecture/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/code/flutter_architecture/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/code/flutter_architecture/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/code/flutter_architecture/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/code/flutter_architecture/macos/Runner/AppDelegate.swift b/code/flutter_architecture/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/code/flutter_architecture/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 zcmaiYXH?Tqu=Xz`p-L#B_gI#0we$cm_HcmYFP$?wjD#BaCN4mzC5#`>w9y6=ThxrYZc0WPXprg zYjB`UsV}0=eUtY$(P6YW}npdd;%9pi?zS3k-nqCob zSX_AQEf|=wYT3r?f!*Yt)ar^;l3Sro{z(7deUBPd2~(SzZ-s@0r&~Km2S?8r##9-< z)2UOSVaHqq6}%sA9Ww;V2LG=PnNAh6mA2iWOuV7T_lRDR z&N8-eN=U)-T|;wo^Wv=34wtV0g}sAAe}`Ph@~!|<;z7*K8(qkX0}o=!(+N*UWrkEja*$_H6mhK1u{P!AC39} z|3+Z(mAOq#XRYS)TLoHv<)d%$$I@+x+2)V{@o~~J-!YUI-Q9%!Ldi4Op&Lw&B>jj* zwAgC#Y>gbIqv!d|J5f!$dbCXoq(l3GR(S>(rtZ~Z*agXMMKN!@mWT_vmCbSd3dUUm z4M&+gz?@^#RRGal%G3dDvj7C5QTb@9+!MG+>0dcjtZEB45c+qx*c?)d<%htn1o!#1 zpIGonh>P1LHu3s)fGFF-qS}AXjW|M*2Xjkh7(~r(lN=o#mBD9?jt74=Rz85I4Nfx_ z7Z)q?!};>IUjMNM6ee2Thq7))a>My?iWFxQ&}WvsFP5LP+iGz+QiYek+K1`bZiTV- zHHYng?ct@Uw5!gquJ(tEv1wTrRR7cemI>aSzLI^$PxW`wL_zt@RSfZ1M3c2sbebM* ze0=;sy^!90gL~YKISz*x;*^~hcCoO&CRD)zjT(A2b_uRue=QXFe5|!cf0z1m!iwv5GUnLw9Dr*Ux z)3Lc!J@Ei;&&yxGpf2kn@2wJ2?t6~obUg;?tBiD#uo$SkFIasu+^~h33W~`r82rSa ztyE;ehFjC2hjpJ-e__EH&z?!~>UBb=&%DS>NT)1O3Isn-!SElBV2!~m6v0$vx^a<@ISutdTk1@?;i z<8w#b-%|a#?e5(n@7>M|v<<0Kpg?BiHYMRe!3Z{wYc2hN{2`6(;q`9BtXIhVq6t~KMH~J0~XtUuT06hL8c1BYZWhN zk4F2I;|za*R{ToHH2L?MfRAm5(i1Ijw;f+0&J}pZ=A0;A4M`|10ZskA!a4VibFKn^ zdVH4OlsFV{R}vFlD~aA4xxSCTTMW@Gws4bFWI@xume%smAnuJ0b91QIF?ZV!%VSRJ zO7FmG!swKO{xuH{DYZ^##gGrXsUwYfD0dxXX3>QmD&`mSi;k)YvEQX?UyfIjQeIm! z0ME3gmQ`qRZ;{qYOWt}$-mW*>D~SPZKOgP)T-Sg%d;cw^#$>3A9I(%#vsTRQe%moT zU`geRJ16l>FV^HKX1GG7fR9AT((jaVb~E|0(c-WYQscVl(z?W!rJp`etF$dBXP|EG z=WXbcZ8mI)WBN>3<@%4eD597FD5nlZajwh8(c$lum>yP)F}=(D5g1-WVZRc)(!E3} z-6jy(x$OZOwE=~{EQS(Tp`yV2&t;KBpG*XWX!yG+>tc4aoxbXi7u@O*8WWFOxUjcq z^uV_|*818$+@_{|d~VOP{NcNi+FpJ9)aA2So<7sB%j`$Prje&auIiTBb{oD7q~3g0 z>QNIwcz(V-y{Ona?L&=JaV5`o71nIsWUMA~HOdCs10H+Irew#Kr(2cn>orG2J!jvP zqcVX0OiF}c<)+5&p}a>_Uuv)L_j}nqnJ5a?RPBNi8k$R~zpZ33AA4=xJ@Z($s3pG9 zkURJY5ZI=cZGRt_;`hs$kE@B0FrRx(6K{`i1^*TY;Vn?|IAv9|NrN*KnJqO|8$e1& zb?OgMV&q5|w7PNlHLHF) zB+AK#?EtCgCvwvZ6*u|TDhJcCO+%I^@Td8CR}+nz;OZ*4Dn?mSi97m*CXXc=};!P`B?}X`F-B5v-%ACa8fo0W++j&ztmqK z;&A)cT4ob9&MxpQU41agyMU8jFq~RzXOAsy>}hBQdFVL%aTn~M>5t9go2j$i9=(rZ zADmVj;Qntcr3NIPPTggpUxL_z#5~C!Gk2Rk^3jSiDqsbpOXf^f&|h^jT4|l2ehPat zb$<*B+x^qO8Po2+DAmrQ$Zqc`1%?gp*mDk>ERf6I|42^tjR6>}4`F_Mo^N(~Spjcg z_uY$}zui*PuDJjrpP0Pd+x^5ds3TG#f?57dFL{auS_W8|G*o}gcnsKYjS6*t8VI<) zcjqTzW(Hk*t-Qhq`Xe+x%}sxXRerScbPGv8hlJ;CnU-!Nl=# zR=iTFf9`EItr9iAlAGi}i&~nJ-&+)Y| zMZigh{LXe)uR+4D_Yb+1?I93mHQ5{pId2Fq%DBr7`?ipi;CT!Q&|EO3gH~7g?8>~l zT@%*5BbetH)~%TrAF1!-!=)`FIS{^EVA4WlXYtEy^|@y@yr!C~gX+cp2;|O4x1_Ol z4fPOE^nj(}KPQasY#U{m)}TZt1C5O}vz`A|1J!-D)bR%^+=J-yJsQXDzFiqb+PT0! zIaDWWU(AfOKlSBMS};3xBN*1F2j1-_=%o($ETm8@oR_NvtMDVIv_k zlnNBiHU&h8425{MCa=`vb2YP5KM7**!{1O>5Khzu+5OVGY;V=Vl+24fOE;tMfujoF z0M``}MNnTg3f%Uy6hZi$#g%PUA_-W>uVCYpE*1j>U8cYP6m(>KAVCmbsDf39Lqv0^ zt}V6FWjOU@AbruB7MH2XqtnwiXS2scgjVMH&aF~AIduh#^aT1>*V>-st8%=Kk*{bL zzbQcK(l2~)*A8gvfX=RPsNnjfkRZ@3DZ*ff5rmx{@iYJV+a@&++}ZW+za2fU>&(4y`6wgMpQGG5Ah(9oGcJ^P(H< zvYn5JE$2B`Z7F6ihy>_49!6}(-)oZ(zryIXt=*a$bpIw^k?>RJ2 zQYr>-D#T`2ZWDU$pM89Cl+C<;J!EzHwn(NNnWpYFqDDZ_*FZ{9KQRcSrl5T>dj+eA zi|okW;6)6LR5zebZJtZ%6Gx8^=2d9>_670!8Qm$wd+?zc4RAfV!ZZ$jV0qrv(D`db zm_T*KGCh3CJGb(*X6nXzh!h9@BZ-NO8py|wG8Qv^N*g?kouH4%QkPU~Vizh-D3<@% zGomx%q42B7B}?MVdv1DFb!axQ73AUxqr!yTyFlp%Z1IAgG49usqaEbI_RnbweR;Xs zpJq7GKL_iqi8Md?f>cR?^0CA+Uk(#mTlGdZbuC*$PrdB$+EGiW**=$A3X&^lM^K2s zzwc3LtEs5|ho z2>U(-GL`}eNgL-nv3h7E<*<>C%O^=mmmX0`jQb6$mP7jUKaY4je&dCG{x$`0=_s$+ zSpgn!8f~ya&U@c%{HyrmiW2&Wzc#Sw@+14sCpTWReYpF9EQ|7vF*g|sqG3hx67g}9 zwUj5QP2Q-(KxovRtL|-62_QsHLD4Mu&qS|iDp%!rs(~ah8FcrGb?Uv^Qub5ZT_kn%I^U2rxo1DDpmN@8uejxik`DK2~IDi1d?%~pR7i#KTS zA78XRx<(RYO0_uKnw~vBKi9zX8VnjZEi?vD?YAw}y+)wIjIVg&5(=%rjx3xQ_vGCy z*&$A+bT#9%ZjI;0w(k$|*x{I1c!ECMus|TEA#QE%#&LxfGvijl7Ih!B2 z6((F_gwkV;+oSKrtr&pX&fKo3s3`TG@ye+k3Ov)<#J|p8?vKh@<$YE@YIU1~@7{f+ zydTna#zv?)6&s=1gqH<-piG>E6XW8ZI7&b@-+Yk0Oan_CW!~Q2R{QvMm8_W1IV8<+ zQTyy=(Wf*qcQubRK)$B;QF}Y>V6d_NM#=-ydM?%EPo$Q+jkf}*UrzR?Nsf?~pzIj$ z<$wN;7c!WDZ(G_7N@YgZ``l;_eAd3+;omNjlpfn;0(B7L)^;;1SsI6Le+c^ULe;O@ zl+Z@OOAr4$a;=I~R0w4jO`*PKBp?3K+uJ+Tu8^%i<_~bU!p%so z^sjol^slR`W@jiqn!M~eClIIl+`A5%lGT{z^mRbpv}~AyO%R*jmG_Wrng{B9TwIuS z0!@fsM~!57K1l0%{yy(#no}roy#r!?0wm~HT!vLDfEBs9x#`9yCKgufm0MjVRfZ=f z4*ZRc2Lgr(P+j2zQE_JzYmP0*;trl7{*N341Cq}%^M^VC3gKG-hY zmPT>ECyrhIoFhnMB^qpdbiuI}pk{qPbK^}0?Rf7^{98+95zNq6!RuV_zAe&nDk0;f zez~oXlE5%ve^TmBEt*x_X#fs(-En$jXr-R4sb$b~`nS=iOy|OVrph(U&cVS!IhmZ~ zKIRA9X%Wp1J=vTvHZ~SDe_JXOe9*fa zgEPf;gD^|qE=dl>Qkx3(80#SE7oxXQ(n4qQ#by{uppSKoDbaq`U+fRqk0BwI>IXV3 zD#K%ASkzd7u>@|pA=)Z>rQr@dLH}*r7r0ng zxa^eME+l*s7{5TNu!+bD{Pp@2)v%g6^>yj{XP&mShhg9GszNu4ITW=XCIUp2Xro&1 zg_D=J3r)6hp$8+94?D$Yn2@Kp-3LDsci)<-H!wCeQt$e9Jk)K86hvV^*Nj-Ea*o;G zsuhRw$H{$o>8qByz1V!(yV{p_0X?Kmy%g#1oSmlHsw;FQ%j9S#}ha zm0Nx09@jmOtP8Q+onN^BAgd8QI^(y!n;-APUpo5WVdmp8!`yKTlF>cqn>ag`4;o>i zl!M0G-(S*fm6VjYy}J}0nX7nJ$h`|b&KuW4d&W5IhbR;-)*9Y0(Jj|@j`$xoPQ=Cl literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/code/flutter_architecture/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/flutter_architecture/macos/Runner/Configs/AppInfo.xcconfig b/code/flutter_architecture/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..f430a4d --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = flutter_architecture + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/code/flutter_architecture/macos/Runner/Configs/Debug.xcconfig b/code/flutter_architecture/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/code/flutter_architecture/macos/Runner/Configs/Release.xcconfig b/code/flutter_architecture/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/code/flutter_architecture/macos/Runner/Configs/Warnings.xcconfig b/code/flutter_architecture/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/code/flutter_architecture/macos/Runner/DebugProfile.entitlements b/code/flutter_architecture/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/code/flutter_architecture/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/code/flutter_architecture/macos/Runner/Info.plist b/code/flutter_architecture/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/code/flutter_architecture/macos/Runner/MainFlutterWindow.swift b/code/flutter_architecture/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/code/flutter_architecture/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/code/flutter_architecture/macos/Runner/Release.entitlements b/code/flutter_architecture/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/code/flutter_architecture/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/code/flutter_architecture/macos/RunnerTests/RunnerTests.swift b/code/flutter_architecture/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..5418c9f --- /dev/null +++ b/code/flutter_architecture/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import FlutterMacOS +import Cocoa +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. + } + +} diff --git a/code/flutter_architecture/pubspec.lock b/code/flutter_architecture/pubspec.lock new file mode 100644 index 0000000..e4a8596 --- /dev/null +++ b/code/flutter_architecture/pubspec.lock @@ -0,0 +1,188 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" +sdks: + dart: ">=3.2.6 <4.0.0" diff --git a/code/flutter_architecture/pubspec.yaml b/code/flutter_architecture/pubspec.yaml new file mode 100644 index 0000000..d8476c7 --- /dev/null +++ b/code/flutter_architecture/pubspec.yaml @@ -0,0 +1,90 @@ +name: flutter_architecture +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=3.2.6 <4.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/code/flutter_architecture/test/widget_test.dart b/code/flutter_architecture/test/widget_test.dart new file mode 100644 index 0000000..6199e1e --- /dev/null +++ b/code/flutter_architecture/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:flutter_architecture/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/code/flutter_architecture/web/favicon.png b/code/flutter_architecture/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/web/icons/Icon-192.png b/code/flutter_architecture/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/web/icons/Icon-512.png b/code/flutter_architecture/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/web/icons/Icon-maskable-192.png b/code/flutter_architecture/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/web/icons/Icon-maskable-512.png b/code/flutter_architecture/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/code/flutter_architecture/web/index.html b/code/flutter_architecture/web/index.html new file mode 100644 index 0000000..38fb4b4 --- /dev/null +++ b/code/flutter_architecture/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + flutter_architecture + + + + + + + + + + diff --git a/code/flutter_architecture/web/manifest.json b/code/flutter_architecture/web/manifest.json new file mode 100644 index 0000000..faaf773 --- /dev/null +++ b/code/flutter_architecture/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutter_architecture", + "short_name": "flutter_architecture", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/harvard-right.csl b/harvard-right.csl index 2800678..c4b854d 100644 --- a/harvard-right.csl +++ b/harvard-right.csl @@ -23,6 +23,12 @@ edited and translated by edn. + n. D. + + + + + o. D. diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..1d2686c --- /dev/null +++ b/notes.md @@ -0,0 +1,20 @@ +**Thesis Structure** + +1. **Introduction** + - Motivation for embedded Linux, relevance of Flutter + - Thesis statement and research questions +2. **Background** + - Flutter, Dart, Skia rendering engine + - Embedded Linux, key architectural concepts + - Review of other cross-platform embedded GUI options +3. **Case Study Design** + - Application description, technology choices (embedder, etc.), limitations +4. **Performance Analysis** + - Benchmarking methodology, results, key insights, optimizations +5. **User Experience Evaluation** + - Testing scenarios, qualitative feedback, interpretation +6. **Discussion** + - Connect findings to research questions + - Strengths and weaknesses of Flutter in the embedded Linux space +7. **Conclusion** + - Thesis statement revisit, potential future research diff --git a/temp_file b/temp_file new file mode 100644 index 0000000..634e0b6 --- /dev/null +++ b/temp_file @@ -0,0 +1,433 @@ +--- +header-includes: | + \usepackage[T1]{fontenc} + \usepackage[usefilenames,RMstyle={Text,Semibold},SSstyle={Text,Semibold},TTstyle={Text,Semibold},DefaultFeatures={Ligatures=Common}]{plex-otf} + \usepackage[a4paper,bindingoffset=0.2in,% + left=4cm,right=2cm,top=2cm,bottom=2cm,% + footskip=.25in]{geometry} + \usepackage{fancyhdr} + \usepackage[utf8]{inputenc} + \usepackage{tikz} + \usetikzlibrary{snakes,arrows,shapes} + \usepackage{amsmath} + \usepackage{pgfplots} + \usepackage{pgfplotstable} + \pgfplotsset{compat=1.8} + \usepackage{multicol,lipsum} + \usepackage{listings} + \usepackage{wrapfig} + \usepackage[font=small,labelfont=bf]{caption} + \usepackage{graphicx} + \usepackage{xcolor,stackengine} + \usepackage{colortbl} + \usepackage{tcolorbox} + \usepackage{lastpage} + \usepackage{subcaption} + \usepackage{tabularx} + \usepackage{biblatex} + \usepackage{float} + \usepackage{refract} + \usepackage{svg} + \usepackage{setspace} + \usepackage{titling} + \usepackage{abstract} + \usepackage{fvextra} + \usepackage{emoji} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}} + \newcommand{\hideFromPandoc}[1]{#1} + \hideFromPandoc{ + \let\Begin\begin + \let\End\end + } + \makeatletter + \def\fps@figure{h} + \makeatother +nocite: | + @* +--- + +\setstretch{1.5} + +\setemojifont{Twemoji Mozilla} + +\renewcommand{\familydefault}{\sfdefault} + +\graphicspath{ {./img/} } + +\overfullrule=0pt + +\newcolumntype{C}{>{\centering\arraybackslash}X} + +\renewcommand{\comment}[1]{\hspace{2em}{\small\textit{#1}}\bigskip\par} + +\newcommand\palbox[1]{{\sffamily\fboxsep=5pt\relax\fboxrule=1pt\relax\footnotesize% + \fcolorbox{gray!50}{gray!10}{% + \stackengine{4pt}{% + \colorbox[HTML]{#1}{\rule{30pt}{0pt}\rule{0pt}{30pt}}% +}{% +\color{black!60}\stackengine{6pt}{\##1}{\saycolors{#1}}{U}{l}{F}{F}{S}% +}{U}{l}{F}{F}{S}% +}% +}} +\newcommand\saycolors[1]{\relax} + +\lstset{ +basicstyle=\ttfamily, +columns=fullflexible, +frame=single, +breaklines=true, +postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space}, +} +%Created by Leonardo Rignanese (rignaneseleo) +%source: https://github.com/rignaneseleo/Latex-listings-Dart +%added pull_request #1: https://github.com/rignaneseleo/Latex-listings-Dart/pull/1 + +% Define colors to use +% You can change the colors (use http://latexcolor.com/) +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95, 0.95, 0.96} + +% Define the codebox +\lstset{ +backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, +keywordstyle=\color{magenta}, +numberstyle=\tiny\color{codegray}, +stringstyle=\color{codepurple}, +basicstyle=\ttfamily\footnotesize, +breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, +showtabs=false, + tabsize=2, +morestring=\*[d]{"} +%frame=shadowbox +} + +% Define the code emph rules +\lstset{ +% Types +emph=[1]{var, String, int, List, void, Future, await, if, else, throw, async, true, false},% Insert here the types you are using +emphstyle=[1]{\color{codepurple}}, +% Functions +emph=[2]{findAllElements,findElements, setState, send, fromPath, add, parse, bytesToString},% Insert here the methods you are using +emphstyle=[2]{\color{magenta}} +} +\thispagestyle{empty} + +\begin{titlepage} +\begin{center} +\Large Hochschule Rhein-Waal \\ +\vspace{2.5cm} +\Large Proposal für die Bachelorarbeit \\ +\vspace{2.5cm} +\huge \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\ +\vspace{1.0cm} +\Large Fabian Baldeau \\ +\vspace{2.5cm} +\vspace{0.25cm} +\textsc{Studiengang}\\ +\vspace{0.25cm} +\textsc{Medieninformatik}\\ +\vspace{2.5cm} +\textsc{Gutachter}\\ +\vspace{0.25cm} +\textsc{Prof. Dr.-Ing. Ido Iurgel}\\ +\vspace{0.25cm} +\textsc{Prof. Dr. Kai Essig}\\ +\vspace{2cm} +\end{center} + +\end{titlepage} + +\pagenumbering{Roman} +\fancyhf{} +\fancyhead[C]{\thepage} +\renewcommand{\headrulewidth}{0pt} +\pagestyle{fancy} +\begin{abstract} +Die Integration von Flutter's plattformübergreifenden +UI-Fähigkeiten mit der Anpassungsfähigkeit von Embedded +Linux verspricht die Rationalisierung der Entwicklung +von Benutzeroberflächen (UIs) für eingebettete Systeme. +Diese Studie untersucht die Eignung von Flutter in +diesem Kontext durch eine Fallstudie: die Entwicklung +eines Smart Home Control Centers auf einem Raspberry +Pi mit einer angepassten Embedded Linux Distribution. +Leistungsmesswerte, Benutzerfreundlichkeit und der +Entwicklungsprozess werden bewertet. Die Ergebnisse +zeigen, dass Flutter, wenn es angepasst wird, +erfolgreich attraktive und benutzerfreundliche +eingebettete Schnittstellen mit einigen Kompromissen +bei der Leistung im Vergleich zu nativen Lösungen +erstellt. + +Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer +prototypischen Anwendung mit Flutter für ein eingebettetes Linux System. +Dabei soll ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in +eingebetteten Linux Systemen genutzt werden kann und es soll anhand der +prototypischen Anwendung untersucht werden, wie gut Flutter für diesen +Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung sollen +dann genutzt werden um Empfehlungen für die Nutzung von Flutter in +eingebetteten Linux Systemen abzuleiten. +\end{abstract} +\pagebreak +\tableofcontents +\pagebreak + + + +\renewcommand{\headrulewidth}{0pt} + +\pagenumbering{arabic} + + + +\fancyhead[C]{} +\fancyfoot[R]{\thepage} +## Motivation und Relevanz + + + +In der heutigen Zeit verbringen Menschen in der Regel mehr Zeit damit, +über einen Bildschirm mit Maschinen zu interagieren, anstatt Maschinen +mechanisch zu steuern. Dieser Trend lässt sich gut bei der Automobilindustrie +oder an Haushaltsgeräten beobachten, wo immer mehr Funktionen über einen +Touchscreen mit einer grafischen Benutzeroberfläche (GUI) angesteuert werden. +Über die GUI können Benutzer Funktionen wie Musik, Radio, Telefon, +Temperaturregelung und mehr ansteuern. Ebenso kann die Öffentlichkeit am Flughafen +oder in Restaurants über einen Selbstbedienungskiosk mit Unternehmen +kommunizieren. Der Kiosk führt eine GUI auf einem Anzeigegerät aus und über +den Touchscreen des Kiosks können Maschinen die Kundenwünsche erfüllen. +Zusammenfassend lässt sich sagen, dass es in der Industrie einen zunehmenden +Trend gibt, dass der Endverbraucher auf bequeme und effiziente Weise mit GUIs +interagiert, um Aufgaben zu erledigen. + +Aus Entwicklersicht ist die Erstellung einer eleganten GUI deshalb von +entscheidender Bedeutung, da GUIs immer mehr eine der Schlüsselkomponenten +sind bei der Kommunikation zwischen Mensch und Maschine. Benutzeroberflächen +für eingebettete Linux Systeme zu entwickeln ist jedoch ein komplexer Prozess +bei dem das meist genutzte Anwendungsframework und GUI-Toolkit Qt ist, welches +speziell für den Einsatz in eingebetteten Systemen aber teils hohe +Lizenzkosten mit sich bringt und in der Entwicklung aufwendig ist aufgrund +der Nutzung von C++ und traditionellen Designmethoden. Besonders die +Entwicklung von Benutzeroberflächen, die sich für Nutzer so vertraut wie beim +Smartphone per Toucheingabe steuern lassen, kann eine große Hürde darstellen. +Googles neuartiges quelloffenes Benutzerschnittstellen-Entwicklungs-Kit Flutter +bietet hier ein großes Potential für die Entwicklung von GUIs für eingebettete +Linux Systeme, da es besondere Eigenschaften besitzt, die die Entwicklung +vereinfachen können. So ist Flutter frei von jeglichen Lizenzkosten, speziell +für die Entwicklung von Benutzeroberflächen für Touchscreens stärker optimiert +und erlaubt es dank einer Hot-Reload Funktion Änderungen an dem Programm in +Echtzeit zu sehen und auszutesten. Zudem wird Flutter mit der Programmiersprache +Dart entwickelt, die im Vergleich zu C++ einfacher zu erlernen ist. + +In Hinsicht dessen soll in dieser Bachelorarbeit untersucht werden, ob Flutter +als Entwicklungsplattform für eingebettete Linux Systeme geeignet ist. Denn +neben dem Potenzial für Unternehmen kann es auch besonders interessant für +Hochschulprojekte sein, weil Studenten sich potenziell einfacher in die +Entwicklung einarbeiten könnten und die BSD Lizenzierung bei Flutter attraktiv ist. +## Ziel der Arbeit + +Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer +prototypischen Anwendung mit Flutter für ein eingebettetes Linux System. +Dabei soll ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in +eingebetteten Linux Systemen genutzt werden kann und es soll anhand der +prototypischen Anwendung untersucht werden, wie gut Flutter für diesen +Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung sollen +dann genutzt werden um Empfehlungen für die Nutzung von Flutter in +eingebetteten Linux Systemen abzuleiten. +# Flutter + +## Einleitung + +Flutter ist ein + +- Flutter's core design principles center on a declarative, + reactive UI paradigm, where the developer defines the desired + interface state, and the framework efficiently handles updates + +## Architektur + +![Architektur](assets/flutter/archdiagram.png){#id .class width=400} + +\begin{figure}[ht] +\centering +\includegraphics[scale=1]{assets/flutter/archdiagram.png} +\caption{Example caption} + +\caption*{Source: me} +\end{figure} + +## Key Design Concepts + +### Deklarative Programmierung + +Deklarative Programmierung ist ein Programmierparadigma + +\lstinputlisting[language=Java, caption=Beispiel öpvn, linerange={65-73}] +{code/flutter_architecture/lib/main.dart} + +# Yocto Environment + +## Poky + +## Metadata + +## Open-Embedded Project + +## Bitbake + +## Board support package + +## Meta-Flutter + +# Setting up the build environment and building the image + +# Flashing the image on Target + + +# Flutter + +Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme +stellt die effiziente Anwendungsentwicklung vor Herausforderungen. +Plattformübergreifende Frameworks wie Flutter zielen darauf ab, +diese Herausforderungen zu mildern, indem sie ein einheitliches +Toolset zum Erstellen von Benutzeroberflächen (UIs) bereitstellen, +die nahtlos über verschiedene Plattformen hinweg funktionieren. +Dieses Kapitel befasst sich mit der grundlegenden Architektur, +den Vorteilen und Überlegungen zur Verwendung von Flutter für +die Anwendungsentwicklung. [@theflutterwayFlutterRubberDuck2022] + +Was ist Flutter [@FlutterArchitecturalOverviewb] + +test [@weiserComputer21stCentury1999] + +```{#test .dart .number-lines caption="Example Dart test"} +import 'package:retry/retry.dart'; + +final response = await retry( + // Make a GET request + () => http.get('https://google.com').timeout(Duration(seconds: 5)), + // Retry on SocketException or TimeoutException + retryIf: (e) => e is SocketException || e is TimeoutException, +); +print(response.body); +``` + +Nice Dart highlighting! + +![](./assets/skizzen/led.png) + +WORKING :) +# Entwicklungsumgebung + +## Setup und Konfiguration von Flutter + +## Setup von Raspberry Pi + +\pagebreak + +# Literaturverzeichnis