Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be02ab1830 | ||
|
|
405584f8eb | ||
|
|
b1249f27f5 | ||
|
|
ebdb1609f3 | ||
|
|
db8458be59 | ||
|
|
4374a81915 | ||
|
|
2679205dc3 | ||
|
|
0c1f9464ad | ||
|
|
7a246b3800 | ||
|
|
9fa8046886 | ||
|
|
2c64cf7cf7 | ||
|
|
c6ab7038cd | ||
|
|
8917753830 | ||
|
|
3fe268eb15 | ||
|
|
f12cf0c16f | ||
|
|
c6af6a147f | ||
|
|
71dffd1415 | ||
|
|
4a1d7df82d | ||
|
|
3e0de6f011 | ||
|
|
58de49d1b1 | ||
|
|
c360c21305 | ||
|
|
48e7c91282 | ||
|
|
61e4a4168c | ||
|
|
b6a35756d0 | ||
|
|
2c68c1cf18 | ||
|
|
6424a51e8a | ||
|
|
bef3cd9774 | ||
|
|
f4cd02831c | ||
|
|
745040be2b | ||
|
|
a8de72f190 |
@@ -313,7 +313,8 @@ The packets sent (based on the previous states) are as follows:
|
||||
## Request something (Probably Head Positions)
|
||||
|
||||
```plaintext
|
||||
04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00
|
||||
<!-- 04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00 -->
|
||||
04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00
|
||||
```
|
||||
|
||||
Example packet
|
||||
|
||||
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
report@kavishdevar.me.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
70
CONTRIBUTING.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# Welcome to AirPods Like Normal contributing guide <!-- omit in toc -->
|
||||
|
||||
Thank you for considering a contribution to AirPods Like Normal! Your support helps bring Apple-exclusive AirPods features to Linux and Android.
|
||||
|
||||
Read our [Code of Conduct](./CODE_OF_CONDUCT.md) to keep our community approachable and respectful.
|
||||
|
||||
This guide provides an overview of the contribution workflow, from opening an issue to creating and reviewing a pull request (PR).
|
||||
|
||||
## New contributor guide
|
||||
|
||||
To get an overview of the project, read the [README](./README.md). Here are some resources to help you get started with open-source contributions:
|
||||
|
||||
- [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github)
|
||||
- [Set up Git](https://docs.github.com/en/get-started/getting-started-with-git/set-up-git)
|
||||
- [GitHub flow](https://docs.github.com/en/get-started/using-github/github-flow)
|
||||
- [Collaborating with pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests)
|
||||
|
||||
## Getting started
|
||||
|
||||
To navigate our codebase with confidence, see the [README](./README.md) for setup instructions and usage details. We accept various types of contributions, which don’t always require writing code (like translations).
|
||||
|
||||
To develop for the Android App, Android Studio is the preferred IDE. And you can use any IDE for the linux program, it is just python!
|
||||
|
||||
### Issues
|
||||
|
||||
#### Create a new issue
|
||||
|
||||
If you find a bug or want to suggest a feature, check if an issue already exists by searching through our [existing issues](https://github.com/username/AirPods-Like-Normal/issues). If no relevant issue exists, open a new one and fill in the details.
|
||||
|
||||
#### Solve an issue
|
||||
|
||||
Browse our [issues list](https://github.com/username/AirPods-Like-Normal/issues) to find an interesting issue to work on. Use labels to filter issues and pick one that matches your expertise. If you’d like to work on an issue, open a PR with your solution.
|
||||
|
||||
### Make Changes
|
||||
|
||||
#### Make changes locally
|
||||
|
||||
1. Fork the repository and clone it to your local environment.
|
||||
```
|
||||
git clone https://github.com/your-username/AirPods-Like-Normal.git
|
||||
cd AirPods-Like-Normal
|
||||
```
|
||||
2. Create a working branch to start your changes.
|
||||
```
|
||||
git checkout -b your-feature-branch
|
||||
```
|
||||
3. Make your changes, following the existing style and structure.
|
||||
|
||||
4. Test your changes to ensure they work as expected and do not introduce new issues.
|
||||
|
||||
### Commit your changes
|
||||
|
||||
Commit your changes with a descriptive message.
|
||||
|
||||
### Pull Request
|
||||
|
||||
When your changes are ready, create a pull request (PR):
|
||||
- Fill out the PR template to help reviewers understand your changes.
|
||||
- If your PR is related to an issue, don’t forget to [link your PR to it](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
|
||||
- Enable the checkbox to allow maintainers to edit your PR, so any required changes can be merged easily.
|
||||
|
||||
Once your PR is open, a team member will review it. They may ask questions or request additional information.
|
||||
|
||||
- If changes are requested, apply them in your fork and commit them to the PR branch.
|
||||
- Mark conversations as resolved as you apply feedback.
|
||||
- For merge conflicts, follow this [git tutorial](https://github.com/skills/resolve-merge-conflicts) to resolve them.
|
||||
|
||||
### Your PR is merged!
|
||||
|
||||
Congratulations! :tada: Once merged, your contributions will be publicly available in AirPodsLikeNormal.
|
||||
87
README.md
@@ -1,10 +1,12 @@
|
||||
# ALN - AirPods like Normal
|
||||
*Bringing Apple-only features to Linux and Android for seamless AirPods functionality!*
|
||||
*Access AirPods' Apple-exclusive features on linux and android!*
|
||||
### Check out the packet definitions at [AAP Definitions](/AAP%20Definitions.md)
|
||||
|
||||
## Currently supported device(s)
|
||||
## Tested device(s)
|
||||
- AirPods Pro 2
|
||||
|
||||
Other devices might work too! Features like ear detection and battery should be available for any AirPods! Although the app will show unsupported features/settings! I will not be able test any other devices than the ones I already have (i.e. the AirPods Pro 2).
|
||||
|
||||
## Implemented Features
|
||||
|
||||
| Feature | Linux | Android |
|
||||
@@ -13,9 +15,9 @@
|
||||
| Conversational Awareness | ✅ | ✅ |
|
||||
| Setting Noise Control | ✅ | ✅ |
|
||||
| Battery Level | ✅ | ✅ |
|
||||
| Rename AirPods | ✅ | ❌ |
|
||||
| Rename AirPods | ❌ | ✅ |
|
||||
| Adjust Adaptive Audio | ❌ | ✅ |
|
||||
|
||||
| Loud Sound Reduction | ❌ | ✅ |
|
||||
|
||||
## Linux
|
||||
Check out the README file in [linux](/linux) folder for more info.
|
||||
@@ -27,17 +29,82 @@ This tray app communicates with a daemon with the help of a UNIX socket. The dae
|
||||
|
||||
## Android
|
||||
|
||||
> Currently, there's a [bug on android](https://issuetracker.google.com/issues/371713238) that prevents this from working (psst, go upvote!)
|
||||
Currently, there's a [bug in the Android Bluetooth stack](https://issuetracker.google.com/issues/371713238) that prevents the app from working `(upvote the issue - click the '+1' icon on the top right corner of IssueTracker)`. This repository provides a workaround for the bug, specifically tested on Android 14 and Android 15 (stock versions).
|
||||
|
||||
But once that's fixed, or you have fixed the issue using root, download the APK, and you're off!
|
||||
**This workaround requires root access** to implement and it might not work on other android OEM skins. Try at your own risk!!
|
||||
|
||||
I don't know how to write READMEs for android apps, because they're just that, apps. So, here are two screenshots of the app:
|
||||
### Workaround
|
||||
|
||||

|
||||

|
||||
#### Step 1: Download the Required Files
|
||||
- Go to the [Releases](https://github.com/kavishdevar/aln/releases) section.
|
||||
- Download the required files depending upon your Android version - `bt.sh`, `module.prop`, and `libbluetooth_jni-a14.so` (for android 14) or `libbluetooth_jni-a15.so` (for android 15).
|
||||
|
||||
> Quick Tile to toggle Conversational Awareness and to switch Noise Control modes, and Battery Widget (App and AndroidSystemIntelligence)/Notification coming soon!!
|
||||
#### Step 2: Set Up the Directory Structure
|
||||
|
||||
- Use a file manager with root access (eg. Solid FIle Explorer or MT manager) or a shell (using adb, or a terminal app like Termux) and create a folder structure like this (`upper` and `work` are also folders):
|
||||
|
||||
```
|
||||
/data/local/tmp/overlay:
|
||||
upper
|
||||
work
|
||||
```
|
||||
- Rename the appropriate file to `libbluetooth_jni.so` and place it in the `upper` folder
|
||||
```
|
||||
/data/local/tmp/overlay/upper:
|
||||
libbluetooth_jni.so
|
||||
```
|
||||
- Create a duplicate of the overlay folder inside tmp and name it overlay2.
|
||||
|
||||
#### Step 3: Add the Boot Script
|
||||
|
||||
- Place the `bt.sh` script in `/data/adb/post-fs-data.d/`.
|
||||
- This script ensures the fix is applied during system startup.
|
||||
|
||||
#### Step 4: Create a Magisk Module
|
||||
- Create a `btl2capfix` folder in `/data/adb/modules/` and copy the `module.prop`into the folder.
|
||||
```
|
||||
/data/adb/modules/btl2capfix:
|
||||
module.prop
|
||||
```
|
||||
- Create `system/lib64` under `btl2capfix` and copy the `libbluetooth_jni.so` into `lib64`
|
||||
```
|
||||
/data/adb/modules/btl2capfix/system/lib64:
|
||||
libbluetooth_jni.so
|
||||
```
|
||||
|
||||
#### Step 5: Verify the Fix
|
||||
- Reboot your device.
|
||||
- The Bluetooth bug should now be resolved.
|
||||
|
||||
Once the issue is resolved by Google developers or you've addressed it through the above root-based method, download and install the `app-release.apk` from the releases, and you're good to go!
|
||||
|
||||
### Features
|
||||
|
||||
#### Renaming the Airpods
|
||||
When you rename the Airpods using the app, you'll need to re-pair it with your phone. Currently, user-level apps cannot directly rename a Bluetooth device. After re-pairing, your phone will display the updated name!
|
||||
|
||||
#### Noise Control Modes
|
||||
- Active Noise Cancellation (ANC): Blocks external sounds using microphones and advanced algorithms for an immersive audio experience; ideal for noisy environments.
|
||||
- Transparency Mode: Allows external sounds to blend with audio for situational awareness; best for environments where you need to stay alert.
|
||||
- Off Mode: Disables noise control for a natural listening experience, conserving battery in quiet settings.
|
||||
- Adaptive Transparency: Dynamically reduces sudden loud noises while maintaining environmental awareness, adjusting seamlessly to fluctuating noise levels.
|
||||
|
||||
#### Conversational Awareness
|
||||
Automatically lowers audio volume and enhances voices when you start speaking, making it easier to engage in conversations without removing your AirPods.
|
||||
|
||||
#### Automatic Ear Detection
|
||||
Recognizes when the AirPods are in your ears to automatically play or pause audio and adjust functionality accordingly.
|
||||
|
||||
#### Planned Features
|
||||
Quick Tile to toggle Conversational Awareness and to switch Noise Control modes, and Battery Widget (App and AndroidSystemIntelligence)/Notification coming soon!!
|
||||
|
||||
|
||||
### Screenshots of the app
|
||||
|
||||
| | | |
|
||||
|-------------------|-------------------|-------------------|
|
||||
|  |  |  |
|
||||
|  |  |  |
|
||||
# License
|
||||
|
||||
AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# Android App for ALN
|
||||
|
||||
> Sorry, I don't know how to write READMEs for android apps, because they're just that, apps. So, here are 2 screenshots of the app:
|
||||
|
||||
## Settings Screen
|
||||

|
||||
|
||||
## Debug Screen
|
||||

|
||||
@@ -7,14 +7,14 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "me.kavishdevar.aln"
|
||||
compileSdk = 34
|
||||
compileSdk = 35
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "me.kavishdevar.aln"
|
||||
minSdk = 28
|
||||
targetSdk = 35
|
||||
versionCode = 1
|
||||
versionName = "1.0"
|
||||
versionName = "0.0.2"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@@ -37,6 +37,7 @@ android {
|
||||
}
|
||||
buildFeatures {
|
||||
compose = true
|
||||
viewBinding = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +54,9 @@ dependencies {
|
||||
implementation(libs.androidx.material3)
|
||||
implementation(libs.annotations)
|
||||
implementation(libs.androidx.navigation.compose)
|
||||
implementation(libs.androidx.constraintlayout)
|
||||
implementation(libs.haze)
|
||||
implementation(libs.haze.materials)
|
||||
testImplementation(libs.junit)
|
||||
androidTestImplementation(libs.androidx.junit)
|
||||
androidTestImplementation(libs.androidx.espresso.core)
|
||||
|
||||
@@ -7,31 +7,55 @@
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_PRIVILEGED"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||
android:enableOnBackInvokedCallback="true"
|
||||
android:fullBackupContent="@xml/backup_rules"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.ALN"
|
||||
android:enableOnBackInvokedCallback="true"
|
||||
tools:targetApi="31"
|
||||
tools:ignore="UnusedAttribute">
|
||||
tools:ignore="UnusedAttribute"
|
||||
tools:targetApi="31">
|
||||
<receiver
|
||||
android:name=".BatteryWidget"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/battery_widget_info" />
|
||||
</receiver>
|
||||
|
||||
<activity
|
||||
android:name=".CustomDevice"
|
||||
android:exported="true"
|
||||
android:label="@string/title_activity_custom_device"
|
||||
android:theme="@style/Theme.ALN">
|
||||
<intent-filter>
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/Theme.ALN">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
@@ -42,18 +66,27 @@
|
||||
android:exported="true"
|
||||
android:foregroundServiceType="connectedDevice"
|
||||
android:permission="android.permission.BLUETOOTH_CONNECT" />
|
||||
<service
|
||||
android:name=".AirPodsQSService"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/airpods"
|
||||
android:label="ANC Mode"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<!-- <receiver android:name=".StartupReceiver"-->
|
||||
<!-- android:exported="true">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />-->
|
||||
<!-- <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />-->
|
||||
<!-- <action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" />-->
|
||||
<!-- <action android:name="android.bluetooth.device.action.BOND_STATE_CHANGED" />-->
|
||||
<!-- <action android:name="android.bluetooth.device.action.NAME_CHANGED" />-->
|
||||
<!-- <action android:name="android.intent.action.BOOT_COMPLETED" />-->
|
||||
<!-- <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
<receiver
|
||||
android:name=".BootReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
112
android/app/src/main/java/me/kavishdevar/aln/AirPodsQSService.kt
Normal file
@@ -0,0 +1,112 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.service.quicksettings.Tile
|
||||
import android.service.quicksettings.TileService
|
||||
import android.util.Log
|
||||
|
||||
class AirPodsQSService: TileService() {
|
||||
private val ancModes = listOf(NoiseControlMode.NOISE_CANCELLATION.name, NoiseControlMode.TRANSPARENCY.name, NoiseControlMode.ADAPTIVE.name)
|
||||
private var currentModeIndex = 2
|
||||
private lateinit var ancStatusReceiver: BroadcastReceiver
|
||||
private lateinit var availabilityReceiver: BroadcastReceiver
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
override fun onStartListening() {
|
||||
super.onStartListening()
|
||||
currentModeIndex = (ServiceManager.getService()?.getANC()?.minus(1)) ?: -1
|
||||
if (currentModeIndex == -1) {
|
||||
currentModeIndex = 2
|
||||
}
|
||||
|
||||
if (ServiceManager.getService() == null) {
|
||||
qsTile.state = Tile.STATE_UNAVAILABLE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
if (ServiceManager.getService()?.isConnected == true) {
|
||||
qsTile.state = Tile.STATE_ACTIVE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
else {
|
||||
qsTile.state = Tile.STATE_UNAVAILABLE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
|
||||
ancStatusReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val ancStatus = intent.getIntExtra("data", 4)
|
||||
currentModeIndex = if (ancStatus == 2) 0 else if (ancStatus == 3) 1 else if (ancStatus == 4) 2 else 2
|
||||
updateTile()
|
||||
}
|
||||
}
|
||||
|
||||
availabilityReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
if (intent.action == AirPodsNotifications.AIRPODS_CONNECTED) {
|
||||
qsTile.state = Tile.STATE_ACTIVE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
else if (intent.action == AirPodsNotifications.AIRPODS_DISCONNECTED) {
|
||||
qsTile.state = Tile.STATE_UNAVAILABLE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerReceiver(ancStatusReceiver, IntentFilter(AirPodsNotifications.ANC_DATA), RECEIVER_EXPORTED)
|
||||
|
||||
qsTile.state = if (ServiceManager.getService()?.isConnected == true) Tile.STATE_ACTIVE else Tile.STATE_UNAVAILABLE
|
||||
val ancIndex = ServiceManager.getService()?.getANC()
|
||||
currentModeIndex = if (ancIndex != null) { if (ancIndex == 2) 0 else if (ancIndex == 3) 1 else if (ancIndex == 4) 2 else 2 } else 0
|
||||
updateTile()
|
||||
}
|
||||
|
||||
override fun onStopListening() {
|
||||
super.onStopListening()
|
||||
try {
|
||||
unregisterReceiver(ancStatusReceiver)
|
||||
}
|
||||
catch (
|
||||
_: IllegalArgumentException
|
||||
)
|
||||
{
|
||||
Log.e("QuickSettingTileService", "Receiver not registered")
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(availabilityReceiver)
|
||||
}
|
||||
catch (
|
||||
_: IllegalArgumentException
|
||||
)
|
||||
{
|
||||
Log.e("QuickSettingTileService", "Receiver not registered")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onClick() {
|
||||
super.onClick()
|
||||
Log.d("QuickSettingTileService", "ANC tile clicked")
|
||||
currentModeIndex = (currentModeIndex + 1) % ancModes.size
|
||||
Log.d("QuickSettingTileService", "New mode index: $currentModeIndex, would be set to ${currentModeIndex + 1}")
|
||||
switchAncMode()
|
||||
}
|
||||
|
||||
private fun updateTile() {
|
||||
val currentMode = ancModes[currentModeIndex % ancModes.size]
|
||||
qsTile.label = currentMode.replace("_", " ").lowercase().replaceFirstChar { it.uppercase() }
|
||||
qsTile.state = Tile.STATE_ACTIVE
|
||||
qsTile.updateTile()
|
||||
}
|
||||
|
||||
private fun switchAncMode() {
|
||||
val airPodsService = ServiceManager.getService()
|
||||
Log.d("QuickSettingTileService", "Setting ANC mode to ${currentModeIndex + 2}")
|
||||
airPodsService?.setANCMode(currentModeIndex + 2)
|
||||
Log.d("QuickSettingTileService", "ANC mode set to ${currentModeIndex + 2}")
|
||||
updateTile()
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,6 @@ import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.Service
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothHeadset
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.BluetoothProfile
|
||||
import android.bluetooth.BluetoothSocket
|
||||
@@ -20,23 +19,27 @@ import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.os.ParcelUuid
|
||||
import android.util.Log
|
||||
import android.widget.RemoteViews
|
||||
import androidx.core.app.NotificationCompat
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import org.lsposed.hiddenapibypass.HiddenApiBypass
|
||||
|
||||
private const val VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV = "+IPHONEACCEV"
|
||||
private const val VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL = 1
|
||||
private const val APPLE = 0x004C
|
||||
const val ACTION_BATTERY_LEVEL_CHANGED = "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED"
|
||||
const val EXTRA_BATTERY_LEVEL = "android.bluetooth.device.extra.BATTERY_LEVEL"
|
||||
private const val PACKAGE_ASI = "com.google.android.settings.intelligence"
|
||||
private const val ACTION_ASI_UPDATE_BLUETOOTH_DATA = "batterywidget.impl.action.update_bluetooth_data"
|
||||
//private const val COMPANION_TYPE_NONE = "COMPANION_NONE"
|
||||
//const val VENDOR_RESULT_CODE_COMMAND_ANDROID = "+ANDROID"
|
||||
object ServiceManager {
|
||||
private var service: AirPodsService? = null
|
||||
@Synchronized
|
||||
fun getService(): AirPodsService? {
|
||||
return service
|
||||
}
|
||||
@Synchronized
|
||||
fun setService(service: AirPodsService?) {
|
||||
this.service = service
|
||||
}
|
||||
}
|
||||
|
||||
class AirPodsService : Service() {
|
||||
@Suppress("unused")
|
||||
class AirPodsService: Service() {
|
||||
inner class LocalBinder : Binder() {
|
||||
fun getService(): AirPodsService = this@AirPodsService
|
||||
}
|
||||
@@ -45,41 +48,536 @@ class AirPodsService : Service() {
|
||||
return LocalBinder()
|
||||
}
|
||||
|
||||
var isRunning: Boolean = false
|
||||
private var socket: BluetoothSocket? = null
|
||||
var popupShown = false
|
||||
|
||||
fun showPopup(service: Service, name: String) {
|
||||
if (popupShown) {
|
||||
return
|
||||
}
|
||||
val window = Window(service.applicationContext)
|
||||
window.open(name, batteryNotification)
|
||||
popupShown = true
|
||||
}
|
||||
|
||||
@Suppress("ClassName")
|
||||
private object bluetoothReceiver: BroadcastReceiver() {
|
||||
@SuppressLint("NewApi", "MissingPermission")
|
||||
override fun onReceive(context: Context?, intent: Intent) {
|
||||
val bluetoothDevice =
|
||||
intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE", BluetoothDevice::class.java)
|
||||
val action = intent.action
|
||||
val context = context?.applicationContext
|
||||
val name = context?.getSharedPreferences("settings", MODE_PRIVATE)?.getString("name", bluetoothDevice?.name)
|
||||
if (bluetoothDevice != null && action != null && !action.isEmpty()) {
|
||||
Log.d("AirPodsService", "Received bluetooth connection broadcast")
|
||||
if (BluetoothDevice.ACTION_ACL_CONNECTED == action) {
|
||||
val uuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||
if (bluetoothDevice.uuids.contains(uuid)) {
|
||||
val intent = Intent(AirPodsNotifications.AIRPODS_CONNECTION_DETECTED)
|
||||
intent.putExtra("name", name)
|
||||
intent.putExtra("device", bluetoothDevice)
|
||||
context?.sendBroadcast(intent)
|
||||
}
|
||||
}
|
||||
|
||||
// Airpods disconnected, remove notification but leave the scanner going.
|
||||
if (BluetoothDevice.ACTION_ACL_DISCONNECTED == action
|
||||
|| BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED == action
|
||||
) {
|
||||
context?.sendBroadcast(
|
||||
Intent(AirPodsNotifications.AIRPODS_DISCONNECTED)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isConnected = false
|
||||
var device: BluetoothDevice? = null
|
||||
|
||||
private lateinit var earReceiver: BroadcastReceiver
|
||||
|
||||
fun startForegroundNotification() {
|
||||
val notificationChannel = NotificationChannel(
|
||||
"background_service_status",
|
||||
"Background Service Status",
|
||||
NotificationManager.IMPORTANCE_LOW
|
||||
)
|
||||
val notificationManager = getSystemService(NotificationManager::class.java)
|
||||
notificationManager.createNotificationChannel(notificationChannel)
|
||||
val notification = NotificationCompat.Builder(this, "background_service_status")
|
||||
.setSmallIcon(R.drawable.airpods)
|
||||
.setContentTitle("AirPods Service")
|
||||
.setContentText("Service is running in the background")
|
||||
.setCategory(Notification.CATEGORY_SERVICE)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.build()
|
||||
|
||||
try {
|
||||
startForeground(1, notification)
|
||||
}
|
||||
catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
fun updateNotificationContent(connected: Boolean, airpodsName: String? = null, batteryList: List<Battery>? = null) {
|
||||
val notificationManager = getSystemService(NotificationManager::class.java)
|
||||
val textColor = this.getSharedPreferences("settings", MODE_PRIVATE).getLong("textColor", 0)
|
||||
var updatedNotification: Notification? = null
|
||||
|
||||
if (connected) {
|
||||
val collapsedRemoteViews = RemoteViews(packageName, R.layout.notification)
|
||||
val expandedRemoteViews = RemoteViews(packageName, R.layout.notification_expanded)
|
||||
collapsedRemoteViews.setTextColor(R.id.notification_title, textColor.toInt())
|
||||
|
||||
collapsedRemoteViews.setTextViewText(R.id.notification_title, "Connected to $airpodsName")
|
||||
expandedRemoteViews.setTextViewText(
|
||||
R.id.notification_title,
|
||||
"Connected to $airpodsName"
|
||||
)
|
||||
expandedRemoteViews.setTextViewText(
|
||||
R.id.left_battery_notification,
|
||||
batteryList?.find { it.component == BatteryComponent.LEFT }?.let {
|
||||
if (it.status != BatteryStatus.DISCONNECTED) {
|
||||
"Left ${if (it.status == BatteryStatus.CHARGING) "⚡" else ""} ${it.level}%"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
} ?: "")
|
||||
expandedRemoteViews.setTextViewText(
|
||||
R.id.right_battery_notification,
|
||||
batteryList?.find { it.component == BatteryComponent.RIGHT }?.let {
|
||||
if (it.status != BatteryStatus.DISCONNECTED) {
|
||||
"Right ${if (it.status == BatteryStatus.CHARGING) "⚡" else ""} ${it.level}%"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
} ?: "")
|
||||
expandedRemoteViews.setTextViewText(
|
||||
R.id.case_battery_notification,
|
||||
batteryList?.find { it.component == BatteryComponent.CASE }?.let {
|
||||
if (it.status != BatteryStatus.DISCONNECTED) {
|
||||
"Case ${if (it.status == BatteryStatus.CHARGING) "⚡" else ""} ${it.level}%"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
} ?: "")
|
||||
expandedRemoteViews.setTextColor(R.id.notification_title, textColor.toInt())
|
||||
expandedRemoteViews.setTextColor(R.id.left_battery_notification, textColor.toInt())
|
||||
expandedRemoteViews.setTextColor(R.id.right_battery_notification, textColor.toInt())
|
||||
expandedRemoteViews.setTextColor(R.id.case_battery_notification, textColor.toInt())
|
||||
updatedNotification = NotificationCompat.Builder(this, "background_service_status")
|
||||
.setSmallIcon(R.drawable.airpods)
|
||||
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
|
||||
.setCustomContentView(collapsedRemoteViews)
|
||||
.setCustomBigContentView(expandedRemoteViews)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.setCategory(Notification.CATEGORY_SERVICE)
|
||||
.setOngoing(true)
|
||||
.build()
|
||||
} else {
|
||||
updatedNotification = NotificationCompat.Builder(this, "background_service_status")
|
||||
.setSmallIcon(R.drawable.airpods)
|
||||
.setContentTitle("AirPods Service")
|
||||
.setContentText("Service is running in the background!")
|
||||
.setCategory(Notification.CATEGORY_SERVICE)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.build()
|
||||
}
|
||||
|
||||
// Notify the NotificationManager with the same ID
|
||||
notificationManager.notify(1, updatedNotification)
|
||||
}
|
||||
|
||||
private lateinit var connectionReceiver: BroadcastReceiver
|
||||
private lateinit var disconnectionReceiver: BroadcastReceiver
|
||||
|
||||
@SuppressLint("InlinedApi", "MissingPermission")
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
Log.d("AirPodsService", "Service started")
|
||||
ServiceManager.setService(this)
|
||||
startForegroundNotification()
|
||||
registerReceiver(bluetoothReceiver, BluetoothReceiver.buildFilter(), RECEIVER_EXPORTED)
|
||||
|
||||
connectionReceiver = object: BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent?.action == AirPodsNotifications.AIRPODS_CONNECTION_DETECTED) {
|
||||
val name = this@AirPodsService.getSharedPreferences("settings", MODE_PRIVATE)
|
||||
.getString("name", device?.name)
|
||||
Log.d("AirPodsService", "$name connected")
|
||||
device = intent.getParcelableExtra("device", BluetoothDevice::class.java)!!
|
||||
showPopup(this@AirPodsService, name.toString())
|
||||
connectToSocket(device!!)
|
||||
updateNotificationContent(true, name.toString(), batteryNotification.getBattery())
|
||||
}
|
||||
else if (intent?.action == AirPodsNotifications.AIRPODS_DISCONNECTED) {
|
||||
device = null
|
||||
isConnected = false
|
||||
popupShown = false
|
||||
updateNotificationContent(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val intentFilter = IntentFilter().apply {
|
||||
addAction(AirPodsNotifications.AIRPODS_CONNECTION_DETECTED)
|
||||
addAction(AirPodsNotifications.AIRPODS_DISCONNECTED)
|
||||
}
|
||||
registerReceiver(connectionReceiver, intentFilter, RECEIVER_EXPORTED)
|
||||
|
||||
val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter
|
||||
bluetoothAdapter.bondedDevices.forEach { device ->
|
||||
if (device.uuids.contains(ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a"))) {
|
||||
bluetoothAdapter.getProfileProxy(this, object : BluetoothProfile.ServiceListener {
|
||||
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
if (profile == BluetoothProfile.A2DP) {
|
||||
val connectedDevices = proxy.connectedDevices
|
||||
if (connectedDevices.isNotEmpty()) {
|
||||
connectToSocket(device)
|
||||
this@AirPodsService.sendBroadcast(
|
||||
Intent(AirPodsNotifications.AIRPODS_CONNECTED)
|
||||
)
|
||||
}
|
||||
}
|
||||
bluetoothAdapter.closeProfileProxy(profile, proxy)
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(profile: Int) { }
|
||||
}, BluetoothProfile.A2DP)
|
||||
}
|
||||
}
|
||||
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
private lateinit var socket: BluetoothSocket
|
||||
|
||||
@SuppressLint("MissingPermission", "UnspecifiedRegisterReceiverFlag")
|
||||
fun connectToSocket(device: BluetoothDevice) {
|
||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||
val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||
|
||||
if (isConnected != true) {
|
||||
|
||||
|
||||
try {
|
||||
socket = HiddenApiBypass.newInstance(
|
||||
BluetoothSocket::class.java,
|
||||
3,
|
||||
true,
|
||||
true,
|
||||
device,
|
||||
0x1001,
|
||||
uuid
|
||||
) as BluetoothSocket
|
||||
} catch (
|
||||
e: Exception
|
||||
) {
|
||||
e.printStackTrace()
|
||||
try {
|
||||
socket = HiddenApiBypass.newInstance(
|
||||
BluetoothSocket::class.java,
|
||||
3,
|
||||
1,
|
||||
true,
|
||||
true,
|
||||
device,
|
||||
0x1001,
|
||||
uuid
|
||||
) as BluetoothSocket
|
||||
} catch (
|
||||
e: Exception
|
||||
) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
socket.connect()
|
||||
this@AirPodsService.device = device
|
||||
isConnected = true
|
||||
socket.let { it ->
|
||||
it.outputStream.write(Enums.HANDSHAKE.value)
|
||||
it.outputStream.flush()
|
||||
it.outputStream.write(Enums.SET_SPECIFIC_FEATURES.value)
|
||||
it.outputStream.flush()
|
||||
it.outputStream.write(Enums.REQUEST_NOTIFICATIONS.value)
|
||||
it.outputStream.flush()
|
||||
sendBroadcast(
|
||||
Intent(AirPodsNotifications.AIRPODS_CONNECTED)
|
||||
.putExtra("device", device)
|
||||
)
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
while (socket.isConnected == true) {
|
||||
socket.let {
|
||||
val audioManager =
|
||||
this@AirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager
|
||||
MediaController.initialize(audioManager)
|
||||
val buffer = ByteArray(1024)
|
||||
val bytesRead = it.inputStream.read(buffer)
|
||||
var data: ByteArray = byteArrayOf()
|
||||
if (bytesRead > 0) {
|
||||
data = buffer.copyOfRange(0, bytesRead)
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DATA).apply {
|
||||
putExtra("data", buffer.copyOfRange(0, bytesRead))
|
||||
})
|
||||
val bytes = buffer.copyOfRange(0, bytesRead)
|
||||
val formattedHex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||
Log.d("AirPods Data", "Data received: $formattedHex")
|
||||
} else if (bytesRead == -1) {
|
||||
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
||||
// socket.close()
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
return@launch
|
||||
}
|
||||
var inEar = false
|
||||
var inEarData = listOf<Boolean>()
|
||||
if (earDetectionNotification.isEarDetectionData(data)) {
|
||||
earDetectionNotification.setStatus(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.EAR_DETECTION_DATA).apply {
|
||||
val list = earDetectionNotification.status
|
||||
val bytes = ByteArray(2)
|
||||
bytes[0] = list[0]
|
||||
bytes[1] = list[1]
|
||||
putExtra("data", bytes)
|
||||
})
|
||||
Log.d(
|
||||
"AirPods Parser",
|
||||
"Ear Detection: ${earDetectionNotification.status[0]} ${earDetectionNotification.status[1]}"
|
||||
)
|
||||
var justEnabledA2dp = false
|
||||
earReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val data = intent.getByteArrayExtra("data")
|
||||
if (data != null && earDetectionEnabled) {
|
||||
inEar =
|
||||
if (data.find { it == 0x02.toByte() } != null || data.find { it == 0x03.toByte() } != null) {
|
||||
data[0] == 0x00.toByte() || data[1] == 0x00.toByte()
|
||||
} else {
|
||||
data[0] == 0x00.toByte() && data[1] == 0x00.toByte()
|
||||
}
|
||||
|
||||
val newInEarData = listOf(
|
||||
data[0] == 0x00.toByte(),
|
||||
data[1] == 0x00.toByte()
|
||||
)
|
||||
if (newInEarData.contains(true) && inEarData == listOf(
|
||||
false,
|
||||
false
|
||||
)
|
||||
) {
|
||||
connectAudio(this@AirPodsService, device)
|
||||
justEnabledA2dp = true
|
||||
val bluetoothAdapter =
|
||||
this@AirPodsService.getSystemService(
|
||||
BluetoothManager::class.java
|
||||
).adapter
|
||||
bluetoothAdapter.getProfileProxy(
|
||||
this@AirPodsService,
|
||||
object : BluetoothProfile.ServiceListener {
|
||||
override fun onServiceConnected(
|
||||
profile: Int,
|
||||
proxy: BluetoothProfile
|
||||
) {
|
||||
if (profile == BluetoothProfile.A2DP) {
|
||||
val connectedDevices =
|
||||
proxy.connectedDevices
|
||||
if (connectedDevices.isNotEmpty()) {
|
||||
MediaController.sendPlay()
|
||||
}
|
||||
}
|
||||
bluetoothAdapter.closeProfileProxy(
|
||||
profile,
|
||||
proxy
|
||||
)
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(
|
||||
profile: Int
|
||||
) {
|
||||
}
|
||||
},
|
||||
BluetoothProfile.A2DP
|
||||
)
|
||||
|
||||
} else if (newInEarData == listOf(false, false)) {
|
||||
disconnectAudio(this@AirPodsService, device)
|
||||
}
|
||||
|
||||
inEarData = newInEarData
|
||||
|
||||
if (inEar == true) {
|
||||
if (!justEnabledA2dp) {
|
||||
justEnabledA2dp = false
|
||||
MediaController.sendPlay()
|
||||
}
|
||||
} else {
|
||||
MediaController.sendPause()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val earIntentFilter =
|
||||
IntentFilter(AirPodsNotifications.EAR_DETECTION_DATA)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
this@AirPodsService.registerReceiver(
|
||||
earReceiver, earIntentFilter,
|
||||
RECEIVER_EXPORTED
|
||||
)
|
||||
} else {
|
||||
this@AirPodsService.registerReceiver(
|
||||
earReceiver,
|
||||
earIntentFilter
|
||||
)
|
||||
}
|
||||
} else if (ancNotification.isANCData(data)) {
|
||||
ancNotification.setStatus(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.ANC_DATA).apply {
|
||||
putExtra("data", ancNotification.status)
|
||||
})
|
||||
Log.d("AirPods Parser", "ANC: ${ancNotification.status}")
|
||||
} else if (batteryNotification.isBatteryData(data)) {
|
||||
batteryNotification.setBattery(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.BATTERY_DATA).apply {
|
||||
putParcelableArrayListExtra(
|
||||
"data",
|
||||
ArrayList(batteryNotification.getBattery())
|
||||
)
|
||||
})
|
||||
updateNotificationContent(
|
||||
true,
|
||||
this@AirPodsService.getSharedPreferences(
|
||||
"settings",
|
||||
MODE_PRIVATE
|
||||
).getString("name", device.name),
|
||||
batteryNotification.getBattery()
|
||||
)
|
||||
for (battery in batteryNotification.getBattery()) {
|
||||
Log.d(
|
||||
"AirPods Parser",
|
||||
"${battery.getComponentName()}: ${battery.getStatusName()} at ${battery.level}% "
|
||||
)
|
||||
}
|
||||
if (batteryNotification.getBattery()[0].status == 1 && batteryNotification.getBattery()[1].status == 1) {
|
||||
disconnectAudio(this@AirPodsService, device)
|
||||
} else {
|
||||
connectAudio(this@AirPodsService, device)
|
||||
}
|
||||
} else if (conversationAwarenessNotification.isConversationalAwarenessData(
|
||||
data
|
||||
)
|
||||
) {
|
||||
conversationAwarenessNotification.setData(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.CA_DATA).apply {
|
||||
putExtra("data", conversationAwarenessNotification.status)
|
||||
})
|
||||
|
||||
|
||||
if (conversationAwarenessNotification.status == 1.toByte() || conversationAwarenessNotification.status == 2.toByte()) {
|
||||
MediaController.startSpeaking()
|
||||
} else if (conversationAwarenessNotification.status == 8.toByte() || conversationAwarenessNotification.status == 9.toByte()) {
|
||||
MediaController.stopSpeaking()
|
||||
}
|
||||
|
||||
Log.d(
|
||||
"AirPods Parser",
|
||||
"Conversation Awareness: ${conversationAwarenessNotification.status}"
|
||||
)
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
Log.d("AirPods Service", "Socket closed")
|
||||
isConnected = false
|
||||
socket.close()
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
Log.d("AirPodsService", "Failed to connect to socket")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun sendPacket(packet: String) {
|
||||
val fromHex = packet.split(" ").map { it.toInt(16).toByte() }
|
||||
socket?.outputStream?.write(fromHex.toByteArray())
|
||||
socket?.outputStream?.flush()
|
||||
socket.outputStream?.write(fromHex.toByteArray())
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setANCMode(mode: Int) {
|
||||
when (mode) {
|
||||
1 -> {
|
||||
socket?.outputStream?.write(Enums.NOISE_CANCELLATION_OFF.value)
|
||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_OFF.value)
|
||||
}
|
||||
2 -> {
|
||||
socket?.outputStream?.write(Enums.NOISE_CANCELLATION_ON.value)
|
||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_ON.value)
|
||||
}
|
||||
3 -> {
|
||||
socket?.outputStream?.write(Enums.NOISE_CANCELLATION_TRANSPARENCY.value)
|
||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_TRANSPARENCY.value)
|
||||
}
|
||||
4 -> {
|
||||
socket?.outputStream?.write(Enums.NOISE_CANCELLATION_ADAPTIVE.value)
|
||||
socket.outputStream?.write(Enums.NOISE_CANCELLATION_ADAPTIVE.value)
|
||||
}
|
||||
}
|
||||
socket?.outputStream?.flush()
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setCAEnabled(enabled: Boolean) {
|
||||
socket?.outputStream?.write(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value)
|
||||
socket.outputStream?.write(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setOffListeningMode(enabled: Boolean) {
|
||||
socket.outputStream?.write(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00))
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setAdaptiveStrength(strength: Int) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2E, strength.toByte(), 0x00, 0x00, 0x00)
|
||||
socket?.outputStream?.write(bytes)
|
||||
socket?.outputStream?.flush()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setPressSpeed(speed: Int) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x17, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setPressAndHoldDuration(speed: Int) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x18, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setNoiseCancellationWithOnePod(enabled: Boolean) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1B, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setVolumeControl(enabled: Boolean) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x25, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setVolumeSwipeSpeed(speed: Int) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x23, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setToneVolume(volume: Int) {
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1F, volume.toByte(), 0x50, 0x00, 0x00)
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
val earDetectionNotification = AirPodsNotifications.EarDetection()
|
||||
@@ -91,8 +589,8 @@ class AirPodsService : Service() {
|
||||
|
||||
fun setCaseChargingSounds(enabled: Boolean) {
|
||||
val bytes = byteArrayOf(0x12, 0x3a, 0x00, 0x01, 0x00, 0x08, if (enabled) 0x00 else 0x01)
|
||||
socket?.outputStream?.write(bytes)
|
||||
socket?.outputStream?.flush()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
fun setEarDetection(enabled: Boolean) {
|
||||
@@ -106,30 +604,6 @@ class AirPodsService : Service() {
|
||||
fun getANC(): Int {
|
||||
return ancNotification.status
|
||||
}
|
||||
//
|
||||
// private fun buildBatteryText(battery: List<Battery>): String {
|
||||
// val left = battery[0]
|
||||
// val right = battery[1]
|
||||
// val case = battery[2]
|
||||
//
|
||||
// return "Left: ${left.level}% ${left.getStatusName()}, Right: ${right.level}% ${right.getStatusName()}, Case: ${case.level}% ${case.getStatusName()}"
|
||||
// }
|
||||
|
||||
private fun createNotification(): Notification {
|
||||
val channelId = "battery"
|
||||
val notificationBuilder = NotificationCompat.Builder(this, channelId)
|
||||
.setSmallIcon(R.drawable.pro_2_buds)
|
||||
.setContentTitle("AirPods Connected")
|
||||
.setOngoing(true)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
|
||||
val channel =
|
||||
NotificationChannel(channelId, "Battery Notification", NotificationManager.IMPORTANCE_LOW)
|
||||
|
||||
val notificationManager = getSystemService(NotificationManager::class.java)
|
||||
notificationManager.createNotificationChannel(channel)
|
||||
return notificationBuilder.build()
|
||||
}
|
||||
|
||||
fun disconnectAudio(context: Context, device: BluetoothDevice?) {
|
||||
val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
||||
@@ -207,270 +681,56 @@ class AirPodsService : Service() {
|
||||
}, BluetoothProfile.HEADSET)
|
||||
}
|
||||
|
||||
fun updatePodsStatus(device: BluetoothDevice, batteryList: List<Battery>) {
|
||||
var batteryUnified = 0
|
||||
var batteryUnifiedArg = 0
|
||||
|
||||
// Handle each Battery object from batteryList
|
||||
// batteryList.forEach { battery ->
|
||||
// when (battery.getComponentName()) {
|
||||
// "LEFT" -> {
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 10, battery.level.toString().toByteArray())
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 13, battery.getStatusName()?.uppercase()?.toByteArray())
|
||||
// }
|
||||
// "RIGHT" -> {
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 11, battery.level.toString().toByteArray())
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 14, battery.getStatusName()?.uppercase()?.toByteArray())
|
||||
// }
|
||||
// "CASE" -> {
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 12, battery.level.toString().toByteArray())
|
||||
// HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "setMetadata", 15, battery.getStatusName()?.uppercase()?.toByteArray())
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// Sending broadcast for battery update
|
||||
broadcastVendorSpecificEventIntent(
|
||||
VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV,
|
||||
APPLE,
|
||||
BluetoothHeadset.AT_CMD_TYPE_SET,
|
||||
batteryUnified,
|
||||
batteryUnifiedArg,
|
||||
device
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("SameParameterValue")
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun broadcastVendorSpecificEventIntent(
|
||||
command: String,
|
||||
companyId: Int,
|
||||
commandType: Int,
|
||||
batteryUnified: Int,
|
||||
batteryUnifiedArg: Int,
|
||||
device: BluetoothDevice
|
||||
) {
|
||||
val arguments = arrayOf(
|
||||
1, // Number of key(IndicatorType)/value pairs
|
||||
VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL, // IndicatorType: Battery Level
|
||||
batteryUnifiedArg // Battery Level
|
||||
)
|
||||
|
||||
val intent = Intent(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT).apply {
|
||||
putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD, command)
|
||||
putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE, commandType)
|
||||
putExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS, arguments)
|
||||
putExtra(BluetoothDevice.EXTRA_DEVICE, device)
|
||||
putExtra(BluetoothDevice.EXTRA_NAME, device.name)
|
||||
addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "." + companyId.toString())
|
||||
}
|
||||
sendBroadcast(intent)
|
||||
|
||||
val batteryIntent = Intent(ACTION_BATTERY_LEVEL_CHANGED).apply {
|
||||
putExtra(BluetoothDevice.EXTRA_DEVICE, device)
|
||||
putExtra(EXTRA_BATTERY_LEVEL, batteryUnified)
|
||||
}
|
||||
sendBroadcast(batteryIntent)
|
||||
|
||||
val statusIntent = Intent(ACTION_ASI_UPDATE_BLUETOOTH_DATA).setPackage(PACKAGE_ASI).apply {
|
||||
putExtra(ACTION_BATTERY_LEVEL_CHANGED, intent)
|
||||
}
|
||||
sendBroadcast(statusIntent)
|
||||
}
|
||||
|
||||
|
||||
fun setName(name: String) {
|
||||
val nameBytes = name.toByteArray()
|
||||
val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x01,
|
||||
nameBytes.size.toByte(), 0x00) + nameBytes
|
||||
socket?.outputStream?.write(bytes)
|
||||
socket?.outputStream?.flush()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
val hex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||
Log.d("AirPodsService", "setName: $name, sent packet: $hex")
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission", "InlinedApi")
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
fun setPVEnabled(enabled: Boolean) {
|
||||
var hex = "04 00 04 00 09 00 26 ${if (enabled) "01" else "02"} 00 00 00"
|
||||
var bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
hex = "04 00 04 00 17 00 00 00 10 00 12 00 08 E${if (enabled) "6" else "5"} 05 10 02 42 0B 08 50 10 02 1A 05 02 ${if (enabled) "32" else "00"} 00 00 00"
|
||||
bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
val notification = createNotification()
|
||||
startForeground(1, notification)
|
||||
|
||||
if (isRunning) {
|
||||
return START_STICKY
|
||||
}
|
||||
isRunning = true
|
||||
|
||||
@Suppress("DEPRECATION") val device = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) intent?.getParcelableExtra("device", BluetoothDevice::class.java) else intent?.getParcelableExtra("device")
|
||||
|
||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||
val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||
|
||||
socket = HiddenApiBypass.newInstance(BluetoothSocket::class.java, 3, true, true, device, 0x1001, uuid) as BluetoothSocket?
|
||||
try {
|
||||
socket?.connect()
|
||||
socket?.let { it ->
|
||||
it.outputStream.write(Enums.HANDSHAKE.value)
|
||||
it.outputStream.write(Enums.SET_SPECIFIC_FEATURES.value)
|
||||
it.outputStream.write(Enums.REQUEST_NOTIFICATIONS.value)
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_CONNECTED))
|
||||
it.outputStream.flush()
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
while (socket?.isConnected == true) {
|
||||
socket?.let {
|
||||
val audioManager = this@AirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager
|
||||
MediaController.initialize(audioManager)
|
||||
val buffer = ByteArray(1024)
|
||||
val bytesRead = it.inputStream.read(buffer)
|
||||
var data: ByteArray = byteArrayOf()
|
||||
if (bytesRead > 0) {
|
||||
data = buffer.copyOfRange(0, bytesRead)
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DATA).apply {
|
||||
putExtra("data", buffer.copyOfRange(0, bytesRead))
|
||||
})
|
||||
val bytes = buffer.copyOfRange(0, bytesRead)
|
||||
val formattedHex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||
Log.d("AirPods Data", "Data received: $formattedHex")
|
||||
}
|
||||
else if (bytesRead == -1) {
|
||||
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
||||
this@AirPodsService.stopForeground(STOP_FOREGROUND_REMOVE)
|
||||
socket?.close()
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
return@launch
|
||||
}
|
||||
var inEar = false
|
||||
var inEarData = listOf<Boolean>()
|
||||
if (earDetectionNotification.isEarDetectionData(data)) {
|
||||
earDetectionNotification.setStatus(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.EAR_DETECTION_DATA).apply {
|
||||
val list = earDetectionNotification.status
|
||||
val bytes = ByteArray(2)
|
||||
bytes[0] = list[0]
|
||||
bytes[1] = list[1]
|
||||
putExtra("data", bytes)
|
||||
})
|
||||
Log.d("AirPods Parser", "Ear Detection: ${earDetectionNotification.status[0]} ${earDetectionNotification.status[1]}")
|
||||
var justEnabledA2dp = false
|
||||
val earReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val data = intent.getByteArrayExtra("data")
|
||||
if (data != null && earDetectionEnabled) {
|
||||
inEar = if (data.find { it == 0x02.toByte() } != null || data.find { it == 0x03.toByte() } != null) {
|
||||
data[0] == 0x00.toByte() || data[1] == 0x00.toByte()
|
||||
} else {
|
||||
data[0] == 0x00.toByte() && data[1] == 0x00.toByte()
|
||||
}
|
||||
|
||||
val newInEarData = listOf(data[0] == 0x00.toByte(), data[1] == 0x00.toByte())
|
||||
if (newInEarData.contains(true) && inEarData == listOf(false, false)) {
|
||||
connectAudio(this@AirPodsService, device)
|
||||
justEnabledA2dp = true
|
||||
val bluetoothAdapter = this@AirPodsService.getSystemService(BluetoothManager::class.java).adapter
|
||||
bluetoothAdapter.getProfileProxy(
|
||||
this@AirPodsService, object : BluetoothProfile.ServiceListener {
|
||||
override fun onServiceConnected(
|
||||
profile: Int,
|
||||
proxy: BluetoothProfile
|
||||
) {
|
||||
if (profile == BluetoothProfile.A2DP) {
|
||||
val connectedDevices =
|
||||
proxy.connectedDevices
|
||||
if (connectedDevices.isNotEmpty()) {
|
||||
MediaController.sendPlay()
|
||||
}
|
||||
}
|
||||
bluetoothAdapter.closeProfileProxy(
|
||||
profile,
|
||||
proxy
|
||||
)
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(
|
||||
profile: Int
|
||||
) {
|
||||
}
|
||||
}
|
||||
,BluetoothProfile.A2DP
|
||||
)
|
||||
|
||||
}
|
||||
else if (newInEarData == listOf(false, false)){
|
||||
disconnectAudio(this@AirPodsService, device)
|
||||
}
|
||||
|
||||
inEarData = newInEarData
|
||||
|
||||
if (inEar == true) {
|
||||
if (!justEnabledA2dp) {
|
||||
justEnabledA2dp = false
|
||||
MediaController.sendPlay()
|
||||
}
|
||||
} else {
|
||||
MediaController.sendPause()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val earIntentFilter = IntentFilter(AirPodsNotifications.EAR_DETECTION_DATA)
|
||||
this@AirPodsService.registerReceiver(earReceiver, earIntentFilter,
|
||||
RECEIVER_EXPORTED
|
||||
)
|
||||
}
|
||||
else if (ancNotification.isANCData(data)) {
|
||||
ancNotification.setStatus(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.ANC_DATA).apply {
|
||||
putExtra("data", ancNotification.status)
|
||||
})
|
||||
Log.d("AirPods Parser", "ANC: ${ancNotification.status}")
|
||||
}
|
||||
else if (batteryNotification.isBatteryData(data)) {
|
||||
batteryNotification.setBattery(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.BATTERY_DATA).apply {
|
||||
putParcelableArrayListExtra("data", ArrayList(batteryNotification.getBattery()))
|
||||
})
|
||||
for (battery in batteryNotification.getBattery()) {
|
||||
Log.d("AirPods Parser", "${battery.getComponentName()}: ${battery.getStatusName()} at ${battery.level}% ")
|
||||
}
|
||||
// updatePodsStatus(device!!, batteryNotification.getBattery())
|
||||
}
|
||||
else if (conversationAwarenessNotification.isConversationalAwarenessData(data)) {
|
||||
conversationAwarenessNotification.setData(data)
|
||||
sendBroadcast(Intent(AirPodsNotifications.CA_DATA).apply {
|
||||
putExtra("data", conversationAwarenessNotification.status)
|
||||
})
|
||||
|
||||
|
||||
if (conversationAwarenessNotification.status == 1.toByte() || conversationAwarenessNotification.status == 2.toByte()) {
|
||||
MediaController.startSpeaking()
|
||||
} else if (conversationAwarenessNotification.status == 8.toByte() || conversationAwarenessNotification.status == 9.toByte()) {
|
||||
MediaController.stopSpeaking()
|
||||
}
|
||||
|
||||
Log.d("AirPods Parser", "Conversation Awareness: ${conversationAwarenessNotification.status}")
|
||||
}
|
||||
else { }
|
||||
}
|
||||
}
|
||||
Log.d("AirPods Service", "Socket closed")
|
||||
isRunning = false
|
||||
this@AirPodsService.stopForeground(STOP_FOREGROUND_REMOVE)
|
||||
socket?.close()
|
||||
sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e: Exception) {
|
||||
Log.e("AirPodsSettingsScreen", "Error connecting to device: ${e.message}")
|
||||
}
|
||||
return START_STICKY
|
||||
fun setLoudSoundReduction(enabled: Boolean) {
|
||||
val hex = "52 1B 00 0${if (enabled) "1" else "0"}"
|
||||
val bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
socket.outputStream?.write(bytes)
|
||||
socket.outputStream?.flush()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
Log.d("AirPodsService", "Service stopped is being destroyed for some reason!")
|
||||
try {
|
||||
unregisterReceiver(bluetoothReceiver)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(connectionReceiver)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(disconnectionReceiver)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(earReceiver)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
super.onDestroy()
|
||||
socket?.close()
|
||||
isRunning = false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.appwidget.AppWidgetProvider
|
||||
import android.content.Context
|
||||
import android.widget.RemoteViews
|
||||
|
||||
/**
|
||||
* Implementation of App Widget functionality.
|
||||
*/
|
||||
class BatteryWidget : AppWidgetProvider() {
|
||||
override fun onUpdate(
|
||||
context: Context,
|
||||
appWidgetManager: AppWidgetManager,
|
||||
appWidgetIds: IntArray
|
||||
) {
|
||||
// There may be multiple widgets active, so update all of them
|
||||
for (appWidgetId in appWidgetIds) {
|
||||
updateAppWidget(context, appWidgetManager, appWidgetId)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onEnabled(context: Context) {
|
||||
// Enter relevant functionality for when the first widget is created
|
||||
}
|
||||
|
||||
override fun onDisabled(context: Context) {
|
||||
// Enter relevant functionality for when the last widget is disabled
|
||||
}
|
||||
}
|
||||
|
||||
internal fun updateAppWidget(
|
||||
context: Context,
|
||||
appWidgetManager: AppWidgetManager,
|
||||
appWidgetId: Int
|
||||
) {
|
||||
val widgetText = context.getString(R.string.appwidget_text)
|
||||
// Construct the RemoteViews object
|
||||
val views = RemoteViews(context.packageName, R.layout.battery_widget)
|
||||
views.setTextViewText(R.id.appwidget_text, widgetText)
|
||||
|
||||
// Instruct the widget manager to update the widget
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
14
android/app/src/main/java/me/kavishdevar/aln/BootReceiver.kt
Normal file
@@ -0,0 +1,14 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
|
||||
class BootReceiver: BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
when (intent?.action) {
|
||||
Intent.ACTION_MY_PACKAGE_REPLACED -> try { context?.startForegroundService(Intent(context, AirPodsService::class.java)) } catch (e: Exception) { e.printStackTrace() }
|
||||
Intent.ACTION_BOOT_COMPLETED -> try { context?.startForegroundService(Intent(context, AirPodsService::class.java)) } catch (e: Exception) { e.printStackTrace() }
|
||||
}
|
||||
}
|
||||
}
|
||||
164
android/app/src/main/java/me/kavishdevar/aln/CustomDevice.kt
Normal file
@@ -0,0 +1,164 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothDevice.TRANSPORT_LE
|
||||
import android.bluetooth.BluetoothGatt
|
||||
import android.bluetooth.BluetoothGattCallback
|
||||
import android.bluetooth.BluetoothGattCharacteristic
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import me.kavishdevar.aln.ui.theme.ALNTheme
|
||||
import org.lsposed.hiddenapibypass.HiddenApiBypass
|
||||
import java.util.UUID
|
||||
|
||||
class CustomDevice : ComponentActivity() {
|
||||
@SuppressLint("MissingPermission", "CoroutineCreationDuringComposition", "NewApi")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
setContent {
|
||||
ALNTheme {
|
||||
val connect = remember { mutableStateOf(false) }
|
||||
Scaffold(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
topBar = {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalArrangement = Arrangement.Center,
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Text("Custom Device", style = MaterialTheme.typography.titleLarge)
|
||||
}
|
||||
}
|
||||
) { innerPadding ->
|
||||
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||
val manager = getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
|
||||
// val device: BluetoothDevice = manager.adapter.getRemoteDevice("EC:D6:F4:3D:89:B8")
|
||||
val device: BluetoothDevice = manager.adapter.getRemoteDevice("DE:F4:C6:A3:CD:7A")
|
||||
// val socket = device.createInsecureL2capChannel(31)
|
||||
|
||||
val batteryLevel = remember { mutableStateOf("") }
|
||||
// socket.outputStream.write(byteArrayOf(0x12,0x3B,0x00,0x02, 0x00))
|
||||
// socket.outputStream.write(byteArrayOf(0x12, 0x3A, 0x00, 0x01, 0x00, 0x08,0x01))
|
||||
|
||||
val gatt = device.connectGatt(this, true, object: BluetoothGattCallback() {
|
||||
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
// Step 2: Iterate through the services and characteristics
|
||||
gatt.services.forEach { service ->
|
||||
Log.d("GATT", "Service UUID: ${service.uuid}")
|
||||
service.characteristics.forEach { characteristic ->
|
||||
characteristic.descriptors.forEach { descriptor ->
|
||||
Log.d("GATT", " Descriptor UUID: ${descriptor.uuid}: ${gatt.readDescriptor(descriptor)}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
|
||||
if (newState == BluetoothGatt.STATE_CONNECTED) {
|
||||
Log.d("GATT", "Connected to GATT server")
|
||||
gatt.discoverServices() // Discover services after connection
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCharacteristicWrite(
|
||||
gatt: BluetoothGatt,
|
||||
characteristic: BluetoothGattCharacteristic,
|
||||
status: Int
|
||||
) {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
Log.d("BLE", "Write successful for UUID: ${characteristic.uuid}")
|
||||
} else {
|
||||
Log.e("BLE", "Write failed for UUID: ${characteristic.uuid}, status: $status")
|
||||
}
|
||||
}
|
||||
}, TRANSPORT_LE, 1)
|
||||
|
||||
if (connect.value) {
|
||||
try {
|
||||
gatt.connect()
|
||||
}
|
||||
catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
connect.value = false
|
||||
}
|
||||
|
||||
Column (
|
||||
modifier = Modifier.padding(innerPadding),
|
||||
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||
)
|
||||
{
|
||||
Button(
|
||||
onClick = { connect.value = true }
|
||||
)
|
||||
{
|
||||
Text("Connect")
|
||||
}
|
||||
|
||||
Button(onClick = {
|
||||
// val characteristicUuid = "4f860002-943b-49ef-bed4-2f730304427a"
|
||||
// val value = byteArrayOf(0x01, 0x00, 0x02)
|
||||
|
||||
// sendWriteRequest(gatt, characteristicUuid, value)
|
||||
|
||||
}) {
|
||||
Text("batteryLevel.value")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission", "NewApi")
|
||||
fun sendWriteRequest(
|
||||
gatt: BluetoothGatt,
|
||||
characteristicUuid: String,
|
||||
value: ByteArray
|
||||
) {
|
||||
// Retrieve the service containing the characteristic
|
||||
val service = gatt.services.find { service ->
|
||||
service.characteristics.any { it.uuid.toString() == characteristicUuid }
|
||||
}
|
||||
|
||||
if (service == null) {
|
||||
Log.e("GATT", "Service containing characteristic UUID $characteristicUuid not found.")
|
||||
return
|
||||
}
|
||||
|
||||
// Retrieve the characteristic
|
||||
val characteristic = service.getCharacteristic(UUID.fromString(characteristicUuid))
|
||||
if (characteristic == null) {
|
||||
Log.e("GATT", "Characteristic with UUID $characteristicUuid not found.")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
// Send the write request
|
||||
val success = gatt.writeCharacteristic(characteristic, value, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT)
|
||||
Log.d("GATT", "Write request sent $success to UUID: $characteristicUuid")
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
@file:OptIn(ExperimentalHazeMaterialsApi::class)
|
||||
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
@@ -15,8 +18,10 @@ import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
@@ -35,6 +40,7 @@ import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.material3.TextFieldDefaults
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
@@ -51,10 +57,21 @@ import androidx.compose.ui.text.input.TextFieldValue
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.navigation.NavController
|
||||
import dev.chrisbanes.haze.HazeState
|
||||
import dev.chrisbanes.haze.haze
|
||||
import dev.chrisbanes.haze.hazeChild
|
||||
import dev.chrisbanes.haze.materials.CupertinoMaterials
|
||||
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
|
||||
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
|
||||
@Composable
|
||||
fun DebugScreen(navController: NavController) {
|
||||
val hazeState = remember { HazeState() }
|
||||
val text = remember { mutableStateListOf<String>("Log Start") }
|
||||
val context = LocalContext.current
|
||||
val listState = rememberLazyListState()
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
@@ -65,22 +82,32 @@ fun DebugScreen(navController: NavController) {
|
||||
}) {
|
||||
Icon(Icons.AutoMirrored.Filled.ArrowBack, null)
|
||||
}
|
||||
}
|
||||
},
|
||||
modifier = Modifier
|
||||
.hazeChild(
|
||||
state = hazeState,
|
||||
style = CupertinoMaterials.thin(),
|
||||
block = {
|
||||
alpha = if (listState.firstVisibleItemIndex > 0) {
|
||||
1f
|
||||
} else {
|
||||
0f
|
||||
}
|
||||
}
|
||||
),
|
||||
colors = TopAppBarDefaults.topAppBarColors(
|
||||
containerColor = Color.Transparent
|
||||
)
|
||||
)
|
||||
},
|
||||
containerColor = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color(0xFF000000)
|
||||
else Color(0xFFF2F2F7),
|
||||
) { paddingValues ->
|
||||
|
||||
val text = remember { mutableStateListOf<String>("Log Start") }
|
||||
val context = LocalContext.current
|
||||
val listState = rememberLazyListState()
|
||||
|
||||
val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val data = intent.getByteArrayExtra("data")
|
||||
data?.let {
|
||||
text.add(">" + it.joinToString(" ") { byte -> "%02X".format(byte) }) // Use ">" for received packets
|
||||
text.add(">" + it.joinToString(" ") { byte -> "%02X".format(byte) })
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,12 +124,12 @@ fun DebugScreen(navController: NavController) {
|
||||
listState.animateScrollToItem(text.size - 1)
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(paddingValues)
|
||||
.imePadding(), // Ensures padding for keyboard visibility
|
||||
.imePadding()
|
||||
.haze(hazeState)
|
||||
.padding(top = 0.dp)
|
||||
) {
|
||||
LazyColumn(
|
||||
state = listState,
|
||||
@@ -113,7 +140,12 @@ fun DebugScreen(navController: NavController) {
|
||||
items(text.size) { index ->
|
||||
val message = text[index]
|
||||
val isSent = message.startsWith(">")
|
||||
val backgroundColor = if (isSent) Color(0xFFE1FFC7) else Color(0xFFD1D1D1)
|
||||
val backgroundColor =
|
||||
if (isSent) Color(0xFFE1FFC7) else Color(0xFFD1D1D1)
|
||||
|
||||
if (message == "Log Start") {
|
||||
Spacer(modifier = Modifier.height(115.dp))
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
@@ -132,11 +164,13 @@ fun DebugScreen(navController: NavController) {
|
||||
}
|
||||
|
||||
Text(
|
||||
text = if (isSent) message.substring(1) else message, // Remove the ">" from sent packets
|
||||
text = if (isSent) message.substring(1) else message,
|
||||
fontFamily = FontFamily(Font(R.font.hack)),
|
||||
color = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color(0xFF000000)
|
||||
color = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color(
|
||||
0xFF000000
|
||||
)
|
||||
else Color(0xFF000000),
|
||||
modifier = Modifier.weight(1f) // Allows text to take available space
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
|
||||
if (isSent) {
|
||||
@@ -147,6 +181,7 @@ fun DebugScreen(navController: NavController) {
|
||||
}
|
||||
}
|
||||
)
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
||||
|
||||
val serviceConnection = object : ServiceConnection {
|
||||
@@ -177,13 +212,14 @@ fun DebugScreen(navController: NavController) {
|
||||
label = { Text("Packet") },
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 8.dp), // Padding for the input field
|
||||
.padding(horizontal = 8.dp)
|
||||
.padding(bottom = 5.dp),
|
||||
trailingIcon = {
|
||||
IconButton(
|
||||
onClick = {
|
||||
airPodsService.value?.sendPacket(packet.value.text)
|
||||
text.add(packet.value.text) // Add sent message directly without prefix
|
||||
packet.value = TextFieldValue("") // Clear input field after sending
|
||||
text.add(packet.value.text)
|
||||
packet.value = TextFieldValue("")
|
||||
}
|
||||
) {
|
||||
@Suppress("DEPRECATION")
|
||||
|
||||
@@ -1,20 +1,14 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothManager
|
||||
import android.bluetooth.BluetoothProfile
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.ServiceConnection
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.IBinder
|
||||
import android.os.ParcelUuid
|
||||
import android.util.Log
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
@@ -23,245 +17,171 @@ import androidx.compose.animation.core.tween
|
||||
import androidx.compose.animation.slideInHorizontally
|
||||
import androidx.compose.animation.slideOutHorizontally
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.CenterAlignedTopAppBar
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.luminance
|
||||
import androidx.compose.ui.graphics.toArgb
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.tooling.preview.PreviewLightDark
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.content.ContextCompat.getSystemService
|
||||
import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
||||
import com.google.accompanist.permissions.isGranted
|
||||
import com.google.accompanist.permissions.rememberPermissionState
|
||||
import com.google.accompanist.permissions.shouldShowRationale
|
||||
import com.google.accompanist.permissions.rememberMultiplePermissionsState
|
||||
import me.kavishdevar.aln.ui.theme.ALNTheme
|
||||
|
||||
lateinit var serviceConnection: ServiceConnection
|
||||
lateinit var connectionStatusReceiver: BroadcastReceiver
|
||||
|
||||
@ExperimentalMaterial3Api
|
||||
class MainActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
setContent {
|
||||
val topAppBarTitle = remember { mutableStateOf("AirPods Pro") }
|
||||
ALNTheme {
|
||||
Scaffold (
|
||||
containerColor = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color(
|
||||
0xFF000000
|
||||
) else Color(
|
||||
0xFFF2F2F7
|
||||
),
|
||||
topBar = {
|
||||
CenterAlignedTopAppBar(
|
||||
title = {
|
||||
Text(
|
||||
text = topAppBarTitle.value,
|
||||
color = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color.White else Color.Black,
|
||||
)
|
||||
},
|
||||
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
|
||||
containerColor = if (MaterialTheme.colorScheme.surface.luminance() < 0.5) Color(
|
||||
0xFF000000
|
||||
) else Color(
|
||||
0xFFF2F2F7
|
||||
),
|
||||
)
|
||||
)
|
||||
}
|
||||
) { innerPadding ->
|
||||
Main(innerPadding, topAppBarTitle)
|
||||
}
|
||||
getSharedPreferences("settings", MODE_PRIVATE).edit().putLong("textColor",
|
||||
MaterialTheme.colorScheme.onSurface.toArgb().toLong()).apply()
|
||||
Main()
|
||||
startService(Intent(this, AirPodsService::class.java))
|
||||
}
|
||||
}
|
||||
}
|
||||
override fun onDestroy() {
|
||||
try {
|
||||
unbindService(serviceConnection)
|
||||
Log.d("MainActivity", "Unbound service")
|
||||
} catch (e: Exception) {
|
||||
Log.e("MainActivity", "Error while unbinding service: $e")
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(connectionStatusReceiver)
|
||||
Log.d("MainActivity", "Unregistered receiver")
|
||||
} catch (e: Exception) {
|
||||
Log.e("MainActivity", "Error while unregistering receiver: $e")
|
||||
}
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
try {
|
||||
unbindService(serviceConnection)
|
||||
Log.d("MainActivity", "Unbound service")
|
||||
} catch (e: Exception) {
|
||||
Log.e("MainActivity", "Error while unbinding service: $e")
|
||||
}
|
||||
try {
|
||||
unregisterReceiver(connectionStatusReceiver)
|
||||
Log.d("MainActivity", "Unregistered receiver")
|
||||
} catch (e: Exception) {
|
||||
Log.e("MainActivity", "Error while unregistering receiver: $e")
|
||||
}
|
||||
super.onStop()
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
@SuppressLint("MissingPermission", "InlinedApi")
|
||||
@OptIn(ExperimentalPermissionsApi::class)
|
||||
@Composable
|
||||
fun Main(paddingValues: PaddingValues, topAppBarTitle: MutableState<String>) {
|
||||
val bluetoothConnectPermissionState = rememberPermissionState(
|
||||
permission = "android.permission.BLUETOOTH_CONNECT"
|
||||
fun Main() {
|
||||
val isConnected = remember { mutableStateOf(false) }
|
||||
val permissionState = rememberMultiplePermissionsState(
|
||||
permissions = listOf(
|
||||
"android.permission.BLUETOOTH_CONNECT",
|
||||
"android.permission.POST_NOTIFICATIONS"
|
||||
)
|
||||
)
|
||||
|
||||
if (bluetoothConnectPermissionState.status.isGranted) {
|
||||
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
||||
if (permissionState.allPermissionsGranted) {
|
||||
val context = LocalContext.current
|
||||
val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||
val bluetoothManager = getSystemService(context, BluetoothManager::class.java)
|
||||
val bluetoothAdapter = bluetoothManager?.adapter
|
||||
val airpodsDevice = remember { mutableStateOf<BluetoothDevice?>(null) }
|
||||
val airPodsService = remember { mutableStateOf<AirPodsService?>(null) }
|
||||
val navController = rememberNavController()
|
||||
|
||||
val disconnectReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
navController.navigate("notConnected")
|
||||
}
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
context.registerReceiver(disconnectReceiver, IntentFilter(AirPodsNotifications.AIRPODS_DISCONNECTED),
|
||||
Context.RECEIVER_NOT_EXPORTED)
|
||||
}
|
||||
|
||||
// Service connection for AirPodsService
|
||||
val serviceConnection = object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName, service: IBinder) {
|
||||
val binder = service as AirPodsService.LocalBinder
|
||||
airPodsService.value = binder.getService()
|
||||
Log.d("AirPodsService", "Service connected")
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(name: ComponentName) {
|
||||
airPodsService.value = null
|
||||
}
|
||||
}
|
||||
|
||||
// Function to check if AirPods are connected
|
||||
fun checkIfAirPodsConnected() {
|
||||
val devices = bluetoothAdapter?.bondedDevices
|
||||
devices?.forEach { device ->
|
||||
if (device.uuids.contains(uuid)) {
|
||||
bluetoothAdapter.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
if (profile == BluetoothProfile.A2DP) {
|
||||
val connectedDevices = proxy.connectedDevices
|
||||
if (connectedDevices.isNotEmpty()) {
|
||||
airpodsDevice.value = device
|
||||
val sharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
topAppBarTitle.value = sharedPreferences.getString("name", device.name) ?: device.name
|
||||
// Start AirPods service if not running
|
||||
if (context.getSystemService(AirPodsService::class.java)?.isRunning != true) {
|
||||
context.startService(Intent(context, AirPodsService::class.java).apply {
|
||||
putExtra("device", device)
|
||||
})
|
||||
context.bindService(Intent(context, AirPodsService::class.java), serviceConnection, Context.BIND_AUTO_CREATE)
|
||||
}
|
||||
} else {
|
||||
airpodsDevice.value = null
|
||||
}
|
||||
}
|
||||
bluetoothAdapter.closeProfileProxy(profile, proxy)
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(profile: Int) {}
|
||||
}, BluetoothProfile.A2DP)
|
||||
connectionStatusReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
if (intent.action == AirPodsNotifications.AIRPODS_CONNECTED) {
|
||||
Log.d("MainActivity", "AirPods Connected intent received")
|
||||
isConnected.value = true
|
||||
}
|
||||
else if (intent.action == AirPodsNotifications.AIRPODS_DISCONNECTED) {
|
||||
Log.d("MainActivity", "AirPods Disconnected intent received")
|
||||
isConnected.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BroadcastReceiver to listen for connection state changes
|
||||
val bluetoothReceiver = remember {
|
||||
object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
val action = intent?.action
|
||||
val device = intent?.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
|
||||
if (action == BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED) {
|
||||
when (intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, -1)) {
|
||||
BluetoothAdapter.STATE_CONNECTED -> {
|
||||
if (device?.uuids?.contains(uuid) == true) {
|
||||
airpodsDevice.value = device
|
||||
checkIfAirPodsConnected()
|
||||
}
|
||||
}
|
||||
BluetoothAdapter.STATE_DISCONNECTED -> {
|
||||
if (device?.uuids?.contains(uuid) == true) {
|
||||
airpodsDevice.value = null
|
||||
// Show not connected screen when AirPods disconnect
|
||||
navController.navigate("notConnected")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
val filter = IntentFilter().apply {
|
||||
addAction(AirPodsNotifications.AIRPODS_CONNECTED)
|
||||
addAction(AirPodsNotifications.AIRPODS_DISCONNECTED)
|
||||
addAction(AirPodsNotifications.AIRPODS_CONNECTION_DETECTED)
|
||||
}
|
||||
Log.d("MainActivity", "Registering Receiver")
|
||||
context.registerReceiver(connectionStatusReceiver, filter, Context.RECEIVER_EXPORTED)
|
||||
Log.d("MainActivity", "Registered Receiver")
|
||||
|
||||
// Register the receiver in LaunchedEffect
|
||||
LaunchedEffect(Unit) {
|
||||
val filter = IntentFilter().apply {
|
||||
addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
context.registerReceiver(bluetoothReceiver, filter, Context.RECEIVER_NOT_EXPORTED)
|
||||
}
|
||||
|
||||
// Initial check for AirPods connection
|
||||
checkIfAirPodsConnected()
|
||||
}
|
||||
|
||||
// UI logic
|
||||
NavHost(
|
||||
navController = navController,
|
||||
startDestination = "notConnected",
|
||||
startDestination = "settings",
|
||||
enterTransition = { slideInHorizontally(initialOffsetX = { it }, animationSpec = tween(300)) },
|
||||
exitTransition = { slideOutHorizontally(targetOffsetX = { -it }, animationSpec = tween(300)) },
|
||||
popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }, animationSpec = tween(300)) },
|
||||
popExitTransition = { slideOutHorizontally(targetOffsetX = { it }, animationSpec = tween(300)) }
|
||||
) {
|
||||
composable("notConnected") {
|
||||
Text("Not Connected...")
|
||||
}
|
||||
composable("settings") {
|
||||
AirPodsSettingsScreen(
|
||||
paddingValues,
|
||||
airpodsDevice.value,
|
||||
service = airPodsService.value,
|
||||
navController = navController
|
||||
)
|
||||
if (airPodsService.value != null) {
|
||||
AirPodsSettingsScreen(
|
||||
dev = airPodsService.value?.device,
|
||||
service = airPodsService.value!!,
|
||||
navController = navController,
|
||||
isConnected = isConnected.value
|
||||
)
|
||||
}
|
||||
}
|
||||
composable("debug") {
|
||||
DebugScreen(navController = navController)
|
||||
}
|
||||
}
|
||||
|
||||
// Automatically navigate to settings screen if AirPods are connected
|
||||
if (airpodsDevice.value != null) {
|
||||
LaunchedEffect(Unit) {
|
||||
navController.navigate("settings") {
|
||||
popUpTo("notConnected") { inclusive = true }
|
||||
serviceConnection = remember {
|
||||
object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
|
||||
val binder = service as AirPodsService.LocalBinder
|
||||
airPodsService.value = binder.getService()
|
||||
}
|
||||
|
||||
override fun onServiceDisconnected(name: ComponentName?) {
|
||||
airPodsService.value = null
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Text("No AirPods connected")
|
||||
}
|
||||
|
||||
context.bindService(Intent(context, AirPodsService::class.java), serviceConnection, Context.BIND_AUTO_CREATE)
|
||||
|
||||
if (airPodsService.value?.isConnected == true) {
|
||||
isConnected.value = true
|
||||
}
|
||||
} else {
|
||||
// Permission is not granted, request it
|
||||
Column (
|
||||
modifier = Modifier.padding(24.dp),
|
||||
){
|
||||
val textToShow = if (bluetoothConnectPermissionState.status.shouldShowRationale) {
|
||||
val textToShow = if (permissionState.shouldShowRationale) {
|
||||
// If the user has denied the permission but not permanently, explain why it's needed.
|
||||
"The BLUETOOTH_CONNECT permission is important for this app. Please grant it to proceed."
|
||||
"Please enable Bluetooth and Notification permissions to use the app. The Nearby Devices is required to connect to your AirPods, and the notification is required to show the AirPods battery status."
|
||||
} else {
|
||||
// If the user has permanently denied the permission, inform them to enable it in settings.
|
||||
"BLUETOOTH_CONNECT permission required for this feature. Please enable it in settings."
|
||||
"Please enable Bluetooth and Notification permissions in the app settings to use the app."
|
||||
}
|
||||
Text(textToShow)
|
||||
Button(onClick = { bluetoothConnectPermissionState.launchPermissionRequest() }) {
|
||||
Button(onClick = { permissionState.launchMultiplePermissionRequest() }) {
|
||||
Text("Request permission")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@PreviewLightDark
|
||||
@Composable
|
||||
fun PreviewAirPodsSettingsScreen() {
|
||||
AirPodsSettingsScreen(paddingValues = PaddingValues(0.dp), device = null, service = null, navController = rememberNavController())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
//@file:Suppress("unused")
|
||||
//
|
||||
//package me.kavishdevar.aln
|
||||
//
|
||||
//import android.annotation.SuppressLint
|
||||
//import android.app.Notification
|
||||
//import android.app.NotificationChannel
|
||||
//import android.app.NotificationManager
|
||||
//import android.app.Service
|
||||
//import android.bluetooth.BluetoothDevice
|
||||
//import android.bluetooth.BluetoothManager
|
||||
//import android.bluetooth.BluetoothProfile
|
||||
//import android.bluetooth.BluetoothSocket
|
||||
//import android.content.BroadcastReceiver
|
||||
//import android.content.Context
|
||||
//import android.content.Intent
|
||||
//import android.content.IntentFilter
|
||||
//import android.media.AudioManager
|
||||
//import android.os.Binder
|
||||
//import android.os.Build
|
||||
//import android.os.IBinder
|
||||
//import android.os.ParcelUuid
|
||||
//import android.util.Log
|
||||
//import androidx.core.app.NotificationCompat
|
||||
//import kotlinx.coroutines.CoroutineScope
|
||||
//import kotlinx.coroutines.Dispatchers
|
||||
//import kotlinx.coroutines.launch
|
||||
//import org.lsposed.hiddenapibypass.HiddenApiBypass
|
||||
//
|
||||
//object ServiceManager {
|
||||
// private var service: OldAirPodsService? = null
|
||||
// @Synchronized
|
||||
// fun getService(): OldAirPodsService? {
|
||||
// return service
|
||||
// }
|
||||
// @Synchronized
|
||||
// fun setService(service: OldAirPodsService?) {
|
||||
// this.service = service
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//class OldAirPodsService : Service() {
|
||||
// inner class LocalBinder : Binder() {
|
||||
// fun getService(): OldAirPodsService = this@OldAirPodsService
|
||||
// }
|
||||
//
|
||||
// override fun onBind(intent: Intent?): IBinder {
|
||||
// return LocalBinder()
|
||||
// }
|
||||
//
|
||||
// var isConnected: Boolean = false
|
||||
// private var socket: BluetoothSocket? = null
|
||||
//
|
||||
// fun sendPacket(packet: String) {
|
||||
// val fromHex = packet.split(" ").map { it.toInt(16).toByte() }
|
||||
// socket?.outputStream?.write(fromHex.toByteArray())
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setANCMode(mode: Int) {
|
||||
// when (mode) {
|
||||
// 1 -> {
|
||||
// socket?.outputStream?.write(Enums.NOISE_CANCELLATION_OFF.value)
|
||||
// }
|
||||
// 2 -> {
|
||||
// socket?.outputStream?.write(Enums.NOISE_CANCELLATION_ON.value)
|
||||
// }
|
||||
// 3 -> {
|
||||
// socket?.outputStream?.write(Enums.NOISE_CANCELLATION_TRANSPARENCY.value)
|
||||
// }
|
||||
// 4 -> {
|
||||
// socket?.outputStream?.write(Enums.NOISE_CANCELLATION_ADAPTIVE.value)
|
||||
// }
|
||||
// }
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setCAEnabled(enabled: Boolean) {
|
||||
// socket?.outputStream?.write(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value)
|
||||
// }
|
||||
//
|
||||
// fun setOffListeningMode(enabled: Boolean) {
|
||||
// socket?.outputStream?.write(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00))
|
||||
// }
|
||||
//
|
||||
// fun setAdaptiveStrength(strength: Int) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2E, strength.toByte(), 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setPressSpeed(speed: Int) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x17, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setPressAndHoldDuration(speed: Int) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x18, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setNoiseCancellationWithOnePod(enabled: Boolean) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1B, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setVolumeControl(enabled: Boolean) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x25, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setVolumeSwipeSpeed(speed: Int) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x23, speed.toByte(), 0x00, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setToneVolume(volume: Int) {
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1F, volume.toByte(), 0x50, 0x00, 0x00)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// val earDetectionNotification = AirPodsNotifications.EarDetection()
|
||||
// val ancNotification = AirPodsNotifications.ANC()
|
||||
// val batteryNotification = AirPodsNotifications.BatteryNotification()
|
||||
// val conversationAwarenessNotification = AirPodsNotifications.ConversationalAwarenessNotification()
|
||||
//
|
||||
// var earDetectionEnabled = true
|
||||
//
|
||||
// fun setCaseChargingSounds(enabled: Boolean) {
|
||||
// val bytes = byteArrayOf(0x12, 0x3a, 0x00, 0x01, 0x00, 0x08, if (enabled) 0x00 else 0x01)
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// }
|
||||
//
|
||||
// fun setEarDetection(enabled: Boolean) {
|
||||
// earDetectionEnabled = enabled
|
||||
// }
|
||||
//
|
||||
// fun getBattery(): List<Battery> {
|
||||
// return batteryNotification.getBattery()
|
||||
// }
|
||||
//
|
||||
// fun getANC(): Int {
|
||||
// return ancNotification.status
|
||||
// }
|
||||
//
|
||||
// private fun createNotification(): Notification {
|
||||
// val channelId = "battery"
|
||||
// val notificationBuilder = NotificationCompat.Builder(this, channelId)
|
||||
// .setSmallIcon(R.drawable.pro_2_buds)
|
||||
// .setContentTitle("AirPods Connected")
|
||||
// .setOngoing(true)
|
||||
// .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
//
|
||||
// val channel =
|
||||
// NotificationChannel(channelId, "Battery Notification", NotificationManager.IMPORTANCE_LOW)
|
||||
//
|
||||
// val notificationManager = getSystemService(NotificationManager::class.java)
|
||||
// notificationManager.createNotificationChannel(channel)
|
||||
// return notificationBuilder.build()
|
||||
// }
|
||||
//
|
||||
// fun disconnectAudio(context: Context, device: BluetoothDevice?) {
|
||||
// val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
||||
//
|
||||
// bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||
// override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
// if (profile == BluetoothProfile.A2DP) {
|
||||
// try {
|
||||
// val method = proxy.javaClass.getMethod("disconnect", BluetoothDevice::class.java)
|
||||
// method.invoke(proxy, device)
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// } finally {
|
||||
// bluetoothAdapter.closeProfileProxy(BluetoothProfile.A2DP, proxy)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// override fun onServiceDisconnected(profile: Int) { }
|
||||
// }, BluetoothProfile.A2DP)
|
||||
//
|
||||
// bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||
// override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
// if (profile == BluetoothProfile.HEADSET) {
|
||||
// try {
|
||||
// val method = proxy.javaClass.getMethod("disconnect", BluetoothDevice::class.java)
|
||||
// method.invoke(proxy, device)
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// } finally {
|
||||
// bluetoothAdapter.closeProfileProxy(BluetoothProfile.HEADSET, proxy)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// override fun onServiceDisconnected(profile: Int) { }
|
||||
// }, BluetoothProfile.HEADSET)
|
||||
// }
|
||||
//
|
||||
// fun connectAudio(context: Context, device: BluetoothDevice?) {
|
||||
// val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter
|
||||
//
|
||||
// bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||
// override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
// if (profile == BluetoothProfile.A2DP) {
|
||||
// try {
|
||||
// val method = proxy.javaClass.getMethod("connect", BluetoothDevice::class.java)
|
||||
// method.invoke(proxy, device)
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// } finally {
|
||||
// bluetoothAdapter.closeProfileProxy(BluetoothProfile.A2DP, proxy)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// override fun onServiceDisconnected(profile: Int) { }
|
||||
// }, BluetoothProfile.A2DP)
|
||||
//
|
||||
// bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener {
|
||||
// override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
|
||||
// if (profile == BluetoothProfile.HEADSET) {
|
||||
// try {
|
||||
// val method = proxy.javaClass.getMethod("connect", BluetoothDevice::class.java)
|
||||
// method.invoke(proxy, device)
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// } finally {
|
||||
// bluetoothAdapter.closeProfileProxy(BluetoothProfile.HEADSET, proxy)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// override fun onServiceDisconnected(profile: Int) { }
|
||||
// }, BluetoothProfile.HEADSET)
|
||||
// }
|
||||
//
|
||||
// fun setName(name: String) {
|
||||
// val nameBytes = name.toByteArray()
|
||||
// val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x01,
|
||||
// nameBytes.size.toByte(), 0x00) + nameBytes
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// socket?.outputStream?.flush()
|
||||
// val hex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||
// Log.d("OldAirPodsService", "setName: $name, sent packet: $hex")
|
||||
// }
|
||||
//
|
||||
// @SuppressLint("MissingPermission", "InlinedApi")
|
||||
// override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
//
|
||||
// val notification = createNotification()
|
||||
// startForeground(1, notification)
|
||||
//
|
||||
// ServiceManager.setService(this)
|
||||
//
|
||||
// if (isConnected) {
|
||||
// return START_STICKY
|
||||
// }
|
||||
// isConnected = true
|
||||
//
|
||||
// @Suppress("DEPRECATION") val device = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) intent?.getParcelableExtra("device", BluetoothDevice::class.java) else intent?.getParcelableExtra("device")
|
||||
//
|
||||
// HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
|
||||
// val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a")
|
||||
//
|
||||
// socket = HiddenApiBypass.newInstance(BluetoothSocket::class.java, 3, true, true, device, 0x1001, uuid) as BluetoothSocket?
|
||||
// try {
|
||||
// socket?.connect()
|
||||
// socket?.let { it ->
|
||||
// it.outputStream.write(Enums.HANDSHAKE.value)
|
||||
// it.outputStream.write(Enums.SET_SPECIFIC_FEATURES.value)
|
||||
// it.outputStream.write(Enums.REQUEST_NOTIFICATIONS.value)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.AIRPODS_CONNECTED))
|
||||
// it.outputStream.flush()
|
||||
//
|
||||
// CoroutineScope(Dispatchers.IO).launch {
|
||||
// while (socket?.isConnected == true) {
|
||||
// socket?.let {
|
||||
// val audioManager = this@OldAirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager
|
||||
// MediaController.initialize(audioManager)
|
||||
// val buffer = ByteArray(1024)
|
||||
// val bytesRead = it.inputStream.read(buffer)
|
||||
// var data: ByteArray = byteArrayOf()
|
||||
// if (bytesRead > 0) {
|
||||
// data = buffer.copyOfRange(0, bytesRead)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DATA).apply {
|
||||
// putExtra("data", buffer.copyOfRange(0, bytesRead))
|
||||
// })
|
||||
// val bytes = buffer.copyOfRange(0, bytesRead)
|
||||
// val formattedHex = bytes.joinToString(" ") { "%02X".format(it) }
|
||||
// Log.d("AirPods Data", "Data received: $formattedHex")
|
||||
// }
|
||||
// else if (bytesRead == -1) {
|
||||
// Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
|
||||
// this@OldAirPodsService.stopForeground(STOP_FOREGROUND_REMOVE)
|
||||
// socket?.close()
|
||||
// sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
// return@launch
|
||||
// }
|
||||
// var inEar = false
|
||||
// var inEarData = listOf<Boolean>()
|
||||
// if (earDetectionNotification.isEarDetectionData(data)) {
|
||||
// earDetectionNotification.setStatus(data)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.EAR_DETECTION_DATA).apply {
|
||||
// val list = earDetectionNotification.status
|
||||
// val bytes = ByteArray(2)
|
||||
// bytes[0] = list[0]
|
||||
// bytes[1] = list[1]
|
||||
// putExtra("data", bytes)
|
||||
// })
|
||||
// Log.d("AirPods Parser", "Ear Detection: ${earDetectionNotification.status[0]} ${earDetectionNotification.status[1]}")
|
||||
// var justEnabledA2dp = false
|
||||
// val earReceiver = object : BroadcastReceiver() {
|
||||
// override fun onReceive(context: Context, intent: Intent) {
|
||||
// val data = intent.getByteArrayExtra("data")
|
||||
// if (data != null && earDetectionEnabled) {
|
||||
// inEar = if (data.find { it == 0x02.toByte() } != null || data.find { it == 0x03.toByte() } != null) {
|
||||
// data[0] == 0x00.toByte() || data[1] == 0x00.toByte()
|
||||
// } else {
|
||||
// data[0] == 0x00.toByte() && data[1] == 0x00.toByte()
|
||||
// }
|
||||
//
|
||||
// val newInEarData = listOf(data[0] == 0x00.toByte(), data[1] == 0x00.toByte())
|
||||
// if (newInEarData.contains(true) && inEarData == listOf(false, false)) {
|
||||
// connectAudio(this@OldAirPodsService, device)
|
||||
// justEnabledA2dp = true
|
||||
// val bluetoothAdapter = this@OldAirPodsService.getSystemService(BluetoothManager::class.java).adapter
|
||||
// bluetoothAdapter.getProfileProxy(
|
||||
// this@OldAirPodsService, object : BluetoothProfile.ServiceListener {
|
||||
// override fun onServiceConnected(
|
||||
// profile: Int,
|
||||
// proxy: BluetoothProfile
|
||||
// ) {
|
||||
// if (profile == BluetoothProfile.A2DP) {
|
||||
// val connectedDevices =
|
||||
// proxy.connectedDevices
|
||||
// if (connectedDevices.isNotEmpty()) {
|
||||
// MediaController.sendPlay()
|
||||
// }
|
||||
// }
|
||||
// bluetoothAdapter.closeProfileProxy(
|
||||
// profile,
|
||||
// proxy
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override fun onServiceDisconnected(
|
||||
// profile: Int
|
||||
// ) {
|
||||
// }
|
||||
// }
|
||||
// ,BluetoothProfile.A2DP
|
||||
// )
|
||||
//
|
||||
// }
|
||||
// else if (newInEarData == listOf(false, false)){
|
||||
// disconnectAudio(this@OldAirPodsService, device)
|
||||
// }
|
||||
//
|
||||
// inEarData = newInEarData
|
||||
//
|
||||
// if (inEar == true) {
|
||||
// if (!justEnabledA2dp) {
|
||||
// justEnabledA2dp = false
|
||||
// MediaController.sendPlay()
|
||||
// }
|
||||
// } else {
|
||||
// MediaController.sendPause()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// val earIntentFilter = IntentFilter(AirPodsNotifications.EAR_DETECTION_DATA)
|
||||
// this@OldAirPodsService.registerReceiver(earReceiver, earIntentFilter,
|
||||
// RECEIVER_EXPORTED
|
||||
// )
|
||||
// }
|
||||
// else if (ancNotification.isANCData(data)) {
|
||||
// ancNotification.setStatus(data)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.ANC_DATA).apply {
|
||||
// putExtra("data", ancNotification.status)
|
||||
// })
|
||||
// Log.d("AirPods Parser", "ANC: ${ancNotification.status}")
|
||||
// }
|
||||
// else if (batteryNotification.isBatteryData(data)) {
|
||||
// batteryNotification.setBattery(data)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.BATTERY_DATA).apply {
|
||||
// putParcelableArrayListExtra("data", ArrayList(batteryNotification.getBattery()))
|
||||
// })
|
||||
// for (battery in batteryNotification.getBattery()) {
|
||||
// Log.d("AirPods Parser", "${battery.getComponentName()}: ${battery.getStatusName()} at ${battery.level}% ")
|
||||
// }
|
||||
//// if both are charging, disconnect audio profiles
|
||||
// if (batteryNotification.getBattery()[0].status == 1 && batteryNotification.getBattery()[1].status == 1) {
|
||||
// disconnectAudio(this@OldAirPodsService, device)
|
||||
// }
|
||||
// else {
|
||||
// connectAudio(this@OldAirPodsService, device)
|
||||
// }
|
||||
//// updatePodsStatus(device!!, batteryNotification.getBattery())
|
||||
// }
|
||||
// else if (conversationAwarenessNotification.isConversationalAwarenessData(data)) {
|
||||
// conversationAwarenessNotification.setData(data)
|
||||
// sendBroadcast(Intent(AirPodsNotifications.CA_DATA).apply {
|
||||
// putExtra("data", conversationAwarenessNotification.status)
|
||||
// })
|
||||
//
|
||||
//
|
||||
// if (conversationAwarenessNotification.status == 1.toByte() || conversationAwarenessNotification.status == 2.toByte()) {
|
||||
// MediaController.startSpeaking()
|
||||
// } else if (conversationAwarenessNotification.status == 8.toByte() || conversationAwarenessNotification.status == 9.toByte()) {
|
||||
// MediaController.stopSpeaking()
|
||||
// }
|
||||
//
|
||||
// Log.d("AirPods Parser", "Conversation Awareness: ${conversationAwarenessNotification.status}")
|
||||
// }
|
||||
// else { }
|
||||
// }
|
||||
// }
|
||||
// Log.d("AirPods Service", "Socket closed")
|
||||
// isConnected = false
|
||||
// this@OldAirPodsService.stopForeground(STOP_FOREGROUND_REMOVE)
|
||||
// socket?.close()
|
||||
// sendBroadcast(Intent(AirPodsNotifications.AIRPODS_DISCONNECTED))
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// catch (e: Exception) {
|
||||
// Log.e("AirPodsSettingsScreen", "Error connecting to device: ${e.message}")
|
||||
// }
|
||||
// return START_STICKY
|
||||
// }
|
||||
//
|
||||
// override fun onDestroy() {
|
||||
// super.onDestroy()
|
||||
// socket?.close()
|
||||
// isConnected = false
|
||||
// ServiceManager.setService(null)
|
||||
// }
|
||||
//
|
||||
// fun setPVEnabled(enabled: Boolean) {
|
||||
// var hex = "04 00 04 00 09 00 26 ${if (enabled) "01" else "02"} 00 00 00"
|
||||
// var bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// hex = "04 00 04 00 17 00 00 00 10 00 12 00 08 E${if (enabled) "6" else "5"} 05 10 02 42 0B 08 50 10 02 1A 05 02 ${if (enabled) "32" else "00"} 00 00 00"
|
||||
// bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// }
|
||||
//
|
||||
// fun setLoudSoundReduction(enabled: Boolean) {
|
||||
// val hex = "52 1B 00 0${if (enabled) "1" else "0"}"
|
||||
// val bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray()
|
||||
// socket?.outputStream?.write(bytes)
|
||||
// }
|
||||
//}
|
||||
@@ -1,3 +1,5 @@
|
||||
@file:Suppress("unused")
|
||||
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.os.Parcelable
|
||||
@@ -59,6 +61,10 @@ data class Battery(val component: Int, val level: Int, val status: Int) : Parcel
|
||||
}
|
||||
}
|
||||
|
||||
enum class NoiseControlMode {
|
||||
OFF, NOISE_CANCELLATION, TRANSPARENCY, ADAPTIVE
|
||||
}
|
||||
|
||||
class AirPodsNotifications {
|
||||
companion object {
|
||||
const val AIRPODS_CONNECTED = "me.kavishdevar.aln.AIRPODS_CONNECTED"
|
||||
@@ -68,6 +74,7 @@ class AirPodsNotifications {
|
||||
const val BATTERY_DATA = "me.kavishdevar.aln.BATTERY_DATA"
|
||||
const val CA_DATA = "me.kavishdevar.aln.CA_DATA"
|
||||
const val AIRPODS_DISCONNECTED = "me.kavishdevar.aln.AIRPODS_DISCONNECTED"
|
||||
const val AIRPODS_CONNECTION_DETECTED = "me.kavishdevar.aln.AIRPODS_CONNECTION_DETECTED"
|
||||
}
|
||||
|
||||
class EarDetection {
|
||||
@@ -134,10 +141,18 @@ class AirPodsNotifications {
|
||||
}
|
||||
|
||||
fun setBattery(data: ByteArray) {
|
||||
first = Battery(data[7].toInt(), data[9].toInt(), data[10].toInt())
|
||||
second = Battery(data[12].toInt(), data[14].toInt(), data[15].toInt())
|
||||
first = if (data[10].toInt() == BatteryStatus.DISCONNECTED) {
|
||||
Battery(first.component, first.level, data[10].toInt())
|
||||
} else {
|
||||
Battery(data[7].toInt(), data[9].toInt(), data[10].toInt())
|
||||
}
|
||||
second = if (data[15].toInt() == BatteryStatus.DISCONNECTED) {
|
||||
Battery(second.component, second.level, data[15].toInt())
|
||||
} else {
|
||||
Battery(data[12].toInt(), data[14].toInt(), data[15].toInt())
|
||||
}
|
||||
case = if (data[20].toInt() == BatteryStatus.DISCONNECTED && case.status != BatteryStatus.DISCONNECTED) {
|
||||
Battery(data[17].toInt(), case.level, data[20].toInt())
|
||||
Battery(case.component, case.level, data[20].toInt())
|
||||
} else {
|
||||
Battery(data[17].toInt(), data[19].toInt(), data[20].toInt())
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothAdapter
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothProfile
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.ParcelUuid
|
||||
|
||||
class StartupReceiver : BroadcastReceiver() {
|
||||
|
||||
companion object {
|
||||
val PodsUUIDS: Set<ParcelUuid> = setOf(
|
||||
ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a"),
|
||||
ParcelUuid.fromString("2a72e02b-7b99-778f-014d-ad0b7221ec74")
|
||||
)
|
||||
|
||||
val btActions: Set<String> = setOf(
|
||||
BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED,
|
||||
BluetoothDevice.ACTION_ACL_CONNECTED,
|
||||
BluetoothDevice.ACTION_ACL_DISCONNECTED,
|
||||
BluetoothDevice.ACTION_BOND_STATE_CHANGED,
|
||||
BluetoothDevice.ACTION_NAME_CHANGED
|
||||
)
|
||||
}
|
||||
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent == null || context == null) return
|
||||
|
||||
intent.action?.let { action ->
|
||||
if (btActions.contains(action)) {
|
||||
try {
|
||||
val state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, BluetoothAdapter.ERROR)
|
||||
val device: BluetoothDevice? = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
|
||||
device?.let {
|
||||
btProfileChanges(context, state, it)
|
||||
}
|
||||
} catch (e: NullPointerException) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun isPods(device: BluetoothDevice): Boolean {
|
||||
device.uuids?.forEach { uuid ->
|
||||
if (PodsUUIDS.contains(uuid)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun startPodsService(context: Context, device: BluetoothDevice) {
|
||||
if (!isPods(device)) return
|
||||
val intent = Intent(context, AirPodsService::class.java).apply {
|
||||
putExtra(BluetoothDevice.EXTRA_DEVICE, device)
|
||||
}
|
||||
context.startService(intent)
|
||||
}
|
||||
|
||||
private fun stopPodsService(context: Context) {
|
||||
context.stopService(Intent(context, AirPodsService::class.java))
|
||||
}
|
||||
|
||||
private fun btProfileChanges(context: Context, state: Int, device: BluetoothDevice) {
|
||||
when (state) {
|
||||
BluetoothProfile.STATE_CONNECTED -> startPodsService(context, device)
|
||||
BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.STATE_DISCONNECTING -> stopPodsService(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
170
android/app/src/main/java/me/kavishdevar/aln/Window.kt
Normal file
@@ -0,0 +1,170 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.animation.Animator
|
||||
import android.animation.AnimatorListenerAdapter
|
||||
import android.animation.ObjectAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.graphics.PixelFormat
|
||||
import android.util.Log
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.view.animation.AccelerateInterpolator
|
||||
import android.view.animation.DecelerateInterpolator
|
||||
import android.widget.ImageButton
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import android.widget.VideoView
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import java.lang.Exception
|
||||
|
||||
@SuppressLint("InflateParams", "ClickableViewAccessibility")
|
||||
class Window (context: Context) {
|
||||
private val mView: View
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
@SuppressLint("NewApi")
|
||||
private val mParams: WindowManager.LayoutParams = WindowManager.LayoutParams().apply {
|
||||
height = WindowManager.LayoutParams.WRAP_CONTENT
|
||||
width = WindowManager.LayoutParams.MATCH_PARENT
|
||||
type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
|
||||
format = PixelFormat.TRANSLUCENT
|
||||
gravity = Gravity.BOTTOM
|
||||
dimAmount = 0.3f
|
||||
flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
|
||||
WindowManager.LayoutParams.FLAG_FULLSCREEN or
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
|
||||
WindowManager.LayoutParams.FLAG_DIM_BEHIND or
|
||||
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
|
||||
}
|
||||
|
||||
|
||||
private val mWindowManager: WindowManager
|
||||
|
||||
init {
|
||||
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
mView = layoutInflater.inflate(R.layout.popup_window, null)
|
||||
mParams.x = 0
|
||||
mParams.y = 0
|
||||
|
||||
mParams.gravity = Gravity.BOTTOM
|
||||
mView.setOnClickListener(View.OnClickListener {
|
||||
close()
|
||||
})
|
||||
|
||||
mView.findViewById<ImageButton>(R.id.close_button)
|
||||
.setOnClickListener {
|
||||
close()
|
||||
}
|
||||
|
||||
val ll = mView.findViewById<LinearLayout>(R.id.linear_layout)
|
||||
ll.setOnClickListener {
|
||||
close()
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
mView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
|
||||
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_FULLSCREEN or
|
||||
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
|
||||
mView.setOnTouchListener { _, event ->
|
||||
if (event.action == MotionEvent.ACTION_DOWN) {
|
||||
val touchY = event.rawY
|
||||
val popupTop = mView.top
|
||||
if (touchY < popupTop) {
|
||||
close()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
mWindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi", "SetTextI18n")
|
||||
fun open(name: String = "AirPods Pro", batteryNotification: AirPodsNotifications.BatteryNotification) {
|
||||
try {
|
||||
if (mView.windowToken == null) {
|
||||
if (mView.parent == null) {
|
||||
// Add the view initially off-screen
|
||||
mWindowManager.addView(mView, mParams)
|
||||
mView.findViewById<TextView>(R.id.name).text = name
|
||||
val vid = mView.findViewById<VideoView>(R.id.video)
|
||||
|
||||
vid.setVideoPath("android.resource://me.kavishdevar.aln/" + R.raw.connected)
|
||||
vid.resolveAdjustedSize(vid.width, vid.height)
|
||||
vid.start()
|
||||
vid.setOnCompletionListener {
|
||||
vid.start()
|
||||
}
|
||||
|
||||
val batteryStatus = batteryNotification.getBattery()
|
||||
val batteryLeftText = mView.findViewById<TextView>(R.id.left_battery)
|
||||
val batteryRightText = mView.findViewById<TextView>(R.id.right_battery)
|
||||
val batteryCaseText = mView.findViewById<TextView>(R.id.case_battery)
|
||||
|
||||
batteryLeftText.text = batteryStatus.find { it.component == BatteryComponent.LEFT }?.let {
|
||||
"\uDBC3\uDC8E ${it.level}%"
|
||||
} ?: ""
|
||||
batteryRightText.text = batteryStatus.find { it.component == BatteryComponent.RIGHT }?.let {
|
||||
"\uDBC3\uDC8D ${it.level}%"
|
||||
} ?: ""
|
||||
batteryCaseText.text = batteryStatus.find { it.component == BatteryComponent.CASE }?.let {
|
||||
"\uDBC3\uDE6C ${it.level}%"
|
||||
} ?: ""
|
||||
|
||||
// Slide-up animation
|
||||
val displayMetrics = mView.context.resources.displayMetrics
|
||||
val screenHeight = displayMetrics.heightPixels
|
||||
|
||||
mView.translationY = screenHeight.toFloat() // Start below the screen
|
||||
ObjectAnimator.ofFloat(mView, "translationY", 0f).apply {
|
||||
duration = 500 // Animation duration in milliseconds
|
||||
interpolator = DecelerateInterpolator() // Smooth deceleration
|
||||
start()
|
||||
}
|
||||
|
||||
CoroutineScope(MainScope().coroutineContext).launch {
|
||||
delay(12000)
|
||||
close()
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.d("PopupService", e.toString())
|
||||
}
|
||||
}
|
||||
|
||||
fun close() {
|
||||
try {
|
||||
ObjectAnimator.ofFloat(mView, "translationY", mView.height.toFloat()).apply {
|
||||
duration = 500 // Animation duration in milliseconds
|
||||
interpolator = AccelerateInterpolator() // Smooth acceleration
|
||||
addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
try {
|
||||
mWindowManager.removeView(mView)
|
||||
} catch (e: Exception) {
|
||||
Log.d("PopupService", e.toString())
|
||||
}
|
||||
}
|
||||
})
|
||||
start()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.d("PopupService", e.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
62
android/app/src/main/java/me/kavishdevar/aln/receiver.kt
Normal file
@@ -0,0 +1,62 @@
|
||||
package me.kavishdevar.aln
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
|
||||
class BluetoothReceiver : BroadcastReceiver() {
|
||||
fun onConnect(bluetoothDevice: BluetoothDevice?) {
|
||||
|
||||
}
|
||||
|
||||
fun onDisconnect(bluetoothDevice: BluetoothDevice?) {
|
||||
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onReceive(context: Context?, intent: Intent) {
|
||||
val bluetoothDevice =
|
||||
intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE", BluetoothDevice::class.java)
|
||||
val action = intent.action
|
||||
|
||||
// Airpods filter
|
||||
if (bluetoothDevice != null && action != null && !action.isEmpty()) {
|
||||
// Airpods connected, show notification.
|
||||
if (BluetoothDevice.ACTION_ACL_CONNECTED == action) {
|
||||
onConnect(bluetoothDevice)
|
||||
}
|
||||
|
||||
// Airpods disconnected, remove notification but leave the scanner going.
|
||||
if (BluetoothDevice.ACTION_ACL_DISCONNECTED == action
|
||||
|| BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED == action
|
||||
) {
|
||||
onDisconnect(bluetoothDevice)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* When the service is created, we register to get as many bluetooth and airpods related events as possible.
|
||||
* ACL_CONNECTED and ACL_DISCONNECTED should have been enough, but you never know with android these days.
|
||||
*/
|
||||
fun buildFilter(): IntentFilter {
|
||||
val intentFilter = IntentFilter()
|
||||
intentFilter.addAction("android.bluetooth.device.action.ACL_CONNECTED")
|
||||
intentFilter.addAction("android.bluetooth.device.action.ACL_DISCONNECTED")
|
||||
intentFilter.addAction("android.bluetooth.device.action.BOND_STATE_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.device.action.NAME_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.adapter.action.STATE_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT")
|
||||
intentFilter.addAction("android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED")
|
||||
intentFilter.addAction("android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED")
|
||||
intentFilter.addCategory("android.bluetooth.headset.intent.category.companyid.76")
|
||||
return intentFilter
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,6 @@ private val LightColorScheme = lightColorScheme(
|
||||
primary = Purple40,
|
||||
secondary = PurpleGrey40,
|
||||
tertiary = Pink40
|
||||
|
||||
/* Other default colors to override
|
||||
background = Color(0xFFFFFBFE),
|
||||
surface = Color(0xFFFFFBFE),
|
||||
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Background for widgets to make the rounded corners based on the
|
||||
appWidgetRadius attribute value
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<corners android:radius="?attr/appWidgetRadius" />
|
||||
<solid android:color="?android:attr/colorBackground" />
|
||||
</shape>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Background for views inside widgets to make the rounded corners based on the
|
||||
appWidgetInnerRadius attribute value
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<corners android:radius="?attr/appWidgetInnerRadius" />
|
||||
<solid android:color="?android:attr/colorAccent" />
|
||||
</shape>
|
||||
10
android/app/src/main/res/drawable/airpods.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="43dp" android:viewportHeight="607.69" android:viewportWidth="902.34" android:width="63.849365dp">
|
||||
<path android:fillAlpha="0" android:fillColor="#FF000000" android:pathData="M0,0h902.34v607.69h-902.34z" android:strokeAlpha="0"/>
|
||||
|
||||
<path android:fillAlpha="0.85" android:fillColor="#ffffff" android:pathData="M315.92,550.31C315.92,567.88 304.69,577.41 286.13,577.41L261.48,577.41C242.92,577.41 231.45,567.88 231.45,550.31L231.45,358.73C267.25,355.98 293.73,349.94 315.92,341.64ZM670.9,358.73L670.9,550.31C670.9,567.88 659.42,577.41 640.87,577.41L616.21,577.41C597.66,577.41 586.43,567.88 586.43,550.31L586.43,341.64C608.62,349.94 635.09,355.98 670.9,358.73Z"/>
|
||||
|
||||
<path android:fillAlpha="0.85" android:fillColor="#ffffff" android:pathData="M429.2,153.09C429.2,221.45 388.18,270.28 335.2,299.57C312.69,312 288.17,321.38 249.56,326.11C255.64,311.65 259.03,294.95 259.03,276.14C259.03,213.57 207.98,151 137.53,139.93C143.33,128.37 149.48,118.78 153.81,113.29C192.14,56.65 252.44,29.55 306.64,30.29C375.24,31.02 429.2,76.43 429.2,153.09ZM748.53,113.29C752.86,118.78 759.01,128.37 764.82,139.93C694.36,151 643.31,213.57 643.31,276.14C643.31,294.95 646.71,311.65 652.78,326.11C614.17,321.38 589.66,312 567.14,299.57C514.16,270.28 473.14,221.45 473.14,153.09C473.14,76.43 527.1,31.02 595.7,30.29C649.9,29.55 710.21,56.65 748.53,113.29ZM346.19,100.11L301.51,137.71C295.41,142.84 294.68,151.62 299.56,157.48C304.69,163.83 313.72,164.32 319.34,159.44L364.75,121.84C370.85,116.71 371.09,107.92 365.97,102.06C361.33,95.72 352.3,94.98 346.19,100.11ZM536.38,102.06C531.25,107.92 531.49,116.71 537.6,121.84L583.01,159.44C588.62,164.32 597.66,163.83 602.78,157.48C607.67,151.62 606.93,142.84 600.83,137.71L556.15,100.11C550.05,94.98 541.02,95.72 536.38,102.06Z"/>
|
||||
|
||||
<path android:fillAlpha="0.85" android:fillColor="#ffffff" android:pathData="M140.87,364.76C189.45,364.76 229.98,334.48 229.98,276.14C229.98,222.43 180.18,167.25 114.99,167.25C61.28,167.25 29.05,209.24 29.05,254.65C29.05,320.08 84.72,364.76 140.87,364.76ZM125.98,319.59C117.19,327.16 102.29,319.35 84.23,297.38C66.41,275.89 61.52,260.51 70.07,252.94C79.1,245.37 93.75,252.94 111.82,274.92C129.4,297.13 134.52,312.27 125.98,319.59ZM761.47,364.76C817.63,364.76 873.29,320.08 873.29,254.65C873.29,209.24 841.06,167.25 787.35,167.25C722.17,167.25 672.36,222.43 672.36,276.14C672.36,334.48 712.89,364.76 761.47,364.76ZM776.37,319.59C767.82,312.27 772.95,297.13 790.53,274.92C808.59,252.94 823.24,245.37 832.28,252.94C840.82,260.51 835.94,275.89 818.11,297.38C800.29,319.35 785.16,327.16 776.37,319.59Z"/>
|
||||
|
||||
</vector>
|
||||
@@ -0,0 +1,15 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="141.5dp"
|
||||
android:height="109.06dp"
|
||||
android:viewportWidth="141.5"
|
||||
android:viewportHeight="109.06">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0,0h141.5v109.06h-141.5z"
|
||||
android:strokeAlpha="0"
|
||||
android:fillAlpha="0"/>
|
||||
<path
|
||||
android:pathData="M37.88,109L103.63,109C129.19,109 141.5,96.75 141.5,71.31L141.5,41.63L102.81,41.63C101.75,44.44 99.13,46.25 95.81,46.25L45.75,46.25C42.5,46.25 39.75,44.44 38.75,41.63L0,41.63L0,71.31C0,96.75 12.38,109 37.88,109ZM70.75,70.06C67.63,70.13 65.06,67.5 65.06,64.44C65.06,61.31 67.63,58.69 70.75,58.69C73.88,58.69 76.5,61.31 76.5,64.44C76.5,67.38 73.88,70 70.75,70.06ZM0,35.94L38.63,35.94C39.63,33.06 42.38,31.31 45.63,31.31L95.75,31.31C99,31.31 101.69,33.06 102.69,35.94L141.31,35.94L141.31,33.94C141.31,11.13 127.81,0 103.44,0L37.88,0C13.56,0 0,11.13 0,33.94Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,23 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="94.19dp"
|
||||
android:height="123.31dp"
|
||||
android:viewportWidth="94.19"
|
||||
android:viewportHeight="123.31">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0,0h94.19v123.31h-94.19z"
|
||||
android:strokeAlpha="0"
|
||||
android:fillAlpha="0"/>
|
||||
<path
|
||||
android:pathData="M46.81,73.29L46.81,111.06C46.81,114.94 44.25,116.94 40.38,116.94L35.5,116.94C31.63,116.94 29.06,114.94 29.06,111.06L29.06,69.82C33.68,71.55 39.25,72.79 46.81,73.29Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
<path
|
||||
android:pathData="M62,22.63C62.94,23.8 64.28,25.84 65.55,28.29C51.19,30.59 40.75,43.46 40.75,56.13C40.75,60.05 41.47,63.51 42.75,66.49C34.56,65.53 29.44,63.52 24.75,60.88C14.44,54.94 6.31,45.31 6.31,31.5C6.31,15.56 17.56,6.5 31.38,6.38C42.06,6.25 54,11.5 62,22.63ZM19.44,21.25C18.31,22.5 18.38,24.38 19.69,25.44L29,33.19C30.19,34.25 32.13,34.13 33.19,32.81C34.25,31.5 34.13,29.63 32.75,28.56L23.63,20.81C22.31,19.75 20.44,19.94 19.44,21.25Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
<path
|
||||
android:pathData="M65.13,74.25C76.31,74.25 87.81,65.38 87.81,51.81C87.81,42.75 81.44,33.88 70.19,33.88C57,33.88 46.81,45.31 46.81,56.13C46.81,68.25 55.38,74.25 65.13,74.25ZM68.19,64.75C66.44,63.25 67.44,60.25 71,55.69C74.69,51.19 77.63,49.69 79.5,51.31C81.19,52.81 80.25,55.88 76.69,60.31C72.94,64.75 70,66.31 68.19,64.75Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,23 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="94.19dp"
|
||||
android:height="123.31dp"
|
||||
android:viewportWidth="94.19"
|
||||
android:viewportHeight="123.31">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M0,0h94.19v123.31h-94.19z"
|
||||
android:strokeAlpha="0"
|
||||
android:fillAlpha="0"/>
|
||||
<path
|
||||
android:pathData="M65.06,111.06C65.06,114.94 62.56,116.94 58.69,116.94L53.81,116.94C49.88,116.94 47.31,114.94 47.31,111.06L47.31,73.29C54.87,72.79 60.44,71.56 65.06,69.84Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
<path
|
||||
android:pathData="M87.81,31.5C87.81,45.31 79.69,54.94 69.44,60.88C64.74,63.52 59.6,65.54 51.37,66.5C52.65,63.51 53.38,60.05 53.38,56.13C53.38,43.47 43,30.6 28.61,28.29C29.89,25.84 31.25,23.8 32.19,22.63C40.19,11.5 52.06,6.25 62.81,6.38C76.56,6.5 87.81,15.56 87.81,31.5ZM70.56,20.81L61.38,28.56C60.06,29.63 59.94,31.5 61,32.81C62.06,34.13 63.94,34.25 65.19,33.19L74.44,25.44C75.75,24.38 75.81,22.5 74.75,21.25C73.75,19.94 71.81,19.75 70.56,20.81Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
<path
|
||||
android:pathData="M29.06,74.25C38.81,74.25 47.38,68.25 47.38,56.13C47.38,45.31 37.19,33.88 23.94,33.88C12.75,33.88 6.31,42.75 6.31,51.81C6.31,65.38 17.88,74.25 29.06,74.25ZM26,64.75C24.19,66.31 21.25,64.75 17.5,60.31C13.88,55.88 12.94,52.81 14.69,51.31C16.56,49.69 19.44,51.19 23.19,55.69C26.75,60.25 27.75,63.25 26,64.75Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillAlpha="0.85"/>
|
||||
</vector>
|
||||
20
android/app/src/main/res/drawable/button_shape.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<solid
|
||||
android:color="#902E2E2E">
|
||||
</solid>
|
||||
|
||||
<padding
|
||||
android:left="1dp"
|
||||
android:top="1dp"
|
||||
android:right="1dp"
|
||||
android:bottom="1dp" />
|
||||
|
||||
<corners
|
||||
android:radius="5000dp">
|
||||
</corners>
|
||||
|
||||
</shape>
|
||||
9
android/app/src/main/res/drawable/close.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M256,760L200,704L424,480L200,256L256,200L480,424L704,200L760,256L536,480L760,704L704,760L480,536L256,760Z"/>
|
||||
</vector>
|
||||
19
android/app/src/main/res/drawable/shape.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle" >
|
||||
|
||||
<solid
|
||||
android:color="@color/popup_background" >
|
||||
</solid>
|
||||
|
||||
<padding
|
||||
android:bottom="56dp"
|
||||
android:top="16dp">
|
||||
</padding>
|
||||
|
||||
<corners
|
||||
android:radius="56dp">
|
||||
</corners>
|
||||
|
||||
</shape>
|
||||
19
android/app/src/main/res/layout/battery_widget.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="@style/Widget.ALN.AppWidget.Container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:theme="@style/Theme.ALN.AppWidgetContainer">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/appwidget_text"
|
||||
style="@style/Widget.ALN.AppWidget.InnerView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_margin="8dp"
|
||||
android:contentDescription="@string/appwidget_text"
|
||||
android:text="@string/appwidget_text"
|
||||
android:textSize="24sp"
|
||||
android:textStyle="bold|italic" />
|
||||
</RelativeLayout>
|
||||
13
android/app/src/main/res/layout/notification.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notification_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
/>
|
||||
</LinearLayout>
|
||||
49
android/app/src/main/res/layout/notification_expanded.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notification_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:fontFamily="@font/sf_pro" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="8dp"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/left_battery_notification"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:textSize="15sp"
|
||||
android:paddingEnd="16dp"
|
||||
android:layout_weight="1"
|
||||
tools:ignore="RtlSymmetry" />
|
||||
<TextView
|
||||
android:id="@+id/right_battery_notification"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:textSize="15sp"
|
||||
android:layout_weight="1"
|
||||
android:paddingEnd="16dp"
|
||||
tools:ignore="RtlSymmetry" />
|
||||
<TextView
|
||||
android:id="@+id/case_battery_notification"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:layout_weight="1"
|
||||
android:textSize="15sp" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
109
android/app/src/main/res/layout/popup_window.xml
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="16.dp"
|
||||
android:id="@+id/linear_layout"
|
||||
android:orientation="vertical"
|
||||
android:background="@drawable/shape">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="end"
|
||||
android:id="@+id/constraint_layout"
|
||||
android:paddingBottom="48dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:gravity="center"
|
||||
android:text="Kavish's AirPods Pro"
|
||||
android:textColor="@color/popup_text"
|
||||
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/close_button"
|
||||
android:layout_width="28dp"
|
||||
android:layout_height="28dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:background="@drawable/button_shape"
|
||||
android:contentDescription="Close Button"
|
||||
android:src="@drawable/close"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:ignore="HardcodedText" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
<VideoView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/video"
|
||||
android:contentDescription="AirPods"
|
||||
android:src="@raw/connected"
|
||||
tools:ignore="HardcodedText" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<!-- Left Half -->
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:textAlignment="center"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:text=""
|
||||
android:textColor="@color/popup_text"
|
||||
android:textSize="20sp"
|
||||
android:id="@+id/left_battery"
|
||||
android:gravity="center"
|
||||
tools:ignore="NestedWeights" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:textAlignment="center"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:gravity="center"
|
||||
android:text=""
|
||||
android:id="@+id/right_battery"
|
||||
android:textColor="@color/popup_text"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Right Half -->
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:textAlignment="center"
|
||||
android:id="@+id/case_battery"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="@font/sf_pro"
|
||||
android:gravity="center"
|
||||
android:text=""
|
||||
android:textColor="@color/popup_text"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
BIN
android/app/src/main/res/raw-night/connected.mp4
Normal file
BIN
android/app/src/main/res/raw/connected.mp4
Normal file
10
android/app/src/main/res/values-night-v31/themes.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!--
|
||||
Having themes.xml for night-v31 because of the priority order of the resource qualifiers.
|
||||
-->
|
||||
<style name="Theme.ALN.AppWidgetContainerParent" parent="@android:style/Theme.DeviceDefault.DayNight">
|
||||
<item name="appWidgetRadius">@android:dimen/system_app_widget_background_radius</item>
|
||||
<item name="appWidgetInnerRadius">@android:dimen/system_app_widget_inner_radius</item>
|
||||
</style>
|
||||
</resources>
|
||||
5
android/app/src/main/res/values-night/colors.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="popup_background">#1C1B1E</color>
|
||||
<color name="popup_text">@color/white</color>
|
||||
</resources>
|
||||
14
android/app/src/main/res/values-v21/styles.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<resources>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.Container" parent="android:Widget">
|
||||
<item name="android:id">@android:id/background</item>
|
||||
<item name="android:padding">?attr/appWidgetPadding</item>
|
||||
<item name="android:background">@drawable/app_widget_background</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.InnerView" parent="android:Widget">
|
||||
<item name="android:padding">?attr/appWidgetPadding</item>
|
||||
<item name="android:background">@drawable/app_widget_inner_view_background</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
</style>
|
||||
</resources>
|
||||
16
android/app/src/main/res/values-v31/styles.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<resources>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.Container" parent="android:Widget">
|
||||
<item name="android:id">@android:id/background</item>
|
||||
<item name="android:padding">?attr/appWidgetPadding</item>
|
||||
<item name="android:background">@drawable/app_widget_background</item>
|
||||
<item name="android:clipToOutline">true</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.InnerView" parent="android:Widget">
|
||||
<item name="android:padding">?attr/appWidgetPadding</item>
|
||||
<item name="android:background">@drawable/app_widget_inner_view_background</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
<item name="android:clipToOutline">true</item>
|
||||
</style>
|
||||
</resources>
|
||||
11
android/app/src/main/res/values-v31/themes.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!--
|
||||
Having themes.xml for v31 variant because @android:dimen/system_app_widget_background_radius
|
||||
and @android:dimen/system_app_widget_internal_padding requires API level 31
|
||||
-->
|
||||
<style name="Theme.ALN.AppWidgetContainerParent" parent="@android:style/Theme.DeviceDefault.DayNight">
|
||||
<item name="appWidgetRadius">@android:dimen/system_app_widget_background_radius</item>
|
||||
<item name="appWidgetInnerRadius">@android:dimen/system_app_widget_inner_radius</item>
|
||||
</style>
|
||||
</resources>
|
||||
7
android/app/src/main/res/values/attrs.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<resources>
|
||||
<declare-styleable name="AppWidgetAttrs">
|
||||
<attr name="appWidgetPadding" format="dimension" />
|
||||
<attr name="appWidgetInnerRadius" format="dimension" />
|
||||
<attr name="appWidgetRadius" format="dimension" />
|
||||
</declare-styleable>
|
||||
</resources>
|
||||
@@ -1,10 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="purple_200">#FFBB86FC</color>
|
||||
<color name="purple_500">#FF6200EE</color>
|
||||
<color name="purple_700">#FF3700B3</color>
|
||||
<color name="teal_200">#FF03DAC5</color>
|
||||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
<color name="popup_background">#FFFFFF</color>
|
||||
<color name="popup_text">@color/black</color>
|
||||
<color name="light_blue_50">#FFE1F5FE</color>
|
||||
<color name="light_blue_200">#FF81D4FA</color>
|
||||
<color name="light_blue_600">#FF039BE5</color>
|
||||
<color name="light_blue_900">#FF01579B</color>
|
||||
</resources>
|
||||
10
android/app/src/main/res/values/dimens.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Refer to App Widget Documentation for margin information
|
||||
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
|
||||
-->
|
||||
<dimen name="widget_margin">0dp</dimen>
|
||||
|
||||
</resources>
|
||||
@@ -1,4 +1,7 @@
|
||||
<resources>
|
||||
<string name="app_name">ALN</string>
|
||||
<string name="title_activity_debug">DebugActivity</string>
|
||||
<string name="title_activity_custom_device">GATT Testing</string>
|
||||
<string name="appwidget_text">EXAMPLE</string>
|
||||
<string name="add_widget">Add widget</string>
|
||||
<string name="app_widget_description">This is an app widget description</string>
|
||||
</resources>
|
||||
12
android/app/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<resources>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.Container" parent="android:Widget">
|
||||
<item name="android:id">@android:id/background</item>
|
||||
<item name="android:background">?android:attr/colorBackground</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.ALN.AppWidget.InnerView" parent="android:Widget">
|
||||
<item name="android:background">?android:attr/colorBackground</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -2,4 +2,19 @@
|
||||
<resources>
|
||||
|
||||
<style name="Theme.ALN" parent="android:Theme.Material.Light.NoActionBar" />
|
||||
|
||||
<style name="Theme.ALN.AppWidgetContainerParent" parent="@android:style/Theme.DeviceDefault">
|
||||
<!-- Radius of the outer bound of widgets to make the rounded corners -->
|
||||
<item name="appWidgetRadius">16dp</item>
|
||||
<!--
|
||||
Radius of the inner view's bound of widgets to make the rounded corners.
|
||||
It needs to be 8dp or less than the value of appWidgetRadius
|
||||
-->
|
||||
<item name="appWidgetInnerRadius">8dp</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.ALN.AppWidgetContainer" parent="Theme.ALN.AppWidgetContainerParent">
|
||||
<!-- Apply padding to avoid the content of the widget colliding with the rounded corners -->
|
||||
<item name="appWidgetPadding">16dp</item>
|
||||
</style>
|
||||
</resources>
|
||||
14
android/app/src/main/res/xml/battery_widget_info.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:description="@string/app_widget_description"
|
||||
android:initialKeyguardLayout="@layout/battery_widget"
|
||||
android:initialLayout="@layout/battery_widget"
|
||||
android:minWidth="40dp"
|
||||
android:minHeight="40dp"
|
||||
android:previewImage="@drawable/example_appwidget_preview"
|
||||
android:previewLayout="@layout/battery_widget"
|
||||
android:resizeMode="horizontal|vertical"
|
||||
android:targetCellWidth="1"
|
||||
android:targetCellHeight="1"
|
||||
android:updatePeriodMillis="86400000"
|
||||
android:widgetCategory="home_screen|keyguard" />
|
||||
@@ -1,17 +1,20 @@
|
||||
[versions]
|
||||
accompanistPermissions = "0.36.0"
|
||||
agp = "8.7.0"
|
||||
agp = "8.7.2"
|
||||
hiddenapibypass = "4.3"
|
||||
kotlin = "2.0.0"
|
||||
coreKtx = "1.13.1"
|
||||
coreKtx = "1.15.0"
|
||||
junit = "4.13.2"
|
||||
junitVersion = "1.2.1"
|
||||
espressoCore = "3.6.1"
|
||||
lifecycleRuntimeKtx = "2.8.6"
|
||||
activityCompose = "1.9.2"
|
||||
composeBom = "2024.09.03"
|
||||
lifecycleRuntimeKtx = "2.8.7"
|
||||
activityCompose = "1.9.3"
|
||||
composeBom = "2024.11.00"
|
||||
annotations = "26.0.0"
|
||||
navigationCompose = "2.8.2"
|
||||
navigationCompose = "2.8.4"
|
||||
constraintlayout = "2.2.0"
|
||||
haze = "1.1.1"
|
||||
hazeMaterials = "1.1.1"
|
||||
|
||||
[libraries]
|
||||
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanistPermissions" }
|
||||
@@ -32,6 +35,9 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit
|
||||
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||||
annotations = { group = "org.jetbrains", name = "annotations", version.ref = "annotations" }
|
||||
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
|
||||
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
|
||||
haze = { group = "dev.chrisbanes.haze", name = "haze", version.ref = "haze" }
|
||||
haze-materials = { group = "dev.chrisbanes.haze", name = "haze-materials", version.ref = "hazeMaterials" }
|
||||
|
||||
[plugins]
|
||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||
|
||||
BIN
android/imgs/debug.png
Executable file → Normal file
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 174 KiB |
BIN
android/imgs/notification.png
Normal file
|
After Width: | Height: | Size: 450 KiB |
BIN
android/imgs/popup.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
android/imgs/qstile.png
Normal file
|
After Width: | Height: | Size: 226 KiB |
BIN
android/imgs/settings-1.png
Normal file
|
After Width: | Height: | Size: 203 KiB |
BIN
android/imgs/settings-2.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
|
Before Width: | Height: | Size: 150 KiB |
@@ -16,6 +16,7 @@ dependencyResolutionManagement {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
maven("https://jitpack.io")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1
head-tracking/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
imgs
|
||||
BIN
head-tracking/Extracted Data/1 - 1 to 4.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
head-tracking/Extracted Data/1 - 13 to 16.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
head-tracking/Extracted Data/1 - 17 to 20.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
head-tracking/Extracted Data/1 - 21 to 24.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
head-tracking/Extracted Data/1 - 25 to 28.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
head-tracking/Extracted Data/1 - 29 to 32.png
Normal file
|
After Width: | Height: | Size: 191 KiB |
BIN
head-tracking/Extracted Data/1 - 33 to 36.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
head-tracking/Extracted Data/1 - 37 to 40.png
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
head-tracking/Extracted Data/1 - 41 to 44.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
head-tracking/Extracted Data/1 - 5 to 8.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
head-tracking/Extracted Data/1 - 9 to 12.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
237
head-tracking/Extracted Data/1.txt
Normal file
@@ -0,0 +1,237 @@
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 01 10 07 1A 3A 0E 00 01 C0 92 F4 B0 7A 14 00 00 06 04 83 A7 F2 99 76 00 00 00 00 DD 9B 6A E8 A7 DD FC FF F2 FF 05 00 23 83 00 0E 27 08 02 00 FD FF 00 00 84 FD E7 02 22 01 91 E3 1A 38 27 06 00 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 01 10 07 1A 3A 0E 00 01 F0 5B 58 B3 7A 14 00 00 06 04 83 45 8F 9A 76 00 00 00 00 D9 9B 67 E8 B0 DD F5 FF F3 FF 00 00 23 83 00 0E 27 08 00 00 F9 FF 01 00 84 FD E7 02 22 01 31 B4 1B 38 2F 06 3C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 01 10 07 1A 3A 0E 00 01 20 25 BC B5 7A 14 00 00 06 04 83 E3 2B 9B 76 00 00 00 00 D4 9B 5F E8 AD DD F8 FF F9 FF FA FF 23 83 00 0E 27 08 FE FF 01 00 03 00 85 FD E8 02 23 01 A0 6E E5 37 37 06 5A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 01 10 07 1A 3A 0E 00 01 50 EE 1F B8 7A 14 00 00 06 04 43 81 C8 9B 76 00 00 00 00 D1 9B 56 E8 A7 DD 02 00 FB FF 01 00 23 83 00 0E 27 08 00 00 00 00 06 00 85 FD E8 02 24 01 C3 A0 3C 37 3F 06 78 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 01 10 07 1A 3A 0E 00 01 80 B7 83 BA 7A 14 00 00 06 04 43 1F 65 9C 76 00 00 00 00 CA 9B 4E E8 B4 DD FF FF EF FF 06 00 23 83 00 0E 27 08 FB FF 00 00 00 00 85 FD E8 02 25 01 55 CB 2C 37 47 06 95 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 01 10 07 1A 3A 0E 00 01 B0 80 E7 BC 7A 14 00 00 06 04 43 BD 01 9D 76 00 00 00 00 C1 9B 53 E8 BE DD FC FF 05 00 0B 00 23 83 00 0E 27 08 FA FF FE FF FD FF 85 FD E8 02 25 01 C7 BB 3E 37 4F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 01 10 07 1A 3A 0E 00 01 E0 49 4B BF 7A 14 00 00 06 04 43 5B 9E 9D 76 00 00 00 00 BB 9B 63 E8 BB DD F8 FF 04 00 0F 00 23 83 00 0E 27 08 01 00 00 00 00 00 85 FD E8 02 26 01 37 5F 21 37 57 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 01 10 07 1A 3A 0E 00 01 F8 16 AF C1 7A 14 00 00 06 04 43 FA 3A 9E 76 00 00 00 00 BA 9B 6C E8 B9 DD FF FF FA FF 12 00 23 83 00 0E 27 08 00 00 01 00 00 00 85 FD E9 02 26 01 DA 2E 06 37 5F 06 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 01 10 07 1A 3A 0E 00 01 28 E0 12 C4 7A 14 00 00 06 04 43 98 D7 9E 76 00 00 00 00 B4 9B 77 E8 C6 DD 00 00 FD FF 0F 00 24 83 00 0E 27 08 00 00 00 00 00 00 86 FD E9 02 27 01 38 93 E2 36 67 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 01 10 07 1A 3A 0E 00 01 58 A9 76 C6 7A 14 00 00 06 04 43 36 74 9F 76 00 00 00 00 AC 9B 80 E8 D2 DD F9 FF 00 00 06 00 24 83 00 0E 27 08 FE FF FF FF 00 00 86 FD E9 02 27 01 3D 55 AF 36 6F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 01 10 07 1A 3A 0E 00 01 88 72 DA C8 7A 14 00 00 06 04 43 D4 10 A0 76 00 00 00 00 AB 9B 86 E8 D5 DD FA FF F6 FF FF FF 24 83 00 0E 27 08 0B 00 F5 FF 05 00 87 FD E9 02 28 01 B9 28 81 37 77 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 01 10 07 1A 3A 0E 00 01 B8 3B 3E CB 7A 14 00 00 06 04 83 72 AD A0 76 00 00 00 00 A8 9B 7B E8 E0 DD 0E 00 FE FF 09 00 24 83 00 0E 27 08 FA FF 05 00 01 00 87 FD EA 02 28 01 CD 10 F0 37 7F 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 01 10 07 1A 3A 0E 00 01 E8 04 A2 CD 7A 14 00 00 06 04 83 10 4A A1 76 00 00 00 00 A8 9B 7E E8 EC DD 08 00 FD FF 0B 00 24 83 00 0E 27 08 FE FF 00 00 FD FF 87 FD EA 02 29 01 A1 90 F5 37 87 06 A2 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 01 10 07 1A 3A 0E 00 01 18 CE 05 D0 7A 14 00 00 06 04 83 AE E6 A1 76 00 00 00 00 A8 9B 98 E8 EC DD F9 FF 16 00 16 00 24 83 00 0E 27 08 FF FF FA FF FE FF 88 FD EA 02 29 01 17 76 01 38 8F 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 01 10 07 1A 3A 0E 00 01 30 9B 69 D2 7A 14 00 00 06 04 83 4D 83 A2 76 00 00 00 00 9D 9B BE E8 E5 DD EB FF 09 00 18 00 24 83 00 0E 27 08 02 00 02 00 04 00 88 FD EA 02 29 01 E8 4E 0E 38 97 06 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 01 10 07 1A 3A 0E 00 01 60 64 CD D4 7A 14 00 00 06 04 83 EB 1F A3 76 00 00 00 00 93 9B D6 E8 E6 DD FB FF FC FF 10 00 24 83 00 0E 27 08 02 00 07 00 05 00 89 FD EB 02 2A 01 85 7F 11 38 9F 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 01 10 07 1A 3A 0E 00 01 90 2D 31 D7 7A 14 00 00 06 04 83 89 BC A3 76 00 00 00 00 8F 9B DD E8 F7 DD 08 00 F4 FF 09 00 24 83 00 0E 27 08 05 00 00 00 02 00 8A FD EB 02 2B 01 F2 37 09 38 A7 06 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 01 10 07 1A 3A 0E 00 01 C0 F6 94 D9 7A 14 00 00 06 04 43 27 59 A4 76 00 00 00 00 8B 9B DB E8 12 DE 05 00 FA FF 0B 00 24 83 00 0E 27 08 FC FF 01 00 FD FF 8A FD EC 02 2B 01 55 45 5F 37 AF 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 01 10 07 1A 3A 0E 00 01 F0 BF F8 DB 7A 14 00 00 06 04 43 C5 F5 A4 76 00 00 00 00 84 9B E4 E8 23 DE F8 FF FA FF 0D 00 24 83 00 0E 27 08 00 00 FF FF FD FF 8B FD EC 02 2B 01 B5 DE 2F 37 B7 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 01 10 07 1A 3A 0E 00 01 20 89 5C DE 7A 14 00 00 06 04 43 63 92 A5 76 00 00 00 00 78 9B F2 E8 2D DE F0 FF FE FF 0C 00 24 83 00 0E 27 08 00 00 00 00 FD FF 8B FD EC 02 2B 01 18 EF 55 37 BF 06 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 01 10 07 1A 3A 0E 00 01 50 52 C0 E0 7A 14 00 00 06 04 43 01 2F A6 76 00 00 00 00 6D 9B FF E8 35 DE F8 FF F9 FF 0E 00 25 83 00 0E 27 08 00 00 06 00 00 00 8C FD ED 02 2C 01 C3 5C 2B 37 C7 06 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 01 10 07 1A 3A 0E 00 01 80 1B 24 E3 7A 14 00 00 06 04 43 9F CB A6 76 00 00 00 00 65 9B 0F E9 41 DE F9 FF 00 00 10 00 25 83 00 0E 27 08 00 00 00 00 FD FF 8C FD ED 02 2C 01 34 5C 0F 37 CF 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 01 10 07 1A 3A 0E 00 01 98 E8 87 E5 7A 14 00 00 06 04 43 3E 68 A7 76 00 00 00 00 5F 9B 1B E9 3E DE F3 FF 0D 00 FC FF 25 83 00 0E 27 08 00 00 F8 FF FD FF 8D FD ED 02 2C 01 B8 BE 4C 37 D7 06 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 01 10 07 1A 3A 0E 00 01 C8 B1 EB E7 7A 14 00 00 06 04 43 DC 04 A8 76 00 00 00 00 5C 9B 20 E9 29 DE F8 FF 06 00 FC FF 25 83 00 0E 27 08 03 00 03 00 05 00 8E FD EE 02 2C 01 DC B4 66 37 DF 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 01 10 07 1A 3A 0E 00 01 F8 7A 4F EA 7A 14 00 00 06 04 43 7A A1 A8 76 00 00 00 00 57 9B 18 E9 29 DE 00 00 EE FF 04 00 25 83 00 0E 27 08 00 00 05 00 06 00 8E FD EE 02 2D 01 43 74 87 37 E7 06 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 01 10 07 1A 3A 0E 00 01 28 44 B3 EC 7A 14 00 00 06 04 43 18 3E A9 76 00 00 00 00 4F 9B 0D E9 41 DE FC FF E7 FF 00 00 25 83 00 0E 27 08 F5 FF 04 00 FF FF 8E FD EE 02 2E 01 CE B2 9B 37 EF 06 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 01 10 07 1A 3A 0E 00 01 58 0D 17 EF 7A 14 00 00 06 04 83 B6 DA A9 76 00 00 00 00 49 9B 12 E9 5B DE 00 00 FE FF 16 00 25 83 00 0E 27 08 F5 FF 03 00 01 00 8E FD EF 02 2E 01 8C 9C 3C 38 F7 06 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 01 10 07 1A 3A 0E 00 01 88 D6 7A F1 7A 14 00 00 06 04 83 54 77 AA 76 00 00 00 00 3F 9B 25 E9 78 DE 02 00 F1 FF 21 00 25 83 00 0E 27 08 FC FF 00 00 01 00 8F FD F0 02 2F 01 58 2C 51 38 FF 06 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 01 10 07 1A 3A 0E 00 01 B8 9F DE F3 7A 14 00 00 06 04 83 F2 13 AB 76 00 00 00 00 3C 9B 36 E9 8A DE FF FF 08 00 0E 00 25 83 00 0E 27 08 03 00 F7 FF FB FF 8F FD EF 02 2F 01 EB 6C 60 38 07 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 01 10 07 1A 3A 0E 00 01 D0 6C 42 F6 7A 14 00 00 06 04 83 91 B0 AB 76 00 00 00 00 38 9B 46 E9 86 DE F7 FF 03 00 09 00 25 83 00 0E 27 08 0C 00 FD FF 02 00 90 FD F0 02 2F 01 D6 9B 86 38 0F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 01 10 07 1A 3A 0E 00 01 00 36 A6 F8 7A 14 00 00 06 04 83 2F 4D AC 76 00 00 00 00 2C 9B 52 E9 90 DE F7 FF F2 FF 10 00 25 83 00 0E 27 08 07 00 00 00 04 00 92 FD F0 02 30 01 78 07 8A 38 17 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 01 10 07 1A 3A 0E 00 01 30 FF 09 FB 7A 14 00 00 06 04 83 CD E9 AC 76 00 00 00 00 1C 9B 58 E9 A6 DE FF FF F5 FF 0A 00 25 83 00 0E 27 08 00 00 05 00 03 00 92 FD F1 02 31 01 10 43 89 38 1F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 01 10 07 1A 3A 0E 00 01 60 C8 6D FD 7A 14 00 00 06 04 83 6B 86 AD 76 00 00 00 00 14 9B 60 E9 B7 DE 01 00 F7 FF 0E 00 26 83 00 0E 27 08 01 00 06 00 06 00 93 FD F1 02 31 01 3E 37 34 38 27 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 01 10 07 1A 3A 0E 00 01 90 91 D1 FF 7A 14 00 00 06 04 83 09 23 AE 76 00 00 00 00 0C 9B 67 E9 CD DE FF FF FA FF 0E 00 26 83 00 0E 27 08 00 00 01 00 00 00 94 FD F2 02 32 01 4A 35 0D 38 2F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 01 10 07 1A 3A 0E 00 01 C0 5A 35 02 7B 14 00 00 06 04 83 A7 BF AE 76 00 00 00 00 07 9B 76 E9 D6 DE FD FF 05 00 0B 00 26 83 00 0E 27 08 00 00 00 00 00 00 94 FD F2 02 32 01 97 17 F9 37 37 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 01 10 07 1A 3A 0E 00 01 F0 23 99 04 7B 14 00 00 06 04 43 45 5C AF 76 00 00 00 00 05 9B 86 E9 D6 DE FD FF 05 00 08 00 26 83 00 0E 27 08 04 00 01 00 01 00 95 FD F3 02 33 01 78 A3 77 37 3F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 01 10 07 1A 3A 0E 00 01 08 F1 FC 06 7B 14 00 00 06 04 43 E4 F8 AF 76 00 00 00 00 02 9B 92 E9 DC DE 01 00 FC FF 0F 00 26 83 00 0E 27 08 02 00 04 00 03 00 96 FD F3 02 34 01 05 E7 1C 37 47 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 01 10 07 1A 3A 0E 00 01 38 BA 60 09 7B 14 00 00 06 04 43 82 95 B0 76 00 00 00 00 F9 9A 9D E9 F3 DE FE FF F2 FF 13 00 26 83 00 0E 27 08 00 00 02 00 FE FF 97 FD F4 02 34 01 BE C7 EE 36 4F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 01 10 07 1A 3A 0E 00 01 68 83 C4 0B 7B 14 00 00 06 04 43 20 32 B1 76 00 00 00 00 F0 9A AD E9 07 DF F7 FF FE FF 10 00 26 83 00 0E 27 08 00 00 FC FF FC FF 98 FD F4 02 34 01 E0 8B 83 36 57 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 01 10 07 1A 3A 0E 00 01 98 4C 28 0E 7B 14 00 00 06 04 43 BE CE B1 76 00 00 00 00 E7 9A BD E9 13 DF 04 00 00 00 0D 00 26 83 00 0E 27 08 07 00 F9 FF FE FF 98 FD F5 02 34 01 24 D0 FD 36 5F 07 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 01 10 07 1A 3A 0E 00 01 C8 15 8C 10 7B 14 00 00 06 04 83 5C 6B B2 76 00 00 00 00 E0 9A B8 E9 12 DF 00 00 FE FF FF FF 26 83 00 0E 27 08 FA FF 0E 00 01 00 99 FD F5 02 35 01 45 A0 1C 38 67 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 01 10 07 1A 3A 0E 00 01 F8 DE EF 12 7B 14 00 00 06 04 83 FA 07 B3 76 00 00 00 00 E6 9A BE E9 0C DF 00 00 02 00 00 00 26 83 00 0E 27 08 08 00 00 00 05 00 9A FD F5 02 35 01 E7 22 35 38 6F 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 01 10 07 1A 3A 0E 00 01 28 A8 53 15 7B 14 00 00 06 04 83 98 A4 B3 76 00 00 00 00 E1 9A B5 E9 1C DF FD FF EC FF 00 00 26 83 00 0E 27 08 03 00 FF FF 01 00 9B FD F6 02 36 01 6F F8 37 38 77 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 02 10 07 1A 3A 0E 00 01 40 75 B7 17 7B 14 00 00 06 04 83 37 41 B4 76 00 00 00 00 DC 9A AE E9 28 DF FE FF F9 FF 00 00 27 83 00 0E 27 08 01 00 FF FF 02 00 9C FD F6 02 37 01 12 6B 35 38 7F 07 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 02 10 07 1A 3A 0E 00 01 70 3E 1B 1A 7B 14 00 00 06 04 83 D5 DD B4 76 00 00 00 00 D4 9A AD E9 31 DF FB FF F7 FF 01 00 27 83 00 0E 27 08 01 00 00 00 05 00 9C FD F7 02 37 01 18 63 38 38 87 07 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 02 10 07 1A 3A 0E 00 01 A0 07 7F 1C 7B 14 00 00 06 04 83 73 7A B5 76 00 00 00 00 D0 9A AE E9 38 DF FC FF FE FF FE FF 27 83 00 0E 27 08 00 00 FB FF 01 00 9D FD F7 02 38 01 6E 7B 38 38 8F 07 A2 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 02 10 07 1A 3A 0E 00 01 D0 D0 E2 1E 7B 14 00 00 06 04 43 11 17 B6 76 00 00 00 00 D0 9A AE E9 30 DF 02 00 07 00 FC FF 27 83 00 0E 27 08 FF FF 00 00 01 00 9D FD F7 02 38 01 6D 09 A1 37 97 07 91 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 02 10 07 1A 3A 0E 00 01 00 9A 46 21 7B 14 00 00 06 04 43 AF B3 B6 76 00 00 00 00 D3 9A B1 E9 24 DF FD FF 01 00 FD FF 27 83 00 0E 27 08 01 00 FD FF 02 00 9D FD F7 02 39 01 11 78 B8 36 9F 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 02 10 07 1A 3A 0E 00 01 30 63 AA 23 7B 14 00 00 06 04 43 4D 50 B7 76 00 00 00 00 D1 9A B0 E9 1F DF FD FF 05 00 FF FF 27 83 03 0E 27 08 FE FF FF FF FF FF 9E FD F7 02 39 01 BD EA 90 36 A7 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 02 10 07 1A 3A 0E 00 01 48 30 0E 26 7B 14 00 00 06 04 43 EC EC B7 76 00 00 00 00 CF 9A B3 E9 1A DF FD FF 01 00 03 00 27 83 03 0E 27 08 00 00 00 00 03 00 9E FD F7 02 39 01 0D 28 8B 36 AF 07 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 02 10 07 1A 3A 0E 00 01 78 F9 71 28 7B 14 00 00 06 04 43 8A 89 B8 76 00 00 00 00 CA 9A B4 E9 21 DF 01 00 F9 FF 06 00 27 83 03 0E 27 08 FE FF 02 00 02 00 9F FD F8 02 3A 01 58 E0 A5 36 B7 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 02 10 07 1A 3A 0E 00 01 A8 C2 D5 2A 7B 14 00 00 06 04 43 28 26 B9 76 00 00 00 00 C8 9A B5 E9 29 DF 04 00 00 00 01 00 27 83 03 0E 27 08 FD FF FF FF FF FF 9F FD F8 02 3A 01 A8 63 8F 36 BF 07 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 02 10 07 1A 3A 0E 00 01 D8 8B 39 2D 7B 14 00 00 06 04 43 C6 C2 B9 76 00 00 00 00 CA 9A B7 E9 2A DF 02 00 08 00 04 00 27 83 03 0E 27 08 FA FF 00 00 FB FF 9F FD F8 02 3A 01 5C CE 41 36 C7 07 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 02 10 07 1A 3A 0E 00 01 08 55 9D 2F 7B 14 00 00 06 04 43 64 5F BA 76 00 00 00 00 CA 9A CA E9 21 DF FC FF 10 00 11 00 27 83 03 0E 27 08 FD FF 07 00 00 00 9F FD F8 02 3A 01 E5 FF C3 36 CF 07 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 02 10 07 1A 3A 0E 00 01 38 1E 01 32 7B 14 00 00 06 04 43 02 FC BA 76 00 00 00 00 CA 9A E0 E9 1F DF F4 FF 01 00 01 00 27 83 03 0E 27 08 05 00 F8 FF 00 00 A0 FD F8 02 3A 01 24 22 97 37 D7 07 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 02 10 07 1A 3A 0E 00 01 68 E7 64 34 7B 14 00 00 06 04 43 A0 98 BB 76 00 00 00 00 CB 9A E6 E9 1F DF 06 00 07 00 09 00 28 83 03 0E 27 08 00 00 06 00 00 00 A0 FD F9 02 3B 01 68 90 D8 37 DF 07 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 02 10 07 1A 3A 0E 00 01 80 B4 C8 36 7B 14 00 00 06 04 43 3F 35 BC 76 00 00 00 00 CB 9A ED E9 2E DF 06 00 F0 FF 10 00 28 83 03 0E 27 08 07 00 01 00 01 00 A1 FD F9 02 3B 01 56 4A D7 37 E7 07 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 02 10 07 1A 3A 0E 00 01 B0 7D 2C 39 7B 14 00 00 06 04 83 DD D1 BC 76 00 00 00 00 C4 9A EA E9 4B DF FF FF E6 FF 02 00 28 83 03 0E 27 08 04 00 FC FF FB FF A1 FD F9 02 3B 01 DC 7E 08 38 EF 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 02 10 07 1A 3A 0E 00 01 E0 46 90 3B 7B 14 00 00 06 04 83 7B 6E BD 76 00 00 00 00 BB 9A DD E9 5A DF F4 FF F6 FF F4 FF 28 83 03 0E 27 08 05 00 FD FF FC FF A2 FD F9 02 3B 01 E8 4C 2C 38 F7 07 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 02 10 07 1A 3A 0E 00 01 10 10 F4 3D 7B 14 00 00 06 04 83 19 0B BE 76 00 00 00 00 B0 9A CC E9 5E DF F9 FF EE FF F8 FF 28 83 03 0E 27 08 02 00 03 00 01 00 A3 FD FA 02 3B 01 A5 31 29 38 FF 07 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 02 10 07 1A 3A 0E 00 01 40 D9 57 40 7B 14 00 00 06 04 83 B7 A7 BE 76 00 00 00 00 AA 9A B6 E9 67 DF FA FF F2 FF F1 FF 28 83 03 0E 27 08 FA FF 00 00 02 00 A3 FD FA 02 3C 01 68 B1 FC 37 07 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 02 10 07 1A 3A 0E 00 01 70 A2 BB 42 7B 14 00 00 06 04 83 55 44 BF 76 00 00 00 00 AA 9A A4 E9 68 DF 04 00 00 00 F9 FF 28 83 03 0E 27 08 F8 FF 05 00 00 00 A3 FD FA 02 3C 01 12 83 00 38 0F 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 02 10 07 1A 3A 0E 00 01 88 6F 1F 45 7B 14 00 00 06 04 83 F4 E0 BF 76 00 00 00 00 AD 9A A3 E9 64 DF 01 00 07 00 01 00 28 83 03 0E 27 08 FB FF 00 00 00 00 A3 FD FA 02 3C 01 92 9E 0A 38 17 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 02 10 07 1A 3A 0E 00 01 B8 38 83 47 7B 14 00 00 06 04 83 92 7D C0 76 00 00 00 00 AF 9A AD E9 5C DF FC FF 0F 00 04 00 28 83 03 0E 27 08 FD FF FF FF FD FF A3 FD FA 02 3D 01 19 28 E5 37 1F 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 02 10 07 1A 3A 0E 00 01 E8 01 E7 49 7B 14 00 00 06 04 43 30 1A C1 76 00 00 00 00 B1 9A BF E9 4D DF FA FF 0C 00 07 00 28 83 03 0E 27 08 02 00 FF FF 00 00 A3 FD FA 02 3D 01 30 94 9D 37 27 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 02 10 07 1A 3A 0E 00 01 18 CB 4A 4C 7B 14 00 00 06 04 43 CE B6 C1 76 00 00 00 00 AD 9A CD E9 48 DF FE FF 03 00 08 00 28 83 03 0E 27 08 00 00 00 00 00 00 A3 FD FA 02 3D 01 C3 FF 90 37 2F 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 02 10 07 1A 3A 0E 00 01 48 94 AE 4E 7B 14 00 00 06 04 43 6C 53 C2 76 00 00 00 00 AB 9A D3 E9 43 DF F9 FF 05 00 FC FF 28 83 03 0E 27 08 FF FF FE FF FE FF A3 FD FA 02 3D 01 3C 6C 9D 37 37 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 02 10 07 1A 3A 0E 00 01 78 5D 12 51 7B 14 00 00 06 04 43 0A F0 C2 76 00 00 00 00 A8 9A D8 E9 3B DF FA FF 06 00 01 00 29 83 03 0E 27 08 00 00 00 00 00 00 A4 FD FA 02 3D 01 0E 05 31 37 3F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 02 10 07 1A 3A 0E 00 01 90 2A 76 53 7B 14 00 00 06 04 43 A9 8C C3 76 00 00 00 00 A0 9A DF E9 36 DF F8 FF 00 00 04 00 29 83 03 0E 27 08 01 00 FE FF 00 00 A4 FD FA 02 3E 01 F1 81 AB 36 47 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 02 10 07 1A 3A 0E 00 01 C0 F3 D9 55 7B 14 00 00 06 04 43 47 29 C4 76 00 00 00 00 98 9A DC E9 33 DF F4 FF FC FF F6 FF 29 83 03 0E 27 08 FA FF 06 00 00 00 A4 FD FA 02 3E 01 5B 10 5D 37 4F 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 02 10 07 1A 3A 0E 00 01 F0 BC 3D 58 7B 14 00 00 06 04 83 E5 C5 C4 76 00 00 00 00 9B 9A DE E9 2F DF 07 00 06 00 05 00 29 83 03 0E 27 08 FE FF 04 00 04 00 A4 FD FA 02 3E 01 85 2E 02 38 57 08 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 02 10 07 1A 3A 0E 00 01 20 86 A1 5A 7B 14 00 00 06 04 83 83 62 C5 76 00 00 00 00 9C 9A DF E9 3A DF 01 00 F9 FF 04 00 29 83 03 0E 27 08 00 00 FE FF 01 00 A4 FD FA 02 3F 01 DA 50 03 38 5F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 02 10 07 1A 3A 0E 00 01 50 4F 05 5D 7B 14 00 00 06 04 83 21 FF C5 76 00 00 00 00 9B 9A E1 E9 42 DF 01 00 04 00 05 00 29 83 03 0E 27 08 FF FF 00 00 FE FF A4 FD FA 02 3F 01 8E 5B F6 37 67 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 02 10 07 1A 3A 0E 00 01 80 18 69 5F 7B 14 00 00 06 04 83 BF 9B C6 76 00 00 00 00 99 9A E5 E9 42 DF FA FF FF FF 00 00 29 83 03 0E 27 08 05 00 FC FF 01 00 A4 FD FA 02 3F 01 14 D2 05 38 6F 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 02 10 07 1A 3A 0E 00 01 98 E5 CC 61 7B 14 00 00 06 04 83 5E 38 C7 76 00 00 00 00 95 9A E2 E9 45 DF 00 00 FA FF 00 00 29 83 03 0E 27 08 00 00 00 00 01 00 A5 FD FA 02 3F 01 6D 6A 03 38 77 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 02 10 07 1A 3A 0E 00 01 C8 AE 30 64 7B 14 00 00 06 04 83 FC D4 C7 76 00 00 00 00 90 9A D7 E9 46 DF FD FF 00 00 F3 FF 29 83 03 0E 27 08 FE FF FF FF FF FF A5 FD FA 02 3F 01 A2 B0 DB 37 7F 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 02 10 07 1A 3A 0E 00 01 F8 77 94 66 7B 14 00 00 06 04 43 9A 71 C8 76 00 00 00 00 92 9A CF E9 3A DF FC FF 04 00 F7 FF 29 83 03 0E 27 08 00 00 00 00 03 00 A5 FD FA 02 40 01 EE 73 F3 36 87 08 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 02 10 07 1A 3A 0E 00 01 28 41 F8 68 7B 14 00 00 06 04 43 38 0E C9 76 00 00 00 00 8F 9A CD E9 34 DF F8 FF FE FF FF FF 29 83 03 0E 27 08 FE FF 01 00 02 00 A5 FD FA 02 40 01 A4 32 C0 36 8F 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 02 10 07 1A 3A 0E 00 01 58 0A 5C 6B 7B 14 00 00 06 04 43 D6 AA C9 76 00 00 00 00 8C 9A D0 E9 32 DF FF FF 05 00 01 00 2A 83 03 0E 27 08 FF FF FD FF 02 00 A5 FD FA 02 40 01 47 7D F3 36 97 08 9D 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 02 10 07 1A 3A 0E 00 01 88 D3 BF 6D 7B 14 00 00 06 04 43 74 47 CA 76 00 00 00 00 8B 9A D4 E9 30 DF FF FF 00 00 01 00 2A 83 03 0E 27 08 00 00 01 00 04 00 A5 FD FA 02 41 01 68 53 DB 36 9F 08 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 02 10 07 1A 3A 0E 00 01 A0 A0 23 70 7B 14 00 00 06 04 43 13 E4 CA 76 00 00 00 00 8C 9A D6 E9 35 DF 05 00 00 00 07 00 2A 83 03 0E 27 08 FD FF FE FF FF FF A4 FD FA 02 41 01 6C CE 06 37 A7 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 02 10 07 1A 3A 0E 00 01 D0 69 87 72 7B 14 00 00 06 04 43 B1 80 CB 76 00 00 00 00 8E 9A DD E9 32 DF FC FF 06 00 00 00 2A 83 03 0E 27 08 01 00 FA FF FE FF A5 FD FA 02 41 01 17 D8 2C 37 AF 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 02 10 07 1A 3A 0E 00 01 00 33 EB 74 7B 14 00 00 06 04 43 4F 1D CC 76 00 00 00 00 8D 9A E5 E9 2B DF F8 FF 01 00 02 00 2A 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 41 01 37 8E 30 37 B7 08 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 02 10 07 1A 3A 0E 00 01 30 FC 4E 77 7B 14 00 00 06 04 43 ED B9 CC 76 00 00 00 00 8C 9A EF E9 2B DF 00 00 FE FF 02 00 2A 83 03 0E 27 08 06 00 F6 FF 00 00 A5 FD FA 02 41 01 6D 5D 9A 37 BF 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 02 10 07 1A 3A 0E 00 01 60 C5 B2 79 7B 14 00 00 06 04 83 8B 56 CD 76 00 00 00 00 86 9A E7 E9 2F DF 03 00 00 00 02 00 2A 83 03 0E 27 08 F6 FF 08 00 FF FF A5 FD FA 02 41 01 48 62 EB 37 C7 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 02 10 07 1A 3A 0E 00 01 90 8E 16 7C 7B 14 00 00 06 04 83 29 F3 CD 76 00 00 00 00 88 9A EE E9 31 DF 00 00 FA FF 0A 00 2A 83 03 0E 27 08 01 00 01 00 03 00 A5 FD FA 02 42 01 8A 3E 00 38 CF 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 02 10 07 1A 3A 0E 00 01 A8 5B 7A 7E 7B 14 00 00 06 04 83 C8 8F CE 76 00 00 00 00 80 9A F3 E9 41 DF F7 FF F9 FF 0A 00 2A 83 03 0E 27 08 FC FF FF FF FD FF A5 FD FA 02 42 01 24 FD E6 37 D7 08 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 02 10 07 1A 3A 0E 00 01 D8 24 DE 80 7B 14 00 00 06 04 83 66 2C CF 76 00 00 00 00 7B 9A 00 EA 41 DF FA FF 08 00 06 00 2A 83 03 0E 27 08 FF FF 00 00 01 00 A5 FD FA 02 42 01 48 E2 DA 37 DF 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 02 10 07 1A 3A 0E 00 01 08 EE 41 83 7B 14 00 00 06 04 43 04 C9 CF 76 00 00 00 00 78 9A 0B EA 3D DF FC FF 02 00 04 00 2A 83 03 0E 27 08 00 00 01 00 03 00 A5 FD FA 02 42 01 14 FF C8 37 E7 08 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 02 10 07 1A 3A 0E 00 01 38 B7 A5 85 7B 14 00 00 06 04 43 A2 65 D0 76 00 00 00 00 76 9A 13 EA 3C DF F9 FF FF FF 00 00 2A 83 03 0E 27 08 07 00 FC FF 01 00 A6 FD FA 02 42 01 CA 6A CA 37 EF 08 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 02 10 07 1A 3A 0E 00 01 68 80 09 88 7B 14 00 00 06 04 43 40 02 D1 76 00 00 00 00 74 9A 13 EA 39 DF 02 00 09 00 FE FF 2B 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 C4 34 54 37 F7 08 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 02 10 07 1A 3A 0E 00 01 98 49 6D 8A 7B 14 00 00 06 04 43 DE 9E D1 76 00 00 00 00 78 9A 14 EA 2F DF FE FF 03 00 FA FF 2B 83 03 0E 27 08 01 00 FD FF FF FF A6 FD FA 02 43 01 48 3F C9 36 FF 08 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 02 10 07 1A 3A 0E 00 01 B0 16 D1 8C 7B 14 00 00 06 04 43 7D 3B D2 76 00 00 00 00 76 9A 14 EA 27 DF FC FF 00 00 01 00 2B 83 03 0E 27 08 FF FF 01 00 FF FF A6 FD FA 02 43 01 87 EA D7 36 07 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 02 10 07 1A 3A 0E 00 01 E0 DF 34 8F 7B 14 00 00 06 04 43 1B D8 D2 76 00 00 00 00 74 9A 1A EA 22 DF FF FF 04 00 00 00 2B 83 03 0E 27 08 00 00 00 00 02 00 A6 FD FA 02 43 01 F6 A7 DC 36 0F 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 02 10 07 1A 3A 0E 00 01 10 A9 98 91 7B 14 00 00 06 04 43 B9 74 D3 76 00 00 00 00 73 9A 18 EA 20 DF FE FF 00 00 FD FF 2B 83 03 0E 27 08 00 00 02 00 01 00 A6 FD FA 02 43 01 9A 79 E4 36 17 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 02 10 07 1A 3A 0E 00 01 40 72 FC 93 7B 14 00 00 06 04 43 57 11 D4 76 00 00 00 00 73 9A 14 EA 20 DF 03 00 FF FF FF FF 2B 83 03 0E 27 08 FE FF 00 00 FF FF A6 FD FA 02 43 01 CB 4F D2 36 1F 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 02 10 07 1A 3A 0E 00 01 70 3B 60 96 7B 14 00 00 06 04 43 F5 AD D4 76 00 00 00 00 75 9A 10 EA 1C DF FD FF 04 00 F8 FF 2B 83 03 0E 27 08 FF FF FC FF 00 00 A6 FD FA 02 43 01 98 22 B1 36 27 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 02 10 07 1A 3A 0E 00 01 A0 04 C4 98 7B 14 00 00 06 04 43 93 4A D5 76 00 00 00 00 74 9A 0C EA 15 DF FF FF 00 00 00 00 2B 83 03 0E 27 08 FD FF 01 00 01 00 A6 FD FA 02 43 01 44 83 CF 36 2F 09 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 02 10 07 1A 3A 0E 00 01 B8 D1 27 9B 7B 14 00 00 06 04 43 32 E7 D5 76 00 00 00 00 73 9A 0C EA 11 DF 02 00 05 00 03 00 2B 83 03 0E 27 08 FF FF 00 00 00 00 A6 FD FA 02 43 01 12 0A D5 36 37 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 02 10 07 1A 3A 0E 00 01 E8 9A 8B 9D 7B 14 00 00 06 04 43 D0 83 D6 76 00 00 00 00 74 9A 0A EA 0B DF F9 FF 01 00 F6 FF 2B 83 03 0E 27 08 F8 FF 04 00 00 00 A6 FD F9 02 43 01 C2 B9 5E 37 3F 09 9D 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 02 10 07 1A 3A 0E 00 01 18 64 EF 9F 7B 14 00 00 06 04 83 6E 20 D7 76 00 00 00 00 78 9A 11 EA 04 DF 00 00 0E 00 08 00 2B 83 03 0E 27 08 FA FF 00 00 01 00 A5 FD FA 02 44 01 D3 75 E1 37 47 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 02 10 07 1A 3A 0E 00 01 48 2D 53 A2 7B 14 00 00 06 04 83 0C BD D7 76 00 00 00 00 79 9A 1E EA 08 DF 00 00 00 00 0C 00 2C 83 03 0E 27 08 01 00 FC FF FF FF A5 FD FA 02 44 01 46 F5 E8 37 4F 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 02 10 07 1A 3A 0E 00 01 78 F6 B6 A4 7B 14 00 00 06 04 43 AA 59 D8 76 00 00 00 00 77 9A 2E EA 08 DF 01 00 0C 00 0B 00 2C 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 44 01 1F C0 DF 37 57 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 02 10 07 1A 3A 0E 00 01 A8 BF 1A A7 7B 14 00 00 06 04 43 48 F6 D8 76 00 00 00 00 77 9A 3C EA 07 DF 00 00 01 00 09 00 2C 83 03 0E 27 08 04 00 03 00 03 00 A6 FD FA 02 44 01 9E 29 D6 37 5F 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 02 10 07 1A 3A 0E 00 01 C0 8C 7E A9 7B 14 00 00 06 04 43 E7 92 D9 76 00 00 00 00 77 9A 3E EA 0D DF 04 00 FA FF 02 00 2C 83 03 0E 27 08 04 00 FF FF 01 00 A6 FD FA 02 44 01 D6 89 CA 37 67 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 02 10 07 1A 3A 0E 00 01 F0 55 E2 AB 7B 14 00 00 06 04 83 85 2F DA 76 00 00 00 00 75 9A 34 EA 0F DF FC FF FE FF F1 FF 2C 83 03 0E 27 08 04 00 FE FF FC FF A6 FD FA 02 44 01 90 A7 DC 37 6F 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 02 10 07 1A 3A 0E 00 01 20 1F 46 AE 7B 14 00 00 06 04 43 23 CC DA 76 00 00 00 00 78 9A 27 EA 04 DF 03 00 03 00 F2 FF 2C 83 03 0E 27 08 01 00 00 00 03 00 A6 FD FA 02 44 01 24 73 3B 37 77 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 02 10 07 1A 3A 0E 00 01 50 E8 A9 B0 7B 14 00 00 06 04 43 C1 68 DB 76 00 00 00 00 7B 9A 18 EA FF DE 00 00 FA FF F6 FF 2C 83 03 0E 27 08 FE FF 00 00 02 00 A6 FD FA 02 44 01 1D 19 26 37 7F 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 02 10 07 1A 3A 0E 00 01 80 B1 0D B3 7B 14 00 00 06 04 43 5F 05 DC 76 00 00 00 00 7C 9A 12 EA FE DE 04 00 04 00 00 00 2C 83 03 0E 27 08 FC FF FF FF 00 00 A6 FD FA 02 44 01 39 75 3C 37 87 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C2 02 10 07 1A 3A 0E 00 01 98 7E 71 B5 7B 14 00 00 06 04 43 FE A1 DC 76 00 00 00 00 7D 9A 13 EA FE DE 00 00 02 00 01 00 2C 83 03 0E 27 08 FD FF FD FF 00 00 A6 FD F9 02 44 01 E5 EA 45 37 8F 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C3 02 10 07 1A 3A 0E 00 01 C8 47 D5 B7 7B 14 00 00 06 04 43 9C 3E DD 76 00 00 00 00 7D 9A 1A EA FC DE 01 00 06 00 08 00 2C 83 03 0E 27 08 F9 FF 00 00 FF FF A5 FD F9 02 44 01 DA 97 68 37 97 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C4 02 10 07 1A 3A 0E 00 01 F8 10 39 BA 7B 14 00 00 06 04 43 3A DB DD 76 00 00 00 00 81 9A 2A EA F5 DE 00 00 0B 00 09 00 2C 83 03 0E 27 08 01 00 FE FF 01 00 A5 FD F9 02 44 01 12 7A 10 37 9F 09 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C5 02 10 07 1A 3A 0E 00 01 28 DA 9C BC 7B 14 00 00 06 04 43 D8 77 DE 76 00 00 00 00 81 9A 35 EA F5 DE 04 00 00 00 09 00 2C 83 03 0E 27 08 00 00 01 00 00 00 A5 FD F9 02 44 01 92 33 EC 36 A7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C6 02 10 07 1A 3A 0E 00 01 58 A3 00 BF 7B 14 00 00 06 04 43 76 14 DF 76 00 00 00 00 85 9A 3A EA FD DE 0A 00 02 00 04 00 2D 83 03 0E 27 08 FC FF 00 00 FB FF A5 FD F9 02 44 01 D8 CE 06 37 AF 09 A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C7 02 10 07 1A 3A 0E 00 01 88 6C 64 C1 7B 14 00 00 06 04 43 14 B1 DF 76 00 00 00 00 8B 9A 3D EA F4 DE 03 00 0E 00 FE FF 2D 83 03 0E 27 08 00 00 FF FF FD FF A5 FD F9 02 43 01 25 A8 D6 36 B7 09 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C8 02 10 07 1A 3A 0E 00 01 A0 39 C8 C3 7B 14 00 00 06 04 43 B3 4D E0 76 00 00 00 00 91 9A 3B EA EC DE F8 FF FB FF F4 FF 2D 83 03 0E 27 08 03 00 F8 FF FE FF A5 FD F9 02 43 01 E4 B1 A0 37 BF 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C9 02 10 07 1A 3A 0E 00 01 D0 02 2C C6 7B 14 00 00 06 04 83 51 EA E0 76 00 00 00 00 92 9A 30 EA E9 DE 05 00 03 00 00 00 2D 83 03 0E 27 08 FB FF 03 00 00 00 A5 FD F9 02 43 01 E3 99 D9 37 C7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CA 02 10 07 1A 3A 0E 00 01 00 CC 8F C8 7B 14 00 00 06 04 43 EF 86 E1 76 00 00 00 00 92 9A 2C EA F1 DE 01 00 F3 FF 05 00 2D 83 03 0E 27 08 01 00 00 00 02 00 A5 FD F9 02 43 01 C4 9A D1 37 CF 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CB 02 10 07 1A 3A 0E 00 01 30 95 F3 CA 7B 14 00 00 06 04 83 8D 23 E2 76 00 00 00 00 8E 9A 2C EA 03 DF 05 00 FB FF 0C 00 2D 83 03 0E 27 08 FC FF FE FF FE FF A5 FD F9 02 43 01 F3 64 D5 37 D7 09 A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CC 02 10 07 1A 3A 0E 00 01 60 5E 57 CD 7B 14 00 00 06 04 83 2B C0 E2 76 00 00 00 00 8B 9A 33 EA 08 DF F7 FF 02 00 04 00 2D 83 03 0E 27 08 00 00 FD FF FF FF A5 FD F9 02 43 01 3A 44 E0 37 DF 09 A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CD 02 10 07 1A 3A 0E 00 01 78 2B BB CF 7B 14 00 00 06 04 83 CA 5C E3 76 00 00 00 00 86 9A 3E EA 07 DF FD FF 04 00 08 00 2D 83 03 0E 27 08 FD FF 03 00 FF FF A5 FD F9 02 43 01 0E C9 E4 37 E7 09 A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CE 02 10 07 1A 3A 0E 00 01 A8 F4 1E D2 7B 14 00 00 06 04 43 68 F9 E3 76 00 00 00 00 87 9A 4B EA FC DE FA FF 13 00 FC FF 2D 83 03 0E 27 08 00 00 FC FF FD FF A5 FD F9 02 42 01 85 9A B3 37 EF 09 A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CF 02 10 07 1A 3A 0E 00 01 D8 BD 82 D4 7B 14 00 00 06 04 43 06 96 E4 76 00 00 00 00 8B 9A 51 EA E2 DE F8 FF 13 00 F9 FF 2D 83 03 0E 27 08 FF FF 02 00 FE FF A5 FD F9 02 42 01 A0 A9 42 37 F7 09 A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D0 02 10 07 1A 3A 0E 00 01 08 87 E6 D6 7B 14 00 00 06 04 43 A4 32 E5 76 00 00 00 00 8E 9A 58 EA CE DE F7 FF 0A 00 00 00 2D 83 03 0E 27 08 01 00 02 00 00 00 A5 FD FA 02 42 01 09 DC 57 37 FF 09 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D1 02 10 07 1A 3A 0E 00 01 38 50 4A D9 7B 14 00 00 06 04 43 42 CF E5 76 00 00 00 00 85 9A 68 EA CD DE F2 FF FF FF 0F 00 2D 83 03 0E 27 08 01 00 05 00 00 00 A5 FD FA 02 42 01 74 E1 79 37 07 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D2 02 10 07 1A 3A 0E 00 01 68 19 AE DB 7B 14 00 00 06 04 43 E0 6B E6 76 00 00 00 00 78 9A 80 EA DB DE F8 FF FB FF 14 00 2E 83 03 0E 27 08 01 00 03 00 01 00 A5 FD FA 02 42 01 73 73 75 37 0F 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D3 02 10 07 1A 3A 0E 00 01 80 E6 11 DE 7B 14 00 00 06 04 43 7F 08 E7 76 00 00 00 00 71 9A 90 EA EA DE FF FF FE FF 0D 00 2E 83 03 0E 27 08 02 00 FF FF FE FF A5 FD FA 02 42 01 FD 64 76 37 17 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D4 02 10 07 1A 3A 0E 00 01 B0 AF 75 E0 7B 14 00 00 06 04 43 1D A5 E7 76 00 00 00 00 6E 9A 96 EA F1 DE 03 00 00 00 03 00 2E 83 03 0E 27 08 00 00 00 00 00 00 A6 FD FA 02 42 01 85 02 43 37 1F 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 02 10 07 1A 3A 0E 00 01 E0 78 D9 E2 7B 14 00 00 06 04 43 BB 41 E8 76 00 00 00 00 6F 9A 8E EA F0 DE 00 00 FE FF F4 FF 2E 83 03 0E 27 08 00 00 FE FF FF FF A6 FD FA 02 42 01 50 1D 52 37 27 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 02 10 07 1A 3A 0E 00 01 10 42 3D E5 7B 14 00 00 06 04 43 59 DE E8 76 00 00 00 00 71 9A 7F EA F1 DE 05 00 F5 FF F9 FF 2E 83 03 0E 27 08 00 00 FF FF FF FF A6 FD FA 02 42 01 45 B6 2A 37 2F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 02 10 07 1A 3A 0E 00 01 40 0B A1 E7 7B 14 00 00 06 04 43 F7 7A E9 76 00 00 00 00 70 9A 74 EA F9 DE 0A 00 F9 FF 01 00 2E 83 03 0E 27 08 FC FF FC FF FE FF A6 FD FA 02 42 01 E4 9F 39 37 37 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 02 10 07 1A 3A 0E 00 01 58 D8 04 EA 7B 14 00 00 06 04 43 96 17 EA 76 00 00 00 00 6C 9A 66 EA F8 DE F4 FF F9 FF EF FF 2E 83 03 0E 27 08 F7 FF 01 00 FB FF A6 FD FA 02 42 01 D8 CC E5 37 3F 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 02 10 07 1A 3A 0E 00 01 88 A1 68 EC 7B 14 00 00 06 04 83 34 B4 EA 76 00 00 00 00 6E 9A 67 EA EF DE FC FF 01 00 01 00 2E 83 03 0E 27 08 00 00 03 00 05 00 A6 FD FA 02 42 01 75 41 28 38 47 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 02 10 07 1A 3A 0E 00 01 B8 6A CC EE 7B 14 00 00 06 04 83 D2 50 EB 76 00 00 00 00 6A 9A 60 EA FF DE 00 00 F0 FF 01 00 2E 83 03 0E 27 08 00 00 F9 FF 00 00 A6 FD FA 02 42 01 7A 2B 2C 38 4F 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 02 10 07 1A 3A 0E 00 01 E8 33 30 F1 7B 14 00 00 06 04 83 70 ED EB 76 00 00 00 00 65 9A 5D EA 08 DF 00 00 00 00 06 00 2E 83 03 0E 27 08 FC FF FF FF FF FF A6 FD FA 02 42 01 D7 03 26 38 57 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 02 10 07 1A 3A 0E 00 01 18 FD 93 F3 7B 14 00 00 06 04 83 0E 8A EC 76 00 00 00 00 5E 9A 69 EA 0A DF F6 FF 00 00 09 00 2E 83 03 0E 27 08 00 00 00 00 04 00 A6 FD FA 02 43 01 F1 AB 23 38 5F 0A 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 02 10 07 1A 3A 0E 00 01 30 CA F7 F5 7B 14 00 00 06 04 83 AD 26 ED 76 00 00 00 00 58 9A 74 EA 0F DF 00 00 02 00 0D 00 2F 83 03 0E 27 08 01 00 FC FF 03 00 A6 FD FA 02 43 01 2A 43 1A 38 67 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 02 10 07 1A 3A 0E 00 01 60 93 5B F8 7B 14 00 00 06 04 43 4B C3 ED 76 00 00 00 00 54 9A 7B EA 11 DF 02 00 01 00 07 00 2F 83 03 0E 27 08 FD FF 04 00 02 00 A6 FD FA 02 43 01 80 4C BC 37 6F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 02 10 07 1A 3A 0E 00 01 90 5C BF FA 7B 14 00 00 06 04 43 E9 5F EE 76 00 00 00 00 55 9A 86 EA 18 DF 06 00 04 00 10 00 2F 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 B6 51 49 37 77 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 02 10 07 1A 3A 0E 00 01 C0 25 23 FD 7B 14 00 00 06 04 43 87 FC EE 76 00 00 00 00 54 9A 96 EA 1F DF FF FF 07 00 12 00 2F 83 03 0E 27 08 FC FF 01 00 FF FF A6 FD FA 02 43 01 45 7E 2F 37 7F 0A 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 02 10 07 1A 3A 0E 00 01 F0 EE 86 FF 7B 14 00 00 06 04 43 25 99 EF 76 00 00 00 00 52 9A AC EA 21 DF FF FF 05 00 0E 00 2F 83 03 0E 27 08 02 00 00 00 01 00 A6 FD FA 02 43 01 14 1E 0A 37 87 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 02 10 07 1A 3A 0E 00 01 20 B8 EA 01 7C 14 00 00 06 04 43 C3 35 F0 76 00 00 00 00 4E 9A B4 EA 26 DF FC FF FC FF 05 00 2F 83 03 0E 27 08 01 00 00 00 00 00 A7 FD FB 02 44 01 E7 E1 25 37 8F 0A A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 02 10 07 1A 3A 0E 00 01 38 85 4E 04 7C 14 00 00 06 04 43 62 D2 F0 76 00 00 00 00 4B 9A B4 EA 2E DF FF FF FA FF 01 00 2F 83 03 0E 27 08 00 00 FE FF 00 00 A7 FD FB 02 44 01 50 23 1F 37 97 0A 91 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 02 10 07 1A 3A 0E 00 01 68 4E B2 06 7C 14 00 00 06 04 43 00 6F F1 76 00 00 00 00 47 9A AE EA 36 DF FD FF F7 FF FD FF 2F 83 03 0E 27 08 FE FF FF FF 00 00 A8 FD FB 02 44 01 DC 57 07 37 9F 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 02 10 07 1A 3A 0E 00 01 98 17 16 09 7C 14 00 00 06 04 43 9E 0B F2 76 00 00 00 00 44 9A A6 EA 39 DF 00 00 FD FF FE FF 2F 83 03 0E 27 08 FE FF 01 00 01 00 A8 FD FB 02 44 01 CB E1 93 36 A7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 02 10 07 1A 3A 0E 00 01 C8 E0 79 0B 7C 14 00 00 06 04 43 3C A8 F2 76 00 00 00 00 40 9A A4 EA 3A DF 07 00 04 00 0A 00 2F 83 03 0E 27 08 FC FF 03 00 01 00 A8 FD FB 02 44 01 1E 35 16 37 AF 0A A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 02 10 07 1A 3A 0E 00 01 F8 A9 DD 0D 7C 14 00 00 06 04 43 DA 44 F3 76 00 00 00 00 3E 9A A3 EA 39 DF EF FF FD FF F3 FF 2F 83 03 0E 27 08 FA FF FE FF 00 00 A8 FD FB 02 44 01 0F F8 D8 37 B7 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 02 10 07 1A 3A 0E 00 01 10 77 41 10 7C 14 00 00 06 04 83 79 E1 F3 76 00 00 00 00 41 9A A6 EA 29 DF 01 00 14 00 00 00 2F 83 03 0E 27 08 FE FF 04 00 04 00 A8 FD FB 02 45 01 17 BB 3E 38 BF 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 02 10 07 1A 3A 0E 00 01 40 40 A5 12 7C 14 00 00 06 04 83 17 7E F4 76 00 00 00 00 45 9A A5 EA 2E DF 0A 00 F4 FF 08 00 30 83 03 0E 27 08 03 00 FF FF 03 00 A8 FD FC 02 45 01 AC D9 40 38 C7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 02 10 07 1A 3A 0E 00 01 70 09 09 15 7C 14 00 00 06 04 83 B5 1A F5 76 00 00 00 00 45 9A A0 EA 3E DF 07 00 F9 FF 06 00 30 83 03 0E 27 08 FB FF FF FF FD FF A9 FD FB 02 45 01 2A 13 46 38 CF 0A A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 02 10 07 1A 3A 0E 00 01 A0 D2 6C 17 7C 14 00 00 06 04 83 53 B7 F5 76 00 00 00 00 42 9A A5 EA 42 DF FA FF 04 00 03 00 30 83 03 0E 27 08 FF FF FD FF FD FF A9 FD FB 02 45 01 58 03 4C 38 D7 0A 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 02 10 07 1A 3A 0E 00 01 D0 9B D0 19 7C 14 00 00 06 04 83 F1 53 F6 76 00 00 00 00 3D 9A A9 EA 42 DF FF FF 03 00 04 00 30 83 03 0E 27 08 FC FF 03 00 00 00 A9 FD FB 02 45 01 62 22 45 38 DF 0A 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 02 10 07 1A 3A 0E 00 01 E8 68 34 1C 7C 14 00 00 06 04 83 90 F0 F6 76 00 00 00 00 3E 9A A6 EA 3B DF FF FF 04 00 F8 FF 30 83 03 0E 27 08 FF FF 03 00 00 00 A9 FD FC 02 45 01 8F 58 F8 37 E7 0A A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 02 10 07 1A 3A 0E 00 01 18 32 98 1E 7C 14 00 00 06 04 43 2E 8D F7 76 00 00 00 00 44 9A A2 EA 34 DF 03 00 02 00 FE FF 30 83 03 0E 27 08 FE FF 01 00 01 00 A9 FD FC 02 45 01 EA B8 3E 37 EF 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 02 10 07 1A 3A 0E 00 01 48 FB FB 20 7C 14 00 00 06 04 43 CC 29 F8 76 00 00 00 00 48 9A A1 EA 35 DF 02 00 01 00 02 00 30 83 03 0E 27 08 FE FF FB FF FD FF A9 FD FC 02 45 01 0F 85 43 37 F7 0A A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 02 10 07 1A 3A 0E 00 01 78 C4 5F 23 7C 14 00 00 06 04 43 6A C6 F8 76 00 00 00 00 49 9A A6 EA 31 DF FC FF 09 00 00 00 30 83 03 0E 27 08 00 00 FA FF FD FF A9 FD FC 02 45 01 7E 66 65 37 FF 0A A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 02 10 07 1A 3A 0E 00 01 A8 8D C3 25 7C 14 00 00 06 04 43 08 63 F9 76 00 00 00 00 44 9A AE EA 2D DF F6 FF FB FF 07 00 30 83 03 0E 27 08 01 00 02 00 00 00 AA FD FC 02 45 01 FF 03 55 37 07 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 02 10 07 1A 3A 0E 00 01 D8 56 27 28 7C 14 00 00 06 04 43 A6 FF F9 76 00 00 00 00 3F 9A B7 EA 38 DF 02 00 FD FF 0B 00 30 83 03 0E 27 08 00 00 FF FF FF FF AA FD FC 02 45 01 68 B0 82 37 0F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 02 10 07 1A 3A 0E 00 01 F0 23 8B 2A 7C 14 00 00 06 04 43 45 9C FA 76 00 00 00 00 3A 9A BB EA 3B DF FC FF FD FF 01 00 30 83 03 0E 27 08 FD FF 03 00 00 00 AA FD FC 02 45 01 D1 D2 8C 37 17 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 02 10 07 1A 3A 0E 00 01 20 ED EE 2C 7C 14 00 00 06 04 43 E3 38 FB 76 00 00 00 00 37 9A BD EA 3E DF FF FF 02 00 02 00 30 83 03 0E 27 08 FF FF 02 00 00 00 AA FD FC 02 45 01 30 73 93 37 1F 0B 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 02 10 07 1A 3A 0E 00 01 50 B6 52 2F 7C 14 00 00 06 04 43 81 D5 FB 76 00 00 00 00 35 9A BD EA 3B DF 06 00 03 00 02 00 31 83 03 0E 27 08 01 00 00 00 02 00 AA FD FC 02 45 01 34 C4 8E 37 27 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 02 10 07 1A 3A 0E 00 01 80 7F B6 31 7C 14 00 00 06 04 83 1F 72 FC 76 00 00 00 00 35 9A B2 EA 3A DF 00 00 F5 FF F6 FF 31 83 03 0E 27 08 FA FF 07 00 00 00 AA FD FC 02 46 01 98 63 F8 37 2F 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 02 10 07 1A 3A 0E 00 01 B0 48 1A 34 7C 14 00 00 06 04 83 BD 0E FD 76 00 00 00 00 3F 9A AE EA 3B DF 09 00 08 00 01 00 31 83 03 0E 27 08 01 00 FE FF 01 00 AA FD FC 02 46 01 8C 32 2C 38 37 0B 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 02 10 07 1A 3A 0E 00 01 C8 15 7E 36 7C 14 00 00 06 04 83 5C AB FD 76 00 00 00 00 3A 9A AC EA 4B DF FA FF E7 FF 07 00 31 83 03 0E 27 08 01 00 00 00 00 00 AB FD FC 02 46 01 A0 A9 26 38 3F 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 02 10 07 1A 3A 0E 00 01 F8 DE E1 38 7C 14 00 00 06 04 83 FA 47 FE 76 00 00 00 00 31 9A AB EA 66 DF 00 00 04 00 08 00 31 83 03 0E 27 08 F6 FF FA FF F6 FF AA FD FC 02 46 01 6F 98 2B 38 47 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 02 10 07 1A 3A 0E 00 01 28 A8 45 3B 7C 14 00 00 06 04 83 98 E4 FE 76 00 00 00 00 2E 9A B0 EA 5C DF F6 FF 00 00 FB FF 31 83 03 0E 27 08 03 00 01 00 00 00 AA FD FC 02 46 01 28 CB 2F 38 4F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 02 10 07 1A 3A 0E 00 01 58 71 A9 3D 7C 14 00 00 06 04 83 36 81 FF 76 00 00 00 00 2E 9A A9 EA 59 DF 05 00 FD FF 00 00 31 83 03 0E 27 08 FD FF 01 00 01 00 AB FD FC 02 46 01 50 B5 2F 38 57 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 02 10 07 1A 3A 0E 00 01 88 3A 0D 40 7C 14 00 00 06 04 83 D4 1D 00 77 00 00 00 00 2F 9A 9F EA 55 DF FF FF 00 00 F5 FF 31 83 03 0E 27 08 FE FF 01 00 00 00 AB FD FC 02 46 01 4C BA 05 38 5F 0B A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 02 10 07 1A 3A 0E 00 01 A0 07 71 42 7C 14 00 00 06 04 43 73 BA 00 77 00 00 00 00 31 9A 9A EA 50 DF 01 00 03 00 01 00 31 83 03 0E 27 08 FB FF 01 00 00 00 AB FD FC 02 46 01 CD 66 8C 37 67 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 02 10 07 1A 3A 0E 00 01 D0 D0 D4 44 7C 14 00 00 06 04 43 11 57 01 77 00 00 00 00 33 9A 9C EA 52 DF 01 00 02 00 04 00 31 83 03 0E 27 08 FF FF FC FF 01 00 AB FD FC 02 46 01 53 35 78 37 6F 0B A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 02 10 07 1A 3A 0E 00 01 00 9A 38 47 7C 14 00 00 06 04 43 AF F3 01 77 00 00 00 00 31 9A A1 EA 4F DF FA FF 03 00 03 00 31 83 03 0E 27 08 FE FF FE FF 00 00 AB FD FC 02 46 01 D8 9D 59 37 77 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 03 10 07 1A 3A 0E 00 01 30 63 9C 49 7C 14 00 00 06 04 43 4D 90 02 77 00 00 00 00 2A 9A AA EA 52 DF F5 FF FA FF 08 00 32 83 03 0E 27 08 FC FF 00 00 00 00 AB FD FC 02 47 01 86 4A 18 37 7F 0B 9A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 03 10 07 1A 3A 0E 00 01 60 2C 00 4C 7C 14 00 00 06 04 43 EB 2C 03 77 00 00 00 00 23 9A B4 EA 56 DF FE FF 09 00 05 00 32 83 03 0E 27 08 FB FF FD FF FD FF AA FD FC 02 47 01 CC E5 22 37 87 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 03 10 07 1A 3A 0E 00 01 78 F9 63 4E 7C 14 00 00 06 04 43 8A C9 03 77 00 00 00 00 24 9A B8 EA 4F DF 01 00 FB FF 00 00 32 83 03 0E 27 08 03 00 00 00 03 00 AB FD FC 02 47 01 6E 46 FE 36 8F 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 03 10 07 1A 3A 0E 00 01 A8 C2 C7 50 7C 14 00 00 06 04 43 28 66 04 77 00 00 00 00 24 9A B3 EA 59 DF 01 00 F5 FF 04 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 47 01 54 C5 CE 36 97 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 03 10 07 1A 3A 0E 00 01 D8 8B 2B 53 7C 14 00 00 06 04 43 C6 02 05 77 00 00 00 00 20 9A B3 EA 5F DF 03 00 08 00 04 00 32 83 03 0E 27 08 FF FF F8 FF FA FF AB FD FC 02 47 01 A3 DE E5 36 9F 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 03 10 07 1A 3A 0E 00 01 08 55 8F 55 7C 14 00 00 06 04 83 64 9F 05 77 00 00 00 00 1B 9A B0 EA 58 DF F7 FF FC FF FA FF 32 83 03 0E 27 08 F9 FF 0B 00 00 00 AB FD FC 02 47 01 6C 63 DA 37 A7 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 03 10 07 1A 3A 0E 00 01 38 1E F3 57 7C 14 00 00 06 04 83 02 3C 06 77 00 00 00 00 1D 9A B6 EA 54 DF 02 00 03 00 05 00 32 83 03 0E 27 08 00 00 00 00 03 00 AB FD FC 02 47 01 7F 7F 37 38 AF 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 03 10 07 1A 3A 0E 00 01 50 EB 56 5A 7C 14 00 00 06 04 83 A1 D8 06 77 00 00 00 00 1B 9A B9 EA 5F DF F9 FF F8 FF 02 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 48 01 50 82 34 38 B7 0B 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 03 10 07 1A 3A 0E 00 01 80 B4 BA 5C 7C 14 00 00 06 04 83 3F 75 07 77 00 00 00 00 1A 9A C0 EA 61 DF FE FF 06 00 04 00 32 83 03 0E 27 08 02 00 FA FF 01 00 AC FD FC 02 48 01 1D D2 3C 38 BF 0B A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 03 10 07 1A 3A 0E 00 01 B0 7D 1E 5F 7C 14 00 00 06 04 83 DD 11 08 77 00 00 00 00 12 9A C6 EA 5F DF F3 FF FE FF 01 00 32 83 03 0E 27 08 01 00 00 00 02 00 AC FD FC 02 48 01 62 D5 45 38 C7 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 03 10 07 1A 3A 0E 00 01 E0 46 82 61 7C 14 00 00 06 04 83 7B AE 08 77 00 00 00 00 0E 9A C8 EA 64 DF 04 00 FD FF 04 00 32 83 03 0E 27 08 00 00 FE FF 00 00 AC FD FD 02 48 01 4F 78 51 38 CF 0B A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 03 10 07 1A 3A 0E 00 01 10 10 E6 63 7C 14 00 00 06 04 83 19 4B 09 77 00 00 00 00 0B 9A C4 EA 66 DF FF FF FD FF FC FF 32 83 03 0E 27 08 00 00 00 00 01 00 AC FD FC 02 49 01 C1 A9 16 38 D7 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 03 10 07 1A 3A 0E 00 01 28 DD 49 66 7C 14 00 00 06 04 43 B8 E7 09 77 00 00 00 00 09 9A C1 EA 69 DF 06 00 FF FF 05 00 33 83 03 0E 27 08 FC FF 02 00 01 00 AC FD FD 02 49 01 5E 93 8F 37 DF 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 03 10 07 1A 3A 0E 00 01 58 A6 AD 68 7C 14 00 00 06 04 43 56 84 0A 77 00 00 00 00 09 9A C3 EA 6A DF FB FF 00 00 FF FF 33 83 03 0E 27 08 00 00 FB FF 00 00 AC FD FC 02 49 01 18 B5 9F 37 E7 0B A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 03 10 07 1A 3A 0E 00 01 88 6F 11 6B 7C 14 00 00 06 04 43 F4 20 0B 77 00 00 00 00 04 9A C3 EA 68 DF F9 FF FB FF 00 00 33 83 03 0E 27 08 00 00 00 00 01 00 AD FD FC 02 49 01 8C 97 9F 37 EF 0B A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 03 10 07 1A 3A 0E 00 01 B8 38 75 6D 7C 14 00 00 06 04 43 92 BD 0B 77 00 00 00 00 FF 99 C1 EA 6D DF FC FF FA FF FF FF 33 83 03 0E 27 08 00 00 FE FF 00 00 AD FD FC 02 49 01 3D C8 8E 37 F7 0B A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 03 10 07 1A 3A 0E 00 01 E8 01 D9 6F 7C 14 00 00 06 04 43 30 5A 0C 77 00 00 00 00 FA 99 BC EA 71 DF FD FF FC FF 00 00 33 83 03 0E 27 08 FD FF 01 00 01 00 AD FD FC 02 4A 01 39 33 7C 37 FF 0B 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 03 10 07 1A 3A 0E 00 01 00 CF 3C 72 7C 14 00 00 06 04 43 CF F6 0C 77 00 00 00 00 F5 99 BD EA 74 DF F8 FF FC FF 00 00 33 83 03 0E 27 08 FC FF FD FF 00 00 AD FD FC 02 4A 01 04 9C 5B 37 07 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 03 10 07 1A 3A 0E 00 01 30 98 A0 74 7C 14 00 00 06 04 43 6D 93 0D 77 00 00 00 00 F2 99 C6 EA 77 DF FF FF 03 00 0A 00 33 83 03 0E 27 08 FF FF FF FF 01 00 AC FD FC 02 4A 01 7C E5 38 37 0F 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 03 10 07 1A 3A 0E 00 01 60 61 04 77 7C 14 00 00 06 04 43 0B 30 0E 77 00 00 00 00 ED 99 D4 EA 7B DF 04 00 03 00 14 00 33 83 03 0E 27 08 FF FF 01 00 02 00 AD FD FC 02 4A 01 64 D7 28 37 17 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 03 10 07 1A 3A 0E 00 01 90 2A 68 79 7C 14 00 00 06 04 43 A9 CC 0E 77 00 00 00 00 EA 99 DC EA 81 DF FB FF FF FF 03 00 33 83 03 0E 27 08 FA FF 04 00 FD FF AD FD FC 02 4A 01 3E 36 A1 37 1F 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 03 10 07 1A 3A 0E 00 01 C0 F3 CB 7B 7C 14 00 00 06 04 43 47 69 0F 77 00 00 00 00 EC 99 EC EA 7E DF 00 00 10 00 0C 00 33 83 03 0E 27 08 00 00 03 00 01 00 AD FD FD 02 4B 01 5A 4D D8 37 27 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 03 10 07 1A 3A 0E 00 01 D8 C0 2F 7E 7C 14 00 00 06 04 43 E6 05 10 77 00 00 00 00 EA 99 FA EA 86 DF FC FF F7 FF 0C 00 33 83 03 0E 27 08 03 00 FF FF 01 00 AD FD FD 02 4B 01 44 04 DE 37 2F 0C A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 03 10 07 1A 3A 0E 00 01 08 8A 93 80 7C 14 00 00 06 04 43 84 A2 10 77 00 00 00 00 E6 99 05 EB 94 DF 04 00 02 00 0D 00 33 83 03 0E 27 08 FF FF FF FF FD FF AE FD FD 02 4B 01 F4 D2 D7 37 37 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 03 10 07 1A 3A 0E 00 01 38 53 F7 82 7C 14 00 00 06 04 83 22 3F 11 77 00 00 00 00 E2 99 10 EB 9B DF F7 FF FD FF 04 00 34 83 03 0E 27 08 05 00 FF FF 02 00 AE FD FD 02 4B 01 83 36 E0 37 3F 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 03 10 07 1A 3A 0E 00 01 68 1C 5B 85 7C 14 00 00 06 04 83 C0 DB 11 77 00 00 00 00 DC 99 13 EB A2 DF 04 00 FC FF 05 00 34 83 03 0E 27 08 00 00 03 00 01 00 AF FD FD 02 4C 01 68 05 DB 37 47 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 03 10 07 1A 3A 0E 00 01 80 E9 BE 87 7C 14 00 00 06 04 43 5F 78 12 77 00 00 00 00 DA 99 0F EB A7 DF FC FF FE FF FB FF 34 83 03 0E 27 08 FA FF FE FF FC FF AF FD FD 02 4C 01 06 7B 90 37 4F 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 03 10 07 1A 3A 0E 00 01 B0 B2 22 8A 7C 14 00 00 06 04 43 FD 14 13 77 00 00 00 00 D9 99 13 EB A0 DF FF FF 0C 00 04 00 34 83 03 0E 27 08 FA FF 02 00 FD FF AF FD FE 02 4C 01 A4 70 3D 37 57 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 03 10 07 1A 3A 0E 00 01 E0 7B 86 8C 7C 14 00 00 06 04 43 9B B1 13 77 00 00 00 00 D9 99 23 EB 92 DF F3 FF 0C 00 04 00 34 83 03 0E 27 08 00 00 FD FF FE FF AF FD FD 02 4C 01 A6 E2 37 37 5F 0C 9A 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 03 10 07 1A 3A 0E 00 01 10 45 EA 8E 7C 14 00 00 06 04 43 39 4E 14 77 00 00 00 00 D5 99 35 EB 85 DF FC FF 0A 00 08 00 34 83 03 0E 27 08 00 00 04 00 02 00 AF FD FE 02 4C 01 92 9A 39 37 67 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 03 10 07 1A 3A 0E 00 01 40 0E 4E 91 7C 14 00 00 06 04 43 D7 EA 14 77 00 00 00 00 D6 99 3D EB 84 DF FF FF 02 00 03 00 34 83 03 0E 27 08 01 00 FE FF 00 00 B0 FD FE 02 4C 01 6B FD 15 37 6F 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 03 10 07 1A 3A 0E 00 01 58 DB B1 93 7C 14 00 00 06 04 43 76 87 15 77 00 00 00 00 D4 99 3F EB 83 DF 03 00 00 00 00 00 34 83 03 0E 27 08 05 00 06 00 03 00 B0 FD FE 02 4C 01 76 6B 0D 37 77 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 03 10 07 1A 3A 0E 00 01 88 A4 15 96 7C 14 00 00 06 04 43 14 24 16 77 00 00 00 00 DA 99 29 EB 8C DF 0B 00 E5 FF E9 FF 34 83 03 0E 27 08 0C 00 FF FF 01 00 B1 FD FE 02 4D 01 BF 8D 54 37 7F 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 03 10 07 1A 3A 0E 00 01 B8 6D 79 98 7C 14 00 00 06 04 43 B2 C0 16 77 00 00 00 00 E1 99 FA EA 95 DF 0E 00 F6 FF E5 FF 34 83 03 0E 27 08 FE FF FD FF FA FF B1 FD FE 02 4D 01 6C 52 38 37 87 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 03 10 07 1A 3A 0E 00 01 E8 36 DD 9A 7C 14 00 00 06 04 43 50 5D 17 77 00 00 00 00 E4 99 DB EA 93 DF 04 00 F7 FF F0 FF 34 83 03 0E 27 08 F7 FF 02 00 01 00 B1 FD FE 02 4D 01 29 8A 67 37 8F 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 03 10 07 1A 3A 0E 00 01 18 00 41 9D 7C 14 00 00 06 04 43 EE F9 17 77 00 00 00 00 E5 99 C6 EA 94 DF F7 FF F3 FF ED FF 35 83 03 0E 27 08 F8 FF FB FF FF FF B1 FD FE 02 4D 01 74 A0 8D 37 97 0C 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 03 10 07 1A 3A 0E 00 01 30 CD A4 9F 7C 14 00 00 06 04 83 8D 96 18 77 00 00 00 00 E8 99 BC EA 92 DF 08 00 0E 00 05 00 35 83 03 0E 27 08 F2 FF 02 00 FD FF B0 FD FE 02 4D 01 55 E6 28 38 9F 0C 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 03 10 07 1A 3A 0E 00 01 60 96 08 A2 7C 14 00 00 06 04 83 2B 33 19 77 00 00 00 00 EC 99 C7 EA 90 DF 08 00 00 00 14 00 35 83 03 0E 27 08 FE FF 00 00 02 00 B0 FD FE 02 4D 01 EE 98 2F 38 A7 0C A4 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 03 10 07 1A 3A 0E 00 01 90 5F 6C A4 7C 14 00 00 06 04 83 C9 CF 19 77 00 00 00 00 ED 99 D5 EA 9C DF 06 00 00 00 11 00 35 83 03 0E 27 08 FD FF FA FF FB FF B0 FD FE 02 4D 01 FB 8D 29 38 AF 0C A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 03 10 07 1A 3A 0E 00 01 C0 28 D0 A6 7C 14 00 00 06 04 83 67 6C 1A 77 00 00 00 00 EE 99 E2 EA 9E DF FF FF 08 00 0A 00 35 83 03 0E 27 08 02 00 FC FF 00 00 B0 FD FD 02 4D 01 42 77 2C 38 B7 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 03 10 07 1A 3A 0E 00 01 F0 F1 33 A9 7C 14 00 00 06 04 83 05 09 1B 77 00 00 00 00 EA 99 ED EA A5 DF FD FF F5 FF 0D 00 35 83 03 0E 27 08 02 00 03 00 03 00 B0 FD FE 02 4D 01 C9 49 28 38 BF 0C 9E 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 03 10 07 1A 3A 0E 00 01 08 BF 97 AB 7C 14 00 00 06 04 83 A4 A5 1B 77 00 00 00 00 E4 99 ED EA B6 DF FB FF F3 FF 01 00 35 83 03 0E 27 08 FE FF FF FF 01 00 B0 FD FE 02 4D 01 EA AE 15 38 C7 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 03 10 07 1A 3A 0E 00 01 38 88 FB AD 7C 14 00 00 06 04 43 42 42 1C 77 00 00 00 00 E1 99 E9 EA C3 DF 05 00 FF FF 08 00 35 83 03 0E 27 08 FA FF 04 00 01 00 B0 FD FE 02 4D 01 D2 77 B1 37 CF 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 03 10 07 1A 3A 0E 00 01 68 51 5F B0 7C 14 00 00 06 04 43 E0 DE 1C 77 00 00 00 00 E0 99 EE EA CF DF FC FF FE FF 0A 00 35 83 03 0E 27 08 FE FF FF FF 00 00 B1 FD FE 02 4D 01 BC D2 88 37 D7 0C A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 03 10 07 1A 3A 0E 00 01 98 1A C3 B2 7C 14 00 00 06 04 43 7E 7B 1D 77 00 00 00 00 DA 99 FF EA D9 DF FE FF 01 00 12 00 35 83 03 0E 27 08 FD FF 00 00 01 00 B1 FD FE 02 4E 01 85 3E 83 37 DF 0C A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 03 10 07 1A 3A 0E 00 01 C8 E3 26 B5 7C 14 00 00 06 04 43 1C 18 1E 77 00 00 00 00 D9 99 12 EB DD DF 00 00 05 00 0B 00 35 83 03 0E 27 08 02 00 FD FF FF FF B1 FD FE 02 4E 01 B1 61 5B 37 E7 0C A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 03 10 07 1A 3A 0E 00 01 E0 B0 8A B7 7C 14 00 00 06 04 43 BB B4 1E 77 00 00 00 00 DA 99 1F EB DB DF 02 00 05 00 07 00 35 83 03 0E 27 08 03 00 02 00 00 00 B2 FD FF 02 4E 01 15 00 47 37 EF 0C A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 03 10 07 1A 3A 0E 00 01 10 7A EE B9 7C 14 00 00 06 04 43 59 51 1F 77 00 00 00 00 DD 99 21 EB E0 DF 07 00 FD FF 00 00 36 83 03 0E 27 08 00 00 00 00 FF FF B2 FD FF 02 4E 01 0D 18 2F 37 F7 0C 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 03 10 07 1A 3A 0E 00 01 40 43 52 BC 7C 14 00 00 06 04 43 F7 ED 1F 77 00 00 00 00 E0 99 19 EB E4 DF 03 00 FC FF FD FF 36 83 03 0E 27 08 00 00 FF FF FD FF B2 FD FF 02 4D 01 94 CE C7 36 FF 0C 9B 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 03 10 07 1A 3A 0E 00 01 70 0C B6 BE 7C 14 00 00 06 04 43 95 8A 20 77 00 00 00 00 DE 99 15 EB E8 DF FA FF 00 00 03 00 36 83 03 0E 27 08 F8 FF 02 00 FD FF B2 FD FF 02 4D 01 D5 65 A1 36 07 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 03 10 07 1A 3A 0E 00 01 88 D9 19 C1 7C 14 00 00 06 04 43 34 27 21 77 00 00 00 00 DC 99 16 EB EC DF F6 FF F7 FF F8 FF 36 83 03 0E 27 08 02 00 F2 FF FC FF B3 FD FF 02 4D 01 BF 8D 85 37 0F 0D A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 03 10 07 1A 3A 0E 00 01 B8 A2 7D C3 7C 14 00 00 06 04 83 D2 C3 21 77 00 00 00 00 DA 99 0F EB E5 DF 04 00 0F 00 03 00 36 83 03 0E 27 08 F8 FF 06 00 00 00 B2 FD 00 03 4D 01 23 71 07 38 17 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 03 10 07 1A 3A 0E 00 01 E8 6B E1 C5 7C 14 00 00 06 04 83 70 60 22 77 00 00 00 00 DC 99 18 EB E7 DF 09 00 F1 FF 10 00 36 83 03 0E 27 08 02 00 01 00 06 00 B3 FD 00 03 4E 01 77 EB 12 38 1F 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 03 10 07 1A 3A 0E 00 01 18 35 45 C8 7C 14 00 00 06 04 83 0E FD 22 77 00 00 00 00 DA 99 1B EB FB DF 02 00 FB FF 0B 00 36 83 03 0E 27 08 FB FF FD FF FE FF B3 FD 00 03 4E 01 0B 1A 16 38 27 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 03 10 07 1A 3A 0E 00 01 48 FE A8 CA 7C 14 00 00 06 04 83 AC 99 23 77 00 00 00 00 D7 99 25 EB 04 E0 00 00 01 00 0C 00 36 83 03 0E 27 08 FE FF FE FF 00 00 B3 FD 00 03 4E 01 57 B6 14 38 2F 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 03 10 07 1A 3A 0E 00 01 60 CB 0C CD 7C 14 00 00 06 04 83 4B 36 24 77 00 00 00 00 D2 99 31 EB 0B E0 FC FF FC FF 08 00 36 83 03 0E 27 08 01 00 00 00 01 00 B4 FD 00 03 4E 01 3B 73 17 38 37 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 03 10 07 1A 3A 0E 00 01 90 94 70 CF 7C 14 00 00 06 04 83 E9 D2 24 77 00 00 00 00 CE 99 34 EB 12 E0 FB FF FC FF 01 00 36 83 03 0E 27 08 FC FF 00 00 FF FF B4 FD 00 03 4E 01 03 A4 07 38 3F 0D A6 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 03 10 07 1A 3A 0E 00 01 C0 5D D4 D1 7C 14 00 00 06 04 43 87 6F 25 77 00 00 00 00 CE 99 36 EB 17 E0 06 00 01 00 07 00 36 83 03 0E 27 08 FC FF 02 00 00 00 B4 FD 01 03 4E 01 B6 31 7D 37 47 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 03 10 07 1A 3A 0E 00 01 F0 26 38 D4 7C 14 00 00 06 04 43 25 0C 26 77 00 00 00 00 D2 99 3C EB 1C E0 02 00 FF FF 05 00 37 83 03 0E 27 08 FE FF FE FF FF FF B5 FD 01 03 4E 01 D8 E1 05 37 4F 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 03 10 07 1A 3A 0E 00 01 20 F0 9B D6 7C 14 00 00 06 04 43 C3 A8 26 77 00 00 00 00 D3 99 44 EB 1E E0 FE FF 0B 00 06 00 37 83 03 0E 27 08 FA FF FD FF FA FF B5 FD 01 03 4E 01 E1 8A F3 36 57 0D 9F 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 03 10 07 1A 3A 0E 00 01 38 BD FF D8 7C 14 00 00 06 04 43 62 45 27 77 00 00 00 00 D2 99 55 EB 18 E0 00 00 05 00 0D 00 37 83 03 0E 27 08 00 00 00 00 01 00 B5 FD 01 03 4E 01 D2 5C FB 36 5F 0D 9C 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 03 10 07 1A 3A 0E 00 01 68 86 63 DB 7C 14 00 00 06 04 43 00 E2 27 77 00 00 00 00 D1 99 61 EB 1E E0 05 00 FE FF 0B 00 37 83 03 0E 27 08 FE FF FF FF 00 00 B5 FD 01 03 4E 01 06 78 E6 36 67 0D A3 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 03 10 07 1A 3A 0E 00 01 98 4F C7 DD 7C 14 00 00 06 04 43 9E 7E 28 77 00 00 00 00 D4 99 67 EB 1F E0 04 00 08 00 01 00 37 83 03 0E 27 08 FD FF FF FF 00 00 B6 FD 01 03 4E 01 51 EF C4 36 6F 0D A1 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 03 10 07 1A 3A 0E 00 01 C8 18 2B E0 7C 14 00 00 06 04 43 3C 1B 29 77 00 00 00 00 D6 99 6D EB 1E E0 01 00 01 00 07 00 37 83 03 0E 27 08 FF FF FE FF 00 00 B6 FD 02 03 4E 01 62 B9 57 36 77 0D A0 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 03 10 07 1A 3A 0E 00 01 F8 E1 8E E2 7C 14 00 00 06 04 43 DA B7 29 77 00 00 00 00 D4 99 79 EB 27 E0 12 00 00 00 18 00 37 83 03 0E 27 08 00 00 00 00 04 00 B6 FD 02 03 4E 01 0F 45 5C 37 7F 0D A5 00
|
||||
4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 03 10 07 1A 3A 0E 00 01 10 AF F2 E4 7C 14 00 00 06 04 83 79 54 2A 77 00 00 00 00 D3 99 79 EB 33 E0 FF FF F5 FF 00 00 37 83 03 0E 27 08 F7 FF 06 00 FF FF B7 FD 02 03 4E 01 5F 84 22 38 87 0D A4 00
|
||||
123
head-tracking/airpods-are-in-the-case.txt
Normal file
@@ -0,0 +1,123 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 17 10 03 3A 3E 08 0E 1A 3A 01 F8 DE 9D 78 66 06 00 00 03 00 40 67 07 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 2F 03 CC FF 6E 06 2F 03 CE FF 6C 02 29 48 D7 36 21 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 17 10 03 3A 3E 08 0E 1A 3A 01 B8 90 01 7B 66 06 00 00 03 00 42 FF A3 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6D 06 2F 03 CE FF 6C 02 66 4A E3 36 29 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 17 10 03 3A 3E 08 0E 1A 3A 01 90 3E 65 7D 66 06 00 00 03 00 42 96 40 A2 5D 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6F 06 2F 03 CE FF 6C 02 79 7C BF 36 31 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 17 10 03 3A 3E 08 0E 1A 3A 01 50 F0 C8 7F 66 06 00 00 03 00 43 2E DD A2 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2F 03 CE FF 6C 02 06 02 B4 36 39 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 17 10 03 3A 3E 08 0E 1A 3A 01 10 A2 2C 82 66 06 00 00 03 00 43 C6 79 A3 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2F 03 CE FF 6C 02 AB 08 B6 36 41 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 17 10 03 3A 3E 08 0E 1A 3A 01 D0 53 90 84 66 06 00 00 03 00 43 5E 16 A4 5D 00 00 00 00 3E 07 84 72 02 00 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2F 03 CE FF 6D 02 C0 F3 CA 36 49 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 17 10 03 3A 3E 08 0E 1A 3A 01 90 05 F4 86 66 06 00 00 03 00 43 F6 B2 A4 5D 00 00 00 00 3D 07 81 72 01 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 AA BF C3 36 51 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 17 10 03 3A 3E 08 0E 1A 3A 01 50 B7 57 89 66 06 00 00 03 00 43 8E 4F A5 5D 00 00 00 00 3C 07 7F 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 AD 91 A3 36 59 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 17 10 03 3A 3E 08 0E 1A 3A 01 10 69 BB 8B 66 06 00 00 03 00 43 26 EC A5 5D 00 00 00 00 3C 07 80 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2F 03 CE FF 6D 02 1D 91 AA 36 61 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 17 10 03 3A 3E 08 0E 1A 3A 01 D0 1A 1F 8E 66 06 00 00 03 00 43 BE 88 A6 5D 00 00 00 00 3D 07 7F 72 00 00 01 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BA F4 B0 36 69 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 17 10 03 3A 3E 08 0E 1A 3A 01 A8 C8 82 90 66 06 00 00 03 00 43 55 25 A7 5D 00 00 00 00 3E 07 7F 72 01 00 00 00 01 00 01 00 04 00 04 00 04 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 33 B8 9C 36 71 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 17 10 03 3A 3E 08 0E 1A 3A 01 68 7A E6 92 66 06 00 00 03 00 43 ED C1 A7 5D 00 00 00 00 3D 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BB 96 99 36 79 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 17 10 03 3A 3E 08 0E 1A 3A 01 28 2C 4A 95 66 06 00 00 03 00 43 85 5E A8 5D 00 00 00 00 3E 07 7D 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 02 00 2F 03 CE FF 6D 02 A0 A1 AC 36 81 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 17 10 03 3A 3E 08 0E 1A 3A 01 E8 DD AD 97 66 06 00 00 03 00 43 1D FB A8 5D 00 00 00 00 3E 07 7D 72 00 00 01 00 01 00 01 00 04 00 04 00 04 00 01 00 00 00 01 00 2F 03 CE FF 6D 02 93 AE B9 36 89 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 18 10 03 3A 3E 08 0E 1A 3A 01 A8 8F 11 9A 66 06 00 00 03 00 43 B5 97 A9 5D 00 00 00 00 3F 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2F 03 CD FF 6D 02 51 EF BD 36 91 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 18 10 03 3A 3E 08 0E 1A 3A 01 80 3D 75 9C 66 06 00 00 03 00 43 4C 34 AA 5D 00 00 00 00 3E 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 D2 88 BB 36 99 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 18 10 03 3A 3E 08 0E 1A 3A 01 40 EF D8 9E 66 06 00 00 03 00 43 E4 D0 AA 5D 00 00 00 00 3F 07 7C 72 00 00 01 00 01 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 67 34 B9 36 A1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 18 10 03 3A 3E 08 0E 1A 3A 01 00 A1 3C A1 66 06 00 00 03 00 43 7C 6D AB 5D 00 00 00 00 3F 07 7D 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 A9 31 AE 36 A9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 18 10 03 3A 3E 08 0E 1A 3A 01 C0 52 A0 A3 66 06 00 00 03 00 43 14 0A AC 5D 00 00 00 00 40 07 7D 72 FF FF FF FF 01 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 95 47 CA 36 B1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 18 10 03 3A 3E 08 0E 1A 3A 01 80 04 04 A6 66 06 00 00 03 00 43 AC A6 AC 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 BB B3 BF 36 B9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 18 10 03 3A 3E 08 0E 1A 3A 01 58 B2 67 A8 66 06 00 00 03 00 43 43 43 AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 06 0F C6 36 C1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 18 10 03 3A 3E 08 0E 1A 3A 01 18 64 CB AA 66 06 00 00 03 00 43 DB DF AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 FF FF 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 7B EE BD 36 C9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 18 10 03 3A 3E 08 0E 1A 3A 01 D8 15 2F AD 66 06 00 00 03 00 43 73 7C AE 5D 00 00 00 00 40 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 DF 9B DA 36 D1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 18 10 03 3A 3E 08 0E 1A 3A 01 98 C7 92 AF 66 06 00 00 03 00 43 0B 19 AF 5D 00 00 00 00 41 07 7C 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 8F CB E2 36 D9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 18 10 03 3A 3E 08 0E 1A 3A 01 70 75 F6 B1 66 06 00 00 03 00 43 A2 B5 AF 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 26 7A DE 36 E1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 18 10 03 3A 3E 08 0E 1A 3A 01 30 27 5A B4 66 06 00 00 03 00 43 3A 52 B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 99 BC BD 36 E9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 18 10 03 3A 3E 08 0E 1A 3A 01 F0 D8 BD B6 66 06 00 00 03 00 43 D2 EE B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 6D 51 BA 36 F1 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 18 10 03 3A 3E 08 0E 1A 3A 01 B0 8A 21 B9 66 06 00 00 03 00 43 6A 8B B1 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 01 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C5 03 D4 36 F9 5E 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 18 10 03 3A 3E 08 0E 1A 3A 01 88 38 85 BB 66 06 00 00 03 00 43 01 28 B2 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 E8 E5 C9 36 01 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 18 10 03 3A 3E 08 0E 1A 3A 01 48 EA E8 BD 66 06 00 00 03 00 43 99 C4 B2 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 C8 5F B9 36 09 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 18 10 03 3A 3E 08 0E 1A 3A 01 08 9C 4C C0 66 06 00 00 03 00 43 31 61 B3 5D 00 00 00 00 40 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 83 C4 9D 36 11 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 18 10 03 3A 3E 08 0E 1A 3A 01 C8 4D B0 C2 66 06 00 00 03 00 43 C9 FD B3 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 F9 0A 9E 36 19 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 18 10 03 3A 3E 08 0E 1A 3A 01 A0 FB 13 C5 66 06 00 00 03 00 43 60 9A B4 5D 00 00 00 00 41 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 54 B2 96 36 21 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 18 10 03 3A 3E 08 0E 1A 3A 01 60 AD 77 C7 66 06 00 00 03 00 43 F8 36 B5 5D 00 00 00 00 40 07 7B 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 FB 64 A2 36 29 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 18 10 03 3A 3E 08 0E 1A 3A 01 20 5F DB C9 66 06 00 00 03 00 43 90 D3 B5 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 21 48 9D 36 31 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 18 10 03 3A 3E 08 0E 1A 3A 01 E0 10 3F CC 66 06 00 00 03 00 43 28 70 B6 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 93 25 AC 36 39 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 18 10 03 3A 3E 08 0E 1A 3A 01 B8 BE A2 CE 66 06 00 00 03 00 43 BF 0C B7 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 7B 3B CB 36 41 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 18 10 03 3A 3E 08 0E 1A 3A 01 78 70 06 D1 66 06 00 00 03 00 43 57 A9 B7 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 9C 2B E3 36 49 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 18 10 03 3A 3E 08 0E 1A 3A 01 38 22 6A D3 66 06 00 00 03 00 43 EF 45 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 F1 0D E8 36 51 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 18 10 03 3A 3E 08 0E 1A 3A 01 F8 D3 CD D5 66 06 00 00 03 00 43 87 E2 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 F0 1A DF 36 59 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 18 10 03 3A 3E 08 0E 1A 3A 01 D0 81 31 D8 66 06 00 00 03 00 43 1E 7F B9 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 BB 9A CB 36 61 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 18 10 03 3A 3E 08 0E 1A 3A 01 90 33 95 DA 66 06 00 00 03 00 43 B6 1B BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 AF D3 36 69 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 18 10 03 3A 3E 08 0E 1A 3A 01 50 E5 F8 DC 66 06 00 00 03 00 43 4E B8 BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 47 33 C4 36 71 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 18 10 03 3A 3E 08 0E 1A 3A 01 10 97 5C DF 66 06 00 00 03 00 43 E6 54 BB 5D 00 00 00 00 41 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 5D 2C 9C 36 79 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 18 10 03 3A 3E 08 0E 1A 3A 01 E8 44 C0 E1 66 06 00 00 03 00 43 7D F1 BB 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 0B 5E A3 36 81 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 18 10 03 3A 3E 08 0E 1A 3A 01 A8 F6 23 E4 66 06 00 00 03 00 43 15 8E BC 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D9 21 A3 36 89 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 18 10 03 3A 3E 08 0E 1A 3A 01 68 A8 87 E6 66 06 00 00 03 00 43 AD 2A BD 5D 00 00 00 00 41 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 82 84 A9 36 91 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 18 10 03 3A 3E 08 0E 1A 3A 01 40 56 EB E8 66 06 00 00 03 00 43 44 C7 BD 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 44 90 A7 36 99 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 18 10 03 3A 3E 08 0E 1A 3A 01 00 08 4F EB 66 06 00 00 03 00 43 DC 63 BE 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 FD 3C BA 36 A1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 18 10 03 3A 3E 08 0E 1A 3A 01 C0 B9 B2 ED 66 06 00 00 03 00 43 74 00 BF 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 D2 05 C7 36 A9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 18 10 03 3A 3E 08 0E 1A 3A 01 80 6B 16 F0 66 06 00 00 03 00 43 0C 9D BF 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 AB 49 BF 36 B1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 18 10 03 3A 3E 08 0E 1A 3A 01 58 19 7A F2 66 06 00 00 03 00 43 A3 39 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 31 2E CD 36 B9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 18 10 03 3A 3E 08 0E 1A 3A 01 18 CB DD F4 66 06 00 00 03 00 43 3B D6 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 09 DB B5 36 C1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 18 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 41 F7 66 06 00 00 03 00 43 D3 72 C1 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 C9 F9 CA 36 C9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 18 10 03 3A 3E 08 0E 1A 3A 01 98 2E A5 F9 66 06 00 00 03 00 43 6B 0F C2 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 5E 1C C2 36 D1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 18 10 03 3A 3E 08 0E 1A 3A 01 70 DC 08 FC 66 06 00 00 03 00 43 02 AC C2 5D 00 00 00 00 42 07 7A 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 D9 B3 36 D9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 18 10 03 3A 3E 08 0E 1A 3A 01 30 8E 6C FE 66 06 00 00 03 00 43 9A 48 C3 5D 00 00 00 00 42 07 7A 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 00 00 2E 03 CD FF 6E 02 89 F5 D3 36 E1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 18 10 03 3A 3E 08 0E 1A 3A 01 F0 3F D0 00 67 06 00 00 03 00 43 32 E5 C3 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 5E 85 D3 36 E9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 18 10 03 3A 3E 08 0E 1A 3A 01 C8 ED 33 03 67 06 00 00 03 00 43 C9 81 C4 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 26 22 DF 36 F1 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 18 10 03 3A 3E 08 0E 1A 3A 01 88 9F 97 05 67 06 00 00 03 00 43 61 1E C5 5D 00 00 00 00 43 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 06 95 DB 36 F9 5F 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 18 10 03 3A 3E 08 0E 1A 3A 01 48 51 FB 07 67 06 00 00 03 00 43 F9 BA C5 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 66 B7 D2 36 01 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 18 10 03 3A 3E 08 0E 1A 3A 01 08 03 5F 0A 67 06 00 00 03 00 43 91 57 C6 5D 00 00 00 00 42 07 7A 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 FE 66 EE 36 09 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 18 10 03 3A 3E 08 0E 1A 3A 01 E0 B0 C2 0C 67 06 00 00 03 00 43 28 F4 C6 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 13 B3 DB 36 11 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 18 10 03 3A 3E 08 0E 1A 3A 01 A0 62 26 0F 67 06 00 00 03 00 43 C0 90 C7 5D 00 00 00 00 42 07 79 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 B1 04 E7 36 19 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 18 10 03 3A 3E 08 0E 1A 3A 01 60 14 8A 11 67 06 00 00 03 00 43 58 2D C8 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 1A BE E6 36 21 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 18 10 03 3A 3E 08 0E 1A 3A 01 38 C2 ED 13 67 06 00 00 03 00 43 EF C9 C8 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CE A4 E7 36 29 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 18 10 03 3A 3E 08 0E 1A 3A 01 F8 73 51 16 67 06 00 00 03 00 43 87 66 C9 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 FF FF 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 1E DF F0 36 31 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 18 10 03 3A 3E 08 0E 1A 3A 01 B8 25 B5 18 67 06 00 00 03 00 43 1F 03 CA 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 FF FF 01 00 2E 03 CD FF 6E 02 1A 2D E4 36 39 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 18 10 03 3A 3E 08 0E 1A 3A 01 78 D7 18 1B 67 06 00 00 03 00 43 B7 9F CA 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E2 B0 D6 36 41 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 18 10 03 3A 3E 08 0E 1A 3A 01 50 85 7C 1D 67 06 00 00 03 00 43 4E 3C CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 23 5D C1 36 49 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 18 10 03 3A 3E 08 0E 1A 3A 01 10 37 E0 1F 67 06 00 00 03 00 43 E6 D8 CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 92 5E CD 36 51 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 18 10 03 3A 3E 08 0E 1A 3A 01 D0 E8 43 22 67 06 00 00 03 00 43 7E 75 CC 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 8B E6 C4 36 59 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 18 10 03 3A 3E 08 0E 1A 3A 01 A8 96 A7 24 67 06 00 00 03 00 43 15 12 CD 5D 00 00 00 00 42 07 79 72 FD FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 B1 27 DE 36 61 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 18 10 03 3A 3E 08 0E 1A 3A 01 68 48 0B 27 67 06 00 00 03 00 43 AD AE CD 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 A1 EC C8 36 69 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 18 10 03 3A 3E 08 0E 1A 3A 01 28 FA 6E 29 67 06 00 00 03 00 43 45 4B CE 5D 00 00 00 00 42 07 79 72 FD FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 02 00 2E 03 CD FF 6E 02 50 61 D8 36 71 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 18 10 03 3A 3E 08 0E 1A 3A 01 E8 AB D2 2B 67 06 00 00 03 00 43 DD E7 CE 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 CE C8 DA 36 79 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 18 10 03 3A 3E 08 0E 1A 3A 01 C0 59 36 2E 67 06 00 00 03 00 43 74 84 CF 5D 00 00 00 00 42 07 79 72 FC FF 01 00 01 00 00 00 03 00 03 00 03 00 02 00 01 00 02 00 2E 03 CD FF 6E 02 9A 6D DA 36 81 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 18 10 03 3A 3E 08 0E 1A 3A 01 80 0B 9A 30 67 06 00 00 03 00 43 0C 21 D0 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 89 9B D5 36 89 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 18 10 03 3A 3E 08 0E 1A 3A 01 40 BD FD 32 67 06 00 00 03 00 43 A4 BD D0 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 72 06 B4 36 91 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 18 10 03 3A 3E 08 0E 1A 3A 01 18 6B 61 35 67 06 00 00 03 00 43 3B 5A D1 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 55 DF C2 36 99 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 18 10 03 3A 3E 08 0E 1A 3A 01 D8 1C C5 37 67 06 00 00 03 00 43 D3 F6 D1 5D 00 00 00 00 41 07 79 72 FC FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 74 F7 D0 36 A1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 18 10 03 3A 3E 08 0E 1A 3A 01 98 CE 28 3A 67 06 00 00 03 00 43 6B 93 D2 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 71 C0 C4 36 A9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 18 10 03 3A 3E 08 0E 1A 3A 01 58 80 8C 3C 67 06 00 00 03 00 43 03 30 D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 21 D3 B6 36 B1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 18 10 03 3A 3E 08 0E 1A 3A 01 30 2E F0 3E 67 06 00 00 03 00 43 9A CC D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 CF C1 B8 36 B9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 18 10 03 3A 3E 08 0E 1A 3A 01 F0 DF 53 41 67 06 00 00 03 00 43 32 69 D4 5D 00 00 00 00 41 07 79 72 FC FF 01 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 D4 88 B7 36 C1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 18 10 03 3A 3E 08 0E 1A 3A 01 B0 91 B7 43 67 06 00 00 03 00 43 CA 05 D5 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 A8 80 AB 36 C9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 18 10 03 3A 3E 08 0E 1A 3A 01 88 3F 1B 46 67 06 00 00 03 00 43 61 A2 D5 5D 00 00 00 00 40 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 6C D8 B9 36 D1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 18 10 03 3A 3E 08 0E 1A 3A 01 48 F1 7E 48 67 06 00 00 03 00 43 F9 3E D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 23 46 C4 36 D9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 18 10 03 3A 3E 08 0E 1A 3A 01 08 A3 E2 4A 67 06 00 00 03 00 43 91 DB D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 33 F8 D9 36 E1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 18 10 03 3A 3E 08 0E 1A 3A 01 E0 50 46 4D 67 06 00 00 03 00 43 28 78 D7 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 DA 2F DD 36 E9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 18 10 03 3A 3E 08 0E 1A 3A 01 A0 02 AA 4F 67 06 00 00 03 00 43 C0 14 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 31 13 DC 36 F1 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 18 10 03 3A 3E 08 0E 1A 3A 01 60 B4 0D 52 67 06 00 00 03 00 43 58 B1 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 22 72 DF 36 F9 60 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 18 10 03 3A 3E 08 0E 1A 3A 01 20 66 71 54 67 06 00 00 03 00 43 F0 4D D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 73 6E CA 36 01 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 18 10 03 3A 3E 08 0E 1A 3A 01 F8 13 D5 56 67 06 00 00 03 00 43 87 EA D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 01 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 07 0A C4 36 09 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 18 10 03 3A 3E 08 0E 1A 3A 01 B8 C5 38 59 67 06 00 00 03 00 43 1F 87 DA 5D 00 00 00 00 41 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 F6 BA 9E 36 11 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 18 10 03 3A 3E 08 0E 1A 3A 01 78 77 9C 5B 67 06 00 00 03 00 43 B7 23 DB 5D 00 00 00 00 41 07 79 72 FB FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 F0 20 B7 36 19 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 18 10 03 3A 3E 08 0E 1A 3A 01 50 25 00 5E 67 06 00 00 03 00 43 4E C0 DB 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 D1 7E 9C 36 21 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 18 10 03 3A 3E 08 0E 1A 3A 01 10 D7 63 60 67 06 00 00 03 00 43 E6 5C DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 8B 94 A3 36 29 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 18 10 03 3A 3E 08 0E 1A 3A 01 D0 88 C7 62 67 06 00 00 03 00 43 7E F9 DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 C9 DA B9 36 31 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 18 10 03 3A 3E 08 0E 1A 3A 01 A8 36 2B 65 67 06 00 00 03 00 43 15 96 DD 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 22 07 D8 36 39 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 18 10 03 3A 3E 08 0E 1A 3A 01 68 E8 8E 67 67 06 00 00 03 00 43 AD 32 DE 5D 00 00 00 00 43 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 4E CE E7 36 41 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 18 10 03 3A 3E 08 0E 1A 3A 01 28 9A F2 69 67 06 00 00 03 00 43 45 CF DE 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CB 69 CC 36 49 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 18 10 03 3A 3E 08 0E 1A 3A 01 E8 4B 56 6C 67 06 00 00 03 00 43 DD 6B DF 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D6 F8 E0 36 51 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 18 10 03 3A 3E 08 0E 1A 3A 01 C0 F9 B9 6E 67 06 00 00 03 00 43 74 08 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 EC AA DD 36 59 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 18 10 03 3A 3E 08 0E 1A 3A 01 80 AB 1D 71 67 06 00 00 03 00 43 0C A5 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 55 EF D3 36 61 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 18 10 03 3A 3E 08 0E 1A 3A 01 40 5D 81 73 67 06 00 00 03 00 43 A4 41 E1 5D 00 00 00 00 43 07 78 72 FB FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 48 1A D8 36 69 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DC 18 10 03 3A 3E 08 0E 1A 3A 01 18 0B E5 75 67 06 00 00 03 00 43 3B DE E1 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 13 D6 D0 36 71 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DD 18 10 03 3A 3E 08 0E 1A 3A 01 D8 BC 48 78 67 06 00 00 03 00 43 D3 7A E2 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 03 00 2E 03 CD FF 6E 02 29 20 DB 36 79 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DE 18 10 03 3A 3E 08 0E 1A 3A 01 98 6E AC 7A 67 06 00 00 03 00 43 6B 17 E3 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E1 CD D8 36 81 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DF 18 10 03 3A 3E 08 0E 1A 3A 01 70 1C 10 7D 67 06 00 00 03 00 43 02 B4 E3 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D7 F4 DB 36 89 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E0 18 10 03 3A 3E 08 0E 1A 3A 01 30 CE 73 7F 67 06 00 00 03 00 43 9A 50 E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C1 54 D8 36 91 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E1 18 10 03 3A 3E 08 0E 1A 3A 01 F0 7F D7 81 67 06 00 00 03 00 43 32 ED E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 5F 88 C6 36 99 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 18 10 03 3A 3E 08 0E 1A 3A 01 C8 2D 3B 84 67 06 00 00 03 00 43 C9 89 E5 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 A7 D9 C9 36 A1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 18 10 03 3A 3E 08 0E 1A 3A 01 88 DF 9E 86 67 06 00 00 03 00 43 61 26 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 64 E3 B4 36 A9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E4 18 10 03 3A 3E 08 0E 1A 3A 01 48 91 02 89 67 06 00 00 03 00 43 F9 C2 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 EC D3 C4 36 B1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E5 18 10 03 3A 3E 08 0E 1A 3A 01 08 43 66 8B 67 06 00 00 03 00 43 91 5F E7 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 01 E4 C2 36 B9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E6 18 10 03 3A 3E 08 0E 1A 3A 01 E0 F0 C9 8D 67 06 00 00 03 00 43 28 FC E7 5D 00 00 00 00 41 07 78 72 FC FF 00 00 FF FF FF FF 03 00 03 00 03 00 06 00 02 00 03 00 2E 03 CD FF 6D 02 EF 0F 33 37 C1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E7 18 10 03 3A 3E 08 0E 1A 3A 01 A0 A2 2D 90 67 06 00 00 03 00 43 C0 98 E8 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 FE FF 04 00 2E 03 CD FF 6E 02 29 5F 74 37 C9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E8 18 10 03 3A 3E 08 0E 1A 3A 01 60 54 91 92 67 06 00 00 03 00 43 58 35 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 FB B7 79 37 D1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 18 10 03 3A 3E 08 0E 1A 3A 01 38 02 F5 94 67 06 00 00 03 00 43 EF D1 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 12 03 81 37 D9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 18 10 03 3A 3E 08 0E 1A 3A 01 F8 B3 58 97 67 06 00 00 03 00 43 87 6E EA 5D 00 00 00 00 40 07 77 72 FC FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 A0 67 7D 37 E1 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 18 10 03 3A 3E 08 0E 1A 3A 01 B8 65 BC 99 67 06 00 00 03 00 43 1F 0B EB 5D 00 00 00 00 40 07 78 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 03 00 2E 03 CD FF 6E 02 5B 04 94 37 E9 61 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 18 10 03 3A 3E 08 0E 1A 3A 01 90 13 20 9C 67 06 00 00 03 00 43 B6 A7 EB 5D 00 00 00 00 40 07 77 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 86 E3 73 37 F1 61 00 00
|
||||
66
head-tracking/combined.py
Normal file
@@ -0,0 +1,66 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
# columns = [33, 69, 44, 46, 48, 67, 69, 71, 78]
|
||||
columns = [34]
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 62, 63, 64, 65, 66, 67, 68, 70,71, 73, 74, 75, 77, 78]
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 46, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]
|
||||
for i in range(len(data[0])):
|
||||
if i in columns:
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
# plt.legend()
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
fig = plt.figure()
|
||||
ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
1
head-tracking/data
Symbolic link
@@ -0,0 +1 @@
|
||||
./yes
|
||||
101
head-tracking/final.py
Normal file
@@ -0,0 +1,101 @@
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
start_time = time.time()
|
||||
timeout = 10 # seconds
|
||||
|
||||
vertical_count = 0
|
||||
horizontal_count = 0
|
||||
horizontal_fluctuation_count = 0
|
||||
initial_131_sequence = True
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
if len(data) > 0:
|
||||
column_34_data = [row[34] for row in data]
|
||||
|
||||
for i in range(len(column_34_data)):
|
||||
print(column_34_data[i])
|
||||
if initial_131_sequence:
|
||||
if column_34_data[i] == 131:
|
||||
if i >= 4:
|
||||
continue
|
||||
else:
|
||||
initial_131_sequence = False
|
||||
|
||||
if column_34_data[i] == 131 and not initial_131_sequence:
|
||||
vertical_count += 1
|
||||
horizontal_count = 0
|
||||
if vertical_count >= 45:
|
||||
print("vertical")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
elif column_34_data[i] == 3:
|
||||
horizontal_count += 1
|
||||
vertical_count = 0
|
||||
if horizontal_count >= 40:
|
||||
print("horizontal")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
else:
|
||||
vertical_count = 0
|
||||
horizontal_count = 0
|
||||
|
||||
# Check for horizontal nodding (fluctuation between 3 and 67 or higher)
|
||||
fluctuation_window = 40
|
||||
if len(column_34_data) >= fluctuation_window:
|
||||
fluctuation_count = 0
|
||||
for i in range(len(column_34_data) - fluctuation_window + 1):
|
||||
segment = column_34_data[i:i+fluctuation_window]
|
||||
if any(value == 3 for value in segment) and any(value >= 67 for value in segment):
|
||||
count_67 = segment.count(67)
|
||||
if count_67 <= 10:
|
||||
fluctuation_count += 1
|
||||
if fluctuation_count >= 10:
|
||||
print("horizontal")
|
||||
running.set()
|
||||
sock.close()
|
||||
exit()
|
||||
|
||||
print("unknown")
|
||||
running.set()
|
||||
sock.close()
|
||||
49
head-tracking/main.py
Normal file
@@ -0,0 +1,49 @@
|
||||
import os
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def convert_file(input_filepath):
|
||||
data = []
|
||||
with open(input_filepath, 'r') as infile:
|
||||
for line in infile:
|
||||
base10_line = hex_to_base10(line.strip())
|
||||
data.append(base10_line)
|
||||
return data
|
||||
|
||||
def plot_data(data, title, directory):
|
||||
plt.figure()
|
||||
plt.title(title)
|
||||
# columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 63, 64, 65, 67, 68, 70, 71, 73, 74, 75, 77]
|
||||
columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]
|
||||
for i in range(len(data[0])):
|
||||
if i in columns_to_remove:
|
||||
continue
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
|
||||
plt.legend()
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
|
||||
# Add interactive cursor
|
||||
mplcursors.cursor(hover=True)
|
||||
|
||||
plt.show()
|
||||
plt.close()
|
||||
|
||||
def process_files(directory):
|
||||
for filename in os.listdir(directory):
|
||||
if filename.endswith('.txt'):
|
||||
input_filepath = os.path.join(directory, filename)
|
||||
data = convert_file(input_filepath)
|
||||
plot_data(data, f'{filename}', directory)
|
||||
|
||||
# Directory containing the files
|
||||
directory = 'yes'
|
||||
|
||||
# Process each file in the directory
|
||||
process_files(directory)
|
||||
122
head-tracking/no/2.txt
Normal file
@@ -0,0 +1,122 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1C 10 03 3A 3E 08 0E 1A 3A 01 08 ED A4 83 29 09 00 00 03 00 42 81 04 A2 12 01 00 00 00 00 00 00 00 00 00 FF FF 04 00 04 00 1C 83 1C 83 1C 83 83 FE B2 03 47 04 86 FE B1 03 4A 00 5F 94 03 37 44 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1C 10 03 3A 3E 08 0E 1A 3A 01 50 B2 08 86 29 09 00 00 03 00 42 1E A1 A2 12 01 00 00 00 00 00 00 00 00 00 FC FF 08 00 0A 00 1D 83 1D 83 1D 83 85 FE B5 03 49 04 86 FE B2 03 4A 00 4C 29 E0 36 4C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E4 1C 10 03 3A 3E 08 0E 1A 3A 01 80 7B 6C 88 29 09 00 00 03 00 43 BC 3D A3 12 01 00 00 00 C3 A3 99 EF 42 EE FE FF 0D 00 0C 00 1D 83 1D 83 1D 83 00 00 02 00 01 00 86 FE B2 03 4A 00 3F 26 F3 36 54 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E5 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 44 D0 8A 29 09 00 00 03 00 43 5A DA A3 12 01 00 00 00 BF A3 9F EF 3D EE FA FF 00 00 FC FF 1D 83 1D 83 1D 83 00 00 FD FF 02 00 86 FE B2 03 4A 00 D2 34 5D 37 5C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E6 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 09 34 8D 29 09 00 00 03 00 43 F7 76 A4 12 01 00 00 00 B7 A3 B6 EF 44 EE FF FF 18 00 09 00 1D 83 1D 83 1D 83 FA FF 01 00 FD FF 86 FE B2 03 4A 00 B4 44 70 37 64 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E7 1C 10 03 3A 3E 08 0E 1A 3A 01 28 D3 97 8F 29 09 00 00 03 00 43 95 13 A5 12 01 00 00 00 95 A3 C3 EF 47 EE 01 00 F9 FF 0F 00 1D 83 1D 83 1D 83 07 00 05 00 06 00 86 FE B2 03 4A 00 81 F0 4F 37 6C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E8 1C 10 03 3A 3E 08 0E 1A 3A 01 58 9C FB 91 29 09 00 00 03 00 43 33 B0 A5 12 01 00 00 00 C0 A3 A6 EF 43 EE 1A 00 DC FF 07 00 1D 83 1D 83 1D 83 0F 00 02 00 11 00 86 FE B2 03 4B 00 9C 7C 5C 37 74 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 61 5F 94 29 09 00 00 03 00 83 D0 4C A6 12 01 00 00 00 DC A3 49 EF B5 EE B4 00 64 FF 23 00 1D 83 1D 83 1D 83 26 00 52 00 41 00 89 FE B5 03 4D 00 70 21 85 39 7C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 2A C3 96 29 09 00 00 03 00 03 6E E9 A6 12 01 00 00 00 A4 A4 2D EE 43 F0 24 02 DB FD 45 00 1D 83 1D 83 1D 83 80 00 A9 00 D7 00 8F FE BC 03 56 00 31 B5 F7 3A 84 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1C 10 03 3A 3E 08 0E 1A 3A 01 00 F4 26 99 29 09 00 00 03 00 03 0C 86 A7 12 01 00 00 00 18 A7 1C EB 18 F5 97 04 E8 FA 3D 01 1D 83 1D 83 1D 83 5D 00 8E 00 1E 01 97 FE C8 03 64 00 48 3B F2 3B 8C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1C 10 03 3A 3E 08 0E 1A 3A 01 30 BD 8A 9B 29 09 00 00 03 00 83 AA 22 A8 12 01 00 00 00 0F AB 8A E6 F8 FC B7 05 F0 F8 CE 01 1D 83 1D 83 1D 83 14 00 18 00 41 01 9C FE CB 03 6F 00 2E EA 0B 3C 94 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1C 10 03 3A 3E 08 0E 1A 3A 01 78 82 EE 9D 29 09 00 00 03 00 83 47 BF A8 12 01 00 00 00 4B B0 C6 E0 49 07 22 06 41 F7 3C 02 1D 83 1D 83 1D 83 3F FF 73 FF 3C 00 99 FE C8 03 71 00 58 20 0F 3C 9C 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 4B 52 A0 29 09 00 00 03 00 83 E5 5B A9 12 01 00 00 00 46 B4 BA DC E7 0E 4C 01 8E FD 93 00 1D 83 1D 83 1D 83 53 FE 32 FE F5 FD 85 FE B1 03 4C 00 4D 8B 14 3C A4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 14 B6 A2 29 09 00 00 03 00 83 83 F8 A9 12 01 00 00 00 EF B2 44 DD D5 0D 1A FC C2 03 2C FF 1E 83 1E 83 1E 83 7F FE 45 FE F2 FD 72 FE 97 03 1D 00 72 29 29 3C AC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1C 10 03 3A 3E 08 0E 1A 3A 01 20 DA 19 A5 29 09 00 00 03 00 83 20 95 AA 12 01 00 00 00 66 AD B8 E1 D3 05 96 F9 FD 07 C5 FE 1E 83 1E 83 1E 83 8A FE 40 FF 65 FF 61 FE 89 03 03 00 90 35 1E 3C B4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1C 10 03 3A 3E 08 0E 1A 3A 01 50 A3 7D A7 29 09 00 00 03 00 83 BE 31 AB 12 01 00 00 00 43 A7 11 E9 E3 FA 08 F8 D1 0A 68 FE 1E 83 1E 83 1E 83 4F FE C0 FE 23 00 4F FE 7E 03 00 00 31 1E 88 3B BC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1C 10 03 3A 3E 08 0E 1A 3A 01 80 6C E1 A9 29 09 00 00 03 00 83 5C CE AB 12 01 00 00 00 85 A1 AF F2 12 ED E4 F6 22 0C 52 FE 1E 83 1E 83 1E 83 BD FE 35 FF 44 01 3D FE 72 03 12 00 62 25 2D 3B C4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 35 45 AC 29 09 00 00 03 00 03 FA 6A AC 12 01 00 00 00 C1 9D EB FC 55 E0 26 F8 7E 0A 41 FF 1E 83 1E 83 1E 83 03 00 F4 FF 60 02 38 FE 71 03 39 00 D6 50 0C 3C CC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 FA A8 AE 29 09 00 00 03 00 03 97 07 AD 12 01 00 00 00 99 9B E7 02 7D D8 BF FC 7D 02 21 FF 1E 83 1E 83 1E 83 0A 02 49 02 E2 02 4F FE 83 03 71 00 6E A5 52 3D D4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1C 10 03 3A 3E 08 0E 1A 3A 01 28 C4 0C B1 29 09 00 00 03 00 03 35 A4 AD 12 01 00 00 00 E2 9B 5A 02 4F DA A9 04 91 FB 9F 01 1E 83 1E 83 1E 83 C0 01 53 02 5B 02 6B FE AC 03 A0 00 0F 22 16 3E DC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1C 10 03 3A 3E 08 0E 1A 3A 01 58 8D 70 B3 29 09 00 00 03 00 03 D3 40 AE 12 01 00 00 00 CE 9E 31 FD 90 E3 6A 09 44 F6 E9 03 1E 83 1E 83 1E 83 72 00 55 01 56 02 7A FE C6 03 C6 00 7A 27 48 3E E4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 52 D4 B5 29 09 00 00 03 00 03 70 DD AE 12 01 00 00 00 00 A5 89 F5 E0 F2 52 0B 5F F2 73 04 1E 83 1E 83 1E 83 00 FF D3 FE 72 01 78 FE C5 03 E0 00 34 37 53 3E EC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 1B 38 B8 29 09 00 00 03 00 03 0E 7A AF 12 01 00 00 00 E3 AA 24 EE 35 FF 82 03 AB FA 73 00 1E 83 1E 83 1E 83 7D FD E6 FC 4A FD 5E FE 9C 03 BB 00 85 DB 55 3E F4 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1C 10 03 3A 3E 08 0E 1A 3A 01 00 E5 9B BA 29 09 00 00 03 00 03 AC 16 B0 12 01 00 00 00 E4 A9 4E EF 3A FD BE FA F3 06 2D FE 1E 83 1E 83 1E 83 64 FD 3C FD 6F FD 3B FE 73 03 78 00 F0 41 66 3E FC 71 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1C 10 03 3A 3E 08 0E 1A 3A 01 48 AA FF BC 29 09 00 00 03 00 03 49 B3 B0 12 01 00 00 00 F3 A3 BD F6 5A F1 30 F6 0A 0C D4 FD 1F 83 1F 83 1F 83 41 FE 9B FE 18 00 28 FE 5B 03 62 00 28 58 4D 3E 04 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1C 10 03 3A 3E 08 0E 1A 3A 01 78 73 63 BF 29 09 00 00 03 00 03 E7 4F B1 12 01 00 00 00 33 9E C4 FF B3 E4 18 F7 AF 07 E0 FC 1F 83 1F 83 1F 83 EC 00 43 00 AB 02 2F FE 5B 03 84 00 5C 20 D8 3D 0C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 3C C7 C1 29 09 00 00 03 00 03 85 EC B1 12 01 00 00 00 F5 9B 09 02 CA DF 90 01 65 FE 21 00 1F 83 1F 83 1F 83 9E 02 B4 03 9E 03 53 FE 8A 03 B9 00 27 3E 3D 3E 14 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 05 2B C4 29 09 00 00 03 00 03 23 89 B2 12 01 00 00 00 6E 9E 9F FD D8 E6 EE 07 1B F7 24 03 1F 83 1F 83 1F 83 FB 00 CC 01 96 02 73 FE B6 03 EA 00 7C 4B 94 3E 1C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1C 10 03 3A 3E 08 0E 1A 3A 01 20 CB 8E C6 29 09 00 00 03 00 03 C0 25 B3 12 01 00 00 00 B5 A3 5B F6 20 F5 D3 09 A2 F2 23 04 1F 83 1F 83 1F 83 61 FF 59 FF A0 01 7B FE BC 03 04 01 62 85 9A 3E 24 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1C 10 03 3A 3E 08 0E 1A 3A 01 50 94 F2 C8 29 09 00 00 03 00 03 5E C2 B3 12 01 00 00 00 B8 A9 3F EE A8 02 33 04 67 FA D2 00 1F 83 1F 83 1F 83 F4 FC 46 FD 37 FD 64 FE 9C 03 E2 00 07 B4 92 3E 2C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 1D 10 03 3A 3E 08 0E 1A 3A 01 80 5D 56 CB 29 09 00 00 03 00 03 FC 5E B4 12 01 00 00 00 25 A9 7E EE 15 01 E9 FA 62 06 B2 FD 1F 83 1F 83 1F 83 60 FD 34 FD 59 FD 44 FE 72 03 A1 00 38 C0 97 3E 34 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 26 BA CD 29 09 00 00 03 00 03 9A FB B4 12 01 00 00 00 10 A3 C0 F4 0E F5 54 F6 97 0B 99 FD 1F 83 1F 83 1F 83 41 FE C1 FE 09 00 31 FE 5C 03 88 00 E0 59 97 3E 3C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 EB 1D D0 29 09 00 00 03 00 03 37 98 B5 12 01 00 00 00 3E 9D B6 FC 24 E8 7C F7 54 07 14 FC 1F 83 1F 83 1F 83 5D 01 98 00 B3 02 3C FE 5E 03 A8 00 19 81 5D 3E 44 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 1D 10 03 3A 3E 08 0E 1A 3A 01 28 B5 81 D2 29 09 00 00 03 00 03 D5 34 B6 12 01 00 00 00 C4 9B 3B FD CA E4 BD 03 B9 FC E8 00 1F 83 1F 83 1F 83 46 02 ED 03 83 03 63 FE 98 03 DF 00 7D 19 72 3E 4C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 1D 10 03 3A 3E 08 0E 1A 3A 01 58 7E E5 D4 29 09 00 00 03 00 03 73 D1 B6 12 01 00 00 00 44 9F 34 F8 13 ED 89 08 5C F6 0F 03 1F 83 1F 83 1F 83 A5 00 3D 01 43 02 7E FE B9 03 07 01 48 27 94 3E 54 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 43 49 D7 29 09 00 00 03 00 03 10 6E B7 12 01 00 00 00 4B A5 70 F0 73 FB 5A 07 08 F6 42 02 1F 83 1F 83 1F 83 D4 FD FD FD 16 FF 78 FE B0 03 04 01 D4 D8 94 3E 5C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 0C AD D9 29 09 00 00 03 00 03 AE 0A B8 12 01 00 00 00 3B A8 E0 EE 20 FF 59 FE F1 03 3B FF 20 83 20 83 20 83 E6 FC 70 FC 30 FD 52 FE 87 03 CA 00 8E 08 93 3E 64 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 1D 10 03 3A 3E 08 0E 1A 3A 01 00 D6 10 DC 29 09 00 00 03 00 03 4C A7 B8 12 01 00 00 00 7E A3 53 F4 34 F4 25 F6 D4 0B 7B FC 20 83 20 83 20 83 B8 FD E9 FD 3C FF 36 FE 5F 03 A4 00 D8 07 93 3E 6C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 1D 10 03 3A 3E 08 0E 1A 3A 01 30 9F 74 DE 29 09 00 00 03 00 03 EA 43 B9 12 01 00 00 00 8A 9D EF FD 5D E5 A4 F6 1B 09 3B FD 20 83 20 83 20 83 EA 00 3F 00 EC 02 35 FE 5D 03 BC 00 B2 CE 95 3E 74 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 1D 10 03 3A 3E 08 0E 1A 3A 01 78 64 D8 E0 29 09 00 00 03 00 03 87 E0 B9 12 01 00 00 00 E7 9A D2 00 CA DF 20 00 AB FF D3 FF 20 83 20 83 20 83 64 02 5D 03 1A 03 59 FE 86 03 ED 00 07 1C 88 3E 7C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 2D 3C E3 29 09 00 00 03 00 03 25 7D BA 12 01 00 00 00 DA 9C CD FC 14 E5 80 07 9C F7 DA 01 20 83 20 83 20 83 67 01 EE 01 9F 02 7B FE B0 03 1B 01 24 A6 80 3E 84 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 F6 9F E5 29 09 00 00 03 00 03 C3 19 BB 12 01 00 00 00 96 A1 FE F4 59 F2 F2 09 64 F3 44 03 20 83 20 83 20 83 40 FF 9E FF 1B 01 82 FE BA 03 2E 01 60 CD 82 3E 8C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1D 10 03 3A 3E 08 0E 1A 3A 01 08 C0 03 E8 29 09 00 00 03 00 03 61 B6 BB 12 01 00 00 00 0D A7 0E EE F3 FD B7 04 1A FC 25 01 20 83 20 83 20 83 F3 FC CF FD 6C FD 65 FE 9F 03 0A 01 25 0E 81 3E 94 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1D 10 03 3A 3E 08 0E 1A 3A 01 50 85 67 EA 29 09 00 00 03 00 03 FE 52 BC 12 01 00 00 00 BC A6 DB EF 5F FB 52 FA DB 07 4E FD 20 83 20 83 20 83 54 FD D5 FC B0 FD 41 FE 72 03 CE 00 4C 28 84 3E 9C 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1D 10 03 3A 3E 08 0E 1A 3A 01 80 4E CB EC 29 09 00 00 03 00 03 9C EF BC 12 01 00 00 00 18 A1 93 F7 FC ED 35 F6 8F 0C D9 FD 20 83 20 83 20 83 C1 FE F5 FE D0 00 2E FE 5D 03 BE 00 52 47 83 3E A4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 17 2F EF 29 09 00 00 03 00 03 3A 8C BD 12 01 00 00 00 4C 9C 8C FE B5 E2 72 F9 36 04 0C FD 20 83 20 83 20 83 11 02 78 01 B3 02 45 FE 66 03 E5 00 9D 45 53 3E AC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 E0 92 F1 29 09 00 00 03 00 03 D8 28 BE 12 01 00 00 00 6B 9B BE FD 3C E2 42 04 6E FB 6B 00 20 83 20 83 20 83 35 02 18 03 FC 02 6A FE 99 03 13 01 66 25 54 3E B4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 1D 10 03 3A 3E 08 0E 1A 3A 01 28 A6 F6 F3 29 09 00 00 03 00 03 75 C5 BE 12 01 00 00 00 75 9E B8 F7 E0 EA D9 07 78 F6 45 02 21 83 21 83 21 83 81 00 FB 00 E0 01 7F FE B4 03 31 01 90 7E 66 3E BC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 1D 10 03 3A 3E 08 0E 1A 3A 01 58 6F 5A F6 29 09 00 00 03 00 03 13 62 BF 12 01 00 00 00 A1 A3 29 F0 43 F8 35 09 30 F4 BE 02 21 83 21 83 21 83 FE FE 45 FF B5 00 7D FE B5 03 3B 01 BF E5 69 3E C4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 1D 10 03 3A 3E 08 0E 1A 3A 01 88 38 BE F8 29 09 00 00 03 00 03 B1 FE BF 12 01 00 00 00 F9 A8 15 EA 6D 02 42 03 63 FD 2A 00 21 83 21 83 21 83 2C FD 91 FD 66 FD 60 FE 98 03 12 01 02 3F 61 3E CC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 FD 21 FB 29 09 00 00 03 00 03 4E 9B C0 12 01 00 00 00 2D A8 D6 EB D1 FE 36 FB 2D 07 E1 FD 21 83 21 83 21 83 A9 FD A4 FD DE FD 42 FE 74 03 D8 00 86 2C 65 3E D4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 1D 10 03 3A 3E 08 0E 1A 3A 01 00 C7 85 FD 29 09 00 00 03 00 03 EC 37 C1 12 01 00 00 00 D1 A2 E7 F2 8F F2 D7 F6 11 0C 02 FE 21 83 21 83 21 83 73 FE C5 FE 3A 00 2F FE 60 03 C1 00 23 91 5E 3E DC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 1D 10 03 3A 3E 08 0E 1A 3A 01 30 90 E9 FF 29 09 00 00 03 00 03 8A D4 C1 12 01 00 00 00 A3 9D 37 FB B6 E5 E1 F7 CA 06 4D FC 21 83 21 83 21 83 BD 01 6A 00 BB 02 3D FE 5F 03 DF 00 50 90 D3 3D E4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 1D 10 03 3A 3E 08 0E 1A 3A 01 60 59 4D 02 2A 09 00 00 03 00 03 28 71 C2 12 01 00 00 00 D9 9B 8F FB 97 E2 BB 02 06 FD 64 00 21 83 21 83 21 83 21 02 75 03 01 03 62 FE 90 03 0D 01 5C 40 1C 3E EC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 1E B1 04 2A 09 00 00 03 00 03 C5 0D C3 12 01 00 00 00 14 9E 8A F6 8B E9 BA 06 7B F7 DC 01 21 83 21 83 21 83 D6 00 45 01 CC 01 7A FE AD 03 2C 01 2C 46 4C 3E F4 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 E7 14 07 2A 09 00 00 03 00 03 63 AA C3 12 01 00 00 00 53 A2 77 EF 3F F6 7B 08 17 F5 85 02 21 83 21 83 21 83 CB FE 5D FF 0A 00 78 FE B1 03 31 01 B8 99 50 3E FC 72 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1D 10 03 3A 3E 08 0E 1A 3A 01 08 B1 78 09 2A 09 00 00 03 00 03 01 47 C4 12 01 00 00 00 51 A6 C6 EB 7E FD 54 01 F6 00 F6 FF 21 83 21 83 21 83 1E FD 63 FD 7E FD 56 FE 93 03 02 01 AE 71 4F 3E 04 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1D 10 03 3A 3E 08 0E 1A 3A 01 38 7A DC 0B 2A 09 00 00 03 00 03 9F E3 C4 12 01 00 00 00 81 A4 FA EE 0A F7 01 FA 3E 08 99 FD 21 83 21 83 21 83 F7 FD 03 FE 88 FE 3C FE 71 03 D6 00 F7 68 4F 3E 0C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1D 10 03 3A 3E 08 0E 1A 3A 01 80 3F 40 0E 2A 09 00 00 03 00 03 3C 80 C5 12 01 00 00 00 D5 9F D8 F6 51 EA 09 F8 97 0A 7E FE 21 83 21 83 21 83 B8 FF 8A FF 6C 01 32 FE 66 03 D3 00 58 A6 4E 3E 14 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 08 A4 10 2A 09 00 00 03 00 03 DA 1C C6 12 01 00 00 00 28 9C CE FB 98 E1 25 FB D9 02 D9 FD 22 83 22 83 22 83 FA 01 95 01 31 02 4C FE 71 03 F4 00 5C D3 FE 3D 1C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 D1 07 13 2A 09 00 00 03 00 03 78 B9 C6 12 01 00 00 00 9B 9B F9 F9 3E E2 21 04 E7 FA 11 00 22 83 22 83 22 83 F7 01 74 02 5B 02 6E FE 9B 03 1A 01 14 19 00 3E 24 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1D 10 03 3A 3E 08 0E 1A 3A 01 10 9B 6B 15 2A 09 00 00 03 00 03 16 56 C7 12 01 00 00 00 FB 9D 6F F3 CF EA D7 06 C4 F6 67 01 22 83 22 83 22 83 3B 00 B1 00 05 01 7C FE AF 03 2E 01 75 27 0E 3E 2C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1D 10 03 3A 3E 08 0E 1A 3A 01 58 60 CF 17 2A 09 00 00 03 00 03 B3 F2 C7 12 01 00 00 00 C0 A1 E9 EC 73 F5 83 05 D3 F9 8F 01 22 83 22 83 22 83 1D FE 0F FF 15 FF 6D FE AA 03 22 01 C1 EB 0B 3E 34 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1D 10 03 3A 3E 08 0E 1A 3A 01 88 29 33 1A 2A 09 00 00 03 00 03 51 8F C8 12 01 00 00 00 15 A4 4B EB 17 F9 A4 00 26 01 20 00 22 83 22 83 22 83 06 FE 0D FE 44 FE 53 FE 93 03 FE 00 B4 9B 0A 3E 3C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 F2 96 1C 2A 09 00 00 03 00 03 EF 2B C9 12 01 00 00 00 B6 A2 1F EE 02 F4 8B FB B9 06 B4 FE 22 83 22 83 22 83 9D FE A4 FE F4 FE 41 FE 7B 03 DE 00 D0 4D 0B 3E 44 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 BB FA 1E 2A 09 00 00 03 00 03 8D C8 C9 12 01 00 00 00 AB 9F D7 F3 38 EB 97 FA FF 05 5C FE 22 83 22 83 22 83 94 00 A6 FF 06 01 42 FE 74 03 DD 00 02 34 06 3E 4C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1D 10 03 3A 3E 08 0E 1A 3A 01 30 81 5E 21 2A 09 00 00 03 00 03 2A 65 CA 12 01 00 00 00 9E 9D E5 F5 10 E6 DF FE 0F 01 65 FF 22 83 22 83 22 83 58 01 B5 01 56 01 57 FE 87 03 EE 00 2C 71 81 3D 54 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1D 10 03 3A 3E 08 0E 1A 3A 01 60 4A C2 23 2A 09 00 00 03 00 03 C8 01 CB 12 01 00 00 00 16 9E 6E F4 3A E7 DA 02 00 FD 92 00 22 83 22 83 22 83 F3 00 15 01 CA 00 6A FE 9E 03 FD 00 8A B7 22 3D 5C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1D 10 03 3A 3E 08 0E 1A 3A 01 90 13 26 26 2A 09 00 00 03 00 03 66 9E CB 12 01 00 00 00 8E 9F 3D F1 CB EB 24 03 68 FC B0 00 22 83 22 83 22 83 D1 FF E1 FF B1 FF 6F FE A3 03 FA 00 AB FF 1B 3D 64 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 DC 89 28 2A 09 00 00 03 00 03 04 3B CC 12 01 00 00 00 97 A0 4B EF 08 EE AB 00 A2 FF C7 FF 22 83 22 83 22 83 63 FF 49 FF 38 FF 67 FE 9A 03 E9 00 72 B8 1D 3D 6C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1D 10 03 3A 3E 08 0E 1A 3A 01 08 A2 ED 2A 2A 09 00 00 03 00 03 A1 D7 CC 12 01 00 00 00 5D A0 57 EF BC EC D7 FE 67 01 69 FF 22 83 22 83 22 83 D9 FF A1 FF 99 FF 62 FE 92 03 DB 00 2C 49 1F 3D 74 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1D 10 03 3A 3E 08 0E 1A 3A 01 38 6B 51 2D 2A 09 00 00 03 00 03 3F 74 CD 12 01 00 00 00 9B 9F C0 EF D3 EA 27 FF A9 00 A8 FF 23 83 23 83 23 83 47 00 63 00 F0 FF 65 FE 94 03 D5 00 0C 2F 1B 3D 7C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1D 10 03 3A 3E 08 0E 1A 3A 01 68 34 B5 2F 2A 09 00 00 03 00 03 DD 10 CE 12 01 00 00 00 6C 9F D0 EF 55 EA 5C 00 E7 FF 2B 00 23 83 23 83 23 83 5D 00 72 00 F3 FF 69 FE 9C 03 D2 00 C1 28 02 3D 84 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1D 10 03 3A 3E 08 0E 1A 3A 01 98 FD 18 32 2A 09 00 00 03 00 83 7B AD CE 12 01 00 00 00 BD 9F C3 EF 46 EB AB 00 68 FF 5D 00 23 83 23 83 23 83 32 00 14 00 CA FF 6D FE 9F 03 CE 00 FC 82 EA 3B 8C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 C2 7C 34 2A 09 00 00 03 00 83 18 4A CF 12 01 00 00 00 C1 9F 52 F0 DA EC 22 00 D7 FF 32 00 23 83 23 83 23 83 EC FF DA FF A6 FF 6E FE 9E 03 C6 00 1D 5A 7A 3B 94 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1D 10 03 3A 3E 08 0E 1A 3A 01 10 8C E0 36 2A 09 00 00 03 00 83 B6 E6 CF 12 01 00 00 00 B4 9F DA F0 19 ED 93 FF 57 00 E3 FF 23 83 23 83 23 83 EF FF D5 FF BE FF 6E FE 9C 03 BF 00 3F D4 69 3B 9C 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1D 10 03 3A 3E 08 0E 1A 3A 01 40 55 44 39 2A 09 00 00 03 00 83 54 83 D0 12 01 00 00 00 D0 9F EC F0 3A EC 98 FF 54 00 C3 FF 23 83 23 83 23 83 0B 00 17 00 DB FF 6F FE 9C 03 BB 00 19 74 1E 3B A4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1D 10 03 3A 3E 08 0E 1A 3A 01 70 1E A8 3B 2A 09 00 00 03 00 83 F2 1F D1 12 01 00 00 00 06 A0 F5 F0 83 EB ED FF 44 00 ED FF 23 83 23 83 23 83 1A 00 34 00 E9 FF 70 FE 9F 03 B7 00 C8 C1 0B 3B AC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 E7 0B 3E 2A 09 00 00 03 00 83 90 BC D1 12 01 00 00 00 41 A0 23 F1 62 EB 29 00 0B 00 0F 00 23 83 23 83 23 83 22 00 21 00 ED FF 73 FE A2 03 B4 00 E9 73 97 3A B4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 AC 6F 40 2A 09 00 00 03 00 83 2D 59 D2 12 01 00 00 00 78 A0 51 F1 A6 EB 37 00 F9 FF 1E 00 23 83 23 83 23 83 0F 00 09 00 D9 FF 74 FE A3 03 B0 00 89 99 4F 3A BC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1D 10 03 3A 3E 08 0E 1A 3A 01 18 76 D3 42 2A 09 00 00 03 00 83 CB F5 D2 12 01 00 00 00 9F A0 87 F1 DE EB 2C 00 02 00 0F 00 23 83 23 83 23 83 11 00 03 00 E4 FF 75 FE A4 03 AC 00 9E AB 30 3A C4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1D 10 03 3A 3E 08 0E 1A 3A 01 48 3F 37 45 2A 09 00 00 03 00 83 69 92 D3 12 01 00 00 00 EC A0 80 F1 2B EC 92 00 BE FF 23 00 23 83 23 83 23 83 0E 00 25 00 EE FF 77 FE A6 03 A8 00 0B 2C EA 39 CC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1D 10 03 3A 3E 08 0E 1A 3A 01 78 08 9B 47 2A 09 00 00 03 00 83 07 2F D4 12 01 00 00 00 7A A1 4D F1 98 EC A2 00 D3 FF 13 00 24 83 24 83 24 83 01 00 00 00 DF FF 78 FE A7 03 A4 00 C8 82 B1 39 D4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 CD FE 49 2A 09 00 00 03 00 83 A4 CB D4 12 01 00 00 00 D4 A1 48 F1 D7 EC 39 00 FE FF FE FF 24 83 24 83 24 83 0F 00 E0 FF E2 FF 79 FE A6 03 9F 00 46 62 B4 39 DC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1D 10 03 3A 3E 08 0E 1A 3A 01 F0 96 62 4C 2A 09 00 00 03 00 83 42 68 D5 12 01 00 00 00 EC A1 3F F1 D3 EC F8 FF FB FF FC FF 24 83 24 83 24 83 0E 00 00 00 DF FF 7B FE A6 03 9A 00 01 0B A5 39 E4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1D 10 03 3A 3E 08 0E 1A 3A 01 20 60 C6 4E 2A 09 00 00 03 00 83 E0 04 D6 12 01 00 00 00 EE A1 5E F1 BE EC D5 FF 28 00 0E 00 24 83 24 83 24 83 08 00 00 00 DC FF 7C FE A7 03 95 00 B5 AB 9B 39 EC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1D 10 03 3A 3E 08 0E 1A 3A 01 50 29 2A 51 2A 09 00 00 03 00 83 7E A1 D6 12 01 00 00 00 D8 A1 AB F1 96 EC CC FF 34 00 0B 00 24 83 24 83 24 83 12 00 07 00 F3 FF 7D FE A8 03 91 00 85 00 9A 39 F4 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1D 10 03 3A 3E 08 0E 1A 3A 01 98 EE 8D 53 2A 09 00 00 03 00 83 1B 3E D7 12 01 00 00 00 D7 A1 D9 F1 7B EC F7 FF 0E 00 0B 00 24 83 24 83 24 83 11 00 13 00 F4 FF 7F FE A9 03 8E 00 1A 2F 8D 39 FC 73 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1D 10 03 3A 3E 08 0E 1A 3A 01 C8 B7 F1 55 2A 09 00 00 03 00 83 B9 DA D7 12 01 00 00 00 E8 A1 FB F1 78 EC 0B 00 15 00 0D 00 24 83 24 83 24 83 0D 00 0D 00 ED FF 81 FE AB 03 8B 00 DD 24 70 39 04 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 80 55 58 2A 09 00 00 03 00 83 57 77 D8 12 01 00 00 00 F5 A1 24 F2 81 EC 08 00 10 00 0C 00 24 83 24 83 24 83 0B 00 03 00 EB FF 82 FE AC 03 88 00 D9 AD 3D 39 0C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1D 10 03 3A 3E 08 0E 1A 3A 01 28 4A B9 5A 2A 09 00 00 03 00 43 F5 13 D9 12 01 00 00 00 0D A2 46 F2 86 EC 21 00 01 00 0F 00 24 83 24 83 24 83 10 00 06 00 F8 FF 83 FE AD 03 85 00 03 4E DB 37 14 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1D 10 03 3A 3E 08 0E 1A 3A 01 70 0F 1D 5D 2A 09 00 00 03 00 43 92 B0 D9 12 01 00 00 00 33 A2 46 F2 A5 EC 29 00 F2 FF 0C 00 24 83 24 83 24 83 07 00 03 00 ED FF 85 FE AD 03 82 00 D4 2C C8 37 1C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 D8 80 5F 2A 09 00 00 03 00 43 30 4D DA 12 01 00 00 00 52 A2 4C F2 C8 EC 13 00 FA FF 10 00 24 83 24 83 24 83 04 00 FB FF E9 FF 86 FE AE 03 7F 00 9F 1C D3 37 24 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 A1 E4 61 2A 09 00 00 03 00 83 CE E9 DA 12 01 00 00 00 56 A2 61 F2 DB EC F2 FF 09 00 0D 00 24 83 24 83 24 83 03 00 F8 FF EB FF 86 FE AE 03 7B 00 B9 5B 18 38 2C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1D 10 03 3A 3E 08 0E 1A 3A 01 00 6B 48 64 2A 09 00 00 03 00 43 6C 86 DB 12 01 00 00 00 4D A2 79 F2 D0 EC E7 FF 10 00 07 00 25 83 25 83 25 83 06 00 03 00 EC FF 88 FE AE 03 78 00 F8 19 01 38 34 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1D 10 03 3A 3E 08 0E 1A 3A 01 48 30 AC 66 2A 09 00 00 03 00 43 09 23 DC 12 01 00 00 00 46 A2 93 F2 BE EC EA FF 19 00 03 00 25 83 25 83 25 83 00 00 03 00 E9 FF 88 FE AF 03 76 00 86 35 F2 37 3C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1D 10 03 3A 3E 08 0E 1A 3A 01 78 F9 0F 69 2A 09 00 00 03 00 43 A7 BF DC 12 01 00 00 00 3E A2 C4 F2 9A EC D2 FF 4F 00 0A 00 25 83 25 83 25 83 E8 FF F8 FF C6 FF 88 FE B0 03 72 00 C5 E5 EC 37 44 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 C2 73 6B 2A 09 00 00 03 00 83 45 5C DD 12 01 00 00 00 07 A2 9E F3 E0 EB 2A FF 4F 01 22 00 25 83 25 83 25 83 D0 FF D3 FF C1 FF 86 FE AE 03 6C 00 C0 05 8F 38 4C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 8B D7 6D 2A 09 00 00 03 00 83 E3 F8 DD 12 01 00 00 00 4D A1 41 F5 97 EA 7C FE EE 00 41 00 25 83 25 83 25 83 6C 00 E2 FF 63 00 89 FE AC 03 6E 00 7C FA C4 39 54 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1D 10 03 3A 3E 08 0E 1A 3A 01 20 51 3B 70 2A 09 00 00 03 00 83 80 95 DE 12 01 00 00 00 17 A0 DA F5 12 EB 1A FF FA FE D2 00 25 83 25 83 25 83 3E 00 61 00 21 00 91 FE B0 03 74 00 76 2F 3D 3A 5C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1D 10 03 3A 3E 08 0E 1A 3A 01 50 1A 9F 72 2A 09 00 00 03 00 83 1E 32 DF 12 01 00 00 00 92 9F CF F5 CA EC 2A 00 04 FF 81 00 25 83 25 83 25 83 F9 FF 0D 00 D9 FF 92 FE B4 03 75 00 EA 09 A8 3A 64 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1D 10 03 3A 3E 08 0E 1A 3A 01 80 E3 02 75 2A 09 00 00 03 00 83 BC CE DF 12 01 00 00 00 8F 9F 70 F5 E2 ED 44 00 99 FF 02 00 25 83 25 83 25 83 D6 FF F5 FF C5 FF 93 FE B4 03 74 00 93 20 A8 3A 6C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 AC 66 77 2A 09 00 00 03 00 83 5A 6B E0 12 01 00 00 00 B6 9F 42 F5 FF ED 0C 00 F5 FF F3 FF 25 83 25 83 25 83 F3 FF FC FF EF FF 94 FE B4 03 74 00 F2 55 A8 3A 74 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 71 CA 79 2A 09 00 00 03 00 83 F7 07 E1 12 01 00 00 00 C4 9F 47 F5 D1 ED F2 FF 30 00 04 00 25 83 25 83 25 83 FC FF 0C 00 F9 FF 95 FE B5 03 75 00 41 DA A7 3A 7C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1D 10 03 3A 3E 08 0E 1A 3A 01 28 3B 2E 7C 2A 09 00 00 03 00 83 95 A4 E1 12 01 00 00 00 D1 9F 6E F5 B0 ED 01 00 15 00 16 00 25 83 25 83 25 83 0B 00 07 00 FF FF 98 FE B7 03 77 00 DA 94 88 3A 84 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1D 10 03 3A 3E 08 0E 1A 3A 01 58 04 92 7E 2A 09 00 00 03 00 83 33 41 E2 12 01 00 00 00 DE 9F 85 F5 B7 ED 11 00 F8 FF 18 00 25 83 25 83 25 83 10 00 03 00 00 00 9B FE B7 03 78 00 EA D4 59 3A 8C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1D 10 03 3A 3E 08 0E 1A 3A 01 88 CD F5 80 2A 09 00 00 03 00 83 D1 DD E2 12 01 00 00 00 E8 9F 90 F5 D1 ED 0D 00 03 00 07 00 26 83 26 83 26 83 07 00 FA FF F8 FF 9D FE B8 03 79 00 BF ED 2B 38 94 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 92 59 83 2A 09 00 00 03 00 83 6E 7A E3 12 01 00 00 00 EE 9F 9A F5 D4 ED 01 00 04 00 FA FF 26 83 26 83 26 83 09 00 FA FF F4 FF A0 FE B8 03 7A 00 A6 7A 57 38 9C 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1D 10 03 3A 3E 08 0E 1A 3A 01 00 5C BD 85 2A 09 00 00 03 00 83 0C 17 E4 12 01 00 00 00 F2 9F 98 F5 C3 ED 00 00 08 00 F2 FF 26 83 26 83 26 83 04 00 06 00 F2 FF A2 FE B8 03 7A 00 29 B1 59 38 A4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1D 10 03 3A 3E 08 0E 1A 3A 01 30 25 21 88 2A 09 00 00 03 00 83 AA B3 E4 12 01 00 00 00 FC 9F 94 F5 BB ED 05 00 FB FF F7 FF 26 83 26 83 26 83 0C 00 04 00 F9 FF A3 FE B9 03 7B 00 57 BD 57 38 AC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1D 10 03 3A 3E 08 0E 1A 3A 01 60 EE 84 8A 2A 09 00 00 03 00 83 48 50 E5 12 01 00 00 00 02 A0 8C F5 C4 ED 08 00 F5 FF 0A 00 26 83 26 83 26 83 05 00 08 00 F5 FF A5 FE BA 03 7B 00 83 EA 00 38 B4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1D 10 03 3A 3E 08 0E 1A 3A 01 90 B7 E8 8C 2A 09 00 00 03 00 83 E6 EC E5 12 01 00 00 00 05 A0 8D F5 D4 ED 01 00 F8 FF 01 00 26 83 26 83 26 83 03 00 FF FF F5 FF A7 FE BA 03 7C 00 1A C4 08 38 BC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 4C 8F 2A 09 00 00 03 00 83 83 89 E6 12 01 00 00 00 07 A0 8A F5 D5 ED F9 FF 08 00 F5 FF 26 83 26 83 26 83 00 00 FD FF F5 FF A8 FE BB 03 7C 00 55 51 0A 38 C4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1D 10 03 3A 3E 08 0E 1A 3A 01 08 46 B0 91 2A 09 00 00 03 00 43 21 26 E7 12 01 00 00 00 09 A0 8B F5 C2 ED FB FF 06 00 F1 FF 26 83 26 83 26 83 06 00 00 00 FF FF AA FE BB 03 7D 00 CB CF 9E 37 CC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1D 10 03 3A 3E 08 0E 1A 3A 01 38 0F 14 94 2A 09 00 00 03 00 43 BF C2 E7 12 01 00 00 00 11 A0 75 F5 B3 ED 16 00 F5 FF E0 FF 26 83 26 83 26 83 02 00 08 00 FF FF AB FE BB 03 7E 00 A6 9C 78 37 D4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1D 10 03 3A 3E 08 0E 1A 3A 01 68 D8 77 96 2A 09 00 00 03 00 83 5D 5F E8 12 01 00 00 00 41 A0 37 F5 9A ED 58 00 E8 FF C8 FF 26 83 26 83 26 83 0D 00 15 00 06 00 AC FE BD 03 7F 00 13 BA 1A 38 DC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 9D DB 98 2A 09 00 00 03 00 83 FA FB E8 12 01 00 00 00 96 A0 F1 F4 9B ED 54 00 12 00 DF FF 26 83 26 83 26 83 F6 FF 01 00 E9 FF AC FE BE 03 7E 00 78 26 8F 38 E4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 66 3F 9B 2A 09 00 00 03 00 83 98 98 E9 12 01 00 00 00 C6 A0 01 F5 64 ED 0A 00 44 00 F2 FF 27 83 27 83 27 83 FC FF F4 FF F1 FF AC FE BD 03 7D 00 14 65 9A 38 EC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1D 10 03 3A 3E 08 0E 1A 3A 01 10 30 A3 9D 2A 09 00 00 03 00 83 36 35 EA 12 01 00 00 00 C5 A0 2F F5 13 ED E0 FF 35 00 F4 FF 27 83 27 83 27 83 0B 00 FB FF FE FF AD FE BD 03 7C 00 67 C3 E9 38 F4 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1D 10 03 3A 3E 08 0E 1A 3A 01 40 F9 06 A0 2A 09 00 00 03 00 83 D4 D1 EA 12 01 00 00 00 BE A0 44 F5 F0 EC F9 FF 00 00 05 00 27 83 27 83 27 83 0D 00 06 00 02 00 AE FE BD 03 7C 00 ED 89 EB 38 FC 74 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1D 10 03 3A 3E 08 0E 1A 3A 01 88 BE 6A A2 2A 09 00 00 03 00 83 71 6E EB 12 01 00 00 00 C1 A0 3E F5 0D ED 10 00 DE FF 06 00 27 83 27 83 27 83 07 00 FF FF FD FF AF FE BD 03 7C 00 92 04 EC 38 04 75 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 87 CE A4 2A 09 00 00 03 00 83 0F 0B EC 12 01 00 00 00 C6 A0 1D F5 31 ED 07 00 E5 FF EB FF 27 83 27 83 27 83 FC FF F8 FF F0 FF AF FE BD 03 7C 00 61 0B E3 38 0C 75 00 00
|
||||
123
head-tracking/no/no.txt
Normal file
@@ -0,0 +1,123 @@
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1A 10 03 3A 3E 08 0E 1A 3A 01 B8 95 C7 C5 2C 07 00 00 03 00 40 EE FA 64 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 A3 FD 3D 03 20 04 A6 FD 36 03 23 00 73 3A BB 37 99 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1A 10 03 3A 3E 08 0E 1A 3A 01 60 4B 2B C8 2C 07 00 00 03 00 42 87 97 65 90 00 00 00 00 00 00 00 00 00 00 00 00 01 00 09 00 18 00 18 00 18 00 A7 FD 3A 03 22 04 A6 FD 36 03 23 00 58 50 AC 37 A1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1A 10 03 3A 3E 08 0E 1A 3A 01 20 FD 8E CA 2C 07 00 00 03 00 42 1F 34 66 90 00 00 00 00 00 00 00 00 00 00 FE FF 01 00 09 00 18 00 18 00 18 00 A7 FD 3C 03 25 04 A6 FD 37 03 23 00 3C 70 7A 37 A9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 B2 F2 CC 2C 07 00 00 03 00 43 B8 D0 66 90 00 00 00 00 1D A8 9D E4 66 E3 FF FF 04 00 07 00 18 00 18 00 18 00 00 00 00 00 00 00 A6 FD 37 03 23 00 57 9B 51 37 B1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1A 10 03 3A 3E 08 0E 1A 3A 01 70 68 56 CF 2C 07 00 00 03 00 43 51 6D 67 90 00 00 00 00 1C A8 A3 E4 69 E3 00 00 FF FF 01 00 18 00 18 00 18 00 03 00 FF FF 00 00 A6 FD 37 03 23 00 68 8E D6 36 B9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1A 10 03 3A 3E 08 0E 1A 3A 01 18 1E BA D1 2C 07 00 00 03 00 43 EA 09 68 90 00 00 00 00 1E A8 A0 E4 6F E3 05 00 F8 FF 00 00 18 00 18 00 18 00 05 00 FF FF FF FF A6 FD 37 03 23 00 BB 1C E4 36 C1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1A 10 03 3A 3E 08 0E 1A 3A 01 C0 D3 1D D4 2C 07 00 00 03 00 43 83 A6 68 90 00 00 00 00 1A A8 AA E4 89 E3 FF FF F6 FF 02 00 18 00 18 00 18 00 00 00 FE FF FE FF A6 FD 37 03 23 00 2D 37 EB 36 C9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1A 10 03 3A 3E 08 0E 1A 3A 01 80 85 81 D6 2C 07 00 00 03 00 43 1B 43 69 90 00 00 00 00 15 A8 AA E4 98 E3 FC FF F3 FF 04 00 18 00 18 00 18 00 00 00 FF FF 00 00 A7 FD 38 03 23 00 5B 7B E1 36 D1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1A 10 03 3A 3E 08 0E 1A 3A 01 28 3B E5 D8 2C 07 00 00 03 00 43 B4 DF 69 90 00 00 00 00 15 A8 A2 E4 A4 E3 02 00 F1 FF 0E 00 18 00 18 00 18 00 FE FF 02 00 00 00 A7 FD 38 03 23 00 D4 7D FB 36 D9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 F0 48 DB 2C 07 00 00 03 00 43 4D 7C 6A 90 00 00 00 00 14 A8 9C E4 B7 E3 FF FF EC FF 0A 00 18 00 18 00 18 00 01 00 00 00 02 00 A7 FD 38 03 23 00 49 81 05 37 E1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1A 10 03 3A 3E 08 0E 1A 3A 01 78 A6 AC DD 2C 07 00 00 03 00 43 E6 18 6B 90 00 00 00 00 11 A8 93 E4 D4 E3 07 00 E5 FF 0B 00 18 00 18 00 18 00 04 00 FE FF 04 00 A7 FD 38 03 23 00 02 C7 11 37 E9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1A 10 03 3A 3E 08 0E 1A 3A 01 20 5C 10 E0 2C 07 00 00 03 00 43 7F B5 6B 90 00 00 00 00 0D A8 7D E4 01 E4 14 00 D7 FF 15 00 19 00 19 00 19 00 01 00 09 00 00 00 A7 FD 39 03 23 00 89 6A 2D 37 F1 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 11 74 E2 2C 07 00 00 03 00 83 18 52 6C 90 00 00 00 00 16 A8 72 E4 46 E4 39 00 E4 FF 34 00 19 00 19 00 19 00 FC FF 15 00 02 00 A7 FD 3B 03 23 00 FC 50 79 38 F9 69 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1A 10 03 3A 3E 08 0E 1A 3A 01 88 C3 D7 E4 2C 07 00 00 03 00 83 B0 EE 6C 90 00 00 00 00 37 A8 6B E4 BC E4 5E 00 BB FF 44 00 19 00 19 00 19 00 0A 00 06 00 0D 00 A8 FD 3C 03 24 00 09 E4 93 38 01 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1A 10 03 3A 3E 08 0E 1A 3A 01 30 79 3B E7 2C 07 00 00 03 00 83 49 8B 6D 90 00 00 00 00 64 A8 39 E4 5E E5 75 00 94 FF 41 00 19 00 19 00 19 00 0C 00 06 00 0B 00 AA FD 3D 03 24 00 8A E8 96 38 09 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1A 10 03 3A 3E 08 0E 1A 3A 01 D8 2E 9F E9 2C 07 00 00 03 00 83 E2 27 6E 90 00 00 00 00 99 A8 DB E3 37 E6 AA 00 6A FF 41 00 19 00 19 00 19 00 0D 00 0F 00 10 00 AC FD 3E 03 25 00 18 A5 98 38 11 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1A 10 03 3A 3E 08 0E 1A 3A 01 80 E4 02 EC 2C 07 00 00 03 00 83 7B C4 6E 90 00 00 00 00 FA A8 37 E3 60 E7 0B 01 02 FF 4E 00 19 00 19 00 19 00 20 00 28 00 28 00 AE FD 41 03 26 00 F8 CE C6 38 19 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1A 10 03 3A 3E 08 0E 1A 3A 01 28 9A 66 EE 2C 07 00 00 03 00 83 14 61 6F 90 00 00 00 00 A3 A9 38 E2 2D E9 9C 01 9E FE 72 00 19 00 19 00 19 00 20 00 31 00 38 00 B1 FD 45 03 28 00 4A 24 52 39 21 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 4F CA F0 2C 07 00 00 03 00 83 AD FD 6F 90 00 00 00 00 BA AA C0 E0 C0 EB 3D 02 05 FE A6 00 19 00 19 00 19 00 0F 00 2C 00 2F 00 B5 FD 49 03 2A 00 27 4D 92 39 29 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1A 10 03 3A 3E 08 0E 1A 3A 01 78 05 2E F3 2C 07 00 00 03 00 83 46 9A 70 90 00 00 00 00 32 AC 27 DF DF EE 5B 02 05 FE CB 00 19 00 19 00 19 00 EC FF F6 FF 0C 00 B6 FD 4A 03 29 00 EC 15 9C 39 31 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1A 10 03 3A 3E 08 0E 1A 3A 01 38 B7 91 F5 2C 07 00 00 03 00 83 DE 36 71 90 00 00 00 00 A3 AD C2 DD ED F1 07 02 3D FE C6 00 19 00 19 00 19 00 D6 FF C8 FF F2 FF B7 FD 4A 03 24 00 A7 8C AD 39 39 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1A 10 03 3A 3E 08 0E 1A 3A 01 E0 6C F5 F7 2C 07 00 00 03 00 83 77 D3 71 90 00 00 00 00 C1 AE B4 DC 6B F4 55 01 C2 FE 9F 00 19 00 19 00 19 00 BE FF AF FF CA FF B7 FD 47 03 1E 00 00 2E ED 39 41 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1A 10 03 3A 3E 08 0E 1A 3A 01 88 22 59 FA 2C 07 00 00 03 00 83 10 70 72 90 00 00 00 00 4E AF 3F DC E9 F5 76 00 86 FF 65 00 19 00 19 00 19 00 C1 FF A5 FF C7 FF B7 FD 44 03 15 00 C4 E2 1E 3A 49 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 80 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D8 BC FC 2C 07 00 00 03 00 83 A9 0C 73 90 00 00 00 00 3C AF 44 DC 5E F6 B1 FF 0A 00 30 00 1A 00 1A 00 1A 00 CE FF BA FF D4 FF B9 FD 43 03 0E 00 28 3A 3A 3A 51 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 81 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 8D 20 FF 2C 07 00 00 03 00 83 42 A9 73 90 00 00 00 00 B3 AE B7 DC 00 F6 35 FF 99 00 0A 00 1A 00 1A 00 1A 00 D0 FF D3 FF DA FF BA FD 43 03 08 00 36 11 28 3A 59 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 82 1B 10 03 3A 3E 08 0E 1A 3A 01 80 43 84 01 2D 07 00 00 03 00 83 DB 45 74 90 00 00 00 00 03 AE 76 DD E0 F4 DF FE FC 00 EA FF 1A 00 1A 00 1A 00 DA FF D9 FF E9 FF BC FD 43 03 03 00 7B 0A 19 3A 61 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 83 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F9 E7 03 2D 07 00 00 03 00 83 74 E2 74 90 00 00 00 00 37 AD 75 DE 27 F3 90 FE 51 01 D0 FF 1A 00 1A 00 1A 00 E6 FF E2 FF F9 FF BF FD 44 03 00 00 EC 66 1B 3A 69 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 84 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 AA 4B 06 2D 07 00 00 03 00 83 0C 7F 75 90 00 00 00 00 31 AC BB DF 1A F1 4C FE 7C 01 BF FF 1A 00 1A 00 1A 00 F2 FF E5 FF 02 00 C1 FD 45 03 00 00 82 87 06 3A 71 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 85 1B 10 03 3A 3E 08 0E 1A 3A 01 90 60 AF 08 2D 07 00 00 03 00 83 A5 1B 76 90 00 00 00 00 F9 AA 2A E1 DE EE F5 FD D3 01 A5 FF 1A 00 1A 00 1A 00 D8 FF D2 FF EC FF C2 FD 46 03 FF FF E0 E9 D4 39 79 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 86 1B 10 03 3A 3E 08 0E 1A 3A 01 38 16 13 0B 2D 07 00 00 03 00 43 3E B8 76 90 00 00 00 00 76 A9 18 E3 1E EC 87 FD 21 02 B9 FF 1A 00 1A 00 1A 00 E2 FF D5 FF FE FF C3 FD 46 03 FF FF 6C B9 6C 39 81 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 87 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 CB 76 0D 2D 07 00 00 03 00 43 D7 54 77 90 00 00 00 00 A0 A7 7E E5 09 E9 DE FC DE 02 BF FF 1A 00 1A 00 1A 00 AD FF C2 FF D8 FF C1 FD 44 03 FF FF CD DA 54 39 89 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 88 1B 10 03 3A 3E 08 0E 1A 3A 01 88 81 DA 0F 2D 07 00 00 03 00 43 70 F1 77 90 00 00 00 00 9D A5 C9 E8 1E E5 6A FC 51 03 BE FF 1A 00 1A 00 1A 00 DB FF CB FF 17 00 C0 FD 42 03 02 00 5A E4 79 39 91 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 89 1B 10 03 3A 3E 08 0E 1A 3A 01 30 37 3E 12 2D 07 00 00 03 00 83 09 8E 78 90 00 00 00 00 9A A3 60 EC 0E E1 52 FC 63 03 D3 FF 1A 00 1A 00 1A 00 EB FF FB FF 2F 00 C0 FD 42 03 09 00 07 D8 7E 39 99 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 EC A1 14 2D 07 00 00 03 00 83 A2 2A 79 90 00 00 00 00 ED A1 11 F0 44 DD 9E FC 44 03 F3 FF 1A 00 1A 00 1A 00 F6 FF F8 FF 39 00 C1 FD 43 03 12 00 E1 14 84 39 A1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1B 10 03 3A 3E 08 0E 1A 3A 01 98 9E 05 17 2D 07 00 00 03 00 83 3A C7 79 90 00 00 00 00 90 A0 B6 F3 B6 D9 C8 FC 0C 03 02 00 1A 00 1A 00 1A 00 0D 00 FC FF 4B 00 C1 FD 43 03 1D 00 8A 01 66 39 A9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1B 10 03 3A 3E 08 0E 1A 3A 01 40 54 69 19 2D 07 00 00 03 00 83 D3 63 7A 90 00 00 00 00 71 9F 22 F7 98 D6 14 FD F1 02 10 00 1B 00 1B 00 1B 00 F5 FF 05 00 28 00 C1 FD 43 03 27 00 2E A6 59 39 B1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 09 CD 1B 2D 07 00 00 03 00 83 6C 00 7B 90 00 00 00 00 AF 9E 7F FA 86 D3 45 FD D1 02 00 00 1B 00 1B 00 1B 00 21 00 12 00 52 00 C1 FD 43 03 32 00 2F 73 32 39 B9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1B 10 03 3A 3E 08 0E 1A 3A 01 90 BF 30 1E 2D 07 00 00 03 00 83 05 9D 7B 90 00 00 00 00 18 9E 59 FD 18 D1 E0 FD 0D 02 16 00 1B 00 1B 00 1B 00 35 00 3D 00 4F 00 C3 FD 45 03 3F 00 7D 5F 85 39 C1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1B 10 03 3A 3E 08 0E 1A 3A 01 38 75 94 20 2D 07 00 00 03 00 83 9E 39 7C 90 00 00 00 00 D1 9D 7A FF 5D CF C4 FE 7E 01 1C 00 1B 00 1B 00 1B 00 44 00 5A 00 4D 00 C5 FD 48 03 4B 00 54 52 17 3A C9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 90 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 2A F8 22 2D 07 00 00 03 00 83 37 D6 7C 90 00 00 00 00 D2 9D B6 00 6B CE AC FF A7 00 3B 00 1B 00 1B 00 1B 00 4C 00 69 00 4B 00 C8 FD 4C 03 56 00 B7 1F 85 3A D1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 91 1B 10 03 3A 3E 08 0E 1A 3A 01 88 E0 5B 25 2D 07 00 00 03 00 83 D0 72 7D 90 00 00 00 00 00 9E 17 01 69 CE 87 00 BC FF 62 00 1B 00 1B 00 1B 00 5A 00 65 00 4F 00 CB FD 50 03 60 00 EE 97 BD 3A D9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 92 1B 10 03 3A 3E 08 0E 1A 3A 01 30 96 BF 27 2D 07 00 00 03 00 83 69 0F 7E 90 00 00 00 00 46 9E 9C 00 6E CF 56 01 DB FE 89 00 1B 00 1B 00 1B 00 48 00 54 00 40 00 CF FD 54 03 69 00 1C 76 EA 3A E1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 93 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 47 23 2A 2D 07 00 00 03 00 83 01 AC 7E 90 00 00 00 00 BF 9E 69 FF 3A D1 0E 02 4B FE A6 00 1B 00 1B 00 1B 00 36 00 45 00 3A 00 D1 FD 57 03 70 00 2A E1 05 3B E9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 94 1B 10 03 3A 3E 08 0E 1A 3A 01 98 FD 86 2C 2D 07 00 00 03 00 83 9A 48 7F 90 00 00 00 00 74 9F 8A FD BC D3 A5 02 83 FD AC 00 1B 00 1B 00 1B 00 3B 00 2A 00 5B 00 D4 FD 59 03 77 00 20 AB 08 3B F1 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 95 1B 10 03 3A 3E 08 0E 1A 3A 01 40 B3 EA 2E 2D 07 00 00 03 00 83 33 E5 7F 90 00 00 00 00 54 A0 D0 FA 1E D7 33 03 BE FC A7 00 1B 00 1B 00 1B 00 2E 00 1D 00 58 00 D8 FD 5B 03 7D 00 03 A8 EE 3A F9 6A 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 96 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 68 4E 31 2D 07 00 00 03 00 83 CC 81 80 90 00 00 00 00 8B A1 54 F7 3E DB B5 03 25 FC 91 00 1B 00 1B 00 1B 00 17 00 0B 00 4E 00 DC FD 5D 03 81 00 A3 89 B7 3A 01 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 97 1B 10 03 3A 3E 08 0E 1A 3A 01 90 1E B2 33 2D 07 00 00 03 00 83 65 1E 81 90 00 00 00 00 34 A3 4F F3 DD DF 0C 04 D6 FB 8F 00 1B 00 1B 00 1B 00 07 00 04 00 4E 00 DF FD 5F 03 83 00 ED E5 78 3A 09 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 98 1B 10 03 3A 3E 08 0E 1A 3A 01 38 D4 15 36 2D 07 00 00 03 00 83 FE BA 81 90 00 00 00 00 45 A5 08 EF FA E4 39 04 76 FB A8 00 1C 00 1C 00 1C 00 FC FF F2 FF 58 00 E3 FD 61 03 84 00 99 24 16 3A 11 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 99 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 89 79 38 2D 07 00 00 03 00 83 97 57 82 90 00 00 00 00 AD A7 AA EA 7D EA 38 04 5E FB B4 00 1C 00 1C 00 1C 00 E9 FF E5 FF 5B 00 E5 FD 62 03 82 00 8E A3 92 39 19 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1B 10 03 3A 3E 08 0E 1A 3A 01 88 3F DD 3A 2D 07 00 00 03 00 83 30 F4 82 90 00 00 00 00 61 AA 63 E6 22 F0 24 04 78 FB BC 00 1C 00 1C 00 1C 00 D3 FF DE FF 3F 00 E8 FD 63 03 7E 00 5C 8E 08 39 21 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1B 10 03 3A 3E 08 0E 1A 3A 01 30 F5 40 3D 2D 07 00 00 03 00 83 C9 90 83 90 00 00 00 00 48 AD 74 E2 86 F5 C9 03 D7 FB 8B 00 1C 00 1C 00 1C 00 C9 FF BC FF 2E 00 EA FD 62 03 76 00 B2 12 47 39 29 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 A6 A4 3F 2D 07 00 00 03 00 83 61 2D 84 90 00 00 00 00 2A B0 DA DE 43 FA 4E 03 4F FC 4E 00 1C 00 1C 00 1C 00 C1 FF B1 FF 1C 00 EB FD 61 03 6C 00 D1 B2 BA 39 31 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1B 10 03 3A 3E 08 0E 1A 3A 01 98 5C 08 42 2D 07 00 00 03 00 83 FA C9 84 90 00 00 00 00 D8 B2 B0 DB 26 FE CD 02 FC FC 22 00 1C 00 1C 00 1C 00 B7 FF CB FF FF FF EC FD 60 03 60 00 95 BB E8 39 39 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1B 10 03 3A 3E 08 0E 1A 3A 01 40 12 6C 44 2D 07 00 00 03 00 83 93 66 85 90 00 00 00 00 45 B5 2F D9 45 01 4D 02 AD FD 17 00 1C 00 1C 00 1C 00 B4 FF CE FF E9 FF EC FD 5F 03 51 00 CA AA EB 39 41 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 C7 CF 46 2D 07 00 00 03 00 83 2C 03 86 90 00 00 00 00 40 B7 93 D7 A2 03 D6 01 A1 FE 38 00 1C 00 1C 00 1C 00 AC FF D3 FF E0 FF EB FD 5F 03 41 00 73 6A F0 39 49 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1B 10 03 3A 3E 08 0E 1A 3A 01 90 7D 33 49 2D 07 00 00 03 00 83 C5 9F 86 90 00 00 00 00 BE B8 F5 D6 45 05 43 01 70 FF 51 00 1C 00 1C 00 1C 00 BF FF B8 FF EA FF EB FD 5E 03 31 00 A6 3A FD 39 51 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1B 10 03 3A 3E 08 0E 1A 3A 01 38 33 97 4B 2D 07 00 00 03 00 83 5E 3C 87 90 00 00 00 00 6D B9 ED D6 06 06 48 00 1B 00 2C 00 1C 00 1C 00 1C 00 C8 FF AA FF DA FF ED FD 5B 03 21 00 E0 A0 28 3A 59 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 E8 FA 4D 2D 07 00 00 03 00 83 F7 D8 87 90 00 00 00 00 1C B9 69 D7 B1 05 32 FF C2 00 05 00 1C 00 1C 00 1C 00 D6 FF AA FF CA FF EF FD 58 03 10 00 39 FF 40 3A 61 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1B 10 03 3A 3E 08 0E 1A 3A 01 88 9E 5E 50 2D 07 00 00 03 00 83 90 75 88 90 00 00 00 00 CD B7 61 D8 59 04 54 FE 6B 01 ED FF 1C 00 1C 00 1C 00 C4 FF C4 FF C3 FF F1 FD 57 03 01 00 9C 7B 32 3A 69 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1B 10 03 3A 3E 08 0E 1A 3A 01 30 54 C2 52 2D 07 00 00 03 00 83 29 12 89 90 00 00 00 00 C0 B5 00 DA 14 02 6C FD 31 02 BE FF 1D 00 1D 00 1D 00 C5 FF 9C FF C6 FF F2 FD 55 03 F4 FF 8C 81 52 3A 71 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 05 26 55 2D 07 00 00 03 00 83 C1 AE 89 90 00 00 00 00 D9 B2 0D DC 8F FE 4A FC CF 02 60 FF 1D 00 1D 00 1D 00 CB FF 98 FF D7 FF F4 FD 52 03 EA FF AE DB B9 3A 79 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1B 10 03 3A 3E 08 0E 1A 3A 01 98 BB 89 57 2D 07 00 00 03 00 83 5A 4B 8A 90 00 00 00 00 43 AF BA DE F9 F9 6A FB A9 03 56 FF 1D 00 1D 00 1D 00 B2 FF 9F FF F9 FF F4 FD 50 03 E4 FF E9 C0 DE 3A 81 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1B 10 03 3A 3E 08 0E 1A 3A 01 40 71 ED 59 2D 07 00 00 03 00 83 F3 E7 8A 90 00 00 00 00 49 AB 0A E2 8C F4 D7 FA C8 03 28 FF 1D 00 1D 00 1D 00 E1 FF B8 FF 41 00 F6 FD 4F 03 E6 FF 44 A3 04 3B 89 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 26 51 5C 2D 07 00 00 03 00 83 8C 84 8B 90 00 00 00 00 79 A7 8A E5 0B EF D8 FA 17 04 4C FF 1D 00 1D 00 1D 00 BA FF D9 FF 35 00 F5 FD 50 03 ED FF DC AF EB 3A 91 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1B 10 03 3A 3E 08 0E 1A 3A 01 90 DC B4 5E 2D 07 00 00 03 00 83 25 21 8C 90 00 00 00 00 16 A4 A5 E9 60 E9 EF FA 42 04 73 FF 1D 00 1D 00 1D 00 DB FF E7 FF 67 00 F4 FD 51 03 F7 FF E8 66 D6 3A 99 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1B 10 03 3A 3E 08 0E 1A 3A 01 38 92 18 61 2D 07 00 00 03 00 83 BE BD 8C 90 00 00 00 00 48 A1 C9 ED 1E E4 67 FB FC 03 94 FF 1D 00 1D 00 1D 00 FB FF 0A 00 72 00 F4 FD 53 03 05 00 72 5D DD 3A A1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 47 7C 63 2D 07 00 00 03 00 83 57 5A 8D 90 00 00 00 00 3A 9F A3 F1 99 DF 3F FC A5 03 CF FF 1D 00 1D 00 1D 00 FB FF 37 00 54 00 F4 FD 56 03 14 00 0A 6C CB 3A A9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1B 10 03 3A 3E 08 0E 1A 3A 01 88 FD DF 65 2D 07 00 00 03 00 83 F0 F6 8D 90 00 00 00 00 FB 9D 55 F5 CC DB 2B FD 32 03 1F 00 1D 00 1D 00 1D 00 12 00 22 00 51 00 F4 FD 59 03 24 00 C4 5B E7 3A B1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1B 10 03 3A 3E 08 0E 1A 3A 01 30 B3 43 68 2D 07 00 00 03 00 83 89 93 8E 90 00 00 00 00 1D 9D A6 F8 86 D8 27 FD 07 03 EC FF 1D 00 1D 00 1D 00 09 00 F3 FF 41 00 F3 FD 58 03 32 00 AE D5 A4 3A B9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 68 A7 6A 2D 07 00 00 03 00 83 22 30 8F 90 00 00 00 00 50 9C B2 FB 54 D5 F6 FC DD 02 AF FF 1D 00 1D 00 1D 00 10 00 E3 FF 27 00 F2 FD 55 03 3F 00 6B D7 9A 3A C1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1B 10 03 3A 3E 08 0E 1A 3A 01 98 1A 0B 6D 2D 07 00 00 03 00 83 BA CC 8F 90 00 00 00 00 8A 9B AF FE 2D D2 F1 FC D2 02 C0 FF 1D 00 1D 00 1D 00 0F 00 0D 00 3C 00 F0 FD 52 03 4C 00 E6 A0 9C 3A C9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1B 10 03 3A 3E 08 0E 1A 3A 01 40 D0 6E 6F 2D 07 00 00 03 00 83 53 69 90 90 00 00 00 00 ED 9A 6F 01 6B CF 5F FD 49 02 C3 FF 1E 00 1E 00 1E 00 31 00 42 00 5C 00 EE FD 51 03 5C 00 D0 3E B1 3A D1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 85 D2 71 2D 07 00 00 03 00 03 EC 05 91 90 00 00 00 00 8F 9A 5E 03 8F CD B2 FE 1E 01 F2 FF 1E 00 1E 00 1E 00 60 00 96 00 7B 00 EE FD 54 03 6D 00 1D 67 11 3B D9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1B 10 03 3A 3E 08 0E 1A 3A 01 90 3B 36 74 2D 07 00 00 03 00 03 85 A2 91 90 00 00 00 00 96 9A 10 04 01 CD 53 00 27 00 3D 00 1E 00 1E 00 1E 00 5C 00 AE 00 66 00 EE FD 5A 03 7D 00 10 F7 6C 3B E1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1B 10 03 3A 3E 08 0E 1A 3A 01 38 F1 99 76 2D 07 00 00 03 00 83 1E 3F 92 90 00 00 00 00 0F 9B C4 03 A3 CD CD 01 0B FF B4 00 1E 00 1E 00 1E 00 5F 00 91 00 6F 00 EF FD 5F 03 8C 00 ED A9 B2 3B E9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 A6 FD 78 2D 07 00 00 03 00 83 B7 DB 92 90 00 00 00 00 CF 9B 7E 02 8B CF E7 02 04 FE E9 00 1E 00 1E 00 1E 00 54 00 74 00 7D 00 F1 FD 62 03 99 00 E2 F3 D4 3B F1 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1B 10 03 3A 3E 08 0E 1A 3A 01 88 5C 61 7B 2D 07 00 00 03 00 83 50 78 93 90 00 00 00 00 E2 9C 24 00 C4 D2 0F 04 C0 FC 0F 01 1E 00 1E 00 1E 00 4D 00 56 00 A0 00 F3 FD 66 03 A6 00 84 96 F5 3B F9 6B 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1B 10 03 3A 3E 08 0E 1A 3A 01 30 12 C5 7D 2D 07 00 00 03 00 83 E9 14 94 90 00 00 00 00 6D 9E 8B FC 6F D7 33 05 8D FB 40 01 1E 00 1E 00 1E 00 27 00 4E 00 A7 00 F6 FD 69 03 B1 00 F1 09 09 3C 01 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 C7 28 80 2D 07 00 00 03 00 83 82 B1 94 90 00 00 00 00 D5 A0 2E F8 5D DD 0A 06 1E FB 7D 01 1E 00 1E 00 1E 00 E5 FF 10 00 97 00 F7 FD 6C 03 B8 00 D8 F3 06 3C 09 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1B 10 03 3A 3E 08 0E 1A 3A 01 80 7D 8C 82 2D 07 00 00 03 00 83 1B 4E 95 90 00 00 00 00 27 A4 8E F3 F7 E3 52 06 DE FA 92 01 1E 00 1E 00 1E 00 C8 FF D3 FF 8D 00 F8 FD 6D 03 BA 00 7A 37 D1 3B 11 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1B 10 03 3A 3E 08 0E 1A 3A 01 28 33 F0 84 2D 07 00 00 03 00 83 B4 EA 95 90 00 00 00 00 0E A8 EB EE CE EA 25 06 D9 FA 4F 01 1E 00 1E 00 1E 00 B9 FF 9B FF 8C 00 F9 FD 6B 03 B8 00 9E DD 92 3B 19 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 E4 53 87 2D 07 00 00 03 00 83 4C 87 96 90 00 00 00 00 B3 AC AA E9 41 F1 90 06 BD FA 45 00 1E 00 1E 00 1E 00 E9 FF BE FF B8 00 FD FD 69 03 B2 00 F0 BB 7E 3B 21 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1B 10 03 3A 3E 08 0E 1A 3A 01 90 9A B7 89 2D 07 00 00 03 00 83 E5 23 97 90 00 00 00 00 AA B2 90 E3 E0 F7 62 07 EA F9 AD 00 1E 00 1E 00 1E 00 CD FF 08 00 E0 00 02 FE 6B 03 AC 00 2C CF 3E 3B 29 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1B 10 03 3A 3E 08 0E 1A 3A 01 38 50 1B 8C 2D 07 00 00 03 00 83 7E C0 97 90 00 00 00 00 41 B9 26 DE 9C FF A7 06 C8 FA 4E 01 1F 00 1F 00 1F 00 42 FF 57 FF 0E 00 FE FD 67 03 9A 00 7A 9B 0A 3B 31 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 05 7F 8E 2D 07 00 00 03 00 83 17 5D 98 90 00 00 00 00 85 BE B7 DA 7E 05 D1 03 E1 FC A1 00 1F 00 1F 00 1F 00 36 FF B5 FE 86 FF F7 FD 56 03 7B 00 71 E8 05 3B 39 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1B 10 03 3A 3E 08 0E 1A 3A 01 88 BB E2 90 2D 07 00 00 03 00 83 B0 F9 98 90 00 00 00 00 B3 C0 EE D8 B0 07 7C 00 2B FF D7 FF 1F 00 1F 00 1F 00 6C FF 0D FF 64 FF F1 FD 44 03 56 00 08 5A 1D 3B 41 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1B 10 03 3A 3E 08 0E 1A 3A 01 30 71 46 93 2D 07 00 00 03 00 83 49 96 99 90 00 00 00 00 6D C0 B4 D8 71 07 1B FF 77 00 E0 FF 1F 00 1F 00 1F 00 B0 FF C1 FF BB FF EF FD 3E 03 36 00 9E 1A 1A 3B 49 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 26 AA 95 2D 07 00 00 03 00 83 E2 32 9A 90 00 00 00 00 57 BF 4A D9 A3 06 E9 FE D8 00 12 00 1F 00 1F 00 1F 00 C9 FF E9 FF D6 FF F1 FD 3F 03 1D 00 C5 D9 F3 3A 51 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1B 10 03 3A 3E 08 0E 1A 3A 01 80 DC 0D 98 2D 07 00 00 03 00 83 7B CF 9A 90 00 00 00 00 E4 BD 52 DA 41 05 6A FE 4F 01 C6 FF 1F 00 1F 00 1F 00 EE FF DA FF EC FF F4 FD 3F 03 07 00 4C F1 DD 3A 59 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1B 10 03 3A 3E 08 0E 1A 3A 01 28 92 71 9A 2D 07 00 00 03 00 83 14 6C 9B 90 00 00 00 00 1C BC 71 DB 48 03 D6 FD 9D 01 9E FF 1F 00 1F 00 1F 00 D2 FF CB FF D3 FF F8 FD 3F 03 F4 FF A7 43 DA 3A 61 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 47 D5 9C 2D 07 00 00 03 00 83 AD 08 9C 90 00 00 00 00 96 B9 30 DD 90 00 DD FC 41 02 7E FF 1F 00 1F 00 1F 00 DB FF 96 FF E9 FF FA FD 3D 03 E2 FF 4A DC A8 3A 69 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1B 10 03 3A 3E 08 0E 1A 3A 01 78 FD 38 9F 2D 07 00 00 03 00 83 46 A5 9C 90 00 00 00 00 1A B6 65 DF FE FC E2 FB AD 02 77 FF 1F 00 1F 00 1F 00 E4 FF 9D FF 09 00 FD FD 3B 03 D6 FF 4A B3 9C 3A 71 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1B 10 03 3A 3E 08 0E 1A 3A 01 20 B3 9C A1 2D 07 00 00 03 00 83 DF 41 9D 90 00 00 00 00 F8 B1 F2 E1 D9 F8 12 FB 2E 03 69 FF 1F 00 1F 00 1F 00 AD FF 9F FF E6 FF FE FD 3A 03 CD FF E8 E4 E0 3A 79 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 64 00 A4 2D 07 00 00 03 00 83 77 DE 9D 90 00 00 00 00 91 AD 63 E5 C7 F3 95 FA F7 03 3A FF 1F 00 1F 00 1F 00 D1 FF AC FF 3A 00 FF FD 3A 03 CB FF E6 7B 03 3B 81 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1B 10 03 3A 3E 08 0E 1A 3A 01 88 1A 64 A6 2D 07 00 00 03 00 83 10 7B 9E 90 00 00 00 00 44 A9 04 E9 86 EE 79 FA 9C 03 55 FF 1F 00 1F 00 1F 00 F2 FF D8 FF 5A 00 02 FE 3D 03 D1 FF 16 8F 17 3B 89 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D0 C7 A8 2D 07 00 00 03 00 83 A9 17 9F 90 00 00 00 00 65 A5 9C EC AD E9 C2 FA A0 03 65 FF 20 00 20 00 20 00 D5 FF 00 00 3E 00 04 FE 41 03 DA FF 75 CC 14 3B 91 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 85 2B AB 2D 07 00 00 03 00 83 42 B4 9F 90 00 00 00 00 41 A2 6F F0 F2 E4 50 FB 9A 03 79 FF 20 00 20 00 20 00 14 00 0A 00 86 00 06 FE 46 03 E8 FF BA 24 16 3B 99 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1B 10 03 3A 3E 08 0E 1A 3A 01 80 3B 8F AD 2D 07 00 00 03 00 83 DB 50 A0 90 00 00 00 00 D5 9F 4E F3 09 E1 73 FC 57 02 6B FF 20 00 20 00 20 00 23 00 6E 00 68 00 0A FE 4D 03 FA FF 92 47 18 3B A1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F1 F2 AF 2D 07 00 00 03 00 83 74 ED A0 90 00 00 00 00 58 9E 96 F5 1B DE 7E FD 3C 02 AC FF 20 00 20 00 20 00 19 00 64 00 3C 00 0B FE 56 03 08 00 31 5D 44 3B A9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 A6 56 B2 2D 07 00 00 03 00 83 0D 8A A1 90 00 00 00 00 7A 9D 9C F7 C3 DB 0E FE C5 01 C0 FF 20 00 20 00 20 00 38 00 2D 00 5B 00 0D FE 5A 03 18 00 F1 03 50 3B B1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1B 10 03 3A 3E 08 0E 1A 3A 01 78 5C BA B4 2D 07 00 00 03 00 83 A6 26 A2 90 00 00 00 00 DB 9C C7 F8 2C DA 05 FF D6 00 CB FF 20 00 20 00 20 00 2F 00 6C 00 44 00 0F FE 5F 03 28 00 84 04 5E 3B B9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1B 10 03 3A 3E 08 0E 1A 3A 01 20 12 1E B7 2D 07 00 00 03 00 83 3F C3 A2 90 00 00 00 00 C7 9C 64 F9 3C D9 D7 FF A4 00 E3 FF 20 00 20 00 20 00 38 00 5E 00 3C 00 0F FE 64 03 36 00 84 A6 89 3B C1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 C7 81 B9 2D 07 00 00 03 00 83 D8 5F A3 90 00 00 00 00 01 9D 80 F9 FB D8 82 00 F6 FF 17 00 20 00 20 00 20 00 34 00 4D 00 33 00 10 FE 67 03 43 00 8E 7A 95 3B C9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1B 10 03 3A 3E 08 0E 1A 3A 01 70 7D E5 BB 2D 07 00 00 03 00 83 71 FC A3 90 00 00 00 00 7A 9D 3A F9 47 D9 EB 00 C6 FF 23 00 20 00 20 00 20 00 1C 00 1D 00 15 00 10 FE 69 03 4D 00 43 04 91 3B D1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1B 10 03 3A 3E 08 0E 1A 3A 01 18 33 49 BE 2D 07 00 00 03 00 83 0A 99 A4 90 00 00 00 00 FA 9D CA F8 CA D9 EB 00 AD FF 03 00 20 00 20 00 20 00 15 00 FD FF 12 00 0F FE 68 03 55 00 CD C5 3E 3B D9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 E8 AC C0 2D 07 00 00 03 00 83 A3 35 A5 90 00 00 00 00 69 9E 30 F8 61 DA F0 00 78 FF FE FF 20 00 20 00 20 00 18 00 05 00 13 00 0E FE 67 03 5B 00 FB 08 10 3B E1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1B 10 03 3A 3E 08 0E 1A 3A 01 68 9E 10 C3 2D 07 00 00 03 00 83 3C D2 A5 90 00 00 00 00 D2 9E 6A F7 1C DB 01 01 51 FF 01 00 20 00 20 00 20 00 1B 00 0E 00 18 00 0E FE 67 03 61 00 B4 52 EA 3A E9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1B 10 03 3A 3E 08 0E 1A 3A 01 10 54 74 C5 2D 07 00 00 03 00 83 D5 6E A6 90 00 00 00 00 48 9F 7E F6 17 DC 30 01 2D FF 10 00 21 00 21 00 21 00 0C 00 12 00 0F 00 0D FE 68 03 66 00 C4 29 5D 3A F1 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 05 D8 C7 2D 07 00 00 03 00 83 6D 0B A7 90 00 00 00 00 D7 9F 86 F5 2E DD 59 01 1D FF 1F 00 21 00 21 00 21 00 16 00 18 00 2D 00 0D FE 69 03 6B 00 DE CC AC 39 F9 6C 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1B 10 03 3A 3E 08 0E 1A 3A 01 78 BB 3B CA 2D 07 00 00 03 00 83 06 A8 A7 90 00 00 00 00 86 A0 2D F4 9C DE BF 01 84 FE 20 00 21 00 21 00 21 00 22 00 33 00 2E 00 0F FE 6B 03 70 00 DE 8A 2B 39 01 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1B 10 03 3A 3E 08 0E 1A 3A 01 20 71 9F CC 2D 07 00 00 03 00 83 9F 44 A8 90 00 00 00 00 85 A1 95 F2 71 E0 21 02 A3 FE 3E 00 21 00 21 00 21 00 FC FF 25 00 0B 00 0E FE 6E 03 72 00 2E 4E CB 39 09 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 26 03 CF 2D 07 00 00 03 00 83 38 E1 A8 90 00 00 00 00 D1 A2 0A F1 56 E2 43 02 AA FE 39 00 21 00 21 00 21 00 E5 FF F1 FF F9 FF 0D FE 6F 03 71 00 53 F0 E7 39 11 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1B 10 03 3A 3E 08 0E 1A 3A 01 70 DC 66 D1 2D 07 00 00 03 00 83 D1 7D A9 90 00 00 00 00 32 A4 96 EF D3 E3 EB 01 F3 FE 00 00 21 00 21 00 21 00 F3 FF CE FF 00 00 0C FE 6E 03 6E 00 3C 77 0A 3A 19 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1B 10 03 3A 3E 08 0E 1A 3A 01 18 92 CA D3 2D 07 00 00 03 00 83 6A 1A AA 90 00 00 00 00 4F A5 12 EE 12 E5 7A 01 C3 FE D5 FF 21 00 21 00 21 00 FB FF CD FF FA FF 0C FE 6C 03 6B 00 68 5A 61 3A 21 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 47 2E D6 2D 07 00 00 03 00 83 03 B7 AA 90 00 00 00 00 2B A6 AB EC 1F E6 0B 01 30 FF BF FF 21 00 21 00 21 00 E0 FF C2 FF DA FF 0B FE 6A 03 64 00 46 28 80 3A 29 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DC 1B 10 03 3A 3E 08 0E 1A 3A 01 68 FD 91 D8 2D 07 00 00 03 00 83 9C 53 AB 90 00 00 00 00 BC A6 91 EB A7 E6 9B 00 4D FF A7 FF 21 00 21 00 21 00 F4 FF D2 FF ED FF 0A FE 68 03 5E 00 D8 E4 94 3A 31 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DD 1B 10 03 3A 3E 08 0E 1A 3A 01 10 B3 F5 DA 2D 07 00 00 03 00 83 35 F0 AB 90 00 00 00 00 12 A7 8F EA F0 E6 49 00 76 FF 9D FF 21 00 21 00 21 00 ED FF D5 FF E9 FF 08 FE 66 03 58 00 9C 62 88 3A 39 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DE 1B 10 03 3A 3E 08 0E 1A 3A 01 B8 68 59 DD 2D 07 00 00 03 00 83 CE 8C AC 90 00 00 00 00 31 A7 C5 E9 06 E7 07 00 A2 FF AE FF 21 00 21 00 21 00 E7 FF E8 FF EB FF 06 FE 65 03 53 00 55 F1 7C 3A 41 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 DF 1B 10 03 3A 3E 08 0E 1A 3A 01 60 1E BD DF 2D 07 00 00 03 00 83 67 29 AD 90 00 00 00 00 2C A7 37 E9 01 E7 E3 FF B0 FF B9 FF 21 00 21 00 21 00 F6 FF EF FF FD FF 05 FE 64 03 4F 00 06 20 78 3A 49 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E0 1B 10 03 3A 3E 08 0E 1A 3A 01 08 D4 20 E2 2D 07 00 00 03 00 83 00 C6 AD 90 00 00 00 00 1A A7 B4 E8 FD E6 EB FF 9F FF BB FF 22 00 22 00 22 00 08 00 00 00 0B 00 04 FE 65 03 4C 00 88 25 24 3A 51 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E1 1B 10 03 3A 3E 08 0E 1A 3A 01 B0 89 84 E4 2D 07 00 00 03 00 83 99 62 AE 90 00 00 00 00 16 A7 16 E8 25 E7 16 00 92 FF C9 FF 22 00 22 00 22 00 F7 FF 0E 00 FE FF 02 FE 66 03 4A 00 91 6C F9 39 59 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1B 10 03 3A 3E 08 0E 1A 3A 01 58 3F E8 E6 2D 07 00 00 03 00 83 32 FF AE 90 00 00 00 00 2A A7 9F E7 56 E7 29 00 BE FF DE FF 22 00 22 00 22 00 F1 FF 02 00 FD FF 00 FE 66 03 47 00 B3 52 9F 39 61 6D 00 00
|
||||
04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1B 10 03 3A 3E 08 0E 1A 3A 01 00 F5 4B E9 2D 07 00 00 03 00 83 CB 9B AF 90 00 00 00 00 3F A7 50 E7 7C E7 17 00 D6 FF E7 FF 22 00 22 00 22 00 F0 FF F0 FF FF FF FD FD 66 03 45 00 03 8E 21 39 69 6D 00 00
|
||||
76
head-tracking/review.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
start_column = 0
|
||||
columns_per_view = 5
|
||||
paused = False
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
if not paused:
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
end_column = start_column + columns_per_view
|
||||
for i in range(start_column, min(end_column, len(data[0]))):
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=0.6, linewidth=1.2)
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
def on_key(event):
|
||||
global start_column, paused
|
||||
if event.key == ' ':
|
||||
start_column += columns_per_view
|
||||
if start_column >= len(data[0]):
|
||||
start_column = 0
|
||||
elif event.key == 'p':
|
||||
paused = not paused
|
||||
|
||||
fig = plt.figure()
|
||||
fig.tight_layout()
|
||||
fig.canvas.mpl_connect('key_press_event', on_key)
|
||||
ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
@@ -19,10 +19,8 @@ import threading
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B" # sys.argv[1]
|
||||
psm = 0x1001 # AAP
|
||||
|
||||
print(f"Trying to connect to {bt_addr} on PSM 0x{psm:04X}...")
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
@@ -31,12 +29,12 @@ def listen():
|
||||
global running
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
print(f"Response: {res.hex()}")
|
||||
if len(res.hex()) == 162:
|
||||
print(" ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2)))
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
print("Connected. Type something...")
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
104
head-tracking/tk.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import mplcursors
|
||||
import bluetooth
|
||||
import threading
|
||||
import time
|
||||
from matplotlib.animation import FuncAnimation
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
|
||||
bt_addr = "28:2D:7F:C2:05:5B"
|
||||
psm = 0x1001
|
||||
|
||||
sock.connect((bt_addr, psm))
|
||||
running = threading.Event()
|
||||
|
||||
data = []
|
||||
selected_columns = list(range(80))
|
||||
|
||||
def hex_to_base10(hex_string):
|
||||
hex_values = hex_string.split()
|
||||
base10_values = [int(hex_value, 16) for hex_value in hex_values]
|
||||
return base10_values
|
||||
|
||||
def listen():
|
||||
global running, data
|
||||
while not running.is_set():
|
||||
res = sock.recv(1024)
|
||||
if len(res.hex()) == 162:
|
||||
hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
|
||||
base10_values = hex_to_base10(hex_string)
|
||||
data.append(base10_values)
|
||||
|
||||
t = threading.Thread(target=listen)
|
||||
t.start()
|
||||
|
||||
try:
|
||||
byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
|
||||
sock.send(byts)
|
||||
byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
|
||||
sock.send(byts)
|
||||
except:
|
||||
...
|
||||
|
||||
def update(frame):
|
||||
plt.clf()
|
||||
plt.title('Bluetooth Data')
|
||||
for i in range(len(data[0])):
|
||||
if i in selected_columns:
|
||||
plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Value')
|
||||
mplcursors.cursor(hover=True, highlight=True)
|
||||
|
||||
def on_checkbox_change():
|
||||
global selected_columns
|
||||
selected_columns = [i for i, var in enumerate(checkbox_vars) if var.get()]
|
||||
|
||||
def create_checkbox_window():
|
||||
root = tk.Tk()
|
||||
root.title("Select Columns")
|
||||
frame = ttk.Frame(root)
|
||||
frame.pack(fill=tk.BOTH, expand=True)
|
||||
canvas = tk.Canvas(frame)
|
||||
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=canvas.yview)
|
||||
scrollable_frame = ttk.Frame(canvas)
|
||||
|
||||
scrollable_frame.bind(
|
||||
"<Configure>",
|
||||
lambda e: canvas.configure(
|
||||
scrollregion=canvas.bbox("all")
|
||||
)
|
||||
)
|
||||
|
||||
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
|
||||
canvas.configure(yscrollcommand=scrollbar.set)
|
||||
|
||||
global checkbox_vars
|
||||
checkbox_vars = []
|
||||
for i in range(80):
|
||||
var = tk.BooleanVar(value=True)
|
||||
checkbox = ttk.Checkbutton(scrollable_frame, text=f"Column {i}", variable=var, command=on_checkbox_change)
|
||||
checkbox.pack(anchor='w')
|
||||
checkbox_vars.append(var)
|
||||
|
||||
canvas.pack(side="left", fill=tk.BOTH, expand=True)
|
||||
scrollbar.pack(side="right", fill="y")
|
||||
|
||||
root.mainloop()
|
||||
|
||||
checkbox_thread = threading.Thread(target=create_checkbox_window)
|
||||
checkbox_thread.start()
|
||||
|
||||
fig = plt.figure()
|
||||
fig.tight_layout()
|
||||
ani = FuncAnimation(fig, update, interval=500, repeat=True, cache_frame_data=False)
|
||||
|
||||
plt.show()
|
||||
|
||||
running.set()
|
||||
sock.close()
|
||||
@@ -45,6 +45,7 @@ class Connection:
|
||||
|
||||
def send(self, data: bytes):
|
||||
try:
|
||||
logging.info(f"Sending data to {self.mac_address}: {data}")
|
||||
self.socket.send(data)
|
||||
except bluetooth.btcommon.BluetoothError as e:
|
||||
logging.error(f'Failed to send data to {self.mac_address}: {e}')
|
||||
@@ -83,4 +84,4 @@ class Connection:
|
||||
|
||||
def __del__(self):
|
||||
self.socket.close()
|
||||
pass
|
||||
pass
|
||||
|
||||
265
linux/aln/__main__.py
Normal file
@@ -0,0 +1,265 @@
|
||||
# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
|
||||
# Copyright (C) 2024 Kavish Devar
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import logging.handlers
|
||||
import socket
|
||||
import threading
|
||||
import signal
|
||||
import sys
|
||||
import logging
|
||||
from . import Connection
|
||||
import enums
|
||||
from aln.Notifications import Notifications
|
||||
from aln.Notifications.Battery import Battery
|
||||
import os
|
||||
import bluetooth
|
||||
from aln.enums import enums
|
||||
connection = None
|
||||
|
||||
SOCKET_PATH = '/tmp/airpods_daemon.sock'
|
||||
LOG_FOLDER = '.'
|
||||
LOG_FILE = os.path.join(LOG_FOLDER, 'airpods_daemon.log')
|
||||
|
||||
# Global flag to control the server loop
|
||||
running = True
|
||||
|
||||
# Configure logging to write to a file
|
||||
# logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG, format='%(asctime)s %(levelname)s : %(message)s')
|
||||
|
||||
# RotatingFileHandler
|
||||
|
||||
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=2**20)
|
||||
handler.setFormatter(formatter)
|
||||
handler.setLevel(logging.DEBUG)
|
||||
|
||||
l = logging.getLogger()
|
||||
l.setLevel(logging.DEBUG)
|
||||
l.addHandler(handler)
|
||||
|
||||
from json import JSONEncoder
|
||||
|
||||
def handle_client(connection, client_socket):
|
||||
"""Handle client requests by forwarding all received data to aln.Connection, send data back to the client."""
|
||||
|
||||
def send_status():
|
||||
while running:
|
||||
try:
|
||||
for notif_key in list(globals().keys()):
|
||||
if notif_key.startswith("notif_"):
|
||||
data = globals().get(notif_key)
|
||||
if data:
|
||||
if notif_key == "notif_battery":
|
||||
data: list[Battery] = data
|
||||
batteryJSON = {"type": "battery"}
|
||||
for i in data:
|
||||
batteryJSON[i.get_component()] = {
|
||||
"status": i.get_status(),
|
||||
"level": i.get_level()
|
||||
}
|
||||
data: str = JSONEncoder().encode(batteryJSON)
|
||||
|
||||
elif notif_key == "notif_ear_detection":
|
||||
# noinspection PyTypeChecker
|
||||
data: list[int] = data
|
||||
earDetectionJSON = {
|
||||
"type": "ear_detection",
|
||||
"primary": data[0],
|
||||
"secondary": data[1]
|
||||
}
|
||||
data: str = JSONEncoder().encode(earDetectionJSON)
|
||||
elif notif_key == "notif_anc":
|
||||
data: int = data
|
||||
ancJSON = {
|
||||
"type": "anc",
|
||||
"mode": data,
|
||||
}
|
||||
data: str = JSONEncoder().encode(ancJSON)
|
||||
elif notif_key == "notif_ca":
|
||||
data: int = data
|
||||
caJSON = {
|
||||
"type": "ca",
|
||||
"status": data,
|
||||
}
|
||||
data: str = JSONEncoder().encode(caJSON)
|
||||
elif notif_key == "notif_unknown":
|
||||
logging.debug(f"Unhandled notification type: {notif_key}")
|
||||
logging.debug(f"Data: {data}")
|
||||
data: str = JSONEncoder().encode({"type": "unknown", "data": data})
|
||||
if not client_socket or not isinstance(client_socket, socket.socket):
|
||||
logging.error("Invalid client socket")
|
||||
break
|
||||
logging.info(f'Sending {notif_key} status: {data}')
|
||||
client_socket.sendall(data.encode('utf-8'))
|
||||
logging.info(f'Sent {notif_key} status: {data}')
|
||||
globals()[notif_key] = None
|
||||
except socket.error as e:
|
||||
logging.error(f"Socket error sending status: {e}")
|
||||
break
|
||||
except Exception as e:
|
||||
logging.error(f"Error sending status: {e}")
|
||||
break
|
||||
|
||||
def receive_commands():
|
||||
while running:
|
||||
try:
|
||||
data = client_socket.recv(1024)
|
||||
if not data:
|
||||
break
|
||||
logging.info(f'Received command: {data}')
|
||||
connection.send(data)
|
||||
except Exception as e:
|
||||
logging.error(f"Error receiving command: {e}")
|
||||
break
|
||||
|
||||
# Start two threads to handle sending and receiving data
|
||||
send_thread = threading.Thread(target=send_status)
|
||||
send_thread.start()
|
||||
receive_thread = threading.Thread(target=receive_commands)
|
||||
receive_thread.start()
|
||||
|
||||
send_thread.join()
|
||||
receive_thread.join()
|
||||
|
||||
client_socket.close()
|
||||
logging.info("Client socket closed")
|
||||
|
||||
def start_socket_server(connection):
|
||||
"""Start a UNIX domain socket server."""
|
||||
global running
|
||||
|
||||
# Set up the socket
|
||||
server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
try:
|
||||
server_socket.bind(SOCKET_PATH)
|
||||
except OSError:
|
||||
logging.error(f"Socket already in use or unavailable: {SOCKET_PATH}")
|
||||
sys.exit(1)
|
||||
|
||||
server_socket.listen(1)
|
||||
logging.info(f"Socket server listening on {SOCKET_PATH}")
|
||||
|
||||
while running:
|
||||
try:
|
||||
client_socket, _ = server_socket.accept()
|
||||
logging.info("Client connected")
|
||||
|
||||
# Handle the client connection in a separate thread
|
||||
client_thread = threading.Thread(target=handle_client, args=(connection, client_socket))
|
||||
client_thread.start()
|
||||
except Exception as e:
|
||||
logging.error(f"Error accepting connection: {e}")
|
||||
|
||||
# Close the server socket when stopped
|
||||
server_socket.close()
|
||||
logging.info("Socket server stopped")
|
||||
|
||||
def stop_daemon(_, __):
|
||||
"""Signal handler to stop the daemon."""
|
||||
global running
|
||||
logging.info("Received termination signal. Stopping daemon...")
|
||||
running = False # Set running flag to False to stop the loop
|
||||
|
||||
# Close the socket gracefully by removing the file path
|
||||
try:
|
||||
socket.socket(socket.AF_UNIX, socket.SOCK_STREAM).connect(SOCKET_PATH)
|
||||
except socket.error:
|
||||
pass
|
||||
finally:
|
||||
# Remove the socket file
|
||||
if os.path.exists(SOCKET_PATH):
|
||||
os.remove(SOCKET_PATH)
|
||||
|
||||
sys.exit(0)
|
||||
|
||||
def notification_handler(notification_type: int, data: bytes):
|
||||
global connection
|
||||
|
||||
logging.debug(f"Received notification: {notification_type}")
|
||||
if notification_type == Notifications.BATTERY_UPDATED:
|
||||
logger = logging.getLogger("Battery Status")
|
||||
battery = connection.notificationListener.BatteryNotification.getBattery()
|
||||
globals()["notif_battery"] = battery
|
||||
for i in battery:
|
||||
logger.debug(f'{i.get_component()} - {i.get_status()}: {i.get_level()}')
|
||||
elif notification_type == Notifications.EAR_DETECTION_UPDATED:
|
||||
logger = logging.getLogger("In-Ear Status")
|
||||
earDetection = connection.notificationListener.EarDetectionNotification.getEarDetection()
|
||||
globals()["notif_ear_detection"] = earDetection
|
||||
logger.debug(earDetection)
|
||||
elif notification_type == Notifications.ANC_UPDATED:
|
||||
logger = logging.getLogger("ANC Status")
|
||||
anc = connection.notificationListener.ANCNotification.status
|
||||
globals()["notif_anc"] = anc
|
||||
logger.debug(anc)
|
||||
elif notification_type == Notifications.CA_UPDATED:
|
||||
logger = logging.getLogger("Conversational Awareness Status")
|
||||
ca = connection.notificationListener.ConversationalAwarenessNotification.status
|
||||
globals()["notif_ca"] = ca
|
||||
logger.debug(ca)
|
||||
elif notification_type == Notifications.UNKNOWN:
|
||||
logger = logging.getLogger("Unknown Notification")
|
||||
hex_data = ' '.join(f'{byte:02x}' for byte in data)
|
||||
globals()["notif_unknown"] = hex_data
|
||||
logger.debug(hex_data)
|
||||
|
||||
def main():
|
||||
global running
|
||||
logging.info("Starting AirPods daemon")
|
||||
|
||||
connection = Connection(mac)
|
||||
globals()['connection'] = connection
|
||||
|
||||
# Connect to the AirPods and send the handshake
|
||||
try:
|
||||
connection.connect()
|
||||
except bluetooth.btcommon.BluetoothError as e:
|
||||
logging.error(f"Failed to connect to {mac}: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
connection.send(enums.HANDSHAKE)
|
||||
logging.info("Handshake sent")
|
||||
|
||||
connection.initialize_notifications(notification_handler)
|
||||
|
||||
# Start the socket server to listen for client connections
|
||||
start_socket_server(connection)
|
||||
|
||||
# Set up signal handlers to handle termination signals
|
||||
signal.signal(signal.SIGINT, stop_daemon) # Handle Ctrl+C
|
||||
signal.signal(signal.SIGTERM, stop_daemon) # Handle kill signal
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Daemonize the process
|
||||
if os.fork():
|
||||
sys.exit()
|
||||
|
||||
os.setsid()
|
||||
|
||||
if os.fork():
|
||||
sys.exit()
|
||||
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
|
||||
with open('/dev/null', 'r') as devnull:
|
||||
os.dup2(devnull.fileno(), sys.stdin.fileno())
|
||||
|
||||
with open(LOG_FILE, 'a+') as logfile:
|
||||
os.dup2(logfile.fileno(), sys.stdout.fileno())
|
||||
os.dup2(logfile.fileno(), sys.stderr.fileno())
|
||||
|
||||
main()
|
||||
31
linux/aln/listener.py
Normal file
@@ -0,0 +1,31 @@
|
||||
import bluetooth
|
||||
import time
|
||||
|
||||
class BluetoothListener:
|
||||
def __init__(self):
|
||||
self.connected_devices = set()
|
||||
|
||||
def scan_devices(self):
|
||||
nearby_devices = bluetooth.discover_devices(lookup_names=True, lookup_class=True, device_id=-1, duration=8, flush_cache=True)
|
||||
return nearby_devices
|
||||
|
||||
def start_listening(self):
|
||||
print("Listening for Bluetooth devices")
|
||||
while True:
|
||||
nearby_devices = self.scan_devices()
|
||||
current_devices = set()
|
||||
|
||||
for addr, name, device_class in nearby_devices:
|
||||
current_devices.add(addr)
|
||||
if addr not in self.connected_devices:
|
||||
print(f"Device connected: {name} [{addr}]")
|
||||
|
||||
for addr in self.connected_devices - current_devices:
|
||||
print(f"Device disconnected: [{addr}]")
|
||||
|
||||
self.connected_devices = current_devices
|
||||
time.sleep(5)
|
||||
|
||||
if __name__ == "__main__":
|
||||
listener = BluetoothListener()
|
||||
listener.start_listening()
|
||||
@@ -190,8 +190,10 @@ def handle_conversational_awareness(status):
|
||||
new_volume = max(0, min(int(initial_volume * 0.5), 100)) # Set volume to 50%
|
||||
elif status >= 8:
|
||||
new_volume = initial_volume # Fully restore volume
|
||||
|
||||
set_volume(new_volume)
|
||||
try:
|
||||
set_volume(new_volume)
|
||||
except Exception as e:
|
||||
logging.error(f"Error setting volume: {e}")
|
||||
logging.getLogger("Conversational Awareness").info(f"Volume set to {new_volume}% based on conversational awareness status: {status}")
|
||||
|
||||
# If status is 9, print conversation end message
|
||||
@@ -250,6 +252,9 @@ def get_battery_status():
|
||||
return f"Left: {left['level']}% - {left_status} | Right: {right['level']}% - {right_status} | Case: {case['level']}% - {case_status}"
|
||||
|
||||
from aln import enums
|
||||
|
||||
enums=enums.enums
|
||||
|
||||
def set_anc_mode(mode):
|
||||
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
|
||||
client.connect(SOCKET_PATH)
|
||||
|
||||
BIN
linux/icon.png
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 752 KiB |
8
linux/test_l2.py
Normal file
@@ -0,0 +1,8 @@
|
||||
import bluetooth
|
||||
address="28:2D:7F:C2:05:5B"
|
||||
try:
|
||||
sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
|
||||
sock.connect((address, 0x1001))
|
||||
sock.send(b"\x00\x00\x04\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
||||
except bluetooth.btcommon.BluetoothError as e:
|
||||
print(f"Error: {e}")
|
||||