diff --git a/.github/ISSUE_TEMPLATE/deer-issue-template.md b/.github/ISSUE_TEMPLATE/deer-issue-template.md
index 36c4fec64..e3ea3aa83 100644
--- a/.github/ISSUE_TEMPLATE/deer-issue-template.md
+++ b/.github/ISSUE_TEMPLATE/deer-issue-template.md
@@ -9,10 +9,10 @@ assignees: ''
### 运行环境 ###
-- [x] 电脑系统:如:`Windows 10`
-- [x] 设备型号:如:`小米MIX 2s`
-- [x] 设备系统版本:如 `Android 10`
-- [x] Flutter 版本:如 `2.0.3`
+- [x] 电脑系统:如:`Windows 11`
+- [x] 设备型号:如:`小米13`
+- [x] 设备系统版本:如 `Android 13`
+- [x] Flutter 版本:如 `3.13.0`
### 具体问题描述 ###
diff --git a/.github/workflows/flutter-drive.yml b/.github/workflows/flutter-drive.yml
index b1efff756..e27fce756 100644
--- a/.github/workflows/flutter-drive.yml
+++ b/.github/workflows/flutter-drive.yml
@@ -17,39 +17,46 @@ jobs:
# A set of different configurations of the virtual environment.
matrix:
device:
- - "iPhone 8 (14.4)"
- - "iPhone 11 Pro Max (14.4)"
+ - "iPhone 15 Pro Max"
# When set to true, GitHub cancels all in-progress jobs if any matrix job
# fails.
fail-fast: false
# The type of machine to run the job on.
- runs-on: macOS-latest
+ runs-on: macos-latest
# Contains a sequence of tasks.
steps:
# A name for your step to display on GitHub.
- - name: "List all simulators"
- run: "xcrun instruments -s"
+# - name: "List all simulators"
+# run: "xcrun instruments -s"
+# - name: "Start Simulator"
+# run: |
+# UDID=$(
+# xcrun instruments -s |
+# awk \
+# -F ' *[][]' \
+# -v 'device=${{ matrix.device }}' \
+# '$1 == device { print $2 }'
+# )
+# xcrun simctl boot "${UDID:?No Simulator with this name found}"
- name: "Start Simulator"
- run: |
- UDID=$(
- xcrun instruments -s |
- awk \
- -F ' *[][]' \
- -v 'device=${{ matrix.device }}' \
- '$1 == device { print $2 }'
- )
- xcrun simctl boot "${UDID:?No Simulator with this name found}"
+ # https://github.com/futureware-tech/simulator-action
+ uses: futureware-tech/simulator-action@v2
+ with:
+ model: ${{ matrix.device }}
+ erase_before_boot: true
+ shutdown_after_job: true
# The branch or tag ref that triggered the workflow will be checked out.
# https://github.com/marketplace/actions/checkout
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
# Sets up a flutter environment.
# https://github.com/marketplace/actions/flutter-action
- - uses: subosito/flutter-action@v1
+ - uses: subosito/flutter-action@v2
with:
- flutter-version: '2.0.3'
+ flutter-version: '3.35.1'
channel: 'stable' # or: 'dev' or 'beta'
+ - run: "flutter clean"
- name: "Run Flutter Driver tests"
- run: "flutter drive --target=test_driver/driver.dart"
+ run: "flutter drive --target=test_driver/driver.dart --no-enable-impeller" #https://github.com/flutter/flutter/issues/128391
drive_android:
# The type of machine to run the job on.
@@ -58,13 +65,18 @@ jobs:
strategy:
# set of different configurations of the virtual environment.
matrix:
- api-level: [21, 29]
- target: [default]
+ api-level: [29, 34]
+ target: [google_apis]
steps:
- - uses: actions/checkout@v2
- - uses: subosito/flutter-action@v1
+ - uses: actions/checkout@v3
+ - name: set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: "oracle"
+ java-version: "17"
+ - uses: subosito/flutter-action@v2
with:
- flutter-version: '2.0.3'
+ flutter-version: '3.35.1'
channel: 'stable' # or: 'dev' or 'beta'
- name: "Run Flutter Driver tests"
# GitHub Action for installing, configuring and running Android Emulators (work only Mac OS)
@@ -73,7 +85,7 @@ jobs:
with:
api-level: ${{ matrix.api-level }}
target: ${{ matrix.target }}
- arch: x86_64
+ arch: arm64-v8a
profile: Nexus 6
script: "flutter drive --target=test_driver/driver.dart"
@@ -84,13 +96,13 @@ jobs:
steps:
# The branch or tag ref that triggered the workflow will be checked out.
# https://github.com/actions/checkout
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
# Setup a flutter environment.
# https://github.com/marketplace/actions/flutter-action
- - uses: subosito/flutter-action@v1
+ - uses: subosito/flutter-action@v2
with:
- flutter-version: '2.0.3'
+ flutter-version: '3.35.1'
channel: 'stable'
- run: "flutter pub get"
- name: "Run Flutter Accessibility Tests"
- run: "flutter test test/accessibility_test.dart"
\ No newline at end of file
+ run: "flutter test test/accessibility_test.dart"
diff --git a/.github/workflows/flutter-web-deploy.yml b/.github/workflows/flutter-web-deploy.yml
index efb638759..b6482c7d6 100644
--- a/.github/workflows/flutter-web-deploy.yml
+++ b/.github/workflows/flutter-web-deploy.yml
@@ -12,10 +12,11 @@ jobs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2.3.1
- - uses: subosito/flutter-action@v1
+ - uses: subosito/flutter-action@v2
with:
- flutter-version: '2.0.3'
+ flutter-version: '3.35.1'
channel: 'stable'
+ architecture: x64
- name: "Web Build 🔧"
run: |
flutter pub get
diff --git a/.gitignore b/.gitignore
index cd2f87ebf..1a75eff26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
+**/android/app/.cxx
# iOS/XCode related
**/ios/**/*.mode1v3
@@ -75,3 +76,4 @@ lib/generated_plugin_registrant.dart
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+/ios/build/
diff --git a/README-EN.md b/README-EN.md
index 735a778bb..ad320b8df 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -2,15 +2,17 @@
-This project is an exercise project for individuals to learn Flutter.
+## English | [中文](README.md)
-Realize specific design effects by setting, modifying, combining self-contained widgets and customizing to meet the needs of daily development.
+This project is an exercise in learning Flutter for personal growth and development.
-See the design catalog for the design drawings of this project.
+To achieve specific design outcomes and meet the demands of daily development, one may employ the methods of configuring, modifying, combining pre-existing components, and customizing.
+
+The design plans for this project can be found in the "design" directory. You may utilize these plans to practice with a specific goal in mind. Any implementation is solely based on personal comprehension and learning. Should there be any superior implementation strategies, I welcome the opportunity for discussion.
## Preview
-The effect of some pages is as follows:
+Some of the page effects are as follows:
|  |  |  |  |
| :--------------------------------: | :---------------------------------: | :-------------------------------: | :-------------------------------: |
@@ -19,65 +21,72 @@ The effect of some pages is as follows:
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
-|  |  | | |
-
-## Content
-
-* mvp mode
-* Use `provider`(version 5.x) for state management
-* Network request encapsulation based on `dio` (version 4.x)
-* Driver testing, accessibility testing.
-* Support dark mode
-* Localization(Thanks @ghedwards)
-* Use `Sliver` series of components to achieve complex scrolling effects
-* Use amap Positioning to select address
-* Pull down to refresh + pull up to load more
-* Check update
+|  |  |  | |
+
+**If you find this project satisfactory, kindly show your support by giving it a Star or Fork. Rest assured, this project is being continuously maintained and any issues can be brought to our attention by submitting an Issue.**
+
+## Realizing the content.
+
+* MVP pattern
+* State management using `provider` (version 6.x)
+* Network request encapsulation based on `dio` (version 5.x)
+* Integration testing and accessibility testing
+* Support for dark mode
+* Localization(Thanks to @ghedwards)
+* Implementation of complex scrolling effects using `Sliver` series components
+* Location selection using AMap (supports Web)
+* Encapsulation of common widgets handling
+* Pull-to-refresh and load-more functionality
+* Application update check
* PopupWindow
-* Scan code(qr_code_scanner plugin)
-* Menu switching animation (circular diffusion, 3D flip)
-* Sliding delete
+* QR code scanning functionality (using the qr_code_scanner plugin)
+* Menu switching animations (circular expansion, 3D flip)
+* Swipe-to-delete
* City selection
-* Similar to the three-level linkage of Jingdong's choice of cities
-* Custom Dialog
-* Sticky headers
+* Three-level linkage selection similar to JD's city selection
+* Various custom dialogs
+* Sticky header for lists
* Password input keyboard
-* Verification code input
-* Custom Simple Calendar
-* Graphs and [pie charts](https://dartpad.cn/d06f8f737d6eb2d87978eb2d14b87864)
-* Modular routing management
-* More optimization
+* Verification code input box
+* Custom simple calendar
+* Line chart and [pie charts](https://dartpad.cn/d06f8f737d6eb2d87978eb2d14b87864)
+* Modularized route management
+* More demos (ripple animation, scratch card, lottie)
+* More detailed optimizations
+You may download and experience it specifically by accessing the following links:
-Android package:[Click to download](https://www.pgyer.com/gYXj),Password: `111111`。
+For the Android version, kindly click on the link provided: [Download here](https://www.pgyer.com/oEm8me), and enter the password: `111111`.
-iOS and Web needs to download the code to run.
+As for iOS, you will need to download and run the code on your own.
-Web:https://simplezhli.github.io/flutter_deer/
+For web experience, please visit: https://simplezhli.github.io/flutter_deer/
-## Project environment
+## The project's operational environment.
-[](https://github.com/simplezhli/flutter_deer/actions?query=workflow%3A%22flutter_deer+driver%22+branch%3Amaster)
+[](https://github.com/simplezhli/flutter_deer/actions/workflows/flutter-drive.yml)
- 1. Flutter version 2.0.3
+ 1. Flutter version 3.35.1
- 2. Dart version 2.12.2
+ 2. Dart version 3.9.0
-## Precautions
+## Precautions to be taken.
-- iOS can execute commands `flutter build ios` to create `release` versions. Android can execute commands `flutter build apk` to create `release` versions.
+- In debug mode, there may be some lagging, which is considered a normal occurrence. A satisfactory experience requires the creation of a release package. To create a release version for iOS, execute the command `flutter build ios`. For Android, execute the command `flutter build apk`.
-- If there is a problem with the project, you can try to find a solution in the [iOS problem summary](./docs/iOS问题汇总.md) and [Android problem summary](./docs/Android问题汇总.md).
+- If there are any issues with the project's execution, please refer to the [iOS issue summary](./docs/iOS问题汇总.md) and [Android issue summary](./docs/Android问题汇总.md) for possible solutions.
-- Due to some plug-ins, this project has imperfect support on the Windows and macOS. Those who are interested can run the experience by themselves.
+- Due to certain plugin limitations, this project is only available for preview on Windows and macOS. Those interested may run and experience it themselves.
-- You can execute integration test commands to `flutter drive --target=test_driver/driver.dart` view function demonstrations.
+- To view the functionality demonstration, execute the integration test command `flutter drive --target=test_driver/driver.dart`.
+
+- Due to the abundance of pages, it may be difficult to match the design at first. However, I have added the relative path of the design in the code comments, which can be searched or located for the corresponding page. I hope this will be helpful to you.
-- I have added a relative path to the design drawings in the page notes. I can search or find the corresponding page. I hope it will help you.
+- This project uses the [FlutterJsonBeanFactory](https://github.com/zhangruiyu/FlutterJsonBeanFactory) plugin to generate Beans.
-- This project uses the FlutterJsonBeanFactory plugin to generate beans.
+- Web performance may be slower due to large resource files such as js and deployment on Github.
-## Summary of experience
+## Summary of Experience
- [Flutter开发中的一些Tips(一)](https://weilu.blog.csdn.net/article/details/90546727)
@@ -113,31 +122,32 @@ Web:https://simplezhli.github.io/flutter_deer/
## Tripartite library used
-| 库 | 功能 |
+| library | Functionality |
| -------------------------- | --------------- |
-| [dio](https://github.com/flutterchina/dio) | **Network library** |
+| [dio](https://github.com/cfug/dio) | **Networking library** |
| [provider](https://github.com/rrousselGit/provider) | **State management** |
-| [flutter_2d_amap](https://github.com/simplezhli/flutter_2d_amap) | **2D AMap** |
+| [flutter_2d_amap](https://github.com/simplezhli/flutter_2d_amap) | **2D map from Amap** |
| [cached_network_image](https://github.com/renefloor/flutter_cached_network_image) | **Image loading** |
-| [fluro](https://github.com/theyakka/fluro) | **Route** |
-| [flutter_oktoast](https://github.com/OpenFlutter/flutter_oktoast) | **Toast** |
-| [common_utils](https://github.com/Sky24n/common_utils) | **Dart common utils library** |
-| [flutter_slidable](https://github.com/letsar/flutter_slidable) | **Sliding delete** |
-| [flustars](https://github.com/Sky24n/flustars) | **Flutter common utils library** |
-| [flutter_swiper](https://github.com/best-flutter/flutter_swiper) | **Flutter banner component** |
-| [url_launcher](https://github.com/flutter/plugins/tree/master/packages/url_launcher) | **Launch URL plugin** |
-| [image_picker](https://github.com/flutter/plugins/tree/master/packages/image_picker) | **Picture selection plugin** |
-| [rxdart](https://github.com/ReactiveX/rxdart) | **Dart responsive extension** |
+| [fluro](https://github.com/theyakka/fluro) | **Routing management** |
+| [flutter_oktoast](https://github.com/OpenFlutter/flutter_oktoast) | **Toast notifications** |
+| [common_utils](https://github.com/Sky24n/common_utils) | **Common Dart utility library** |
+| [flutter_slidable](https://github.com/letsar/flutter_slidable) | **Swipe-to-delete** |
+| [flustars](https://github.com/Sky24n/flustars) | **Common Flutter utility library** |
+| [flutter_swiper](https://github.com/best-flutter/flutter_swiper) | **Flutter carousel component** |
+| [url_launcher](https://github.com/flutter/plugins/tree/master/packages/url_launcher) | **Plugin for launching URLs** |
+| [image_picker](https://github.com/flutter/plugins/tree/master/packages/image_picker) | **Plugin for selecting images** |
+| [rxdart](https://github.com/ReactiveX/rxdart) | **Reactive extensions for Dart** |
| [webview_flutter](https://github.com/flutter/plugins/tree/master/packages/webview_flutter) | **WebView plugin** |
-| [keyboard_actions](https://github.com/diegoveloper/flutter_keyboard_actions) | **Keyboard actions** |
-| [sticky_headers](https://github.com/fluttercommunity/flutter_sticky_headers) | **Sticky headers** |
+| [keyboard_actions](https://github.com/diegoveloper/flutter_keyboard_actions) | **Handling keyboard events** |
| [azlistview](https://github.com/flutterchina/azlistview) | **City selection list** |
-| [date_utils](https://github.com/apptreesoftware/date_utils) | **Commonly used date tools** |
+| [date_utils](https://github.com/apptreesoftware/date_utils) | **Common date utility classes** |
| [bezier_chart](https://github.com/aeyrium/bezier-chart) | **Bezier chart** |
-| [sprintf](https://github.com/Naddiseo/dart-sprintf) | **Format String** |
-| [qr_code_scanner](https://github.com/juliuscanute/qr_code_scanner) | **Scan code** |
+| [sprintf](https://github.com/Naddiseo/dart-sprintf) | **String formatting** |
+| [qr_code_scanner](https://github.com/juliuscanute/qr_code_scanner) | **Scanning QR codes** |
| [intl](https://github.com/dart-lang/intl) | **Localization** |
+| [device_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus) | **Getting device information** |
| [vibration](https://github.com/benjamindean/flutter_vibration) | **Vibration** |
+| [lottie](https://github.com/xvrh/lottie-flutter) | **Animation effects** |
For details, please refer to the [pubspec.yaml](https://github.com/simplezhli/flutter_deer/blob/master/pubspec.yaml) file.
@@ -145,7 +155,9 @@ For details, please refer to the [pubspec.yaml](https://github.com/simplezhli/fl
* [x] Web support.
-* [ ] Migrate to null-safety.
+* [x] Migrate to null-safety.
+
+* [ ] Migrate to Navigator 2.0.
## Thanks For
@@ -159,7 +171,7 @@ For details, please refer to the [pubspec.yaml](https://github.com/simplezhli/fl
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/README.md b/README.md
index 22d95ce82..fe7db29ef 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
+## [English](README-EN.md) | 中文
+
本项目为个人学习Flutter的练习项目。
通过设置、修改、组合自带部件以及自定义来实现具体的设计效果,满足日常开发的需求。
@@ -19,15 +21,15 @@
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
-|  |  | | |
+|  |  |  | |
-**觉得还可以的话,来个Star、Fork支持一波!有问题欢迎提Issue。**
+**觉得还可以的话,来个Star、Fork支持一波!本项目持续维护中,有问题欢迎提Issue。**
-## 实现内容
+## 实现内容(已迁移到空安全)
* mvp模式
-* 使用`provider` (5.x 版本)做状态管理
-* 基于`dio` (4.x 版本)的网络请求封装
+* 使用`provider` (6.x 版本)做状态管理
+* 基于`dio` (5.x 版本)的网络请求封装
* 完整的集成测试、可访问性测试。
* 支持深色模式
* 本地化(感谢 @ghedwards)
@@ -49,11 +51,12 @@
* 自定义简易日历
* 曲线图及[饼状图](https://dartpad.cn/d06f8f737d6eb2d87978eb2d14b87864)
* 模块化路由管理
+* 更多Demo(水波纹动画、刮刮卡、lottie)
* 更多的细节优化
具体可以下载体验:
-Android版安装包:[点击下载](https://www.pgyer.com/gYXj),安装密码:`111111`。
+Android版安装包:[点击去下载](https://github.com/simplezhli/flutter_deer/releases)。
iOS需要自行下载代码运行。
@@ -61,11 +64,11 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
## 项目运行环境
-[](https://github.com/simplezhli/flutter_deer/actions?query=workflow%3A%22flutter_deer+driver%22+branch%3Amaster)
+[](https://github.com/simplezhli/flutter_deer/actions/workflows/flutter-drive.yml)
+
+ 1. Flutter version 3.35.1
- 1. Flutter version 2.0.3
-
- 2. Dart version 2.12.2
+ 2. Dart version 3.9.0
## 注意事项
@@ -76,12 +79,12 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
- 项目运行有问题可以在[iOS问题汇总](./docs/iOS问题汇总.md)、[Android问题汇总](./docs/Android问题汇总.md)中尝试寻找解决办法。
- 由于部分插件的原因,本项目在Windows、macOS仅做预览(主要为原生功能方面,UI问题不大)。有兴趣的可自行运行体验。
-
+
- 可以执行集成测试命令`flutter drive --target=test_driver/driver.dart` 查看功能演示。
- 因为页面有点多,一开始可能会导致页面无法与设计图对应上。我在代码注释中有添加设计图的相对路径,可以搜索或查找到对应页面,希望对你有帮助。
-- 本项目使用FlutterJsonBeanFactory插件来生成Bean。FlutterJsonBeanFactory插件使用可以查看[这篇文章](https://www.jianshu.com/p/14cbcbaa74b7)。
+- 本项目使用[FlutterJsonBeanFactory](https://github.com/zhangruiyu/FlutterJsonBeanFactory)插件来生成Bean。
- Web受制于js等资源过大和部署在Github上,访问会慢一些。
@@ -118,12 +121,14 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
- [【译】正确操作Dart中的字符串](https://weilu.blog.csdn.net/article/details/107857569)
- [【译】学习Flutter中新的Navigator和Router系统](https://weilu.blog.csdn.net/article/details/108902282)
-
+
+- [【译】Flutter 2.2中的新功能](https://weilu.blog.csdn.net/article/details/117061293)
+
## 使用到的三方库
| 库 | 功能 |
| -------------------------- | --------------- |
-| [dio](https://github.com/flutterchina/dio) | **网络库** |
+| [dio](https://github.com/cfug/dio) | **网络库** |
| [provider](https://github.com/rrousselGit/provider) | **状态管理** |
| [flutter_2d_amap](https://github.com/simplezhli/flutter_2d_amap) | **高德2D地图** |
| [cached_network_image](https://github.com/renefloor/flutter_cached_network_image) | **图片加载** |
@@ -138,16 +143,17 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
| [rxdart](https://github.com/ReactiveX/rxdart) | **Dart的响应式扩展** |
| [webview_flutter](https://github.com/flutter/plugins/tree/master/packages/webview_flutter) | **WebView插件** |
| [keyboard_actions](https://github.com/diegoveloper/flutter_keyboard_actions) | **处理键盘事件** |
-| [sticky_headers](https://github.com/fluttercommunity/flutter_sticky_headers) | **列表悬浮头** |
| [azlistview](https://github.com/flutterchina/azlistview) | **城市选择列表** |
| [date_utils](https://github.com/apptreesoftware/date_utils) | **常用的日期工具类** |
| [bezier_chart](https://github.com/aeyrium/bezier-chart) | **曲线图表** |
| [sprintf](https://github.com/Naddiseo/dart-sprintf) | **格式化String** |
| [qr_code_scanner](https://github.com/juliuscanute/qr_code_scanner) | **扫码功能** |
| [intl](https://github.com/dart-lang/intl) | **本地化** |
+| [device_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus) | **获取设备信息** |
| [vibration](https://github.com/benjamindean/flutter_vibration) | **振动** |
+| [lottie](https://github.com/xvrh/lottie-flutter) | **动画效果** |
-详细内容可以参看[pubspec.yaml](https://github.com/simplezhli/flutter_deer/blob/master/pubspec.yaml)文件
+详细内容可以参看[pubspec.yaml](https://github.com/simplezhli/flutter_deer/blob/master/pubspec.yaml)文件
## 后续计划:
@@ -159,8 +165,6 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
* [x] 页面添加设计图路径注释,方便寻找对应的设计图。
-* [x] 项目中有使用这一套框架及组件,会同步修复及优化遇到的问题。
-
* [x] 添加集成测试。
* [x] 深色模式支持。
@@ -169,11 +173,17 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
* [x] Web端支持。
-* [ ] 迁移到空安全。
+* [x] 迁移到空安全。(安装包减少135KB,10.3M -> 10.1M)
+
+* [ ] 迁移至Navigator 2.0。
## 已知存在问题:
-- 2.0.0 已知存在问题(#68571 #73351 #73388)
+- 部分使用的到的三方库没有适配3.0.0,flutter_swiper(flutter_swiper_null_safety_flutter3替代)、flustars(flustars_flutter3替代)、azlistview(升级scrollable_positioned_list)。
+
+- 3.10.0 已知存在问题(#105203 #113595)
+
+- 2.0.0 已知存在问题(#68571 #73351 #74890 #79773 #79931)
- ListView在没有设置分割线的情况下,个别Item之间存在大约1像素的间隔([像素对齐问题](https://github.com/flutter/flutter/issues/14288))。
@@ -191,7 +201,7 @@ Web体验地址:https://simplezhli.github.io/flutter_deer/
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/analysis_options.yaml b/analysis_options.yaml
old mode 100755
new mode 100644
index 6455f4322..49e698def
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,43 +1,32 @@
# Specify analysis options.
#
-# Until there are meta linter rules, each desired lint must be explicitly enabled.
-# See: https://github.com/dart-lang/linter/issues/288
-#
-# For a list of lints, see: http://dart-lang.github.io/linter/lints/
-# See the configuration guide for more
-# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
+# For a list of lints, see: https://dart.dev/tools/linter-rules
+# For guidelines on configuring static analysis, see:
+# https://dart.dev/tools/analysis
#
# There are other similar analysis options files in the flutter repos,
# which should be kept in sync with this file:
#
# - analysis_options.yaml (this file)
-# - packages/flutter/lib/analysis_options_user.yaml
-# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml
-# - https://github.com/flutter/engine/blob/master/analysis_options.yaml
+# - https://github.com/flutter/engine/blob/main/analysis_options.yaml
+# - https://github.com/flutter/packages/blob/main/analysis_options.yaml
#
-# This file contains the analysis options used by Flutter tools, such as IntelliJ,
-# Android Studio, and the `flutter analyze` command.
+# This file contains the analysis options used for code in the flutter/flutter
+# repository.
analyzer:
- strong-mode:
- implicit-casts: false
- implicit-dynamic: false
+ language:
+ strict-casts: true
+ strict-inference: true
+ strict-raw-types: true
errors:
- # treat missing required parameters as a warning (not a hint)
- missing_required_param: warning
- # treat missing returns as a warning (not a hint)
- missing_return: warning
- # allow having TODOs in the code
- todo: ignore
- # allow self-reference to deprecated members (we do this because otherwise we have
- # to annotate every member in every test, assert, etc, when we deprecate something)
+ # allow deprecated members (we do this because otherwise we have to annotate
+ # every member in every test, assert, etc, when we or the Dart SDK deprecates
+ # something (https://github.com/flutter/flutter/issues/143312)
+ deprecated_member_use: ignore
deprecated_member_use_from_same_package: ignore
- # Ignore analyzer hints for updating pubspecs when using Future or
- # Stream and not importing dart:async
- # Please see https://github.com/flutter/flutter/pull/24528 for details.
- sdk_version_async_exported_from_core: ignore
# Turned off until null-safe rollout is complete.
- unnecessary_null_comparison: ignore
+# unnecessary_null_comparison: ignore
exclude:
# the following two are relative to the stocks example and the flutter package respectively
# see https://github.com/dart-lang/sdk/issues/28463
@@ -45,49 +34,51 @@ analyzer:
- "lib/generated/json/**"
- "lib/widgets/bezier_chart/**"
# - "test/**"
-# - "test_driver/**"
+ - "test_driver/**"
+
+formatter:
+ page_width: 100
linter:
rules:
- # these rules are documented on and in the same order as
- # the Dart Lint rules page to make maintenance easier
- # https://github.com/dart-lang/linter/blob/master/example/all.yaml
+ # This list is derived from the list of all available lints located at
+ # https://github.com/dart-lang/sdk/blob/main/pkg/linter/example/all.yaml
- always_declare_return_types
- always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
- - always_require_non_null_named_parameters
# - always_specify_types
# - always_use_package_imports # we do this commonly
- annotate_overrides
+ - annotate_redeclares
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
- # - avoid_as # required for implicit-casts: true
- avoid_bool_literals_in_conditional_expressions
- # - avoid_catches_without_on_clauses # we do this commonly
- # - avoid_catching_errors # we do this commonly
+ # - avoid_catches_without_on_clauses # blocked on https://github.com/dart-lang/linter/issues/3023
+ # - avoid_catching_errors # blocked on https://github.com/dart-lang/linter/issues/4998
# - avoid_classes_with_only_static_members
- # - avoid_double_and_int_checks # only useful when targeting JS runtime
+ - avoid_double_and_int_checks
+ - avoid_dynamic_calls
- avoid_empty_else
- avoid_equals_and_hash_code_on_mutable_classes
- # - avoid_escaping_inner_quotes # not yet tested
+ - avoid_escaping_inner_quotes
- avoid_field_initializers_in_const_classes
-# - avoid_function_literals_in_foreach_calls
- # - avoid_implementing_value_types # not yet tested
+ # - avoid_final_parameters # incompatible with prefer_final_parameters
+ - avoid_function_literals_in_foreach_calls
+# - avoid_implementing_value_types
- avoid_init_to_null
- # - avoid_js_rounded_ints # only useful when targeting JS runtime
+ - avoid_js_rounded_ints
+ # - avoid_multiple_declarations_per_line # seems to be a stylistic choice we don't subscribe to
- avoid_null_checks_in_equality_operators
- # - avoid_positional_boolean_parameters # not yet tested
- # - avoid_print # not yet tested
+ # - avoid_positional_boolean_parameters # would have been nice to enable this but by now there's too many places that break it
+ - avoid_print
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
- # - avoid_redundant_argument_values # not yet tested
+ - avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- # - avoid_returning_null # there are plenty of valid reasons to return null
- # - avoid_returning_null_for_future # not yet tested
- avoid_returning_null_for_void
- # - avoid_returning_this # there are plenty of valid reasons to return this
- # - avoid_setters_without_getters # not yet tested
- - avoid_shadowing_type_parameters # not yet tested
+ # - avoid_returning_this # there are enough valid reasons to return `this` that this lint ends up with too many false positives
+ - avoid_setters_without_getters
+ - avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_type_to_string
@@ -96,58 +87,71 @@ linter:
- avoid_unnecessary_containers
- avoid_unused_constructor_parameters
- avoid_void_async
- # - avoid_web_libraries_in_flutter # not yet tested
+ # - avoid_web_libraries_in_flutter # we use web libraries in web-specific code, and our tests prevent us from using them elsewhere
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
- # - cascade_invocations # not yet tested
+ # - cascade_invocations # doesn't match the typical style of this repo
- cast_nullable_to_non_nullable
# - close_sinks # not reliable enough
# - comment_references # blocked on https://github.com/dart-lang/linter/issues/1142
+ - conditional_uri_does_not_exist
# - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
- # - curly_braces_in_flow_control_structures # required by flutter style
- # - diagnostic_describe_all_properties # not yet tested
+ - curly_braces_in_flow_control_structures
+ - depend_on_referenced_packages
+ - deprecated_consistency
+ # - diagnostic_describe_all_properties # enabled only at the framework level (packages/flutter/lib)
- directives_ordering
- # - do_not_use_environment # we do this commonly
+ # - do_not_use_environment # there are appropriate times to use the environment, especially in our tests and build logic
- empty_catches
- empty_constructor_bodies
- empty_statements
+ - eol_at_end_of_file
- exhaustive_cases
- file_names
- flutter_style_todos
- hash_and_equals
- implementation_imports
+ - implicit_call_tearoffs
+ - implicit_reopen
+ - invalid_case_patterns
+ - invalid_runtime_check_with_js_interop_types
# - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
- - iterable_contains_unrelated_type
- # - join_return_with_assignment # required by flutter style
+ # - join_return_with_assignment # not required by flutter style
- leading_newlines_in_multiline_strings
- library_names
- library_prefixes
+# - library_private_types_in_public_api
# - lines_longer_than_80_chars # required by flutter style
- - list_remove_unrelated_type
- # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
+ - literal_only_boolean_expressions
+ - missing_code_block_language_in_doc_comment
- missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
- # - no_default_cases # too many false positives
+ - no_default_cases
- no_duplicate_case_values
+ - no_leading_underscores_for_library_prefixes
+ - no_leading_underscores_for_local_identifiers
+ - no_literal_bool_comparisons
- no_logic_in_create_state
+ - no_self_assignments
+ - no_wildcard_variable_uses
# - no_runtimeType_toString # ok in tests; we enable this only in packages/
- non_constant_identifier_names
+ - noop_primitive_operations
- null_check_on_nullable_type_parameter
- null_closures
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
- # - only_throw_errors # https://github.com/flutter/flutter/issues/5792
+ - only_throw_errors # this does get disabled in a few places where we have legacy code that uses strings et al
- overridden_fields
- - package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- # - prefer_asserts_with_message # required by flutter style
+ # - prefer_asserts_with_message # not required by flutter style
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
@@ -157,11 +161,11 @@ linter:
# - prefer_constructors_over_static_methods # far too many false positives
- prefer_contains
# - prefer_double_quotes # opposite of prefer_single_quotes
- - prefer_equal_for_default_values
- # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
+ # - prefer_expression_function_bodies # conflicts with ./docs/contributing/Style-guide-for-Flutter-repo.md#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
+ # - prefer_final_parameters # we should enable this one day when it can be auto-fixed (https://github.com/dart-lang/linter/issues/3104), see also parameter_assignments
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
- prefer_function_declarations_over_variables
@@ -170,15 +174,15 @@ linter:
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- # - prefer_int_literals # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#use-double-literals-for-double-constants
- # - prefer_interpolation_to_compose_strings # doesn't work with raw strings, see https://github.com/dart-lang/linter/issues/2490
+ # - prefer_int_literals # conflicts with ./docs/contributing/Style-guide-for-Flutter-repo.md#use-double-literals-for-double-constants
+ - prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
- # - prefer_mixin # https://github.com/dart-lang/language/issues/32
- - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
- # - prefer_relative_imports # incompatible with sub-package imports
+ # - prefer_mixin # Has false positives, see https://github.com/dart-lang/linter/issues/3018
+ # - prefer_null_aware_method_calls # "call()" is confusing to people new to the language since it's not documented anywhere
+# - prefer_relative_imports
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
@@ -186,9 +190,12 @@ linter:
- provide_deprecation_message
# - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- recursive_getters
+ # - require_trailing_commas # blocked on https://github.com/dart-lang/sdk/issues/47441
+ - secure_pubspec_urls
- sized_box_for_whitespace
+ - sized_box_shrink_expand
- slash_for_doc_comments
- # - sort_child_properties_last # not yet tested
+ - sort_child_properties_last
- sort_constructors_first
# - sort_pub_dependencies # prevents separating pinned transitive dependencies
- sort_unnamed_constructors_first
@@ -197,38 +204,52 @@ linter:
- tighten_type_of_initializing_formals
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
- # - unawaited_futures # too many false positives
+ - type_literal_in_constant_pattern
+ # - unawaited_futures # too many false positives, especially with the way AnimationController works
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_const
+ - unnecessary_constructor_name
# - unnecessary_final # conflicts with prefer_final_locals
- unnecessary_getters_setters
# - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
+ - unnecessary_late
+ - unnecessary_library_directive
+ # - unnecessary_library_name # blocked on blocked on https://github.com/dart-lang/dartdoc/issues/3882
- unnecessary_new
- unnecessary_null_aware_assignments
- # - unnecessary_null_checks # not yet tested
+ - unnecessary_null_aware_operator_on_extension_on_nullable
+ - unnecessary_null_checks
- unnecessary_null_in_if_null_operators
- # - unnecessary_nullable_for_final_variable_declarations
+ - unnecessary_nullable_for_final_variable_declarations
- unnecessary_overrides
- unnecessary_parenthesis
- # - unnecessary_raw_strings # not yet tested
+ # - unnecessary_raw_strings # what's "necessary" is a matter of opinion; consistency across strings can help readability more than this lint
- unnecessary_statements
- unnecessary_string_escapes
- unnecessary_string_interpolations
- unnecessary_this
+ - unnecessary_to_list_in_spreads
+ - unreachable_from_main
- unrelated_type_equality_checks
- # - unsafe_html # not yet tested
+ - use_build_context_synchronously
+ - use_colored_box
+ # - use_decorated_box # not yet tested
+ - use_enums
- use_full_hex_values_for_flutter_colors
- use_function_type_syntax_for_parameters
- # - use_if_null_to_convert_nulls_to_bools # not yet tested
+ - use_if_null_to_convert_nulls_to_bools
- use_is_even_rather_than_modulo
- use_key_in_widget_constructors
- use_late_for_private_fields_and_variables
- # - use_named_constants # not yet tested
+ - use_named_constants
- use_raw_strings
- use_rethrow_when_possible
- # - use_setters_to_change_properties # not yet tested
+ - use_setters_to_change_properties
+ - use_super_parameters
# - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
+ - use_test_throws_matchers
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
+ - use_truncating_division
- valid_regexps
- void_checks
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 6eaa74fcd..78e82a9f4 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,3 +1,9 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
@@ -6,12 +12,6 @@ if (localPropertiesFile.exists()) {
}
}
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
@@ -22,28 +22,19 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
def keystorePropertiesFile = rootProject.file("app/key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
- compileSdkVersion 29
-
- lintOptions {
- disable 'InvalidPackage'
- }
+ compileSdkVersion 35
defaultConfig {
applicationId "com.weilu.deer"
- minSdkVersion 21
- targetSdkVersion 29
+ minSdkVersion flutter.minSdkVersion
+ targetSdkVersion 35
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
- multiDexEnabled true
}
signingConfigs {
@@ -72,6 +63,15 @@ android {
}
}
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+ namespace 'com.weilu.deer'
+ lint {
+ disable 'InvalidPackage'
+ }
}
flutter {
@@ -79,6 +79,5 @@ flutter {
}
dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'androidx.multidex:multidex:2.0.1'
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20"
}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index a0b1e604d..f880684a6 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,5 +1,4 @@
-
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 4b3444739..c8c9a64bc 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,8 +1,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index a0b1e604d..f880684a6 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -1,5 +1,4 @@
-
+
diff --git a/android/build.gradle b/android/build.gradle
index 1b6e53702..97cc06256 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,29 +1,11 @@
-buildscript {
- ext.kotlin_version = '1.4.30'
- repositories {
-// maven { url 'https://maven.aliyun.com/repository/public' }//jcenter
-// maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }//gradle-plugin
-// maven { url 'https://maven.aliyun.com/repository/central' }//central
-// maven { url 'https://maven.aliyun.com/repository/google' }//google
- google()
- jcenter()
- maven { url 'https://jitpack.io' }
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:4.1.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
allprojects {
repositories {
-// maven { url 'https://maven.aliyun.com/repository/public' }
-// maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
-// maven { url 'https://maven.aliyun.com/repository/central' }
-// maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
+ maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
+ maven { url 'https://maven.aliyun.com/repository/central' }
+ maven { url 'https://maven.aliyun.com/repository/google' }
google()
- jcenter()
+ mavenCentral()
maven { url 'https://jitpack.io' }
}
}
@@ -36,6 +18,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
delete rootProject.buildDir
}
diff --git a/android/gradle.properties b/android/gradle.properties
index 2379ec149..9e2da5c9f 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -9,11 +9,13 @@ org.gradle.jvmargs=-Xmx3072m -XX:+UseParallelGC -XX:MaxPermSize=1024m -XX:+HeapD
# 开启gradle缓存
org.gradle.caching=true
-android.enableBuildCache=true
#开启 kotlin 的增量和并行编译
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.incremental.js=true
kotlin.caching.enabled=true
-kotlin.parallel.tasks.in.project=true
\ No newline at end of file
+kotlin.parallel.tasks.in.project=true
+android.defaults.buildfeatures.buildconfig=true
+android.nonTransitiveRClass=false
+android.nonFinalResIds=false
\ No newline at end of file
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 3fad423d3..4b2d7c51f 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Sep 13 21:08:20 CST 2020
+#Sat Nov 23 15:18:48 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
index 5a2f14fb1..a01a7e125 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -1,15 +1,25 @@
-include ':app'
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }()
-def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
-def plugins = new Properties()
-def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
-if (pluginsFile.exists()) {
- pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
}
-plugins.each { name, path ->
- def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
- include ":$name"
- project(":$name").projectDir = pluginDirectory
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version '8.12.0' apply false
+ id "org.jetbrains.kotlin.android" version "1.8.20" apply false
}
+
+include ":app"
\ No newline at end of file
diff --git a/assets/lottie/bunny_new_mouth.json b/assets/lottie/bunny_new_mouth.json
new file mode 100644
index 000000000..e2832274d
--- /dev/null
+++ b/assets/lottie/bunny_new_mouth.json
@@ -0,0 +1,17135 @@
+{
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 0,
+ "ty": 4,
+ "nm": "left_hand_mask",
+ "td": 1,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 500,
+ 500,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 476.25,
+ 476.25,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ],
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ],
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 476,
+ 0
+ ],
+ [
+ 0,
+ -476
+ ],
+ [
+ -476,
+ 0
+ ],
+ [
+ 0,
+ 476
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.62,
+ 0.79,
+ 0.81,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 476.25,
+ 476.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "hand_left",
+ "tt": 1,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ {
+ "i": {
+ "x": 0.69,
+ "y": 1
+ },
+ "o": {
+ "x": 1,
+ "y": 0
+ },
+ "n": "0p69_1_1_0",
+ "t": 29,
+ "s": [
+ 208.794,
+ 1161.368,
+ 0
+ ],
+ "e": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "to": [
+ 17.3333339691162,
+ -69.3333358764648,
+ 0
+ ],
+ "ti": [
+ -17.3333339691162,
+ 69.3333358764648,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.21,
+ "y": 0.21
+ },
+ "o": {
+ "x": 1,
+ "y": 1
+ },
+ "n": "0p21_0p21_1_1",
+ "t": 39,
+ "s": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "e": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.21,
+ "y": 1
+ },
+ "o": {
+ "x": 0.13,
+ "y": 0
+ },
+ "n": "0p21_1_0p13_0",
+ "t": 44,
+ "s": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "e": [
+ 208.794,
+ 1161.368,
+ 0
+ ],
+ "to": [
+ -17.3333339691162,
+ 69.3333358764648,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 0.13,
+ "y": 0
+ },
+ "n": "0p667_1_0p13_0",
+ "t": 54,
+ "s": [
+ 208.794,
+ 1161.368,
+ 0
+ ],
+ "e": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ -17.3333339691162,
+ 69.3333358764648,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.69,
+ "y": 0.69
+ },
+ "o": {
+ "x": 0.333,
+ "y": 0.333
+ },
+ "n": "0p69_0p69_0p333_0p333",
+ "t": 59,
+ "s": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "e": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.69,
+ "y": 1
+ },
+ "o": {
+ "x": 0.86,
+ "y": 0
+ },
+ "n": "0p69_1_0p86_0",
+ "t": 67.904,
+ "s": [
+ 312.794,
+ 745.368,
+ 0
+ ],
+ "e": [
+ 208.794,
+ 1161.368,
+ 0
+ ],
+ "to": [
+ -17.3333339691162,
+ 69.3333358764648,
+ 0
+ ],
+ "ti": [
+ 17.3333339691162,
+ -69.3333358764648,
+ 0
+ ]
+ },
+ {
+ "t": 76
+ }
+ ]
+ },
+ "a": {
+ "k": [
+ 109.858,
+ 208.134,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -0.087,
+ 0.362
+ ],
+ [
+ -0.849,
+ 3.519
+ ],
+ [
+ -1.155,
+ 4.776
+ ],
+ [
+ -0.76,
+ 3.148
+ ],
+ [
+ -1.315,
+ 5.442
+ ],
+ [
+ -1.023,
+ 4.221
+ ],
+ [
+ -1.171,
+ 4.85
+ ],
+ [
+ -0.84,
+ 3.481
+ ],
+ [
+ -1.157,
+ 4.774
+ ],
+ [
+ -0.926,
+ 3.814
+ ],
+ [
+ -1.17,
+ 4.85
+ ],
+ [
+ -0.839,
+ 3.482
+ ],
+ [
+ -1.158,
+ 4.775
+ ],
+ [
+ -0.922,
+ 3.814
+ ],
+ [
+ -1.154,
+ 4.776
+ ],
+ [
+ -1.023,
+ 4.22
+ ],
+ [
+ -1.17,
+ 4.85
+ ],
+ [
+ -0.839,
+ 3.481
+ ],
+ [
+ -1.158,
+ 4.774
+ ],
+ [
+ -0.924,
+ 3.814
+ ],
+ [
+ -1.171,
+ 4.85
+ ],
+ [
+ -0.839,
+ 3.481
+ ],
+ [
+ -1.156,
+ 4.775
+ ],
+ [
+ -0.758,
+ 3.149
+ ],
+ [
+ -1.37,
+ 5.821
+ ],
+ [
+ -0.54,
+ 5.338
+ ],
+ [
+ -0.42,
+ 1.913
+ ],
+ [
+ 0.047,
+ 0.178
+ ],
+ [
+ 0.021,
+ 1.028
+ ],
+ [
+ 0.052,
+ 0.414
+ ],
+ [
+ 0.518,
+ 2.7
+ ],
+ [
+ 1.959,
+ 4.408
+ ],
+ [
+ 1.197,
+ 2.003
+ ],
+ [
+ 2.498,
+ 2.793
+ ],
+ [
+ 2.407,
+ 2.031
+ ],
+ [
+ 3.596,
+ 2.031
+ ],
+ [
+ 3.788,
+ 1.248
+ ],
+ [
+ 4.518,
+ 0.388
+ ],
+ [
+ 2.353,
+ -0.169
+ ],
+ [
+ 2.464,
+ -0.317
+ ],
+ [
+ 2.752,
+ -0.768
+ ],
+ [
+ 4.156,
+ -2.244
+ ],
+ [
+ 3.729,
+ -3.237
+ ],
+ [
+ 1.854,
+ -2.234
+ ],
+ [
+ 2.259,
+ -4.752
+ ],
+ [
+ 0.72,
+ -2.134
+ ],
+ [
+ 0.626,
+ -2.636
+ ],
+ [
+ 1.193,
+ -4.923
+ ],
+ [
+ 1.681,
+ -7
+ ],
+ [
+ 1.637,
+ -6.696
+ ],
+ [
+ 1.23,
+ -5.228
+ ],
+ [
+ 1.408,
+ -5.811
+ ],
+ [
+ 1.766,
+ -7.293
+ ],
+ [
+ 1.244,
+ -5.147
+ ],
+ [
+ 1.426,
+ -5.886
+ ],
+ [
+ 1.767,
+ -7.253
+ ],
+ [
+ 0.872,
+ -3.591
+ ],
+ [
+ 1.171,
+ -4.85
+ ],
+ [
+ 0.831,
+ -3.443
+ ],
+ [
+ 1.184,
+ -4.886
+ ],
+ [
+ 0.907,
+ -3.739
+ ],
+ [
+ 1.332,
+ -5.517
+ ],
+ [
+ 0.838,
+ -3.481
+ ],
+ [
+ 1.315,
+ -5.442
+ ],
+ [
+ 0.686,
+ -2.797
+ ],
+ [
+ -40.643,
+ -16.932
+ ]
+ ],
+ "o": [
+ [
+ 0.85,
+ -3.518
+ ],
+ [
+ 1.152,
+ -4.776
+ ],
+ [
+ 0.762,
+ -3.147
+ ],
+ [
+ 1.314,
+ -5.443
+ ],
+ [
+ 1.02,
+ -4.221
+ ],
+ [
+ 1.176,
+ -4.848
+ ],
+ [
+ 0.84,
+ -3.48
+ ],
+ [
+ 1.151,
+ -4.775
+ ],
+ [
+ 0.924,
+ -3.814
+ ],
+ [
+ 1.176,
+ -4.848
+ ],
+ [
+ 0.84,
+ -3.481
+ ],
+ [
+ 1.151,
+ -4.776
+ ],
+ [
+ 0.924,
+ -3.812
+ ],
+ [
+ 1.155,
+ -4.775
+ ],
+ [
+ 1.02,
+ -4.221
+ ],
+ [
+ 1.175,
+ -4.849
+ ],
+ [
+ 0.84,
+ -3.48
+ ],
+ [
+ 1.152,
+ -4.775
+ ],
+ [
+ 0.924,
+ -3.814
+ ],
+ [
+ 1.177,
+ -4.848
+ ],
+ [
+ 0.84,
+ -3.481
+ ],
+ [
+ 1.152,
+ -4.776
+ ],
+ [
+ 0.762,
+ -3.147
+ ],
+ [
+ 1.399,
+ -5.813
+ ],
+ [
+ 1.221,
+ -5.184
+ ],
+ [
+ 0.195,
+ -1.936
+ ],
+ [
+ 0.04,
+ -0.182
+ ],
+ [
+ -0.265,
+ -1.021
+ ],
+ [
+ -0.009,
+ -0.421
+ ],
+ [
+ -0.338,
+ -2.718
+ ],
+ [
+ -0.911,
+ -4.753
+ ],
+ [
+ -0.947,
+ -2.131
+ ],
+ [
+ -1.924,
+ -3.218
+ ],
+ [
+ -2.087,
+ -2.334
+ ],
+ [
+ -3.168,
+ -2.671
+ ],
+ [
+ -3.468,
+ -1.959
+ ],
+ [
+ -4.328,
+ -1.427
+ ],
+ [
+ -2.296,
+ -0.196
+ ],
+ [
+ -2.467,
+ 0.177
+ ],
+ [
+ -2.844,
+ 0.368
+ ],
+ [
+ -4.542,
+ 1.269
+ ],
+ [
+ -4.358,
+ 2.353
+ ],
+ [
+ -2.197,
+ 1.908
+ ],
+ [
+ -3.354,
+ 4.041
+ ],
+ [
+ -0.967,
+ 2.035
+ ],
+ [
+ -0.865,
+ 2.564
+ ],
+ [
+ -1.172,
+ 4.929
+ ],
+ [
+ -1.696,
+ 6.996
+ ],
+ [
+ -1.611,
+ 6.703
+ ],
+ [
+ -1.276,
+ 5.217
+ ],
+ [
+ -1.368,
+ 5.821
+ ],
+ [
+ -1.766,
+ 7.293
+ ],
+ [
+ -1.247,
+ 5.146
+ ],
+ [
+ -1.424,
+ 5.886
+ ],
+ [
+ -1.758,
+ 7.256
+ ],
+ [
+ -0.874,
+ 3.59
+ ],
+ [
+ -1.178,
+ 4.848
+ ],
+ [
+ -0.832,
+ 3.443
+ ],
+ [
+ -1.179,
+ 4.888
+ ],
+ [
+ -0.905,
+ 3.739
+ ],
+ [
+ -1.336,
+ 5.516
+ ],
+ [
+ -0.841,
+ 3.48
+ ],
+ [
+ -1.31,
+ 5.444
+ ],
+ [
+ -0.676,
+ 2.799
+ ],
+ [
+ 34.022,
+ 26.956
+ ],
+ [
+ 0.087,
+ -0.362
+ ]
+ ],
+ "v": [
+ [
+ 17.125,
+ 196.379
+ ],
+ [
+ 19.69,
+ 185.829
+ ],
+ [
+ 23.133,
+ 171.498
+ ],
+ [
+ 25.45,
+ 162.064
+ ],
+ [
+ 29.37,
+ 145.732
+ ],
+ [
+ 32.463,
+ 133.076
+ ],
+ [
+ 35.968,
+ 118.525
+ ],
+ [
+ 38.499,
+ 108.085
+ ],
+ [
+ 41.944,
+ 93.755
+ ],
+ [
+ 44.748,
+ 82.322
+ ],
+ [
+ 48.253,
+ 67.771
+ ],
+ [
+ 50.784,
+ 57.331
+ ],
+ [
+ 54.229,
+ 43
+ ],
+ [
+ 57.032,
+ 31.568
+ ],
+ [
+ 60.466,
+ 17.234
+ ],
+ [
+ 63.557,
+ 4.579
+ ],
+ [
+ 67.062,
+ -9.973
+ ],
+ [
+ 69.591,
+ -20.413
+ ],
+ [
+ 73.04,
+ -34.742
+ ],
+ [
+ 75.841,
+ -46.176
+ ],
+ [
+ 79.347,
+ -60.727
+ ],
+ [
+ 81.876,
+ -71.167
+ ],
+ [
+ 85.324,
+ -85.497
+ ],
+ [
+ 87.637,
+ -94.933
+ ],
+ [
+ 91.803,
+ -112.38
+ ],
+ [
+ 95.063,
+ -128.023
+ ],
+ [
+ 95.547,
+ -133.832
+ ],
+ [
+ 95.546,
+ -134.402
+ ],
+ [
+ 95.415,
+ -137.487
+ ],
+ [
+ 95.409,
+ -138.749
+ ],
+ [
+ 94.28,
+ -146.888
+ ],
+ [
+ 89.919,
+ -160.601
+ ],
+ [
+ 86.662,
+ -166.785
+ ],
+ [
+ 80.106,
+ -175.871
+ ],
+ [
+ 73.416,
+ -182.468
+ ],
+ [
+ 63.265,
+ -189.504
+ ],
+ [
+ 52.348,
+ -194.232
+ ],
+ [
+ 39.068,
+ -197.004
+ ],
+ [
+ 32.109,
+ -197.297
+ ],
+ [
+ 24.709,
+ -196.721
+ ],
+ [
+ 16.32,
+ -195.009
+ ],
+ [
+ 3.285,
+ -189.717
+ ],
+ [
+ -8.791,
+ -181.263
+ ],
+ [
+ -14.825,
+ -174.988
+ ],
+ [
+ -23.31,
+ -161.822
+ ],
+ [
+ -25.88,
+ -155.575
+ ],
+ [
+ -28.075,
+ -147.761
+ ],
+ [
+ -31.685,
+ -132.998
+ ],
+ [
+ -36.743,
+ -112.002
+ ],
+ [
+ -41.57,
+ -91.892
+ ],
+ [
+ -45.367,
+ -76.234
+ ],
+ [
+ -49.575,
+ -58.795
+ ],
+ [
+ -54.878,
+ -36.917
+ ],
+ [
+ -58.609,
+ -21.478
+ ],
+ [
+ -62.883,
+ -3.82
+ ],
+ [
+ -68.164,
+ 17.945
+ ],
+ [
+ -70.814,
+ 28.708
+ ],
+ [
+ -74.32,
+ 43.259
+ ],
+ [
+ -76.828,
+ 53.586
+ ],
+ [
+ -80.358,
+ 68.25
+ ],
+ [
+ -83.1,
+ 79.462
+ ],
+ [
+ -87.092,
+ 96.012
+ ],
+ [
+ -89.624,
+ 106.451
+ ],
+ [
+ -93.542,
+ 122.784
+ ],
+ [
+ -95.593,
+ 131.176
+ ],
+ [
+ 16.864,
+ 197.466
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 108.871,
+ 212.877
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -2.786,
+ 11.518
+ ],
+ [
+ -3.055,
+ 12.631
+ ],
+ [
+ -3.136,
+ 12.966
+ ],
+ [
+ -3.461,
+ 14.304
+ ],
+ [
+ -3.307,
+ 13.672
+ ],
+ [
+ -2.958,
+ 12.223
+ ],
+ [
+ -2.635,
+ 10.886
+ ],
+ [
+ -3.051,
+ 12.632
+ ],
+ [
+ -0.322,
+ 4.6
+ ],
+ [
+ -0.29,
+ 0.427
+ ],
+ [
+ -0.07,
+ 3.445
+ ],
+ [
+ 0.031,
+ 0.271
+ ],
+ [
+ -0.008,
+ 0.346
+ ],
+ [
+ 0.138,
+ 1.291
+ ],
+ [
+ 3.501,
+ 7.461
+ ],
+ [
+ 7.346,
+ 6.858
+ ],
+ [
+ 6.083,
+ 3.294
+ ],
+ [
+ 5.005,
+ 1.469
+ ],
+ [
+ 5.277,
+ 0.165
+ ],
+ [
+ 0.422,
+ 0.008
+ ],
+ [
+ 0.358,
+ 0.007
+ ],
+ [
+ 0.311,
+ 0.236
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.34,
+ -0.041
+ ],
+ [
+ 0.303,
+ 0.006
+ ],
+ [
+ 0.426,
+ -0.167
+ ],
+ [
+ 1.784,
+ -0.213
+ ],
+ [
+ 4.574,
+ -1.424
+ ],
+ [
+ 7.008,
+ -5.122
+ ],
+ [
+ 5.118,
+ -7.737
+ ],
+ [
+ 2.11,
+ -8.664
+ ],
+ [
+ 2.446,
+ -10.105
+ ],
+ [
+ 3.411,
+ -14.078
+ ],
+ [
+ 2.887,
+ -11.923
+ ],
+ [
+ 2.614,
+ -10.81
+ ],
+ [
+ 3.056,
+ -12.63
+ ],
+ [
+ 2.623,
+ -10.848
+ ],
+ [
+ 3.468,
+ -14.34
+ ],
+ [
+ 1.587,
+ -6.55
+ ],
+ [
+ -4.407,
+ -3.492
+ ],
+ [
+ -0.677,
+ 2.799
+ ],
+ [
+ -1.31,
+ 5.444
+ ],
+ [
+ -0.841,
+ 3.48
+ ],
+ [
+ -1.337,
+ 5.516
+ ],
+ [
+ -0.906,
+ 3.739
+ ],
+ [
+ -1.18,
+ 4.888
+ ],
+ [
+ -0.831,
+ 3.443
+ ],
+ [
+ -1.178,
+ 4.848
+ ],
+ [
+ -0.874,
+ 3.59
+ ],
+ [
+ -1.758,
+ 7.256
+ ],
+ [
+ -1.423,
+ 5.887
+ ],
+ [
+ -1.246,
+ 5.146
+ ],
+ [
+ -1.767,
+ 7.293
+ ],
+ [
+ -1.369,
+ 5.821
+ ],
+ [
+ -1.275,
+ 5.217
+ ],
+ [
+ -1.61,
+ 6.703
+ ],
+ [
+ -1.696,
+ 6.996
+ ],
+ [
+ -1.172,
+ 4.929
+ ],
+ [
+ -0.866,
+ 2.564
+ ],
+ [
+ -0.967,
+ 2.035
+ ],
+ [
+ -3.355,
+ 4.041
+ ],
+ [
+ -2.197,
+ 1.908
+ ],
+ [
+ -4.358,
+ 2.353
+ ],
+ [
+ -4.543,
+ 1.269
+ ],
+ [
+ -2.845,
+ 0.367
+ ],
+ [
+ -2.467,
+ 0.177
+ ],
+ [
+ -2.295,
+ -0.196
+ ],
+ [
+ -4.329,
+ -1.427
+ ],
+ [
+ -3.468,
+ -1.959
+ ],
+ [
+ -3.168,
+ -2.671
+ ],
+ [
+ -2.087,
+ -2.334
+ ],
+ [
+ -1.924,
+ -3.218
+ ],
+ [
+ -0.947,
+ -2.13
+ ],
+ [
+ -0.912,
+ -4.753
+ ],
+ [
+ -0.339,
+ -2.718
+ ],
+ [
+ -0.009,
+ -0.421
+ ],
+ [
+ -0.264,
+ -1.021
+ ],
+ [
+ 0.04,
+ -0.182
+ ],
+ [
+ 0.196,
+ -1.936
+ ],
+ [
+ 1.221,
+ -5.184
+ ],
+ [
+ 1.399,
+ -5.813
+ ],
+ [
+ 0.761,
+ -3.148
+ ],
+ [
+ 1.151,
+ -4.776
+ ],
+ [
+ 0.841,
+ -3.48
+ ],
+ [
+ 1.176,
+ -4.848
+ ],
+ [
+ 0.924,
+ -3.814
+ ],
+ [
+ 1.151,
+ -4.775
+ ],
+ [
+ 0.839,
+ -3.48
+ ],
+ [
+ 1.175,
+ -4.85
+ ],
+ [
+ 1.02,
+ -4.221
+ ],
+ [
+ 1.155,
+ -4.775
+ ],
+ [
+ 0.924,
+ -3.813
+ ],
+ [
+ 1.151,
+ -4.776
+ ],
+ [
+ 0.84,
+ -3.481
+ ],
+ [
+ 1.177,
+ -4.848
+ ],
+ [
+ 0.925,
+ -3.814
+ ],
+ [
+ 1.151,
+ -4.775
+ ],
+ [
+ 0.84,
+ -3.48
+ ],
+ [
+ 1.176,
+ -4.848
+ ],
+ [
+ 1.02,
+ -4.22
+ ],
+ [
+ 1.314,
+ -5.442
+ ],
+ [
+ 0.762,
+ -3.147
+ ],
+ [
+ 1.152,
+ -4.776
+ ],
+ [
+ 0.85,
+ -3.518
+ ],
+ [
+ 0.087,
+ -0.362
+ ],
+ [
+ -4.789,
+ -1.816
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 3.055,
+ -12.632
+ ],
+ [
+ 3.136,
+ -12.966
+ ],
+ [
+ 3.461,
+ -14.304
+ ],
+ [
+ 3.309,
+ -13.672
+ ],
+ [
+ 2.957,
+ -12.222
+ ],
+ [
+ 2.635,
+ -10.884
+ ],
+ [
+ 3.058,
+ -12.631
+ ],
+ [
+ 1.077,
+ -4.46
+ ],
+ [
+ 0.214,
+ -0.44
+ ],
+ [
+ 0.07,
+ -3.445
+ ],
+ [
+ -0.207,
+ -0.25
+ ],
+ [
+ 0.007,
+ -0.346
+ ],
+ [
+ 0.042,
+ -1.299
+ ],
+ [
+ -0.88,
+ -8.221
+ ],
+ [
+ -4.248,
+ -9.053
+ ],
+ [
+ -5.069,
+ -4.733
+ ],
+ [
+ -4.591,
+ -2.489
+ ],
+ [
+ -5.034,
+ -1.476
+ ],
+ [
+ -0.422,
+ -0.009
+ ],
+ [
+ -0.358,
+ -0.008
+ ],
+ [
+ -0.336,
+ -0.055
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.323,
+ 0.224
+ ],
+ [
+ -0.303,
+ -0.007
+ ],
+ [
+ -0.433,
+ 0.031
+ ],
+ [
+ -1.791,
+ 0.153
+ ],
+ [
+ -4.754,
+ 0.569
+ ],
+ [
+ -8.293,
+ 2.582
+ ],
+ [
+ -7.495,
+ 5.478
+ ],
+ [
+ -4.922,
+ 7.439
+ ],
+ [
+ -2.461,
+ 10.1
+ ],
+ [
+ -3.408,
+ 14.078
+ ],
+ [
+ -2.888,
+ 11.924
+ ],
+ [
+ -2.617,
+ 10.811
+ ],
+ [
+ -3.054,
+ 12.63
+ ],
+ [
+ -2.625,
+ 10.847
+ ],
+ [
+ -3.467,
+ 14.34
+ ],
+ [
+ -1.584,
+ 6.55
+ ],
+ [
+ 4.278,
+ 3.642
+ ],
+ [
+ 0.686,
+ -2.797
+ ],
+ [
+ 1.315,
+ -5.442
+ ],
+ [
+ 0.837,
+ -3.481
+ ],
+ [
+ 1.333,
+ -5.517
+ ],
+ [
+ 0.906,
+ -3.739
+ ],
+ [
+ 1.183,
+ -4.886
+ ],
+ [
+ 0.831,
+ -3.443
+ ],
+ [
+ 1.172,
+ -4.85
+ ],
+ [
+ 0.872,
+ -3.591
+ ],
+ [
+ 1.766,
+ -7.254
+ ],
+ [
+ 1.426,
+ -5.886
+ ],
+ [
+ 1.245,
+ -5.146
+ ],
+ [
+ 1.766,
+ -7.293
+ ],
+ [
+ 1.407,
+ -5.811
+ ],
+ [
+ 1.229,
+ -5.228
+ ],
+ [
+ 1.637,
+ -6.696
+ ],
+ [
+ 1.682,
+ -7
+ ],
+ [
+ 1.194,
+ -4.923
+ ],
+ [
+ 0.627,
+ -2.636
+ ],
+ [
+ 0.72,
+ -2.134
+ ],
+ [
+ 2.259,
+ -4.752
+ ],
+ [
+ 1.854,
+ -2.234
+ ],
+ [
+ 3.728,
+ -3.237
+ ],
+ [
+ 4.156,
+ -2.244
+ ],
+ [
+ 2.752,
+ -0.768
+ ],
+ [
+ 2.464,
+ -0.317
+ ],
+ [
+ 2.353,
+ -0.169
+ ],
+ [
+ 4.518,
+ 0.388
+ ],
+ [
+ 3.787,
+ 1.248
+ ],
+ [
+ 3.597,
+ 2.031
+ ],
+ [
+ 2.408,
+ 2.031
+ ],
+ [
+ 2.498,
+ 2.793
+ ],
+ [
+ 1.198,
+ 2.003
+ ],
+ [
+ 1.96,
+ 4.409
+ ],
+ [
+ 0.517,
+ 2.7
+ ],
+ [
+ 0.051,
+ 0.414
+ ],
+ [
+ 0.022,
+ 1.028
+ ],
+ [
+ 0.047,
+ 0.178
+ ],
+ [
+ -0.421,
+ 1.913
+ ],
+ [
+ -0.54,
+ 5.337
+ ],
+ [
+ -1.37,
+ 5.82
+ ],
+ [
+ -0.757,
+ 3.149
+ ],
+ [
+ -1.157,
+ 4.775
+ ],
+ [
+ -0.839,
+ 3.48
+ ],
+ [
+ -1.17,
+ 4.851
+ ],
+ [
+ -0.925,
+ 3.814
+ ],
+ [
+ -1.158,
+ 4.774
+ ],
+ [
+ -0.84,
+ 3.481
+ ],
+ [
+ -1.171,
+ 4.85
+ ],
+ [
+ -1.023,
+ 4.22
+ ],
+ [
+ -1.153,
+ 4.776
+ ],
+ [
+ -0.922,
+ 3.814
+ ],
+ [
+ -1.157,
+ 4.775
+ ],
+ [
+ -0.839,
+ 3.481
+ ],
+ [
+ -1.171,
+ 4.85
+ ],
+ [
+ -0.925,
+ 3.814
+ ],
+ [
+ -1.157,
+ 4.774
+ ],
+ [
+ -0.839,
+ 3.481
+ ],
+ [
+ -1.171,
+ 4.85
+ ],
+ [
+ -1.023,
+ 4.221
+ ],
+ [
+ -1.316,
+ 5.443
+ ],
+ [
+ -0.761,
+ 3.149
+ ],
+ [
+ -1.155,
+ 4.775
+ ],
+ [
+ -0.848,
+ 3.519
+ ],
+ [
+ -0.088,
+ 0.362
+ ],
+ [
+ 4.714,
+ 1.964
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.789,
+ -11.518
+ ]
+ ],
+ "v": [
+ [
+ 41.848,
+ 159.493
+ ],
+ [
+ 51.007,
+ 121.597
+ ],
+ [
+ 60.422,
+ 82.7
+ ],
+ [
+ 70.799,
+ 39.788
+ ],
+ [
+ 80.73,
+ -1.226
+ ],
+ [
+ 89.593,
+ -37.897
+ ],
+ [
+ 97.511,
+ -70.549
+ ],
+ [
+ 106.671,
+ -108.445
+ ],
+ [
+ 109.181,
+ -121.959
+ ],
+ [
+ 109.398,
+ -123.344
+ ],
+ [
+ 109.608,
+ -133.679
+ ],
+ [
+ 109.506,
+ -134.493
+ ],
+ [
+ 109.527,
+ -135.532
+ ],
+ [
+ 109.389,
+ -139.419
+ ],
+ [
+ 102.719,
+ -162.942
+ ],
+ [
+ 85.432,
+ -186.885
+ ],
+ [
+ 68.712,
+ -198.905
+ ],
+ [
+ 54.295,
+ -204.815
+ ],
+ [
+ 38.875,
+ -207.592
+ ],
+ [
+ 37.61,
+ -207.617
+ ],
+ [
+ 36.536,
+ -207.639
+ ],
+ [
+ 35.524,
+ -207.778
+ ],
+ [
+ 31.62,
+ -207.857
+ ],
+ [
+ 30.597,
+ -207.759
+ ],
+ [
+ 29.688,
+ -207.778
+ ],
+ [
+ 28.388,
+ -207.717
+ ],
+ [
+ 23.015,
+ -207.247
+ ],
+ [
+ 9.016,
+ -204.266
+ ],
+ [
+ -13.915,
+ -192.662
+ ],
+ [
+ -32.81,
+ -172.808
+ ],
+ [
+ -43.335,
+ -148.634
+ ],
+ [
+ -50.671,
+ -118.321
+ ],
+ [
+ -60.899,
+ -76.087
+ ],
+ [
+ -69.566,
+ -40.317
+ ],
+ [
+ -77.412,
+ -7.885
+ ],
+ [
+ -86.575,
+ 30.007
+ ],
+ [
+ -94.456,
+ 62.547
+ ],
+ [
+ -104.849,
+ 105.568
+ ],
+ [
+ -109.608,
+ 125.217
+ ],
+ [
+ -96.579,
+ 135.919
+ ],
+ [
+ -94.528,
+ 127.527
+ ],
+ [
+ -90.61,
+ 111.194
+ ],
+ [
+ -88.079,
+ 100.755
+ ],
+ [
+ -84.086,
+ 84.205
+ ],
+ [
+ -81.344,
+ 72.993
+ ],
+ [
+ -77.814,
+ 58.329
+ ],
+ [
+ -75.307,
+ 48.002
+ ],
+ [
+ -71.8,
+ 33.451
+ ],
+ [
+ -69.15,
+ 22.688
+ ],
+ [
+ -63.87,
+ 0.923
+ ],
+ [
+ -59.596,
+ -16.736
+ ],
+ [
+ -55.865,
+ -32.174
+ ],
+ [
+ -50.561,
+ -54.052
+ ],
+ [
+ -46.353,
+ -71.491
+ ],
+ [
+ -42.557,
+ -87.149
+ ],
+ [
+ -37.73,
+ -107.259
+ ],
+ [
+ -32.672,
+ -128.255
+ ],
+ [
+ -29.062,
+ -143.018
+ ],
+ [
+ -26.866,
+ -150.832
+ ],
+ [
+ -24.296,
+ -157.079
+ ],
+ [
+ -15.811,
+ -170.245
+ ],
+ [
+ -9.777,
+ -176.52
+ ],
+ [
+ 2.298,
+ -184.974
+ ],
+ [
+ 15.334,
+ -190.266
+ ],
+ [
+ 23.723,
+ -191.978
+ ],
+ [
+ 31.122,
+ -192.554
+ ],
+ [
+ 38.081,
+ -192.261
+ ],
+ [
+ 51.362,
+ -189.489
+ ],
+ [
+ 62.278,
+ -184.761
+ ],
+ [
+ 72.429,
+ -177.725
+ ],
+ [
+ 79.119,
+ -171.128
+ ],
+ [
+ 85.675,
+ -162.042
+ ],
+ [
+ 88.932,
+ -155.859
+ ],
+ [
+ 93.294,
+ -142.145
+ ],
+ [
+ 94.423,
+ -134.006
+ ],
+ [
+ 94.428,
+ -132.744
+ ],
+ [
+ 94.559,
+ -129.659
+ ],
+ [
+ 94.561,
+ -129.089
+ ],
+ [
+ 94.076,
+ -123.28
+ ],
+ [
+ 90.817,
+ -107.637
+ ],
+ [
+ 86.65,
+ -90.19
+ ],
+ [
+ 84.338,
+ -80.754
+ ],
+ [
+ 80.89,
+ -66.424
+ ],
+ [
+ 78.36,
+ -55.985
+ ],
+ [
+ 74.855,
+ -41.433
+ ],
+ [
+ 72.053,
+ -29.999
+ ],
+ [
+ 68.605,
+ -15.67
+ ],
+ [
+ 66.076,
+ -5.23
+ ],
+ [
+ 62.57,
+ 9.322
+ ],
+ [
+ 59.479,
+ 21.977
+ ],
+ [
+ 56.045,
+ 36.311
+ ],
+ [
+ 53.242,
+ 47.743
+ ],
+ [
+ 49.797,
+ 62.074
+ ],
+ [
+ 47.267,
+ 72.514
+ ],
+ [
+ 43.761,
+ 87.065
+ ],
+ [
+ 40.957,
+ 98.498
+ ],
+ [
+ 37.512,
+ 112.828
+ ],
+ [
+ 34.982,
+ 123.268
+ ],
+ [
+ 31.476,
+ 137.819
+ ],
+ [
+ 28.384,
+ 150.474
+ ],
+ [
+ 24.464,
+ 166.806
+ ],
+ [
+ 22.146,
+ 176.241
+ ],
+ [
+ 18.703,
+ 190.572
+ ],
+ [
+ 16.139,
+ 201.122
+ ],
+ [
+ 15.878,
+ 202.209
+ ],
+ [
+ 30.131,
+ 207.884
+ ],
+ [
+ 33.483,
+ 194.044
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 109.858,
+ 208.134
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": "right_hand_mask",
+ "td": 1,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 500,
+ 500,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 476.25,
+ 476.25,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ],
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ],
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 476,
+ 0
+ ],
+ [
+ 0,
+ -476
+ ],
+ [
+ -476,
+ 0
+ ],
+ [
+ 0,
+ 476
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.62,
+ 0.79,
+ 0.81,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 476.25,
+ 476.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": "hand_right",
+ "tt": 1,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ {
+ "i": {
+ "x": 0.69,
+ "y": 1
+ },
+ "o": {
+ "x": 1,
+ "y": 0
+ },
+ "n": "0p69_1_1_0",
+ "t": 29,
+ "s": [
+ 819.292,
+ 1149.194,
+ 0
+ ],
+ "e": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "to": [
+ -21.6666660308838,
+ -67.3333358764648,
+ 0
+ ],
+ "ti": [
+ 21.6666660308838,
+ 67.3333358764648,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.21,
+ "y": 0.21
+ },
+ "o": {
+ "x": 1,
+ "y": 1
+ },
+ "n": "0p21_0p21_1_1",
+ "t": 39,
+ "s": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "e": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.21,
+ "y": 1
+ },
+ "o": {
+ "x": 0.13,
+ "y": 0
+ },
+ "n": "0p21_1_0p13_0",
+ "t": 44,
+ "s": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "e": [
+ 819.292,
+ 1149.194,
+ 0
+ ],
+ "to": [
+ 21.6666660308838,
+ 67.3333358764648,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.515,
+ "y": 1
+ },
+ "o": {
+ "x": 0.13,
+ "y": 0
+ },
+ "n": "0p515_1_0p13_0",
+ "t": 54,
+ "s": [
+ 819.292,
+ 1149.194,
+ 0
+ ],
+ "e": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 13.3333330154419,
+ 40.3333320617676,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.69,
+ "y": 1
+ },
+ "o": {
+ "x": 0.95,
+ "y": 0
+ },
+ "n": "0p69_1_0p95_0",
+ "t": 59,
+ "s": [
+ 689.292,
+ 745.194,
+ 0
+ ],
+ "e": [
+ 739.292,
+ 907.194,
+ 0
+ ],
+ "to": [
+ -13.3333330154419,
+ -40.3333320617676,
+ 0
+ ],
+ "ti": [
+ -21.6666660308838,
+ -67.3333358764648,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.69,
+ "y": 1
+ },
+ "o": {
+ "x": 0.86,
+ "y": 0
+ },
+ "n": "0p69_1_0p86_0",
+ "t": 67.904,
+ "s": [
+ 739.292,
+ 907.194,
+ 0
+ ],
+ "e": [
+ 819.292,
+ 1149.194,
+ 0
+ ],
+ "to": [
+ 21.6666660308838,
+ 67.3333358764648,
+ 0
+ ],
+ "ti": [
+ -13.3333330154419,
+ -40.3333320617676,
+ 0
+ ]
+ },
+ {
+ "t": 76
+ }
+ ]
+ },
+ "a": {
+ "k": [
+ 109.772,
+ 207.96,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0.622,
+ 2.577
+ ],
+ [
+ 1.31,
+ 5.443
+ ],
+ [
+ 0.841,
+ 3.48
+ ],
+ [
+ 1.336,
+ 5.515
+ ],
+ [
+ 0.906,
+ 3.739
+ ],
+ [
+ 1.18,
+ 4.887
+ ],
+ [
+ 0.831,
+ 3.443
+ ],
+ [
+ 1.178,
+ 4.847
+ ],
+ [
+ 0.874,
+ 3.59
+ ],
+ [
+ 1.758,
+ 7.255
+ ],
+ [
+ 1.423,
+ 5.887
+ ],
+ [
+ 1.246,
+ 5.145
+ ],
+ [
+ 1.766,
+ 7.293
+ ],
+ [
+ 1.369,
+ 5.822
+ ],
+ [
+ 1.276,
+ 5.217
+ ],
+ [
+ 1.611,
+ 6.703
+ ],
+ [
+ 1.695,
+ 6.996
+ ],
+ [
+ 1.172,
+ 4.929
+ ],
+ [
+ 0.865,
+ 2.564
+ ],
+ [
+ 0.966,
+ 2.035
+ ],
+ [
+ 3.356,
+ 4.041
+ ],
+ [
+ 2.197,
+ 1.907
+ ],
+ [
+ 4.358,
+ 2.353
+ ],
+ [
+ 4.542,
+ 1.269
+ ],
+ [
+ 2.845,
+ 0.367
+ ],
+ [
+ 2.467,
+ 0.177
+ ],
+ [
+ 2.296,
+ -0.196
+ ],
+ [
+ 4.328,
+ -1.426
+ ],
+ [
+ 3.468,
+ -1.959
+ ],
+ [
+ 3.168,
+ -2.671
+ ],
+ [
+ 2.087,
+ -2.334
+ ],
+ [
+ 1.924,
+ -3.218
+ ],
+ [
+ 0.947,
+ -2.131
+ ],
+ [
+ 0.911,
+ -4.753
+ ],
+ [
+ 0.338,
+ -2.718
+ ],
+ [
+ 0.009,
+ -0.421
+ ],
+ [
+ 0.265,
+ -1.02
+ ],
+ [
+ -0.041,
+ -0.182
+ ],
+ [
+ -0.197,
+ -1.935
+ ],
+ [
+ -1.22,
+ -5.185
+ ],
+ [
+ -1.399,
+ -5.813
+ ],
+ [
+ -0.762,
+ -3.148
+ ],
+ [
+ -1.152,
+ -4.777
+ ],
+ [
+ -0.84,
+ -3.48
+ ],
+ [
+ -1.176,
+ -4.849
+ ],
+ [
+ -0.924,
+ -3.814
+ ],
+ [
+ -1.151,
+ -4.776
+ ],
+ [
+ -0.84,
+ -3.48
+ ],
+ [
+ -1.175,
+ -4.85
+ ],
+ [
+ -1.02,
+ -4.221
+ ],
+ [
+ -1.155,
+ -4.775
+ ],
+ [
+ -0.923,
+ -3.813
+ ],
+ [
+ -1.151,
+ -4.776
+ ],
+ [
+ -0.841,
+ -3.48
+ ],
+ [
+ -1.176,
+ -4.849
+ ],
+ [
+ -0.924,
+ -3.814
+ ],
+ [
+ -1.15,
+ -4.776
+ ],
+ [
+ -0.841,
+ -3.48
+ ],
+ [
+ -1.176,
+ -4.849
+ ],
+ [
+ -1.021,
+ -4.22
+ ],
+ [
+ -1.315,
+ -5.442
+ ],
+ [
+ -0.762,
+ -3.148
+ ],
+ [
+ -1.152,
+ -4.776
+ ],
+ [
+ -0.851,
+ -3.518
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -33.986,
+ 27.051
+ ]
+ ],
+ "o": [
+ [
+ -1.315,
+ -5.442
+ ],
+ [
+ -0.838,
+ -3.481
+ ],
+ [
+ -1.332,
+ -5.517
+ ],
+ [
+ -0.907,
+ -3.74
+ ],
+ [
+ -1.183,
+ -4.886
+ ],
+ [
+ -0.831,
+ -3.444
+ ],
+ [
+ -1.172,
+ -4.85
+ ],
+ [
+ -0.872,
+ -3.591
+ ],
+ [
+ -1.766,
+ -7.254
+ ],
+ [
+ -1.426,
+ -5.886
+ ],
+ [
+ -1.245,
+ -5.146
+ ],
+ [
+ -1.767,
+ -7.293
+ ],
+ [
+ -1.408,
+ -5.812
+ ],
+ [
+ -1.229,
+ -5.227
+ ],
+ [
+ -1.637,
+ -6.696
+ ],
+ [
+ -1.681,
+ -7
+ ],
+ [
+ -1.195,
+ -4.923
+ ],
+ [
+ -0.627,
+ -2.637
+ ],
+ [
+ -0.721,
+ -2.134
+ ],
+ [
+ -2.259,
+ -4.752
+ ],
+ [
+ -1.853,
+ -2.234
+ ],
+ [
+ -3.728,
+ -3.237
+ ],
+ [
+ -4.156,
+ -2.244
+ ],
+ [
+ -2.752,
+ -0.769
+ ],
+ [
+ -2.464,
+ -0.317
+ ],
+ [
+ -2.353,
+ -0.169
+ ],
+ [
+ -4.518,
+ 0.388
+ ],
+ [
+ -3.788,
+ 1.248
+ ],
+ [
+ -3.596,
+ 2.031
+ ],
+ [
+ -2.407,
+ 2.03
+ ],
+ [
+ -2.498,
+ 2.793
+ ],
+ [
+ -1.197,
+ 2.003
+ ],
+ [
+ -1.96,
+ 4.408
+ ],
+ [
+ -0.518,
+ 2.699
+ ],
+ [
+ -0.052,
+ 0.414
+ ],
+ [
+ -0.022,
+ 1.028
+ ],
+ [
+ -0.047,
+ 0.179
+ ],
+ [
+ 0.42,
+ 1.913
+ ],
+ [
+ 0.54,
+ 5.338
+ ],
+ [
+ 1.37,
+ 5.82
+ ],
+ [
+ 0.757,
+ 3.149
+ ],
+ [
+ 1.156,
+ 4.775
+ ],
+ [
+ 0.839,
+ 3.48
+ ],
+ [
+ 1.17,
+ 4.851
+ ],
+ [
+ 0.925,
+ 3.814
+ ],
+ [
+ 1.158,
+ 4.774
+ ],
+ [
+ 0.84,
+ 3.481
+ ],
+ [
+ 1.17,
+ 4.85
+ ],
+ [
+ 1.023,
+ 4.22
+ ],
+ [
+ 1.154,
+ 4.776
+ ],
+ [
+ 0.922,
+ 3.814
+ ],
+ [
+ 1.158,
+ 4.775
+ ],
+ [
+ 0.839,
+ 3.481
+ ],
+ [
+ 1.17,
+ 4.851
+ ],
+ [
+ 0.926,
+ 3.814
+ ],
+ [
+ 1.157,
+ 4.774
+ ],
+ [
+ 0.84,
+ 3.481
+ ],
+ [
+ 1.17,
+ 4.85
+ ],
+ [
+ 1.024,
+ 4.221
+ ],
+ [
+ 1.315,
+ 5.443
+ ],
+ [
+ 0.76,
+ 3.149
+ ],
+ [
+ 1.155,
+ 4.775
+ ],
+ [
+ 0.848,
+ 3.518
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 40.632,
+ -17.027
+ ],
+ [
+ -0.632,
+ -2.576
+ ]
+ ],
+ "v": [
+ [
+ 93.624,
+ 122.973
+ ],
+ [
+ 89.706,
+ 106.64
+ ],
+ [
+ 87.174,
+ 96.201
+ ],
+ [
+ 83.182,
+ 79.651
+ ],
+ [
+ 80.438,
+ 68.439
+ ],
+ [
+ 76.909,
+ 53.775
+ ],
+ [
+ 74.401,
+ 43.448
+ ],
+ [
+ 70.895,
+ 28.897
+ ],
+ [
+ 68.245,
+ 18.134
+ ],
+ [
+ 62.964,
+ -3.631
+ ],
+ [
+ 58.69,
+ -21.29
+ ],
+ [
+ 54.961,
+ -36.728
+ ],
+ [
+ 49.656,
+ -58.606
+ ],
+ [
+ 45.448,
+ -76.046
+ ],
+ [
+ 41.651,
+ -91.703
+ ],
+ [
+ 36.825,
+ -111.813
+ ],
+ [
+ 31.768,
+ -132.809
+ ],
+ [
+ 28.156,
+ -147.572
+ ],
+ [
+ 25.962,
+ -155.386
+ ],
+ [
+ 23.391,
+ -161.633
+ ],
+ [
+ 14.906,
+ -174.799
+ ],
+ [
+ 8.872,
+ -181.074
+ ],
+ [
+ -3.203,
+ -189.528
+ ],
+ [
+ -16.238,
+ -194.82
+ ],
+ [
+ -24.628,
+ -196.532
+ ],
+ [
+ -32.027,
+ -197.108
+ ],
+ [
+ -38.987,
+ -196.815
+ ],
+ [
+ -52.266,
+ -194.044
+ ],
+ [
+ -63.183,
+ -189.315
+ ],
+ [
+ -73.334,
+ -182.279
+ ],
+ [
+ -80.024,
+ -175.682
+ ],
+ [
+ -86.581,
+ -166.596
+ ],
+ [
+ -89.837,
+ -160.413
+ ],
+ [
+ -94.198,
+ -146.699
+ ],
+ [
+ -95.328,
+ -138.56
+ ],
+ [
+ -95.333,
+ -137.298
+ ],
+ [
+ -95.464,
+ -134.214
+ ],
+ [
+ -95.466,
+ -133.643
+ ],
+ [
+ -94.98,
+ -127.835
+ ],
+ [
+ -91.722,
+ -112.191
+ ],
+ [
+ -87.555,
+ -94.744
+ ],
+ [
+ -85.242,
+ -85.308
+ ],
+ [
+ -81.794,
+ -70.978
+ ],
+ [
+ -79.266,
+ -60.539
+ ],
+ [
+ -75.76,
+ -45.987
+ ],
+ [
+ -72.958,
+ -34.553
+ ],
+ [
+ -69.51,
+ -20.224
+ ],
+ [
+ -66.98,
+ -9.784
+ ],
+ [
+ -63.475,
+ 4.768
+ ],
+ [
+ -60.384,
+ 17.423
+ ],
+ [
+ -56.951,
+ 31.757
+ ],
+ [
+ -54.147,
+ 43.189
+ ],
+ [
+ -50.703,
+ 57.52
+ ],
+ [
+ -48.172,
+ 67.959
+ ],
+ [
+ -44.667,
+ 82.511
+ ],
+ [
+ -41.862,
+ 93.944
+ ],
+ [
+ -38.417,
+ 108.274
+ ],
+ [
+ -35.886,
+ 118.714
+ ],
+ [
+ -32.381,
+ 133.265
+ ],
+ [
+ -29.289,
+ 145.92
+ ],
+ [
+ -25.368,
+ 162.252
+ ],
+ [
+ -23.052,
+ 171.687
+ ],
+ [
+ -19.609,
+ 186.018
+ ],
+ [
+ -17.044,
+ 196.568
+ ],
+ [
+ -16.873,
+ 197.277
+ ],
+ [
+ 95.511,
+ 130.699
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 110.763,
+ 212.689
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 3.468,
+ 14.34
+ ],
+ [
+ 2.625,
+ 10.848
+ ],
+ [
+ 3.055,
+ 12.63
+ ],
+ [
+ 2.618,
+ 10.81
+ ],
+ [
+ 2.889,
+ 11.924
+ ],
+ [
+ 3.407,
+ 14.078
+ ],
+ [
+ 2.461,
+ 10.1
+ ],
+ [
+ 4.922,
+ 7.438
+ ],
+ [
+ 7.495,
+ 5.479
+ ],
+ [
+ 8.293,
+ 2.582
+ ],
+ [
+ 4.755,
+ 0.569
+ ],
+ [
+ 1.791,
+ 0.154
+ ],
+ [
+ 0.433,
+ 0.03
+ ],
+ [
+ 0.304,
+ -0.006
+ ],
+ [
+ 0.322,
+ 0.223
+ ],
+ [
+ 1.301,
+ -0.027
+ ],
+ [
+ 0.336,
+ -0.054
+ ],
+ [
+ 0.358,
+ -0.008
+ ],
+ [
+ 0.422,
+ -0.008
+ ],
+ [
+ 5.034,
+ -1.477
+ ],
+ [
+ 4.592,
+ -2.488
+ ],
+ [
+ 5.07,
+ -4.733
+ ],
+ [
+ 4.249,
+ -9.054
+ ],
+ [
+ 0.88,
+ -8.221
+ ],
+ [
+ -0.042,
+ -1.299
+ ],
+ [
+ -0.008,
+ -0.346
+ ],
+ [
+ 0.207,
+ -0.25
+ ],
+ [
+ -0.07,
+ -3.445
+ ],
+ [
+ -0.215,
+ -0.439
+ ],
+ [
+ -1.077,
+ -4.46
+ ],
+ [
+ -3.057,
+ -12.631
+ ],
+ [
+ -2.635,
+ -10.885
+ ],
+ [
+ -2.957,
+ -12.223
+ ],
+ [
+ -3.307,
+ -13.672
+ ],
+ [
+ -3.46,
+ -14.303
+ ],
+ [
+ -3.136,
+ -12.966
+ ],
+ [
+ -3.054,
+ -12.632
+ ],
+ [
+ -2.789,
+ -11.518
+ ],
+ [
+ -1.089,
+ -4.498
+ ],
+ [
+ -4.712,
+ 1.975
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.848,
+ 3.519
+ ],
+ [
+ 1.156,
+ 4.776
+ ],
+ [
+ 0.76,
+ 3.148
+ ],
+ [
+ 1.316,
+ 5.442
+ ],
+ [
+ 1.024,
+ 4.221
+ ],
+ [
+ 1.17,
+ 4.849
+ ],
+ [
+ 0.84,
+ 3.482
+ ],
+ [
+ 1.157,
+ 4.775
+ ],
+ [
+ 0.926,
+ 3.813
+ ],
+ [
+ 1.17,
+ 4.85
+ ],
+ [
+ 0.839,
+ 3.482
+ ],
+ [
+ 1.157,
+ 4.776
+ ],
+ [
+ 0.922,
+ 3.813
+ ],
+ [
+ 1.154,
+ 4.775
+ ],
+ [
+ 1.022,
+ 4.22
+ ],
+ [
+ 1.171,
+ 4.849
+ ],
+ [
+ 0.84,
+ 3.482
+ ],
+ [
+ 1.158,
+ 4.775
+ ],
+ [
+ 0.925,
+ 3.813
+ ],
+ [
+ 1.169,
+ 4.85
+ ],
+ [
+ 0.839,
+ 3.481
+ ],
+ [
+ 1.156,
+ 4.776
+ ],
+ [
+ 0.756,
+ 3.148
+ ],
+ [
+ 1.37,
+ 5.821
+ ],
+ [
+ 0.54,
+ 5.338
+ ],
+ [
+ 0.42,
+ 1.913
+ ],
+ [
+ -0.047,
+ 0.179
+ ],
+ [
+ -0.021,
+ 1.028
+ ],
+ [
+ -0.052,
+ 0.414
+ ],
+ [
+ -0.518,
+ 2.699
+ ],
+ [
+ -1.96,
+ 4.408
+ ],
+ [
+ -1.197,
+ 2.003
+ ],
+ [
+ -2.497,
+ 2.793
+ ],
+ [
+ -2.407,
+ 2.03
+ ],
+ [
+ -3.597,
+ 2.032
+ ],
+ [
+ -3.788,
+ 1.248
+ ],
+ [
+ -4.518,
+ 0.388
+ ],
+ [
+ -2.353,
+ -0.169
+ ],
+ [
+ -2.464,
+ -0.318
+ ],
+ [
+ -2.752,
+ -0.769
+ ],
+ [
+ -4.156,
+ -2.244
+ ],
+ [
+ -3.728,
+ -3.238
+ ],
+ [
+ -1.853,
+ -2.233
+ ],
+ [
+ -2.259,
+ -4.752
+ ],
+ [
+ -0.721,
+ -2.134
+ ],
+ [
+ -0.627,
+ -2.637
+ ],
+ [
+ -1.195,
+ -4.923
+ ],
+ [
+ -1.681,
+ -7
+ ],
+ [
+ -1.638,
+ -6.697
+ ],
+ [
+ -1.229,
+ -5.228
+ ],
+ [
+ -1.408,
+ -5.811
+ ],
+ [
+ -1.766,
+ -7.293
+ ],
+ [
+ -1.245,
+ -5.147
+ ],
+ [
+ -1.426,
+ -5.886
+ ],
+ [
+ -1.765,
+ -7.254
+ ],
+ [
+ -0.872,
+ -3.591
+ ],
+ [
+ -1.172,
+ -4.85
+ ],
+ [
+ -0.831,
+ -3.443
+ ],
+ [
+ -1.184,
+ -4.885
+ ],
+ [
+ -0.906,
+ -3.739
+ ],
+ [
+ -1.332,
+ -5.517
+ ],
+ [
+ -0.838,
+ -3.481
+ ],
+ [
+ -1.315,
+ -5.442
+ ],
+ [
+ -0.632,
+ -2.575
+ ],
+ [
+ -4.275,
+ 3.657
+ ],
+ [
+ 1.527,
+ 6.314
+ ]
+ ],
+ "o": [
+ [
+ -2.623,
+ -10.848
+ ],
+ [
+ -3.056,
+ -12.63
+ ],
+ [
+ -2.614,
+ -10.81
+ ],
+ [
+ -2.886,
+ -11.924
+ ],
+ [
+ -3.41,
+ -14.078
+ ],
+ [
+ -2.446,
+ -10.105
+ ],
+ [
+ -2.11,
+ -8.664
+ ],
+ [
+ -5.118,
+ -7.738
+ ],
+ [
+ -7.008,
+ -5.122
+ ],
+ [
+ -4.575,
+ -1.424
+ ],
+ [
+ -1.784,
+ -0.213
+ ],
+ [
+ -0.427,
+ -0.167
+ ],
+ [
+ -0.302,
+ 0.006
+ ],
+ [
+ -0.34,
+ -0.041
+ ],
+ [
+ -1.302,
+ 0.026
+ ],
+ [
+ -0.312,
+ 0.235
+ ],
+ [
+ -0.359,
+ 0.007
+ ],
+ [
+ -0.422,
+ 0.009
+ ],
+ [
+ -5.276,
+ 0.165
+ ],
+ [
+ -5.005,
+ 1.468
+ ],
+ [
+ -6.083,
+ 3.295
+ ],
+ [
+ -7.344,
+ 6.859
+ ],
+ [
+ -3.501,
+ 7.461
+ ],
+ [
+ -0.137,
+ 1.291
+ ],
+ [
+ 0.007,
+ 0.347
+ ],
+ [
+ -0.031,
+ 0.271
+ ],
+ [
+ 0.07,
+ 3.446
+ ],
+ [
+ 0.291,
+ 0.427
+ ],
+ [
+ 0.322,
+ 4.601
+ ],
+ [
+ 3.051,
+ 12.633
+ ],
+ [
+ 2.635,
+ 10.886
+ ],
+ [
+ 2.959,
+ 12.222
+ ],
+ [
+ 3.308,
+ 13.671
+ ],
+ [
+ 3.461,
+ 14.304
+ ],
+ [
+ 3.137,
+ 12.966
+ ],
+ [
+ 3.056,
+ 12.632
+ ],
+ [
+ 2.786,
+ 11.518
+ ],
+ [
+ 1.088,
+ 4.497
+ ],
+ [
+ 4.787,
+ -1.826
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.85,
+ -3.517
+ ],
+ [
+ -1.152,
+ -4.776
+ ],
+ [
+ -0.761,
+ -3.147
+ ],
+ [
+ -1.314,
+ -5.443
+ ],
+ [
+ -1.02,
+ -4.221
+ ],
+ [
+ -1.175,
+ -4.848
+ ],
+ [
+ -0.84,
+ -3.481
+ ],
+ [
+ -1.15,
+ -4.775
+ ],
+ [
+ -0.924,
+ -3.813
+ ],
+ [
+ -1.176,
+ -4.849
+ ],
+ [
+ -0.84,
+ -3.481
+ ],
+ [
+ -1.15,
+ -4.776
+ ],
+ [
+ -0.924,
+ -3.812
+ ],
+ [
+ -1.154,
+ -4.776
+ ],
+ [
+ -1.02,
+ -4.222
+ ],
+ [
+ -1.176,
+ -4.849
+ ],
+ [
+ -0.84,
+ -3.481
+ ],
+ [
+ -1.151,
+ -4.775
+ ],
+ [
+ -0.924,
+ -3.813
+ ],
+ [
+ -1.175,
+ -4.849
+ ],
+ [
+ -0.841,
+ -3.481
+ ],
+ [
+ -1.152,
+ -4.776
+ ],
+ [
+ -0.762,
+ -3.147
+ ],
+ [
+ -1.4,
+ -5.814
+ ],
+ [
+ -1.221,
+ -5.184
+ ],
+ [
+ -0.197,
+ -1.936
+ ],
+ [
+ -0.041,
+ -0.181
+ ],
+ [
+ 0.265,
+ -1.021
+ ],
+ [
+ 0.009,
+ -0.421
+ ],
+ [
+ 0.338,
+ -2.718
+ ],
+ [
+ 0.911,
+ -4.753
+ ],
+ [
+ 0.948,
+ -2.131
+ ],
+ [
+ 1.924,
+ -3.218
+ ],
+ [
+ 2.088,
+ -2.334
+ ],
+ [
+ 3.168,
+ -2.671
+ ],
+ [
+ 3.467,
+ -1.959
+ ],
+ [
+ 4.328,
+ -1.427
+ ],
+ [
+ 2.296,
+ -0.196
+ ],
+ [
+ 2.468,
+ 0.177
+ ],
+ [
+ 2.845,
+ 0.367
+ ],
+ [
+ 4.542,
+ 1.268
+ ],
+ [
+ 4.358,
+ 2.353
+ ],
+ [
+ 2.198,
+ 1.907
+ ],
+ [
+ 3.356,
+ 4.041
+ ],
+ [
+ 0.967,
+ 2.035
+ ],
+ [
+ 0.865,
+ 2.565
+ ],
+ [
+ 1.172,
+ 4.928
+ ],
+ [
+ 1.695,
+ 6.996
+ ],
+ [
+ 1.611,
+ 6.703
+ ],
+ [
+ 1.275,
+ 5.216
+ ],
+ [
+ 1.37,
+ 5.821
+ ],
+ [
+ 1.766,
+ 7.293
+ ],
+ [
+ 1.246,
+ 5.146
+ ],
+ [
+ 1.422,
+ 5.886
+ ],
+ [
+ 1.758,
+ 7.256
+ ],
+ [
+ 0.874,
+ 3.589
+ ],
+ [
+ 1.177,
+ 4.848
+ ],
+ [
+ 0.831,
+ 3.443
+ ],
+ [
+ 1.18,
+ 4.888
+ ],
+ [
+ 0.905,
+ 3.74
+ ],
+ [
+ 1.336,
+ 5.516
+ ],
+ [
+ 0.841,
+ 3.48
+ ],
+ [
+ 1.31,
+ 5.444
+ ],
+ [
+ 0.622,
+ 2.578
+ ],
+ [
+ 4.404,
+ -3.506
+ ],
+ [
+ -1.53,
+ -6.314
+ ],
+ [
+ -3.468,
+ -14.339
+ ]
+ ],
+ "v": [
+ [
+ 94.541,
+ 62.721
+ ],
+ [
+ 86.66,
+ 30.181
+ ],
+ [
+ 77.497,
+ -7.711
+ ],
+ [
+ 69.651,
+ -40.142
+ ],
+ [
+ 60.984,
+ -75.913
+ ],
+ [
+ 50.757,
+ -118.147
+ ],
+ [
+ 43.421,
+ -148.46
+ ],
+ [
+ 32.895,
+ -172.633
+ ],
+ [
+ 14,
+ -192.488
+ ],
+ [
+ -8.93,
+ -204.091
+ ],
+ [
+ -22.93,
+ -207.073
+ ],
+ [
+ -28.302,
+ -207.543
+ ],
+ [
+ -29.603,
+ -207.603
+ ],
+ [
+ -30.512,
+ -207.585
+ ],
+ [
+ -31.534,
+ -207.682
+ ],
+ [
+ -35.438,
+ -207.603
+ ],
+ [
+ -36.45,
+ -207.465
+ ],
+ [
+ -37.524,
+ -207.443
+ ],
+ [
+ -38.79,
+ -207.418
+ ],
+ [
+ -54.209,
+ -204.64
+ ],
+ [
+ -68.627,
+ -198.731
+ ],
+ [
+ -85.347,
+ -186.711
+ ],
+ [
+ -102.634,
+ -162.767
+ ],
+ [
+ -109.304,
+ -139.245
+ ],
+ [
+ -109.441,
+ -135.358
+ ],
+ [
+ -109.42,
+ -134.319
+ ],
+ [
+ -109.522,
+ -133.505
+ ],
+ [
+ -109.313,
+ -123.17
+ ],
+ [
+ -109.095,
+ -121.785
+ ],
+ [
+ -106.585,
+ -108.271
+ ],
+ [
+ -97.425,
+ -70.375
+ ],
+ [
+ -89.508,
+ -37.722
+ ],
+ [
+ -80.645,
+ -1.051
+ ],
+ [
+ -70.714,
+ 39.962
+ ],
+ [
+ -60.337,
+ 82.874
+ ],
+ [
+ -50.922,
+ 121.771
+ ],
+ [
+ -41.763,
+ 159.667
+ ],
+ [
+ -33.397,
+ 194.218
+ ],
+ [
+ -30.13,
+ 207.71
+ ],
+ [
+ -15.883,
+ 202.005
+ ],
+ [
+ -16.053,
+ 201.296
+ ],
+ [
+ -18.618,
+ 190.746
+ ],
+ [
+ -22.061,
+ 176.415
+ ],
+ [
+ -24.378,
+ 166.981
+ ],
+ [
+ -28.298,
+ 150.649
+ ],
+ [
+ -31.391,
+ 137.993
+ ],
+ [
+ -34.896,
+ 123.443
+ ],
+ [
+ -37.427,
+ 113.002
+ ],
+ [
+ -40.872,
+ 98.672
+ ],
+ [
+ -43.676,
+ 87.24
+ ],
+ [
+ -47.181,
+ 72.688
+ ],
+ [
+ -49.712,
+ 62.248
+ ],
+ [
+ -53.156,
+ 47.917
+ ],
+ [
+ -55.96,
+ 36.486
+ ],
+ [
+ -59.394,
+ 22.152
+ ],
+ [
+ -62.484,
+ 9.496
+ ],
+ [
+ -65.99,
+ -5.055
+ ],
+ [
+ -68.52,
+ -15.496
+ ],
+ [
+ -71.968,
+ -29.825
+ ],
+ [
+ -74.77,
+ -41.258
+ ],
+ [
+ -78.274,
+ -55.81
+ ],
+ [
+ -80.804,
+ -66.25
+ ],
+ [
+ -84.252,
+ -80.58
+ ],
+ [
+ -86.564,
+ -90.015
+ ],
+ [
+ -90.731,
+ -107.463
+ ],
+ [
+ -93.99,
+ -123.106
+ ],
+ [
+ -94.475,
+ -128.915
+ ],
+ [
+ -94.474,
+ -129.485
+ ],
+ [
+ -94.343,
+ -132.57
+ ],
+ [
+ -94.337,
+ -133.832
+ ],
+ [
+ -93.208,
+ -141.97
+ ],
+ [
+ -88.847,
+ -155.684
+ ],
+ [
+ -85.59,
+ -161.868
+ ],
+ [
+ -79.034,
+ -170.954
+ ],
+ [
+ -72.344,
+ -177.55
+ ],
+ [
+ -62.192,
+ -184.587
+ ],
+ [
+ -51.275,
+ -189.315
+ ],
+ [
+ -37.996,
+ -192.087
+ ],
+ [
+ -31.037,
+ -192.38
+ ],
+ [
+ -23.638,
+ -191.803
+ ],
+ [
+ -15.248,
+ -190.091
+ ],
+ [
+ -2.213,
+ -184.8
+ ],
+ [
+ 9.863,
+ -176.345
+ ],
+ [
+ 15.896,
+ -170.071
+ ],
+ [
+ 24.382,
+ -156.905
+ ],
+ [
+ 26.952,
+ -150.658
+ ],
+ [
+ 29.147,
+ -142.843
+ ],
+ [
+ 32.758,
+ -128.081
+ ],
+ [
+ 37.815,
+ -107.085
+ ],
+ [
+ 42.643,
+ -86.974
+ ],
+ [
+ 46.438,
+ -71.317
+ ],
+ [
+ 50.647,
+ -53.878
+ ],
+ [
+ 55.951,
+ -32
+ ],
+ [
+ 59.682,
+ -16.561
+ ],
+ [
+ 63.955,
+ 1.097
+ ],
+ [
+ 69.235,
+ 22.863
+ ],
+ [
+ 71.886,
+ 33.625
+ ],
+ [
+ 75.393,
+ 48.176
+ ],
+ [
+ 77.899,
+ 58.503
+ ],
+ [
+ 81.43,
+ 73.167
+ ],
+ [
+ 84.172,
+ 84.379
+ ],
+ [
+ 88.164,
+ 100.929
+ ],
+ [
+ 90.696,
+ 111.368
+ ],
+ [
+ 94.614,
+ 127.701
+ ],
+ [
+ 96.502,
+ 135.427
+ ],
+ [
+ 109.522,
+ 124.682
+ ],
+ [
+ 104.935,
+ 105.742
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 109.772,
+ 207.96
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": "mouth_smile",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 500.75,
+ 815.75,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 0.5,
+ -0.61,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": [
+ {
+ "i": {
+ "x": 0,
+ "y": 1
+ },
+ "o": {
+ "x": 1,
+ "y": 0
+ },
+ "n": "0_1_1_0",
+ "t": 32,
+ "s": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0,
+ "y": 1
+ },
+ "o": {
+ "x": 0.333,
+ "y": 0
+ },
+ "n": "0_1_0p333_0",
+ "t": 37,
+ "s": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 0.333,
+ "y": 0
+ },
+ "n": "0p667_1_0p333_0",
+ "t": 44,
+ "s": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 1,
+ "y": 0
+ },
+ "n": "0p667_1_1_0",
+ "t": 48,
+ "s": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0,
+ "y": 1
+ },
+ "o": {
+ "x": 1,
+ "y": 0
+ },
+ "n": "0_1_1_0",
+ "t": 55,
+ "s": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 1,
+ "y": 1
+ },
+ "o": {
+ "x": 0.333,
+ "y": 0
+ },
+ "n": "1_1_0p333_0",
+ "t": 58,
+ "s": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.029,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.006,
+ 0.092
+ ],
+ [
+ 0.309,
+ 1.052
+ ],
+ [
+ 1.481,
+ 1.723
+ ],
+ [
+ 2.317,
+ 1.383
+ ],
+ [
+ 3.239,
+ 1.036
+ ],
+ [
+ 3.292,
+ 0.506
+ ],
+ [
+ 2.153,
+ 0.201
+ ],
+ [
+ 2.136,
+ 0.122
+ ],
+ [
+ 0.103,
+ 0.015
+ ],
+ [
+ 1.312,
+ 0
+ ],
+ [
+ 0.081,
+ -0.004
+ ],
+ [
+ 1.65,
+ -0.137
+ ],
+ [
+ 1.981,
+ -0.3
+ ],
+ [
+ 2.195,
+ -0.467
+ ],
+ [
+ 2.604,
+ -0.994
+ ],
+ [
+ 2.772,
+ -1.98
+ ],
+ [
+ 1.571,
+ -2.298
+ ],
+ [
+ 0.357,
+ -2.511
+ ],
+ [
+ 0.054,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.006,
+ -0.122
+ ],
+ [
+ -0.059,
+ -0.954
+ ],
+ [
+ -0.503,
+ -2.696
+ ],
+ [
+ -2.737,
+ -5.385
+ ],
+ [
+ -4.891,
+ -4.304
+ ],
+ [
+ -6.259,
+ -1.491
+ ],
+ [
+ -1.952,
+ -0.129
+ ],
+ [
+ -0.393,
+ -0.035
+ ],
+ [
+ -0.835,
+ 0
+ ],
+ [
+ -0.111,
+ 0.005
+ ],
+ [
+ -2.274,
+ 0.546
+ ],
+ [
+ -2.646,
+ 1.347
+ ],
+ [
+ -3.927,
+ 4.45
+ ],
+ [
+ -2.219,
+ 4.434
+ ],
+ [
+ -1.071,
+ 6.947
+ ],
+ [
+ -0.109,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.015,
+ -0.091
+ ],
+ [
+ -0.069,
+ -1.121
+ ],
+ [
+ -0.71,
+ -2.417
+ ],
+ [
+ -1.898,
+ -2.208
+ ],
+ [
+ -3.029,
+ -1.807
+ ],
+ [
+ -3.216,
+ -1.029
+ ],
+ [
+ -2.144,
+ -0.33
+ ],
+ [
+ -2.132,
+ -0.199
+ ],
+ [
+ -0.103,
+ -0.006
+ ],
+ [
+ -1.312,
+ 0
+ ],
+ [
+ -0.08,
+ 0.014
+ ],
+ [
+ -1.653,
+ 0.082
+ ],
+ [
+ -1.992,
+ 0.166
+ ],
+ [
+ -2.209,
+ 0.335
+ ],
+ [
+ -2.681,
+ 0.571
+ ],
+ [
+ -3.037,
+ 1.159
+ ],
+ [
+ -2.072,
+ 1.48
+ ],
+ [
+ -1.305,
+ 1.909
+ ],
+ [
+ -0.067,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.013,
+ 0.121
+ ],
+ [
+ 0.047,
+ 0.955
+ ],
+ [
+ 0.171,
+ 2.763
+ ],
+ [
+ 1.165,
+ 6.242
+ ],
+ [
+ 3.229,
+ 6.352
+ ],
+ [
+ 5.237,
+ 4.608
+ ],
+ [
+ 1.921,
+ 0.458
+ ],
+ [
+ 0.393,
+ 0.026
+ ],
+ [
+ 0.835,
+ 0
+ ],
+ [
+ 0.11,
+ -0.017
+ ],
+ [
+ 2.311,
+ -0.113
+ ],
+ [
+ 2.803,
+ -0.672
+ ],
+ [
+ 4.881,
+ -2.485
+ ],
+ [
+ 3.086,
+ -3.497
+ ],
+ [
+ 2.989,
+ -5.97
+ ],
+ [
+ 0.383,
+ -2.486
+ ],
+ [
+ 0.024,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -60.519,
+ -43.354
+ ],
+ [
+ -60.519,
+ -45.744
+ ],
+ [
+ -60.563,
+ -46.019
+ ],
+ [
+ -61.134,
+ -49.279
+ ],
+ [
+ -64.529,
+ -55.398
+ ],
+ [
+ -70.927,
+ -60.643
+ ],
+ [
+ -80.361,
+ -64.804
+ ],
+ [
+ -90.121,
+ -67.138
+ ],
+ [
+ -96.566,
+ -67.967
+ ],
+ [
+ -102.974,
+ -68.346
+ ],
+ [
+ -103.282,
+ -68.39
+ ],
+ [
+ -107.218,
+ -68.39
+ ],
+ [
+ -107.459,
+ -68.349
+ ],
+ [
+ -112.417,
+ -68.095
+ ],
+ [
+ -118.384,
+ -67.445
+ ],
+ [
+ -124.989,
+ -66.212
+ ],
+ [
+ -132.914,
+ -63.828
+ ],
+ [
+ -141.676,
+ -59.264
+ ],
+ [
+ -147.235,
+ -53.749
+ ],
+ [
+ -149.818,
+ -47.173
+ ],
+ [
+ -149.981,
+ -45.744
+ ],
+ [
+ -149.981,
+ -43.354
+ ],
+ [
+ -149.942,
+ -42.992
+ ],
+ [
+ -149.804,
+ -40.125
+ ],
+ [
+ -148.776,
+ -31.94
+ ],
+ [
+ -142.922,
+ -14.495
+ ],
+ [
+ -130.742,
+ 1.498
+ ],
+ [
+ -113.492,
+ 10.635
+ ],
+ [
+ -107.682,
+ 11.506
+ ],
+ [
+ -106.502,
+ 11.61
+ ],
+ [
+ -103.997,
+ 11.61
+ ],
+ [
+ -103.667,
+ 11.56
+ ],
+ [
+ -96.789,
+ 10.584
+ ],
+ [
+ -88.614,
+ 7.549
+ ],
+ [
+ -75.404,
+ -2.862
+ ],
+ [
+ -67.444,
+ -14.757
+ ],
+ [
+ -61.35,
+ -34.133
+ ],
+ [
+ -60.605,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 1,
+ "y": 1
+ },
+ "o": {
+ "x": 0,
+ "y": 0
+ },
+ "n": "1_1_0_0",
+ "t": 65,
+ "s": [
+ {
+ "i": [
+ [
+ -0.029,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.006,
+ 0.092
+ ],
+ [
+ 0.309,
+ 1.052
+ ],
+ [
+ 1.481,
+ 1.723
+ ],
+ [
+ 2.317,
+ 1.383
+ ],
+ [
+ 3.239,
+ 1.036
+ ],
+ [
+ 3.292,
+ 0.506
+ ],
+ [
+ 2.153,
+ 0.201
+ ],
+ [
+ 2.136,
+ 0.122
+ ],
+ [
+ 0.103,
+ 0.015
+ ],
+ [
+ 1.312,
+ 0
+ ],
+ [
+ 0.081,
+ -0.004
+ ],
+ [
+ 1.65,
+ -0.137
+ ],
+ [
+ 1.981,
+ -0.3
+ ],
+ [
+ 2.195,
+ -0.467
+ ],
+ [
+ 2.604,
+ -0.994
+ ],
+ [
+ 2.772,
+ -1.98
+ ],
+ [
+ 1.571,
+ -2.298
+ ],
+ [
+ 0.357,
+ -2.511
+ ],
+ [
+ 0.054,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.006,
+ -0.122
+ ],
+ [
+ -0.059,
+ -0.954
+ ],
+ [
+ -0.503,
+ -2.696
+ ],
+ [
+ -2.737,
+ -5.385
+ ],
+ [
+ -4.891,
+ -4.304
+ ],
+ [
+ -6.259,
+ -1.491
+ ],
+ [
+ -1.952,
+ -0.129
+ ],
+ [
+ -0.393,
+ -0.035
+ ],
+ [
+ -0.835,
+ 0
+ ],
+ [
+ -0.111,
+ 0.005
+ ],
+ [
+ -2.274,
+ 0.546
+ ],
+ [
+ -2.646,
+ 1.347
+ ],
+ [
+ -3.927,
+ 4.45
+ ],
+ [
+ -2.219,
+ 4.434
+ ],
+ [
+ -1.071,
+ 6.947
+ ],
+ [
+ -0.109,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.015,
+ -0.091
+ ],
+ [
+ -0.069,
+ -1.121
+ ],
+ [
+ -0.71,
+ -2.417
+ ],
+ [
+ -1.898,
+ -2.208
+ ],
+ [
+ -3.029,
+ -1.807
+ ],
+ [
+ -3.216,
+ -1.029
+ ],
+ [
+ -2.144,
+ -0.33
+ ],
+ [
+ -2.132,
+ -0.199
+ ],
+ [
+ -0.103,
+ -0.006
+ ],
+ [
+ -1.312,
+ 0
+ ],
+ [
+ -0.08,
+ 0.014
+ ],
+ [
+ -1.653,
+ 0.082
+ ],
+ [
+ -1.992,
+ 0.166
+ ],
+ [
+ -2.209,
+ 0.335
+ ],
+ [
+ -2.681,
+ 0.571
+ ],
+ [
+ -3.037,
+ 1.159
+ ],
+ [
+ -2.072,
+ 1.48
+ ],
+ [
+ -1.305,
+ 1.909
+ ],
+ [
+ -0.067,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.013,
+ 0.121
+ ],
+ [
+ 0.047,
+ 0.955
+ ],
+ [
+ 0.171,
+ 2.763
+ ],
+ [
+ 1.165,
+ 6.242
+ ],
+ [
+ 3.229,
+ 6.352
+ ],
+ [
+ 5.237,
+ 4.608
+ ],
+ [
+ 1.921,
+ 0.458
+ ],
+ [
+ 0.393,
+ 0.026
+ ],
+ [
+ 0.835,
+ 0
+ ],
+ [
+ 0.11,
+ -0.017
+ ],
+ [
+ 2.311,
+ -0.113
+ ],
+ [
+ 2.803,
+ -0.672
+ ],
+ [
+ 4.881,
+ -2.485
+ ],
+ [
+ 3.086,
+ -3.497
+ ],
+ [
+ 2.989,
+ -5.97
+ ],
+ [
+ 0.383,
+ -2.486
+ ],
+ [
+ 0.024,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -60.519,
+ -43.354
+ ],
+ [
+ -60.519,
+ -45.744
+ ],
+ [
+ -60.563,
+ -46.019
+ ],
+ [
+ -61.134,
+ -49.279
+ ],
+ [
+ -64.529,
+ -55.398
+ ],
+ [
+ -70.927,
+ -60.643
+ ],
+ [
+ -80.361,
+ -64.804
+ ],
+ [
+ -90.121,
+ -67.138
+ ],
+ [
+ -96.566,
+ -67.967
+ ],
+ [
+ -102.974,
+ -68.346
+ ],
+ [
+ -103.282,
+ -68.39
+ ],
+ [
+ -107.218,
+ -68.39
+ ],
+ [
+ -107.459,
+ -68.349
+ ],
+ [
+ -112.417,
+ -68.095
+ ],
+ [
+ -118.384,
+ -67.445
+ ],
+ [
+ -124.989,
+ -66.212
+ ],
+ [
+ -132.914,
+ -63.828
+ ],
+ [
+ -141.676,
+ -59.264
+ ],
+ [
+ -147.235,
+ -53.749
+ ],
+ [
+ -149.818,
+ -47.173
+ ],
+ [
+ -149.981,
+ -45.744
+ ],
+ [
+ -149.981,
+ -43.354
+ ],
+ [
+ -149.942,
+ -42.992
+ ],
+ [
+ -149.804,
+ -40.125
+ ],
+ [
+ -148.776,
+ -31.94
+ ],
+ [
+ -142.922,
+ -14.495
+ ],
+ [
+ -130.742,
+ 1.498
+ ],
+ [
+ -113.492,
+ 10.635
+ ],
+ [
+ -107.682,
+ 11.506
+ ],
+ [
+ -106.502,
+ 11.61
+ ],
+ [
+ -103.997,
+ 11.61
+ ],
+ [
+ -103.667,
+ 11.56
+ ],
+ [
+ -96.789,
+ 10.584
+ ],
+ [
+ -88.614,
+ 7.549
+ ],
+ [
+ -75.404,
+ -2.862
+ ],
+ [
+ -67.444,
+ -14.757
+ ],
+ [
+ -61.35,
+ -34.133
+ ],
+ [
+ -60.605,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.029,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.006,
+ 0.092
+ ],
+ [
+ 0.309,
+ 1.052
+ ],
+ [
+ 1.481,
+ 1.723
+ ],
+ [
+ 2.317,
+ 1.383
+ ],
+ [
+ 3.239,
+ 1.036
+ ],
+ [
+ 3.292,
+ 0.506
+ ],
+ [
+ 2.153,
+ 0.201
+ ],
+ [
+ 2.136,
+ 0.122
+ ],
+ [
+ 0.103,
+ 0.015
+ ],
+ [
+ 1.312,
+ 0
+ ],
+ [
+ 0.081,
+ -0.004
+ ],
+ [
+ 1.65,
+ -0.137
+ ],
+ [
+ 1.981,
+ -0.3
+ ],
+ [
+ 2.195,
+ -0.467
+ ],
+ [
+ 2.604,
+ -0.994
+ ],
+ [
+ 2.772,
+ -1.98
+ ],
+ [
+ 1.571,
+ -2.298
+ ],
+ [
+ 0.357,
+ -2.511
+ ],
+ [
+ 0.054,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.006,
+ -0.122
+ ],
+ [
+ -0.059,
+ -0.954
+ ],
+ [
+ -0.503,
+ -2.696
+ ],
+ [
+ -2.737,
+ -5.385
+ ],
+ [
+ -4.891,
+ -4.304
+ ],
+ [
+ -6.259,
+ -1.491
+ ],
+ [
+ -1.952,
+ -0.129
+ ],
+ [
+ -0.393,
+ -0.035
+ ],
+ [
+ -0.835,
+ 0
+ ],
+ [
+ -0.111,
+ 0.005
+ ],
+ [
+ -2.274,
+ 0.546
+ ],
+ [
+ -2.646,
+ 1.347
+ ],
+ [
+ -3.927,
+ 4.45
+ ],
+ [
+ -2.219,
+ 4.434
+ ],
+ [
+ -1.071,
+ 6.947
+ ],
+ [
+ -0.109,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.015,
+ -0.091
+ ],
+ [
+ -0.069,
+ -1.121
+ ],
+ [
+ -0.71,
+ -2.417
+ ],
+ [
+ -1.898,
+ -2.208
+ ],
+ [
+ -3.029,
+ -1.807
+ ],
+ [
+ -3.216,
+ -1.029
+ ],
+ [
+ -2.144,
+ -0.33
+ ],
+ [
+ -2.132,
+ -0.199
+ ],
+ [
+ -0.103,
+ -0.006
+ ],
+ [
+ -1.312,
+ 0
+ ],
+ [
+ -0.08,
+ 0.014
+ ],
+ [
+ -1.653,
+ 0.082
+ ],
+ [
+ -1.992,
+ 0.166
+ ],
+ [
+ -2.209,
+ 0.335
+ ],
+ [
+ -2.681,
+ 0.571
+ ],
+ [
+ -3.037,
+ 1.159
+ ],
+ [
+ -2.072,
+ 1.48
+ ],
+ [
+ -1.305,
+ 1.909
+ ],
+ [
+ -0.067,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.013,
+ 0.121
+ ],
+ [
+ 0.047,
+ 0.955
+ ],
+ [
+ 0.171,
+ 2.763
+ ],
+ [
+ 1.165,
+ 6.242
+ ],
+ [
+ 3.229,
+ 6.352
+ ],
+ [
+ 5.237,
+ 4.608
+ ],
+ [
+ 1.921,
+ 0.458
+ ],
+ [
+ 0.393,
+ 0.026
+ ],
+ [
+ 0.835,
+ 0
+ ],
+ [
+ 0.11,
+ -0.017
+ ],
+ [
+ 2.311,
+ -0.113
+ ],
+ [
+ 2.803,
+ -0.672
+ ],
+ [
+ 4.881,
+ -2.485
+ ],
+ [
+ 3.086,
+ -3.497
+ ],
+ [
+ 2.989,
+ -5.97
+ ],
+ [
+ 0.383,
+ -2.486
+ ],
+ [
+ 0.024,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -60.519,
+ -43.354
+ ],
+ [
+ -60.519,
+ -45.744
+ ],
+ [
+ -60.563,
+ -46.019
+ ],
+ [
+ -61.134,
+ -49.279
+ ],
+ [
+ -64.529,
+ -55.398
+ ],
+ [
+ -70.927,
+ -60.643
+ ],
+ [
+ -80.361,
+ -64.804
+ ],
+ [
+ -90.121,
+ -67.138
+ ],
+ [
+ -96.566,
+ -67.967
+ ],
+ [
+ -102.974,
+ -68.346
+ ],
+ [
+ -103.282,
+ -68.39
+ ],
+ [
+ -107.218,
+ -68.39
+ ],
+ [
+ -107.459,
+ -68.349
+ ],
+ [
+ -112.417,
+ -68.095
+ ],
+ [
+ -118.384,
+ -67.445
+ ],
+ [
+ -124.989,
+ -66.212
+ ],
+ [
+ -132.914,
+ -63.828
+ ],
+ [
+ -141.676,
+ -59.264
+ ],
+ [
+ -147.235,
+ -53.749
+ ],
+ [
+ -149.818,
+ -47.173
+ ],
+ [
+ -149.981,
+ -45.744
+ ],
+ [
+ -149.981,
+ -43.354
+ ],
+ [
+ -149.942,
+ -42.992
+ ],
+ [
+ -149.804,
+ -40.125
+ ],
+ [
+ -148.776,
+ -31.94
+ ],
+ [
+ -142.922,
+ -14.495
+ ],
+ [
+ -130.742,
+ 1.498
+ ],
+ [
+ -113.492,
+ 10.635
+ ],
+ [
+ -107.682,
+ 11.506
+ ],
+ [
+ -106.502,
+ 11.61
+ ],
+ [
+ -103.997,
+ 11.61
+ ],
+ [
+ -103.667,
+ 11.56
+ ],
+ [
+ -96.789,
+ 10.584
+ ],
+ [
+ -88.614,
+ 7.549
+ ],
+ [
+ -75.404,
+ -2.862
+ ],
+ [
+ -67.444,
+ -14.757
+ ],
+ [
+ -61.35,
+ -34.133
+ ],
+ [
+ -60.605,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0,
+ "y": 1
+ },
+ "o": {
+ "x": 0,
+ "y": 0
+ },
+ "n": "0_1_0_0",
+ "t": 68.25,
+ "s": [
+ {
+ "i": [
+ [
+ -0.029,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.006,
+ 0.092
+ ],
+ [
+ 0.309,
+ 1.052
+ ],
+ [
+ 1.481,
+ 1.723
+ ],
+ [
+ 2.317,
+ 1.383
+ ],
+ [
+ 3.239,
+ 1.036
+ ],
+ [
+ 3.292,
+ 0.506
+ ],
+ [
+ 2.153,
+ 0.201
+ ],
+ [
+ 2.136,
+ 0.122
+ ],
+ [
+ 0.103,
+ 0.015
+ ],
+ [
+ 1.312,
+ 0
+ ],
+ [
+ 0.081,
+ -0.004
+ ],
+ [
+ 1.65,
+ -0.137
+ ],
+ [
+ 1.981,
+ -0.3
+ ],
+ [
+ 2.195,
+ -0.467
+ ],
+ [
+ 2.604,
+ -0.994
+ ],
+ [
+ 2.772,
+ -1.98
+ ],
+ [
+ 1.571,
+ -2.298
+ ],
+ [
+ 0.357,
+ -2.511
+ ],
+ [
+ 0.054,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.006,
+ -0.122
+ ],
+ [
+ -0.059,
+ -0.954
+ ],
+ [
+ -0.503,
+ -2.696
+ ],
+ [
+ -2.737,
+ -5.385
+ ],
+ [
+ -4.891,
+ -4.304
+ ],
+ [
+ -6.259,
+ -1.491
+ ],
+ [
+ -1.952,
+ -0.129
+ ],
+ [
+ -0.393,
+ -0.035
+ ],
+ [
+ -0.835,
+ 0
+ ],
+ [
+ -0.111,
+ 0.005
+ ],
+ [
+ -2.274,
+ 0.546
+ ],
+ [
+ -2.646,
+ 1.347
+ ],
+ [
+ -3.927,
+ 4.45
+ ],
+ [
+ -2.219,
+ 4.434
+ ],
+ [
+ -1.071,
+ 6.947
+ ],
+ [
+ -0.109,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.015,
+ -0.091
+ ],
+ [
+ -0.069,
+ -1.121
+ ],
+ [
+ -0.71,
+ -2.417
+ ],
+ [
+ -1.898,
+ -2.208
+ ],
+ [
+ -3.029,
+ -1.807
+ ],
+ [
+ -3.216,
+ -1.029
+ ],
+ [
+ -2.144,
+ -0.33
+ ],
+ [
+ -2.132,
+ -0.199
+ ],
+ [
+ -0.103,
+ -0.006
+ ],
+ [
+ -1.312,
+ 0
+ ],
+ [
+ -0.08,
+ 0.014
+ ],
+ [
+ -1.653,
+ 0.082
+ ],
+ [
+ -1.992,
+ 0.166
+ ],
+ [
+ -2.209,
+ 0.335
+ ],
+ [
+ -2.681,
+ 0.571
+ ],
+ [
+ -3.037,
+ 1.159
+ ],
+ [
+ -2.072,
+ 1.48
+ ],
+ [
+ -1.305,
+ 1.909
+ ],
+ [
+ -0.067,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.013,
+ 0.121
+ ],
+ [
+ 0.047,
+ 0.955
+ ],
+ [
+ 0.171,
+ 2.763
+ ],
+ [
+ 1.165,
+ 6.242
+ ],
+ [
+ 3.229,
+ 6.352
+ ],
+ [
+ 5.237,
+ 4.608
+ ],
+ [
+ 1.921,
+ 0.458
+ ],
+ [
+ 0.393,
+ 0.026
+ ],
+ [
+ 0.835,
+ 0
+ ],
+ [
+ 0.11,
+ -0.017
+ ],
+ [
+ 2.311,
+ -0.113
+ ],
+ [
+ 2.803,
+ -0.672
+ ],
+ [
+ 4.881,
+ -2.485
+ ],
+ [
+ 3.086,
+ -3.497
+ ],
+ [
+ 2.989,
+ -5.97
+ ],
+ [
+ 0.383,
+ -2.486
+ ],
+ [
+ 0.024,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -60.519,
+ -43.354
+ ],
+ [
+ -60.519,
+ -45.744
+ ],
+ [
+ -60.563,
+ -46.019
+ ],
+ [
+ -61.134,
+ -49.279
+ ],
+ [
+ -64.529,
+ -55.398
+ ],
+ [
+ -70.927,
+ -60.643
+ ],
+ [
+ -80.361,
+ -64.804
+ ],
+ [
+ -90.121,
+ -67.138
+ ],
+ [
+ -96.566,
+ -67.967
+ ],
+ [
+ -102.974,
+ -68.346
+ ],
+ [
+ -103.282,
+ -68.39
+ ],
+ [
+ -107.218,
+ -68.39
+ ],
+ [
+ -107.459,
+ -68.349
+ ],
+ [
+ -112.417,
+ -68.095
+ ],
+ [
+ -118.384,
+ -67.445
+ ],
+ [
+ -124.989,
+ -66.212
+ ],
+ [
+ -132.914,
+ -63.828
+ ],
+ [
+ -141.676,
+ -59.264
+ ],
+ [
+ -147.235,
+ -53.749
+ ],
+ [
+ -149.818,
+ -47.173
+ ],
+ [
+ -149.981,
+ -45.744
+ ],
+ [
+ -149.981,
+ -43.354
+ ],
+ [
+ -149.942,
+ -42.992
+ ],
+ [
+ -149.804,
+ -40.125
+ ],
+ [
+ -148.776,
+ -31.94
+ ],
+ [
+ -142.922,
+ -14.495
+ ],
+ [
+ -130.742,
+ 1.498
+ ],
+ [
+ -113.492,
+ 10.635
+ ],
+ [
+ -107.682,
+ 11.506
+ ],
+ [
+ -106.502,
+ 11.61
+ ],
+ [
+ -103.997,
+ 11.61
+ ],
+ [
+ -103.667,
+ 11.56
+ ],
+ [
+ -96.789,
+ 10.584
+ ],
+ [
+ -88.614,
+ 7.549
+ ],
+ [
+ -75.404,
+ -2.862
+ ],
+ [
+ -67.444,
+ -14.757
+ ],
+ [
+ -61.35,
+ -34.133
+ ],
+ [
+ -60.605,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "i": {
+ "x": 0.308,
+ "y": 1
+ },
+ "o": {
+ "x": 0.703,
+ "y": 0
+ },
+ "n": "0p308_1_0p703_0",
+ "t": 71.144,
+ "s": [
+ {
+ "i": [
+ [
+ -0.044,
+ 0.566
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.009,
+ 0.092
+ ],
+ [
+ 0.473,
+ 1.052
+ ],
+ [
+ 2.267,
+ 1.723
+ ],
+ [
+ 3.546,
+ 1.383
+ ],
+ [
+ 4.958,
+ 1.036
+ ],
+ [
+ 5.038,
+ 0.506
+ ],
+ [
+ 3.295,
+ 0.201
+ ],
+ [
+ 3.27,
+ 0.122
+ ],
+ [
+ 0.157,
+ 0.015
+ ],
+ [
+ 2.008,
+ 0
+ ],
+ [
+ 0.123,
+ -0.004
+ ],
+ [
+ 2.525,
+ -0.137
+ ],
+ [
+ 3.032,
+ -0.3
+ ],
+ [
+ 3.359,
+ -0.467
+ ],
+ [
+ 3.986,
+ -0.994
+ ],
+ [
+ 4.243,
+ -1.98
+ ],
+ [
+ 2.404,
+ -2.298
+ ],
+ [
+ 0.547,
+ -2.511
+ ],
+ [
+ 0.082,
+ -0.477
+ ],
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.009,
+ -0.122
+ ],
+ [
+ -0.09,
+ -0.954
+ ],
+ [
+ -0.77,
+ -2.696
+ ],
+ [
+ -4.189,
+ -5.385
+ ],
+ [
+ -7.486,
+ -4.304
+ ],
+ [
+ -9.579,
+ -1.491
+ ],
+ [
+ -2.987,
+ -0.129
+ ],
+ [
+ -0.602,
+ -0.035
+ ],
+ [
+ -1.278,
+ 0
+ ],
+ [
+ -0.169,
+ 0.005
+ ],
+ [
+ -3.481,
+ 0.546
+ ],
+ [
+ -4.049,
+ 1.347
+ ],
+ [
+ -6.01,
+ 4.45
+ ],
+ [
+ -3.397,
+ 4.433
+ ],
+ [
+ -1.64,
+ 6.947
+ ],
+ [
+ -0.167,
+ 2.53
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.797
+ ],
+ [
+ -0.023,
+ -0.091
+ ],
+ [
+ -0.106,
+ -1.121
+ ],
+ [
+ -1.087,
+ -2.417
+ ],
+ [
+ -2.906,
+ -2.208
+ ],
+ [
+ -4.636,
+ -1.808
+ ],
+ [
+ -4.922,
+ -1.029
+ ],
+ [
+ -3.281,
+ -0.33
+ ],
+ [
+ -3.263,
+ -0.199
+ ],
+ [
+ -0.158,
+ -0.006
+ ],
+ [
+ -2.008,
+ 0
+ ],
+ [
+ -0.123,
+ 0.014
+ ],
+ [
+ -2.53,
+ 0.082
+ ],
+ [
+ -3.048,
+ 0.165
+ ],
+ [
+ -3.381,
+ 0.335
+ ],
+ [
+ -4.103,
+ 0.571
+ ],
+ [
+ -4.648,
+ 1.159
+ ],
+ [
+ -3.171,
+ 1.48
+ ],
+ [
+ -1.997,
+ 1.909
+ ],
+ [
+ -0.103,
+ 0.473
+ ],
+ [
+ 0,
+ 0.797
+ ],
+ [
+ 0.02,
+ 0.121
+ ],
+ [
+ 0.072,
+ 0.955
+ ],
+ [
+ 0.261,
+ 2.763
+ ],
+ [
+ 1.783,
+ 6.242
+ ],
+ [
+ 4.941,
+ 6.352
+ ],
+ [
+ 8.015,
+ 4.608
+ ],
+ [
+ 2.94,
+ 0.458
+ ],
+ [
+ 0.602,
+ 0.026
+ ],
+ [
+ 1.278,
+ 0
+ ],
+ [
+ 0.169,
+ -0.017
+ ],
+ [
+ 3.538,
+ -0.113
+ ],
+ [
+ 4.291,
+ -0.673
+ ],
+ [
+ 7.471,
+ -2.485
+ ],
+ [
+ 4.723,
+ -3.497
+ ],
+ [
+ 4.574,
+ -5.97
+ ],
+ [
+ 0.587,
+ -2.486
+ ],
+ [
+ 0.037,
+ -0.566
+ ]
+ ],
+ "v": [
+ [
+ -36.789,
+ -43.354
+ ],
+ [
+ -36.789,
+ -45.744
+ ],
+ [
+ -36.856,
+ -46.019
+ ],
+ [
+ -37.73,
+ -49.279
+ ],
+ [
+ -42.925,
+ -55.398
+ ],
+ [
+ -52.719,
+ -60.643
+ ],
+ [
+ -67.157,
+ -64.804
+ ],
+ [
+ -82.094,
+ -67.138
+ ],
+ [
+ -91.959,
+ -67.967
+ ],
+ [
+ -101.766,
+ -68.346
+ ],
+ [
+ -102.238,
+ -68.39
+ ],
+ [
+ -108.262,
+ -68.39
+ ],
+ [
+ -108.631,
+ -68.349
+ ],
+ [
+ -116.22,
+ -68.095
+ ],
+ [
+ -125.351,
+ -67.445
+ ],
+ [
+ -135.461,
+ -66.212
+ ],
+ [
+ -147.59,
+ -63.828
+ ],
+ [
+ -161,
+ -59.264
+ ],
+ [
+ -169.508,
+ -53.749
+ ],
+ [
+ -173.463,
+ -47.173
+ ],
+ [
+ -173.711,
+ -45.744
+ ],
+ [
+ -173.711,
+ -43.354
+ ],
+ [
+ -173.652,
+ -42.991
+ ],
+ [
+ -173.44,
+ -40.125
+ ],
+ [
+ -171.868,
+ -31.94
+ ],
+ [
+ -162.909,
+ -14.495
+ ],
+ [
+ -144.266,
+ 1.498
+ ],
+ [
+ -117.864,
+ 10.635
+ ],
+ [
+ -108.971,
+ 11.506
+ ],
+ [
+ -107.167,
+ 11.61
+ ],
+ [
+ -103.333,
+ 11.61
+ ],
+ [
+ -102.827,
+ 11.56
+ ],
+ [
+ -92.3,
+ 10.584
+ ],
+ [
+ -79.789,
+ 7.549
+ ],
+ [
+ -59.57,
+ -2.862
+ ],
+ [
+ -47.388,
+ -14.757
+ ],
+ [
+ -38.06,
+ -34.133
+ ],
+ [
+ -36.92,
+ -41.656
+ ]
+ ],
+ "c": true
+ }
+ ],
+ "e": [
+ {
+ "i": [
+ [
+ -0.081,
+ 0.416
+ ],
+ [
+ 0,
+ 0.614
+ ],
+ [
+ 0.017,
+ 0.114
+ ],
+ [
+ 4.432,
+ 1.114
+ ],
+ [
+ 0.455,
+ 0.099
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.118,
+ -0.012
+ ],
+ [
+ 1.098,
+ -0.552
+ ],
+ [
+ 5.005,
+ -1.792
+ ],
+ [
+ 17.596,
+ -1.761
+ ],
+ [
+ 5.449,
+ -0.216
+ ],
+ [
+ 10.022,
+ 0.979
+ ],
+ [
+ 5.427,
+ 0.928
+ ],
+ [
+ 9.789,
+ 3.142
+ ],
+ [
+ 6.284,
+ 3.051
+ ],
+ [
+ 0.79,
+ 0.255
+ ],
+ [
+ 0.915,
+ 0.206
+ ],
+ [
+ 0.63,
+ 0
+ ],
+ [
+ 0.098,
+ -0.016
+ ],
+ [
+ 1.538,
+ -3.764
+ ],
+ [
+ 0.246,
+ -0.951
+ ],
+ [
+ 0,
+ -0.58
+ ],
+ [
+ -0.022,
+ -0.149
+ ],
+ [
+ -2.832,
+ -1.687
+ ],
+ [
+ -1.661,
+ -0.753
+ ],
+ [
+ -10.509,
+ -2.813
+ ],
+ [
+ -8.427,
+ -1.306
+ ],
+ [
+ -5.769,
+ -0.425
+ ],
+ [
+ -5.447,
+ -0.289
+ ],
+ [
+ -0.241,
+ -0.027
+ ],
+ [
+ -3.43,
+ 0
+ ],
+ [
+ -0.312,
+ 0.015
+ ],
+ [
+ -4.293,
+ 0.255
+ ],
+ [
+ -5.555,
+ 0.778
+ ],
+ [
+ -6.003,
+ 1.316
+ ],
+ [
+ -9.441,
+ 3.427
+ ],
+ [
+ -5.316,
+ 2.752
+ ],
+ [
+ -0.737,
+ 3.161
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -0.614
+ ],
+ [
+ -0.035,
+ -0.111
+ ],
+ [
+ -0.645,
+ -4.395
+ ],
+ [
+ -0.451,
+ -0.113
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.116,
+ 0.032
+ ],
+ [
+ -1.23,
+ 0.122
+ ],
+ [
+ -4.743,
+ 2.385
+ ],
+ [
+ -16.622,
+ 5.95
+ ],
+ [
+ -5.424,
+ 0.543
+ ],
+ [
+ -10.064,
+ 0.399
+ ],
+ [
+ -5.48,
+ -0.536
+ ],
+ [
+ -10.152,
+ -1.736
+ ],
+ [
+ -6.661,
+ -2.138
+ ],
+ [
+ -0.75,
+ -0.364
+ ],
+ [
+ -0.888,
+ -0.287
+ ],
+ [
+ -0.63,
+ 0
+ ],
+ [
+ -0.095,
+ 0.034
+ ],
+ [
+ -4.089,
+ 0.654
+ ],
+ [
+ -0.369,
+ 0.903
+ ],
+ [
+ 0,
+ 0.58
+ ],
+ [
+ 0.038,
+ 0.147
+ ],
+ [
+ 0.472,
+ 3.212
+ ],
+ [
+ 1.56,
+ 0.929
+ ],
+ [
+ 9.893,
+ 4.481
+ ],
+ [
+ 8.226,
+ 2.203
+ ],
+ [
+ 5.716,
+ 0.886
+ ],
+ [
+ 5.438,
+ 0.4
+ ],
+ [
+ 0.242,
+ 0.013
+ ],
+ [
+ 3.43,
+ 0
+ ],
+ [
+ 0.311,
+ -0.029
+ ],
+ [
+ 4.296,
+ -0.209
+ ],
+ [
+ 5.604,
+ -0.333
+ ],
+ [
+ 6.089,
+ -0.852
+ ],
+ [
+ 9.827,
+ -2.154
+ ],
+ [
+ 5.635,
+ -2.045
+ ],
+ [
+ 2.928,
+ -1.516
+ ],
+ [
+ 0.096,
+ -0.413
+ ]
+ ],
+ "v": [
+ [
+ -0.25,
+ -37.45
+ ],
+ [
+ -0.25,
+ -39.292
+ ],
+ [
+ -0.352,
+ -39.627
+ ],
+ [
+ -8.441,
+ -48.41
+ ],
+ [
+ -9.805,
+ -48.71
+ ],
+ [
+ -11.695,
+ -48.71
+ ],
+ [
+ -12.043,
+ -48.617
+ ],
+ [
+ -15.549,
+ -47.635
+ ],
+ [
+ -30.201,
+ -41.435
+ ],
+ [
+ -81.575,
+ -30.008
+ ],
+ [
+ -97.904,
+ -28.937
+ ],
+ [
+ -128.04,
+ -29.897
+ ],
+ [
+ -144.399,
+ -32.098
+ ],
+ [
+ -174.316,
+ -39.388
+ ],
+ [
+ -193.782,
+ -47.058
+ ],
+ [
+ -196.066,
+ -48.073
+ ],
+ [
+ -198.805,
+ -48.71
+ ],
+ [
+ -200.695,
+ -48.71
+ ],
+ [
+ -200.982,
+ -48.612
+ ],
+ [
+ -209.494,
+ -42.035
+ ],
+ [
+ -210.25,
+ -39.19
+ ],
+ [
+ -210.25,
+ -37.45
+ ],
+ [
+ -210.139,
+ -37.008
+ ],
+ [
+ -205.218,
+ -29.585
+ ],
+ [
+ -200.329,
+ -27.133
+ ],
+ [
+ -169.658,
+ -16.368
+ ],
+ [
+ -144.675,
+ -11.119
+ ],
+ [
+ -127.458,
+ -9.034
+ ],
+ [
+ -111.119,
+ -8.149
+ ],
+ [
+ -110.395,
+ -8.07
+ ],
+ [
+ -100.105,
+ -8.07
+ ],
+ [
+ -99.172,
+ -8.154
+ ],
+ [
+ -86.283,
+ -8.786
+ ],
+ [
+ -69.554,
+ -10.561
+ ],
+ [
+ -51.415,
+ -13.81
+ ],
+ [
+ -22.49,
+ -22.107
+ ],
+ [
+ -5.996,
+ -29.157
+ ],
+ [
+ -0.494,
+ -36.201
+ ]
+ ],
+ "c": true
+ }
+ ]
+ },
+ {
+ "t": 75
+ }
+ ]
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 105.25,
+ 28.39
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "nose",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 503.498,
+ 680.02,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 42.233,
+ 29.174,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -3.557,
+ 23.651
+ ],
+ [
+ -14.41,
+ -16.492
+ ],
+ [
+ 16.97,
+ -2.701
+ ]
+ ],
+ "o": [
+ [
+ 2.439,
+ -16.225
+ ],
+ [
+ 14.41,
+ 16.492
+ ],
+ [
+ -16.971,
+ 2.7
+ ]
+ ],
+ "v": [
+ [
+ -38.426,
+ -12.003
+ ],
+ [
+ 27.573,
+ -12.432
+ ],
+ [
+ -1.301,
+ 26.225
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 42.233,
+ 29.175
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 3,
+ "nm": "eye_pupil_controller",
+ "ks": {
+ "o": {
+ "k": 0
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0
+ },
+ "n": "0p833_0p833_0p167_0",
+ "t": 0,
+ "s": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "e": [
+ 459.5,
+ 527,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ -4.03295516967773,
+ -4.07727336883545,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p833_0p833_0p167_0p167",
+ "t": 4,
+ "s": [
+ 459.5,
+ 527,
+ 0
+ ],
+ "e": [
+ 481.875,
+ 531.25,
+ 0
+ ],
+ "to": [
+ 3.79166674613953,
+ 3.83333325386047,
+ 0
+ ],
+ "ti": [
+ -11.1676235198975,
+ 0.20281778275967,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p833_0p833_0p167_0p167",
+ "t": 13,
+ "s": [
+ 481.875,
+ 531.25,
+ 0
+ ],
+ "e": [
+ 506.5,
+ 524,
+ 0
+ ],
+ "to": [
+ 11.9174766540527,
+ -0.21643604338169,
+ 0
+ ],
+ "ti": [
+ -6.04166650772095,
+ 4.625,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p667_1_0p167_0p167",
+ "t": 22,
+ "s": [
+ 506.5,
+ 524,
+ 0
+ ],
+ "e": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "to": [
+ 5.39564085006714,
+ -4.13045644760132,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 0.667
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p667_0p667_0p167_0p167",
+ "t": 29,
+ "s": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "e": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 0.667
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p667_0p667_0p167_0p167",
+ "t": 59,
+ "s": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "e": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0
+ },
+ "n": "0p667_1_0p167_0",
+ "t": 60.667,
+ "s": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "e": [
+ 483.5,
+ 535,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 1
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0
+ },
+ "n": "0p667_1_0p167_0",
+ "t": 69,
+ "s": [
+ 483.5,
+ 535,
+ 0
+ ],
+ "e": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.667,
+ "y": 0.667
+ },
+ "o": {
+ "x": 0.167,
+ "y": 0.167
+ },
+ "n": "0p667_0p667_0p167_0p167",
+ "t": 71.682,
+ "s": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "e": [
+ 481,
+ 519.5,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "t": 74
+ }
+ ]
+ },
+ "a": {
+ "k": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "eye_pupil_left",
+ "parent": 6,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ -136.393,
+ 117.431,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 15.684,
+ 15.18,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 170,
+ 170,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -0.518,
+ 0.056
+ ],
+ [
+ -3.048,
+ -3.18
+ ],
+ [
+ -0.381,
+ -3.103
+ ],
+ [
+ 2.85,
+ -3.249
+ ],
+ [
+ 3.341,
+ -0.639
+ ],
+ [
+ 3.717,
+ 2.785
+ ],
+ [
+ 0.788,
+ 3.507
+ ],
+ [
+ -0.239,
+ 1.647
+ ],
+ [
+ -3.323,
+ 2.447
+ ],
+ [
+ -2.342,
+ 0.372
+ ]
+ ],
+ "o": [
+ [
+ 4.772,
+ 0.078
+ ],
+ [
+ 2.154,
+ 2.248
+ ],
+ [
+ 0.529,
+ 4.306
+ ],
+ [
+ -2.252,
+ 2.566
+ ],
+ [
+ -4.542,
+ 0.869
+ ],
+ [
+ -2.871,
+ -2.151
+ ],
+ [
+ -0.363,
+ -1.619
+ ],
+ [
+ 0.597,
+ -4.113
+ ],
+ [
+ 1.905,
+ -1.403
+ ],
+ [
+ 0.89,
+ -0.142
+ ]
+ ],
+ "v": [
+ [
+ -0.538,
+ -14.93
+ ],
+ [
+ 11.057,
+ -10.14
+ ],
+ [
+ 14.905,
+ -2.099
+ ],
+ [
+ 11.371,
+ 9.246
+ ],
+ [
+ 2.932,
+ 14.061
+ ],
+ [
+ -9.513,
+ 11.235
+ ],
+ [
+ -15.01,
+ 2.721
+ ],
+ [
+ -15.194,
+ -2.185
+ ],
+ [
+ -9.237,
+ -11.996
+ ],
+ [
+ -2.849,
+ -14.672
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 15.683,
+ 15.18
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": "eye_pupil_right",
+ "parent": 6,
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 172.459,
+ 117.431,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 15.684,
+ 15.18,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 170,
+ 170,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -0.519,
+ 0.056
+ ],
+ [
+ -3.048,
+ -3.18
+ ],
+ [
+ -0.38,
+ -3.103
+ ],
+ [
+ 2.851,
+ -3.249
+ ],
+ [
+ 3.341,
+ -0.639
+ ],
+ [
+ 3.717,
+ 2.785
+ ],
+ [
+ 0.787,
+ 3.507
+ ],
+ [
+ -0.24,
+ 1.647
+ ],
+ [
+ -3.323,
+ 2.447
+ ],
+ [
+ -2.341,
+ 0.372
+ ]
+ ],
+ "o": [
+ [
+ 4.771,
+ 0.078
+ ],
+ [
+ 2.154,
+ 2.248
+ ],
+ [
+ 0.53,
+ 4.306
+ ],
+ [
+ -2.252,
+ 2.566
+ ],
+ [
+ -4.542,
+ 0.869
+ ],
+ [
+ -2.87,
+ -2.151
+ ],
+ [
+ -0.364,
+ -1.619
+ ],
+ [
+ 0.597,
+ -4.113
+ ],
+ [
+ 1.904,
+ -1.403
+ ],
+ [
+ 0.89,
+ -0.142
+ ]
+ ],
+ "v": [
+ [
+ -0.538,
+ -14.93
+ ],
+ [
+ 11.058,
+ -10.14
+ ],
+ [
+ 14.904,
+ -2.099
+ ],
+ [
+ 11.371,
+ 9.246
+ ],
+ [
+ 2.933,
+ 14.061
+ ],
+ [
+ -9.514,
+ 11.235
+ ],
+ [
+ -15.01,
+ 2.721
+ ],
+ [
+ -15.194,
+ -2.185
+ ],
+ [
+ -9.236,
+ -11.996
+ ],
+ [
+ -2.85,
+ -14.672
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 15.684,
+ 15.18
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 9,
+ "ty": 4,
+ "nm": "eyeball_left",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 345.573,
+ 632.847,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 65.824,
+ 65.826,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 36.218,
+ 0
+ ],
+ [
+ 0,
+ -36.212
+ ],
+ [
+ -36.219,
+ 0
+ ],
+ [
+ 0,
+ 36.219
+ ]
+ ],
+ "o": [
+ [
+ -36.219,
+ 0
+ ],
+ [
+ 0,
+ 36.219
+ ],
+ [
+ 36.218,
+ 0
+ ],
+ [
+ 0,
+ -36.212
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ -65.576
+ ],
+ [
+ -65.574,
+ -0.003
+ ],
+ [
+ 0.002,
+ 65.576
+ ],
+ [
+ 65.574,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -27.336,
+ 0
+ ],
+ [
+ 0,
+ -27.335
+ ],
+ [
+ 27.334,
+ 0
+ ],
+ [
+ 0,
+ 27.338
+ ]
+ ],
+ "o": [
+ [
+ 27.334,
+ 0
+ ],
+ [
+ 0,
+ 27.338
+ ],
+ [
+ -27.336,
+ 0
+ ],
+ [
+ 0,
+ -27.335
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ -49.576
+ ],
+ [
+ 49.574,
+ -0.003
+ ],
+ [
+ 0.002,
+ 49.576
+ ],
+ [
+ -49.574,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "mm",
+ "mm": 1,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 65.824,
+ 65.826
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 4,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 31.746,
+ 0
+ ],
+ [
+ 0,
+ 31.749
+ ],
+ [
+ -31.748,
+ 0
+ ],
+ [
+ 0,
+ -31.745
+ ]
+ ],
+ "o": [
+ [
+ -31.748,
+ 0
+ ],
+ [
+ 0,
+ -31.745
+ ],
+ [
+ 31.746,
+ 0
+ ],
+ [
+ 0,
+ 31.749
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ 57.576
+ ],
+ [
+ -57.575,
+ -0.003
+ ],
+ [
+ 0.002,
+ -57.576
+ ],
+ [
+ 57.575,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 65.824,
+ 65.826
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 10,
+ "ty": 4,
+ "nm": "eyeball_right",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 654.426,
+ 632.847,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 65.824,
+ 65.826,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 36.218,
+ 0
+ ],
+ [
+ 0,
+ -36.212
+ ],
+ [
+ -36.219,
+ 0
+ ],
+ [
+ 0,
+ 36.219
+ ]
+ ],
+ "o": [
+ [
+ -36.219,
+ 0
+ ],
+ [
+ 0,
+ 36.219
+ ],
+ [
+ 36.218,
+ 0
+ ],
+ [
+ 0,
+ -36.212
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ -65.576
+ ],
+ [
+ -65.574,
+ -0.003
+ ],
+ [
+ 0.002,
+ 65.576
+ ],
+ [
+ 65.574,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -27.337,
+ 0
+ ],
+ [
+ 0,
+ -27.335
+ ],
+ [
+ 27.334,
+ 0
+ ],
+ [
+ 0,
+ 27.338
+ ]
+ ],
+ "o": [
+ [
+ 27.334,
+ 0
+ ],
+ [
+ 0,
+ 27.338
+ ],
+ [
+ -27.337,
+ 0
+ ],
+ [
+ 0,
+ -27.335
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ -49.576
+ ],
+ [
+ 49.574,
+ -0.003
+ ],
+ [
+ 0.002,
+ 49.576
+ ],
+ [
+ -49.574,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "mm",
+ "mm": 1,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 65.824,
+ 65.826
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 4,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 31.745,
+ 0
+ ],
+ [
+ 0,
+ 31.749
+ ],
+ [
+ -31.748,
+ 0
+ ],
+ [
+ 0,
+ -31.745
+ ]
+ ],
+ "o": [
+ [
+ -31.748,
+ 0
+ ],
+ [
+ 0,
+ -31.745
+ ],
+ [
+ 31.745,
+ 0
+ ],
+ [
+ 0,
+ 31.749
+ ]
+ ],
+ "v": [
+ [
+ 0.002,
+ 57.576
+ ],
+ [
+ -57.574,
+ -0.003
+ ],
+ [
+ 0.002,
+ -57.576
+ ],
+ [
+ 57.574,
+ -0.003
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 65.824,
+ 65.826
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 11,
+ "ty": 4,
+ "nm": "cheek_left",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 268.359,
+ 718.298,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 37.624,
+ 37.625,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ -20.645
+ ],
+ [
+ 20.64,
+ 0
+ ],
+ [
+ 0,
+ 20.637
+ ],
+ [
+ -20.645,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 20.637
+ ],
+ [
+ -20.645,
+ 0
+ ],
+ [
+ 0,
+ -20.645
+ ],
+ [
+ 20.64,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.374,
+ 0
+ ],
+ [
+ 0.002,
+ 37.375
+ ],
+ [
+ -37.374,
+ 0
+ ],
+ [
+ 0.002,
+ -37.375
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 37.624,
+ 37.626
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 12,
+ "ty": 4,
+ "nm": "cheek_right",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 731.64,
+ 718.298,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 37.622,
+ 37.625,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ -20.645
+ ],
+ [
+ 20.645,
+ 0
+ ],
+ [
+ 0,
+ 20.637
+ ],
+ [
+ -20.637,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 20.637
+ ],
+ [
+ -20.637,
+ 0
+ ],
+ [
+ 0,
+ -20.645
+ ],
+ [
+ 20.645,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.372,
+ 0
+ ],
+ [
+ -0.004,
+ 37.375
+ ],
+ [
+ -37.372,
+ 0
+ ],
+ [
+ -0.004,
+ -37.375
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 37.622,
+ 37.626
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 13,
+ "ty": 4,
+ "nm": "face",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 499.999,
+ 618.729,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 321.693,
+ 269.521,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ -16.966,
+ -150.969
+ ],
+ [
+ 183.631,
+ 0
+ ],
+ [
+ -19.111,
+ 170.049
+ ],
+ [
+ -151.907,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 19.111,
+ 170.049
+ ],
+ [
+ -183.64,
+ 0
+ ],
+ [
+ 16.966,
+ -150.969
+ ],
+ [
+ 151.905,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 302.333,
+ 0.828
+ ],
+ [
+ 0.003,
+ 269.271
+ ],
+ [
+ -302.332,
+ 0.828
+ ],
+ [
+ 0.003,
+ -269.271
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 321.693,
+ 269.521
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 14,
+ "ty": 4,
+ "nm": "ear_right",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 763.547,
+ 347.608,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 121.241,
+ 208.634,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -36.779,
+ 4.6
+ ],
+ [
+ 71.08,
+ -141.307
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 36.786,
+ -4.592
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -58.273,
+ 77.218
+ ],
+ [
+ 7.089,
+ -105.401
+ ],
+ [
+ -12.807,
+ 109.993
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 88.503,
+ 211.259
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -81.399,
+ 7.085
+ ],
+ [
+ 168.251,
+ -305.441
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 81.407,
+ -7.093
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -120.991,
+ 60.422
+ ],
+ [
+ -19.402,
+ -201.291
+ ],
+ [
+ -47.26,
+ 208.384
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 121.241,
+ 208.634
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 15,
+ "ty": 4,
+ "nm": "ear_left",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 236.452,
+ 347.608,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 121.236,
+ 208.634,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 36.779,
+ 4.6
+ ],
+ [
+ -71.08,
+ -141.307
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -36.779,
+ -4.592
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 58.275,
+ 77.218
+ ],
+ [
+ -7.091,
+ -105.401
+ ],
+ [
+ 12.805,
+ 109.993
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 1,
+ 0.74,
+ 0.75,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 153.974,
+ 211.259
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 81.41,
+ 7.085
+ ],
+ [
+ -168.248,
+ -305.441
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -81.399,
+ -7.093
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 120.986,
+ 60.422
+ ],
+ [
+ 19.392,
+ -201.291
+ ],
+ [
+ 47.262,
+ 208.384
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 121.236,
+ 208.634
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 16,
+ "ty": 4,
+ "nm": "body",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 499.697,
+ 811.329,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 233.907,
+ 164.921,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 55.823,
+ 51.688
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 24.473,
+ -75.204
+ ],
+ [
+ -85.039,
+ 0
+ ],
+ [
+ -68.954,
+ 38.859
+ ]
+ ],
+ "o": [
+ [
+ -126.866,
+ -117.468
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 69.094,
+ 39.071
+ ],
+ [
+ 84.791,
+ 0
+ ],
+ [
+ -14.957,
+ -44.737
+ ]
+ ],
+ "v": [
+ [
+ 133.898,
+ -47.203
+ ],
+ [
+ -164.471,
+ -30.757
+ ],
+ [
+ -233.657,
+ 103.292
+ ],
+ [
+ 0.303,
+ 164.671
+ ],
+ [
+ 233.657,
+ 103.636
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.94,
+ 0.94,
+ 0.94,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 233.907,
+ 164.921
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ },
+ {
+ "ddd": 0,
+ "ind": 17,
+ "ty": 4,
+ "nm": "bg",
+ "ks": {
+ "o": {
+ "k": 100
+ },
+ "r": {
+ "k": 0
+ },
+ "p": {
+ "k": [
+ 500,
+ 500,
+ 0
+ ]
+ },
+ "a": {
+ "k": [
+ 476.25,
+ 476.25,
+ 0
+ ]
+ },
+ "s": {
+ "k": [
+ 100,
+ 100,
+ 100
+ ]
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ks": {
+ "k": {
+ "i": [
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ],
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -262.888
+ ],
+ [
+ -262.888,
+ 0
+ ],
+ [
+ 0,
+ 262.888
+ ],
+ [
+ 262.888,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 476,
+ 0
+ ],
+ [
+ 0,
+ -476
+ ],
+ [
+ -476,
+ 0
+ ],
+ [
+ 0,
+ 476
+ ]
+ ],
+ "c": true
+ }
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group"
+ },
+ {
+ "ty": "fl",
+ "fillEnabled": true,
+ "c": {
+ "k": [
+ 0.62,
+ 0.79,
+ 0.81,
+ 1
+ ]
+ },
+ "o": {
+ "k": 100
+ },
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill"
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "k": [
+ 476.25,
+ 476.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "mn": "ADBE Vector Group"
+ }
+ ],
+ "ip": 0,
+ "op": 78,
+ "st": 0,
+ "bm": 0,
+ "sr": 1
+ }
+ ],
+ "v": "4.5.3",
+ "ddd": 0,
+ "ip": 0,
+ "op": 78,
+ "fr": 25,
+ "w": 1000,
+ "h": 1000
+}
\ No newline at end of file
diff --git a/devtools_options.yaml b/devtools_options.yaml
new file mode 100644
index 000000000..fa0b357c4
--- /dev/null
+++ b/devtools_options.yaml
@@ -0,0 +1,3 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:
diff --git "a/docs/Android\351\227\256\351\242\230\346\261\207\346\200\273.md" "b/docs/Android\351\227\256\351\242\230\346\261\207\346\200\273.md"
index 8b00f3101..725f2cc1c 100644
--- "a/docs/Android\351\227\256\351\242\230\346\261\207\346\200\273.md"
+++ "b/docs/Android\351\227\256\351\242\230\346\261\207\346\200\273.md"
@@ -26,9 +26,25 @@ maven {
参考:https://github.com/flutter/flutter/issues/39729
+## 关于打包
+
+默认使用`flutter build apk`命令,包含32、64位。
+
+添加`--target-platform`可指定平台,比如`android-arm`或`android-arm64`,来减小包体积。
+
+还可以使用`--split-debug-info`标志省略调试信息,来减小包体积。(注意使用此方式无法获取可读的堆栈信息)
+
+完整举例子:
+
+```
+flutter build apk --target-platform android-arm64 --obfuscate --split-debug-info=/flutter_deer/
+```
+
## 历史问题
-- 1.22.0已知问题(~~#67262~~ ~~#67213~~)
+- 3.10.0已知问题(~~#124546~~ ~~#126560~~ ~~#131319~~ ~~#73388~~)。
+
+- 1.22.0已知问题(~~#67262~~ ~~#67213~~)。
- 1.17.0已知问题(~~#25767~~ ~~#47191~~)。
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 22de15160..66fdb4dea 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -1,9 +1,47 @@
# Change Log:
+## 1.3.3
+
+* 适配Android 14。
+* Flutter SDK升至3.24.0。
+
+## 1.3.2
+
+* Android导航栏颜色优化。
+
+## 1.3.1
+
+* Flutter SDK升至3.16.5。
+
+## 1.3.0
+
+* 适配Android 13。
+* Flutter SDK升至3.10.0。
+
+## 1.2.3
+
+* Flutter SDK升至3.7.0。
+
+## 1.2.2
+
+* 适配Android 12。
+* Flutter SDK升至3.0.0。
+
+## 1.2.1
+
+* 适配Android 11。
+
+## 1.2.0
+
+* 迁移到空安全。
+* 修复曲线图长按滑动不展示提示框问题。
+
## 1.1.7
* 深色模式适配导航栏,优化启动效果。
* 适配Android 11键盘弹出动画。
+* 商品列表进入编辑页时添加Hero动画。
+* 添加lottie使用demo。
## 1.1.6
@@ -64,4 +102,8 @@
* 启动页适配深色模式。
* 更好的无障碍支持。
+## 1.0.7
+
+* 优化商品列表
+
diff --git "a/docs/Web\351\227\256\351\242\230\346\261\207\346\200\273.md" "b/docs/Web\351\227\256\351\242\230\346\261\207\346\200\273.md"
index 6bc5b3cfb..e54755964 100644
--- "a/docs/Web\351\227\256\351\242\230\346\261\207\346\200\273.md"
+++ "b/docs/Web\351\227\256\351\242\230\346\261\207\346\200\273.md"
@@ -1,14 +1,10 @@
-# Web 问题汇总(flutter 2.0.3)
+# Web 问题汇总(flutter 2.10.3)
-## CanvasKit渲染(默认PC浏览器)
-
-### 使用`DecorationImage`的`colorFilter`属性。
-
-`ColorFilter.mode`中的color为null时,Web报错NoSuchMethodError: invalid member on null: 'red' ,因此这里注意指定色值。
+## service worker
-其他相关问题:
+flutter 2.2中新的`service worker`加载机制目前发现兼容不够,部分浏览器无法正常工作。(web/index1.html)
-- [[web] wrong image filter on web app built with HTML renderer](https://github.com/flutter/flutter/issues/76966)
+## CanvasKit渲染(默认PC浏览器)
### 中文文字、表情等加载延迟导致乱码现象
@@ -20,19 +16,18 @@
- [[Web] [CanvasKit][Feature Request]: Load fonts as soon as detecting browser locale](https://github.com/flutter/flutter/issues/77023)
-## HTML渲染(默认手机浏览器)
-
-### 使用`TextOverflow.ellipsis`属性。
-
-现象如下:
+## 指定渲染引擎
-- 文字没有超出,后面出现红色省略号。
+```
+flutter run -d chrome --release --web-renderer html
+// 或
+flutter run -d chrome --release --web-renderer canvaskit
+```
-- 文字超出,未出现省略号。
+> 总结:HTML渲染相较于CanvasKit渲染,UI还原度差一些,但综合性能相对较好。
-其他相关问题:
-- [[canvaskit] font renders missing glyph when text overflow is ellipsis](https://github.com/flutter/flutter/issues/76473)
+## 已解决问题
### 使用`Transform`。
@@ -40,15 +35,38 @@
目前处理方法是添加`RepaintBoundary`。
-## 指定渲染引擎
+### 按钮的大小在移动端与Web端不同
-```
-flutter run -d chrome --release --web-renderer html
-// 或
-flutter run -d chrome --release --web-renderer canvaskit
-```
+可以`ThemeData`中全局指定`visualDensity`属性为`VisualDensity.standard`。
-> 总结:HTML渲染相较于CanvasKit渲染,UI还原度差一些,但综合性能相对较好。
+详情见[Buttons not respecting default dimensions](https://github.com/flutter/flutter/issues/77142)
+
+## 已修复问题
+
+### ~~使用`DecorationImage`的`colorFilter`属性。~~
+
+`ColorFilter.mode`中的color为null时,Web报错NoSuchMethodError: invalid member on null: 'red' 。
+2.2.0上`ColorFilter.mode`中的color以不能设为null。
+
+其他相关问题:
+
+[[web] wrong image filter on web app built with HTML renderer](https://github.com/flutter/flutter/issues/76966)
+
+### ~~使用`Locale`报空安全错误~~
+
+2.2.0已修复,详情见[[Web]: App throws null safety errors on Locale using latest stable, but works on Master](https://github.com/flutter/flutter/issues/79351)
+
+### ~~HTML渲染使用`TextOverflow.ellipsis`属性~~
+
+现象如下:
+
+- 文字没有超出,后面出现红色省略号。
+
+- 文字超出,未出现省略号。
+
+其他相关问题:
+
+- [[canvaskit] font renders missing glyph when text overflow is ellipsis](https://github.com/flutter/flutter/issues/76473)
diff --git a/integration_test/goods_test.dart b/integration_test/goods_test.dart
new file mode 100644
index 000000000..e9ea04337
--- /dev/null
+++ b/integration_test/goods_test.dart
@@ -0,0 +1,130 @@
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter_deer/goods/page/goods_edit_page.dart';
+import 'package:flutter_deer/goods/page/goods_page.dart';
+import 'package:flutter_deer/goods/page/goods_size_page.dart';
+import 'package:flutter_deer/main.dart';
+import 'package:flutter_deer/res/constant.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+
+
+/// flutter drive --driver integration_test/integration_test.dart --target integration_test/goods_test.dart
+void main() {
+
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ group('商品部分:', () {
+
+ Constant.isDriverTest = true;
+
+ tearDown(() {
+ debugPrint('< Success');
+ });
+
+ testWidgets('商品页测试',(WidgetTester tester) async {
+ runApp(MyApp(home: const GoodsPage()));
+ await tester.pumpAndSettle();
+
+ await tester.tap(find.text('待售'));
+ await tester.pumpAndSettle();
+
+ final Finder pageView = find.byKey(const Key('pageView'));
+ await tester.drag(pageView, const Offset(400, 0));
+ await tester.pumpAndSettle();
+
+ await tester.tap(find.text('全部商品'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('休闲食品'));
+ await tester.pumpAndSettle();
+ //进入搜索页
+ await tester.tap(find.byKey(const Key('search')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('search_back')));
+ await tester.pumpAndSettle();
+ //添加商品
+ await tester.tap(find.byKey(const Key('add')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('添加商品'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byTooltip('Back'));
+ await tester.pumpAndSettle();
+ // 商品菜单
+ await tester.tap(find.byKey(const Key('goods_menu_item_2')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('goods_operation_item_2')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('goods_delete_item_2')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('确认删除'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('goods_menu_item_1')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('goods_edit_item_1')));
+ await tester.pumpAndSettle();
+ });
+
+ testWidgets('商品编辑页测试',(WidgetTester tester) async {
+ runApp(MyApp(home: const GoodsEditPage()));
+ await tester.pumpAndSettle();
+
+ await tester.drag(find.byKey(const Key('goods_edit_page')), const Offset(0, -500));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('商品类型'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('生鲜果蔬'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('厨房用具'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('碗碟'));
+ await tester.pumpAndSettle();
+ }, timeout: const Timeout(Duration(seconds: 30)));
+
+ testWidgets('商品规格页测试',(WidgetTester tester) async {
+ runApp(MyApp(home: const GoodsSizePage()));
+
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('hint')));
+ await tester.pumpAndSettle();
+
+ final richText = find.byKey(const Key('name_edit')).first;
+ fireOnTap(richText, '编辑');
+ await tester.pumpAndSettle();
+ await tester.tap(find.text('取消'));
+ await tester.pumpAndSettle();
+
+ await tester.tap(find.byKey(const Key('2')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byTooltip('Back'));
+ await tester.pumpAndSettle();
+ // 侧滑删除
+ await tester.drag(find.byKey(const Key('2')), const Offset(-100, 0));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byKey(const Key('delete_2')));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byTooltip('Back'));
+ await tester.pumpAndSettle();
+ await tester.tap(find.byTooltip('Back'));
+ await tester.pumpAndSettle();
+ }, timeout: const Timeout(Duration(seconds: 30)));
+ });
+}
+
+/// https://github.com/flutter/flutter/issues/56023
+/// Runs the onTap handler for the [TextSpan] which matches the search-string.
+void fireOnTap(Finder finder, String text) {
+ final Element element = finder.evaluate().single;
+ final RenderParagraph paragraph = element.renderObject! as RenderParagraph;
+ // The children are the individual TextSpans which have GestureRecognizers
+ paragraph.text.visitChildren((InlineSpan span) {
+ if (span is TextSpan) {
+ if (span.text != text) {
+ return true; // continue iterating.
+ }
+
+ (span.recognizer! as TapGestureRecognizer).onTap!();
+ }
+ return false; // stop iterating, we found the one.
+ });
+}
diff --git a/integration_test/integration_test.dart b/integration_test/integration_test.dart
index 8f56e577a..53758622a 100644
--- a/integration_test/integration_test.dart
+++ b/integration_test/integration_test.dart
@@ -1,4 +1,4 @@
import 'package:integration_test/integration_test_driver.dart';
-Future main() => integrationDriver();
\ No newline at end of file
+Future main() => integrationDriver();
diff --git a/integration_test/login_test.dart b/integration_test/login_test.dart
index 85c7e1307..547aa22b0 100644
--- a/integration_test/login_test.dart
+++ b/integration_test/login_test.dart
@@ -14,7 +14,7 @@ void main() {
group('登录部分:', () {
tearDown(() {
- print('< Success');
+ debugPrint('< Success');
});
testWidgets('登录页按钮点击',(WidgetTester tester) async {
@@ -80,4 +80,4 @@ void main() {
await tester.tap(find.byKey(const Key('login'))); // 点击登录
}, timeout: const Timeout(Duration(seconds: 30)));
});
-}
\ No newline at end of file
+}
diff --git a/ios/Flutter/Flutter.podspec b/ios/Flutter/Flutter.podspec
index 2c4421cfe..3aed58d35 100644
--- a/ios/Flutter/Flutter.podspec
+++ b/ios/Flutter/Flutter.podspec
@@ -1,17 +1,17 @@
#
-# NOTE: This podspec is NOT to be published. It is only used as a local source!
-# This is a generated file; do not edit or check into version control.
+# This podspec is NOT to be published. It is only used as a local source!
+# This is a generated file; do not edit or check into version control.
#
Pod::Spec.new do |s|
s.name = 'Flutter'
s.version = '1.0.0'
- s.summary = 'High-performance, high-fidelity mobile apps.'
- s.homepage = 'https://flutter.io'
- s.license = { :type => 'MIT' }
+ s.summary = 'A UI toolkit for beautiful and fast apps.'
+ s.homepage = 'https://flutter.dev'
+ s.license = { :type => 'BSD' }
s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
- s.ios.deployment_target = '8.0'
+ s.ios.deployment_target = '13.0'
# Framework linking is handled by Flutter tooling, not CocoaPods.
# Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs.
s.vendored_frameworks = 'path/to/nothing'
diff --git a/ios/Flutter/ephemeral/flutter_lldb_helper.py b/ios/Flutter/ephemeral/flutter_lldb_helper.py
new file mode 100644
index 000000000..a88caf99d
--- /dev/null
+++ b/ios/Flutter/ephemeral/flutter_lldb_helper.py
@@ -0,0 +1,32 @@
+#
+# Generated file, do not edit.
+#
+
+import lldb
+
+def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):
+ """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages."""
+ base = frame.register["x0"].GetValueAsAddress()
+ page_len = frame.register["x1"].GetValueAsUnsigned()
+
+ # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the
+ # first page to see if handled it correctly. This makes diagnosing
+ # misconfiguration (e.g. missing breakpoint) easier.
+ data = bytearray(page_len)
+ data[0:8] = b'IHELPED!'
+
+ error = lldb.SBError()
+ frame.GetThread().GetProcess().WriteMemory(base, data, error)
+ if not error.Success():
+ print(f'Failed to write into {base}[+{page_len}]', error)
+ return
+
+def __lldb_init_module(debugger: lldb.SBDebugger, _):
+ target = debugger.GetDummyTarget()
+ # Caveat: must use BreakpointCreateByRegEx here and not
+ # BreakpointCreateByName. For some reasons callback function does not
+ # get carried over from dummy target for the later.
+ bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$")
+ bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))
+ bp.SetAutoContinue(True)
+ print("-- LLDB integration loaded --")
diff --git a/ios/Flutter/ephemeral/flutter_lldbinit b/ios/Flutter/ephemeral/flutter_lldbinit
new file mode 100644
index 000000000..e3ba6fbed
--- /dev/null
+++ b/ios/Flutter/ephemeral/flutter_lldbinit
@@ -0,0 +1,5 @@
+#
+# Generated file, do not edit.
+#
+
+command script import --relative-to-command-file flutter_lldb_helper.py
diff --git a/ios/Podfile b/ios/Podfile
index c2786089e..4ac67eb86 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,8 +1,8 @@
# Uncomment this line to define a global platform for your project
-platform :ios, '9.0'
+platform :ios, '13.0'
# source 'https://github.com/CocoaPods/Specs.git'
-
+# source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
@@ -40,9 +40,11 @@ post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
- if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 9.0
- config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
+ if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 12.0
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
+ # https://github.com/flutter/flutter/issues/90504 #84562
+ config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386'
end
end
end
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index f99394215..07dfd4ef9 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 46;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -13,7 +13,7 @@
7273ADFF2478E21800309008 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
7273AE092478E42B00309008 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7273AE072478E42B00309008 /* LaunchScreen.storyboard */; };
7273AE0A2478E42B00309008 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7273AE082478E42B00309008 /* Main.storyboard */; };
- BD4F247307C1B2EC10CEE075 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 242256812F0E5EC2FC55E432 /* Pods_Runner.framework */; };
+ AEA69329A74DB4B25E2ECB87 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D67B71C00D08ADD4FAADEDB /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -30,11 +30,10 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 0D45FAC02A7C4145DC023503 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 242256812F0E5EC2FC55E432 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 37E8FC7E71F65C9DD832AA03 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 02A7EA573B0D97D5A71DE380 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 3AE98DAA649A86DB32C2E0E2 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 42FEB795BCD522EBDFCE3114 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 4D67B71C00D08ADD4FAADEDB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7273ADEE2478DB7900309008 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
7273ADEF2478DB7900309008 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
7273ADF02478DB7900309008 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
@@ -47,6 +46,7 @@
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC4B9C102740D28696650567 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,7 +54,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- BD4F247307C1B2EC10CEE075 /* Pods_Runner.framework in Frameworks */,
+ AEA69329A74DB4B25E2ECB87 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -64,9 +64,9 @@
9707CA0EB99412E1173056F5 /* Pods */ = {
isa = PBXGroup;
children = (
- 42FEB795BCD522EBDFCE3114 /* Pods-Runner.debug.xcconfig */,
- 37E8FC7E71F65C9DD832AA03 /* Pods-Runner.release.xcconfig */,
- 0D45FAC02A7C4145DC023503 /* Pods-Runner.profile.xcconfig */,
+ DC4B9C102740D28696650567 /* Pods-Runner.debug.xcconfig */,
+ 02A7EA573B0D97D5A71DE380 /* Pods-Runner.release.xcconfig */,
+ 3AE98DAA649A86DB32C2E0E2 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -89,7 +89,7 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
9707CA0EB99412E1173056F5 /* Pods */,
- EBF36AE8FFF8D2ECDFCC4D49 /* Frameworks */,
+ 9A9514DF7710535D7ECD0A61 /* Frameworks */,
);
sourceTree = "";
};
@@ -116,10 +116,10 @@
path = Runner;
sourceTree = "";
};
- EBF36AE8FFF8D2ECDFCC4D49 /* Frameworks */ = {
+ 9A9514DF7710535D7ECD0A61 /* Frameworks */ = {
isa = PBXGroup;
children = (
- 242256812F0E5EC2FC55E432 /* Pods_Runner.framework */,
+ 4D67B71C00D08ADD4FAADEDB /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -131,15 +131,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- C26F12588241FFAE76860EB0 /* [CP] Check Pods Manifest.lock */,
+ 832472DC3989AE8A4B64E55F /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- 24202F6F610BDCB07C0B5A7A /* [CP] Copy Pods Resources */,
- 876E9B92C7728849627E2252 /* [CP] Embed Pods Frameworks */,
+ 8E838C9A100424E084A08A18 /* [CP] Embed Pods Frameworks */,
+ 3D5BFACDBCC1E59EE35581ED /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -156,7 +156,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1130;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "The Chromium Authors";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -198,7 +198,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 24202F6F610BDCB07C0B5A7A /* [CP] Copy Pods Resources */ = {
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
+ };
+ 3D5BFACDBCC1E59EE35581ED /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -216,54 +232,62 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ 832472DC3989AE8A4B64E55F /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
+ inputFileListPaths = (
+ );
inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
);
- name = "Thin Binary";
outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
};
- 876E9B92C7728849627E2252 /* [CP] Embed Pods Frameworks */ = {
+ 8E838C9A100424E084A08A18 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
- "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework",
"${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework",
- "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework",
+ "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework",
+ "${BUILT_PRODUCTS_DIR}/image_picker_ios/image_picker_ios.framework",
"${BUILT_PRODUCTS_DIR}/integration_test/integration_test.framework",
- "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
+ "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework",
"${BUILT_PRODUCTS_DIR}/qr_code_scanner/qr_code_scanner.framework",
- "${BUILT_PRODUCTS_DIR}/quick_actions/quick_actions.framework",
- "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
+ "${BUILT_PRODUCTS_DIR}/quick_actions_ios/quick_actions_ios.framework",
+ "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework",
"${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework",
- "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
+ "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework",
"${BUILT_PRODUCTS_DIR}/vibration/vibration.framework",
- "${BUILT_PRODUCTS_DIR}/webview_flutter/webview_flutter.framework",
+ "${BUILT_PRODUCTS_DIR}/webview_flutter_wkwebview/webview_flutter_wkwebview.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/integration_test.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/qr_code_scanner.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/quick_actions.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/quick_actions_ios.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibration.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter_wkwebview.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@@ -272,6 +296,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@@ -284,28 +309,6 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
- C26F12588241FFAE76860EB0 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -363,7 +366,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -381,14 +384,18 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
- ENABLE_BITCODE = YES;
+ ENABLE_BITCODE = NO;
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -450,7 +457,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -500,7 +507,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -516,14 +523,18 @@
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
- ENABLE_BITCODE = YES;
+ ENABLE_BITCODE = NO;
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -547,14 +558,18 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
- ENABLE_BITCODE = YES;
+ ENABLE_BITCODE = NO;
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index ad6250a1c..9c12df59c 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index f95f83ac6..6057e504a 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -1,14 +1,14 @@
import UIKit
import Flutter
-@UIApplicationMain
+@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
- let controller:FlutterViewController = window.rootViewController as! FlutterViewController
+ let controller:FlutterViewController = window?.rootViewController as! FlutterViewController
let versionChannel = FlutterMethodChannel(name: "version", binaryMessenger: controller as! FlutterBinaryMessenger)
versionChannel.setMethodCallHandler { (call, result) in
if "jumpAppStore" == call.method {
diff --git a/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/Contents.json b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/Contents.json
new file mode 100644
index 000000000..dba3e411e
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/Contents.json
@@ -0,0 +1,26 @@
+{
+ "images" : [
+ {
+ "filename" : "flutter_dash_black_1x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "flutter_dash_black_2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "flutter_dash_black_3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "template"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_1x.png b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_1x.png
new file mode 100644
index 000000000..fb8b90151
Binary files /dev/null and b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_1x.png differ
diff --git a/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_2x.png b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_2x.png
new file mode 100644
index 000000000..9b05bc957
Binary files /dev/null and b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_2x.png differ
diff --git a/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_3x.png b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_3x.png
new file mode 100644
index 000000000..b14af061a
Binary files /dev/null and b/ios/Runner/Assets.xcassets/flutter_dash_black.imageset/flutter_dash_black_3x.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index ad844017b..cbc408b3f 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -54,5 +54,9 @@
UIViewControllerBasedStatusBarAppearance
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
diff --git a/ios/Runner/LaunchScreen.storyboard b/ios/Runner/LaunchScreen.storyboard
index 42c84fd50..933b65471 100644
--- a/ios/Runner/LaunchScreen.storyboard
+++ b/ios/Runner/LaunchScreen.storyboard
@@ -1,9 +1,10 @@
-
+
-
+
+
@@ -23,7 +24,7 @@
-
+
@@ -37,5 +38,8 @@
+
+
+
diff --git a/l10n.yaml b/l10n.yaml
index caf1d834b..f3b15f7dc 100644
--- a/l10n.yaml
+++ b/l10n.yaml
@@ -1,5 +1,4 @@
# 文档:https://flutter.dev/docs/development/accessibility-and-localization/internationalization
-
arb-dir: lib/l10n
template-arb-file: intl_en.arb
output-localization-file: deer_localizations.dart
diff --git a/lib/account/account_router.dart b/lib/account/account_router.dart
index b8cb22e39..4ebde5d55 100644
--- a/lib/account/account_router.dart
+++ b/lib/account/account_router.dart
@@ -1,4 +1,3 @@
-
import 'package:fluro/fluro.dart';
import 'package:flutter_deer/routers/i_router.dart';
@@ -35,7 +34,7 @@ class AccountRouter implements IRouterProvider{
router.define(accountRecordListPage, handler: Handler(handlerFunc: (_, __) => const AccountRecordListPage()));
router.define(addWithdrawalAccountPage, handler: Handler(handlerFunc: (_, __) => const AddWithdrawalAccountPage()));
router.define(bankSelectPage, handler: Handler(handlerFunc: (_, Map> params) {
- final int type = int.parse(params['type']?.first);
+ final int type = int.parse(params['type']?.first ?? '0');
return BankSelectPage(type: type);
}));
router.define(citySelectPage, handler: Handler(handlerFunc: (_, __) => const CitySelectPage()));
@@ -47,4 +46,4 @@ class AccountRouter implements IRouterProvider{
router.define(withdrawalResultPage, handler: Handler(handlerFunc: (_, __) => const WithdrawalResultPage()));
}
-}
\ No newline at end of file
+}
diff --git a/lib/account/models/bank_entity.dart b/lib/account/models/bank_entity.dart
index 8ff4630e0..a537199e7 100644
--- a/lib/account/models/bank_entity.dart
+++ b/lib/account/models/bank_entity.dart
@@ -1,16 +1,22 @@
import 'package:azlistview/azlistview.dart';
-import 'package:flutter_deer/generated/json/base/json_convert_content.dart';
+import 'package:flutter_deer/generated/json/bank_entity.g.dart';
+import 'package:flutter_deer/generated/json/base/json_field.dart';
-class BankEntity with JsonConvert, ISuspensionBean {
+@JsonSerializable()
+class BankEntity with ISuspensionBean {
BankEntity({this.id, this.bankName, this.firstLetter});
- int id;
- String bankName;
- String firstLetter;
+ factory BankEntity.fromJson(Map json) => $BankEntityFromJson(json);
+
+ Map toJson() => $BankEntityToJson(this);
+
+ int? id;
+ String? bankName;
+ String? firstLetter;
@override
String getSuspensionTag() {
- return firstLetter;
+ return firstLetter ?? '';
}
}
diff --git a/lib/account/models/city_entity.dart b/lib/account/models/city_entity.dart
index 29a692d98..5f89e5989 100644
--- a/lib/account/models/city_entity.dart
+++ b/lib/account/models/city_entity.dart
@@ -1,10 +1,19 @@
import 'package:azlistview/azlistview.dart';
-import 'package:flutter_deer/generated/json/base/json_convert_content.dart';
+import 'package:flutter_deer/generated/json/base/json_field.dart';
+import 'package:flutter_deer/generated/json/city_entity.g.dart';
-class CityEntity with JsonConvert, ISuspensionBean {
- String name;
- String cityCode;
- String firstCharacter;
+@JsonSerializable()
+class CityEntity with ISuspensionBean {
+
+ CityEntity();
+
+ factory CityEntity.fromJson(Map json) => $CityEntityFromJson(json);
+
+ Map toJson() => $CityEntityToJson(this);
+
+ late String name;
+ late String cityCode;
+ late String firstCharacter;
@override
String getSuspensionTag() {
diff --git a/lib/account/page/account_page.dart b/lib/account/page/account_page.dart
index f05f9dfdb..dde65345d 100644
--- a/lib/account/page/account_page.dart
+++ b/lib/account/page/account_page.dart
@@ -1,19 +1,18 @@
-
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_deer/account/widgets/rise_number_text.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
import 'package:flutter_deer/util/image_utils.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/click_item.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
import '../account_router.dart';
/// design/6店铺-账户/index.html#artboard2
class AccountPage extends StatefulWidget {
- const AccountPage({Key key}) : super(key: key);
+ const AccountPage({super.key});
@override
_AccountPageState createState() => _AccountPageState();
@@ -62,9 +61,9 @@ class _AccountPageState extends State {
fit: BoxFit.fill,
),
),
- child: Column(
+ child: const Column(
children: [
- const _AccountMoney(
+ _AccountMoney(
title: '当前余额(元)',
money: '30.12',
alignment: MainAxisAlignment.end,
@@ -72,7 +71,7 @@ class _AccountPageState extends State {
),
Expanded(
child: Row(
- children: const [
+ children: [
_AccountMoney(title: '累计结算金额', money: '20000'),
_AccountMoney(title: '累计发放佣金', money: '0.02'),
],
@@ -88,17 +87,16 @@ class _AccountPageState extends State {
class _AccountMoney extends StatelessWidget {
const _AccountMoney({
- Key key,
- @required this.title,
- @required this.money,
+ required this.title,
+ required this.money,
this.alignment,
this.moneyTextStyle
- }): super(key: key);
+ });
final String title;
final String money;
- final MainAxisAlignment alignment;
- final TextStyle moneyTextStyle;
+ final MainAxisAlignment? alignment;
+ final TextStyle? moneyTextStyle;
@override
Widget build(BuildContext context) {
@@ -112,7 +110,7 @@ class _AccountMoney extends StatelessWidget {
Text(title, style: const TextStyle(color: Colours.text_disabled, fontSize: Dimens.font_sp12)),
Gaps.vGap8,
RiseNumberText(
- NumUtil.getDoubleByValueStr(money),
+ NumUtil.getDoubleByValueStr(money) ?? 0,
style: moneyTextStyle ?? const TextStyle(
color: Colours.text_disabled,
fontSize: Dimens.font_sp14,
diff --git a/lib/account/page/account_record_list_page.dart b/lib/account/page/account_record_list_page.dart
index a19f9b66a..164f090ec 100644
--- a/lib/account/page/account_record_list_page.dart
+++ b/lib/account/page/account_record_list_page.dart
@@ -1,14 +1,13 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/util/theme_utils.dart';
import 'package:flutter_deer/widgets/my_app_bar.dart';
-import 'package:sticky_headers/sticky_headers.dart';
+import '../../order/page/order_page.dart';
/// design/6店铺-账户/index.html#artboard1
class AccountRecordListPage extends StatefulWidget {
- const AccountRecordListPage({Key key}) : super(key: key);
+ const AccountRecordListPage({super.key});
@override
_AccountRecordListPageState createState() => _AccountRecordListPageState();
@@ -21,70 +20,80 @@ class _AccountRecordListPageState extends State {
appBar: const MyAppBar(
centerTitle: '账户流水',
),
- body: ListView.builder(
- itemCount: 8,
- /// 将item默认合并的语义拆开,自行组合, 另一种方式见 withdrawal_record_list_page.dart
- addSemanticIndexes: false,
- itemBuilder: (_, int index) {
- return StickyHeader(
- header: Container(
+ body: CustomScrollView(
+ slivers: [
+ for (int i = 0; i < 8; i++)
+ _buildGroup(i)
+ ],
+ ),
+ );
+ }
+
+ Widget _buildGroup(int index) {
+ return SliverMainAxisGroup(
+ slivers: [
+ SliverPersistentHeader(
+ pinned: true,
+ delegate: SliverAppBarDelegate(
+ Container(
alignment: Alignment.centerLeft,
width: double.infinity,
color: ThemeUtils.getStickyHeaderColor(context),
padding: const EdgeInsets.only(left: 16.0),
- height: 34.0,
child: Text('2021/06/0${index + 1}'),
- ),
- content: _buildItem(index),
- );
- },
- ),
+ )
+ , 34.0,
+ ),
+ ),
+ SliverList(
+ delegate: SliverChildBuilderDelegate((_, index) {
+ return _buildItem(index);
+ },
+ childCount: index + 1,
+ ),
+ ),
+ ],
);
}
-
- Widget _buildItem(int index) {
- final List list = List.generate(index + 1, (int i) {
- return Container(
- height: 72.0,
- width: double.infinity,
- padding: const EdgeInsets.all(15.0),
- decoration: BoxDecoration(
- border: Border(
- bottom: Divider.createBorderSide(context, width: 0.8),
- ),
+
+ Widget _buildItem(int i) {
+ return Container(
+ height: 72.0,
+ width: double.infinity,
+ padding: const EdgeInsets.all(15.0),
+ decoration: BoxDecoration(
+ border: Border(
+ bottom: Divider.createBorderSide(context, width: 0.8),
),
- child: IndexedSemantics(
- index: index,
- child: Stack(
- children: [
- Text(i.isEven ? '采购订单结算营收' : '提现'),
- Positioned(
- top: 0.0,
- right: 0.0,
- child: Text(i.isEven ? '+10.00' : '-10.00',
- style: i.isEven ? TextStyle(
- color: Theme.of(context).errorColor,
- fontWeight: FontWeight.bold,
- ) : TextStyles.textBold14,
- ),
- ),
- Positioned(
- bottom: 0.0,
- left: 0.0,
- child: Text(i.isEven ? '18:20:10' : '08:20:11', style: Theme.of(context).textTheme.subtitle2),
- ),
- Positioned(
- bottom: 0.0,
- right: 0.0,
- child: Text('余额:20.00', style: Theme.of(context).textTheme.subtitle2),
+ ),
+ child: IndexedSemantics(
+ index: i,
+ child: Stack(
+ children: [
+ Text(i.isEven ? '采购订单结算营收' : '提现'),
+ Positioned(
+ top: 0.0,
+ right: 0.0,
+ child: Text(i.isEven ? '+10.00' : '-10.00',
+ style: i.isEven ? TextStyle(
+ color: Theme.of(context).colorScheme.error,
+ fontWeight: FontWeight.bold,
+ ) : TextStyles.textBold14,
),
- ],
- ),
+ ),
+ Positioned(
+ bottom: 0.0,
+ left: 0.0,
+ child: Text(i.isEven ? '18:20:10' : '08:20:11', style: Theme.of(context).textTheme.titleSmall),
+ ),
+ Positioned(
+ bottom: 0.0,
+ right: 0.0,
+ child: Text('余额:20.00', style: Theme.of(context).textTheme.titleSmall),
+ ),
+ ],
),
- );
- });
- return Column(
- children: list
+ ),
);
}
}
diff --git a/lib/account/page/add_withdrawal_account_page.dart b/lib/account/page/add_withdrawal_account_page.dart
index db30a3be9..607fd2673 100644
--- a/lib/account/page/add_withdrawal_account_page.dart
+++ b/lib/account/page/add_withdrawal_account_page.dart
@@ -4,8 +4,8 @@ import 'package:flutter_deer/account/models/bank_entity.dart';
import 'package:flutter_deer/account/models/city_entity.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
-import 'package:flutter_deer/util/theme_utils.dart';
import 'package:flutter_deer/util/other_utils.dart';
+import 'package:flutter_deer/util/theme_utils.dart';
import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/my_button.dart';
import 'package:flutter_deer/widgets/my_scroll_view.dart';
@@ -16,7 +16,7 @@ import 'package:flutter_deer/widgets/text_field_item.dart';
/// design/6店铺-账户/index.html#artboard29
class AddWithdrawalAccountPage extends StatefulWidget {
- const AddWithdrawalAccountPage({Key key}) : super(key: key);
+ const AddWithdrawalAccountPage({super.key});
@override
_AddWithdrawalAccountPageState createState() => _AddWithdrawalAccountPageState();
@@ -31,7 +31,7 @@ class _AddWithdrawalAccountPageState extends State {
@override
Widget build(BuildContext context) {
- final TextStyle style = Theme.of(context).textTheme.subtitle2.copyWith(fontSize: Dimens.font_sp14);
+ final TextStyle? style = Theme.of(context).textTheme.titleSmall?.copyWith(fontSize: Dimens.font_sp14);
final List children = [
Gaps.vGap5,
SelectedItem(
@@ -56,7 +56,7 @@ class _AddWithdrawalAccountPageState extends State {
SelectedItem(
title: '开 户 地',
content: _city.isEmpty ? '选择开户城市' : _city,
- style: _city.isEmpty ? style: null,
+ style: _city.isEmpty ? style : null,
onTap: () {
NavigatorUtils.pushResult(context, AccountRouter.citySelectPage, (Object result) {
setState(() {
@@ -74,7 +74,7 @@ class _AddWithdrawalAccountPageState extends State {
NavigatorUtils.pushResult(context, '${AccountRouter.bankSelectPage}?type=0', (Object result) {
setState(() {
final BankEntity model = result as BankEntity;
- _bank = model.bankName;
+ _bank = model.bankName.nullSafe;
});
});
},
@@ -87,7 +87,7 @@ class _AddWithdrawalAccountPageState extends State {
NavigatorUtils.pushResult(context, '${AccountRouter.bankSelectPage}?type=1', (Object result) {
setState(() {
final BankEntity model = result as BankEntity;
- _bank1 = model.bankName;
+ _bank1 = model.bankName.nullSafe;
});
});
},
@@ -99,7 +99,7 @@ class _AddWithdrawalAccountPageState extends State {
padding: const EdgeInsets.only(top: 8.0, left: 16.0),
child: Text(
_isWechat ? '绑定本机当前登录的微信号' : '绑定持卡人本人的银行卡',
- style: Theme.of(context).textTheme.subtitle2,
+ style: Theme.of(context).textTheme.titleSmall,
),
),
];
@@ -110,14 +110,14 @@ class _AddWithdrawalAccountPageState extends State {
title: '添加账号',
),
body: MyScrollView(
- children: children,
bottomButton: Padding(
padding: const EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8.0),
child: MyButton(
onPressed: () => NavigatorUtils.goBackWithParams(context, 'add'),
text: '确定',
),
- )
+ ),
+ children: children
),
);
}
@@ -136,7 +136,7 @@ class _AddWithdrawalAccountPageState extends State {
showElasticDialog(
context: context,
builder: (BuildContext context) {
- const OutlinedBorder buttonShape = RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(0)));
+ const OutlinedBorder buttonShape = RoundedRectangleBorder();
final Widget content = Column(
children: [
@@ -190,9 +190,9 @@ class _AddWithdrawalAccountPageState extends State {
data: TextButtonThemeData(
style: TextButton.styleFrom(
// 文字颜色
- primary: Theme.of(context).primaryColor,
+ foregroundColor: Theme.of(context).primaryColor,
// 按钮大小
- minimumSize: const Size(double.infinity, double.infinity),
+ minimumSize: Size.infinite,
// 修改默认圆角
shape: buttonShape,
),
diff --git a/lib/account/page/bank_select_page.dart b/lib/account/page/bank_select_page.dart
index ba5083337..7a834e7e0 100644
--- a/lib/account/page/bank_select_page.dart
+++ b/lib/account/page/bank_select_page.dart
@@ -1,20 +1,20 @@
-
import 'dart:convert';
+import 'package:azlistview/azlistview.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_deer/account/models/bank_entity.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
+import 'package:flutter_deer/util/other_utils.dart';
import 'package:flutter_deer/util/theme_utils.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
-import 'package:azlistview/azlistview.dart';
import 'package:flutter_deer/widgets/load_image.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
/// design/6店铺-账户/index.html#artboard33
class BankSelectPage extends StatefulWidget {
- const BankSelectPage({Key key, this.type}) : super(key: key);
+ const BankSelectPage({super.key, this.type = 0});
final int type;
@@ -48,26 +48,30 @@ class _BankSelectPageState extends State {
// 获取城市列表
rootBundle.loadString(widget.type == 0 ? 'assets/data/bank.json' : 'assets/data/bank_2.json').then((String value) {
final List list = json.decode(value) as List;
- list.forEach((dynamic value) {
- _bankList.add(BankEntity().fromJson(value as Map));
- });
+ list.forEach(_addBank);
SuspensionUtil.sortListBySuspensionTag(_bankList);
SuspensionUtil.setShowSuspensionStatus(_bankList);
_indexBarData = _bankList.map((BankEntity e) {
if (e.isShowSuspension) {
- return e.firstLetter;
+ return e.firstLetter.nullSafe;
} else {
return '';
}
}).where((String element) => element.isNotEmpty).toList();
- // add header.
- _bankList.insert(0, BankEntity(firstLetter: '常用'));
- _indexBarData.insert(0, '常用');
+ if (widget.type == 0) {
+ // add header.
+ _bankList.insert(0, BankEntity(firstLetter: '常用'));
+ _indexBarData.insert(0, '常用');
+ }
setState(() {
});
});
}
+
+ void _addBank(dynamic value) {
+ _bankList.add(BankEntity.fromJson(value as Map));
+ }
@override
Widget build(BuildContext context) {
@@ -80,7 +84,7 @@ class _BankSelectPageState extends State {
data: _bankList,
itemCount: _bankList.length,
itemBuilder: (_, int index) {
- if (index == 0) {
+ if (index == 0 && widget.type == 0) {
return _buildHeader();
}
return _buildListItem(index);
@@ -92,7 +96,7 @@ class _BankSelectPageState extends State {
indexHintWidth: 96,
indexHintHeight: 96,
indexHintTextStyle: const TextStyle(fontSize: 26.0, color: Colors.white),
- textStyle: Theme.of(context).textTheme.subtitle2,
+ textStyle: Theme.of(context).textTheme.titleSmall!,
downTextStyle: context.isDark ? TextStyles.textSize12 : const TextStyle(fontSize: 12.0, color: Colors.black),
),
),
@@ -108,7 +112,7 @@ class _BankSelectPageState extends State {
children: [
Padding(
padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 16.0),
- child: Text('常用', style: Theme.of(context).textTheme.subtitle2),
+ child: Text('常用', style: Theme.of(context).textTheme.titleSmall),
),
Expanded(
child: ListView.builder(
@@ -156,11 +160,11 @@ class _BankSelectPageState extends State {
opacity: model.isShowSuspension ? 1 : 0,
child: SizedBox(
width: 28.0,
- child: Text(model.firstLetter),
+ child: Text(model.firstLetter.nullSafe),
)
),
Expanded(
- child: Text(model.bankName),
+ child: Text(model.bankName.nullSafe),
)
],
),
diff --git a/lib/account/page/city_select_page.dart b/lib/account/page/city_select_page.dart
index 5f510cd24..da381e39a 100644
--- a/lib/account/page/city_select_page.dart
+++ b/lib/account/page/city_select_page.dart
@@ -1,20 +1,19 @@
-
import 'dart:convert';
+import 'package:azlistview/azlistview.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_deer/account/models/city_entity.dart';
-import 'package:flutter_deer/common/common.dart';
+import 'package:flutter_deer/res/constant.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
import 'package:flutter_deer/util/theme_utils.dart';
import 'package:flutter_deer/widgets/my_app_bar.dart';
-import 'package:azlistview/azlistview.dart';
/// design/6店铺-账户/index.html#artboard34
class CitySelectPage extends StatefulWidget {
- const CitySelectPage({Key key}) : super(key: key);
+ const CitySelectPage({super.key});
@override
_CitySelectPageState createState() => _CitySelectPageState();
@@ -41,9 +40,7 @@ class _CitySelectPageState extends State {
jsonStr = await rootBundle.loadString('assets/data/city.json');
}
final List list = json.decode(jsonStr) as List;
- list.forEach((dynamic value) {
- _cityList.add(CityEntity().fromJson(value as Map));
- });
+ list.forEach(_addCity);
SuspensionUtil.setShowSuspensionStatus(_cityList);
_indexBarData = _cityList.map((CityEntity e) {
if (e.isShowSuspension) {
@@ -57,12 +54,13 @@ class _CitySelectPageState extends State {
});
}
+ void _addCity(dynamic value) {
+ _cityList.add(CityEntity.fromJson(value as Map));
+ }
+
/// rootBundle.loadString源码修改
Future _loadString(String key) async {
final ByteData data = await rootBundle.load(key);
- if (data == null) {
- throw FlutterError('Unable to load asset: $key');
- }
return utf8.decode(data.buffer.asUint8List());
}
@@ -84,7 +82,7 @@ class _CitySelectPageState extends State {
indexHintWidth: 96,
indexHintHeight: 96,
indexHintTextStyle: const TextStyle(fontSize: 26.0, color: Colors.white),
- textStyle: Theme.of(context).textTheme.subtitle2,
+ textStyle: Theme.of(context).textTheme.titleSmall!,
downTextStyle: context.isDark ? TextStyles.textSize12 : const TextStyle(fontSize: 12.0, color: Colors.black),
),
),
diff --git a/lib/account/page/withdrawal_account_list_page.dart b/lib/account/page/withdrawal_account_list_page.dart
index 8b907fecf..ef90036eb 100644
--- a/lib/account/page/withdrawal_account_list_page.dart
+++ b/lib/account/page/withdrawal_account_list_page.dart
@@ -1,17 +1,16 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/account/models/withdrawal_account_model.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/load_image.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
import '../account_router.dart';
/// design/6店铺-账户/index.html#artboard7
class WithdrawalAccountListPage extends StatefulWidget {
- const WithdrawalAccountListPage({Key key}) : super(key: key);
+ const WithdrawalAccountListPage({super.key});
@override
_WithdrawalAccountListPageState createState() => _WithdrawalAccountListPageState();
diff --git a/lib/account/page/withdrawal_account_page.dart b/lib/account/page/withdrawal_account_page.dart
index be19d6765..655c1db3c 100644
--- a/lib/account/page/withdrawal_account_page.dart
+++ b/lib/account/page/withdrawal_account_page.dart
@@ -1,4 +1,3 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/account/models/withdrawal_account_model.dart';
import 'package:flutter_deer/account/widgets/withdrawal_account_item.dart';
@@ -13,7 +12,7 @@ import '../account_router.dart';
/// design/6店铺-账户/index.html#artboard26
class WithdrawalAccountPage extends StatefulWidget {
- const WithdrawalAccountPage({Key key}) : super(key: key);
+ const WithdrawalAccountPage({super.key});
@override
_WithdrawalAccountPageState createState() => _WithdrawalAccountPageState();
@@ -31,7 +30,7 @@ class _WithdrawalAccountPageState extends State {
_list.clear();
_list.add(WithdrawalAccountModel('唯鹿', '微信', 1, ''));
_list.add(WithdrawalAccountModel('李*', '工商银行', 0, '**** **** **** 5236'));
- _list.add(WithdrawalAccountModel('李*', '渤海银行', 0, '**** **** **** 2165'));
+ _list.add(WithdrawalAccountModel('李*', '工商银行', 0, '**** **** **** 2165'));
}
@override
@@ -72,7 +71,7 @@ class _WithdrawalAccountPageState extends State {
void _removeItem(int index) {
/// 先移除数据
final WithdrawalAccountModel item = _list.removeAt(index);
- _listKey.currentState.removeItem(
+ _listKey.currentState?.removeItem(
index, (_, animation) => sizeItem(item, 0, animation), /// 构建移除Widget
duration: _kDuration,
);
@@ -95,7 +94,7 @@ class _WithdrawalAccountPageState extends State {
});
} else {
- _listKey.currentState.insertItem(
+ _listKey.currentState?.insertItem(
index,
duration: _kDuration,
);
@@ -123,7 +122,7 @@ class _WithdrawalAccountPageState extends State {
Gaps.line,
MyButton(
minHeight: 54.0,
- textColor: Theme.of(context).errorColor,
+ textColor: Theme.of(context).colorScheme.error,
text: '确认解绑',
backgroundColor: Colors.transparent,
onPressed: () {
diff --git a/lib/account/page/withdrawal_page.dart b/lib/account/page/withdrawal_page.dart
index 55eb58e79..f9fdbb1b3 100644
--- a/lib/account/page/withdrawal_page.dart
+++ b/lib/account/page/withdrawal_page.dart
@@ -1,12 +1,11 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/account/models/withdrawal_account_model.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
import 'package:flutter_deer/util/input_formatter/number_text_input_formatter.dart';
import 'package:flutter_deer/util/theme_utils.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/load_image.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/my_button.dart';
import 'package:flutter_deer/widgets/my_scroll_view.dart';
@@ -15,7 +14,7 @@ import '../account_router.dart';
/// design/6店铺-账户/index.html#artboard3
class WithdrawalPage extends StatefulWidget {
- const WithdrawalPage({Key key}) : super(key: key);
+ const WithdrawalPage({super.key});
@override
_WithdrawalPageState createState() => _WithdrawalPageState();
@@ -56,11 +55,10 @@ class _WithdrawalPageState extends State {
@override
Widget build(BuildContext context) {
- return WillPopScope(
- onWillPop: () {
+ return PopScope(
+ onPopInvoked: (_) {
/// 拦截返回,关闭键盘,否则会造成上一页面短暂的组件溢出
FocusManager.instance.primaryFocus?.unfocus();
- return Future.value(true);
},
child: Scaffold(
appBar: const MyAppBar(
@@ -93,7 +91,7 @@ class _WithdrawalPageState extends State {
children: [
Text(_data.typeName),
Gaps.vGap8,
- Text(_data.name, style: Theme.of(context).textTheme.subtitle2),
+ Text(_data.name, style: Theme.of(context).textTheme.titleSmall),
],
),
),
@@ -103,11 +101,11 @@ class _WithdrawalPageState extends State {
),
),
Gaps.vGap16,
- Row(
+ const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: const [
+ children: [
Text('提现金额', style: TextStyles.textBold14),
- Text('单笔2万,单日2万', style: TextStyle(fontSize: Dimens.font_sp12, color: Color(0xFFFF8547)))
+ Text('单笔2万,单日2万', style: TextStyle(fontSize: Dimens.font_sp12, color: Colours.orange))
],
),
Gaps.vGap8,
@@ -151,7 +149,7 @@ class _WithdrawalPageState extends State {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text('最多可提现70元', style: Theme.of(context).textTheme.subtitle2),
+ Text('最多可提现70元', style: Theme.of(context).textTheme.titleSmall),
GestureDetector(
onTap: () {
_controller.text = '70';
@@ -166,9 +164,9 @@ class _WithdrawalPageState extends State {
)
],
),
- Row(
+ const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: const [
+ children: [
Text('转出方式', style: TextStyles.textBold14),
LoadAssetImage('account/sm', width: 16.0)
],
@@ -220,16 +218,16 @@ class _WithdrawalPageState extends State {
child: RichText(
text: type == 0 ? TextSpan(
text: '手续费按',
- style: Theme.of(context).textTheme.bodyText2.copyWith(fontSize: Dimens.font_sp12),
+ style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: Dimens.font_sp12),
children: const [
- TextSpan(text: '0.3%', style: TextStyle(color: Color(0xFFFF8547))),
+ TextSpan(text: '0.3%', style: TextStyle(color: Colours.orange)),
TextSpan(text: '收取'),
],
) : TextSpan(
text: '预计',
- style: Theme.of(context).textTheme.bodyText2.copyWith(fontSize: Dimens.font_sp12),
+ style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontSize: Dimens.font_sp12),
children: const [
- TextSpan(text: 'T+1天到账(免手续费,T为工作日)', style: TextStyle(color: Color(0xFFFF8547))),
+ TextSpan(text: 'T+1天到账(免手续费,T为工作日)', style: TextStyle(color: Colours.orange)),
],
),
)
diff --git a/lib/account/page/withdrawal_password_page.dart b/lib/account/page/withdrawal_password_page.dart
index 43e49e731..d636bbebe 100644
--- a/lib/account/page/withdrawal_password_page.dart
+++ b/lib/account/page/withdrawal_password_page.dart
@@ -1,18 +1,17 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/account/widgets/sms_verify_dialog.dart';
import 'package:flutter_deer/account/widgets/withdrawal_password_setting.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
import 'package:flutter_deer/util/other_utils.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/base_dialog.dart';
import 'package:flutter_deer/widgets/click_item.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
/// design/6店铺-账户/index.html#artboard20
class WithdrawalPasswordPage extends StatefulWidget {
- const WithdrawalPasswordPage({Key key}) : super(key: key);
+ const WithdrawalPasswordPage({super.key});
@override
_WithdrawalPasswordPageState createState() => _WithdrawalPasswordPageState();
diff --git a/lib/account/page/withdrawal_record_list_page.dart b/lib/account/page/withdrawal_record_list_page.dart
index 91d84abad..2af575d11 100644
--- a/lib/account/page/withdrawal_record_list_page.dart
+++ b/lib/account/page/withdrawal_record_list_page.dart
@@ -1,14 +1,13 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/util/theme_utils.dart';
import 'package:flutter_deer/widgets/my_app_bar.dart';
-import 'package:sticky_headers/sticky_headers.dart';
+import '../../order/page/order_page.dart';
/// design/6店铺-账户/index.html#artboard19
class WithdrawalRecordListPage extends StatefulWidget {
- const WithdrawalRecordListPage({Key key}) : super(key: key);
+ const WithdrawalRecordListPage({super.key});
@override
_WithdrawalRecordListPageState createState() => _WithdrawalRecordListPageState();
@@ -21,32 +20,75 @@ class _WithdrawalRecordListPageState extends State {
appBar: const MyAppBar(
title: '提现记录',
),
- body: ListView.builder(
- itemCount: 8,
- itemBuilder: (_, index) {
- return Semantics(
- /// 将item默认合并的语义拆开,自行组合, 另一种方式见 account_record_list_page.dart
- explicitChildNodes: true,
- child: StickyHeader(
- header: Container(
- alignment: Alignment.centerLeft,
- width: double.infinity,
- color: ThemeUtils.getStickyHeaderColor(context),
- padding: const EdgeInsets.only(left: 16.0),
- height: 34.0,
- child: Text('2021/06/0${index + 1}'),
- ),
- content: _buildItem(index),
- ),
- );
- },
+ body: CustomScrollView(
+ slivers: [
+ for (int i = 0; i < 8; i++)
+ _buildGroup(i)
+ ],
),
);
}
-
- Widget _buildItem(int index) {
- final list = List.generate(index + 1, (i) {
- return Container(
+
+ Widget _buildGroup(int index) {
+ return SliverMainAxisGroup(
+ slivers: [
+ SliverPersistentHeader(
+ pinned: true,
+ delegate: SliverAppBarDelegate(
+ Container(
+ alignment: Alignment.centerLeft,
+ width: double.infinity,
+ color: ThemeUtils.getStickyHeaderColor(context),
+ padding: const EdgeInsets.only(left: 16.0),
+ child: Text('2021/06/0${index + 1}'),
+ )
+ , 34.0,
+ ),
+ ),
+ SliverList(
+ delegate: SliverChildBuilderDelegate((_, index) {
+ return _buildItem(index);
+ },
+ childCount: index + 1,
+ ),
+ ),
+ ],
+ );
+ }
+
+ Widget _buildItem(int i) {
+ final Widget content = Stack(
+ children: [
+ Text(i.isEven ? '微信(唯鹿)' : '工商(尾号:4562 李一)'),
+ const Positioned(
+ top: 0.0,
+ right: 0.0,
+ child: Text('-10.00', style: TextStyles.textBold14),
+ ),
+ Positioned(
+ bottom: 0.0,
+ left: 0.0,
+ child: Text(i.isEven ? '12:40:20' : '12:50:20', style: Theme.of(context).textTheme.titleSmall),
+ ),
+ Positioned(
+ bottom: 0.0,
+ right: 0.0,
+ child: Text(
+ i.isEven ? '审核失败' : '待审核',
+ style: i.isEven ? TextStyle(
+ fontSize: Dimens.font_sp12,
+ color: Theme.of(context).colorScheme.error,
+ ) : const TextStyle(
+ fontSize: Dimens.font_sp12,
+ color: Colours.orange,
+ ),
+ ),
+ ),
+ ],
+ );
+
+ return MergeSemantics(
+ child: Container(
height: 72.0,
width: double.infinity,
padding: const EdgeInsets.all(15.0),
@@ -55,41 +97,8 @@ class _WithdrawalRecordListPageState extends State {
bottom: Divider.createBorderSide(context, width: 0.8),
),
),
- child: MergeSemantics(
- child: Stack(
- children: [
- Text(i.isEven ? '微信(唯鹿)' : '工商(尾号:4562 李一)'),
- const Positioned(
- top: 0.0,
- right: 0.0,
- child: Text('-10.00', style: TextStyles.textBold14),
- ),
- Positioned(
- bottom: 0.0,
- left: 0.0,
- child: Text(i.isEven ? '12:40:20' : '12:50:20', style: Theme.of(context).textTheme.subtitle2),
- ),
- Positioned(
- bottom: 0.0,
- right: 0.0,
- child: Text(
- i.isEven ? '审核失败' : '待审核',
- style: i.isEven ? TextStyle(
- fontSize: Dimens.font_sp12,
- color: Theme.of(context).errorColor
- ) : const TextStyle(
- fontSize: Dimens.font_sp12,
- color: Color(0xFFFF8547)
- ),
- ),
- ),
- ],
- ),
- ),
- );
- });
- return Column(
- children: list
+ child: content,
+ ),
);
}
}
diff --git a/lib/account/page/withdrawal_result_page.dart b/lib/account/page/withdrawal_result_page.dart
index 8383a9840..313d62da5 100644
--- a/lib/account/page/withdrawal_result_page.dart
+++ b/lib/account/page/withdrawal_result_page.dart
@@ -1,15 +1,14 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
-import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/load_image.dart';
+import 'package:flutter_deer/widgets/my_app_bar.dart';
import 'package:flutter_deer/widgets/my_button.dart';
/// design/6店铺-账户/index.html#artboard5
class WithdrawalResultPage extends StatefulWidget {
- const WithdrawalResultPage({Key key}) : super(key: key);
+ const WithdrawalResultPage({super.key});
@override
_WithdrawalResultPageState createState() => _WithdrawalResultPageState();
@@ -25,7 +24,6 @@ class _WithdrawalResultPageState extends State {
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
children: [
Gaps.vGap50,
const LoadAssetImage('account/sqsb',
@@ -40,12 +38,12 @@ class _WithdrawalResultPageState extends State {
Gaps.vGap8,
Text(
'2021-02-21 15:20:10',
- style: Theme.of(context).textTheme.subtitle2,
+ style: Theme.of(context).textTheme.titleSmall,
),
Gaps.vGap8,
Text(
'5秒后返回提现页面',
- style: Theme.of(context).textTheme.subtitle2,
+ style: Theme.of(context).textTheme.titleSmall,
),
Gaps.vGap24,
MyButton(
diff --git a/lib/account/widgets/rise_number_text.dart b/lib/account/widgets/rise_number_text.dart
index 1bf2ee3cb..a19e8366e 100644
--- a/lib/account/widgets/rise_number_text.dart
+++ b/lib/account/widgets/rise_number_text.dart
@@ -1,17 +1,16 @@
-
import 'package:flutter/material.dart';
// 简易实现数字滚动效果
class RiseNumberText extends StatefulWidget {
const RiseNumberText(this.number,{
- Key key,
+ super.key,
this.style,
this.duration = 1200
- }): super(key: key);
+ });
final num number;
- final TextStyle style;
+ final TextStyle? style;
final int duration;
@override
@@ -20,8 +19,8 @@ class RiseNumberText extends StatefulWidget {
class _RiseNumberTextState extends State with SingleTickerProviderStateMixin {
- Animation _animation;
- AnimationController _controller;
+ late Animation _animation;
+ late AnimationController _controller;
num _fromNumber = 0;
@override
@@ -46,7 +45,7 @@ class _RiseNumberTextState extends State with SingleTickerProvid
@override
void dispose() {
- _controller?.dispose();
+ _controller.dispose();
super.dispose();
}
@@ -57,12 +56,10 @@ class _RiseNumberTextState extends State with SingleTickerProvid
builder: (_, __) {
// 数字默认从0增长。数据变化时,由之前数字为基础变化。
return Text(
- (_fromNumber + (_animation.value * (widget.number - _fromNumber))).toStringAsFixed(2).toString(),
+ (_fromNumber + (_animation.value * (widget.number - _fromNumber))).toStringAsFixed(2),
style: widget.style,
);
},
);
}
}
-
-
diff --git a/lib/account/widgets/sms_verify_dialog.dart b/lib/account/widgets/sms_verify_dialog.dart
index 70be10395..b6cc15e58 100644
--- a/lib/account/widgets/sms_verify_dialog.dart
+++ b/lib/account/widgets/sms_verify_dialog.dart
@@ -1,4 +1,3 @@
-
import 'dart:async';
import 'package:flutter/material.dart';
@@ -17,7 +16,7 @@ import 'package:flutter_deer/widgets/my_button.dart';
/// 骚操作:借腹生子
class SMSVerifyDialog extends StatefulWidget {
- const SMSVerifyDialog({Key key}) : super(key: key);
+ const SMSVerifyDialog({super.key});
@override
_SMSVerifyDialogState createState() => _SMSVerifyDialogState();
@@ -28,8 +27,8 @@ class _SMSVerifyDialogState extends State {
/// 倒计时秒数
final int _second = 60;
/// 当前秒数
- int _currentSecond;
- StreamSubscription _subscription;
+ late int _currentSecond;
+ StreamSubscription? _subscription;
bool _clickable = true;
final FocusNode _focusNode = FocusNode();
diff --git a/lib/account/widgets/withdrawal_account_item.dart b/lib/account/widgets/withdrawal_account_item.dart
index 11b8d5098..d420cbd06 100644
--- a/lib/account/widgets/withdrawal_account_item.dart
+++ b/lib/account/widgets/withdrawal_account_item.dart
@@ -1,4 +1,3 @@
-
import 'dart:math';
import 'package:flutter/material.dart';
@@ -11,10 +10,10 @@ import 'package:flutter_deer/widgets/load_image.dart';
class WithdrawalAccountItem extends StatefulWidget {
const WithdrawalAccountItem({
- Key key,
- @required this.data,
- this.onLongPress,
- }): super(key: key);
+ super.key,
+ required this.data,
+ required this.onLongPress,
+ });
final WithdrawalAccountModel data;
final GestureLongPressCallback onLongPress;
@@ -26,8 +25,8 @@ class WithdrawalAccountItem extends StatefulWidget {
/// 3D翻转动画 https://medium.com/flutterpub/flutter-flip-card-animation-with-3d-effect-4284af04f5a
class _WithdrawalAccountItemState extends State with SingleTickerProviderStateMixin {
- AnimationController _animationController;
- Animation _animation;
+ late AnimationController _animationController;
+ late Animation _animation;
AnimationStatus _animationStatus = AnimationStatus.dismissed;
@override
@@ -142,10 +141,10 @@ class _WithdrawalAccountItemState extends State with Sing
class AccountCard extends StatefulWidget {
const AccountCard({
- Key key,
- @required this.child,
- this.type
- }): super(key: key);
+ super.key,
+ required this.child,
+ required this.type
+ });
final Widget child;
final int type;
@@ -164,10 +163,9 @@ class _AccountCardState extends State {
borderRadius: BorderRadius.circular(8.0),
boxShadow: context.isDark ? null : [
BoxShadow(
- color: widget.type == 1 ? const Color(0x804EE07A) : const Color(0x805793FA),
+ color: widget.type == 1 ? const Color(0x804EE07A) : Colours.shadow_blue,
offset: const Offset(0.0, 2.0),
blurRadius: 8.0,
- spreadRadius: 0.0,
),
],
gradient: LinearGradient(
diff --git a/lib/account/widgets/withdrawal_password_setting.dart b/lib/account/widgets/withdrawal_password_setting.dart
index 205233ade..149f0eda8 100644
--- a/lib/account/widgets/withdrawal_password_setting.dart
+++ b/lib/account/widgets/withdrawal_password_setting.dart
@@ -1,4 +1,3 @@
-
import 'package:flutter/material.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/routers/fluro_navigator.dart';
@@ -12,7 +11,7 @@ import 'package:vibration/vibration.dart';
/// design/6店铺-账户/index.html#artboard13
class WithdrawalPasswordSetting extends StatefulWidget {
- const WithdrawalPasswordSetting({Key key}) : super(key: key);
+ const WithdrawalPasswordSetting({super.key});
@override
_WithdrawalPasswordSettingState createState() => _WithdrawalPasswordSettingState();
@@ -77,7 +76,7 @@ class _WithdrawalPasswordSettingState extends State {
),
),
Gaps.vGap10,
- Text('提现密码不可为连续、重复的数字。', style: Theme.of(context).textTheme.subtitle2),
+ Text('提现密码不可为连续、重复的数字。', style: Theme.of(context).textTheme.titleSmall),
],
),
),
@@ -124,11 +123,6 @@ class _WithdrawalPasswordSettingState extends State {
return;
}
- /// 点击时给予振动反馈
- if (!Device.isDesktop && await Vibration.hasVibrator()) {
- Vibration.vibrate(duration: 10);
- }
-
if (index == 11) {
if (_index == 0) {
return;
@@ -157,6 +151,11 @@ class _WithdrawalPasswordSettingState extends State {
setState(() {
});
+
+ /// 点击时给予振动反馈
+ if (!Device.isDesktop && await Vibration.hasVibrator()) {
+ Vibration.vibrate(duration: 10);
+ }
},
),
);
diff --git a/lib/demo/demo_page.dart b/lib/demo/demo_page.dart
index e4560ff4a..2751cfb7f 100644
--- a/lib/demo/demo_page.dart
+++ b/lib/demo/demo_page.dart
@@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:flutter_deer/demo/focus/focus_demo_page.dart';
+import 'package:flutter_deer/demo/lottie/lottie_demo.dart';
import 'package:flutter_deer/demo/navigator/books_main.dart';
import 'package:flutter_deer/demo/overlay/overlay_main.dart';
-import 'package:flutter_deer/demo/ripple/home_page.dart';
+import 'package:flutter_deer/demo/ripple/ripples_animation_page.dart';
import 'package:flutter_deer/demo/scratcher/scratch_card_demo_page.dart';
import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/util/app_navigator.dart';
@@ -12,13 +14,23 @@ import 'package:flutter_deer/widgets/my_app_bar.dart';
class DemoPage extends StatefulWidget {
- const DemoPage({Key key}) : super(key: key);
+ const DemoPage({super.key});
@override
_DemoPageState createState() => _DemoPageState();
}
class _DemoPageState extends State {
+
+ @override
+ void initState() {
+ super.initState();
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ /// 显示状态栏和导航栏(使用QuickActions进入demo页)
+ SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]);
+ });
+ }
+
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -38,7 +50,7 @@ class _DemoPageState extends State {
),
ClickItem(
title: 'RipplesAnimation',
- onTap: () => AppNavigator.push(context, const RipplesAnimation()),
+ onTap: () => AppNavigator.push(context, const RipplesAnimationPage()),
),
ClickItem(
title: 'Navigator 2.0',
@@ -48,6 +60,10 @@ class _DemoPageState extends State {
title: 'ScratchCard',
onTap: () => AppNavigator.push(context, const ScratchCardDemoPage()),
),
+ ClickItem(
+ title: 'Lottie',
+ onTap: () => AppNavigator.push(context, const LottieDemo()),
+ ),
],
),
);
diff --git a/lib/demo/focus/focus_demo_page.dart b/lib/demo/focus/focus_demo_page.dart
index d5f694440..3119ca47a 100644
--- a/lib/demo/focus/focus_demo_page.dart
+++ b/lib/demo/focus/focus_demo_page.dart
@@ -5,7 +5,7 @@ import 'package:flutter_deer/util/theme_utils.dart';
/// 博客:https://weilu.blog.csdn.net/article/details/107132031
class FocusDemoPage extends StatefulWidget {
- const FocusDemoPage({Key key, this.title}) : super(key: key);
+ const FocusDemoPage({super.key, required this.title});
final String title;
@@ -26,7 +26,7 @@ class _FocusDemoPageState extends State {
@override
Widget build(BuildContext context) {
- print('${widget.title} build');
+ debugPrint('${widget.title} build');
return Scaffold(
appBar: AppBar(
backgroundColor: context.isDark ? Colours.dark_bg_color : Colors.blue,
diff --git a/lib/demo/lottie/bunny.dart b/lib/demo/lottie/bunny.dart
new file mode 100644
index 000000000..3557ddb71
--- /dev/null
+++ b/lib/demo/lottie/bunny.dart
@@ -0,0 +1,132 @@
+
+import 'package:flutter/material.dart';
+
+class Bunny {
+
+ Bunny(this.controller) {
+ setNeutralState();
+ }
+
+ AnimationController controller;
+
+ /// 各种状态过渡的起始帧数
+ static const List _neutral_to_tracking = [4, 22];
+ static const List _tracking_to_neutral = [0, 0];
+
+ static const List _neutral_to_shy = [29, 39];
+ static const List _shy_to_neutral = [44, 54];
+
+ static const List _neutral_to_peek = [76, 68];
+ static const List _peek_to_neutral = [68, 76];
+
+ static const List _shy_to_peek = [59, 68];
+ static const List _peek_to_shy = [68, 59];
+
+ BunnyState currentState = BunnyState.neutral;
+
+ void setNeutralState() {
+ switch(currentState) {
+ case BunnyState.neutral:
+ return;
+ case BunnyState.tracking:
+ setMinMaxFrame(_tracking_to_neutral);
+ break;
+ case BunnyState.shy:
+ setMinMaxFrame(_shy_to_neutral);
+ break;
+ case BunnyState.peek:
+ setMinMaxFrame(_peek_to_neutral);
+ break;
+ }
+
+ currentState = BunnyState.neutral;
+ }
+
+ void setShyState() {
+ switch(currentState) {
+ case BunnyState.neutral:
+ case BunnyState.tracking:
+ setMinMaxFrame(_neutral_to_shy);
+ break;
+ case BunnyState.shy:
+ return;
+ case BunnyState.peek:
+ setMinMaxFrame(_peek_to_shy);
+ break;
+ }
+
+ currentState = BunnyState.shy;
+ }
+
+ void setPeekState() {
+ switch(currentState) {
+ case BunnyState.neutral:
+ case BunnyState.tracking:
+ setMinMaxFrame(_neutral_to_peek);
+ break;
+ case BunnyState.shy:
+ setMinMaxFrame(_shy_to_peek);
+ break;
+ case BunnyState.peek:
+ return;
+ }
+
+ currentState = BunnyState.peek;
+ }
+
+ void setTrackingState() {
+ switch(currentState) {
+ case BunnyState.neutral:
+ setMinMaxFrame(_tracking_to_neutral);
+ break;
+ case BunnyState.tracking:
+ return;
+ case BunnyState.shy:
+ setMinMaxFrame(_shy_to_neutral);
+ break;
+ case BunnyState.peek:
+ setMinMaxFrame(_peek_to_neutral);
+ break;
+ }
+
+ currentState = BunnyState.tracking;
+ }
+
+ void setEyesPosition(double progress) {
+ if (currentState != BunnyState.tracking) {
+ setMinMaxFrame(_tracking_to_neutral);
+ currentState = BunnyState.tracking;
+ return;
+ }
+ if (progress > 1) {
+ return;
+ }
+
+ final double frame = (_neutral_to_tracking[1] - _neutral_to_tracking[0]) * progress;
+ controller.animateTo(framesToPercentage(frame.toInt() + _neutral_to_tracking[0]), duration: Duration.zero);
+ }
+
+ void setMinMaxFrame(List frames) {
+ /// 移动至起始帧
+ controller.animateTo(framesToPercentage(frames[0]), duration: Duration.zero);
+ /// 动画至结束帧
+ controller.animateTo(framesToPercentage(frames[1]));
+ }
+
+ /// 共77帧。将已知帧数转为百分比
+ double framesToPercentage(int frame) {
+ return frame / 77;
+ }
+
+}
+
+enum BunnyState {
+ /// 默认状态
+ neutral,
+ /// 跟踪(文字输入)
+ tracking,
+ /// 害羞(密码不可见)
+ shy,
+ /// 偷看(密码可见)
+ peek
+}
diff --git a/lib/demo/lottie/lottie_demo.dart b/lib/demo/lottie/lottie_demo.dart
new file mode 100644
index 000000000..f7bdbf02d
--- /dev/null
+++ b/lib/demo/lottie/lottie_demo.dart
@@ -0,0 +1,236 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_deer/demo/lottie/bunny.dart';
+import 'package:lottie/lottie.dart';
+
+/// Android版实现:https://github.com/omarsahl/Flopsy
+/// 感谢Flopsy项目提供的思路及素材
+class LottieDemo extends StatefulWidget {
+
+ const LottieDemo({super.key,});
+
+ @override
+ _LottieDemoState createState() => _LottieDemoState();
+}
+
+const Color _primaryColor = Color(0xFFFFBCBF);
+const Color _backgroundColor = Color(0xFF37474F);
+const Color _textColor = Color(0xFFCCCCCC);
+
+class _LottieDemoState extends State with TickerProviderStateMixin {
+
+ late AnimationController _controller;
+ late Bunny _bunny;
+
+ @override
+ void initState() {
+ super.initState();
+ _controller = AnimationController(vsync: this);
+ _controller.stop();
+ _bunny = Bunny(_controller);
+ }
+
+ @override
+ void dispose() {
+ _controller.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ /// 屏幕宽度减去左右各16的padding,计算出输入框宽度。
+ final double textFieldWidth = MediaQuery.of(context).size.width - 32;
+
+ final Widget content = Scaffold(
+ appBar: AppBar(
+ systemOverlayStyle: SystemUiOverlayStyle.light,
+ backgroundColor: _backgroundColor,
+ title: const Text('Lottie Demo', style: TextStyle(color: _textColor),),
+ iconTheme: const IconThemeData(color: _textColor),
+ ),
+ backgroundColor: _backgroundColor,
+ body: SingleChildScrollView(
+ child: Column(
+ children: [
+ const SizedBox(height: 32.0),
+ Lottie.asset(
+ 'assets/lottie/bunny_new_mouth.json',
+ width: 250,
+ height: 250,
+ controller: _controller,
+ fit: BoxFit.fill,
+ onLoaded: (composition) {
+ setState(() {
+ // 计算帧数 composition.endFrame - composition.startFrame;
+ /// 设置动画时长
+ _controller.duration = composition.duration;
+ });
+ },
+ ),
+ _MyTextField(
+ labelText: 'Email',
+ keyboardType: TextInputType.emailAddress,
+ onHasFocus: (isObscure) {
+ /// 获取焦点,开始文字跟踪状态
+ _bunny.setTrackingState();
+ },
+ onChanged: (text) {
+ /// 计算输入文字宽度占输入框宽度的比例
+ _bunny.setEyesPosition(_getTextSize(text) / textFieldWidth);
+ },
+ ),
+ _MyTextField(
+ labelText: 'Password',
+ keyboardType: TextInputType.visiblePassword,
+ obscureText: true,
+ onHasFocus: (isObscure) {
+ /// 获取焦点,设置状态
+ if (isObscure) {
+ _bunny.setShyState();
+ } else {
+ _bunny.setPeekState();
+ }
+ },
+ onObscureText: (isObscure) {
+ if (isObscure) {
+ _bunny.setShyState();
+ } else {
+ _bunny.setPeekState();
+ }
+ },
+ ),
+ ],
+ ),
+ ),
+ );
+
+ return Theme(
+ data: ThemeData(
+ primaryColor: _primaryColor,
+ textSelectionTheme: TextSelectionThemeData(
+ selectionColor: _primaryColor.withAlpha(70),
+ selectionHandleColor: _primaryColor, // 覆盖`selectionHandleColor`不起作用 https://github.com/flutter/flutter/issues/74890
+ cursorColor: _primaryColor,
+ ),
+ colorScheme: ColorScheme.fromSwatch().copyWith(secondary: _primaryColor),
+ ),
+ child: content,
+ );
+ }
+
+ /// 获取文字宽度
+ double _getTextSize(String text) {
+ final TextPainter textPainter = TextPainter(
+ text: TextSpan(text: text, style: const TextStyle(fontSize: 16.0,)),
+ maxLines: 1,
+ textDirection: TextDirection.ltr,
+ )
+ ..layout();
+ return textPainter.size.width;
+ }
+}
+
+class _MyTextField extends StatefulWidget {
+
+ const _MyTextField({
+ required this.labelText,
+ this.obscureText = false,
+ this.keyboardType,
+ this.onHasFocus,
+ this.onObscureText,
+ this.onChanged
+ });
+
+ final String labelText;
+ final bool obscureText;
+ final TextInputType? keyboardType;
+ /// 获取焦点监听
+ final void Function(bool isObscure)? onHasFocus;
+ /// 密码可见监听
+ final void Function(bool isObscure)? onObscureText;
+ /// 文字输入监听
+ final void Function(String text)? onChanged;
+
+ @override
+ _MyTextFieldState createState() => _MyTextFieldState();
+}
+
+class _MyTextFieldState extends State<_MyTextField> {
+
+ bool _isObscure = true;
+ final FocusNode _focusNode = FocusNode();
+
+ @override
+ void initState() {
+ super.initState();
+ _focusNode.addListener(_refresh);
+ }
+
+ void _refresh() {
+ if (_focusNode.hasFocus && widget.onHasFocus != null) {
+ widget.onHasFocus?.call(_isObscure);
+ }
+ setState(() {
+
+ });
+ }
+
+ @override
+ void dispose() {
+ _focusNode.removeListener(_refresh);
+ _focusNode.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Listener(
+ onPointerDown: (e) => FocusScope.of(context).requestFocus(_focusNode),
+ child: TextField(
+ focusNode: _focusNode,
+ style: const TextStyle(
+ color: _textColor,
+ fontSize: 16.0,
+ ),
+ textInputAction: TextInputAction.next,
+ decoration: InputDecoration(
+ labelText: widget.labelText,
+ labelStyle: TextStyle(
+ color: _focusNode.hasFocus ? _primaryColor : _textColor,
+ ),
+ contentPadding: const EdgeInsets.only(left: 8.0),
+ enabledBorder: const UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: _textColor,
+ ),
+ ),
+ focusedBorder: const UnderlineInputBorder(
+ borderSide: BorderSide(
+ color: _primaryColor,
+ ),
+ ),
+ suffixIcon: widget.obscureText ? IconButton(
+ icon: Icon(
+ _isObscure ? Icons.visibility_off : Icons.visibility,
+ color: _focusNode.hasFocus ? _primaryColor : _textColor,
+ ),
+ onPressed: () {
+ setState(() {
+ _isObscure = !_isObscure;
+ });
+ if (widget.onObscureText != null) {
+ widget.onObscureText?.call(_isObscure);
+ }
+ },
+ ) : null,
+ ),
+ keyboardType: widget.keyboardType,
+ obscureText: widget.obscureText ? _isObscure : widget.obscureText,
+ onChanged: widget.onChanged,
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/demo/navigator/book_entity.dart b/lib/demo/navigator/book_entity.dart
index dfa16e586..3452ca37e 100644
--- a/lib/demo/navigator/book_entity.dart
+++ b/lib/demo/navigator/book_entity.dart
@@ -18,4 +18,4 @@ class BooksDetailsPath extends BookRoutePath {
BooksDetailsPath(this.id);
final int id;
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/books_app_state.dart b/lib/demo/navigator/books_app_state.dart
index cfc2685e1..45f94bd44 100644
--- a/lib/demo/navigator/books_app_state.dart
+++ b/lib/demo/navigator/books_app_state.dart
@@ -5,9 +5,9 @@ class BooksAppState extends ChangeNotifier {
BooksAppState() : _selectedIndex = 0;
- int _selectedIndex;
+ late int _selectedIndex;
- Book _selectedBook;
+ Book? _selectedBook;
final List books = [
Book('Stranger in a Strange Land', 'Robert A. Heinlein'),
@@ -28,9 +28,9 @@ class BooksAppState extends ChangeNotifier {
notifyListeners();
}
- Book get selectedBook => _selectedBook;
+ Book? get selectedBook => _selectedBook;
- set selectedBook(Book book) {
+ set selectedBook(Book? book) {
_selectedBook = book;
notifyListeners();
}
@@ -39,7 +39,7 @@ class BooksAppState extends ChangeNotifier {
if (!books.contains(_selectedBook)) {
return 0;
}
- return books.indexOf(_selectedBook);
+ return books.indexOf(_selectedBook!);
}
void setSelectedBookById(int id) {
@@ -50,4 +50,4 @@ class BooksAppState extends ChangeNotifier {
_selectedBook = books[id];
notifyListeners();
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/books_main.dart b/lib/demo/navigator/books_main.dart
index 0132263e8..f5a64203f 100644
--- a/lib/demo/navigator/books_main.dart
+++ b/lib/demo/navigator/books_main.dart
@@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
-import 'package:flutter_deer/demo/navigator/parser/route_information_parser.dart';
import 'package:flutter_deer/demo/navigator/delegate/router_delegate.dart';
+import 'package:flutter_deer/demo/navigator/parser/route_information_parser.dart';
/// https://gist.github.com/johnpryan/bbca91e23bbb4d39247fa922533be7c9
/// https://weilu.blog.csdn.net/article/details/108902282
class NestedRouterDemo extends StatefulWidget {
- const NestedRouterDemo({Key key}) : super(key: key);
+ const NestedRouterDemo({super.key});
@override
_NestedRouterDemoState createState() => _NestedRouterDemoState();
@@ -25,4 +25,4 @@ class _NestedRouterDemoState extends State {
routeInformationParser: _routeInformationParser,
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/delegate/inner_router_delegate.dart b/lib/demo/navigator/delegate/inner_router_delegate.dart
index 10020a459..f2ebb506a 100644
--- a/lib/demo/navigator/delegate/inner_router_delegate.dart
+++ b/lib/demo/navigator/delegate/inner_router_delegate.dart
@@ -38,7 +38,7 @@ class InnerRouterDelegate extends RouterDelegate
if (appState.selectedBook != null)
MaterialPage(
key: ValueKey(appState.selectedBook),
- child: BookDetailsScreen(book: appState.selectedBook),
+ child: BookDetailsScreen(book: appState.selectedBook!),
),
] else
const FadeAnimationPage(
@@ -69,12 +69,12 @@ class InnerRouterDelegate extends RouterDelegate
class FadeAnimationPage extends Page {
- const FadeAnimationPage({LocalKey key, this.child}) : super(key: key);
+ const FadeAnimationPage({super.key, required this.child});
final Widget child;
@override
- Route createRoute(BuildContext context) {
+ Route createRoute(BuildContext context) {
return PageRouteBuilder(
settings: this,
pageBuilder: (context, animation, animation2) {
diff --git a/lib/demo/navigator/delegate/router_delegate.dart b/lib/demo/navigator/delegate/router_delegate.dart
index 7708b4b42..97661e413 100644
--- a/lib/demo/navigator/delegate/router_delegate.dart
+++ b/lib/demo/navigator/delegate/router_delegate.dart
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
-import 'package:flutter_deer/demo/navigator/screen/app_shell.dart';
import 'package:flutter_deer/demo/navigator/book_entity.dart';
import 'package:flutter_deer/demo/navigator/books_app_state.dart';
+import 'package:flutter_deer/demo/navigator/screen/app_shell.dart';
class BookRouterDelegate extends RouterDelegate
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
@@ -62,4 +62,4 @@ class BookRouterDelegate extends RouterDelegate
appState.setSelectedBookById(configuration.id);
}
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/parser/route_information_parser.dart b/lib/demo/navigator/parser/route_information_parser.dart
index 8814fca38..8475cef2f 100644
--- a/lib/demo/navigator/parser/route_information_parser.dart
+++ b/lib/demo/navigator/parser/route_information_parser.dart
@@ -6,14 +6,14 @@ class BookRouteInformationParser extends RouteInformationParser {
@override
Future parseRouteInformation(
RouteInformation routeInformation) async {
- final uri = Uri.parse(routeInformation.location);
+ final uri = routeInformation.uri;
if (uri.pathSegments.isNotEmpty && uri.pathSegments.first == 'settings') {
return BooksSettingsPath();
} else {
if (uri.pathSegments.length >= 2) {
if (uri.pathSegments[0] == 'book') {
- return BooksDetailsPath(int.tryParse(uri.pathSegments[1]));
+ return BooksDetailsPath(int.tryParse(uri.pathSegments[1])!);
}
}
return BooksListPath();
@@ -21,16 +21,16 @@ class BookRouteInformationParser extends RouteInformationParser {
}
@override
- RouteInformation restoreRouteInformation(BookRoutePath configuration) {
+ RouteInformation? restoreRouteInformation(BookRoutePath configuration) {
if (configuration is BooksListPath) {
- return const RouteInformation(location: '/home');
+ return RouteInformation(uri: Uri.parse('/home'));
}
if (configuration is BooksSettingsPath) {
- return const RouteInformation(location: '/settings');
+ return RouteInformation(uri: Uri.parse('/settings'));
}
if (configuration is BooksDetailsPath) {
- return RouteInformation(location: '/book/${configuration.id}');
+ return RouteInformation(uri: Uri.parse('/book/${configuration.id}'));
}
return null;
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/screen/app_shell.dart b/lib/demo/navigator/screen/app_shell.dart
index 777abcf99..da454c1bf 100644
--- a/lib/demo/navigator/screen/app_shell.dart
+++ b/lib/demo/navigator/screen/app_shell.dart
@@ -6,9 +6,9 @@ import 'package:flutter_deer/demo/navigator/delegate/inner_router_delegate.dart'
class AppShell extends StatefulWidget {
const AppShell({
- Key key,
- @required this.appState,
- }): super(key: key);
+ super.key,
+ required this.appState,
+ });
final BooksAppState appState;
@@ -17,8 +17,8 @@ class AppShell extends StatefulWidget {
}
class _AppShellState extends State {
- InnerRouterDelegate _routerDelegate;
- ChildBackButtonDispatcher _backButtonDispatcher;
+ late InnerRouterDelegate _routerDelegate;
+ late ChildBackButtonDispatcher _backButtonDispatcher;
@override
void initState() {
@@ -37,7 +37,7 @@ class _AppShellState extends State {
super.didChangeDependencies();
// Defer back button dispatching to the child router
_backButtonDispatcher = Router.of(context)
- .backButtonDispatcher
+ .backButtonDispatcher!
.createChildBackButtonDispatcher();
}
@@ -70,4 +70,4 @@ class _AppShellState extends State {
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/screen/book_details_screen.dart b/lib/demo/navigator/screen/book_details_screen.dart
index abe2dd217..1c44aa930 100644
--- a/lib/demo/navigator/screen/book_details_screen.dart
+++ b/lib/demo/navigator/screen/book_details_screen.dart
@@ -4,9 +4,9 @@ import 'package:flutter_deer/demo/navigator/book_entity.dart';
class BookDetailsScreen extends StatelessWidget {
const BookDetailsScreen({
- Key key,
- @required this.book,
- }): super(key: key);
+ super.key,
+ required this.book,
+ });
final Book book;
@@ -24,13 +24,11 @@ class BookDetailsScreen extends StatelessWidget {
},
child: const Text('Back'),
),
- if (book != null) ...[
- Text(book.title, style: Theme.of(context).textTheme.headline6),
- Text(book.author, style: Theme.of(context).textTheme.subtitle1),
- ],
+ Text(book.title, style: Theme.of(context).textTheme.titleLarge),
+ Text(book.author, style: Theme.of(context).textTheme.titleMedium),
],
),
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/screen/books_list_screen.dart b/lib/demo/navigator/screen/books_list_screen.dart
index cde1821f5..d04c11e9b 100644
--- a/lib/demo/navigator/screen/books_list_screen.dart
+++ b/lib/demo/navigator/screen/books_list_screen.dart
@@ -4,10 +4,10 @@ import 'package:flutter_deer/demo/navigator/book_entity.dart';
class BooksListScreen extends StatelessWidget {
const BooksListScreen({
- Key key,
- @required this.books,
- @required this.onTapped,
- }): super(key: key);
+ super.key,
+ required this.books,
+ required this.onTapped,
+ });
final List books;
final ValueChanged onTapped;
@@ -17,7 +17,7 @@ class BooksListScreen extends StatelessWidget {
return Scaffold(
body: ListView(
children: [
- for (var book in books)
+ for (final book in books)
ListTile(
title: Text(book.title),
subtitle: Text(book.author),
@@ -27,4 +27,4 @@ class BooksListScreen extends StatelessWidget {
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/navigator/screen/setting_screen.dart b/lib/demo/navigator/screen/setting_screen.dart
index 564426e09..a8bd4a361 100644
--- a/lib/demo/navigator/screen/setting_screen.dart
+++ b/lib/demo/navigator/screen/setting_screen.dart
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
class SettingsScreen extends StatelessWidget {
- const SettingsScreen({Key key}) : super(key: key);
+ const SettingsScreen({super.key});
@override
Widget build(BuildContext context) {
@@ -12,4 +12,4 @@ class SettingsScreen extends StatelessWidget {
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/overlay/bottom_navigation/my_bottom_navigation_bar.dart b/lib/demo/overlay/bottom_navigation/my_bottom_navigation_bar.dart
index 6dda31afe..06d5a0d15 100644
--- a/lib/demo/overlay/bottom_navigation/my_bottom_navigation_bar.dart
+++ b/lib/demo/overlay/bottom_navigation/my_bottom_navigation_bar.dart
@@ -4,16 +4,16 @@ import 'package:flutter/material.dart';
class MyBottomNavigationBar extends StatefulWidget {
const MyBottomNavigationBar({
- Key key,
+ super.key,
this.selectedPosition = 0,
this.isShowIndicator = true,
- @required this.selectedCallback,
- }) : super(key: key);
+ required this.selectedCallback,
+ });
/// 选中下标
final int selectedPosition;
final bool isShowIndicator;
- final Function(int selectedPosition) selectedCallback;
+ final void Function(int selectedPosition) selectedCallback;
@override
_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
@@ -42,14 +42,14 @@ class _MyBottomNavigationBarState extends State with Tick
double itemWidth = 0;
- AnimationController controller;
- Animation animation;
+ late AnimationController controller;
+ late Animation animation;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
- itemWidth = (context.size.width - barHeight) / 3;
+ itemWidth = (context.size!.width - barHeight) / 3;
setState(() {});
});
@@ -75,7 +75,7 @@ class _MyBottomNavigationBarState extends State with Tick
color: Colors.white,
borderRadius: BorderRadius.circular(barHeight / 2),
boxShadow: const [
- BoxShadow(color: Colors.grey, offset: Offset(0.0, 1.0), blurRadius: 4.0, spreadRadius: 0.0),
+ BoxShadow(color: Colors.grey, offset: Offset(0.0, 1.0), blurRadius: 4.0),
],
),
);
@@ -89,6 +89,8 @@ class _MyBottomNavigationBarState extends State with Tick
if (widget.isShowIndicator) {
/// 指示器
children.add(Positioned(
+ left: 6.0 + animation.value * itemWidth,
+ top: (barHeight - indicatorHeight) / 2,
child: Container(
width: indicatorHeight,
height: indicatorHeight,
@@ -96,12 +98,10 @@ class _MyBottomNavigationBarState extends State with Tick
shape: BoxShape.circle,
color: Colors.white,
boxShadow: [
- BoxShadow(color: Colors.grey, offset: Offset(0.0, 0.0), blurRadius: 1.0, spreadRadius: 0.0),
+ BoxShadow(color: Colors.grey, blurRadius: 1.0),
],
),
),
- left: 6.0 + animation.value * itemWidth,
- top: (barHeight - indicatorHeight) / 2,
));
}
@@ -114,6 +114,7 @@ class _MyBottomNavigationBarState extends State with Tick
);
children.add(Positioned.fromRect(
+ rect: rect,
child: GestureDetector(
child: Container(
decoration: BoxDecoration(
@@ -126,7 +127,6 @@ class _MyBottomNavigationBarState extends State with Tick
_selectedPosition(i);
},
),
- rect: rect,
));
}
@@ -148,9 +148,7 @@ class _MyBottomNavigationBarState extends State with Tick
});
controller.forward(from: 0.0);
- if (widget.selectedCallback != null) {
- widget.selectedCallback(selectedPosition);
- }
+ widget.selectedCallback(selectedPosition);
}
@override
diff --git a/lib/demo/overlay/overlay_main.dart b/lib/demo/overlay/overlay_main.dart
index 0a4ccc380..739ddd3f3 100644
--- a/lib/demo/overlay/overlay_main.dart
+++ b/lib/demo/overlay/overlay_main.dart
@@ -6,7 +6,7 @@ import 'package:flutter_deer/demo/overlay/route/my_navigator_observer.dart';
class OverlayDemo extends StatelessWidget {
- OverlayDemo({Key key}): super(key: key) {
+ OverlayDemo({super.key}) {
Application.navigatorObserver = MyNavigatorObserver();
}
// This widget is the root of your application.
@@ -23,4 +23,4 @@ class OverlayDemo extends StatelessWidget {
],
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/overlay/page/overlay_demo_page.dart b/lib/demo/overlay/page/overlay_demo_page.dart
index 4958b7576..11839c734 100644
--- a/lib/demo/overlay/page/overlay_demo_page.dart
+++ b/lib/demo/overlay/page/overlay_demo_page.dart
@@ -11,7 +11,7 @@ import 'package:flutter_deer/demo/overlay/route/application.dart';
/// 本例包含自定义BottomNavigationBar,路由监听及Overlay悬浮用法。
class OverlayDemoPage extends StatefulWidget {
- const OverlayDemoPage({Key key}) : super(key: key);
+ const OverlayDemoPage({super.key});
@override
_OverlayDemoPageState createState() => _OverlayDemoPageState();
@@ -19,7 +19,7 @@ class OverlayDemoPage extends StatefulWidget {
class _OverlayDemoPageState extends State {
- OverlayEntry _overlayEntry;
+ OverlayEntry? _overlayEntry;
@override
void initState() {
@@ -29,7 +29,7 @@ class _OverlayDemoPageState extends State {
builder: (context) => _buildBottomNavigation(context),
);
/// 添加悬浮
- Overlay.of(context).insert(_overlayEntry);
+ Overlay.of(context).insert(_overlayEntry!);
});
}
@@ -47,7 +47,7 @@ class _OverlayDemoPageState extends State {
appBar: AppBar(
title: const Text('Overlay Demo'),
),
- body: Container(
+ body: ColoredBox(
color: Colors.amber,
child: Center(
child: GestureDetector(
@@ -83,9 +83,10 @@ class _OverlayDemoPageState extends State {
isShowIndicator: Application.navigatorObserver.list.isEmpty,
selectedCallback: (position) {
/// 返回主页
- Application.navigatorObserver.list.forEach((route) {
+ void removeRoute(Route route) {
Navigator.removeRoute(context, route);
- });
+ }
+ Application.navigatorObserver.list.forEach(removeRoute);
/// 手动清空
Application.navigatorObserver.list = [];
},
diff --git a/lib/demo/overlay/page/test_page.dart b/lib/demo/overlay/page/test_page.dart
index 2e33c72aa..851b336c3 100644
--- a/lib/demo/overlay/page/test_page.dart
+++ b/lib/demo/overlay/page/test_page.dart
@@ -4,7 +4,7 @@ import 'package:flutter_deer/demo/widgets/neumorphic.dart';
class TestPage extends StatefulWidget {
- const TestPage({Key key}) : super(key: key);
+ const TestPage({super.key});
@override
_TestPageState createState() => _TestPageState();
@@ -21,7 +21,26 @@ class _TestPageState extends State {
body: Center(
child: NeumorphicContainer(
child: GestureDetector(
- child: const Text('点击跳转', style: TextStyle(fontSize: 18.0, color: Colors.white70),),
+ child: Text(
+ '点击跳转',
+ style: TextStyle(
+ fontSize: 18.0,
+ color: Colors.white,
+ fontWeight: FontWeight.bold,
+ shadows: [
+ const Shadow(
+ offset: Offset(3, 3),
+ color: Colors.black38,
+ blurRadius: 10,
+ ),
+ Shadow(
+ offset: const Offset(-3, -3),
+ color: Colors.white.withOpacity(0.85),
+ blurRadius: 10,
+ )
+ ],
+ ),
+ ),
onTap: () {
Navigator.push(
context,
diff --git a/lib/demo/overlay/route/application.dart b/lib/demo/overlay/route/application.dart
index fbfe84d45..8f584cbc5 100644
--- a/lib/demo/overlay/route/application.dart
+++ b/lib/demo/overlay/route/application.dart
@@ -3,5 +3,5 @@
import 'package:flutter_deer/demo/overlay/route/my_navigator_observer.dart';
class Application {
- static MyNavigatorObserver navigatorObserver;
+ static late MyNavigatorObserver navigatorObserver;
}
diff --git a/lib/demo/overlay/route/my_navigator_observer.dart b/lib/demo/overlay/route/my_navigator_observer.dart
index e778d0255..16b572862 100644
--- a/lib/demo/overlay/route/my_navigator_observer.dart
+++ b/lib/demo/overlay/route/my_navigator_observer.dart
@@ -6,18 +6,18 @@ class MyNavigatorObserver extends NavigatorObserver {
List> list = [];
@override
- void didPush(Route route, Route previousRoute) {
+ void didPush(Route route, Route? previousRoute) {
/// 首页不添加
if (route.settings.name != '/') {
list.add(route);
- print(list.length);
+ debugPrint(list.length.toString());
}
}
@override
- void didPop(Route route, Route previousRoute) {
+ void didPop(Route route, Route? previousRoute) {
list.remove(route);
- print(list.length);
+ debugPrint(list.length.toString());
}
}
diff --git a/lib/demo/ripple/home_page.dart b/lib/demo/ripple/ripples_animation_page.dart
similarity index 87%
rename from lib/demo/ripple/home_page.dart
rename to lib/demo/ripple/ripples_animation_page.dart
index 46103ba8e..1d4fd1ca2 100644
--- a/lib/demo/ripple/home_page.dart
+++ b/lib/demo/ripple/ripples_animation_page.dart
@@ -5,12 +5,12 @@ import 'package:flutter_deer/res/resources.dart';
import 'package:flutter_deer/util/theme_utils.dart';
/// https://medium.com/flutterdevs/ripple-animation-in-flutter-3421cbd66a18
-class RipplesAnimation extends StatefulWidget {
- const RipplesAnimation({
- Key key,
+class RipplesAnimationPage extends StatefulWidget {
+ const RipplesAnimationPage({
+ super.key,
this.size = 80.0,
this.color = Colors.red,
- }) : super(key: key);
+ });
final double size;
final Color color;
@@ -19,9 +19,9 @@ class RipplesAnimation extends StatefulWidget {
_RipplesAnimationState createState() => _RipplesAnimationState();
}
-class _RipplesAnimationState extends State with TickerProviderStateMixin {
+class _RipplesAnimationState extends State with TickerProviderStateMixin {
- AnimationController _controller;
+ late AnimationController _controller;
@override
void initState() {
@@ -47,7 +47,7 @@ class _RipplesAnimationState extends State with TickerProvider
gradient: RadialGradient(
colors: [
widget.color,
- Color.lerp(widget.color, Colors.black, .05)
+ Color.lerp(widget.color, Colors.black, .05)!
],
),
),
@@ -92,19 +92,18 @@ class _RipplesAnimationState extends State with TickerProvider
class CirclePainter extends CustomPainter {
CirclePainter(this._animation, {
- @required this.color,
+ required this.color,
}) : super(repaint: _animation);
final Color color;
final Animation _animation;
void circle(Canvas canvas, Rect rect, double value) {
- final double opacity = (1.0 - (value / 4.0)).clamp(0.0, 1.0) as double;
- final Color _color = color.withOpacity(opacity);
+ final double opacity = (1.0 - (value / 4.0)).clamp(0.0, 1.0);
final double size = rect.width / 2;
final double area = size * size;
final double radius = math.sqrt(area * value / 4);
- final Paint paint = Paint()..color = _color;
+ final Paint paint = Paint()..color = color.withOpacity(opacity);
canvas.drawCircle(rect.center, radius, paint);
}
@@ -129,4 +128,4 @@ class PulsateCurve extends Curve {
}
return math.sin(t * math.pi);
}
-}
\ No newline at end of file
+}
diff --git a/lib/demo/scratcher/scratch_card_demo_page.dart b/lib/demo/scratcher/scratch_card_demo_page.dart
index 316c1f4d5..a84baed5e 100755
--- a/lib/demo/scratcher/scratch_card_demo_page.dart
+++ b/lib/demo/scratcher/scratch_card_demo_page.dart
@@ -8,7 +8,7 @@ import 'package:scratcher/scratcher.dart';
class ScratchCardDemoPage extends StatefulWidget {
- const ScratchCardDemoPage({Key key}) : super(key: key);
+ const ScratchCardDemoPage({super.key});
@override
_ScratchCardDemoPageState createState() => _ScratchCardDemoPageState();
@@ -33,11 +33,11 @@ class _ScratchCardDemoPageState extends State {
brushSize: 20,
threshold: 50,
color: Colors.grey,
- onChange: (value) => print('Scratch progress: ${value.toStringAsFixed(2)}%'),
+ onChange: (value) => debugPrint('Scratch progress: ${value.toStringAsFixed(2)}%'),
onThreshold: () {
/// 这里设置刮开50%,就揭开所有。
- print('Threshold reached!');
- scratchKey.currentState.reveal(
+ debugPrint('Threshold reached!');
+ scratchKey.currentState!.reveal(
duration: const Duration(milliseconds: 1000),
);
},
@@ -56,7 +56,7 @@ class _ScratchCardDemoPageState extends State {
OutlinedButton(
child: const Text('Reset'),
onPressed: () {
- scratchKey.currentState.reset(
+ scratchKey.currentState!.reset(
duration: const Duration(milliseconds: 2000),
);
},
@@ -64,7 +64,7 @@ class _ScratchCardDemoPageState extends State {
ElevatedButton(
child: const Text('Reveal'),
onPressed: () {
- scratchKey.currentState.reveal(
+ scratchKey.currentState!.reveal(
duration: const Duration(milliseconds: 2000),
);
},
diff --git a/lib/demo/widgets/neumorphic.dart b/lib/demo/widgets/neumorphic.dart
index 8babd53c3..7b90c52d9 100644
--- a/lib/demo/widgets/neumorphic.dart
+++ b/lib/demo/widgets/neumorphic.dart
@@ -6,17 +6,16 @@ import 'package:flutter/material.dart';
class NeumorphicContainer extends StatefulWidget {
NeumorphicContainer({
- Key key,
- this.child,
+ super.key,
+ required this.child,
this.bevel = 10.0,
this.color,
- }) : blurOffset = Offset(bevel / 2, bevel / 2),
- super(key: key);
+ }) : blurOffset = Offset(bevel / 2, bevel / 2);
final Widget child;
final double bevel;
final Offset blurOffset;
- final Color color;
+ final Color? color;
@override
_NeumorphicContainerState createState() => _NeumorphicContainerState();
@@ -81,6 +80,6 @@ class _NeumorphicContainerState extends State {
extension ColorUtils on Color {
Color mix(Color another, double amount) {
- return Color.lerp(this, another, amount);
+ return Color.lerp(this, another, amount)!;
}
-}
\ No newline at end of file
+}
diff --git a/lib/generated/json/bank_entity.g.dart b/lib/generated/json/bank_entity.g.dart
new file mode 100644
index 000000000..573b6e9c5
--- /dev/null
+++ b/lib/generated/json/bank_entity.g.dart
@@ -0,0 +1,29 @@
+import 'package:flutter_deer/generated/json/base/json_convert_content.dart';
+import 'package:flutter_deer/account/models/bank_entity.dart';
+import 'package:azlistview/azlistview.dart';
+
+
+BankEntity $BankEntityFromJson(Map json) {
+ final BankEntity bankEntity = BankEntity();
+ final int? id = jsonConvert.convert(json['id']);
+ if (id != null) {
+ bankEntity.id = id;
+ }
+ final String? bankName = jsonConvert.convert(json['bankName']);
+ if (bankName != null) {
+ bankEntity.bankName = bankName;
+ }
+ final String? firstLetter = jsonConvert.convert(json['firstLetter']);
+ if (firstLetter != null) {
+ bankEntity.firstLetter = firstLetter;
+ }
+ return bankEntity;
+}
+
+Map $BankEntityToJson(BankEntity entity) {
+ final Map data = {};
+ data['id'] = entity.id;
+ data['bankName'] = entity.bankName;
+ data['firstLetter'] = entity.firstLetter;
+ return data;
+}
\ No newline at end of file
diff --git a/lib/generated/json/bank_entity_helper.dart b/lib/generated/json/bank_entity_helper.dart
deleted file mode 100644
index 1c451a914..000000000
--- a/lib/generated/json/bank_entity_helper.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-import 'package:flutter_deer/account/models/bank_entity.dart';
-
-bankEntityFromJson(BankEntity data, Map json) {
- if (json['id'] != null) {
- data.id = json['id']?.toInt();
- }
- if (json['bankName'] != null) {
- data.bankName = json['bankName']?.toString();
- }
- if (json['firstLetter'] != null) {
- data.firstLetter = json['firstLetter']?.toString();
- }
- return data;
-}
-
-Map bankEntityToJson(BankEntity entity) {
- final Map data = new Map();
- data['id'] = entity.id;
- data['bankName'] = entity.bankName;
- data['firstLetter'] = entity.firstLetter;
- return data;
-}
\ No newline at end of file
diff --git a/lib/generated/json/base/json_convert_content.dart b/lib/generated/json/base/json_convert_content.dart
index 4529e2655..4ddbc5eff 100644
--- a/lib/generated/json/base/json_convert_content.dart
+++ b/lib/generated/json/base/json_convert_content.dart
@@ -4,76 +4,155 @@
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
import 'package:flutter_deer/account/models/bank_entity.dart';
-import 'package:flutter_deer/generated/json/bank_entity_helper.dart';
+import 'package:flutter_deer/generated/json/bank_entity.g.dart';
import 'package:flutter_deer/account/models/city_entity.dart';
-import 'package:flutter_deer/generated/json/city_entity_helper.dart';
-import 'package:flutter_deer/shop/models/user_entity.dart';
-import 'package:flutter_deer/generated/json/user_entity_helper.dart';
+import 'package:flutter_deer/generated/json/city_entity.g.dart';
+import 'package:flutter_deer/goods/models/goods_sort_entity.dart';
+import 'package:flutter_deer/generated/json/goods_sort_entity.g.dart';
import 'package:flutter_deer/order/models/search_entity.dart';
-import 'package:flutter_deer/generated/json/search_entity_helper.dart';
+import 'package:flutter_deer/generated/json/search_entity.g.dart';
+import 'package:flutter_deer/shop/models/user_entity.dart';
+import 'package:flutter_deer/generated/json/user_entity.g.dart';
-class JsonConvert {
- T fromJson(Map json) {
- return _getFromJson(runtimeType, this, json);
- }
+JsonConvert jsonConvert = JsonConvert();
- Map toJson() {
- return _getToJson(runtimeType, this);
- }
+class JsonConvert {
- static _getFromJson(Type type, data, json) {
- switch (type) { case BankEntity:
- return bankEntityFromJson(data as BankEntity, json) as T; case CityEntity:
- return cityEntityFromJson(data as CityEntity, json) as T; case UserEntity:
- return userEntityFromJson(data as UserEntity, json) as T; case SearchEntity:
- return searchEntityFromJson(data as SearchEntity, json) as T; case SearchItem:
- return searchItemFromJson(data as SearchItem, json) as T; }
- return data as T;
- }
-
- static _getToJson(Type type, data) {
- switch (type) { case BankEntity:
- return bankEntityToJson(data as BankEntity); case CityEntity:
- return cityEntityToJson(data as CityEntity); case UserEntity:
- return userEntityToJson(data as UserEntity); case SearchEntity:
- return searchEntityToJson(data as SearchEntity); case SearchItem:
- return searchItemToJson(data as SearchItem); }
- return data as T;
- }
- //Go back to a single instance by type
- static _fromJsonSingle(String type, json) {
- switch (type) { case 'BankEntity':
- return BankEntity().fromJson(json); case 'CityEntity':
- return CityEntity().fromJson(json); case 'UserEntity':
- return UserEntity().fromJson(json); case 'SearchEntity':
- return SearchEntity().fromJson(json); case 'SearchItem':
- return SearchItem().fromJson(json); }
- return null;
+ T? convert(dynamic value) {
+ if (value == null) {
+ return null;
+ }
+ return asT(value);
}
- //empty list is returned by type
- static _getListFromType(String type) {
- switch (type) { case 'BankEntity':
- return List(); case 'CityEntity':
- return List(); case 'UserEntity':
- return List(); case 'SearchEntity':
- return List(); case 'SearchItem':
- return List(); }
- return null;
+ List? convertList(List? value) {
+ if (value == null) {
+ return null;
+ }
+ try {
+ return value.map((dynamic e) => asT(e)).toList();
+ } catch (e, stackTrace) {
+ print('asT<$T> $e $stackTrace');
+ return [];
+ }
}
- static M fromJsonAsT(json) {
- String type = M.toString();
- if (json is List && type.contains("List<")) {
- String itemType = type.substring(5, type.length - 1);
- List tempList = _getListFromType(itemType);
- json.forEach((itemJson) {
- tempList
- .add(_fromJsonSingle(type.substring(5, type.length - 1), itemJson));
- });
- return tempList as M;
- } else {
- return _fromJsonSingle(M.toString(), json) as M;
+ List? convertListNotNull(dynamic value) {
+ if (value == null) {
+ return null;
+ }
+ try {
+ return (value as List).map((dynamic e) => asT(e)!).toList();
+ } catch (e, stackTrace) {
+ print('asT<$T> $e $stackTrace');
+ return [];
}
}
+ T? asT(dynamic value) {
+ if (value is T) {
+ return value;
+ }
+ final String type = T.toString();
+ try {
+ final String valueS = value.toString();
+ if (type == "String") {
+ return valueS as T;
+ } else if (type == "int") {
+ final int? intValue = int.tryParse(valueS);
+ if (intValue == null) {
+ return double.tryParse(valueS)?.toInt() as T?;
+ } else {
+ return intValue as T;
+ } } else if (type == "double") {
+ return double.parse(valueS) as T;
+ } else if (type == "DateTime") {
+ return DateTime.parse(valueS) as T;
+ } else if (type == "bool") {
+ if (valueS == '0' || valueS == '1') {
+ return (valueS == '1') as T;
+ }
+ return (valueS == 'true') as T;
+ } else {
+ return JsonConvert.fromJsonAsT(value);
+ }
+ } catch (e, stackTrace) {
+ print('asT<$T> $e $stackTrace');
+ return null;
+ }
+ }
+ //Go back to a single instance by type
+ static M? _fromJsonSingle(Map json) {
+ final String type = M.toString();
+ if(type == (BankEntity).toString()){
+ return BankEntity.fromJson(json) as M;
+ }
+ if(type == (CityEntity).toString()){
+ return CityEntity.fromJson(json) as M;
+ }
+ if(type == (GoodsSortEntity).toString()){
+ return GoodsSortEntity.fromJson(json) as M;
+ }
+ if(type == (SearchEntity).toString()){
+ return SearchEntity.fromJson(json) as M;
+ }
+ if(type == (SearchItems).toString()){
+ return SearchItems.fromJson(json) as M;
+ }
+ if(type == (SearchItemsOwner).toString()){
+ return SearchItemsOwner.fromJson(json) as M;
+ }
+ if(type == (SearchItemsLicense).toString()){
+ return SearchItemsLicense.fromJson(json) as M;
+ }
+ if(type == (UserEntity).toString()){
+ return UserEntity.fromJson(json) as M;
+ }
+
+ print("$type not found");
+
+ return null;
+}
+
+ //list is returned by type
+ static M? _getListChildType(List data) {
+ if([] is M){
+ return data.map((e) => BankEntity.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => CityEntity.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => GoodsSortEntity.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => SearchEntity.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => SearchItems.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => SearchItemsOwner.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => SearchItemsLicense.fromJson(e)).toList() as M;
+ }
+ if([] is M){
+ return data.map((e) => UserEntity.fromJson(e)).toList() as M;
+ }
+
+ print("${M.toString()} not found");
+
+ return null;
+}
+
+ static M? fromJsonAsT(dynamic json) {
+ if(json == null){
+ return null;
+ }
+ if (json is List) {
+ return _getListChildType(json);
+ } else {
+ return _fromJsonSingle(json as Map);
+ }
+ }
}
\ No newline at end of file
diff --git a/lib/generated/json/base/json_filed.dart b/lib/generated/json/base/json_field.dart
similarity index 62%
rename from lib/generated/json/base/json_filed.dart
rename to lib/generated/json/base/json_field.dart
index 3c7431347..260ab1421 100644
--- a/lib/generated/json/base/json_filed.dart
+++ b/lib/generated/json/base/json_field.dart
@@ -4,18 +4,19 @@
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
+class JsonSerializable{
+ const JsonSerializable();
+}
+
class JSONField {
//Specify the parse field name
- final String name;
-
- //Specify the time resolution format
- final String format;
+ final String? name;
//Whether to participate in toJson
- final bool serialize;
+ final bool? serialize;
//Whether to participate in fromMap
- final bool deserialize;
+ final bool? deserialize;
- const JSONField({this.name, this.format, this.serialize, this.deserialize});
+ const JSONField({this.name, this.serialize, this.deserialize});
}
diff --git a/lib/generated/json/city_entity.g.dart b/lib/generated/json/city_entity.g.dart
new file mode 100644
index 000000000..b2b1f3530
--- /dev/null
+++ b/lib/generated/json/city_entity.g.dart
@@ -0,0 +1,29 @@
+import 'package:flutter_deer/generated/json/base/json_convert_content.dart';
+import 'package:flutter_deer/account/models/city_entity.dart';
+import 'package:azlistview/azlistview.dart';
+
+
+CityEntity $CityEntityFromJson(Map json) {
+ final CityEntity cityEntity = CityEntity();
+ final String? name = jsonConvert.convert(json['name']);
+ if (name != null) {
+ cityEntity.name = name;
+ }
+ final String? cityCode = jsonConvert.convert(json['cityCode']);
+ if (cityCode != null) {
+ cityEntity.cityCode = cityCode;
+ }
+ final String? firstCharacter = jsonConvert.convert(json['firstCharacter']);
+ if (firstCharacter != null) {
+ cityEntity.firstCharacter = firstCharacter;
+ }
+ return cityEntity;
+}
+
+Map