30 Commits

Author SHA1 Message Date
Kavish Devar
be02ab1830 bump version 2024-12-06 21:32:24 +05:30
Kavish Devar
405584f8eb add more screenshots for the app 2024-12-06 21:06:46 +05:30
Kavish Devar
b1249f27f5 fix QSTile 2024-12-06 21:06:36 +05:30
Kavish Devar
ebdb1609f3 add proper colored popups like ios 2024-12-06 19:57:21 +05:30
Kavish Devar
db8458be59 try to fix service, again 2024-12-06 14:09:28 +05:30
Kavish Devar
4374a81915 move to haze for blurring 2024-12-06 13:06:00 +05:30
Kavish Devar
2679205dc3 fix background connections, add manual force connection button 2024-12-06 11:56:07 +05:30
Kavish Devar
0c1f9464ad add persistent notification for battery; bug fixes 2024-12-05 10:02:19 +05:30
Kavish Devar
7a246b3800 minor readme change 2024-12-03 22:10:15 +05:30
Kavish Devar
9fa8046886 Merge pull request #9 from SriviharReddy/new-branch
Readme Update
2024-12-03 22:08:27 +05:30
Victor Reeds
2c64cf7cf7 Fixed some spelling and grammar errors 2 2024-12-03 14:00:36 +05:30
Victor Reeds
c6ab7038cd Fixed some spelling and grammar errors 2024-12-03 13:59:12 +05:30
Victor Reeds
8917753830 Updated readme for better clarity 2024-12-03 13:25:11 +05:30
Kavish Devar
3fe268eb15 head gestures, maybe?? 2024-12-03 03:15:29 +05:30
Kavish Devar
f12cf0c16f move head-tracking files accross computers 2024-12-03 00:37:53 +05:30
Kavish Devar
c6af6a147f try to fix conversational awareness volume restore 2024-12-02 23:35:27 +05:30
Kavish Devar
71dffd1415 idk what i'm doing 2024-12-01 22:25:18 +05:30
Kavish Devar
4a1d7df82d add battery to the popup 2024-11-30 08:35:02 +05:30
Kavish Devar
3e0de6f011 add popup window when connected; automatically open socket in background 2024-11-29 23:45:32 +05:30
Kavish Devar
58de49d1b1 try to add automatic device connection detection; add "Off Listening Mode" toggle 2024-11-29 23:45:27 +05:30
Kavish Devar
c360c21305 Update README.md 2024-11-21 07:22:06 +05:30
Kavish Devar
48e7c91282 Update README.md 2024-11-16 22:37:39 +05:30
Kavish Devar
61e4a4168c fix tray noise control 2024-11-05 09:01:02 +05:30
Kavish Devar
b6a35756d0 Create CONTRIBUTING.md 2024-11-05 01:03:30 +05:30
Kavish Devar
2c68c1cf18 change tagline 2024-11-05 00:50:37 +05:30
Kavish Devar
6424a51e8a Create CODE_OF_CONDUCT.md 2024-11-05 00:48:05 +05:30
Kavish Devar
bef3cd9774 android: add Loud Sound Reduction and personalized volume toggle 2024-10-24 08:14:47 +05:30
Kavish Devar
f4cd02831c Check renaming airpods in Android off in README 2024-10-20 17:05:47 +05:30
Kavish Devar
745040be2b android: add QS Tile to change Noise Control Mode 2024-10-19 19:48:12 +05:30
Kavish Devar
a8de72f190 Add workaround instructions for android in README 2024-10-18 23:12:27 +05:30
89 changed files with 4714 additions and 796 deletions

View File

@@ -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
View 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
View 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 dont 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 youd 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, dont 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.

View File

@@ -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
![AirPods Settings](/android/imgs/settings.png)
![Debugging View](/android/imgs/debug.png)
#### 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
| | | |
|-------------------|-------------------|-------------------|
| ![Settings 1](/android/imgs/settings-1.png) | ![Settings 2](/android/imgs/settings-2.png) | ![Debug Screen](/android/imgs/debug.png) |
| ![Battery Notification](/android/imgs/notification.png) | ![Popup](/android/imgs/popup.png) | ![QuickSetting Tile](/android/imgs/qstile.png) |
# License
AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!

View File

@@ -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
![Settings Screen](/android/imgs/settings.png)
## Debug Screen
![Debug Screen](/android/imgs/debug.png)

View File

@@ -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)

View File

@@ -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>

View 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()
}
}

View File

@@ -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
}
}

View File

@@ -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)
}

View 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() }
}
}
}

View 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")
}

View File

@@ -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")

View File

@@ -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())
}
}

View File

@@ -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)
// }
//}

View File

@@ -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())
}

View File

@@ -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)
}
}
}

View 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())
}
}
}

View 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
}
}
}

View File

@@ -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),

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -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>

View File

@@ -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>

View 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

Binary file not shown.

Binary file not shown.

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -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>

View 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>

View File

@@ -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>

View 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>

View File

@@ -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>

View 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" />

View File

@@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

BIN
android/imgs/popup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
android/imgs/qstile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

BIN
android/imgs/settings-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

BIN
android/imgs/settings-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

View File

@@ -16,6 +16,7 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven("https://jitpack.io")
}
}

1
head-tracking/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
imgs

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View 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

View 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
View 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
View File

@@ -0,0 +1 @@
./yes

101
head-tracking/final.py Normal file
View 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
View 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
View 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
View 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
View 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()

View File

@@ -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
View 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()

View File

@@ -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
View 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
View 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()

View File

@@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 752 KiB

8
linux/test_l2.py Normal file
View 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}")