From 09041fbab69d2a126fd1bfc9bca1640bedbd606b Mon Sep 17 00:00:00 2001 From: "Shams Zakhour (ignore Sfshaza)" <44418985+sfshaza2@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:42:35 -0700 Subject: [PATCH 01/86] Updating the codelabs page (#10687) Fixes https://github.com/flutter/website/issues/10664 Update links as a couple codelabs have been removed. --- src/content/codelabs/index.md | 86 +++++++++++++---------------------- 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/src/content/codelabs/index.md b/src/content/codelabs/index.md index c91dcc2300..933daa801b 100644 --- a/src/content/codelabs/index.md +++ b/src/content/codelabs/index.md @@ -137,7 +137,7 @@ like layout and animations: [MDC-104 Flutter: Material Advanced Components]: {{site.codelabs}}/codelabs/mdc-104-flutter [Take your Flutter app from boring to beautiful]: {{site.codelabs}}/codelabs/flutter-boring-to-beautiful -## Using Flutter with +## Using Flutter with ... Learn how to use Flutter with other technologies. @@ -193,6 +193,37 @@ Learn how to use Flutter with other technologies. [Get to know Firebase for Flutter]: {{site.firebase}}/codelabs/firebase-get-to-know-flutter [Local development for your Flutter apps using the Firebase Emulator Suite]: {{site.firebase}}/codelabs/get-started-firebase-emulators-and-flutter +### Build games with Flutter + +* [Add sound and music to your Flutter game with SoLoud][]—**NEW**
+ The [SoLoud][] package, a free and portable engine, + delivers the low-latency and high-performance sound that's + essential for many games. + In this codelab, learn how to add SoLoud to your game. + +* [Build a 2D physics game with Flutter and Flame][]—**NEW**
+ This codelab guides you through crafting game mechanics in a + Flutter and Flame game using a 2D physics simulation along + the lines of Box2D, called [Forge2D][]. + +* [Build a word puzzle with Flutter][]—**NEW**
+ This codelab focuses on building word puzzle games, + and dives into using Flutter's background processing + to generate expansive crossword-style grids of interlocking words. + +* [Introduction to Flame with Flutter][]
+ Build a Breakout clone using the Flame 2D game engine and + embed it in a Flutter wrapper. You will use Flame's Effects + to animate and remove components, along with the `google_fonts` and + `flutter_animate` packages, to make the whole game look well designed. + +[Add sound and music to your Flutter game with SoLoud]: {{site.codelabs}}/codelabs/flutter-codelab-soloud +[Build a 2D physics game with Flutter and Flame]: {{site.codelabs}}/codelabs/flutter-flame-forge2d +[Build a word puzzle with Flutter]: {{site.codelabs}}/codelabs/flutter-word-puzzle +[Forge2D]: {{site.pub-pkg}}/forge2d +[Introduction to Flame with Flutter]: {{site.codelabs}}/codelabs/flutter-flame-brick-breaker +[SoLoud]: {{site.pub-pkg}}/flutter_soloud + ### Flutter and TensorFlow * [Create a custom text-classification model with TensorFlow Lite Model Maker][]
@@ -211,12 +242,6 @@ Learn how to use Flutter with other technologies. ### Flutter and other technologies -* [Add sound and music to your Flutter game with SoLoud][]—**NEW**
- The [SoLoud][] package, a free and portable engine, - delivers the low-latency and high-performance sound that's - essential for many games. - In this codelab, learn how to add SoLoud to your game. - * [Adding Google Maps to a Flutter app][]
Display a Google map in an app, retrieve data from a web service, and display the data as markers on the map. @@ -225,16 +250,6 @@ Learn how to use Flutter with other technologies. With the WebView Flutter plugin you can add a WebView widget to your Android or iOS Flutter app. -* [Build a 2D physics game with Flutter and Flame][]—**NEW**
- This codelab guides you through crafting game mechanics in a - Flutter and Flame game using a 2D physics simulation along - the lines of Box2D, called [Forge2D][]. - -* [Build a word puzzle with Flutter][]—**NEW**
- This codelab focuses on building word puzzle games, - and dives into using Flutter's background processing - to generate expansive crossword-style grids of interlocking words. - * [Build voice bots for mobile with Dialogflow and Flutter][] (workshop)
An instructor-led version of the Dialogflow and Flutter codelab (listed below). @@ -245,12 +260,6 @@ Learn how to use Flutter with other technologies. can interact with the text interface or stream a voice interaction via the built-in microphone of a mobile device. -* [Introduction to Flame with Flutter][]
- Build a Breakout clone using the Flame 2D game engine and - embed it in a Flutter wrapper. You will use Flame's Effects - to animate and remove components, along with the `google_fonts` and - `flutter_animate` packages, to make the whole game look well designed. - * [Using FFI in a Flutter plugin][]
Learn how to use Dart's FFI (foreign function interface) library, ffigen, allowing you to leverage @@ -263,17 +272,11 @@ Learn how to use Flutter with other technologies. PaLM API gives you access to Google's state-of-the-art large language models. -[Add sound and music to your Flutter game with SoLoud]: {{site.codelabs}}/codelabs/flutter-codelab-soloud [Adding Google Maps to a Flutter app]: {{site.codelabs}}/codelabs/google-maps-in-flutter [Adding WebView to your Flutter app]: {{site.codelabs}}/codelabs/flutter-webview -[Build a 2D physics game with Flutter and Flame]: {{site.codelabs}}/codelabs/flutter-flame-forge2d -[Build a word puzzle with Flutter]: {{site.codelabs}}/codelabs/flutter-word-puzzle [Build voice bots for Android with Dialogflow and Flutter]: {{site.codelabs}}/codelabs/dialogflow-flutter [Build voice bots for mobile with Dialogflow and Flutter]: {{site.yt.watch}}?v=O7JfSF3CJ84 [Create haikus about Google products with the PaLM API and Flutter]: {{site.codelabs}}/haiku-generator -[Forge2D]: {{site.pub-pkg}}/forge2d -[Introduction to Flame with Flutter]: {{site.codelabs}}/codelabs/flutter-flame-brick-breaker -[SoLoud]: {{site.pub-pkg}}/flutter_soloud [Using FFI in a Flutter plugin]: {{site.codelabs}}/codelabs/flutter-ffigen ## Testing @@ -292,17 +295,6 @@ Learn how to test your Flutter application. Learn how to write code that's targeted for specific platforms, like iOS, Android, desktop, or the web. -* [How to write a Flutter plugin][]
- Learn how to write a plugin by creating a music plugin - for iOS and Android that processes audio on the host platform. - Then make an example app that uses your plugin to make a music keyboard. - -* [Using a plugin with a Flutter web app][]
- Finish an app that reports the number of stars on a GitHub repository. - Use Dart/Flutter DevTools to do some simple debugging, and - host your app on Firebase and, finally, use a Flutter plugin to - launch the app and open the hosted privacy policy. - * [Write a Flutter desktop application][]
Build a Flutter desktop app (Windows, Linux, or macOS) that accesses GitHub APIs to retrieve your repositories, @@ -316,27 +308,13 @@ like iOS, Android, desktop, or the web. today view. [home-screen]: {{site.codelabs}}/flutter-home-screen-widgets -[How to write a Flutter plugin]: {{site.codelabs}}/codelabs/write-flutter-plugin [provider]: {{site.pub-pkg}}/provider -[Using a plugin with a Flutter web app]: {{site.codelabs}}/codelabs/web-url-launcher [Write a Flutter desktop application]: {{site.codelabs}}/codelabs/flutter-github-client -## Other resources - -For Dart-specific codelabs, see the -[codelabs][] page on the [Dart site][]. - -We also recommend the following online class: - -* [The Complete Flutter Development Bootcamp Using Dart][] - :::note If you have trouble viewing any of the codelabs on [`codelabs.developers.google.com`]({{site.codelabs}}), try [this mirror of the Flutter codelabs][]. ::: -[codelabs]: {{site.dart-site}}/codelabs -[Dart site]: {{site.dart-site}} -[The Complete Flutter Development Bootcamp Using Dart]: https://www.appbrewery.co/p/flutter-development-bootcamp-with-dart [this mirror of the Flutter codelabs]: https://codelabs.flutter-io.cn/ From 7236fc1e43f9c768a0944615f6fbad8931c117be Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Sat, 1 Jun 2024 16:42:08 -0500 Subject: [PATCH 02/86] Update old wiki links (#10689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Description of what this PR is changing or adding, and why:_ This updates old links to flutter/flutter/wiki to their new locations in flutter/flutter/docs _Issues fixed by this PR (if any):_ Related to https://github.com/flutter/flutter/issues/145009 ## Presubmit checklist - [x] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --------- Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com> --- CONTRIBUTING.md | 2 +- README.md | 2 +- firebase.json | 8 ++++---- src/_includes/docs/install/deprecated/analytics.md | 2 +- src/content/add-to-app/performance.md | 2 +- src/content/deployment/linux.md | 3 +-- src/content/embedded/index.md | 2 +- src/content/perf/deferred-components.md | 2 +- src/content/perf/faq.md | 6 +++--- src/content/perf/ui-performance.md | 8 ++++---- src/content/platform-integration/ios/app-extensions.md | 2 +- src/content/platform-integration/web/faq.md | 3 +-- src/content/platform-integration/web/initialization.md | 2 +- src/content/platform-integration/web/wasm.md | 2 +- src/content/release/archive-whats-new.md | 3 +-- src/content/release/archive.md | 4 ++-- src/content/release/breaking-changes/1-22-deprecations.md | 2 +- src/content/release/breaking-changes/2-10-deprecations.md | 2 +- src/content/release/breaking-changes/2-2-deprecations.md | 2 +- src/content/release/breaking-changes/2-5-deprecations.md | 4 ++-- src/content/release/breaking-changes/3-10-deprecations.md | 2 +- src/content/release/breaking-changes/3-13-deprecations.md | 2 +- src/content/release/breaking-changes/3-16-deprecations.md | 2 +- src/content/release/breaking-changes/3-19-deprecations.md | 2 +- src/content/release/breaking-changes/3-3-deprecations.md | 2 +- src/content/release/breaking-changes/3-7-deprecations.md | 2 +- .../android-v1-embedding-create-deprecation.md | 2 +- .../breaking-changes/animation-sheet-builder-display.md | 2 +- ...ge-transition-replaced-by-ZoomPageTransitionBuilder.md | 3 +-- .../release/breaking-changes/plugin-api-migration.md | 2 +- src/content/release/breaking-changes/rendering-changes.md | 2 +- src/content/release/release-notes/index.md | 2 +- .../release/release-notes/release-notes-1.12.13.md | 5 ++--- src/content/release/release-notes/release-notes-1.22.0.md | 2 +- src/content/release/release-notes/release-notes-1.7.8.md | 2 +- src/content/release/release-notes/release-notes-1.9.1.md | 2 +- src/content/release/release-notes/release-notes-2.0.0.md | 2 +- src/content/release/release-notes/release-notes-2.10.0.md | 2 +- src/content/release/release-notes/release-notes-2.2.0.md | 2 +- src/content/release/release-notes/release-notes-2.5.0.md | 2 +- src/content/release/release-notes/release-notes-2.8.0.md | 2 +- src/content/release/release-notes/release-notes-3.0.0.md | 2 +- src/content/release/release-notes/release-notes-3.10.0.md | 2 +- src/content/release/release-notes/release-notes-3.13.0.md | 2 +- src/content/release/release-notes/release-notes-3.16.0.md | 2 +- src/content/release/release-notes/release-notes-3.19.0.md | 2 +- src/content/release/release-notes/release-notes-3.22.0.md | 2 +- src/content/release/release-notes/release-notes-3.3.0.md | 2 +- src/content/release/release-notes/release-notes-3.7.0.md | 2 +- src/content/release/whats-new.md | 2 +- src/content/security/index.md | 6 ++---- src/content/testing/build-modes.md | 4 ++-- src/content/testing/integration-tests/index.md | 2 +- src/content/tools/devtools/memory.md | 2 +- 54 files changed, 67 insertions(+), 74 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54aafee168..1538a047b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,5 +60,5 @@ Happy Fluttering! [doc-PRs]: https://github.com/flutter/website/pulls [so]: https://stackoverflow.com/tags/flutter [mailinglist]: https://groups.google.com/d/forum/flutter-dev -[chat]: https://github.com/flutter/flutter/wiki/Chat +[chat]: https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md [reddit]: https://www.reddit.com/r/FlutterDev diff --git a/README.md b/README.md index 1301c2fb16..d38fcbf8fb 100644 --- a/README.md +++ b/README.md @@ -293,7 +293,7 @@ and we'll try our best to help you. You can also chat with us on the `#hackers-devrel` channel on the [Flutter contributors Discord][]! -[Flutter contributors Discord]: https://github.com/flutter/flutter/wiki/Chat +[Flutter contributors Discord]: https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md ### Refresh code excerpts diff --git a/firebase.json b/firebase.json index 2e4bf2ee8b..f134b8d908 100644 --- a/firebase.json +++ b/firebase.json @@ -218,18 +218,18 @@ { "source": "/brick-breaker", "destination": "https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker", "type": 301 }, { "source": "/catalog/samples", "destination": "https://flutter.github.io/samples/#", "type": 301 }, { "source": "/catalog/samples/*", "destination": "https://flutter.github.io/samples/#", "type": 301 }, - { "source": "/chat", "destination": "https://github.com/flutter/flutter/wiki/Chat", "type": 302 }, + { "source": "/chat", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md", "type": 302 }, { "source": "/custom-deferred-components", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components#custom-implementations", "type": 301 }, { "source": "/deferred-components-wiki", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components", "type": 301 }, - { "source": "/design-principles", "destination": "https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo", "type": 301 }, + { "source": "/design-principles", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, { "source": "/fully-deferred-flutter", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components#fully-deferring-flutter-in-add-to-app", "type": 301 }, { "source": "/null-safety", "destination": "https://dart.dev/null-safety", "type": 301 }, { "source": "/privacy", "destination": "https://www.google.com/intl/en/policies/privacy", "type": 301 }, { "source": "/report-jank", "destination": "https://github.com/flutter/flutter/issues/74833", "type": 301 }, { "source": "/research-optout", "destination": "https://docs.google.com/forms/d/e/1FAIpQLSeG2Nhj0YQkr3m75P74Zb9G-v7zgNhAE9arCyig-a5B1A8uDw/viewform?usp=sf_link", "type": 301 }, { "source": "/research-signup", "destination": "https://docs.google.com/forms/d/e/1FAIpQLSe0i4De809KXVCdljGKrjMj3lxhuzbuFKCtY5PEQPCYtGxFMg/viewform?usp=sf_link", "type": 301 }, - { "source": "/resources/design-principles", "destination": "https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo", "type": 301 }, - { "source": "/style-guide*", "destination": "https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo", "type": 301 }, + { "source": "/resources/design-principles", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, + { "source": "/style-guide*", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, { "source": "/youtube", "destination": "https://youtube.com/@flutterdev", "type": 301 }, { "source": "/go/2D-Foundation", "destination": "https://docs.google.com/document/d/1C2hAq-gMAIx4Cbym7EMhVAcPZ2hmNxlgijpYmgTpmUU/edit?usp=sharing", "type": 301 }, diff --git a/src/_includes/docs/install/deprecated/analytics.md b/src/_includes/docs/install/deprecated/analytics.md index ad1ce1db17..064761d0ce 100644 --- a/src/_includes/docs/install/deprecated/analytics.md +++ b/src/_includes/docs/install/deprecated/analytics.md @@ -34,6 +34,6 @@ how data is handled by these services. [Google Terms of Service]: https://policies.google.com/terms [Privacy Policy]: https://policies.google.com/privacy -[crash reports]: {{site.repo.flutter}}/wiki/Flutter-CLI-crash-reporting +[crash reports]: /src/content/reference/crash-reporting.md [`dart` tool]: {{site.dart-site}}/tools/dart-tool ::: diff --git a/src/content/add-to-app/performance.md b/src/content/add-to-app/performance.md index c8e8c55c70..d2321da784 100644 --- a/src/content/add-to-app/performance.md +++ b/src/content/add-to-app/performance.md @@ -199,7 +199,7 @@ For performance details on creating more than one `FlutterEngine`, see [multiple Flutters][]. [android-engine]: {{site.api}}/javadoc/io/flutter/embedding/engine/FlutterEngine.html -[auxiliary threads]: {{site.repo.flutter}}/wiki/The-Engine-architecture#threading +[auxiliary threads]: {{site.repo.flutter}}/blob/master/docs/about/The-Engine-architecture.md#threading [CAEAGLLayer]: {{site.apple-dev}}/documentation/quartzcore/caeagllayer [CAMetalLayer]: {{site.apple-dev}}/documentation/quartzcore/cametallayer [Dart `Isolate`]: {{site.dart.api}}/stable/dart-isolate/Isolate-class.html diff --git a/src/content/deployment/linux.md b/src/content/deployment/linux.md index adabc9d906..e10f6e0d1b 100644 --- a/src/content/deployment/linux.md +++ b/src/content/deployment/linux.md @@ -389,9 +389,8 @@ You can learn more from the following links on the -[Desktop shells]: {{site.repo.flutter}}/wiki/Desktop-shells [Environment variables]: https://snapcraft.io/docs/environment-variables -[Flutter wiki]: {{site.repo.flutter}}/wiki/ +[Flutter wiki]: {{site.repo.flutter}}/tree/master/docs [Interface management]: https://snapcraft.io/docs/interface-management [DBus interface]: https://snapcraft.io/docs/dbus-interface [Introduction to snapcraft]: https://snapcraft.io/blog/introduction-to-snapcraft diff --git a/src/content/embedded/index.md b/src/content/embedded/index.md index 238001f0ca..291dd72a7f 100644 --- a/src/content/embedded/index.md +++ b/src/content/embedded/index.md @@ -38,7 +38,7 @@ resources. [community]: {{site.main-url}}/community [Discord]: https://discord.com/invite/N7Yshp4 -[Custom Flutter Engine Embedders]: {{site.repo.flutter}}/wiki/Custom-Flutter-Engine-Embedders +[Custom Flutter Engine Embedders]: {{site.repo.flutter}}/blob/master/docs/engine/Custom-Flutter-Engine-Embedders.md [Flutter architectural overview]: /resources/architectural-overview [Flutter engine `embedder.h` file]: {{site.repo.engine}}/blob/main/shell/platform/embedder/embedder.h [Flutter Embedder Engine GLFW example]: {{site.repo.engine}}/tree/main/examples/glfw#flutter-embedder-engine-glfw-example diff --git a/src/content/perf/deferred-components.md b/src/content/perf/deferred-components.md index a0bea1355f..203c890877 100644 --- a/src/content/perf/deferred-components.md +++ b/src/content/perf/deferred-components.md @@ -661,7 +661,7 @@ Play store's delivery feature. [`DeferredComponent`]: {{site.api}}/flutter/services/DeferredComponent-class.html [dynamic feature modules]: {{site.android-dev}}/guide/playcore/feature-delivery [Flutter Gallery's `lib/deferred_widget.dart`]: {{site.repo.gallery-archive}}/blob/main/lib/deferred_widget.dart -[Flutter wiki]: {{site.repo.flutter}}/wiki +[Flutter wiki]: {{site.repo.flutter}}/tree/master/docs [github.com/google/bundletool/releases]: {{site.github}}/google/bundletool/releases [lazily loading a library]: {{site.dart-site}}/language/libraries#lazily-loading-a-library [release or profile mode]: /testing/build-modes diff --git a/src/content/perf/faq.md b/src/content/perf/faq.md index a380f67b59..27957a354a 100644 --- a/src/content/perf/faq.md +++ b/src/content/perf/faq.md @@ -19,8 +19,8 @@ about evaluating and debugging Flutter's performance. * [How to write a render speed test for Flutter][speed-test] * [How to write a memory test for Flutter][memory-test] -[memory-test]: {{site.repo.flutter}}/wiki/How-to-write-a-memory-test-for-Flutter -[speed-test]: {{site.repo.flutter}}/wiki/How-to-write-a-render-speed-test-for-Flutter +[memory-test]: {{site.repo.flutter}}/blob/master/docs/contributing/testing/How-to-write-a-memory-test-for-Flutter.md +[speed-test]: {{site.repo.flutter}}/blob/master/docs/contributing/testing/How-to-write-a-render-speed-test-for-Flutter.md * What are some tools for capturing and analyzing performance metrics? @@ -75,7 +75,7 @@ about evaluating and debugging Flutter's performance. * How do I query the target frames per second (of the display)? * [Get the display refresh rate][] -[Get the display refresh rate]: {{site.repo.flutter}}/wiki/Engine-specific-Service-Protocol-extensions#get-the-display-refresh-rate-_fluttergetdisplayrefreshrate +[Get the display refresh rate]: {{site.repo.flutter}}/blob/master/docs/engine/Engine-specific-Service-Protocol-extensions.md#get-the-display-refresh-rate-_fluttergetdisplayrefreshrate * How to solve my app's poor animations caused by an expensive Dart async function call that is blocking the UI thread? diff --git a/src/content/perf/ui-performance.md b/src/content/perf/ui-performance.md index 88c0c684f1..6f51b7a7da 100644 --- a/src/content/perf/ui-performance.md +++ b/src/content/perf/ui-performance.md @@ -230,13 +230,13 @@ on other threads. This thread is not shown in the performance overlay. For links to more information and videos, -see [The Framework architecture][] on the -[GitHub wiki][], and the community article, +see [The Framework architecture][] in the +[Flutter wiki][], and the community article, [The Layer Cake][]. -[GitHub wiki]: {{site.repo.flutter}}/wiki/ +[Flutter wiki]: {{site.repo.flutter}}/tree/master/docs [MainThread]: {{site.android-dev}}/reference/android/support/annotation/MainThread -[The Framework architecture]: {{site.repo.flutter}}/wiki/The-Framework-architecture +[The Framework architecture]: {{site.repo.flutter}}/blob/master/docs/about/The-Framework-architecture.md [The Layer Cake]: {{site.medium}}/flutter-community/the-layer-cake-widgets-elements-renderobjects-7644c3142401 [UIKit]: {{site.apple-dev}}/documentation/uikit diff --git a/src/content/platform-integration/ios/app-extensions.md b/src/content/platform-integration/ios/app-extensions.md index a1bd26d42f..0006ea1a1f 100644 --- a/src/content/platform-integration/ios/app-extensions.md +++ b/src/content/platform-integration/ios/app-extensions.md @@ -281,7 +281,7 @@ codelab. [Adding a Flutter Screen]: /add-to-app/ios/add-flutter-screen?tab=vc-uikit-swift-tab#alternatively-create-a-flutterviewcontroller-with-an-implicit-flutterengine [App Group]: {{site.apple-dev}}/documentation/xcode/configuring-app-groups [Apple's documentation]: {{site.apple-dev}}/app-extensions/ -[Compiling the Engine]: https://github.com/flutter/flutter/wiki/Compiling-the-engine +[Compiling the Engine]: https://github.com/flutter/flutter/blob/master/docs/engine/contributing/Compiling-the-engine.md [Core Spotlight]: {{site.apple-dev}}/documentation/corespotlight [Deep Linking]:/ui/navigation/deep-linking [lab]: {{site.codelabs}}/flutter-home-screen-widgets diff --git a/src/content/platform-integration/web/faq.md b/src/content/platform-integration/web/faq.md index 92d5dee35f..5d5cac46a0 100644 --- a/src/content/platform-integration/web/faq.md +++ b/src/content/platform-integration/web/faq.md @@ -162,12 +162,11 @@ Not currently. [Logging]: /tools/devtools/logging [Preparing a web app for release]: /deployment/web [Running Flutter inspector]: /tools/devtools/inspector -[Upgrading from package:flutter_web to the Flutter SDK]: {{site.repo.flutter}}/wiki/Upgrading-from-package:flutter_web-to-the-Flutter-SDK [widget tests]: /testing/overview#widget-tests [Web support for Flutter]: /platform-integration/web [web workers]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers [run your web apps in any supported browser]: /platform-integration/web/building#create-and-run [Integration testing]: /testing/integration-tests#test-in-a-web-browser [documentation for conditional imports]: {{site.dart-site}}/guides/libraries/create-library-packages#conditionally-importing-and-exporting-library-files -[roadmap]: {{site.github}}/flutter/flutter/wiki/Roadmap#web-platform +[roadmap]: {{site.github}}/flutter/flutter/blob/master/docs/roadmap/Roadmap.md#web-platform [space_hawaii]: https://alien-hawaii-2024.web.app/ diff --git a/src/content/platform-integration/web/initialization.md b/src/content/platform-integration/web/initialization.md index e4debbed5e..6b520b71f3 100644 --- a/src/content/platform-integration/web/initialization.md +++ b/src/content/platform-integration/web/initialization.md @@ -8,7 +8,7 @@ This page describes APIs that are available in the [`stable`][] channel in Flutter 3.21 or earlier. For recommended app initialization in Flutter 3.22 or later, see the [Flutter web app initialization][] page. ::: -[`stable`]: {{site.github}}/flutter/flutter/wiki/flutter-build-release-channels#stable +[`stable`]: {{site.github}}/flutter/flutter/blob/master/docs/releases/Flutter-build-release-channels.md#stable [Flutter web app initialization]: /platform-integration/web/bootstrapping diff --git a/src/content/platform-integration/web/wasm.md b/src/content/platform-integration/web/wasm.md index d1ecf64c4a..90cad5768c 100644 --- a/src/content/platform-integration/web/wasm.md +++ b/src/content/platform-integration/web/wasm.md @@ -24,7 +24,7 @@ applications for the web. section to learn more. ::: -[`stable`]: {{site.github}}/flutter/flutter/wiki/flutter-build-release-channels#stable +[`stable`]: {{site.github}}/flutter/flutter/blob/master/docs/releases/Flutter-build-release-channels.md#stable [`package:web`]: {{site.pub-pkg}}/web [`dart:js_interop`]: {{site.dart.api}}/{{site.dart.sdk.channel}}/dart-js_interop diff --git a/src/content/release/archive-whats-new.md b/src/content/release/archive-whats-new.md index 41f5dd555e..b0d70df1a0 100644 --- a/src/content/release/archive-whats-new.md +++ b/src/content/release/archive-whats-new.md @@ -1247,7 +1247,7 @@ Other relevant docs: * If you already have a web app that depends on the flutter_web package, the following instructions tell you how to migrate to the flutter package: - [Upgrading from package:flutter_web to the Flutter SDK][]. + Upgrading from package:flutter_web to the Flutter SDK. * A new [`ToggleButtons`][] widget, described in the API docs. [ToggleButtons demo][] * A new [`ColorFiltered`][] widget, also described in the API docs. @@ -1270,7 +1270,6 @@ Happy Fluttering! [Showcase]: {{site.main-url}}/showcase [`ToggleButtons`]: {{site.api}}/flutter/material/ToggleButtons-class.html [ToggleButtons demo]: {{site.github}}/csells/flutter_toggle_buttons -[Upgrading from package:flutter_web to the Flutter SDK]: {{site.repo.flutter}}/wiki/Upgrading-from-package:flutter_web-to-the-Flutter-SDK [using the dart:ffi library]: /platform-integration/android/c-interop ## 09 Jul 2019: 1.7 release diff --git a/src/content/release/archive.md b/src/content/release/archive.md index 884b8a5053..00ed1b591b 100644 --- a/src/content/release/archive.md +++ b/src/content/release/archive.md @@ -75,7 +75,7 @@ $ ./flutter/bin/flutter --version For additional details on how our installation bundles are structured, see [Installation bundles][]. -[Flutter's channels]: {{site.repo.flutter}}/wiki/Flutter-build-release-channels +[Flutter's channels]: {{site.repo.flutter}}/blob/master/docs/releases/Flutter-build-release-channels.md [release notes]: /release/release-notes [GitHub repo]: {{site.repo.flutter}} -[Installation bundles]: {{site.repo.flutter}}/wiki/Flutter-Installation-Bundles +[Installation bundles]: {{site.repo.flutter}}/blob/master/docs/infra/Flutter-Installation-Bundles.md diff --git a/src/content/release/breaking-changes/1-22-deprecations.md b/src/content/release/breaking-changes/1-22-deprecations.md index 97c1b798f4..42c64c4658 100644 --- a/src/content/release/breaking-changes/1-22-deprecations.md +++ b/src/content/release/breaking-changes/1-22-deprecations.md @@ -22,7 +22,7 @@ primary source to aid in migration. A A [design document][] and [article][] are available for more context on Flutter's deprecation policy. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-1-22 [design document]: /go/deprecation-lifetime [article]: {{site.flutter-medium}}/deprecation-lifetime-in-flutter-e4d76ee738ad diff --git a/src/content/release/breaking-changes/2-10-deprecations.md b/src/content/release/breaking-changes/2-10-deprecations.md index 2f35f06ec7..b7db443415 100644 --- a/src/content/release/breaking-changes/2-10-deprecations.md +++ b/src/content/release/breaking-changes/2-10-deprecations.md @@ -16,7 +16,7 @@ primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-2-10 ## Changes diff --git a/src/content/release/breaking-changes/2-2-deprecations.md b/src/content/release/breaking-changes/2-2-deprecations.md index 220f93d422..91cae8f4b2 100644 --- a/src/content/release/breaking-changes/2-2-deprecations.md +++ b/src/content/release/breaking-changes/2-2-deprecations.md @@ -15,7 +15,7 @@ All affected APIs have been compiled into this primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-2-2 ## Changes diff --git a/src/content/release/breaking-changes/2-5-deprecations.md b/src/content/release/breaking-changes/2-5-deprecations.md index 5c94f0c97b..7edebc25a9 100644 --- a/src/content/release/breaking-changes/2-5-deprecations.md +++ b/src/content/release/breaking-changes/2-5-deprecations.md @@ -16,7 +16,7 @@ primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-2-5 ## Changes @@ -253,7 +253,7 @@ Relevant PRs: * Deprecated in [#60320]({{site.repo.flutter}}/issues/60320) * Removed in [#90294]({{site.repo.flutter}}/issues/90294) -[Flutter Hybrid Composition]: {{site.repo.flutter}}/wiki/Hybrid-Composition +[Flutter Hybrid Composition]: {{site.repo.flutter}}/blob/master/docs/platforms/Hybrid-Composition.md [`AndroidViewController`]: {{site.api}}/flutter/services/AndroidViewController-class.html [`TextureAndroidViewController`]: {{site.api}}/flutter/services/TextureAndroidViewController-class.html [`SurfaceAndroidViewController`]: {{site.api}}/flutter/services/SurfaceAndroidViewController-class.html diff --git a/src/content/release/breaking-changes/3-10-deprecations.md b/src/content/release/breaking-changes/3-10-deprecations.md index a364f0ea0e..cd44f7282b 100644 --- a/src/content/release/breaking-changes/3-10-deprecations.md +++ b/src/content/release/breaking-changes/3-10-deprecations.md @@ -15,7 +15,7 @@ All affected APIs have been compiled into this primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-10 ## Changes diff --git a/src/content/release/breaking-changes/3-13-deprecations.md b/src/content/release/breaking-changes/3-13-deprecations.md index 604cec3071..ca62d87f43 100644 --- a/src/content/release/breaking-changes/3-13-deprecations.md +++ b/src/content/release/breaking-changes/3-13-deprecations.md @@ -16,7 +16,7 @@ primary source to aid in migration. To further aid your migration, check out this [quick reference sheet][]. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-13 ## Changes diff --git a/src/content/release/breaking-changes/3-16-deprecations.md b/src/content/release/breaking-changes/3-16-deprecations.md index a6bb79bce3..8d4d86bdf0 100644 --- a/src/content/release/breaking-changes/3-16-deprecations.md +++ b/src/content/release/breaking-changes/3-16-deprecations.md @@ -16,7 +16,7 @@ primary source to aid in migration. To further aid your migration, check out this [quick reference sheet][]. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-16 ## Changes diff --git a/src/content/release/breaking-changes/3-19-deprecations.md b/src/content/release/breaking-changes/3-19-deprecations.md index d91dff9c7a..82d07e6cf0 100644 --- a/src/content/release/breaking-changes/3-19-deprecations.md +++ b/src/content/release/breaking-changes/3-19-deprecations.md @@ -16,7 +16,7 @@ primary source to aid in migration. To further aid your migration, check out this [quick reference sheet][]. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-19 ## Changes diff --git a/src/content/release/breaking-changes/3-3-deprecations.md b/src/content/release/breaking-changes/3-3-deprecations.md index 01e49cb450..1694e67483 100644 --- a/src/content/release/breaking-changes/3-3-deprecations.md +++ b/src/content/release/breaking-changes/3-3-deprecations.md @@ -15,7 +15,7 @@ All affected APIs have been compiled into this primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-3 ## Changes diff --git a/src/content/release/breaking-changes/3-7-deprecations.md b/src/content/release/breaking-changes/3-7-deprecations.md index a305b56bb7..aa8947cea1 100644 --- a/src/content/release/breaking-changes/3-7-deprecations.md +++ b/src/content/release/breaking-changes/3-7-deprecations.md @@ -15,7 +15,7 @@ All affected APIs have been compiled into this primary source to aid in migration. A [quick reference sheet][] is available as well. -[Deprecation Policy]: {{site.repo.flutter}}/wiki/Tree-hygiene#deprecation +[Deprecation Policy]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#deprecations [quick reference sheet]: /go/deprecations-removed-after-3-7 ## Changes diff --git a/src/content/release/breaking-changes/android-v1-embedding-create-deprecation.md b/src/content/release/breaking-changes/android-v1-embedding-create-deprecation.md index c2ffb78b4d..b8a48dd3ad 100644 --- a/src/content/release/breaking-changes/android-v1-embedding-create-deprecation.md +++ b/src/content/release/breaking-changes/android-v1-embedding-create-deprecation.md @@ -20,7 +20,7 @@ to migrate following the instructions in [Supporting the new Android plugins APIs][]. [Android Migration Summary]: /go/android-migration-summary -[Upgrading pre 1.12 Android projects]: {{site.repo.flutter}}/wiki/Upgrading-pre-1.12-Android-projects +[Upgrading pre 1.12 Android projects]: {{site.repo.flutter}}/blob/master/docs/platforms/android/Upgrading-pre-1.12-Android-projects.md [Supporting the new Android plugins APIs]: /release/breaking-changes/plugin-api-migration ## Context diff --git a/src/content/release/breaking-changes/animation-sheet-builder-display.md b/src/content/release/breaking-changes/animation-sheet-builder-display.md index c7acfcbd4f..d7d572677b 100644 --- a/src/content/release/breaking-changes/animation-sheet-builder-display.md +++ b/src/content/release/breaking-changes/animation-sheet-builder-display.md @@ -157,5 +157,5 @@ Relevant PR: [`AnimationSheetBuilder`]: {{site.api}}/flutter/flutter_test/AnimationSheetBuilder-class.html [`AnimationSheetBuilder.collate`]: {{site.api}}/flutter/flutter_test/AnimationSheetBuilder/collate.html -[golden testing]: {{site.repo.flutter}}/wiki/Writing-a-golden-file-test-for-package%3Aflutter +[golden testing]: {{site.api}}/flutter/flutter_test/matchesGoldenFile.html [Test WidgetTester handling test pointers]: {{site.repo.flutter}}/pull/83337 diff --git a/src/content/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder.md b/src/content/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder.md index e894c628ae..6e5758f39c 100644 --- a/src/content/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder.md +++ b/src/content/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder.md @@ -30,8 +30,7 @@ When the current `TargetPlatform` doesn't have `PageTransitionsBuilder` defined in the `ThemeData.pageTransitionsTheme`, `ZoomPageTransitionsBuilder` is used as the default. -[Style guide for Flutter repo]: {{site.repo.flutter}}/wiki/Style-guide-for-Flutter-repo - +[Style guide for Flutter repo]: {{site.repo.flutter}}/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md ## Description of change `PageTransitionsBuilder`s defined in diff --git a/src/content/release/breaking-changes/plugin-api-migration.md b/src/content/release/breaking-changes/plugin-api-migration.md index 607ee9c942..5ee0c0a3e3 100644 --- a/src/content/release/breaking-changes/plugin-api-migration.md +++ b/src/content/release/breaking-changes/plugin-api-migration.md @@ -367,5 +367,5 @@ a non-UI configuration. [`PluginRegistry.Registrar`]: {{site.api}}/javadoc/io/flutter/plugin/common/PluginRegistry.Registrar.html [`PluginRegistry.Registrar.activity()`]: {{site.api}}/javadoc/io/flutter/plugin/common/PluginRegistry.Registrar.html#activity-- [`ServiceAware`]: {{site.api}}/javadoc/io/flutter/embedding/engine/plugins/service/ServiceAware.html -[Upgrading pre 1.12 Android projects]: {{site.repo.flutter}}/wiki/Upgrading-pre-1.12-Android-projects +[Upgrading pre 1.12 Android projects]: {{site.repo.flutter}}/blob/master/docs/platforms/android/Upgrading-pre-1.12-Android-projects.md [verified publisher]: {{site.dart-site}}/tools/pub/verified-publishers diff --git a/src/content/release/breaking-changes/rendering-changes.md b/src/content/release/breaking-changes/rendering-changes.md index 20f1963229..31e4ef2106 100644 --- a/src/content/release/breaking-changes/rendering-changes.md +++ b/src/content/release/breaking-changes/rendering-changes.md @@ -71,7 +71,7 @@ Wiki page: * [Flutter Test Fonts][] -[Flutter Test Fonts]: {{site.repo.flutter}}/wiki/Flutter-Test-Fonts +[Flutter Test Fonts]: {{site.repo.flutter}}/blob/master/docs/contributing/testing/Flutter-Test-Fonts.md [TextDecoration.underline]: {{site.api}}/flutter/dart-ui/TextDecoration/underline-constant.html [TextDecoration.overline]: {{site.api}}/flutter/dart-ui/TextDecoration/overline-constant.html [TextDecoration.lineThrough]: {{site.api}}/flutter/dart-ui/TextDecoration/lineThrough-constant.html diff --git a/src/content/release/release-notes/index.md b/src/content/release/release-notes/index.md index 7f3a44d249..f8b5b72822 100644 --- a/src/content/release/release-notes/index.md +++ b/src/content/release/release-notes/index.md @@ -131,4 +131,4 @@ For information about bug-fix releases, check out [1.12.13 announcement]: {{site.flutter-medium}}/announcing-flutter-1-12-what-a-year-22c256ba525d [1.12.13 release notes and change log]: /release/release-notes/release-notes-1.12.13 [Archived release notes]: /release/release-notes/release-notes-archive -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md diff --git a/src/content/release/release-notes/release-notes-1.12.13.md b/src/content/release/release-notes/release-notes-1.12.13.md index abdaae1f44..099c9cc980 100644 --- a/src/content/release/release-notes/release-notes-1.12.13.md +++ b/src/content/release/release-notes/release-notes-1.12.13.md @@ -1359,8 +1359,7 @@ We increased our support for web, moving it from the dev channel to the beta cha ## Desktop We are also moving macOS support from tech preview to alpha, -enabling it in the dev channel. For more details, see the -[Flutter wiki]({{site.repo.flutter}}/wiki/Desktop-shells). +enabling it in the dev channel. [37901]({{site.repo.flutter}}/pull/37901) [macos] Check for special keys before creating a logical key @@ -3011,7 +3010,7 @@ In addition to the PRs listed below, please also check out the following release See the [full list](/release/release-notes/changelogs/changelog-1.12.13) of merged PRs for the 1.12 release. -[breaking change policy on the Flutter wiki]: {{site.repo.flutter}}/wiki/Tree-hygiene#handling-breaking-changes +[breaking change policy on the Flutter wiki]: {{site.repo.flutter}}/blob/master/docs/contributing/Tree-hygiene.md#handling-breaking-changes [flutter-announce]: https://groups.google.com/g/flutter-announce [GitHub Octoverse report]: https://octoverse.github.com/ [this post from Ian Hickson]: https://groups.google.com/g/flutter-announce/c/Z09a317E21o diff --git a/src/content/release/release-notes/release-notes-1.22.0.md b/src/content/release/release-notes/release-notes-1.22.0.md index 2d65ff8a83..ce702ca6ad 100644 --- a/src/content/release/release-notes/release-notes-1.22.0.md +++ b/src/content/release/release-notes/release-notes-1.22.0.md @@ -8,7 +8,7 @@ This page has release notes for 1.22.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-1.7.8.md b/src/content/release/release-notes/release-notes-1.7.8.md index a3cb5218c1..befcf37164 100644 --- a/src/content/release/release-notes/release-notes-1.7.8.md +++ b/src/content/release/release-notes/release-notes-1.7.8.md @@ -17,7 +17,7 @@ The major themes of this release are: [RangeSlider](https://api.flutter.dev/flutter/material/RangeSlider-class.html) As detailed in our -[roadmap](https://github.com/flutter/flutter/wiki/Roadmap), +[roadmap](https://github.com/flutter/flutter/blob/master/docs/roadmap/Roadmap.md), we're also continuing the ongoing work in the Flutter engine and framework to support turning on web and desktop targets; however, this is not yet ready for general usage. diff --git a/src/content/release/release-notes/release-notes-1.9.1.md b/src/content/release/release-notes/release-notes-1.9.1.md index e7230bc06c..b7f1ecb593 100644 --- a/src/content/release/release-notes/release-notes-1.9.1.md +++ b/src/content/release/release-notes/release-notes-1.9.1.md @@ -4,7 +4,7 @@ short-title: 1.9.1 release notes description: Release notes for Flutter 1.9.1. --- -Hello and welcome to another stable release of Flutter. So far this year, we've been right on target with one stable release each quarter, as per [our plan](https://github.com/flutter/flutter/wiki/Flutter-build-release-channels) (well, less of a plan and more of a goal, but still, it's been working out pretty well so far…). This release is our biggest yet, with 620 Pull Requests merged from 116 contributors. As always, the interesting PRs are listed below. And there are lots of interesting things to discuss in this release, including: +Hello and welcome to another stable release of Flutter. So far this year, we've been right on target with one stable release each quarter, as per [our plan](https://github.com/flutter/flutter/blob/master/docs/releases/Flutter-build-release-channels.md) (well, less of a plan and more of a goal, but still, it's been working out pretty well so far…). This release is our biggest yet, with 620 Pull Requests merged from 116 contributors. As always, the interesting PRs are listed below. And there are lots of interesting things to discuss in this release, including: * One regression fixed but also one added * Some breaking API changes diff --git a/src/content/release/release-notes/release-notes-2.0.0.md b/src/content/release/release-notes/release-notes-2.0.0.md index 31503dc897..ea80fd110e 100644 --- a/src/content/release/release-notes/release-notes-2.0.0.md +++ b/src/content/release/release-notes/release-notes-2.0.0.md @@ -8,7 +8,7 @@ This page has release notes for 2.0.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-2.10.0.md b/src/content/release/release-notes/release-notes-2.10.0.md index e0818e0446..25a455d98a 100644 --- a/src/content/release/release-notes/release-notes-2.10.0.md +++ b/src/content/release/release-notes/release-notes-2.10.0.md @@ -7,7 +7,7 @@ This page has release notes for 2.10.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-2.2.0.md b/src/content/release/release-notes/release-notes-2.2.0.md index 15fb93fd4f..0dced5d5ad 100644 --- a/src/content/release/release-notes/release-notes-2.2.0.md +++ b/src/content/release/release-notes/release-notes-2.2.0.md @@ -7,7 +7,7 @@ This page has release notes for 2.2.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-2.5.0.md b/src/content/release/release-notes/release-notes-2.5.0.md index fd01836088..c475886858 100644 --- a/src/content/release/release-notes/release-notes-2.5.0.md +++ b/src/content/release/release-notes/release-notes-2.5.0.md @@ -7,7 +7,7 @@ This page has release notes for 2.5.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-2.8.0.md b/src/content/release/release-notes/release-notes-2.8.0.md index 2fc87f0ef9..665ab4a7c7 100644 --- a/src/content/release/release-notes/release-notes-2.8.0.md +++ b/src/content/release/release-notes/release-notes-2.8.0.md @@ -7,7 +7,7 @@ This page has release notes for 2.8.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: https://github.com/flutter/flutter/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Merged PRs by labels for `flutter/flutter` diff --git a/src/content/release/release-notes/release-notes-3.0.0.md b/src/content/release/release-notes/release-notes-3.0.0.md index 72d243084e..b132e3d9c9 100644 --- a/src/content/release/release-notes/release-notes-3.0.0.md +++ b/src/content/release/release-notes/release-notes-3.0.0.md @@ -8,7 +8,7 @@ This page has release notes for 3.0.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## If you see warnings about bindings diff --git a/src/content/release/release-notes/release-notes-3.10.0.md b/src/content/release/release-notes/release-notes-3.10.0.md index 8b0f30cf47..1a51c60f7d 100644 --- a/src/content/release/release-notes/release-notes-3.10.0.md +++ b/src/content/release/release-notes/release-notes-3.10.0.md @@ -7,7 +7,7 @@ This page has release notes for 3.10.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Framework diff --git a/src/content/release/release-notes/release-notes-3.13.0.md b/src/content/release/release-notes/release-notes-3.13.0.md index ea7cb5abba..4af3439cae 100644 --- a/src/content/release/release-notes/release-notes-3.13.0.md +++ b/src/content/release/release-notes/release-notes-3.13.0.md @@ -7,7 +7,7 @@ This page has release notes for 3.13.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Framework diff --git a/src/content/release/release-notes/release-notes-3.16.0.md b/src/content/release/release-notes/release-notes-3.16.0.md index 2056c9284a..2c65c46d9c 100644 --- a/src/content/release/release-notes/release-notes-3.16.0.md +++ b/src/content/release/release-notes/release-notes-3.16.0.md @@ -8,7 +8,7 @@ This page has release notes for 3.16.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Flutter diff --git a/src/content/release/release-notes/release-notes-3.19.0.md b/src/content/release/release-notes/release-notes-3.19.0.md index 7ca56f1130..26293e3ea0 100644 --- a/src/content/release/release-notes/release-notes-3.19.0.md +++ b/src/content/release/release-notes/release-notes-3.19.0.md @@ -8,7 +8,7 @@ This page has release notes for 3.19.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Flutter diff --git a/src/content/release/release-notes/release-notes-3.22.0.md b/src/content/release/release-notes/release-notes-3.22.0.md index 706da43001..7655698c91 100644 --- a/src/content/release/release-notes/release-notes-3.22.0.md +++ b/src/content/release/release-notes/release-notes-3.22.0.md @@ -8,7 +8,7 @@ This page has release notes for 3.22.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## Flutter diff --git a/src/content/release/release-notes/release-notes-3.3.0.md b/src/content/release/release-notes/release-notes-3.3.0.md index 65a3405ea1..f7c6fa8404 100644 --- a/src/content/release/release-notes/release-notes-3.3.0.md +++ b/src/content/release/release-notes/release-notes-3.3.0.md @@ -7,7 +7,7 @@ This page has release notes for 3.3.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## What's changed diff --git a/src/content/release/release-notes/release-notes-3.7.0.md b/src/content/release/release-notes/release-notes-3.7.0.md index 7079c5173d..94e05af132 100644 --- a/src/content/release/release-notes/release-notes-3.7.0.md +++ b/src/content/release/release-notes/release-notes-3.7.0.md @@ -7,7 +7,7 @@ This page has release notes for 3.7.0. For information about subsequent bug-fix releases, see [Hotfixes to the Stable Channel][]. -[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/wiki/Hotfixes-to-the-Stable-Channel +[Hotfixes to the Stable Channel]: {{site.repo.flutter}}/blob/master/docs/releases/Hotfixes-to-the-Stable-Channel.md ## What's changed diff --git a/src/content/release/whats-new.md b/src/content/release/whats-new.md index 378c9cf122..e68ff15acf 100644 --- a/src/content/release/whats-new.md +++ b/src/content/release/whats-new.md @@ -139,7 +139,7 @@ You might also check out the [Dart 3.3 release][] blog post. [Flutter and Dart 2024 Roadmap][]. * Check out [Harness the Gemini API in your Dart and Flutter apps][]. -[Flutter and Dart 2024 Roadmap]: {{site.github}}/flutter/flutter/wiki/Roadmap +[Flutter and Dart 2024 Roadmap]: {{site.github}}/flutter/flutter/blob/master/docs/roadmap/Roadmap.md [Harness the Gemini API in your Dart and Flutter apps]: {{site.flutter-medium}}/harness-the-gemini-api-in-your-dart-and-flutter-apps-00573e560381 --- diff --git a/src/content/security/index.md b/src/content/security/index.md index d874569c1a..400bafccf4 100644 --- a/src/content/security/index.md +++ b/src/content/security/index.md @@ -55,7 +55,7 @@ in public that could put users at risk, For more details on how we handle security vulnerabilities, see our [security policy][]. -[Discord chat channels]: {{site.repo.flutter}}/wiki/Chat +[Discord chat channels]: {{site.repo.flutter}}/blob/master/docs/contributing/Chat.md [known false positives]: /reference/security-false-positives [security policy]: {{site.repo.flutter}}/security/policy @@ -108,8 +108,7 @@ technical release blog post. * **Keep current with the latest Flutter SDK releases.** We regularly update Flutter, and these updates might fix security - defects discovered in previous versions. Check the Flutter - [change log][] for security-related updates. + defects discovered in previous versions. * **Keep your application's dependencies up to date.** Make sure you [upgrade your package dependencies][] @@ -128,6 +127,5 @@ technical release blog post. be sure to update your fork and consider sharing your changes with the community. -[change log]: {{site.repo.flutter}}/wiki/Changelog [upgrade your package dependencies]: /release/upgrade diff --git a/src/content/testing/build-modes.md b/src/content/testing/build-modes.md index 6006fc67e6..30fe3dc0bb 100644 --- a/src/content/testing/build-modes.md +++ b/src/content/testing/build-modes.md @@ -129,8 +129,8 @@ For more information on the build modes, see [dart2js]: {{site.dart-site}}/tools/dart2js [dartdevc]: {{site.dart-site}}/tools/dartdevc [DevTools]: /tools/devtools -[Flutter wiki]: {{site.repo.flutter}}/wiki/Flutter's-modes -[Flutter's build modes]: {{site.repo.flutter}}/wiki/Flutter%27s-modes +[Flutter wiki]: {{site.repo.flutter}}/blob/master/docs/engine/Flutter's-modes.md +[Flutter's build modes]: {{site.repo.flutter}}/blob/master/docs/engine/Flutter's-modes.md [generate timeline events]: {{site.developers}}/web/tools/chrome-devtools/evaluate-performance/performance-reference [hot reload]: /tools/hot-reload [iOS]: /deployment/ios diff --git a/src/content/testing/integration-tests/index.md b/src/content/testing/integration-tests/index.md index 536f6eda37..f75a30d2ac 100644 --- a/src/content/testing/integration-tests/index.md +++ b/src/content/testing/integration-tests/index.md @@ -594,7 +594,7 @@ consult the [iOS Device Testing][] section in the README. [flutter_test]: {{site.api}}/flutter/flutter_test/flutter_test-library.html [Integration testing]: /testing/integration-tests [iOS Device Testing]: {{site.repo.flutter}}/tree/main/packages/integration_test#ios-device-testing -[Running Flutter driver tests with web]: {{site.repo.flutter}}/wiki/Running-Flutter-Driver-tests-with-Web +[Running Flutter driver tests with web]: {{site.repo.flutter}}/blob/master/docs/contributing/testing/Running-Flutter-Driver-tests-with-Web.md [widget tests]: /testing/overview#widget-tests [flutter_driver]: {{site.api}}/flutter/flutter_driver/flutter_driver-library.html diff --git a/src/content/tools/devtools/memory.md b/src/content/tools/devtools/memory.md index f81ac990e2..061abb4371 100644 --- a/src/content/tools/devtools/memory.md +++ b/src/content/tools/devtools/memory.md @@ -376,7 +376,7 @@ The quantities plotted on the y-axis are as follows: For more information, see [Dart VM internals][]. [Command-line and server apps]: {{site.dart-site}}/server -[Custom Flutter engine embedders]: {{site.repo.flutter}}/wiki/Custom-Flutter-Engine-Embedders +[Custom Flutter engine embedders]: {{site.repo.flutter}}/blob/master/docs/engine/Custom-Flutter-Engine-Embedders.md [Dart VM internals]: https://mrale.ph/dartvm/ [DevTools Performance view]: /tools/devtools/performance [Flutter architectural overview]: /resources/architectural-overview From 16a74d528ae3eeac60a5abc89efddbd497344a49 Mon Sep 17 00:00:00 2001 From: Binni Goel <41873024+droidbg@users.noreply.github.com> Date: Mon, 3 Jun 2024 05:00:17 +0530 Subject: [PATCH 03/86] Fixes. slash issue in uninstall page (#10692) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Fixes #10690 This PR fixes the broken slash in uninstall page. Existing: image After Fix: image ## Presubmit checklist - [X] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [X] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [X] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- src/content/get-started/uninstall/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/get-started/uninstall/index.md b/src/content/get-started/uninstall/index.md index 4d346ad868..c6e3585d48 100644 --- a/src/content/get-started/uninstall/index.md +++ b/src/content/get-started/uninstall/index.md @@ -29,14 +29,14 @@ Select your development platform from the following tabs. {% case os %} {% when 'Windows' -%} -{% assign dirinstall='C:\user\{username}\dev\' %} +{% assign dirinstall='C:\\user\{username}\dev\' %} {% assign localappdata='%LOCALAPPDATA%\' %} {% assign appdata='%APPDATA%\' %} {% assign ps-localappdata='$env:LOCALAPPDATA\' %} {% assign ps-appdata='$env:APPDATA\' %} {% assign unzip='Expand-Archive' %} -{% assign path='C:\user\{username}\dev' %} -{% assign prompt='C:\>' %} +{% assign path='C:\\user\{username}\dev' %} +{% assign prompt='C:\\>' %} {% assign terminal='PowerShell' %} {% assign rm = 'Remove-Item -Recurse -Force -Path' %} {% capture rm-sdk %}Remove-Item -Recurse -Force -Path '{{dirinstall}}flutter'{% endcapture %} From 791e8f1c35831c8088f4e99d621d6bc480c48708 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:38:26 +1000 Subject: [PATCH 04/86] Bump site-shared from `777996f` to `d50b058` (#10693) --- site-shared | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site-shared b/site-shared index 777996f8f9..d50b05880a 160000 --- a/site-shared +++ b/site-shared @@ -1 +1 @@ -Subproject commit 777996f8f9ee179f666c59318d62e09c21251122 +Subproject commit d50b05880ad6405518e3a08255bcda5fa72bbf2a From c83ac9dd71e61ff93d3408f23ac5e347dd773549 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:38:49 +1000 Subject: [PATCH 05/86] Bump examples/codelabs from `0054456` to `9fb3fa0` (#10694) --- examples/codelabs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/codelabs b/examples/codelabs index 0054456824..9fb3fa060d 160000 --- a/examples/codelabs +++ b/examples/codelabs @@ -1 +1 @@ -Subproject commit 005445682420a00b10aa38f6d2e8ac53d877a897 +Subproject commit 9fb3fa060d04601553a816f0815ed7b9c5ba6b6d From fcf869e27969fb11d73f370520f97dd5373f6ecb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:39:07 +1000 Subject: [PATCH 06/86] Bump github/codeql-action from 3.25.6 to 3.25.7 (#10695) --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/scorecards-analysis.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a3adf021a8..77e1cc179a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@9fdb3e49720b44c48891d036bb502feb25684276 + uses: github/codeql-action/init@f079b8493333aace61c81488f8bd40919487bd9f with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -44,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@9fdb3e49720b44c48891d036bb502feb25684276 + uses: github/codeql-action/autobuild@f079b8493333aace61c81488f8bd40919487bd9f # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -58,4 +58,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@9fdb3e49720b44c48891d036bb502feb25684276 + uses: github/codeql-action/analyze@f079b8493333aace61c81488f8bd40919487bd9f diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index b3315f267f..fafc0110c1 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -50,6 +50,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@9fdb3e49720b44c48891d036bb502feb25684276 + uses: github/codeql-action/upload-sarif@f079b8493333aace61c81488f8bd40919487bd9f with: sarif_file: results.sarif From ca5a85f4e0050aca2c041a49c1068b3692309723 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:02:16 -0700 Subject: [PATCH 07/86] adds flutter.dev/go/routing-table-extraction (#10698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Description of what this PR is changing or adding, and why:_ _Issues fixed by this PR (if any):_ ## Presubmit checklist - [ ] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [ ] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [ ] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index f134b8d908..bc6c5c66cb 100644 --- a/firebase.json +++ b/firebase.json @@ -539,6 +539,7 @@ { "source": "/go/respecting-tabcontroller-animateto-duration", "destination": "https://docs.google.com/document/d/1wzSzUYstDM-Kg5kwskyXcEUX7QTb-lBOso7Z5ebrCTk/edit", "type": 301 }, { "source": "/go/restoring-anonymous-routes", "destination": "https://docs.google.com/document/d/1vnjDruoiDz0eEd4eVzg3IS6W_LRaFxNSlKWtU6iXp2M/edit", "type": 301 }, { "source": "/go/router-api-improvement", "destination": "https://docs.google.com/document/d/1kbUPagtDl30jqYAq-mDMdd-ftHm3q9AMq55ufZCo9lE/edit?usp=sharing&resourcekey=0-JBqYh_UD3h9OSA8NS5OO4g", "type": 301 }, + { "source": "/go/routing-table-extraction", "destination": "https://docs.google.com/document/d/1Oy7GR0Wo9ETctNMHK5oOjHJZJ3cwCFIcRswLYgE0O0E/edit?usp=sharing", "type": 301 }, { "source": "/go/analyze-flutter-in-runtime", "destination": "https://docs.google.com/document/d/1VZOv9NsmNeXaqM9h9EjKTz5cg7lEsA623XBfbojXU5U/edit?usp=sharing", "type": 301 }, { "source": "/go/rfc-32-bit-ios-support", "destination": "https://docs.google.com/document/d/1Xz8B2w42ZGmrSdvQHo6LVLhiSZBIxnHxZxoZ-8oyRUc/edit", "type": 301 }, { "source": "/go/rfc-32-bit-ios-unsupported", "destination": "https://docs.google.com/document/d/1cc5EOsuTlbf4dTDTwmkD3aKjS8XEbVCIqi9BFct9XHM/edit?resourcekey=0-Iv0gXDx7nSDCe3YDfxDKqw", "type": 301 }, From b6af70700133b17968a7a4484455b300f9111c6b Mon Sep 17 00:00:00 2001 From: "Shams Zakhour (ignore Sfshaza)" <44418985+sfshaza2@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:56:07 -0700 Subject: [PATCH 08/86] Clarifying "importantState". (#10697) Fixes https://github.com/flutter/website/issues/10683 cc @sethladd --- .../resources/architectural-overview.md | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/src/content/resources/architectural-overview.md b/src/content/resources/architectural-overview.md index feb2f0951a..ed855c3de8 100644 --- a/src/content/resources/architectural-overview.md +++ b/src/content/resources/architectural-overview.md @@ -447,26 +447,34 @@ existing state objects when appropriate. So, if many widgets can contain state, how is state managed and passed around the system? -As with any other class, you can use a constructor in a widget to initialize its -data, so a `build()` method can ensure that any child widget is instantiated -with the data it needs: +As with any other class, +you can use a constructor in a widget to initialize its data, +so a `build()` method can ensure that any child widget +is instantiated with the data it needs: ```dart @override Widget build(BuildContext context) { - return ContentWidget(importantState); + return ContentWidget([!importantState!]); } ``` -As widget trees get deeper, however, passing state information up and down the -tree hierarchy becomes cumbersome. So, a third widget type, -[`InheritedWidget`]({{site.api}}/flutter/widgets/InheritedWidget-class.html), -provides an easy way to grab data from a shared ancestor. You can use -`InheritedWidget` to create a state widget that wraps a common ancestor in the +Where `importantState` is a placeholder for the class +that contains the state important to the `Widget`. + +As widget trees get deeper, however, +passing state information up and down the +tree hierarchy becomes cumbersome. +So, a third widget type, [`InheritedWidget`][], +provides an easy way to grab data from a shared ancestor. +You can use `InheritedWidget` to create a state widget +that wraps a common ancestor in the widget tree, as shown in this example: ![Inherited widgets](/assets/images/docs/arch-overview/inherited-widget.png){:width="50%"} +[`InheritedWidget`]: {{site.api}}/flutter/widgets/InheritedWidget-class.html + Whenever one of the `ExamWidget` or `GradeWidget` objects needs data from `StudentState`, it can now access it with a command such as: @@ -474,20 +482,26 @@ Whenever one of the `ExamWidget` or `GradeWidget` objects needs data from final studentState = StudentState.of(context); ``` -The `of(context)` call takes the build context (a handle to the current widget -location), and returns [the nearest ancestor in the -tree]({{site.api}}/flutter/widgets/BuildContext/dependOnInheritedWidgetOfExactType.html) -that matches the `StudentState` type. `InheritedWidget`s also offer an -`updateShouldNotify()` method, which Flutter calls to determine whether a state +The `of(context)` call takes the build context +(a handle to the current widget location), +and returns [the nearest ancestor in the tree][] +that matches the `StudentState` type. +`InheritedWidget`s also offer an `updateShouldNotify()` method, +which Flutter calls to determine whether a state change should trigger a rebuild of child widgets that use it. -Flutter itself uses `InheritedWidget` extensively as part of the framework for -shared state, such as the application's _visual theme_, which includes -[properties like color and type -styles]({{site.api}}/flutter/material/ThemeData-class.html) that are -pervasive throughout an application. The `MaterialApp` `build()` method inserts -a theme in the tree when it builds, and then deeper in the hierarchy a widget -can use the `.of()` method to look up the relevant theme data, for example: +[the nearest ancestor in the tree]: {{site.api}}/flutter/widgets/BuildContext/dependOnInheritedWidgetOfExactType.html + +Flutter itself uses `InheritedWidget` extensively as part +of the framework for shared state, +such as the application's _visual theme_, which includes +[properties like color and type styles][] that are +pervasive throughout an application. +The `MaterialApp` `build()` method inserts a theme +in the tree when it builds, and then deeper in the hierarchy a widget +can use the `.of()` method to look up the relevant theme data. + +For example: ```dart @@ -500,6 +514,8 @@ Container( ); ``` +[properties like color and type styles]: {{site.api}}/flutter/material/ThemeData-class.html + As applications grow, more advanced state management approaches that reduce the ceremony of creating and using stateful widgets become more attractive. Many Flutter apps use utility packages like From 38c90affb76d3592619e6d9b2c3ed7ce8f1e9e4e Mon Sep 17 00:00:00 2001 From: Matt Solle <43831668+mattsolle@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:27:43 -0400 Subject: [PATCH 09/86] Fix spelling mistake on restorable state (#10702) Simple spelling issue/fix that I identified while going through some of the documentation in place for the restorationScopeId piece for new apps created with the `--template=skeleton` flag. --- .../platform-integration/android/restore-state-android.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/restore-state-android.md b/src/content/platform-integration/android/restore-state-android.md index ac5be5c9ae..92b6f86e79 100644 --- a/src/content/platform-integration/android/restore-state-android.md +++ b/src/content/platform-integration/android/restore-state-android.md @@ -68,7 +68,7 @@ You can enable state restoration with just a few tasks: 3. If you use any Navigator API (like `push`, `pushNamed`, and so on) migrate to the API that has "restorable" in the name - (`restorablePush`, `resstorablePushNamed`, and so on) + (`restorablePush`, `restorablePushNamed`, and so on) to restore the navigation stack. Other considerations: From 551ffccc492feaec087e3c2146ec81db708457b5 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 4 Jun 2024 19:33:36 -0500 Subject: [PATCH 10/86] Optimize images as part of production builds (#10391) Use 11ty's first-party [image transformation plugin](https://www.11ty.dev/docs/plugins/image/) to automatically optimize images, convert them to `png`, `webp`, and `avif`, and then transform the site HTML to use the [`` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture) to select the best one for the user. This only runs in production deploy builds to reduce serving time. Also applies lazy loading and async decoding to all images, even when serving without optimizations. The transform also adds a hash of the image, allowing us to expand caching for images in Firebase hosting. To account for the transformed HTML structure, some minor HTML and CSS changes were needed as well. Overall, this reduces page load time on pages that use images, and reduces unnecessary downloads that were due to a relatively short cache time for images. On a page with a few images, I saw lighthouse perf score increases from 5-15 points. Closes https://github.com/flutter/website/issues/6487 Closes https://github.com/flutter/website/issues/9527 as this plugin also validates `alt` is always specified --- eleventy.config.js | 37 +- firebase.json | 7 + package.json | 5 +- pnpm-lock.yaml | 422 ++++++++++++++++-- src/_layouts/base.html | 6 +- src/_sass/base/_base.scss | 38 +- src/_sass/components/_header.scss | 5 + src/content/tos/index.md | 2 +- .../responsive/building-adaptive-apps.md | 11 +- 9 files changed, 485 insertions(+), 48 deletions(-) diff --git a/eleventy.config.js b/eleventy.config.js index f5b3f892b8..d5aa296053 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -16,6 +16,7 @@ import { configureHighlighting } from './src/_11ty/plugins/highlight.js'; import minifier from 'html-minifier-terser'; import yaml from 'js-yaml'; import { EleventyRenderPlugin } from '@11ty/eleventy'; +import { eleventyImageTransformPlugin } from '@11ty/eleventy-img'; import * as path from 'node:path'; import * as sass from 'sass'; @@ -27,6 +28,7 @@ import * as sass from 'sass'; */ export default function (eleventyConfig) { const isProduction = process.env.PRODUCTION === 'true'; + const shouldOptimize = process.env.OPTIMIZE === 'true'; eleventyConfig.on('eleventy.before', async () => { await configureHighlighting(markdown); @@ -123,7 +125,7 @@ ${content} } const result = sass.compileString(inputContent, { - style: isProduction ? 'compressed' : 'expanded', + style: shouldOptimize ? 'compressed' : 'expanded', quietDeps: true, loadPaths: [parsedPath.dir, 'src/_sass'], }); @@ -153,7 +155,7 @@ ${content} filter: (path) => path.includes('src') || path.includes('images'), }); - if (isProduction) { + if (shouldOptimize) { // If building for production, minify/optimize the HTML output. // Doing so during serving isn't worth the extra build time. eleventyConfig.addTransform('minify-html', async function (content) { @@ -170,6 +172,37 @@ ${content} return content; }); + + // Optimize all images, generate an avif, webp, and png version, + // and indicate they should be lazily loaded. + // Save in `_site/assets/images` and update links to there. + eleventyConfig.addPlugin(eleventyImageTransformPlugin, { + extensions: 'html', + formats: ['avif', 'webp', 'png', 'svg'], + svgShortCircuit: true, + widths: ['auto'], + defaultAttributes: { + loading: 'lazy', + decoding: 'async', + }, + urlPath: '/assets/images/', + outputDir: '_site/assets/images/', + }); + } else { + // To be more consistent with the production build, + // don't optimize images but still indicate they should be lazily loaded. + // Then save in `_site/assets/images` and update links to there. + eleventyConfig.addPlugin(eleventyImageTransformPlugin, { + extensions: 'html', + formats: ['auto'], + widths: ['auto'], + defaultAttributes: { + loading: 'lazy', + decoding: 'async', + }, + urlPath: '/assets/images/', + outputDir: '_site/assets/images/', + }); } eleventyConfig.setQuietMode(true); diff --git a/firebase.json b/firebase.json index bc6c5c66cb..1b30eaa56c 100644 --- a/firebase.json +++ b/firebase.json @@ -647,6 +647,13 @@ { "key": "Access-Control-Allow-Origin", "value": "*" } ] }, + { + "source": "/assets/images/*.@(jpg|jpeg|png|webp|avif)", + "headers": [ + { "key": "Cache-Control", "value": "max-age=604800" }, + { "key": "Access-Control-Allow-Origin", "value": "*" } + ] + }, { "source": "**", "headers": [ diff --git a/package.json b/package.json index 967bc95a66..03d022bb9c 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,14 @@ "scripts": { "serve": "PRODUCTION=false eleventy --serve", "build-site-for-staging": "PRODUCTION=false eleventy", - "build-site-for-production": "PRODUCTION=true eleventy" + "build-site-for-production": "PRODUCTION=true OPTIMIZE=true eleventy" }, "dependencies": { "bootstrap-scss": "^4.6.2" }, "devDependencies": { "@11ty/eleventy": "3.0.0-alpha.10", + "@11ty/eleventy-img": "5.0.0-beta.4", "diff2html": "^3.4.48", "firebase-tools": "^13.10.2", "hast-util-from-html": "^2.0.1", @@ -36,7 +37,7 @@ "markdown-it-container": "^4.0.0", "markdown-it-deflist": "^3.0.0", "markdown-it-table": "^4.1.1", - "sass": "^1.77.3", + "sass": "^1.77.4", "shiki": "^1.6.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68832dc89c..c178c0505c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ importers: '@11ty/eleventy': specifier: 3.0.0-alpha.10 version: 3.0.0-alpha.10 + '@11ty/eleventy-img': + specifier: 5.0.0-beta.4 + version: 5.0.0-beta.4(encoding@0.1.13) diff2html: specifier: ^3.4.48 version: 3.4.48 @@ -55,8 +58,8 @@ importers: specifier: ^4.1.1 version: 4.1.1 sass: - specifier: ^1.77.3 - version: 1.77.3 + specifier: ^1.77.4 + version: 1.77.4 shiki: specifier: ^1.6.1 version: 1.6.1 @@ -74,6 +77,14 @@ packages: engines: {node: '>=18'} hasBin: true + '@11ty/eleventy-fetch@4.0.1': + resolution: {integrity: sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==} + engines: {node: '>=14'} + + '@11ty/eleventy-img@5.0.0-beta.4': + resolution: {integrity: sha512-vuizGnW8mgW+O4iP6CbOB4CCKq3W2GiY+Ev9112qTCra+qau+xxhn9yrnyI3621sC/hEzKQI9MUFRZ2x+F8XnQ==} + engines: {node: '>=18'} + '@11ty/eleventy-plugin-bundle@2.0.2': resolution: {integrity: sha512-zGyPp1g6bi+VC2I5ylwj4w29nivDmx4Uki5gWY6v3MT/1muK0JTtnc1KOMC7yUurv6YwtwdiLYyFK2eFyKv2wg==} engines: {node: '>=18'} @@ -109,6 +120,9 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@google-cloud/cloud-sql-connector@1.3.0': resolution: {integrity: sha512-PPJgqTliwkpdC3iMWgG/rjh17VGL/UEYLyvcMtfWCUtFQ+DQFr7UV8gxrDKM7H0d0yEjai32uBkd4fMuijPKjQ==} engines: {node: '>=14'} @@ -129,8 +143,8 @@ packages: resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} engines: {node: '>=14'} - '@google-cloud/pubsub@4.4.0': - resolution: {integrity: sha512-1eiiAZUFhxcOqKPVwZarc3ghXuhoc3S7z5BgNrxqdirJ/MYr3IjQVTA7Lq2dAAsDuWms1LBN897rbnEGW9PpfA==} + '@google-cloud/pubsub@4.4.1': + resolution: {integrity: sha512-OsNsadtM+/EhHijc8pIgf+GaqWIZIaizhq6p2mzK+lB7BRziV66ByMDO6EEtyqcdmqYh6MbQ39RZMEQocZsxPQ==} engines: {node: '>=14.0.0'} '@googleapis/sqladmin@16.1.0': @@ -146,6 +160,119 @@ packages: engines: {node: '>=6'} hasBin: true + '@img/sharp-darwin-arm64@0.33.4': + resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.4': + resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.2': + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.2': + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.2': + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.2': + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.2': + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.2': + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.4': + resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.4': + resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.4': + resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} + engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.4': + resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.4': + resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.4': + resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.4': + resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.4': + resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.4': + resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -290,8 +417,8 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@20.12.13': - resolution: {integrity: sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==} + '@types/node@20.13.0': + resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} '@types/request@2.48.12': resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} @@ -526,6 +653,10 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -653,6 +784,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -794,8 +929,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -855,6 +990,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev-ip@1.0.1: resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} engines: {node: '>= 0.8.0'} @@ -898,6 +1037,9 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -1015,6 +1157,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events-listener@1.1.0: resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==} @@ -1088,6 +1233,13 @@ packages: engines: {node: '>=18.0.0 || >=20.0.0'} hasBin: true + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -1332,6 +1484,11 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} @@ -1525,6 +1682,9 @@ packages: json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-helpfulerror@1.0.3: resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} @@ -1560,6 +1720,9 @@ packages: jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -1994,6 +2157,10 @@ packages: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2002,10 +2169,18 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + p-throttle@5.1.0: resolution: {integrity: sha512-+N+s2g01w1Zch4D0K3OpnPDqLOKmLcQ4BvIFq3JC0K29R28vUOjWpO+OJZBNt8X9i3pFCksZJZ0YXkUGjaFE6g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + pac-proxy-agent@7.0.1: resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} engines: {node: '>= 14'} @@ -2214,6 +2389,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} @@ -2337,8 +2515,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.77.3: - resolution: {integrity: sha512-WJHo+jmFp0dwRuymPmIovuxHaBntcCyja5hCB0yYY9wWrViEp4kF5Cdai98P72v6FzroPuABqu+ddLMbQWmwzA==} + sass@1.77.4: + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} engines: {node: '>=14.0.0'} hasBin: true @@ -2381,6 +2559,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.33.4: + resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -2839,7 +3021,7 @@ snapshots: dependencies: '@11ty/eleventy-utils': 1.0.2 chokidar: 3.6.0 - debug: 4.3.4 + debug: 4.3.5 dev-ip: 1.0.1 finalhandler: 1.2.0 mime: 3.0.0 @@ -2855,9 +3037,33 @@ snapshots: - supports-color - utf-8-validate + '@11ty/eleventy-fetch@4.0.1(encoding@0.1.13)': + dependencies: + debug: 4.3.5 + flat-cache: 3.2.0 + node-fetch: 2.7.0(encoding@0.1.13) + p-queue: 6.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@11ty/eleventy-img@5.0.0-beta.4(encoding@0.1.13)': + dependencies: + '@11ty/eleventy-fetch': 4.0.1(encoding@0.1.13) + '@11ty/eleventy-utils': 1.0.2 + brotli-size: 4.0.0 + debug: 4.3.5 + entities: 4.5.0 + image-size: 1.1.1 + p-queue: 6.6.2 + sharp: 0.33.4 + transitivePeerDependencies: + - encoding + - supports-color + '@11ty/eleventy-plugin-bundle@2.0.2': dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -2878,7 +3084,7 @@ snapshots: bcp-47-normalize: 2.3.0 chokidar: 3.6.0 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 dependency-graph: 1.0.0 fast-glob: 3.3.2 graceful-fs: 4.2.11 @@ -2934,6 +3140,11 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 + '@emnapi/runtime@1.2.0': + dependencies: + tslib: 2.6.2 + optional: true + '@google-cloud/cloud-sql-connector@1.3.0(encoding@0.1.13)': dependencies: '@googleapis/sqladmin': 16.1.0(encoding@0.1.13) @@ -2955,7 +3166,7 @@ snapshots: '@google-cloud/promisify@4.0.0': {} - '@google-cloud/pubsub@4.4.0(encoding@0.1.13)': + '@google-cloud/pubsub@4.4.1(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/precise-date': 4.0.0 @@ -2994,6 +3205,81 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 + '@img/sharp-darwin-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + optional: true + + '@img/sharp-darwin-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.2': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.2': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + optional: true + + '@img/sharp-linux-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + optional: true + + '@img/sharp-linux-arm@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + optional: true + + '@img/sharp-linux-s390x@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + optional: true + + '@img/sharp-linux-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + optional: true + + '@img/sharp-wasm32@0.33.4': + dependencies: + '@emnapi/runtime': 1.2.0 + optional: true + + '@img/sharp-win32-ia32@0.33.4': + optional: true + + '@img/sharp-win32-x64@0.33.4': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3133,14 +3419,14 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@20.12.13': + '@types/node@20.13.0': dependencies: undici-types: 5.26.5 '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 20.12.13 + '@types/node': 20.13.0 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 @@ -3172,13 +3458,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -3393,6 +3679,10 @@ snapshots: dependencies: fill-range: 7.1.1 + brotli-size@4.0.0: + dependencies: + duplexer: 0.1.1 + buffer-crc32@0.2.13: {} buffer-equal-constant-time@1.0.1: {} @@ -3532,6 +3822,11 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} colors@1.0.3: {} @@ -3665,7 +3960,7 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.4: + debug@4.3.5: dependencies: ms: 2.1.2 @@ -3714,6 +4009,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.0.3: {} + dev-ip@1.0.1: {} devlop@1.1.0: @@ -3760,6 +4057,8 @@ snapshots: dependencies: is-obj: 2.0.0 + duplexer@0.1.1: {} + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 @@ -3852,6 +4151,8 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} + events-listener@1.1.0: {} exegesis-express@4.0.0: @@ -3992,7 +4293,7 @@ snapshots: firebase-tools@13.10.2(encoding@0.1.13): dependencies: '@google-cloud/cloud-sql-connector': 1.3.0(encoding@0.1.13) - '@google-cloud/pubsub': 4.4.0(encoding@0.1.13) + '@google-cloud/pubsub': 4.4.1(encoding@0.1.13) abort-controller: 3.0.0 ajv: 6.12.6 archiver: 5.3.2 @@ -4064,6 +4365,14 @@ snapshots: - supports-color - utf-8-validate + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + fn.name@1.1.0: {} foreground-child@3.1.1: @@ -4154,7 +4463,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -4391,28 +4700,28 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -4427,6 +4736,10 @@ snapshots: ieee754@1.2.1: {} + image-size@1.1.1: + dependencies: + queue: 6.0.2 + immutable@4.3.6: {} import-lazy@2.1.0: {} @@ -4602,6 +4915,8 @@ snapshots: dependencies: bignumber.js: 9.1.2 + json-buffer@3.0.1: {} + json-parse-helpfulerror@1.0.3: dependencies: jju: 1.4.0 @@ -4655,6 +4970,10 @@ snapshots: jwa: 2.0.0 safe-buffer: 5.2.1 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@4.1.5: {} @@ -5073,6 +5392,8 @@ snapshots: p-defer@3.0.0: {} + p-finally@1.0.0: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5082,13 +5403,22 @@ snapshots: aggregate-error: 3.1.0 optional: true + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + p-throttle@5.1.0: {} + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + pac-proxy-agent@7.0.1: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.5 get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 @@ -5255,7 +5585,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.12.13 + '@types/node': 20.13.0 long: 5.2.3 proxy-addr@2.0.7: @@ -5266,7 +5596,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 @@ -5305,6 +5635,10 @@ snapshots: queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + railroad-diagrams@1.0.0: {} randexp@0.4.6: @@ -5452,7 +5786,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.77.3: + sass@1.77.4: dependencies: chokidar: 3.6.0 immutable: 4.3.6 @@ -5513,6 +5847,32 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.33.4: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.4 + '@img/sharp-darwin-x64': 0.33.4 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.4 + '@img/sharp-linux-arm64': 0.33.4 + '@img/sharp-linux-s390x': 0.33.4 + '@img/sharp-linux-x64': 0.33.4 + '@img/sharp-linuxmusl-arm64': 0.33.4 + '@img/sharp-linuxmusl-x64': 0.33.4 + '@img/sharp-wasm32': 0.33.4 + '@img/sharp-win32-ia32': 0.33.4 + '@img/sharp-win32-x64': 0.33.4 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -5553,7 +5913,7 @@ snapshots: socks-proxy-agent@8.0.3: dependencies: agent-base: 7.1.1 - debug: 4.3.4 + debug: 4.3.5 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -5806,7 +6166,7 @@ snapshots: universal-analytics@0.5.3: dependencies: - debug: 4.3.4 + debug: 4.3.5 uuid: 8.3.2 transitivePeerDependencies: - supports-color diff --git a/src/_layouts/base.html b/src/_layouts/base.html index 3dd672be4f..10ae9b96f8 100644 --- a/src/_layouts/base.html +++ b/src/_layouts/base.html @@ -6,8 +6,8 @@ {% if short-title %}{{short-title}}{% else %}{{title}}{% endif %} | {{site.title}} - - + + @@ -50,7 +50,7 @@ - + {% unless strip_fonts == true -%} diff --git a/src/_sass/base/_base.scss b/src/_sass/base/_base.scss index be07277ede..d2665e3e7c 100644 --- a/src/_sass/base/_base.scss +++ b/src/_sass/base/_base.scss @@ -23,10 +23,29 @@ dd { margin-bottom: .75rem; } -.card-deck.card-deck--responsive { - .card { - flex: 0 0 calc((100% / 3) - #{bootstrap.bs-spacer(4)}); - margin-bottom: bootstrap.bs-spacer(4); +img { + max-width: 100%; + + &[width] { + width: auto; + } + + &[width][height] { + height: auto; + } +} + +.card-deck { + &.card-deck--responsive { + .card { + flex: 0 0 calc((100% / 3) - #{bootstrap.bs-spacer(4)}); + margin-bottom: bootstrap.bs-spacer(4); + } + } + + .card-body img { + width: 72px; + height: 72px; } } @@ -200,6 +219,17 @@ dd { } } +.list-image { + width: 48px; + margin: 0.25rem; +} + +.text-icon { + margin: 0 0.25rem; + width: 20px; + height: 20px; +} + .site-illustration { // Illustrations should be visible in their entirety without the need // for scrolling up and down. diff --git a/src/_sass/components/_header.scss b/src/_sass/components/_header.scss index 3e055e47a5..3e04bc6716 100644 --- a/src/_sass/components/_header.scss +++ b/src/_sass/components/_header.scss @@ -29,6 +29,11 @@ .navbar-brand { margin-right: auto; + + img { + width: 129px; + height: 37px; + } } .nav-link { diff --git a/src/content/tos/index.md b/src/content/tos/index.md index c9603bc5ba..dab0859794 100644 --- a/src/content/tos/index.md +++ b/src/content/tos/index.md @@ -9,7 +9,7 @@ visiting the Website, you consent to be bound by Google's general [Terms of Service][] and [Privacy Policy][]. The "Flutter" name and the Flutter logo -Flutter logo +Flutter logo (the "Flutter Marks") are trademarks owned by Google and are not included within the assets licensed under the Creative Commons Attribution 4.0 International License. Google grants you a non-transferable, diff --git a/src/content/ui/layout/responsive/building-adaptive-apps.md b/src/content/ui/layout/responsive/building-adaptive-apps.md index 7c715043f7..b3361262f9 100644 --- a/src/content/ui/layout/responsive/building-adaptive-apps.md +++ b/src/content/ui/layout/responsive/building-adaptive-apps.md @@ -1,6 +1,7 @@ --- title: Building adaptive apps description: Some considerations and instructions on how to build adaptive apps to run on a variety of platforms. +sitemap: false --- @@ -148,7 +149,7 @@ are set to 0.0, but you can set the densities to any negative or positive value that you want. By switching between different densities, you can easily adjust your UI: -![Adaptive scaffold](/assets/images/docs/development/ui/layout/adaptive_scaffold.gif){:width="100%"} +![Adaptive scaffold](/assets/images/docs/ui/adaptive-responsive/adaptive_scaffold.gif){:width="100%"} To set a custom visual density, inject the density into your `MaterialApp` theme: @@ -468,7 +469,7 @@ while the app is running to preview various screen sizes. This, combined with hot reload, can greatly accelerate the development of a responsive UI. -![Adaptive scaffold 2](/assets/images/docs/development/ui/layout/adaptive_scaffold2.gif){:width="100%"} +![Adaptive scaffold 2](/assets/images/docs/ui/adaptive-responsive/adaptive_scaffold2.gif){:width="100%"} ### Solve touch first @@ -1008,7 +1009,7 @@ the title bar of your app window, adding a logo for stronger branding or contextual controls to help save vertical space in your main UI. -![Samples of title bars](/assets/images/docs/development/ui/layout/titlebar.png){:width="100%"} +![Samples of title bars](/assets/images/docs/ui/adaptive-responsive/titlebar.png){:width="100%"} This isn't supported directly in Flutter, but you can use the [`bits_dojo`][] package to disable the native title bars, @@ -1123,9 +1124,9 @@ return Row( ); ``` -![Sample of embedded image](/assets/images/docs/development/ui/layout/embed_image1.png){:width="75%"} +![Sample of embedded image](/assets/images/docs/ui/adaptive-responsive/embed_image1.png){:width="75%"} -![Sample of embedded image](/assets/images/docs/development/ui/layout/embed_image2.png){:width="90%"} +![Sample of embedded image](/assets/images/docs/ui/adaptive-responsive/embed_image2.png){:width="90%"} #### Menu bar From 726d0706632dcf4367435727850fbd9957cb9ed6 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 4 Jun 2024 21:06:24 -0500 Subject: [PATCH 11/86] Fix a few image sizing issues (#10708) Fixes a few image sizing issues from https://github.com/flutter/website/commit/551ffccc492feaec087e3c2146ec81db708457b5. --- src/_sass/components/_content.scss | 3 ++- src/_sass/components/_footer.scss | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_sass/components/_content.scss b/src/_sass/components/_content.scss index 00bba73618..d036f705fa 100644 --- a/src/_sass/components/_content.scss +++ b/src/_sass/components/_content.scss @@ -26,9 +26,10 @@ img, iframe { max-width: 100%; + max-height: 20rem; } - > img { + > img, > p > img { margin-bottom: 1rem; } } diff --git a/src/_sass/components/_footer.scss b/src/_sass/components/_footer.scss index d576e14c4a..dc6d28d98d 100644 --- a/src/_sass/components/_footer.scss +++ b/src/_sass/components/_footer.scss @@ -8,6 +8,11 @@ position: relative; z-index: bootstrap.$zindex-sticky; + &__logo { + height: 100px; + width: 81px; + } + &__wrapper { align-items: center; display: flex; From 9439f2d381c3399a60e64a6d8dfc29490f20400f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:02:30 +1000 Subject: [PATCH 12/86] Bump examples/codelabs from `9fb3fa0` to `c0a9893` (#10709) --- examples/codelabs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/codelabs b/examples/codelabs index 9fb3fa060d..c0a9893182 160000 --- a/examples/codelabs +++ b/examples/codelabs @@ -1 +1 @@ -Subproject commit 9fb3fa060d04601553a816f0815ed7b9c5ba6b6d +Subproject commit c0a9893182e7c39def43558965a904eb623848a7 From 2da40bd389b32fb2e6b1a05d95b41c1274ed50c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:06:28 -0500 Subject: [PATCH 13/86] Bump github/codeql-action from 3.25.7 to 3.25.8 (#10710) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.25.7 to 3.25.8.
Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

Note that the only difference between v2 and v3 of the CodeQL Action is the node version they support, with v3 running on node 20 while we continue to release v2 to support running on node 16. For example 3.22.11 was the first v3 release and is functionally identical to 2.22.11. This approach ensures an easy way to track exactly which features are included in different versions, indicated by the minor and patch version numbers.

[UNRELEASED]

No user facing changes.

3.25.8 - 04 Jun 2024

  • Update default CodeQL bundle version to 2.17.4. #2321

3.25.7 - 31 May 2024

  • We are rolling out a feature in May/June 2024 that will reduce the Actions cache usage of the Action by keeping only the newest TRAP cache for each language. #2306

3.25.6 - 20 May 2024

  • Update default CodeQL bundle version to 2.17.3. #2295

3.25.5 - 13 May 2024

  • Add a compatibility matrix of supported CodeQL Action, CodeQL CLI, and GitHub Enterprise Server versions to the https://github.com/github/codeql-action/blob/main/README.md. #2273
  • Avoid printing out a warning for a missing on.push trigger when the CodeQL Action is triggered via a workflow_call event. #2274
  • The tools: latest input to the init Action has been renamed to tools: linked. This option specifies that the Action should use the tools shipped at the same time as the Action. The old name will continue to work for backwards compatibility, but we recommend that new workflows use the new name. #2281

3.25.4 - 08 May 2024

  • Update default CodeQL bundle version to 2.17.2. #2270

3.25.3 - 25 Apr 2024

  • Update default CodeQL bundle version to 2.17.1. #2247
  • Workflows running on macos-latest using CodeQL CLI versions before v2.15.1 will need to either upgrade their CLI version to v2.15.1 or newer, or change the platform to an Intel MacOS runner, such as macos-12. ARM machines with SIP disabled, including the newest macos-latest image, are unsupported for CLI versions before 2.15.1. #2261

3.25.2 - 22 Apr 2024

No user facing changes.

3.25.1 - 17 Apr 2024

  • We are rolling out a feature in April/May 2024 that improves the reliability and performance of analyzing code when analyzing a compiled language with the autobuild build mode. #2235
  • Fix a bug where the init Action would fail if --overwrite was specified in CODEQL_ACTION_EXTRA_OPTIONS. #2245

3.25.0 - 15 Apr 2024

  • The deprecated feature for extracting dependencies for a Python analysis has been removed. #2224

... (truncated)

Commits
  • 2e230e8 Merge pull request #2323 from github/update-v3.25.8-18b06dd1d
  • 66ad891 Update changelog for v3.25.8
  • 18b06dd Merge pull request #2322 from github/dependabot/npm_and_yarn/npm-10d82c2911
  • 200dd0c Update checked-in dependencies
  • 2bb35ea bump the npm group with 4 updates
  • 9c15e42 Merge pull request #2321 from github/update-bundle/codeql-bundle-v2.17.4
  • 98e7922 Merge branch 'main' into update-bundle/codeql-bundle-v2.17.4
  • 440350b Add changelog note
  • d4fcc8b Update default bundle to codeql-bundle-v2.17.4
  • add199b Merge pull request #2320 from github/angelapwen/use-linked-in-tests
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.25.7&new-version=3.25.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/scorecards-analysis.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 77e1cc179a..d35ec65015 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f079b8493333aace61c81488f8bd40919487bd9f + uses: github/codeql-action/init@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -44,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@f079b8493333aace61c81488f8bd40919487bd9f + uses: github/codeql-action/autobuild@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -58,4 +58,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f079b8493333aace61c81488f8bd40919487bd9f + uses: github/codeql-action/analyze@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index fafc0110c1..a15eacc66f 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -50,6 +50,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f079b8493333aace61c81488f8bd40919487bd9f + uses: github/codeql-action/upload-sarif@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff with: sarif_file: results.sarif From bd5331170602bf0f57d8260f7f11896fc2a561a3 Mon Sep 17 00:00:00 2001 From: Jay Mehta Date: Wed, 5 Jun 2024 22:21:31 +0530 Subject: [PATCH 14/86] Fix text alignment with respect to video (#10711) Brought text below the video instead of on the right side of the video This PR is not changing anything, only fixing this weird alignment issue ![image](https://github.com/flutter/website/assets/31812582/7d5485af-c307-4ae5-88df-06597e42e9fd) After fix: ![image](https://github.com/flutter/website/assets/31812582/8ee100fa-bc0b-4115-83cc-c493ae2f6948) I have not created a seperate issue for this small problem. --- src/content/ui/adaptive-responsive/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/ui/adaptive-responsive/index.md b/src/content/ui/adaptive-responsive/index.md index df282e8078..48acd5cc13 100644 --- a/src/content/ui/adaptive-responsive/index.md +++ b/src/content/ui/adaptive-responsive/index.md @@ -71,5 +71,6 @@ You might also check out the Google I/O 2024 talk about this subject. + How to build Adaptive UI with Flutter ::: From 0799166a7ef859ac4b757969e6f3c1f35f2d5bf0 Mon Sep 17 00:00:00 2001 From: Anthony Sansone Date: Thu, 6 Jun 2024 02:37:12 -0500 Subject: [PATCH 15/86] Fixes PATH variance, filename replacement script (#10706) Fixes #10662 --- src/_data/shells.yml | 14 ++++++------- .../docs/install/flutter/download.md | 21 +++++++++---------- src/content/assets/js/archive.js | 13 ++++++------ 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/_data/shells.yml b/src/_data/shells.yml index 28b5a49d20..8a048ec9aa 100644 --- a/src/_data/shells.yml +++ b/src/_data/shells.yml @@ -1,14 +1,14 @@ - name: bash - set-path: echo 'export PATH="$HOME/development/flutter/bin:$PATH"' >> ~/.bash_profile + set-path: echo 'export PATH="/usr/bin/flutter/bin:$PATH"' >> ~/.bash_profile - name: zsh - set-path: echo 'export PATH="$HOME/development/flutter/bin:$PATH"' >> ~/.zshenv + set-path: echo 'export PATH="/usr/bin/flutter/bin:$PATH"' >> ~/.zshenv - name: fish - set-path: fish_add_path -g -p $HOME/development/flutter/bin + set-path: fish_add_path -g -p /usr/bin/flutter/bin - name: csh - set-path: echo 'setenv PATH "$HOME/development/flutter/bin:$PATH"' >> ~/.cshrc + set-path: echo 'setenv PATH "/usr/bin/flutter/bin:$PATH"' >> ~/.cshrc - name: tcsh - set-path: echo 'setenv PATH "$HOME/development/flutter/bin:$PATH"' >> ~/.tcshrc + set-path: echo 'setenv PATH "/usr/bin/flutter/bin:$PATH"' >> ~/.tcshrc - name: ksh - set-path: echo 'export PATH="$HOME/development/flutter/bin:$PATH"' >> ~/.profile + set-path: echo 'export PATH="/usr/bin/flutter/bin:$PATH"' >> ~/.profile - name: sh - set-path: echo 'export PATH="$HOME/development/flutter/bin:$PATH"' >> ~/.profile + set-path: echo 'export PATH="/usr/bin/flutter/bin:$PATH"' >> ~/.profile diff --git a/src/_includes/docs/install/flutter/download.md b/src/_includes/docs/install/flutter/download.md index 8c0abdbc3f..bc91936f5c 100644 --- a/src/_includes/docs/install/flutter/download.md +++ b/src/_includes/docs/install/flutter/download.md @@ -8,17 +8,17 @@ {% assign path='C:\\user\\{username}\\dev' %} {% assign flutter-path='C:\\user\\{username}\\dev\\flutter' %} {% assign terminal='PowerShell' %} - {% assign prompt='C:>' %} + {% assign prompt='PS C:\\>' %} {% assign prompt2=path | append: '>' %} {% assign diroptions='`%USERPROFILE%` (`C:\\Users\\{username}`) or `%LOCALAPPDATA%` (`C:\\Users\\{username}\\AppData\\Local`)' %} {% assign dirinstall='`%USERPROFILE%\\dev\\`' %} {% assign dirdl='%USERPROFILE%\\Downloads' %} {% assign ps-dir-dl='$env:USERPROFILE\\Downloads\\' %} {% assign ps-dir-target='$env:USERPROFILE\\dev\\' %} - {% capture uz -%} - {{prompt}} Expand-Archive ` - –Path {{ps-dir-dl}}flutter_sdk_v1.0.0.zip ` - -Destination {{ps-dir-target}} + {% capture uz %} + {{prompt}} Expand-Archive ` + –Path {{ps-dir-dl}}flutter_sdk_v1.0.0.zip ` + -Destination {{ps-dir-target}} {%- endcapture %} {% when "macOS" -%} {% assign diroptions='`~/development/`' %} @@ -27,11 +27,11 @@ {% assign path='~/development/' %} {% assign flutter-path='~/development/flutter' %} {% assign terminal='the Terminal' %} - {% assign prompt='$' %} + {% assign prompt='\$' %} {% assign dirdl='~/Downloads/' %} {% capture uz -%} - {{prompt}} {{unzip}} {{dirdl}}flutter_sdk_v1.0.0.zip \ - -d {{path}} + {{prompt}} {{unzip}} {{dirdl}}flutter_sdk_v1.0.0.zip \ + -d {{path}} {%- endcapture %} {% else -%} {% assign diroptions='`/usr/bin/`' %} @@ -40,11 +40,10 @@ {% assign path='/usr/bin/' %} {% assign flutter-path='/usr/bin/flutter' %} {% assign terminal='a shell' %} - {% assign prompt='$' %} + {% assign prompt='\$' %} {% assign dirdl='~/Downloads/' %} {% capture uz -%} - {{prompt}} {{unzip}} -xf {{dirdl}}flutter_sdk_v1.0.0.zip \ - -C {{path}} + {{prompt}} {{unzip}} -xf {{dirdl}}flutter_sdk_v1.0.0.zip -C {{path}} {%- endcapture %} {% endcase -%} diff --git a/src/content/assets/js/archive.js b/src/content/assets/js/archive.js index 05447fda70..cbca5d370e 100644 --- a/src/content/assets/js/archive.js +++ b/src/content/assets/js/archive.js @@ -4,7 +4,8 @@ const releasesToShow = 99999; // The Flutter SDK archive filename prefix. const FILE_NAME_PREFIX = 'flutter_'; -const filenameReplacement = new RegExp(`^(.*) (.*?)\\b${FILE_NAME_PREFIX}\\w+_v?[X|0-9]+\\..* (.*)`, 'm'); +const filenameReplacement = new RegExp(`^(.*)(\\bflutter_\\w+_v?([X|0-9]\\.)+[zipxztar\\.]{2,3})`, 'm'); +// const filenameReplacement = new RegExp(`^((.*) )* (.*?)\\b${FILE_NAME_PREFIX}\\w+_v?[X|0-9]+\\..* (.*)`, 'm'); // const filenameReplacement = new RegExp(`^(.*?)\\b{FILE_NAME_PREFIX}\\w+_v?([X|0-9]+\\.)+[zip|tar\\.xz](.*)$`, 'm'); // const filenameReplacement = new RegExp(`\\b{FILE_NAME_PREFIX}\\w+_v?\\d+(\\.\\d+)+\\.(zip|tar\\.xz)\\b`, 'm'); @@ -164,23 +165,23 @@ function replaceFilenameInCodeElements(archiveFilename) { codeElements.forEach((codeElement) => { // Check if the element itself needs replacement - const codeElementText = codeElement.textContent; + const codeElementText = codeElement.innerHTML; if (codeElementText.includes(FILE_NAME_PREFIX) && filenameReplacement.test(codeElementText)) { - codeElement.textContent = codeElementText.replace( + codeElement.innerHTML = codeElementText.replace( filenameReplacement, - `$1 $2${archiveFilename} $3` + `$1${archiveFilename}` ); } // Process child nodes as before codeElement.childNodes.forEach((node) => { const nodeText = node.textContent; - if (node.nodeType === Node.ELEMENT_NODE && + if (node.nodeType === Node.TEXT_NODE && nodeText.includes(FILE_NAME_PREFIX)) { node.textContent = nodeText.replace( filenameReplacement, - `$1 $2${archiveFilename} $3` + `$1${archiveFilename}` ); } }); From e82c589f7f5d61bea6cfe1cb50191a3ee58ec620 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Thu, 6 Jun 2024 13:28:58 -0400 Subject: [PATCH 16/86] [web] Change `--web-renderer` default from `auto` to `canvaskit` (#10714) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes the documentation of the default renderer on web. The default renderer is changing from `auto` to `canvaskit`. _This PR is mostly moving things around with no new content being added._ The PR making the code changes: https://github.com/flutter/flutter/pull/149773 The issue: https://github.com/flutter/flutter/issues/149826 ## Presubmit checklist - [x] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- .../platform-integration/web/renderers.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/content/platform-integration/web/renderers.md b/src/content/platform-integration/web/renderers.md index a7cd2186d9..2399f0e8c0 100644 --- a/src/content/platform-integration/web/renderers.md +++ b/src/content/platform-integration/web/renderers.md @@ -7,25 +7,25 @@ When running and building apps for the web, you can choose between two different renderers. This page describes both renderers and how to choose the best one for your needs. The two renderers are: -**HTML renderer** -: This renderer, which has a smaller download size than the CanvasKit renderer, uses a combination of - HTML elements, CSS, Canvas elements, and SVG elements. - **CanvasKit renderer** : This renderer is fully consistent with Flutter mobile and desktop, has faster performance with higher widget density, but adds about 1.5MB in download size. [CanvasKit][canvaskit] uses WebGL to render Skia paint commands. +**HTML renderer** +: This renderer, which has a smaller download size than the CanvasKit renderer, uses a combination of + HTML elements, CSS, Canvas elements, and SVG elements. + ## Command line options -The `--web-renderer` command line option takes one of three values, `auto`, -`html`, or `canvaskit`. +The `--web-renderer` command line option takes one of three values, `canvaskit`, +`html`, or `auto`. -* `auto` (default) - automatically chooses which renderer to use. This option +* `canvaskit` (default) - always use the CanvasKit renderer +* `html` - always use the HTML renderer +* `auto` - automatically chooses which renderer to use. This option chooses the HTML renderer when the app is running in a mobile browser, and CanvasKit renderer when the app is running in a desktop browser. -* `html` - always use the HTML renderer -* `canvaskit` - always use the CanvasKit renderer This flag can be used with the `run` or `build` subcommands. For example: @@ -86,33 +86,33 @@ check out [Customizing web app initialization][web-app-init]. ## Choosing which option to use -Choose the `auto` option (default) if you are optimizing for download size on -mobile browsers and optimizing for performance on desktop browsers. +Choose the `canvaskit` option (default) if you are prioritizing performance and +pixel-perfect consistency on both desktop and mobile browsers. Choose the `html` option if you are optimizing download size over performance on both desktop and mobile browsers. -Choose the `canvaskit` option if you are prioritizing performance and -pixel-perfect consistency on both desktop and mobile browsers. +Choose the `auto` option if you are optimizing for download size on +mobile browsers and optimizing for performance on desktop browsers. ## Examples -Run in Chrome using the default renderer option (`auto`): +Run in Chrome using the default renderer option (`canvaskit`): ```console flutter run -d chrome ``` -Build your app in release mode, using the default (auto) option: +Build your app in release mode, using the default (`canvaskit`) option: ```console flutter build web --release ``` -Build your app in release mode, using just the CanvasKit renderer: +Build your app in release mode, using the `auto` renderer option: ```console -flutter build web --web-renderer canvaskit --release +flutter build web --web-renderer auto --release ``` Run your app in profile mode using the HTML renderer: From 4e2cb1f60f09e6c60fab9cbf86e26c7860466b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kilczan?= Date: Thu, 6 Jun 2024 20:06:31 +0200 Subject: [PATCH 17/86] Update video_player compatibility (#10701) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The [Changelog](https://pub.dev/packages/video_player/changelog#280) mentions that in 2.8.0 MacOS support was added. I took hints from the [readme file](https://github.com/flutter/packages/blob/bb8c7b2bfdf557310d66f9b545fccd82eea2dd55/packages/video_player/video_player/README.md). ## Presubmit checklist - [x] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --------- Co-authored-by: Anthony Sansone --- src/content/cookbook/plugins/play-video.md | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/content/cookbook/plugins/play-video.md b/src/content/cookbook/plugins/play-video.md index f4729ba8fd..bfed7b0f94 100644 --- a/src/content/cookbook/plugins/play-video.md +++ b/src/content/cookbook/plugins/play-video.md @@ -16,7 +16,7 @@ stored on the file system, as an asset, or from the internet. :::warning At this time, -the `video_player` plugin doesn't work with any desktop platform. +the `video_player` plugin doesn't work on Linux and Windows. To learn more, check out the [`video_player`][] package. ::: @@ -85,6 +85,25 @@ The `video_player` plugin can only play asset videos in iOS simulators. You must test network-hosted videos on physical iOS devices. ::: +### macOS + +If you use network-based videos, +[add the `com.apple.security.network.client` entitlement][mac-entitlement]. + +### Web + +Flutter web does **not** support `dart:io`, +so avoid using the `VideoPlayerController.file` constructor for the plugin. +Using this constructor attempts to create a`VideoPlayerController.file` +that throws an `UnimplementedError`. + +Different web browsers might have different video-playback capabilities, +such as supported formats or autoplay. +Check the [video_player_web] package for more web-specific information. + +The `VideoPlayerOptions.mixWithOthers` option can't be implemented in web, +at least at the moment. If you use this option in web it will be silently ignored. + ## 3. Create and initialize a `VideoPlayerController` Now that you have the `video_player` plugin installed with the correct @@ -351,3 +370,5 @@ class _VideoPlayerScreenState extends State { [`play()`]: {{site.pub-api}}/video_player/latest/video_player/VideoPlayerController/play.html [`video_player`]: {{site.pub-pkg}}/video_player [`VideoPlayer`]: {{site.pub-api}}/video_player/latest/video_player/VideoPlayer-class.html +[mac-entitlement]: {{site.url}}/platform-integration/macos/building#entitlements-and-the-app-sandbox +[video_player_web]: {{site.pub-pkg}}/video_player_web From 492a5f99ee5634c95e584bab29f72da934d722ed Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Thu, 6 Jun 2024 15:24:52 -0400 Subject: [PATCH 18/86] FWE Fundamentals V2 (#10715) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Description of what this PR is changing or adding, and why:_ Updates the Flutter Fundamentals page with information on the page itself, rather than linked out. The Dart section is expanded to let the reader decide if they want to go learn Dart first. The Widgets section replaces the linked videos with text explanations. ## Presubmit checklist - [x] This PR doesn’t contain automatically generated corrections (Grammarly or similar). - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style) — for example, it doesn’t use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first person). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --------- Co-authored-by: Shams Zakhour (ignore Sfshaza) <44418985+sfshaza2@users.noreply.github.com> --- .../docs/fwe/simple_composition_example.png | Bin 0 -> 51457 bytes src/content/get-started/fwe/fundamentals.md | 357 +++++++++++++++--- 2 files changed, 312 insertions(+), 45 deletions(-) create mode 100644 src/content/assets/images/docs/fwe/simple_composition_example.png diff --git a/src/content/assets/images/docs/fwe/simple_composition_example.png b/src/content/assets/images/docs/fwe/simple_composition_example.png new file mode 100644 index 0000000000000000000000000000000000000000..1a65138be2ac08d8bc8136e79fd8d905a35a95d6 GIT binary patch literal 51457 zcmY(q2{@GB`v?5kmqH~eW%;&HDM}=}Qdy(2WmgDeU&hXmqLQU#&5}LF%#eL7Ln>?b zG4>_NG8o$!W(@Dq@BhBn_0DzKW**OTpL6c}KA-#ZxzC%2y6Rk<0-O*8acOGYeGEY? z77)ak#?A`fp>YY+fFB(08YW&4bcpxhivdbaI|<%o@OrF%2SRt9Spa`9+uwe08-hw> z5A8l>fuPnz&AYb^{1}$#96@KuDI}T-OuN$7EGqiy%)Ls6({-iH@u5!`nHVC^N2Nku#$cb zC0>wR7i}AC7z@y%Rut7Du}EW0i%j1>jm11Hc6P6D(M(SX_d+NNSO&)OYe`@cp~k|( z2tkjHFEWYjwv4@}EK>evV{2>kM7o3n>N9J`gM{h$oimmM^~vXGo>zB%i^cj#Oe#+7 zD6S2T65)PIkzN+RD81Q){}L#dhBJS8rV&q&;5AB!O&3>8i+}oP@c7`3Qz=x7pMk+$ zb8kW_U6P7Gh7gLw>DUY ze=dLtf@~if`|fY)Ih-67fS}xS_E|^{F?j`r+3#&P{deeU>%Cd=>w6izgL$`grF}Ji zy?@RCZGMt>&D9aKIy;+lzjepnpmo;kX9tUYOhT#M4=LxNYcyr%5(pCEm9M3$5xzYI zlhF4t?$;J${vr~I)Q-7X*@{psQ?nd@Ea_Br<|w4PDDf#cHE3lfel{XXtRscDV;M3M z_htZdhaVd`wHIQ$7MgaP15%x6HJvZIjWnv*BiA#nOX@i%RG4v?GKid($n;7L+K=-3 zQ?#L*l%0K6At;Z^2SMkNr8P>s!NaZ72kVg3+k-c#tgNc)(Eh~T+Fe{iu0W|lg?b4OQnyu|@5wF-ephnF= z1#Pb;D}zx&YiCr3Ph%Gc)qXhKF$N=jU)p0R*4Mi@C`gO#*e4Tf2`zG*O_7};gxTwQ3F2@Z?AsO2+ddRYm^O~k-PATk{&lgeQtt7St<_&nwz4g zD)LbMGNJU*4zUiEtEpo4#?cj{+(+ubkW^x%E8h;oZlQ{wKwuW7j$vU_MR*j2Zin2R zL`+CT{}P-Yy_3awN+$c^eLkLeZF}Q(_=Z?pc1MBsaO+tH=)7L|5P6ilBOK||mao(@ zYpWe8T?M~4rjE44`S#1L)5%hoJn#vq&^H{MJ*QHxLv$kjIBj)%?mW z4(ok;)&S&n#lNon9ErP=al{%h*StsgmTI4l_;)pr)~=;;jf z4bcP+2-2{)n4<8hv7)e0b1!6pcr?uE$NaSCn%s;nJ{En!oh6hZ*JgEN@JX@F*O*^F z_i|94Iq;I=t)ALaY7$2@c5Gdf|V!>zaah?CEcPj|^DVp?UHixK>X8$Ru&G7R=q|Hn)Y0 zyNj!9BAc;GQlwSUAuG&P7Kv1k)GPF#_ZXp*=HAYO*G*esGt)^tt#m!N_{78$2a#}O zaD3c`1+8SX-M$54d10LoyQu4LX7(wlg!XxivXrq(mUm3ta<>SXO8~b?^M04%5{;LC zetO?EdiImA@Q1A}AKGV-lvIta=11<$b3&>kL9ft)f`VIxUvS$Sx`hf8u2!vNmv^2*A`%V5jO zMIu`oynT*h8KF4z%PeF@KvBX&mEgskRrope!|{#@Iks!?8!XT@>G|Z~**cD+F03In zo|v>-9xq^EQmlnv;x)@}oje4oQh!IFsVzq0pDq3D5!I+r0gK1BRUm5}zUn(B-6GI@ z=)&GVJgJ5Y}pP$q1MEu!3K1_6>y&bMKxoTUthZz%99?8uK@1aPEORz zxNXJ&oqSPbADz_k+_?Rs(-qmhOqq&JAK(_#myNl<1G^ilvz)ZGqnvli*GSFb?-8a0K7Z*S17wERNSMj{U zoPKot!$yAW`xaaQereKku6!1`cFx5gg_u_HVg14qJ?l zjO1?hc21=)G2$VR#7&&2s6T?YH~Bx~IZGBKT;GPxEdK=^gmWHMrSRB!Cj3 zo7EBMk$$~ET7A{r-EDc7tJmB{PKx$0hAKY1`BkH<;-|NLR2Y|no`#p#jbIA~i2aMM z(`i*n3+F=+6jzztVKTSLo$=70qkNY-gJQ(Vm~2BOVK!R#l@v#V21ufXCaN`O8dE>rkrIvY@sIuBobHNmk_gZ z@C>Kjye2(&XucySGPs>BOD8AGkly0btc)mWNnU-k$eST8;h zX50tamRa9kcJ#p1xAybxy0Q?n-tF6NE{6~RwXkQP(G$3RgM%bp3nZ?YBvr`YRGNwyYF;LPkHSn9q&J`>fl|MVLJ$JKcJg(cD3O8;-p@=X$wW5 zXAy^Sn+&N9n*RHVWi|XDDw&OqW!b=X()uxuz-1sm8xi5q_0~{jbB~Gd>obSm(5)`S zuDbu9tVrh7@Deb+Q++*nbC6U6KrnKd53hBltB24=b5}6w8?Y{XzQ=@8AU?dkqu? zzo@sd=RA(ZH-ro>4R3uFRVOFnTN==@RT*CEf7%){x_jn&M8+o0UCUJ=(qmYzELiyL}{>@9<@A4ks-Cao|&X5Cvlc+xT zhI9Oj=>M)~AtO-b{HTJ-CwiPFW9H7h920vxFvQI(8ve%6}v=(B-2}(xe8QtB~RLXZGOT>f_ ziDD}>`Dca<(?C)%ZD7uO`e$JoHH<3kg(wle?7bP30MZvx8ZLi;C7q4D>R9*Zu zofSdNAlm9<58E4Jl#@6%q|5hW*@WEFKWb&REZ0b1^WKZ`K1Ds_)_4uEvYHvI=80Sxp~UJp@csu63gbd1bPN3z0i> zw-QP-=ZPw?Z@0P5kju9mx`avvj^%r`(<)JByhcQUe7ypGlsUX%Vm{6gM-b^UNhm6) zBEmDe9k1$zE7$mS-%YKO&`$@ZC zx;gnc9kcoBqp1v$OzS#6_s68nzB{J+ffceL))iy25U@bYBb7?+v!>(N=(6+0xA4|u zJEYECGk8ObWdn)boc#GkrN_0+$-KP@Zxhjzgvl`FeSX%bJioJI!d?I6Wvij~M36ui zytphl%)N->Ry5OFCH*ktsv}*eVtx|47dPKTNpiD&z?xU};7v+*3Z;?eGIw_+)sZi} zZxO^T_jS2gFb%&sX@NH$#T&m~z+;RsUaT*y;QpDLJD8fS5qHGUe9zD+%ae+LcLfGO)m)u>eM{=oUr6MZhH8xad!wT zuKa{MI_WJX;K7BwqnLZ)5k0Qi$iSHgC+(zfO5fex{Yk_`;s_6~Wems6wh%2ABe!g$ z8yrM-);7AU0$T*uL^b*;J;-k+2%a@+J(X)2z9V27=n+At2ELWmOx%DwYj4oQ6&L{& zd{J0iYlbb3()|LUS>MdCB~+6W_R*2$GeeS*g*?(E-GzCHqdcfSaR!<5 zeEicY>D8Jv{$lq5arZH>R5G7+HUr4z{u=^LPB2@MTWZg^LaJQH7yYg5Gx6SH;naj! zj_;dFyZkMMR9BtALl(lQ-xav6^lzjK0ps>!>`1bYymO4y_PcwtOQOb$R~ z#Ak;5@4VM}&qT6YHxDOBTIog+~SvX1@0gKQ7|9 zg41do9599ju6#AU9eM@72X=04jD;i|tA76R6isfM73@)ZzG&#qH_}JM)})Rt zZuZ;B{={OZSu|3=!fg_|$>MOxV%OxHH#sZJz7~8D$*7N9==9)^wkh_KA zB`@*no+fZV3|-o-ca-s{OJt+&P41KSh1LRFW#(+{s5A<-Dv#t+N621gdpD`H88=7t zKi}ojZc<8g4xYa6c7rr|lX2u-PCc-oDUa6?4yWiHIRE200qoZ@CHFdAGDYEbLei&( z?H{X@F69g>cXO5GpwV8fX=9_t{M*l^xhB)f#+*VGtrO5OtEOu0nS1l<=%;z;vWfhH zt$m7Hu(r_7vYVaAcA@AXnE-#+Vv>%c?5`&^9Dj5VMQ}tO4*s>4eDh?4gxG|93WX%b zkqAIOwC{Zug>E<~&*C!fU{24^$zGH8>r?GCsZV(WGeCWpX2`s8xbAse#ffXuo&6z| ze}jA6$z+06(r}smD8u+5%Iw@_EwX%-W}c^Jrd9KuJYxQIPQ*O5wqJiUhhTyc{t|-C zPklo8@iI@qTW^8pn@_6U3+$chAM1{8U|q(+?ikkNB(#Ndl&sRP9!^t=8lR^X;K!-v z&*i9YlLq~%lN5R|gkhp@KC$?}S?eeEbh^soQ6pjij0IWtOHJ{wjN_4_jtX%D6oy(G z*c6~rC%W)9pY#SDzj5QpgQUFfgu-s%JWv4KmokJ$r;jfk0+}8CBIAp9MNWm$CAf-V+e$sBU-#TRxra`x4; z42+FOQKFoO5KZg=Bbs?0P=#bfP<)WG3H zm=P{pEK;Czv;M&xU8c#QuAg2ZhJ0jXdO7590!4CizVud?&p|ok&3JYEknO*;^rM{L zT3tcK@y8SbWhuC~gN!km3o~$hRlGG$-`<%Ut$$JfYh>~mJp$It+S>d2K}~sz*R%EmXF*oC&Tm_Xp*%jc zWf`8S5WDdA)3WC9F+aozRRG}K;k=c=Gp@fx`^S{<)#UC^Y|ADI ze*uihKVWQQ3_gW4GM(nN5_loz_*45k{|XlGtp~aPSSPBv8sXu^y9Xa0u~9ilT`5Rc z4)^(kTD8{_gu(p-z5!qhU$EM(heyEoZ{E9NpzQrJPC66Mq@dTXPK6uCmuD<}7|iFs zy+;ka#Dmz^OTrvwR`YOt|4y#{$>rjX?A-o)8qLcu?h5 z4o|a&PW3Xmp7CY^KSRl{B7MxB5|tT3XV^@aI!48bf4&jLjy5o=aw?7Ep|7^)p z2&Fo$B;=;FAALT3W?j}wLH{qp=K}=oK1FgsN1g{@Ju8`@Ke!Cn_x7Yo38L{`qbit6 zi&H~LBAriluRr|KNQa?h8Rn#$Re=j@IsSD7YH_>i#LhC-MPe->j9$>QfEan$X>x(H)-PIn?V$^4EL%v!l5BmyLX?%v_c@n`o}2 ztEnd%RvOWwJIy>3@#rpB2FMSvP=($sp;Ny>>itu&vLfWaHCbhr)z-EOAJLk+vG2}J zH)W{qE1d?vRw@~t3@i@6**%VH7Se~Hl`o(~0Md|Z6-icEU!1saz}uj!c04`d40Now z^xLUA*OH$f2z%8@OAw@Zz+AB3h<7MmI}Gj2&F?+mA)XU{g&0g^WJW_DvTP#C@QvDo z$$j3%?BUia1O_wv_eZ@#YJ|}1@i50^)crx2m z&!^oA0e~l#-GV_xU>Vr-G`~Fouvc*^-Wr%mFRckPuWLc$_WRS$0o9BeZ(;;x_pM#G z=VUWRB%>ooheDV`F9OPkJJCRnL3OpH6d0&(f6}*-@79csjqMg6;BpK5Jnl;V#PZQ{ zk>Sf4kh>?B#ljpL82q2etwD+5+6BMuIcoF?2dq6W#n_rF*y4BOq2OSB! zAqa^eynTH;BHe`Ie^PJK?3ZWd=i&j0qLFEYJrOJM73b!(@{vbYC?Nx^%I4Z(3$_2& zpFr#aUEW|(`|uOzgzNjQW&?h**f2vmSK0Xjm{bTA#fNsV1MI75V_; z(VA;P&}H1yfzq~W2;5H+io3*XpBRCgq%`nhD}6Yi&-{RY6nO`jlXYz~?E>k6st5!+ z`N@_4UHA&8g5CdEe$%)28JK^+2sGfKRNW6s+lU6>9*zpbm&9T#A~B~GJaQq`d=TmT zs=Bp&)r)!RLov+IJwV8byxRiFNoA=AYZrho>kd!eOLjq21pPd`6=BMVi(e%ZU@M_mFL}G z$TNmFA8I_&uW995t(Nt$voMb>ra}Xc(qji}Gd~0%D|ktX=l9_aWFO5k1Mbg8g>KFu zqBrl}C8`u^zL*6--bp~1tT+?zUS9HM0*NdG4X{h7Vv{?!NYY6!NaRX>edvm_Qy>Ff z-osh*yNgWh*cGsTN5^mG7ZilIl|v#{o9uk{kSDSr6r@0^pKdM-uoBcxtv3#a_ZCc? zb#*1bJCHn>BRR}>P6L}lZTZ}D*`RNVVttGdGjAB!HKE71eHoznIgP)NSp}7vaEge#2mh5OT$UuzLT7UaKwK6_!Irjtb3q+4V#!ul%$T? zp1M(Z{x6lsQvM2?kMvJ-6-tp-inotRCt284QM4ANEnSaM7Bx+;So$^Sb+;eh3xDg= zX-bJ6bb6hSF|_h3KS8WFp$!Rn%#btWCw;{*lmVje6geY+&RsX5kC|*r*=T7u8N856 z2wWs9tOn@Shp<_a3JD}t|N4U6+La$TVu%`fvVuTci2#v)@XAGh7K3$T{|9(xqh%-J zNXn;8*v&Rte_cP+BS^LN`NII!%*hxTk5lh{?^fCOjs#$((-q5Ts@tsGSu2 zaEmgDkPRBw8?+RM;xzZYcT!g=Ry#jh{%tC&AD%KoxA{G5AA3D1N&|(&HkfJu7eC)Z ztdJTHvxIxWV`!e27kjLdQMKe~HKVHX zQyq{-PO_sD(11I71_HU2SLsfcc<9*T(;)_^xuP#2eYq34Gof-QbZKgX1qx+byafFb znBj(o%*Fb&@<-smFup+fa^Fxe`qVH1=1;ZH`^E^1GZd8{Imgiq6$K@*dQv98OF!Q8G(m- zHAbIc0uykuo#Br;&%q3>6?^~xhuQLu{_j~~y=PQiuP;KO?|t+LPB=L=2nzo+S(>^f z1@idC94JoT`97m+^8fMQu}0WbpgizgOJi!i#3~3~0}>F}%0#Mft+GP?*`Y20P))A= z10a=~-!U%B`Na)5bKc;32B1}V-|RfcEiyOsju|r3nQxD|2{E5OSPm73srJ|0B2~rB zN@s`+kXhDfLfhtsljGvY4}EuT2gyv*?EfvyF`HsmAQ27IyRHvYwdw(u`8dO7X4|=N z;eVioKPKUAe-z8fcT0-_FzbE-Y&Cj zRTA_B_J>+#{9FE~yKJF~YTMUyor7mf6xYhG_Kgf2rGyZTmJR@cL=*|<@Q^tTvE3Bt z`CAo9uSdrl{W<&D+w8+HO{nBRzdO4MkWT2BLP&|sS@)|FS3h)|&`lUNewXy2_nuEw zSXCzSka4Zh(C~Rl#qF%1tt~I+lhX5mzE5QUe zWD?noXty%JX>twmA=hc6f%hxS#-elGs1Bl6!`EtYp`cqrcU~(`e=pDhudCpU%urJHn1{V` zqbOJ0J7KA;bS{gSSTAOtRP}7xQekPMOm{e&$R}Ah=2mYXAZ!R)8s_Mm@OkicrN%MF zHl9FRh$IBMhRg*BW;wYhmu4OS46&14k<2Jh8NTAhMNImsqt)^jbn=a5%}SkaW4f}u zH=bx2d`3=dZIB;M`p;^;k`WoRon1Y>2~zp+uvtomhj}hIKp%yw zh5|l&dtH>JYd13NCjG_#u9>DUp7=`5!`I;Un*y(gA^Yqm_VHwoB$Sd(CT(`>CEfLU z<1Kd{=;`&qX;Ejg*{t`Er2Ip1lA8trC`){M_nhqDNWqx88QBNH_ktBIfL^r8MokO_ z;&cpHnHIF37Z2i?%1?ok(U*H^k>_l8waD6e1AFspgV^tu7{0RZ3Ea8e4ZEoP_7*g0 z{KPmF7F>O`$qP63pO=bU6X&>A1|74;x} z{kxtDyIw9i1#wGV)Z}(anO!JrQ~opj6*F;|S+O13tf3pdj<00E;WjLGTEx)qF0!8~ zy~GJYECI!u@fpd~hN8Yv|pevByjNE!l0*#K+QUF2;Mvr+FESeJ$AuQRH@WrdI; zm2P;L)~9|6R>MOTzKxB2I0lezAkStKdSTeJqO{(Ot5Z_k(E#$5M{@#su? z7Z!mpcKJY70@AS6F! zzPsq@biJPI`&px&1;xC{m6U*)GbZzo6H+<3R7rd&2UJ4s{>tv_(M>o^*qlp&-}3q| zZi@%(#9UH1$GsdYS~${ogx6WlDx9?-s+h9KO{{;*{m9s*IN?Ia#Nsj`VER0fCfgi) z&{E;SWTrML8~9tg#cOdr+e%m!$j^`(Va1oG*Nt1f!E576sALiK#kri>((XsPaUNeC%y2$Cv)-01LqH2={iS2n`qd`^ci6>3O3gVY zUZVvkAkNLEaOyX|Z1*ZAIIP$+4!)+jEZ0w7cog9#i!A z{A16OsaK3D`g7g0j?~b*8&Md7Uv@r>n0)rCVnp(0D!SIgouEmWy-Pu}K-MMayziMx zC)dp(C>bzs!eqK+6o!~NYl*lSHu+()&N1>$Vc+LIgXH^>9|Q~}8r;&aR4_hp;hHK~ zzww@hU$>H=fW;6a8m{3t9r1I0LKrN!=_`ST$;wt*As=R?)G88P+rVmX#vCk6mT|a% zGRm8neH>QQ?eU4cC*e^TLC)?j#HfW2&QF{t!wdld z_0uJB zs~^3z38N1-`kPPnQEE;R#?mdjxtS zw8Zl9(-+@IPgL)p?wRT_h(?z&j@-MnX%RfZ>5?EPGZD?&0HQX}VY6_raJ#&st6mAl z6N$Ou!mMM)Fh@_LTa7as14Y2nD)Mx&3-x5ZmG>)@me03q{RpEZA~}s(d+GF!5FX7C z*ZJhZDxh~<$-16~wy#ivK2y|h;ll0qZoWKXvBJ&?RmMW>RmXbXpa+uswa+F#73~sm z7-_-xB(nC#JO4L%P{~ISt)?GdJkK6eYkpZW2jvHMs~#C}^s-`E0*!b6%7X@Nuph9? zTLg--YuA8hH_d_F)b3T3j70Dg{jA%0CK-i2GQp-8FN1P*`cOPYoZ5HLt;Pj0>({_Qu-Uo zJiZO5xy@yI2HHyB0k{+ITdZnS!%{`vR-yl4qU}iUdVeapY%x-W*KD>9me6maZF#|u z5{oyn2LO$jXNc>qvT<0*8svkV0TNsCW@{O1(9HUMJ<)mCNh$BBUisFxKDC(cgJ1Z~a-%ue6lotzsmnAfNR5-DhO}wOe2#f?pMHr({K$+t zcdQ<>z&dm?bskKef9S8B|7QE{>DzT6Bb!~A06?e`{G6d|Q~vRt#8<}t#N?1Kne?vV zqbg3XVRwwVTxI_34%v&2G|j1#gyQ*ys29%+#lQ_d=W8b+4p1Q7i$W@C9xvsMLLI5@ zYtU`Bxe+#)8G;=SxjJ&*eMQ|Y)ez4ZO6 z?rp4_{IPUK+ATgQ5iH>Bf8(=f4w9@VrP&D=sSC z2_hVEH=MLJOF0}u_V4^|B(IrNzdJl*PAbTP)zRdVDquFKE8Zy&b;4&1-6%$9ZO`5s zgbll2_)4yGB}Jp7_=A@oI$n*#WMXvI6^w}6dQ+eT%npTYUrX_23fQKuKGvJYBtKaq zt^rE4{Wnc=o$i*@6CGF^Q5109g>|e_=|ixEsbJs(R&mewO#ezb;yV*; z^RjON?XBbkerCdN;`5QFF;Gg(HW?~_J=qeYomhVX^tgJq2W!bFn!8V*S5O?7y_?C6 z3H#mGP@*r!5|w{DpA{FPx9p3}#YhqZ`n%zYfw7mkGI_^IF`xbpS&{Z8Nk8iNv93`h zGkXMXb$#KKqvTXj*9DyajlXg-S8$ZVs~NHQ$??3&;4bdE>zmh&m{cLhDJ@7UH-!VU z`CHcg*Pj{vtnQp7zl3t8Qp?r^#uzfBD%_2Gxw#Q8EKoh+!ji5XvXLk#3fnG9DAZC@ z;=MEBF_TvQ;(OlYc6AUn(rL*~qND-#rLd#F4VBhCZS)`PTjyMX;dzVOMffbrRxl=( z9Kh9e`7wsJ5G>7%hYi8RI|oGkW8jk$oCH$^KYYu?^06}oT52AsJC))Vg58BKho#?D zGEJN-_(sa=2bpvD>gi42fDOKWsliHy@J}fk?+=O$HfeV*4(QKAo|XXUGfzE3+)b{P zgZpc7k)(5PNPp@7{HVFX+o8I4w+p%S)(F)&5S7I+cZ?|Kt(2XzsN2sdVgf=WLoSg z&R~o1^_}*JBD2ib+dKRO-}Vbh=4a!@^b)hPvwHjap(%8Ig|-jQUq`5ZV|*3o^FU>x4^K);kH-N zCr!75E+j5Jd7ua6Rp|VK*iH9cA;=jpgDH1^0P=05WsCjVlZBU$HqWzsIE{?|N8&** z`5ZDtKyST+r1cA9>o5Inh2@A#fUKEv-#x5~Cja~JO@DvFWwAfuwt>lv^FP950j+R& z7CeJV^bed#VeCLtUz%$?4U$xZCnTpH13~vS;&^GNb=eQNp#(XB%42|13hCK#2Eg%; z0Yf-9bTT6gIhnq4Jzk6XjiJh_`2U!X1FlHR7)WuUS>0XAC%YK_JmxvL*wGkkxmnW& zdY8v`WAM+<-YWtuE0A6)|6^!;&0$gK3VIvQfzIvS9^O43=+El}vABznDkixnA>9Rn z*rotgTNddV;RQIG4W?@=fHNtphYk!kKNHFns`yz=ZbmLN?egbuLJ&1~yq|B+Ai?pi%{V%R#4R91rKkTTF2_ zN}#8*r{&<%f&|x~d?4S2n@QQoG=V(MA=vIH35gUqNJ3BqU}W_H<;8yDX9#Es^;vBK zk4ZXEFPde%?HKtW_L~PS3y{bKkk3LIBm$)8kDd4?v~5&w@bO>`ro({QJA zva|2F;^*l= zbhy^nt&@zE!0PT`S1fU-ZTa~y06cRJ<+H_U2MiWN&|TT)>^^)<40jyz*4PC_+u&l#LT>b24IzlU!J0XJzq9(!s~#`^3N#%DWp=kK(jtR%t{3pkPYsLK9t zs&38p@2I?@A}w&{0CanMS5$eotwgu{=_TP#H>`k7fDdZTMPP#-Y|}8izZvBK1C#f~ zFBwwpd3FAQjc5Ydtp{TbCR@-@KEO^;ZrmNtXuHV^SYJK?Y!5YvkTVyxFv zM7=24M6gvr*(yctU(0gFDgqLbUAl4`f{qo`hk^jHfnR;`eK43f`ak;cz4dRcN zg^Kv;4b}Wu3xwwR*0D__UCK{;7?_^w9YG|xsIa<~4OFaBreBOuis!Di(>CpB4(BqHQuzng zP)l@{Q<&0>$T>UFWw%@ZL0`kWjsGSCr96l!G)u2)E|Tw+?Lcz&DxA$X186ZHdD*C9 zPFIDLbnd*$ngB{fT!H>+hDed3b5^zrN3xo?Dex_NrgmT=cmsP*MINr(rbGAQ4wQsUQ+L01?QKqnKl4Gj})KcV$Dy9K@p z2y`xDD=I2psXc|lg=YZGAIYfTEhsuubYJUBi7Hkha7oimIbg0jZLRb=BeXDdz%q_qpT0g3b${XK&6FE~MWjzKT@-_=DmldMtDkDC=(9 zv|gJ?Z4^x zQh1n&%cIY+#`#KNH~#Drt@dGTRib|eMr9o8$%AIgFn!cR`iwB>P7cZszz1Q7NV**t zm#^>gh@GTak{#nX$m|kh!bXG#wC2U&P5+9wNsWAKw!b%Cg&cGh>|QS}QEf+w*nT^e zV@t}P?(;4mZ`jjQ8NV{Qw|wETVk++>bY6Y*qav+Ca5_`n@Oay{V@|I37`s#F|5Dx2 zUS@QN8ev2*`hOYag9Pd%eH2GGQ#gZP#Ip(cHD*X_t7)o8Hx8&8j`Ak!lP5!HE()FS zN|v4;eI|XBv!TGiBK+@l(Ub5T!=k_0O-tKrGj@MFQ>I5{-6qbIUI~7HRW@ydWptNo z_FT5muh4d4_#XeJ+qmIiUoXu(P|StzG;`V-_`f&EcyzfSQ%+tHxxL18bsg0CoX~k~ zvyaJ^=;q?<&%qe&b~hhMd3L%7GOBuDHpXJH46XBH_Be5 zbXj6tfzg`PX$b}SQig6(&qp{MWMFo7cHdnrdExXKl|384W1ktcL(Ga>m5#E{Z`@=1 zf^`lSs>khETIDE9ST-JN#M%CYdHn<}+$!@64KoGNA2rL`XIC5a``o|$Y6uyB8~oVZ z^dcdM4oF88X?KgNAgk>;5c9U}OP+=0cL+y8=S(O&&@1?K)xudn2J}J(dc6eqzF{I> zGu(tv&>F^L=%Rl_F#EnS?morN#m$Xhg;+4XAc@$~F2rCchhgIxYJfc*Mnzr?UFt1K zXaqWVRK|*#E6X`Uul7H$fk>XAc-f@@yEJ-Gn$tnAit1T`>eTCMe6d2$1v@Xr7tSRf zh!>Ba+;w6AtpI|2!_!?TUNPNmZ044d%yeP@>U8srvM#L%c8JmC!4W~rRFMIlpLP-g z-(d-bmeRWeCzy02xdo4@WH*~G-$n-8rc1}cjrw7ynNe~0c8mHhm$TQH!zT|mzSo#9 zw#hoTyvlVHs_tAah_3whe(&rdu16X5ZnfhDN1<%;mixHS(P|iOzI`EQ_T9$MCpOxJ z$78eG`Jilnp|@xKex(DP(oLXCv*RJdz;u{Kp>$)=-p<_e=K+*}0h10F>_MghN<@Yq zzEU$c5>_mszu-yU<5Afyv3OckE*Q2Ig11YV8z8&Sm^V!5i7od{83oo}w%`da=J0^0 z2#6A?pDLN;hZFmV<&TX>7$vKtiXkdMOchZ^`3MG&u%|p{Id322{O(=4RNo2(=70>d z3U&!U=&*r8OKIsgo;aDCx6C*lrsUDETpbnMo%~Mms-KC|kB|Ht!*vVCm?f~I>G!2Q zwNTUGx+DYPIZD$A`@bf4qlq?yXbUFPJo)bo^p(W_Ns z$GAPvuVVHp12{o;kk*x6s!dKv^a}sJ!lnf$`uA5 z@5DN2zf2G}j-Y*G?3G&EVT42``J&m|stYf84z}pU59+7)^$(wG;i=HF53CBV)kTvd zh3o7iza~kfUiLzNISw`DK1CW;hHQ4Ny(YrXoVro^T|n&Th|QY_%)N6F9D=p1+9F?mB+`xj+zm|PjSQlq|t zB}!;U=*s6Y%--D!=$|W-CKnt~DOP!rUi^`SEHo7Ukb&-Zq635fJoJ}e2UDPb`WLiyW7ns;suHf z`90!&8Q#laL%Uq^?fr+ZXH%qV4LDIyUT*P2A6&3b%%HSclXjA~k9Q;qnScrK541~% z*wNpn2cKLINPd?h-RJs9YUX#Tl*a+yI{z&T20BMB9{(C{ObuXC-Qy&)U_d5I`2D`w z)?nCu$D!XtuAG)DE$gje=9RSRP5y4saQ4ZHG|0Le(hg>S>;N~ zG-CuEO7&zxqe!Bwc+m1fWy6+((~F5MW{_!&8l8fQ;)%oj;ukIoD0jMwJyy>8j)tWN zxYp?0aw`9raq}DYs;vqubVN9dD00nZM4I79RQJ!u&lTX5LO3@?p!j2^@;BETp9{G4 z(oA5+b+Fnn&{5>*3ag^k`@ms~Bed$*LlvJ%Z(n3g2nU$EM(rv8Ej>oN)>jJo!FZOE_V;_CqOP3-1(aQJ?%n5}(7)orWdYJ? zUD2%@NCX*a#RruFsPj9xAx;t0pdwEq_+V~?xWmGZEG0%Io>Y^Zyfuwa(oeFSY=V(# z@)JVnpykCr+)<@BOkW#n&yS$y7Y@a6Dkj?5-?RKLCxlBbqr(IKo#NU7A8YY-PlRdA z%eL}SX!nbe-_dHDPQ8@!#$^wQ*l7EqN_kq0VOhJ4&|-~iFL9a=EgGPAZx`q5F?cSh zUQYDkRCQ)-kJPRo2JW>}@83Wgr<-_$jgq=%*VaNJGf2S$^s|Y}yNZ09RwfUhh%|!( z@-O*{wph{Umfmb?wM54~nr%iABTd4bHC}@QjdFl)4hcWN3Q{}HqIb1y$EzBy{zLE2 zLRw%q-kbmj2Sog&g9II4VFI*DStU%TM@ITCxro)~HglRQjMgq2F)0P}<%#yZYZVI2 z_Wbfi3;UXQp@_Yd#HN1YxCE=W5YLs@mOi%)T=^4BUmbcTcsteW_VlbepX%GY%9vZ0 zZq-wd#|YwQoE6pCFBI{1yXF8oOzYf^{MamO{)dyz3nEygpF;73L z?K@;8xpT+xZYw{xM9zz!tHhgG)?t49j$50PlWTFw@cB!xgSdJza?kvq3sP5j*N|S8 zR!4T+{yPg@eSJ78Fk4tMX4ImA2Nx?rD%1b2@+fK2C3fZpZ-^V2y3&fk9A){dB=OYc z_7YCEYObHtn7-?@Z^ZQ^O8vyhB>#z5^P`-QqdS*HE!?KvKCeG9iJKS8*eEjRTm1ak zRVXy#O4jeEk8Lfq+9O91`~iWr@+3U3*aGj`l}Vz9`O$QU@0QTKPTBYOS88Te(6cWd zbwpX_JAD&-)Mh?FPpfJvF4&NNqZ9w*fe#__A_yQic4 zZXcu7ZffL@XGjKFcptkmvA<$qg|8%HKi#b;5ZUv(ukv%*Yi8Z@#HJELgU}S9$8O3X zas!-aOs`M9ECw2Ic&kC{EMyR7@l>6iS0fm=o_%z46&zyWLnCe%dIMSp@N=a=7zP`! z1v-$hxxo}_-N*E=wf^8eCE#bR#dIz)MYll8xG#(96m^L%GBGsdwS!@=eH(YfuXRdDxloH|vx6@u00 zGv2+UF5g?n8|94@nE|Mz@rnR0$#;Lt;qM30dH|d&@in#ZRWm#8O-UcPmyi0N0N=Jb z_S$4&7%PAyV5Y?KPG_nf!pi^2o*VRD{=N>97* z%_B;XyI0i{ts^jGx0}VG=~}b`*dU%g=b%RmA(I91$LGjE*)lF>ophij^r8CUcZ04K z27m>XZmhz!qO1&6`a_t?@%AXl-N2Q%yAl<$UF5&A7fh6TX+y@8NvI!S%}aT7!wY1< za8vjI^u!W_KHP}XN~dT4;8%wfKOjY;0-|E?<3KY6zY(yx4;8~qfcV)0U)K)e?hXzeRr)J-sAPF5|MerP#Xg z%!alMrgwsd{QdJ)UemmJJ2vYHxD_TNVfa<3{BJ*uOM+1d;4`>&O7h4bqYk@&aeGS+C1dhnY5W91rzG(h;Nw?{RI`@Z>6f;dy z`U?vTH4PO!Jth(;B~x#qt${9Y#LUg_cX*!?qNXL+J>EC>dVal|^5}=wN!FPVp~G*j zx#E=8>^y2Q-8nSG)4-@ZK6YN}Bd(M!d`~_;ZQVQ=l0)=2-i?(^)62t-I+d^2y%luc zHNPlgeZh$C@CzDGfK7;oYHTU!ZUdnlg6Bw2&oxh4;pT&bv5oN$Eb`=yq91-GEMwN} zbor$9tF&z~ZiTzwX{H)iyIY=68|?X1jk1y4KK!oCV6jr1yJabxSsNR-f_3NL(Cd|< znupFVWZb1qG}0b{H4J`BU2BAwqZDH+NeBnG7sDJ|#&OsHlFnjyPD_>VKlAr`(P^spyiE-gPv$ zf0tipoU@*aq8Q4}&2@=n^W*lP_mw;dzo}dDeP8*i?$Wzef&IgA3%mf5OwOxNl(AN6*}e8)YQvM z!oF@c_Bzxi9N_x{NvFrp_5Aa+IRNI74+L_pj`7-(dJ`CwzNU>hFSL!Vm`eT4e8RhM*CQ_G zJgZ&@#GLKtFM|;$HvPZ(3EVTR6pKIR6cu&b^5ol^ML=)X+7cgFSX-z5l%d#U$<72y zGx##zt4=I3*PVuRM=n8zEVk1C36bWZ2oqEOb{ziqL-z_*fnQZTzot+>*aXR7L!clQIE|U-qms`E;8Dy z!k(5U?BsZJl?(_c4cY%?-Vt=Q3{3rt1|_x@PA2WE$IsSm^-4 zKsM}UGt|A-x@AQEmd9haGlp>M-n;WxX`D~+CGjfR#u*vdRvE^n8ZG&QdStWX1&rng zCeEIsdb|PFJSJ!3(#bZ~z4uq+6k3QYfeIiIVcGe0*auMRbz)*37+vYtk^(-EuW$rb z8yJ)4%l-P*E6xY1M?2Zk75npEJ5n>6%XPX^Y%z`30JjWo4hymM#r_DGeD%TTw&}y{7CN{Cfy!GbkkfRcJ@Y>#WK;i=Jp9qtH*xsLX z40FQ!UtGsASZxf9eOWgW#;RfK)J9sW@=B|-i$Z7Lm3WR1bCmvg749)mow$#Bu>dGS zbC^o!gY}C$R)AdIXK-Hcwsw@y-!F^A;M}S1V4dao(z&VaQai6ZUmS4m2TIjDdOtj- zJ%(T8qR`J?=B@Y;q?B@x!7n!vmMg94Fx$A;ir zg;Lvuovyw71!8SD{li$rLa&n|#U;p~1V*m7W=$G>;d{TEN?7%OG(P zhw#zsi$*NW?-?W9QqQScQIz0U=5Xq%SsTtk_c4443QANu?>nfE)_mikQM{c-lA%9e zW*@?Wv8>5zpE1_|zP$8xZgCZqpAoto)1E0~-zZ8k`svLZ!x=w(1`F|gk=J@xtow8p zw%us-*6iExPVU)0PPtfH%zNb$>kF-CK0LHd;=A{MBV(Fmc(1LMJZokXFhS{VU#sn@ zsKdopWvBm?$tr&0WTCDBI=87%^m_~2O?nrL+gS`{82ynlJA|?>IgL_u?ktVn!t{x( zuQP-Xv>GM;ZspEcOdECF3JXJYET9slzveyclbK*DM1TJS@mq_(^B)JuPThOVcsnln z5yx-E$n`hQUt4^AjB@v|>oP1Si$!y~ntoL3u*SUWFJ~p>*qj)&?#Dg%<>7lMSwk^+ z%HiKQebKUS=0Vmu{Z71YxB5%*-1!ryobP6;$0lakDxVT_wJbkL;keyvL zL3N4JN+#AE%NU0@dH23}I2y2_NTWhqXXala%fqdM0fQ5?Q!OP}Xzamc?#Ov}9WN;g zCIGAX? zaj^O{9rJTUWt~0DWv=+NHE;=b>pX9=8~zB&$1kxrxBFYxy^DX!aM4@-B;dqdbrxoJ zcL;l0!K(IRY0^)XD*|S<|6UzliFbavUUT0849zzahmHh9yOHHpobS}fBwysLQAbTW_#=tI1eyx1)?r@;gc1zR;MP}Lx9#4%C zkDD>l{X)-0+N&+U?!3}Y-j;d_GC!bof*b5RbZxwmcV&OFWk*jkyY!u^T+co4htbuT zhJB9)700VvQy1A*ZqwX~9`ecD+si5?TuwB|mKS#G*%{n(osz#Z50(Ir^#qNbohW)f zW|5TnYefweQu-rw-t!Z#`WNXdXRWlmHgx8_ErV+iH_l!@3T=?wJCK^aQ_Pri2vRV) zpU~C!_=a386`fXPTv_QP2xfCTR@2{PjRmpF3tQhk9ikZ$2k7l>a!a!xsbrJVh=CU? z1VYO8JQK@jmtm@VZLZ2X+?kC5RlC(64Z@p~6LEw#81j;}Y4Ha4qgSMR0e{6ljWfYJ(YTnAf`MX(QK0&O+mk6Bk*L--m!XgcvdhZTI+~i-=~cNS z>;qRuqbM=&7;}Hx0*c}x;|&c>&E^LA zg^zWKDMNUM#!q#LE@G}u348tQPQS3m?QZZ#ASfIpHbq}mN}jIAD&pSKb2Mv5)Hhxv z$CD!)o%%1CsjwRPimVEKi2#ot7UX~?v#rOC$b8vMlW^Aj_qWF`!XvR}iJa#@_uin# zi%^|1rq=~x$q!bagxYS)U005I?)w0U0O1eTJo*C)O@U8AuqhRt6z?`1E$&t=B1_jU zGHnWEcy02hiRR3#Ed#s4-65Oa>OI^3xP7O$We)GQtnqJUmlqxc^ zllt>76@qOO0)?Zl>ijC-lKL>hczv#45Y+d|U+z8>BlJBL%(5?nWFHM;4BEuEQ`hXO zoAytdPm8-R8}Ag2WiMBQktdF?L&W)}gi9 zoko+pJ%$t5td#_4V$B1ySzmPo(7nH3E^lzOckMb)kBQ3zbh408V4w&Hrk2Ubq`wU1KKl^Nq8$K-9(E_0f%t~Ko#?y0?VRit}V~an`aLP z3^Juvc!=Ncl%UyI`P3FBscL~y+~Q|8#UoIDbBXtZodv%T$v>xLyT5-&`(yC#v+q1V zlsU?R&!5E%onujap!HasOdJ&e*`l=EOSE2|IEfvmEM0raE4nRkc}e%o56{rQ zAut`nS#>L=>m0wjvqgOwPZ&^r;xjICZsz>qqkPZH>~e;T^&)$};3oCP?2vMh{@HN6!8A zqT{lJyFg&#eVx#`hhlJqHSnHukH?khx*xXxq`e)(v;EHkEX17V(E5)5vBT1TzGCrM(xVUMY%-iH)LPO^=d0$?!BUs9t1vP73^K3C zh1$ZWs?mL{SKjlyrfd4c5v`=96%9d^1i*h_FZhe9Z@uh^BGsJ*%=Yg7riH3) z@$C}QmuY(m&hI-4>fF42KS)MR$B;rVqg?>r#O`a}cPQ{x6R(%vAC_3gyAD$uWL#=K zBOgWz={x1Tq(ISCS3LGvnWO*^)8Z+5%xs$ogDP}N`A|B%Jw1JTYa$3&Cry~C`=1Wo zyEn#R)tDY13XNU{Pa^*qauhB`E=R2ES8kMOrJ^%C_q92G={RuuaU;hq7A>#iEG?}f z(ok5yY=Fv+yARcbxSI0Z*|>9r!@&R+`+@o6pLueW6PZNa@3VrJy+b*9-d7(FFKHjqNnaO7_NW+b=|5pqsDrkKm1h^CcH`qD*{Hw?8Ep7f4 zYZ9dT%O;Ii`_MAPfNcI1oTb%*<$&etisj7HBUAR@Y#NXIUOtWL9dIO7E`N ztni&X(yBM0ZKFV3wjX7Mm;v6b$^&MMQNTrLIbhwv+j)amtZ&fzAP1`lP>?Vx9irvH zr_Xcd(IuWPcq3XUIoiyV1eR;MDMxYx8u(#NpRi7(Ina}I&I0oAo1bygrFH2Tao~Q5 zB!it*E?@07q<~#bpA8QV-o%IYzDDWtJ4S)`w&vcE+})FSP1^^5vzGF-VqY8!_wdNo zBR10!6G{#TFeI^;%j%mL&WQ=Ygc8gs6x`jD=ZGI4Z;I#wSRMpLcL?{-rUy%jYKQfG zj8r=m&PKv%&#^qf7vx{HSWF>l3}5eEbk;Bdyd}Ymtjf!~dzo#t*Skrf*I}s^t*K{7 zpp&)$_$Uf*trvt&dW%PuqS1=MUuRpD0b4Zok;oTcWsCXQ!UkpluqHDTsRVKt+%ANlf7mF!?_ts6oAaSriZ%rC3@r0r64ET8>mk8kj^b%%s^#J_V5B z%$n#CkrMu$);GF=cz>A;kS+D718>KkgWeZ&BSLW{z!LSPl4*{q;C)yVKLuE80zl>q zCL+eK{;@p>=g+4v?}GnaxDEUeY?BMZDWF<8jkC}=9W~&pLKLb4K>7^0b^ju>d;kqv zH2YszsndiS`GC?Hh&^FRv5#vdEHRfgRMM3CUsbEfu}xL{aOucg`K-`_f_Z0vPY2Vy zmH^q!Z;2UpRQd5L&-D9yfI5T!F$eU&e_q49h*E~l0rp>T92PE+zsu3*j|bj`J0A(d z*zm6g*Wyr#;tmWaMp{PZn1OR*B z+#=(1$&EZr>Ae`#5eft8z^~w^3-B|z3}AMjL?Zcxn_&93wu!-(qEOgP+EqxVy4Vv_ zmlQaa$Z<6F3J!0M{t8I^Pcp-!j&>tEln98qV7Wi+Ud8vI4&*OiIwkf7Y~T3#yYifD zY-Z0wHKTw?sbT^K5G9;qA^m{#J&wiZa58**Pm0{FS-%56thWI5=%heC{|ZMbN_f~_ zR)df}0O{v{Mk>Sq7?9Vt0+zg9>Vo7TXSf8xIG|(VD;EIg0JB*$y(U>}-hsvgT{wLz z-)gsgj?|p8XGrBgGC-ydLgB?5LUy35V_vW{o{=&DU5LSoAQlbrN7TC7`4FODv~owO2P6 z5M){zCQKvw3%I@ku9`=6=&R5w*QZ+y(dpRZkW3T+n=L>{l352NmKSU{MPx1e-x!t? zzo<3($C@dXuX(G;1>|gwN)ozsiCGK||SzCo`Z#lRT?hb3cz_lo7*|-vOPl1cAiu{psZI>tMf) zAtI&ZjdZgK#I}Yw+!ve$atZu22c5JL}G*qPx)L#;foP{ZG&#Szl`qbd#~Sn3}FfSZ!MlC zxBPD4`#e=WviC9a;G%w8wf7`N#YlE{7DB?f$q`HZeCw>fPfPT7ROYsyL12<=Pj0Zu z(o^osy$?|a_DXhTyQ8{xja|;Dd&SBfYn3~*gv0;^fL!Fp*)Pph5b2u&HZW$4wnq!AObs?Ya~)L9zMH+ObApM{W5Gb5)jl50{%m>B z7bDeX`{Fry>b6F7xDsR3gV!|}))Q<8Se9c1V&^Tro?dEwp0k#@4Za)YefxWuL2^32 z2n_>-@}l^gm-%3Z!z^N$M9d0E#NTPfq4D$eYqfGaMT|X9Gp<)wYktDa&}i(CX%Q(a zUJh@qTWn^#*py~Jj6@4|@C(Mi!#VXuR(i|YMKW-qQ2q3InmzbiFB5d#F@qup^j#gj zTy)w5?e0F^@+_XStM;8XGTYl6WjS#PMX#@UXfU?&R#-g#(au;E=acU-q8FGq z%gep1XC3%ek?x(<4Gb8{J5z;YKMQxGs_7`RgLCjD!hROQ$$L6O{*%+gr5HU#5LLAE z)~mb#O0YJsuG~2};hJxKG{eD+5b@&%lzS+kn?gR`UxN384O?*o_TP<6ST8)XB>gYyV^c9lif2*Sr{bEz_ zmNItYlfM%9FENK% z#v?udT34I%^)j$oe_Y#HA2`2qTe4^PVj-r4w!?&A^q%u!;yX5k3V!DfB``R)QGlkS z*YD~0n0^oXG4zcz3=F8Zuv%%+{4_a9<7f(2bD=E9_fIwmDldnEI%}MlBGg`ama1}Q zhXt;*ofw(l9VRZN$MxRn&0Vm%WmetKk&}sXzKm}*p3&qHpbg{ny%?dO3>sso0j^VQ|5Q8``%`|gnp z#k1GqG<(Fe4gYo~7BKF{xsYR|u2&Kfp@cbSu$Jt1!UjsF*ES$ZE# zM0ws*SvYUCRIhHFCQ>5Z`hq~JwF<8CDwf8?vGh-jL9J#4qd zW1u>_1SkSiWi8$8o3`BfJxyh;&P%M>r4732?jQ7>_J*cCrmqcS>ODa=M?p4lV!V;% zA*%(&C|eS$RY2p=BWSlqwzw9RQ`T2vD6AFgs+*{fROg?BWTXL-4GbGx^S#yzBth-+ z6g7$V_d}tJ@C&$}{si`G+k*=w+gl|f&eR}*gKbM7Fq|PaXd76(K$Ki(!A9s561*E^ zT^+(_FNcyNlOImP#xkIdwh3vQWPr^iFld1tP(ce5zl&qm-X7pS3>_x4;7TBzIYZ_5 zLZHL!q?*Yb=i?Z}Uf@X;h|C#ViF^iX%uKC-R(zoyAW9SzhtvZ&x!8a1$tsgq0MC*b zo)gfibf#wIbaH5`7NkZX^T8J5Pk>BR-qjTlX%E3D1#)~i)Da9kabzxNfDNAk?A!#~ z*}$GV&SA#MtvO&dPCXV1&D(G@fa{vVA{?QrJznhYB{Sgk%a2hYYAU zGc$w=n?899B)gx^aeo3C*0P$_h?%bR-)(I^Nt;*4!l@3;o8;Jl+Y?CX8XPb4+~Zp6b}As6w#AR-gZ)Cpx63(g9=oPiVnI~;dcBxYBWkd&wVNhC0^|M8%%xYzgp>?9%*+hZ~ve zUCVE47#a<1Ypu+5OOG)~Ov4Kl8qBT>7r;n()6?}^c9eR&V0v_|&+i-+*L7gi1sX7g zZ@MIbpRZTu3O|t-e*@UwD2%-c1G|CiZZ_fr*CV^-0lh~q*0%fUBXB4D{CeGTB5i{o zO7F&~li>iCa2YDR5|PA5qaVOr76+W2fY!+!E=qu1*tPh7rzgS>o}OUS7xyobi*2fj z>>r1x7k&9J1PAT;a|=o|Aoiz>`0a*IW6Y(L$m1aI?;8VQ1PaP~bi>%--HC0{Eh|Rg ziY%CxK6Y<&r;D}l*rCf^MMVWUtUJ6C3;RE@fieJZhVw?~OgtUi8K5KD3n3Fr>s|jE zA_g|n9W6y&ku0$78raVO7d^Qo^tl@VV}95roo*-Q^$6U8Cb5ro-$zfjk=4;@jsyaS z2AIv4%|-kZhcaG~fVtUAdPP3u6IIGSWDM_+AVCwkUsa168sy*S1mqi7A(_u$2co(G z#_gG_=vR-9!@4e*MpV)Tp8_BkZ`&TqDyh@P{P^;H1eW;SsVg3=%G6M*RZkuf98U9- z$l_4Hcv{f%_YK-nGN1qkZp`4Gc}1c~fYDrm9$8p(vtq2ns@vwaCp-t)5p-2+4>ot~ zZHNxrGZ}bF55Po1>I-~L>F+ds4dUus@NB}^obKSBdUL2H-kd6Sd4)1CD2le!f-JO4 z96f*B7Thq-mhAoX>C^E;T;qRMRld{8e;8l2ivK;CnImzw%BQLM;8T6CCJEAbrq8}T z*s4xC$z}6RYYcyFo)fHG0@kqQy?fn&dIbjGw$r&K`@i)~Iod_Wn%^H%IXeyD7VK`z z#*;vt<*q~AWBPf4zjy>!o&|jNUhjvCOgi9B6M-g1u9 z8sTt@R8PSZCh1jm21rmGqku6cTdqq2{|kS;m$l>$`lSqY^Mfo^Ds+0wu4j>K;+nUE zSrnxQubh8>BRrTFqmY%AmHO?Q0$6;yXkmaM5JbB$gW_dnv$ME!WakaM3O+k-emhyp z8x(Y7qcT5^6$R-5~7kNZQ-h$=f9M9iKW+7A#`c(R9n3s^j>o=d_LJv3Rwcm&GHb~zRZth zQPZ(R&FH!`a^!8MA|`aSwK)R=i&>5#%>g(Q2_QsRj0;lD@$*Afd|;Hr6)4{7T?Y$u z^RTuOE0crR?o@9VyT+^tD;^(*au}p8{Z$>a$Z(vWM%TIS=HBcrLjrB=>KJSJW?{>? zAVCl?B`+R6WJ4H{DN-o`N5z3|aQebzBh=B`YihSpy}wN;T=+p{A!(QAq+7~KqrEDa zR(UroJ6>aFej(kjcdzEy!I)4m!_UM#U(=TFglS{hRI61e^6c3(+SX!c?%$z9)9Cxh=oD)uPp& z0X;;E)u_(n#~@Tf_CMzQ;`3n`0cfQgOGZ9ldSgeGaw<&tX#5aHAV(5toP)TKRZDQ6 zO5lLwfq+qcBa>a_CA^4T#NT)kCBoK9>dq=vm#}3ju9yFYRkfQB{8~}GX_87$QxxLX>zn?|Z5j+x|@h4i+q8A8+ zGQklsY|~&hqXht-6*&swFu7asM9ij`;T<^hC*->JL58Zvx~h#I}yk5ekc00ncU-RC%Et3l;|WV{7(GkUO}O;E%h!GH#Sv1#A-yF95-dJ zYx-p*U_fL>cO9qgOy?$5?~cVS@OBcHszOVvmVS7uUg;E%-?{2RTS`a>RaqO+7Ho0# zRIvrlj)H3=Y5K(u8V$#CeUk31SjP$&1${OO%ri@LPgjn+#i=*c>~a~}l!JlMS(jS_ zeuUivk!yno>e;#_T^jml`m4s?uvCf*vsy&7t=nGI);ar_Dx0B*rFRX(oNL;%D6%c( zfh|YrwrfbY^zKZX+NIY$FA`|$r-e>22L=YZ*gc?8zlBT?wM%5a0ja$idZl z8XB6efdNZ{))A`G(Z}xOrcFU9owXsl7tZnRzCABke*#qPxI00$sua}m0wX#%oOMH1 zmTcR{*1dd4C06$4>9HEWfMVOHZsh3~U&^K4PL(e&MIJw6+#A5w{l51iHQp^HJ*gpf z;VZ7&YoT(eU65X~jp+Kvi^hYKi>pxggSiQzufWLU&yTloX27!a9$D{X3lXO3QH<(R*_@CPFs&NqRk0@lar=!$rX?@6+zL!$;HJZ z$j--~b*jCs0pqfF*s5YPjlw`V$y!yAiw}r@T13&ir;*ZK{3S-ErUZ;rd9f zmU;Y~_pf$P0tRJbw@&mGV1KQdV6BFWw2?ccOUJdc#apl5Zk2~oWhGR#EM%;IUCKb` z@qjV;w<$frwzc)H?gxG6jdr#@D$Wxo4B~8G=QDn(+RyOr^$wCRrtVPron18`L0?Rf z#-jFEmYGI<)L_T8l@vR?7e%F`>}Awh>18`be4KF{ep065wHFw zvsL1x*-GUVpN-FZ-p*h$=SwW_9MA#iqLU7qz|*+jq<3TSP*+i+fjEtD3c>!HREfOa^^!^&u(x zMEPiB9jPe=tlr1r{X#blyTZHey6(L7`Bxh@wzK)wwmw^reyrts<0Qm%8P0AWcT&^w z%ju%Reu+lt>6|U9>i?Mi?j%^Qz-I3>7U1(9WRE4u4?sSQ<5JJHmGnr~zMh0QM{CNF zfS4`(yvprYY$Jn?BA$o6gFsVYN#TZ8JJHb2u=ESc>`uu?B|J4tnBk6|SA}Ut@(MF$ z`%);z)^z-ojxN>oE8WQM2d{O{8(a4Kn4_d%&tbS_I!a1MQgcAEw}^TPqgjoKjf$S= zSz`^4{;K^qzlr9biuhRUM%1zmxidmP{^DZ;#Ktsloi%$rjwRe!n8l_vN!}tkTXvq3 zkByp7cc*f;(3z!>Cptp%@Y};s00!C~n(0kWPW|NHe=p|ViN-`_@2XqMk_VW#g`R%} z-0jx<7S|YG!4?{)Z73)8g==Y_8F*W(ZHm(vwksMsa0@RqQx$Hd$+-mPs9EQg0KF-X*n_&nV1Sx~KqcFtYx2b#hf(*=D&VAXHU{f8b`m;5N*z#Zf?U|sF zGi>GzH<_CN^|_ACiJ$-Q_Mb$%z%C8@qsSw+ z(u^Zf0l@_O{5sel&2a>ZZ9r+JFuNICME_e`nv|CHMf?9wtKS zWFu$4q4&shL+yy}3PO8Q3jIl?(AOIUIVv?{r)}~fj+iA;5WEwm{2Zhq_t1_kf=k#tj zRjHEorS+l*f^1$BPocLf+M9rVRx^v}ud(O11;MCK!-9@R`eII31FrVN4{I7T^%b^1 zib%i?kpK3y>|)wTS>v#6_qy8T^Q{#-T=P2#)E{;+L9TI^Yku6oDp?~>#&T7?gj`zB zh%ygTu)iBBbxp}O)ewx9=loqn;UP`k1G}VfE`le`i}N~^?J9K7*y%yNdT7S90iJKn zPJc(4Mw4tm^8rGwiT>@2XQ5s;9!{|4qvZu9O(u>&qNMskma zs#ZStDC6C$Z-BY{a`+)%SD&(mY+C}!Ofu+7c2dwGhL}rvLPJ~$Gf`3Sq>)Rq?cSSQ zS0XMr>)P$1JxHE_3JX}md{Vj?6s!TGxVRb^fiYJcie$EAIqtzH0k3bUS6pU+y=tt5 z-ckc2aLOU%rqcu6T#t@?=T3%h`086G;M`PVme$bZ*8zsicT@{CF) zfFawmuOpfLkqa)3-bwX?4=o)SK@B|Pkl_M_V}8Is{=cPjP@Jc;gzrYG=G{CH~hG8*1BYNgR>H0QIX91w` z3|fCJXK5XsgpMZtI023<0>KSBWwqBkoTwlDjA;~HpwZ4Thm82{9GSxX0r+SI$lp+I zg9H8QbYR-4J2lv9gx@9+CJglfSaDtt|Vgo)W;`qC` zDz4XA_Fv)Xw3TaZ9KIL%wm9q^s5SS_n*$#Af5l{=Nz46P&FTh^yf*8X@iZ^NC&u~i zYNcKQm2udcLcto4;HVBwuK@HVewMnwmis?h986Jo0S?W8TWV+reE!1W9l>h^TmU}} zpOXUGp(qj%Lcm7;3=eo9a0B7GqXc*Xx~6rf7PTCE%cH$j{NK_Mdk<{a;AH`9&&54U zz!)so(g0&{Y5)3BREO<14$n4$-}M{3>(HraMphL57!<||s0Y(il;C6m%E5o>tsZx{ z!R^-m_;=BIy`n$@?(iSUk>t@(2lC)US(C}pWey7f;Qn1fnSE%v>xHZ#s6ig}23Tc< z{}s{D!E_r#*by8wU9 z!_AN2DH(%9yamlH1J&DE`G7JAAVUYarRWur1rtxY@V@;PX#u=vFFMh7#Y7QE3+pst z7k#(eqmy}K>J@j2J)*(U(-Abb?Ch&Wd6dsq3t9=yq*mV49uNa#!I&n_O^o!cJH1#dF8?TFu+db{gW*bbT-9DnBbyrUh%`mD1h4}rx?G1dV};7nTdz{u1U zPtS!+9v1*wgyTKCyQmEi08{qBsKT_}zAp`ICPB{ZN^sZ$;b(MUhjlur)D|hPB|go0 zBRD7D1el-33gy=2xpWf%P_#FPV-_>9bAzWi6Pg9>V@o?y1!k_c9m2I?%B%%QXQqB> z8#1EvbW7W4bxD#_QfjNb7HcU1$+)tT+Ms`!EX>W*4mD(ZFF?!FQ|;r^8y0b%8fokW zFv9uobcm}d*^n&Tp<8H@d)$*d`N_~joU}Gs0_T{a*%u8=eG5_D-EA;Ee|S?9Yw0sps-D~6utSiZnBtq)yI+w3ualFD|La~Cpc4YV0$jK&~ zdisn3Ff^Rk%WU$olr@XP!*~-SM{mpWf&u5m*PtC8O@KH~8x6D^TN;h8nylW7*1AlJ z!{^0w0yPj1h<=x+gEm)s`;v`b6{Mxho*OAu#b7YTH#(cq()&xHr~R@M#l2d1O8d@( z<-YHhS5Lucdc5sBbM9oL`URg23D1)k6){92Hu?&w7J36JvmYA9 z@w@FVHGF5Vw%p&{T8>0{1p<=gF`z;L2f>$5e+jO`S(FeW)TG3W>+cK=R}knH22$SE zuCpTD^h!6t;XUF}n^gKnceUutDAs;IfsPA0*6^594zv2Ym)_Z}lOIcRCi8mxmyR29 z(>DBYzKv$-wZX1}Pmx1IGMl{fo<8j9g+kF8WPrT8YTNQ3a%M>yGK8Uie{Y9aV4NT7 zt~0jX$IaIC-Ad}DLBl#LRQ;uNgLMlvRA}AP_R0v5(c|WxYgc@I9Ckq{o2(x$ch+0l zRS-g2ynXx6?Q5&Cy&z+j5pe%wgo z>6kHV;e4Mx462_Ur=pTfs1)!1!6=7H<&G4$4 zgpq$?z*l*H*#ohOsW=EdF+D@heofqE7cVNsy1%u-w-76k#|1$UEd0^gDX;5fwo; z5p+3MW@p0JmhK=&sFycJ`XL~%iHF=atM)Pf^*SJLU~RhdYoW8%0VjGODV#MAdXgfk z55z6oi|xSVFz@pnu`-=(Cui5DJ+&e%uxWuG9}p1^NYdUeKRmG}FPYh?JHcPnm6h(m z3-2Eb4AC4^3l}%7oCCO!9n`nXbp5ijxMIa33g~2JotQg=Q?OqspOz4sLTKF`8#)); zLG*4sHnl!%er_(|WxXd-OP1fjE9q@D{_~As@J_XPa*V_m1R<(iZl0X2j zDHYSLsfKpZHu{w!OD{7$Qwf%Pcl(=E2 z7?}!PI&r8%RL?!z`@#_qb|x#A;!}vLc<;%e02Lbq0=^C-_&qzGs?Us6t(7u?(p@~b zqbK^mzzizr&Q)5N**Of}D!xv-8-GIP`mY2X*8P3r(1$KSg(Xw*Z0Y^|`<1UtBJD|N zCQj5&e{)CfHSN!YUlQj%at;z^r^8r;X~qbBU=?`SM#Q?hutZFTsJdoEhkB!FW8&{6`tdev7(8IFM|aF zF@#jR{4KsHV*sC;hbloDf`NQptaQVL%{(f?CRbpm3n<+qKr*o$si{9bQzEarPRV|F zAiME9M`f{|UK_UQi_>H}9?dAnCw%bUFIMnH-K)ioh7cB}#j3m^$stXs>$*JSHogJ` zV)h6yNp!>~QcH3txWPUj;AuQbbX7AWw{7@3x;lLmEc|Jq*iq)EPB}oe{Tr!?nRNsN zTfz$fqyyVQaLJkJ>3lvivH5h>`?$Pb+!PR%0EInfG_5gTvST zx#91&va+!O_LY$?(ao>*x~6)aJ5K!orO9*PSSq3LsICIjub$VYx~rCj zt{a}$$P!`5aLIOv%o@dKt0Tk;N(gv$p2&sd-!bR#b*LKtKU0`&@?f z6?6&VtGoTdr+YSWzVpt*?uBTpR&#J%l-aG7Zj|&MVS%qZXo)Ckc5E!M@}P*6U3$|e zu%$SccP%{cXPyuRyT0jNto48-6qq{k`5k^{`*Q?FpjaQNMt<26s!maq>hD3g(cd&+Mg=_3;! zLvJ$5iVt=Z$WCz#RC73yKT`O~HpBJQk{cXc^r7^2CS^ap--&J+5}BJnUlemYw~(BD zQn1srN+3DQ=*;BI=fn1oCb?73Gq}7IgMWYIxqf|3#%BL5Rzs5w`3 z+#THcQ1QVu9fDGv-Nc81AV0m7A9$A($ME1!1zMZT2I(Tr;euMo>42eu7jQ%*h z7GaPXJi7x)j#3fp1vZ2-gBCfmc62hbTerlu)ly6RJA^+X zu=2-bd=~ep&zIze$hltxOC5wfBU*n?2co`d=}uyaA(gokEAz3M40wcb^d|Vi+Ss-u>!J!>;;HzdI5<3+h(XuO%M7nzkFzkM8N|Z##CG z2Q2Knpx0JWBtIS&?C4ODAPp64cD(SHT^^9IC$@5aOWSotj*`g?@_!?h8GPS4PI4pv z?OkuqQWI~;92^L5w=#gR2B8iN^*$NwBGeOXU>>FoJ+d1AJx+J;Zo6J5q z`BUlWx5?|$KtI3V(}ez*UN83iTzw)rY?szRF=h5+z`rjJG^Rm0T#t*_p>U)D$+^&e~&Brp)O+9?9Qn> zpYm+fh|$WzJsQmcx|-BsYC^_@J$o{$T3?Vv%L_(XFz+D`|E>Th6 zOrA8bh9sk|8(PaP9sUUPD&@G>uV1H?mutfr`Gn$u%hX$r#IXH+pN(yhCob?x(66nn zJ+!k!d17;Oc_!8>cb8lILc96P!Jcmbk59v3bRJ=f`I;28Ud>2&3p_bc*|DPY-KOX- zERb{HRP=o>#Z)*Z(G{tB5lU7+edBANlX`=m zighPN>UC6g2OR7$xG%S`HEJ(jERi;idhC6$`jEtbv&60H3c`XJJWNn&D2jFYfn^=B zmvO1|8N~W55S1o|C8AOXQ4{3I+s_}}A2aV`Ja@;EiiD+SmgQI0rBo?>xra1DN|9AQ zE3Bt0FY`^ewTUx&*&ZxYMo810M1=2Qr^drG)|Haz!?>_j{TbDit?Jr17^jJ$+I=8p z?Q35+S>!VL^?k?%W(-)F(hn?e;ET$Bx?aTg5!S`U3j&gzBt1IuPD4H|u_li^-XXZ- z11tiCZr_eMQ)Zc*mGXs3bFFySEXli}~7Y43>5BNI>If?dx-lH!{T2+K2(pZ78)6krK5vEf?Qb6dQw+@2CBkq0kdL^`ThX zq5b5EFV;*GCrzuVtC@smVu+q8(#tu0_Gm&1A2o7!bccc0QkUg5I3-s7-YMd^?OvPJ zQ}I;{S^iq0v%><5(o@^&1p?nyd3`rES0-r_o8|qay&?Ibkd4V|57TDHIDFOkorYeu z9Qsd*hDrBjDzt99xI;8d!cN5&n^~6#Uqhv4qgXp8gps#uQ>m`}`b+baUgUjHv~0)`?|iCs6>GtP!lq{e}5*lfA9A9n_tb;Y<70jKkcxN zxYs27?vc7-m*|S08WEj<_Ch2Zj0r{+5rpok)pfam?c|u)U5swk1o@e_ukJbT=E~m1 z9T$(+{XfwbVW)VbCUoYLr$lozjZuPX!TwI#+qTM(2b;5IwqcY9FTC!>;~%0e{cMU< z1G__tN6fW7u}L9ILgdv)^SQ#;rI-CItbM=bfPNhHGK`NsTExMkYx@^G>iZlhJG zy=*L9B|x4ODwQbGTb8nweaV(ASwqO4?8{IZ#2A#K zB9eV4`!38(hB1}Onw?>W8I^sTEMqW+-_iT|ewP1#&tI7FEa#l(ocmnYbzk??A+Sb4 z^p0O_o+#ua^eF!*WwkY2vShbFCa1=}>!qVquns;}#Pr2=pN97>*s3fKyQtwf#Jx^E z8fNZsjqx^zL*e%XiYC93~V>!s4b;F+7{<&BE z=jqck;*?U-K=tH0G8rPWKQgFAkd% zvDDPOONU7%cYsc+XN2r+9dl zp?7NzQFJn?e|It#ulzQzhSjH(q1KWlxR)|{7IV6BL=BRwU_k64L%y`fIizQL>npF@ z6Fx2bJvC!@MGklmsGI8uUY9ay(eFIE_?Yo{RkiWg>&K!2hL!~C=icAO#yEV~C zS51nB_RQMS4as&3GBK*(IJDRi{F<6N*fUC>2fQO9D+9;eV)+&I}dwzVbSFq^0LaVnou9o5j6UG8NQ8^81J07758aejMai8!N5 zYMLqHuMFa><;jcgx@`|>aMph7d2dcW$m6~H8BdO}!&JIzQ0s|N8e?Vmmr-%tEH}n; zWS%{d8gu1r-h$Y~!0)So%Xo7WYxX6cuOM`Z?z<`Bq%=tQF%*A1Aj&~`#M)Y&BK@SC zusg+hd+B-Lo-cODVAjc>jzm@Rsd|kq)lKoQmuLa zPT_7VFl)PH-8Z&9i=I5?diU_^)BT{I=o!#^+;Su4y@`j;7L)Mfp>+FikFB1jNuOX| zDMG+OhxOO=#)u7t_YMXkBlP%6ON%>*7jNhH*YsuTRReR9?V?D&?0Ju^Py>-tVxD77 z;M4M9i@jB06HQA5G~hv5kCSJ`{4X4RoPxRNZ8&;JIhW%~X>Mow3`*0y&d!y%xU?qf z6yE=BVt2F^H)&e#{qRO-T-el%&+oFs%{d_}HP=75xMtpxdHm4tz;F@fibm7xt$Jmv zIM~wNQ;hmlg@v;U|BA~Di1VhZ>`7+c@!bi>g)aY&EX6SYcIt^iD!tWUww*`b7ZLz9 zKDiFgyPL6}asal5qgXf^o)a0Tls;GuQ$NPeyL8N4r!(@#-$-)@tK%r=&X4Yu z4dBu*=XseiCjT1xlqcHUdGz2|?1__wO%UaL2m~~_aFKm^yvJ<}^k=<%Ar)=#k_p|s za8&6K$5->k^eT~~@PZtmb(?;Y2Bo68kuyQkf`w@{aYa?7bM%;=yO>bDL1# z#A7feScc&iGu#=PID?9?P!5;f5!$L19>3vu5-WMD&a$>X(`=9!VKmcosB&h7i%a;Yn$ zoey?!5!Hk1$#TSBH*zaA6n1ZADl8t6wc~pEOkhvu*id`^`u+LJ$d$8|JU4Zor{A+Q zt~0hQ9#l3-;dyu#cCD*)_lo;7Z#k-M5(7OF%2--jYG2TBtUxqkEA=958@nr6U1VQ; z56Fn;;n)zctXD&>QJvaz@K&D+5%=IxbzLS40vP+fR=z&Mj}pc;iXZR0bZ9S~pLRWm zyt!DssTwssjEYyF6dhhMTDLMGxVqCc-c ztm+rtabz99XsL!;#dA?qwr8ckeo<6y1!NWu3N6fKuW#*_N$l{`1NahqCx z2-i!q9Z8}I`C9(>McEaXpo2MetXF~V>;zk+%4Z97Uz7GYi+KCJ6ouczUy%+8&HQV@ zNy808E;)z|E1DZ(?_JEMmPhW_41_^WTM?H>kj@)I;USdwqHZ!@?;9$q8aH8NTbK>o zhRuB*1WjYtU7^!+zrQYhSlr_lOBJUAF+TxO8Wr|CvXL)PiC9Rr_a_>hH>E$NSsmUs zNpFhEsLcjx0=JcZUhOwu3FMGly1MY!&|%>Nci8RGaL@WHOJZKRp0jO-2I7Zf(X7t? ziUUmNDPM5OrlP|JCmjR+?s|lv4&b>k$tCyEiVqc1<;=WCYA*0#=3m_5+ba8%%W9A1 zy6!Pia>4Bk{HIvqf^_i=+@qZd=`m0=>1^jZnw_0J>1@S&B*UaG;N=0csG%|1`haoc zk7Ctg)o#i1CtA?Q*%q* z{7`=yWBU$ox~KYCA-ymIO>=3_q2A*kP|zImr3`#`V2c%yx)c&C4%1j|e|;h@JFE0l zH*F%GRUL=PN&6jY<8F5N@eVaaP>gNqR?PDYaTmTTY2xm7SEpcJmrZ)*X=FuczOg^x zC}wa6tMt#)UUB^_YIHy^IJ!lB%&gURJGXW7x3z-OfjU4b^WB=a#G7ks@Iixsi|w?^ z&cM>GjpiQ@UEAv6xY*R835%B7IMy!)XDXRW z+x0mu`WuXd9Xh$}NcwGa&Tr(iral5h8q4!3{Imfm?6h?dvT`cQr0StaPWWQ#!1p6m zTaB!T0+zEx?rgh9=9>DCl(3}b$`w!eY+h7|Z%@(bQZSh9jhEE?Jwq4%xD>Um&gWo3fgd&-k^Eb7EQ9@56C zjb{evnu-CrS2n>cH}$4yy3Kh;GWg)1uAV+QXv!%Fv<)YDnGS|4Tn=`KuHp~p`6v(j zJ~`MQYi{`T0fKqvpM6w{2Y^9-d<5_ks7`)t6M$0p(aJJ#i0jjjs|R4+0L|zUvDAKg z02Enov@5hbd|NjLcIcRV=;bT>%)IGIc=FPX3Ey+!3fBsqAi1|+jZY`CHi(9QUPCFH z-LMR}$t2Kx29*D4(3xe0JTEkq_*wut`F2?g4u^w}m7W1`Qs{v=bs`Dp4>@v~gX`ph zk1?j-bOAoet<*1T))*FSaLfm<>2UJ@kVC?=_-Ai{v=AufZr^or0vS6;yeh;#>sltY zU%u@Y=WycLg167Va7H1he`#FXyJrW&Z~Rg}9sVJWmCK`V^$&pADi51FDFUEjh5EgR zsUk-|c4;;;|7r8S=>sA)E7;jVl<>kT&>8gKxC((3J`dmnFd0o-jeiDK_m*XPv1;asy z=D)0eM_>#%J$=x~zy0o?0V)M8*H=uu6aqOWf6n{BJ~I0VCXfbE|8Wy|waUbr1nTwh z<1YP$A07J#1Xm!;-#W+%?thl62}nA>GJ-v zk0Q%)d6xNo1leo?aUq!f6{T+xRtw)lS#Ra1P%#HoEST`npBK-#AoB}|0WV8W7J%#rnD2zZ8UcFbnK!sz#uC=0ABEo)D3%P=78XqK&!i=x#q5 z7_eMsV6W^o^G^Z5?ACOy4ZzEL@yWWE3Y4y;H&s&BwV1+f-xCufUx{j|y>TIItgfz3 zLR(r|fGLdM*6P%xe`DokUg%opuDv1EIVX9SKisyKnD{O7*}$T~>$`Q?x?VKnIM&Zg z!L!l-VtfiJV_QTl$9YmMRd^H@l|MUsL;PlDL4j)Ow^!v_oC53W3HDd6TzQLT=ioR3 znS3=~bjRGh0cvF8Wu?4lt_Y>iI>0jnybWMu)!8&Lo(WH*s40%dvBPbR2_0n@|P8GyKgN98$_x~M-i zI9PCQ@^YkKvA)fccgxe~2}F%BPIZY<26i~;l&P8h1=gPTLi^c~UtYy33`{s`v>+#; zL%hNDstL257JHzBIQ6KYd>P_yl>{oH386KGvF|lcKvIFR z0;dr8cdIAK$){=R#_u)pO2RN`Ac5TNl8{imKjhfJklS*p&3$jed!=0PxGb#j3m|ju zctHAr@3_~zurX_2JZDTO8`~`~YN>fQ1LH zVm98_C%)vLy}W$W`e*h$v2Re!YuI4ezYup=z=pI-iexvk85o&7H(Q!n>pdJbM%f%R z)%ftArBceH92sFdKXnMU{+#7Pd2(R;&X4xvoHn?%boe|Epq7cT)rh^o_M909l}iiB zl5c=*mHclpIVcV28k~W2rJV>X5Y4w^a@O=}AS~&^;f=)MI~Ept@6A&zKjbaUZv^!> zKduea3FG_-3!=j-qqUvCzdMbt?2~Kt0(3z@eg5(Tyv*r9i_fF)d?zyhH9vZkQw^d_ z)rcC#)k6c`meuy+US%Bm_hBPg2B02{l$o!J69Q5R_NOjJ^qU3V2@Vb}Kq7~-ZWoQf z&dU7Nx6~K!{;jS@RrJrRn$|BR*rT==vg!u4S^pRt3(I0%%HE(^XF=yZyi&5MQ*TSo zNJ^{k-ys;|9qA@kcr%IeX=KNa(w?cQnNMB?1W-8Vv@uu4ugxwmCoc?FCZeJfbVSb+ zgTiAK!eg$lu7{$Rt`ed`h4IzPZ>Ks_iVtRfog9|0D1XEpk3ylGm8<>FI0Q|d0*VBW zmnY0R&0AQYHubOjP_9Djg8pptqUFwCn}Ynt-vwBG*wI^61%p#+YKbC#H`JVcnI~s)-IRuU@h5ObKqJxXY z=hEONpp1hOO~wZ5<$6SAJTSY?DHobE94HGMFEtUC5S~6cO(KV;4%(CW4%%fPB7QGX z+3^7!k#CE>m-i?aYt4JwR+j`iPyG&Q*WRi1jV&5uQRVRAHsNeWfz-XvcgQxsu6_n9 z20I@p;Up?g4yl91EhUxZktPv@<9h@eId_^H;_yorOVXVSx3pbOF|RfD!ORI+AwA9Y zY81IAd>zyisk0c~V6-`HH;1 zc>K`Wn`P+|!W6)D2=L){?On#rt+1hYUw+*Hq?NBcb&b~#VHCzIXqr_^UBqNUcsfW)}mat zzH(0{bB@hNR`Ggv7fgJ*ns2A9tUUGkIh)_=BAP9}olo#wQhpCZZc2b@JT!z3 zf8A0$iMcR3^4?ZXVm@(Wd;M^F$N7K}`Iy+)j;*zsDUfYeyQV&`K2n);SKj52JrTQSuQ%0HDxI}DDpt!hMARyLF{wG>9rxZK;T z^IPdCiIIaf&=&f>=j>pN?frLW<%Y~}1?uF3FmR=t=7V0U*U>Vk;jY+4^mI;VkcH1P zW_8AouS*vum#6UG9hfjDss`lrY1iy!mzp&c3>g)`V zneQFkpb@(D-Fmb}o1EW=xNjY?A`VNio11$a7I(38_T1cgAzdTugDm76)<4W=&y%Rr>c>9EWEW^*^(_!a&&z-fxun=m$BF;#z+9N?6)X8%5%7OvI z38fk7;sBoTv0kG9@?3Q7UYp|n!f4zKd)zTs?1GOh+!%MbRon!sj)l@=IBnV4ZDr3{ zp}fKy^Sp zfboF)?QaErHkA@Q@4_1rSS`#uF~b3Ung&kYJ*QpG|AtV%^i z#m7eKZ1>4tvv6wSJ?Wr#v7mRU^F!tBK;c$9`}LqGaOz(6$Bt0%F(tC7Y*rk$t6yvb z(p~3$mIo>)ZEa6vQc?Bj| z3uqrg{Vj`%yFX&n7{-Q$}DZY-T)_k-yV9AH+6QRQ1(pmT*~rrYk|ac<&_gd%hs>BK^t;&)8iV z?7eARIMi1KOsH$&G#}x|2(#GpVJ6);ddyM0*xUGTh0D%1`9tDT)Xo z9!i`_G1B|`{GzGqdet2VrFj&4G``wT2RW~iK2&bmSQmgF9`44--9cNnoM1PUG3X-< zD^<6^DOh1mP0i&JOLhlEHjWpPk8W#&NnY7a=;wgyTmFh+IcF3Sq4X2^X>{3q&8Dz@ z3td;J6-rxvxYg3mChWGVJofhr z9U5x5sL-Vw3p8=E4c4xS-Xf1Fkv?5StyRKmzjw3@i zoEE8vp>?zXTx)t5lD{A@t!Cy(u)|Z-W!*sS(YUR0qrigzdtK=lV{ zvI+Elajq$UozZSs^#JAC#;-1?;ALB&4WA{$KDHB1c%Om3=8#n1^tou-|xiQk= z!-G5-nV24HKM@(HqNnJLXr>d$-%<5ikl=4#gL7dbA0C# z>rx_}XXmvV?DSdH@)w&Tqv_>y(aeo1RMU-guZ6<=QY*|%cgm2F z4cfcgcFx`V?RMFfz%&Cm{K-YT{D6YxKk;Lg?+$jI@tu4meC*dBk{%l6@vt~w33gbM z`4qdoy!XgN_k3kuIm?M+4E5li6sdk%&9?#zNKN9q`1tN88wG znADaXoLrp?y+*vZ=gmKZ$QH>F#I?F@+g+nA&>W0GnmaBw6t8X?!NP7uefK27DB0!d zOVfMvRv8bpIyq)vSXQnn%|7F__ERS+tu?H`eWB7TbPC!qEp!iy{{Dp$Hn^cYj@pKz z1L-?eDW7R-9q=EBY}i69hF^`e)Uz(DwMC~eu(Lg`&gH1X1eR`K!64pP0L?>1oAYE^ zD-W0}EPY5m0~8W|5lQ^uZKr)cq^PPOAl%KVxA!$#>T%HB$gEJ(P`sB9L|JL&v=M7q z=Gl(xtaqdq(>5Er?Cr<8+(P)6R`hR|6vmxp8{wd<(luPT_SRG_(}cgT!By$hL(c;? zRyBy;p}O4Pg5-ojRvq@^W9=7iH3s$QWv`joZg=M}#5l(u@q(sC)H;0Arl>Kj7xtGxn) zGC)~#RI}=s8KZ0oRSB;Lb)GOaGm&5?%na-rL$kylYzIcCTW9JgbOl!7m7tm~rv>jK zG%eSnL|>(A18b{~20$Gqr(ArdSotKzDUW-6uD3?ZO-L<6Q(jyEh% z)k~M{rDtW;@X6q^EZ{nw_HluH)6KbAH*i-!H9GnFX3&Bb`E2PySY?=oa*d;MOeif# zlMBbUSVJv<`{2lFG?i;V)G-1rV!vqi+bU=pGL@Xe8s0>SL*U432eB+T{~#A$y~pH7 zxS3VeY8vvaMvfb922DOs2{=?KDmM0;E;bho8!V2U><2~=!F>w^{;rMqN{w~@g}Ih( zUfJ-WiJ|(y?P`xT*kHN+dZ43r^A%jrs~@zj6;+|xl{wW`4X8C{=BRZXnby%PIqOCV z*sLV`j^@tLY@!@&e4^|_N`(_pwb$w@xya97&ZOIZCUi+r zl%3GV1j!78g=~7*UcBvMoxE+zs_JO9;+E7>&ohS7m(cUyRfac&(EY&!*Q>EzyE_FT z_21rBD^77Nm=}la36mP7=qgw0lI5yDAyk}(5iXZ=oak$2(+n|!vCwd9@G2A6f`tC4 z5uN@fBoq6LF~%iofO^hF=A`(lY&GhVu5T$1AE#Io8@gF7ys}WnEtc4-{E6~RVkei& zuWDsBpg7st-Go5&Ya}@F|@!325tIDjAKV+6==Tdb?A|m?q-X zDHr%t)HQd8NnpX!42>9yqel#%t$*#M}^tLy`Aj)z|dk$Jf&ts8;$2tS4;_^&A@QVDn}f&b`qn-^l{i z>|Hx3K7$>nG`wr#z)=fq0(;$BMLXPN7p3`7(9n9UG=lHZM=R#L*u?&lUD$fo<$(y} zmsd(lOA=2DhYSb$I=`!IoNi9xa!jM9Uh7f%7E*Pq!;e&Gy5}$*#6ih#!hOn}>c@7^ zF{rfWWGSw`SLBV?FUj=$PGRR&su3cx_6_ZBNOlXUXvNEkYau+FX!&1UIDQ&Z1UF$F@va}u&!=aNa7W) z>lw^OLe5AXbg&ldj?@qK*E^qyS2g0UEpTAMlzOIUn>DuqYL*`-t#Ma~f>ur0<%rPx z?!3A~ia6zpFmW)$_&*cRSfU8K^QA=&r>PnX<;>YOeJdflpuUGtzV|$Ip+$8%9aCs= z(Asi_;BT9Ys}~)hogV$c0uW*4TnJ>u;8=b>utpH^4-Qs*^SVO#A5Sqb$Zj3V6Rka| zV5B;)i{}n|eD_#v+R&4oA7C{dK>f=D?2A=Ukk#q|1D)ZEc2PZXfBCsRczlPosbzWnx3&uBjklV;ZM1)7qP+3ZKq}J+*0Y;o7_AP zJ`YQdZ-;Jec9{3eUj@8T^97q`dg}G9(jM27xf|@6`YdS3F|9;aAg~6Q)S$`0snPp{ zDIRA!Y3~6ueko@=da}fVVX1@hK}-v;A{`cC5thW}-2|T+!q8Y|z@-Wa>Bm6|E<6;d zPSzV#DMqNlzOVHl%76`N^OOtA`C`4o&X>n0(q!C`^tMOvdY!1G4JOq z+cTwlq|o*CH?Zz%uF2M4jbTf%K2$d2^CPf?MTOtVXFWj~d#1Tzw>`s+tm~J*clRij zQ9r$wZ?{zQE2dxq&xPotusfoo)L!lcw1;jmP@3xxw+vGKXVmC#LztlXIl;?bw`g3AFndr3*LWHOnGv2qu2J{ zyuO@Qu86E}YO*cskSHFLzY5b*dfqF0UZ!jC*n0W-4NgNi;q(V?&6e&@KRSJ0c-|PH zhi*#t&)Ujs%)u7tmkeX;$A{ow*j>;H8o!%yJCydBq2I&Ls`PYbcNcN0vpzXKtr5o1 zK(Bt)bHA-2T}Khcl0`eVDImyxD#yRyUa*3NGft*&o?kY9BKyGb(g~kgCG@;$2Leb4 zGHRbHt0M0lt6Df4ma`E`mtkDx^`0-m`;r*N?NhRs7`{fwwl}}L7@Q+C0ny5{vddh* zKYq(dp!v?(FR^@)!+t;bd3!|JvMQOuHN_f!<1c#XCtM{7pFt?H6xJ?$_wF-v4+zg7 z0^KL3Tzr1(r7;<#_=0jI<4H+LW;gH*EVG%#?Ezh@5!L^rXSO#njw<-xm{{bfd#x{pXiMsT^cu0MLQ5g-OZt zeThT|#9E?&8tg#1gi0Zf@`A$PE%4c6gnhstu09%7#RmEOn7AH`xqx26Gy4wyNe4dW zrt}$k|K|aND2lEn-;}kP*~RF2vlbPVQ~rPp5KvQX*i}Mb4=3xISLT;-BOAPS>cc7< zJc(qoWR{`$6Tu@*`R;KX9DjvB?!Q&vG($QT6AuS{q+l&du_=(ou1h+|F4i*j8)co;A?ASE;QR?_8IEs68!< zzlA_x&tilWp6};2tH&J2{B2|QY9}qd3iN(pRlUVVCp=~55{10A{V?c3r=G^LN9y*7 z@Up*7z3S#*LOap_M!7I$&)e_5C~|38Eg>rGy_uZacIBiK4o0L;k*N5sDx34=w2b3* z+iT1jKFO6mJ2xR;dVVQ$7VV6g1Zhuq&At8hObs#bMXz%d~$IhUX zobG2<5Ld~@%Hi4r`zpWUu|2mn@|(S#`0su#?DD!cHW~2WAd4LW`8hv8-b`{|EXy0^ z+?{3|aK7^3Z}G}GC14Ua=bmv<+^N`XIc&0&@pNb4o{X685ItXP#*SY-M5Xznf8s*s zds;y`lBCk8(c_o9Z<`JY{~#K;5xs8uY4>Or5?= zI{-@GG3zwsMeN-Rn5I8@Z8F>vRAkMoa76?tX+KN$6j+|aj1_EKd0TyOPSbA z1FJ~D3SOm;(Wu;}p;i1?f$_Dk>~0=;&eg9b`emtvWy6D5ya>+8-e1 z03^GU+S-;%@?W|_lD=90FD^(Guy*!ve(gd)32~RB- zk$faMWl-|m4&4LIxeuj;yu)l&T&0p+D)30*)|{4pO2 z?>#lD|4cmhVh-%!;9Eg`X8=sqR;?t;aPCUDq#>{~&I^G7Y><1deJCrUyUnkUzAlEH zL1;rf%B}}&xGGNW-^9lct2h4+Vk)}0p5Wx!IRDHV09v&GDx8y06G=*;n`yID7 zEqAj_nVCS1NZ&*IIV|aV#QRVHOQFo!X`NR_XHZk+7L|U)4GcyJUHQj}H%2rk^=A3g zm-SZ-<2P!li38x>2)t35oy~8BE3&~H4%FRhQ}6IoO84xv3|&q>2Z5Z7LVY?PNVre= z%Mu;C(92c}l1|a$c-DHrp^QoIdx1hA2_ll=-dacO{O_Mqp~6T_LCfy=g=(C=T*Xqd zU~$-$DND1!d4D&D2z+bcIZ(yLQKfk;oX7(A`jG6v_vWkHuAyATVj}xlxer|K-*eO) z%F4^ruK)2lxPB$G##|B%Is>!GABIWKc!tt}h`HmUoRTikUdnSn3=*?-H5L09W2i}P=PEl(2h8m@TQ zdBlD0%mI+~1JVxkbUwtgUPbU^nU#I=($tI)v#!_G*4CZ`(4tg5CDnFm@BR9a_uEdW ze6d({zPf#z@&39GTA)mEf`qrZECZKZ)d_d*`^?!{WEeeOdjKT)`q)%K zm4Lw%I1G|fOQt&bxr#)8-3TpeE?=%M&zCgU3!-G1lHspSP0Nhe?Eb2sGSvE*FK`%3dA@rYy?~mP3(9(kLd31{HmxJ) zy*4ng(3|$#KO9%q-b=#hq}?^&^XpiZSrtT|)n3iob$bnpM=#LvsjzSJiIEj7Eflz` zb7?ZOfydUfSr{BoNdvj$Cr5&fBSH^rP%h^zJPfH4p4xt-5;B#(sJfZGsOD$Hk@Z0U ze!l_!mh(D+WRXr>Z7d%UJp~eM|yt^PY=u4E_^t#@8k;!$F1JH|Mvrz zCefl|@2(3x{ZX@^Hu)zF#n7D(O zb>?YGc9gOmc6RT}lCqw1Fjd!#sF?t3uHDzIz=Gw;=za@-`{Zgn2`_w=zoe2!^6-P9 zw+9IJ`+6WqfBC%w;?5q{dF4`{%1c+uxN1S6uf{sZg>DAX7bo5tx09cl6a<(7`jquA zDd0+(9a)JKwohz$DP3FRln3B@dy7hIK`=%5Tuu#In{GJ#ZCzkrTmTWURRoc`%u=tp z$L})b6@Pz!A4vILcbar7yB*SJB2P1_0FAZ;CD(9%Rq_{7<}KUWGG(O*O*eorA?3{V zOH&b1g&SCM+t@d24~lzAp}udtOJ{OJ3YdrW!6IjaGw)rYvaAK($K=E(^ucLg3= zVl8e3i-ej)I|Yd;P2qwN=i6lx8+r);8`jp=1xU9hiv=*Djz!0M4@q;ZcQFr0NIU*1 zkLRr2$#(Vm>DqYzSCANzPH_^Hy5VNmLCafBYDp zskT>St38@X0OB>re$;cGxxHY&B{XMBQ z==?7`w~^p{?|iU}j=Mz*nImyh0)kSgHs5@M;29Ap>2aLKLYFfMor~wI&xYk7bIA>X zb{e?zl%CKyV_IV!{ufPo#mA;st^l6H7*@%m+!*Z98IcRFj=Ee(!RgH!q;>n7b$rb< z?7fQCn69|H0HTh%BkTQreLr>=fN3k=e!qry34$qCY)T9!3lqj+Fa%I$SD+W7-V$D@ zpVBc}=QbW4SvAw0l>pw9h6g{M9%W|-%t1{|Ow0#vc7B;~Lt#Dj)2DZDvfgM~U}Jms zj>UZLMz-yt+jI8Dn2D>i*GN$0`HW?iIE;5<&DHURwo6?xwH&yaHJiYZ84y$^pjB(9I7x_pfgh=SJny{i9(fHf78;$1DydT-;Rm` zMf3uBK!F}`w2?M%S}PG`38B{~lGb|7)B3DZ#3t7@njIp66E-1XXs*j#FQj~532wjI;@?cJeoj^q`E zkUc5`zhOo+QF&ANq%5+Uw`yLCXpWslU^25^)JOKieMrNPY{cx2vQW(9uj`Y7Fyvg+ z;IqR;r1Dr-Y%tZ+&$%4Ycl(Bks9#0MZqp-~jW8@i<1t~boO_mJ zlJb2LyW;Z*Lv^l2I4-aTlSDeF?>83F=`U8dSlKv=>z3yZ5;rzB?Kp#Ng~%_Dk#^yikoWNd(uqVbf+aB`k$Y~7Awfu(t<^!WQOzA4oHp|1$yT)}^z;l4H|HXeIF{Xd@vDSC+3?wi2=IqqIL!OB#t@$X+x za7`Wh-_xHmD0nWmZ$J3wIPD2GGeE%j=Lj#%jIU}t@y`Mee9iKjAhrK&55dQG!PYkw zGNAMCQ+IIv&y_&F?dX3V0$jxV-xo>#a&uO1{lA|v30QC@csTy&F{6{Y&-m}UD2W?z z|NHW{5`~2hSboFY5B~SlM#sVm%S8X{`L1O4CS9v)WBJcNUDClE82GRD=xDuYsoi-0 zzb-Wl?Cby2LiJ7RH_ptxniD