Full Code of yutils/YSerialPort for AI

master 4394d2b66f63 cached
86 files
885.6 KB
363.7k tokens
193 symbols
1 requests
Download .txt
Showing preview only (943K chars total). Download the full file or copy to clipboard to get everything.
Repository: yutils/YSerialPort
Branch: master
Commit: 4394d2b66f63
Files: 86
Total size: 885.6 KB

Directory structure:
gitextract_r9qdw748/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── doc/
│   │   └── yujingtest.jks
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── yujing/
│       │               └── chuankou/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── yujing/
│       │   │           └── chuankou/
│       │   │               ├── App.kt
│       │   │               ├── activity/
│       │   │               │   ├── MainActivity.java
│       │   │               │   ├── SendActivity.java
│       │   │               │   ├── myTest/
│       │   │               │   │   ├── MyMainActivity.java
│       │   │               │   │   ├── SendFileActivity.java
│       │   │               │   │   └── SyncActivity.java
│       │   │               │   └── wifi/
│       │   │               │       ├── SerialPortToWiFiActivity.kt
│       │   │               │       └── socket/
│       │   │               │           ├── ClientSocket.kt
│       │   │               │           └── Server.kt
│       │   │               ├── base/
│       │   │               │   ├── BaseActivity.java
│       │   │               │   └── KBaseActivity.kt
│       │   │               ├── config/
│       │   │               │   └── Config.kt
│       │   │               └── utils/
│       │   │                   └── Setting.java
│       │   ├── res/
│       │   │   ├── drawable/
│       │   │   │   ├── bt_click.xml
│       │   │   │   ├── item_click.xml
│       │   │   │   └── set_selector.xml
│       │   │   ├── layout/
│       │   │   │   ├── activity_main.xml
│       │   │   │   ├── activity_my_main.xml
│       │   │   │   ├── activity_send.xml
│       │   │   │   ├── activity_send_file.xml
│       │   │   │   ├── activity_serialport_to_wifi.xml
│       │   │   │   └── view_set.xml
│       │   │   ├── values/
│       │   │   │   ├── colors.xml
│       │   │   │   ├── dimens.xml
│       │   │   │   ├── strings.xml
│       │   │   │   └── styles.xml
│       │   │   └── xml/
│       │   │       ├── file_paths.xml
│       │   │       ├── network_config.xml
│       │   │       └── provider_paths.xml
│       │   └── res_screen/
│       │       ├── values/
│       │       │   └── dimens.xml
│       │       ├── values-sw1080dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw320dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw332dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw345dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw360dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw375dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw392dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw411dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw432dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw454dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw480dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw508dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw540dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw576dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw617dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw664dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw720dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw785dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw864dp/
│       │       │   └── dimens.xml
│       │       └── values-sw960dp/
│       │           └── dimens.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── yujing/
│                       └── chuankou/
│                           ├── ExampleUnitTest.java
│                           └── Values_sw.java
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── yserialport/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── build.gradle
    ├── consumer-rules.pro
    ├── proguard-rules.pro
    └── src/
        └── main/
            ├── AndroidManifest.xml
            ├── cpp/
            │   ├── YSerialPort.c
            │   ├── YSerialPort.h
            │   └── gen_YSerialPort_h.sh
            ├── java/
            │   └── com/
            │       └── yujing/
            │           ├── serialport/
            │           │   ├── SerialPort.java
            │           │   └── SerialPortFinder.java
            │           └── yserialport/
            │               ├── DataListener.java
            │               ├── InputStreamReadListener.java
            │               ├── ThreadMode.kt
            │               ├── YBytes.java
            │               ├── YListener.java
            │               ├── YReadInputStream.java
            │               └── YSerialPort.java
            └── res/
                └── values/
                    └── strings.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea
.DS_Store
/build
/captures
.externalNativeBuild
/gradles/

================================================
FILE: README.md
================================================
# YSerialPort

源Android-SerialPort-API,重新封装代码,实现读取串口数据,实现重新组包一次性读取完整数据。可连续读取任意长度数据。

重写串口so库名称和调用函数名称,不与其他串口工具形成so冲突或者类名冲突。

已经多次长时间测试:串口打印机,PLC通信,串口电子秤,串口条码读卡器,串口二维码读卡器,串口LED屏,串口NFC读卡器,读M1区一次性读取64个扇区,读CPU区一次读取16KB数据。

理论上兼容 安卓4.4~安卓14.0

2.2.7之后版本最低支撑安卓4.4(api19)

[![platform](https://img.shields.io/badge/platform-Android-lightgrey.svg)](https://developer.android.google.cn/studio/index.html)
![Gradle](https://img.shields.io/badge/Gradle-8.14.1-brightgreen.svg)
[![last commit](https://img.shields.io/github/last-commit/yutils/YSerialPort.svg)](https://github.com/yutils/YSerialPort/commits/master)
![repo size](https://img.shields.io/github/repo-size/yutils/YSerialPort.svg)
![android studio](https://img.shields.io/badge/android%20studio-2024.3.2-green.svg)
[![maven](https://img.shields.io/badge/maven-address-green.svg)](https://search.maven.org/artifact/com.kotlinx/yserialport)

**[releases里面有APK文件。点击前往](https://github.com/yutils/YSerialPort/releases)**

**[releases里面有AAR包。点击前往](https://github.com/yutils/YSerialPort/releases)**

**如果拉取整个项目,请用最新AS(AS2024.3.2以上)打开**

# `不建议直接拉取项目编译,请仔细看完 ` #

## Gradle采用java17

### 设置方法: Project Structure ----> SDK Location ----> JDK location was moved to Gradle Settings. ---->  Gradle JDK ---->  JDK17

## 已经从jitpack.io仓库移动至maven中央仓库

## 引用

### [添加依赖,当前最新版:————> 2.2.8    ![最新版](https://img.shields.io/badge/%E6%9C%80%E6%96%B0%E7%89%88-2.2.7-green.svg)](https://search.maven.org/artifact/com.kotlinx/yserialport)

```
dependencies {
    //更新地址  https://github.com/yutils/YSerialPort 建议过几天访问看下有没有新版本
    implementation 'com.kotlinx:yserialport:2.2.8'
}
```

注:如果引用失败,看下面方案
```
allprojects {
    repositories {
        google()
        //mavenCentral()
        
        //如果还是不容易拉取,可以试试直接用maven.org
        maven { url 'https://repo1.maven.org/maven2' }
    }
```

# 使用方法

可以参考SendActivity.java

## 基础使用方法

```java
YSerialPort ySerialPort=new YSerialPort(this,"/dev/ttyS4","9600");
//设置数据监听
ySerialPort.addDataListener(new DataListener(){
@Override
public void value(String hexString,byte[]bytes){
    //结果回调:haxString , bytes
    }
});
ySerialPort.start();
```

## 扩展使用方法

**java**  

**同步** 

```java
//拿流用法,自己通过流收发数据
SerialPort serialPort = SerialPort.newBuilder(new File("/dev/ttyS4"), 9600)
        .parity(0) // 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN)
        .dataBits(8) // 数据位,默认8;可选值为5~8
        .stopBits(1) // 停止位,默认1;1:1位停止位;2:2位停止位
        .build();
serialPort.getInputStream();//获取输入流
serialPort.getOutputStream();//获取输出流
serialPort.tryClose();//关闭
        
//同步收发 (不用每次都创建serialPort对象)
SerialPort serialPort=SerialPort.newBuilder(new File("/dev/ttyS4"),9600).build();
byte[] bytes=YSerialPort.sendSyncOnce(serialPort,bys,1000);
byte[] bytes=YSerialPort.sendSyncTime(serialPort,bys,20,1000);
byte[] bytes=YSerialPort.sendSyncLength(serialPort,bys,20,1000);
serialPort.tryClose();//关闭
        
//发送并等待返回,死等
byte[] bytes=YSerialPort.sendSyncOnce("/dev/ttyS4","9600",bytes);
//发送并等待返回,直到超时,如果超时则向上抛异常
byte[] bytes=YSerialPort.sendSyncOnce("/dev/ttyS4","9600",bytes,500);
//一直不停组包,(maxGroupTime每次组包时间)当在maxGroupTime时间内没有数据,就返回并关闭连接
byte[] bytes=YSerialPort.sendSyncTime("/dev/ttyS4","9600",bytes,500);
//一直不停组包,(maxGroupTime每次组包时间)当在maxGroupTime时间内没有数据,就返回并关闭连接(如果一直有数据,最多接收时间为maxTime)
byte[] bytes=YSerialPort.sendSyncTime("/dev/ttyS4","9600",bytes,500,3000);
//一直不停组包,当数据长度达到minLength或超时,返回并关闭连接
byte[] bytes=YSerialPort.sendSyncLength("/dev/ttyS4","9600",bytes,500,3000);

```

**异步**

```java

//String[] device = YSerialPort.getDevices();//获取串口列表
//String[] baudRate = YSerialPort.getBaudRates();//获取波特率列表

//YSerialPort.saveDevice(getApplication(), "/dev/ttyS4");//设置默认串口,可以不设置
//String device=YSerialPort.readDevice(getApplication());//获取上面设置的串口

//YSerialPort.saveBaudRate(getApplication(), "9600");//设置默认波特率,可以不设置
//String baudRate=YSerialPort.readBaudRate(getApplication());//获取上面设置的波特率

//异步收发
YSerialPort ySerialPort=new YSerialPort(this,"/dev/ttyS4","9600");
//设置数据监听
ySerialPort.addDataListener(new DataListener(){
@Override
public void value(String hexString,byte[]bytes){
    //结果回调:haxString , bytes
    }
});
//设置回调线程为主线程,默认主线程
ySerialPort.setThreadMode(ThreadMode.MAIN);
//设置自动组包,每次组包时长为40毫秒,如果40毫秒读取不到数据则返回结果
ySerialPort.setToAuto(); //ySerialPort.setToAuto(40);
//或者,设置手动组包,读取长度100,超时时间为50毫秒。如果读取到数据大于等于100立即返回,否则直到读取到超时为止
//ySerialPort.setToManual(100,50);
//启动
ySerialPort.start();
//发送文字
ySerialPort.send("你好".getBytes(Charset.forName("GB18030")));

//退出页面时候注销
@Override
protected void onDestroy(){
    super.onDestroy();
    ySerialPort.onDestroy();
}

//如果要自己解析inputStream,请在start()之前实现此方法
ySerialPort.setInputStreamReadListener(inputStream->{
    int count=0;
    while(count==0)
        count=inputStream.available();
    byte[]bytes=new byte[count];
    //readCount,已经成功读取的字节的个数,这儿需读取count个数据,不够则循环读取,如果采用inputStream.read(bytes);可能读不完
    int readCount=0;
    while(readCount<count)
        readCount+=inputStream.read(bytes,readCount,count-readCount);
    return bytes;
});
```


**kotlin**

```kotlin
//创建对象
val ySerialPort = YSerialPort(this, "/dev/ttyS4", "9600")
//设置数据监听
ySerialPort.addDataListener { hexString, bytes ->
    //结果回调:haxString , bytes
}
//设置自动组包,每次组包时长为40毫秒,如果40毫秒读取不到数据则返回结果
ySerialPort.setToAuto() //ySerialPort.setToAuto(40)
//或者,设置手动组包,读取长度100,超时时间为50毫秒。如果读取到数据大于等于100立即返回,否则直到读取到超时为止
//ySerialPort.setToManual(100,50)
//启动
ySerialPort.start()

//发送文字
ySerialPort.send("你好".toByteArray(Charset.forName("GB18030")))

//退出页面时候注销
override fun onDestroy() {
    super.onDestroy()
    ySerialPort.onDestroy()
}
```

## 代码混淆
```
-keepclasseswithmembernames class * {
    native <methods>;
}
#-keep class com.yujing.** { *; }
-keep class com.yujing.serialport.* { *; }
-keep class com.yujing.yserialport.* { *; }
```

## 根据协议头组包完整示例

```kotlin
//原理就是准备一个字符串,每次都数据都拼接到后面,然后判断协议头是否正确?(对了就取对应长度数据然后剪掉用过的数据长度):(如果不对就剪掉协议头数据,重新开始)
class Test {
    var ySerialPort: YSerialPort? = null

    //log
    var showLog = false

    //最后一次组包剩余数据
    private var oldSurplus = ""

    fun test() {
        ySerialPort = YSerialPort(context, "/dev/ttyS2", "9600")
        ySerialPort?.addDataListener { hexString, bytes ->
            dataFilter(hexString)
        }
        ySerialPort?.start()
    }

    //拆包组包,举例:数据包:02 2B 30 30 30 30 30 30 30 31 42 03  //其中:协议头 02  2B正2D负   6位重量  1位小数点位数  2位校验(2B到30) 03结束位
    @Synchronized
    fun dataFilter(hexStr: String) {
        //先组装上一次剩余数据
        oldSurplus += hexStr.replace(" ", "")
        if (oldSurplus.isEmpty()) return

        //定义一个包长度
        var dataLength = 24

        //判断长度
        if (oldSurplus.length < dataLength) {
            if (showLog) YLog.d("数据长度不够,等一手!$oldSurplus")
            return
        }

        //验证协议头,非02开头就抛弃
        if (oldSurplus.substring(0, 2) != "02") {
            if (showLog) YLog.d("数据异常,抛弃数据头!$oldSurplus")
            //剪掉数据头,如果剩余数据大于一个完整包,递归一次
            oldSurplus = oldSurplus.substring(2)
            if (oldSurplus.length >= dataLength)
                dataFilter("")
            return
        }
        //如果有数据长度位,获取长度位+包头+包尾=包长,dataLength重新赋值新的包长
        //dataLength=数据长度+包头+包尾

        //验证协议尾,同上

        
        //验证校验码
        //......

        //获取数据处理 【这儿就是一个完整的数据包!】 【这儿就是一个完整的数据包!】 【这儿就是一个完整的数据包!】 
        handle(YConvert.hexStringToByte(oldSurplus.substring(0, dataLength)))

        //剪去用过的数据
        oldSurplus = oldSurplus.substring(dataLength)

        //剩余数据可能还能有完整包。所以递归一次
        if (oldSurplus.length >= dataLength)
            dataFilter("")
    }
    
    //处理数据。dataByteArray的长度应该是8
    private fun handle(dataByteArray: ByteArray) {
        //处理分析,转换成对象obj
        //.....

        //通知前端
        //YBusUtil.post("某某设备发送的数据", obj)
    }
    
    //退出页面时候注销
    fun onDestroy() {
        ySerialPort?.onDestroy()
    }
}
```

串口文件位置:/proc/tty/drivers

感谢:[Android-SerialPort-API](https://github.com/licheedev/Android-SerialPort-API)

不懂的问我QQ:3373217 (别问为啥手机没串口,别问模拟器怎么调试串口(可以映射),别问USB转的串口为什么不能识别)

如果是USB转串口,请参考这个工程:

[CH340/CH341的USB转串口](https://github.com/yutils/CH34xUART)




================================================
FILE: app/.gitignore
================================================
/build
/release

================================================
FILE: app/build.gradle
================================================
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
    id 'kotlin-parcelize'
}
android {
    compileSdk 34
    namespace 'com.yujing.chuankou'
    defaultConfig {
        applicationId "com.yujing.chuankou"
        minSdk 19
        targetSdk 34
        versionCode 28
        versionName "2.2.8"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    //签名
    signingConfigs {
        debug {
            storeFile file("doc/yujingtest.jks")
            storePassword "123456"
            keyAlias "test"
            keyPassword "123456"
        }
        release {
            storeFile file("doc/yujingtest.jks")
            storePassword "123456"
            keyAlias "test"
            keyPassword "123456"
        }
    }
    buildTypes {
        debug {
            //app名称
            manifestPlaceholders = ["app_name": "@string/app_name_debug"]
            //包名后缀
            //applicationIdSuffix ".debug"
            //版本名后缀
            //versionNameSuffix "-debug"
            //混淆
            minifyEnabled false
            //Zipalign优化
            zipAlignEnabled false
            // 移除无用的resource文件
            shrinkResources false
            //签名配置
            signingConfig signingConfigs.debug
        }
        release {
            //app名称
            manifestPlaceholders = ["app_name": "@string/app_name"]
            //混淆
            minifyEnabled true
            //Zipalign优化
            zipAlignEnabled false
            //移除无用的resource文件
            shrinkResources false
            //签名配置
            signingConfig signingConfigs.release
            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    //打包
    android.applicationVariants.configureEach { variant ->
        //def appName = variant.productFlavors[0].name //获取渠道名称
        def appName = "YSerialPort" //rootProject.name
        def createDate = new Date().format("YYYYMMdd", TimeZone.getTimeZone("GMT+08:00"))
        def createTime = new Date().format("HHmmss", TimeZone.getTimeZone("GMT+08:00"))
        variant.outputs.configureEach {
            it.outputFileName = "${appName}_v${versionName}_${versionCode}_${createDate}_${createTime}_${buildType.name}.apk"
        }
    }
    //资源合并
    sourceSets {
        main { res.srcDirs = ['src/main/res', 'src/main/res_screen'] }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
    buildFeatures {
        dataBinding = true
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
    implementation 'androidx.core:core-ktx:1.13.1'
    implementation 'androidx.appcompat:appcompat:1.6.1'//再高 minSdk 就不能是 19 了
    implementation 'com.google.android.material:material:1.12.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4' //再高 minSdk 就不能是 19 了
    implementation 'androidx.navigation:navigation-fragment-ktx:2.6.0'
    implementation 'androidx.navigation:navigation-ui-ktx:2.6.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.2.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
    implementation 'com.kotlinx:yutils:2.2.5'
    //bugly,异常采集
    implementation 'com.tencent.bugly:crashreport:4.1.9.3'
    //gson  https://central.sonatype.com/artifact/com.google.code.gson/gson
    //implementation 'com.google.code.gson:gson:2.11.0'
    //implementation 'com.kotlinx:yserialport:2.2.7'
    implementation project(':yserialport')
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt$Version
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE


-keepclasseswithmembernames class * {
    native <methods>;
}
-keep class com.yujing.** { *; }
#-keep class com.yujing.serialport.* { *; }
#-keep class com.yujing.yserialport.* { *; }

================================================
FILE: app/src/androidTest/java/com/yujing/chuankou/ExampleInstrumentedTest.java
================================================
package com.yujing.chuankou;

import androidx.test.ext.junit.runners.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {

    }
}


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.yujing.chuankou">

    <!--网络-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:label="${app_name}"
        android:networkSecurityConfig="@xml/network_config"
        android:roundIcon="@mipmap/icon"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:label">

        <activity
            android:name=".activity.MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".activity.SendActivity" />
        <activity android:name=".activity.myTest.SendFileActivity" />
        <activity android:name=".activity.myTest.MyMainActivity" />
        <activity android:name=".activity.myTest.SyncActivity" />
        <activity
            android:name=".activity.wifi.SerialPortToWiFiActivity"
            android:screenOrientation="landscape" />
    </application>
</manifest>

================================================
FILE: app/src/main/java/com/yujing/chuankou/App.kt
================================================
package com.yujing.chuankou

import android.app.Application
import android.content.pm.PackageManager
import android.os.Build
import com.tencent.bugly.crashreport.CrashReport
import com.yujing.utils.*
import java.io.File
import java.util.Date

class App : Application() {
    //单列
    companion object {
        private var instance: App? = null
        fun get(): App {
            return instance!!
        }
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
        YUtils.init(this)
        //保存日志开
        YLog.saveOpen(YPath.getFilePath(this, "log"))
        YLog.setLogSaveListener { type, tag, msg -> return@setLogSaveListener type != YLog.DEBUG }
        //保存最近30天日志
        YLog.delDaysAgo(30)

        //本地记录,kotlin
        val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) else packageManager.getPackageInfo(packageName, 0)
        val code = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) info.longVersionCode else info.versionCode
        val name= info.versionName
        val strategy = CrashReport.UserStrategy(this)
        strategy.setCrashHandleCallback(object : CrashReport.CrashHandleCallback() {
            override fun onCrashHandleStart(crashType: Int, errorType: String?, errorMessage: String?, errorStack: String?): MutableMap<String, String> {
                //0:Java crash; 1:Java caught exception; 2:Native crash; 3:Unity error; 4:ANR; 5:Cocos JS error; 6:Cocos Lua error
                val str = "包名:${packageName}\n版本:verCode=${code}\tverName=${name}\n异常类型:$crashType\n错误类型:$errorType\n错误原因:$errorMessage\n$errorStack"
                val path = "${YPath.get()}/crash/${YDate.date2String(Date(), "yyyy_MM_dd_HH_mm_ss")}.txt"
                //存本地磁盘,路径Android/data/包名/files/crash/
                YFileUtil.stringToFile(File(path), str)
                //提交bugly额外信息
                val map = super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack) ?: mutableMapOf("异常保存路径" to path)
                //重启APP,startActivity(packageManager.getLaunchIntentForPackage(packageName)?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                return map
            }
        })
        strategy.deviceID = YUtils.getAndroidId() //设置id
        strategy.appPackageName = packageName //App的包名
        //CrashReport.setIsDevelopmentDevice(this, BuildConfig.DEBUG) //是否是debug
        CrashReport.initCrashReport(this, "a365f21e2f", YUtils.isDebug(this), strategy) //初始化Bugly
    }
}

================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/MainActivity.java
================================================
package com.yujing.chuankou.activity;

import android.app.AlertDialog;

import com.yujing.chuankou.R;
import com.yujing.chuankou.activity.myTest.MyMainActivity;
import com.yujing.chuankou.activity.wifi.SerialPortToWiFiActivity;
import com.yujing.chuankou.base.BaseActivity;
import com.yujing.chuankou.databinding.ActivityMainBinding;
import com.yujing.utils.YPermissions;

/**
 * 首页
 */
public class MainActivity extends BaseActivity<ActivityMainBinding> {

    public MainActivity() {
        super(R.layout.activity_main);
    }

    @Override
    protected void init() {
        YPermissions.Companion.requestAll(this);
        binding.ButtonQuit.setOnClickListener(v -> finish());
        binding.btnAuthor.setOnClickListener(v -> startActivity(MyMainActivity.class));
        binding.btnToWifi.setOnClickListener(v -> startActivity(SerialPortToWiFiActivity.class));
        binding.ButtonSendWords.setOnClickListener(v -> startActivity(SendActivity.class));
        binding.ButtonAbout.setOnClickListener(v -> {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("关于——余静的串口测试工具");
            builder.setMessage(R.string.about_msg);
            builder.show();
        });
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/SendActivity.java
================================================
package com.yujing.chuankou.activity;

import com.yujing.chuankou.R;
import com.yujing.chuankou.base.KBaseActivity;
import com.yujing.chuankou.config.Config;
import com.yujing.chuankou.databinding.ActivitySendBinding;
import com.yujing.chuankou.utils.Setting;
import com.yujing.utils.YConvert;
import com.yujing.utils.YLog;
import com.yujing.utils.YShared;
import com.yujing.utils.YToast;
import com.yujing.yserialport.DataListener;
import com.yujing.yserialport.ThreadMode;
import com.yujing.yserialport.YSerialPort;

import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * @author yujing
 * 可以参考此类用法
 */
public class SendActivity extends KBaseActivity<ActivitySendBinding> {
    YSerialPort ySerialPort;
    final String SEND_STRING = "SEND_STRING";
    final String SEND_HEX = "SEND_HEX";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("[HH:mm:ss.SSS]", Locale.getDefault());

    public SendActivity() {
        super(R.layout.activity_send);
    }

    @Override
    protected void init() {
        //YReadInputStream.setShowLog(true);
        //非阻塞读取线程,轮询不休息,将增加cpu消耗
        //YReadInputStream.setSleep(false);
        //上次使用的数据
        binding.editText.setText(YShared.get(this, SEND_STRING));
        binding.etHex.setText(YShared.get(this, SEND_HEX));
        binding.editText.setSelection(binding.editText.getText().toString().length());
        binding.button.setOnClickListener(v -> sendString());
        binding.btHex.setOnClickListener(v -> sendHexString());
        //退出
        binding.rlBack.setOnClickListener(v -> finish());
        //清空
        binding.llClearSerialPortResult.setOnClickListener(v -> binding.tvResult.setText(""));
        binding.llClearSerialPortSend.setOnClickListener(v -> binding.tvSend.setText(""));

        //初始化串口
        ySerialPort = new YSerialPort(this, Config.getDevice(), Config.getBaudRate());
//      自定义组包
//        ySerialPort.setInputStreamReadListener(inputStream -> {
//            int count = 0;
//            while (count == 0)
//                count = inputStream.available();
//            byte[] bytes = new byte[count];
//            //readCount,已经成功读取的字节的个数,这儿需读取count个数据,不够则循环读取,如果采用inputStream.read(bytes);可能读不完
//            int readCount = 0;
//            while (readCount < count)
//                readCount += inputStream.read(bytes, readCount, count - readCount);
//            return bytes;
//        });
        //添加监听
        ySerialPort.addDataListener(dataListener);
        ySerialPort.setThreadMode(ThreadMode.MAIN);//设置回调线程为主线程
        if (Config.getDevice() != null && Config.getBaudRate() != null)
            ySerialPort.start();
        //设置
        Setting.setting(this, binding.includeSet, () -> {
            if (Config.getDevice() != null && Config.getBaudRate() != null) ySerialPort.reStart(Config.getDevice(), Config.getBaudRate());
            binding.tvResult.setText("");
            binding.tvSend.setText("");
        });
    }

    private void sendHexString() {
        String str = binding.etHex.getText().toString().replace("\n", "").replace(" ", "");
        if (str.isEmpty()) {
            YToast.show("未输入内容!");
            return;
        }
        //去空格后
        binding.etHex.setText(str);

        //保存数据,下次打开页面直接填写历史记录
        YShared.write(getApplicationContext(), SEND_HEX, str);

        //发送
        YLog.i("发送串口:" + ySerialPort.getDevice() + "\t\t波特率:" + ySerialPort.getBaudRate() + "\t\t内容:" + str);
        ySerialPort.send(YConvert.hexStringToByte(str));

        //显示
        if (binding.tvSend.getText().toString().length() > 10000) binding.tvSend.setText(binding.tvSend.getText().toString().substring(0, 2000));
        binding.tvSend.setText("HEX " + simpleDateFormat.format(new Date()) + ":" + str + "\n" + binding.tvSend.getText().toString());
    }

    private void sendString() {
        String str = binding.editText.getText().toString();
        if (str.isEmpty()) {
            YToast.show("未输入内容!");
            return;
        }
        //保存数据,下次打开页面直接填写历史记录
        YShared.write(getApplicationContext(), SEND_STRING, str);

        //发送
        YLog.i("发送串口:" + ySerialPort.getDevice() + "\t\t波特率:" + ySerialPort.getBaudRate() + "\t\t内容:" + str);
        ySerialPort.send(str.getBytes(Charset.forName("GB18030")), value -> {
            if (!value) YToast.show("串口异常");
        });

        //显示
        if (binding.tvSend.getText().toString().length() > 10000) binding.tvSend.setText(binding.tvSend.getText().toString().substring(0, 2000));
        binding.tvSend.setText("STR " + simpleDateFormat.format(new Date()) + ":" + str + "\n" + binding.tvSend.getText().toString());
    }

    DataListener dataListener = (hexString, bytes) -> {
        //显示
        if (binding.tvResult.getText().toString().length() > 10000) binding.tvResult.setText(binding.tvResult.getText().toString().substring(0, 2000));
        binding.tvResult.setText("HEX " + simpleDateFormat.format(new Date()) + ":" + YConvert.bytesToHexString(bytes) + "\n" + binding.tvResult.getText().toString());
    };

    @Override
    public void onDestroy() {
        super.onDestroy();
        ySerialPort.onDestroy();
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/MyMainActivity.java
================================================
package com.yujing.chuankou.activity.myTest;

import com.yujing.chuankou.R;
import com.yujing.chuankou.base.BaseActivity;
import com.yujing.chuankou.databinding.ActivityMyMainBinding;

public class MyMainActivity extends BaseActivity<ActivityMyMainBinding> {
    public MyMainActivity() {
        super(R.layout.activity_my_main);
    }

    @Override
    protected void init() {
        binding.ButtonQuit.setOnClickListener(v -> finish());
        binding.ButtonSendFile.setOnClickListener(v -> startActivity(SendFileActivity.class));
        binding.btSync.setOnClickListener(v -> startActivity(SyncActivity.class));
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/SendFileActivity.java
================================================
package com.yujing.chuankou.activity.myTest;

import android.content.Intent;
import android.net.Uri;

import com.yujing.chuankou.R;
import com.yujing.chuankou.base.BaseActivity;
import com.yujing.chuankou.config.Config;
import com.yujing.chuankou.databinding.ActivitySendFileBinding;
import com.yujing.chuankou.utils.Setting;
import com.yujing.utils.YConvert;
import com.yujing.utils.YPermissions;
import com.yujing.utils.YShow;
import com.yujing.utils.YToast;
import com.yujing.utils.YUri;
import com.yujing.yserialport.YSerialPort;

import java.io.File;

public class SendFileActivity extends BaseActivity<ActivitySendFileBinding> {
    File sendFile = null;//要发送的文件
    YSerialPort ySerialPort;

    public SendFileActivity() {
        super(R.layout.activity_send_file);
    }

    @Override
    protected void init() {
        YPermissions.Companion.requestAll(this);
        //选择文件
        binding.buttonBrowse.setOnClickListener(v -> onClick());
        //发送文件
        binding.btSend.setOnClickListener(v -> sendFile());

        ySerialPort = new YSerialPort(this, Config.getDevice(), Config.getBaudRate());
        ySerialPort.addDataListener((hexString, bytes2) -> runOnUiThread(() ->
                binding.tvResult.setText(binding.tvResult.getText().equals("") ? hexString : binding.tvResult.getText() + "\n" + hexString))
        );
        ySerialPort.start();
        //设置
        Setting.setting(this, binding.includeSet, () -> {
            if (Config.getDevice() != null && Config.getBaudRate() != null)
                ySerialPort.reStart(Config.getDevice(), Config.getBaudRate());
            binding.tvResult.setText("");
        });
        binding.ButtonQuit.setOnClickListener(v -> finish());
    }

    //直接发送文件到串口
    private void sendFile() {
        if (sendFile == null) {
            YToast.show("请先选择文件");
            return;
        }
        byte[] bytes = YConvert.fileToByte(sendFile);
        YShow.show(this, "发送中...", "进度:" + 0 + "/" + bytes.length);
        //初始化
        ySerialPort.send(bytes,
                aBoolean -> YToast.show("发送:" + (aBoolean ? "成功" : "失败")),
                integer -> {
                    YShow.setMessageOther("进度:" + integer + "/" + bytes.length);
                    if (integer == bytes.length) {
                        YShow.finish();
                        YToast.show("发送完成");
                        ySerialPort.onDestroy();
                    }
                });
        YToast.show("正在发送请稍后...");
    }

    public void onClick() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent, 1);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                if (uri != null) {
                    String path = YUri.getPath(this, uri);
                    if (path != null) {
                        File file = new File(path);
                        if (file.exists()) {
                            sendFile = file;
                            String upLoadFilePath = file.toString();
                            String upLoadFileName = file.getName();
                            binding.FilePath.setText(upLoadFilePath);
                        }
                    }
                }
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        ySerialPort.onDestroy();
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/SyncActivity.java
================================================
package com.yujing.chuankou.activity.myTest;

import com.yujing.chuankou.R;
import com.yujing.chuankou.base.KBaseActivity;
import com.yujing.chuankou.config.Config;
import com.yujing.chuankou.databinding.ActivitySendBinding;
import com.yujing.chuankou.utils.Setting;
import com.yujing.utils.YConvert;
import com.yujing.utils.YLog;
import com.yujing.utils.YShared;
import com.yujing.utils.YToast;
import com.yujing.yserialport.YSerialPort;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 同步发送
 *
 * @author yujing 2021年7月27日10:57:10
 */
public class SyncActivity extends KBaseActivity<ActivitySendBinding> {

    final String SEND_STRING = "SEND_STRING";
    final String SEND_HEX = "SEND_HEX";
    String device = null;
    String baudRate = null;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("[HH:mm:ss.SSS]", Locale.getDefault());

    public SyncActivity() {
        super(R.layout.activity_send);
    }

    @Override
    protected void init() {
        //YReadInputStream.setShowLog(true);
        //非阻塞读取线程,轮询不休息,将增加cpu消耗
        //YReadInputStream.setSleep(false);
        binding.tvTitle.setText("同步发送数据");
        //上次使用的数据
        binding.editText.setText(YShared.get(this, SEND_STRING));
        binding.etHex.setText(YShared.get(this, SEND_HEX));

        binding.editText.setSelection(binding.editText.getText().toString().length());
        binding.button.setOnClickListener(v -> sendString());
        binding.btHex.setOnClickListener(v -> sendHexString());
        //退出
        binding.rlBack.setOnClickListener(v -> finish());
        //清空
        binding.llClearSerialPortResult.setOnClickListener(v -> binding.tvResult.setText(""));
        binding.llClearSerialPortSend.setOnClickListener(v -> binding.tvSend.setText(""));
        //串口波特率
        device = Config.getDevice();
        baudRate = Config.getBaudRate();
        //设置
        Setting.setting(this, binding.includeSet, () -> {
            if (Config.getDevice() != null && Config.getBaudRate() != null) {
                device = Config.getDevice();
                baudRate = Config.getBaudRate();
            }
            binding.tvResult.setText("");
            binding.tvSend.setText("");
        });
    }

    private void sendHexString() {
        if (device == null || baudRate == null) {
            YToast.show("请先配置串口!");
            return;
        }
        String str = binding.etHex.getText().toString().replaceAll("\n", "").replace(" ", "");
        if (str.isEmpty()) {
            YToast.show("未输入内容!");
            return;
        }
        //去空格后
        binding.etHex.setText(str);

        //保存数据,下次打开页面直接填写历史记录
        YShared.write(getApplicationContext(), SEND_HEX, str);
        //发送
        YLog.i("发送串口:" + device + "\t\t波特率:" + baudRate + "\t\t内容:" + str);
        new Thread(() -> {
            try {
                //最多等待500毫秒
                byte[] re = YSerialPort.sendSyncTime(device, baudRate, YConvert.hexStringToByte(str), 500);
                //至少读取100毫秒,读满10字节返回
//                byte[] re = YSerialPort.sendSyncContinuity(device, baudRate, YConvert.hexStringToByte(str), 100,10);
                //回显
                showData(re);
            } catch (Exception e) {
                //回显
                showDataFail("发送失败,原因:" + e.getMessage());
            }
        }).start();

        //显示
        if (binding.tvSend.getText().toString().length() > 10000)
            binding.tvSend.setText(binding.tvSend.getText().toString().substring(0, 2000));
        binding.tvSend.setText("HEX " + simpleDateFormat.format(new Date()) + ":" + str + "\n" + binding.tvSend.getText().toString());
    }

    private void sendString() {
        String str = binding.editText.getText().toString();
        if (str.isEmpty()) {
            YToast.show("未输入内容!");
            return;
        }
        //保存数据,下次打开页面直接填写历史记录
        YShared.write(getApplicationContext(), SEND_STRING, str);

        //发送
        YLog.i("发送串口:" + device + "\t\t波特率:" + baudRate + "\t\t内容:" + str);
        new Thread(() -> {
            try {
                //最多等待500毫秒
                byte[] re = YSerialPort.sendSyncTime(device, baudRate, YConvert.hexStringToByte(str), 500);
                //至少读取100毫秒,读满10字节返回
                //byte[] re = YSerialPort.sendSyncContinuity(device, baudRate, YConvert.hexStringToByte(str), 100,10);
                //回显
                showData(re);
            } catch (Exception e) {
                //回显
                showDataFail("失败:" + e.getMessage());
            }
        }).start();

        //显示
        if (binding.tvSend.getText().toString().length() > 10000)
            binding.tvSend.setText(binding.tvSend.getText().toString().substring(0, 2000));
        binding.tvSend.setText(
                "STR " + simpleDateFormat.format(new Date()) + ":" + str + "\n" + binding.tvSend.getText().toString());
    }

    private void showData(byte[] bytes) {
        runOnUiThread(() -> {
            String hexString = YConvert.bytesToHexString(bytes);
            //显示
            if (binding.tvResult.getText().toString().length() > 10000)
                binding.tvResult.setText(binding.tvResult.getText().toString().substring(0, 2000));
            binding.tvResult.setText(
                    "HEX " + simpleDateFormat.format(new Date()) + ":" + hexString + "\n" + binding.tvResult.getText().toString());
        });
    }

    private void showDataFail(String fail) {
        runOnUiThread(() -> {
            //显示
            if (binding.tvResult.getText().toString().length() > 10000)
                binding.tvResult.setText(binding.tvResult.getText().toString().substring(0, 2000));
            binding.tvResult.setText(
                    "ERROR " + simpleDateFormat.format(new Date()) + ":" + fail + "\n" + binding.tvResult.getText().toString());
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/wifi/SerialPortToWiFiActivity.kt
================================================
package com.yujing.chuankou.activity.wifi

import android.app.AlertDialog
import android.content.DialogInterface
import android.graphics.Color
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.TextView
import com.yujing.chuankou.R
import com.yujing.chuankou.activity.wifi.socket.Server
import com.yujing.chuankou.base.KBaseActivity
import com.yujing.chuankou.config.Config
import com.yujing.chuankou.databinding.ActivitySerialportToWifiBinding
import com.yujing.chuankou.utils.Setting
import com.yujing.contract.YListener
import com.yujing.contract.YListener2
import com.yujing.utils.YApp
import com.yujing.utils.YCheck
import com.yujing.utils.YConvert
import com.yujing.utils.YLog
import com.yujing.utils.YSave
import com.yujing.utils.YScreenUtil
import com.yujing.utils.YShared
import com.yujing.utils.YToast
import com.yujing.utils.YUtils
import com.yujing.yserialport.YSerialPort
import java.net.Socket
import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

/**
 * 串口转TCP(WiFi)
 * @author 2021年8月6日15:34:13
 */
class SerialPortToWiFiActivity :
    KBaseActivity<ActivitySerialportToWifiBinding>(R.layout.activity_serialport_to_wifi) {
    var ySerialPort: YSerialPort? = null
    val SEND_STRING = "SEND_STRING"
    val SEND_HEX = "SEND_HEX"
    val SEND_WIFI_HEX = "SEND_WIFI_HEX"

    //服务
    val server = Server()

    //wifiPort
    var wifiPort: String
        get() = YSave.get(YApp.get(), "wifiPort", String::class.java, "8888")
        set(value) = YSave.put(YApp.get(), "wifiPort", value)

    var simpleDateFormat = SimpleDateFormat("[HH:mm:ss.SSS]", Locale.getDefault())

    override fun init() {
        //上次使用的数据
        binding.run {
            editText.setText(YShared.get(YApp.get(), SEND_STRING))
            etHex.setText(YShared.get(YApp.get(), SEND_HEX))
            etHexWifi.setText(YShared.get(YApp.get(), SEND_WIFI_HEX))
            editText.setSelection(editText.text!!.length)
            tvPort.text = "端口:$wifiPort"
            //按钮,退出
            rlBack.setOnClickListener { finish() }
            //按钮,发送hex
            btHex.setOnClickListener { sendHexSerialPort() }
            //按钮,发送文本
            button.setOnClickListener { sendStringSerialPort() }
            //按钮,发送hex,wifi
            btHexWifi.setOnClickListener { sendHexWiFi() }
            //设置server端口
            llWifiSet.setOnClickListener { wifiSetting() }
            //打开server
            llWifiOpen.setOnClickListener { wifiOpen() }
            //清屏
            llClearSerialPortResult.setOnClickListener { tvResult.text = "" }
            llClearSerialPortSend.setOnClickListener { tvSend.text = "" }
            llClearWifiResult.setOnClickListener { tvResultWifi.text = "" }
            llClearWifiSend.setOnClickListener { tvSendWifi.text = "" }
            //显示本机ip地址
            tvIp.isSelected = true
            tvIp.text = "本机IP:" + YUtils.getIPv4().toTypedArray().contentToString()
        }

        //初始化串口
        ySerialPort = YSerialPort(this, Config.device, Config.baudRate).apply {
            //自定义组包
            setInputStreamReadListener { inputStream ->
                var count = 0
                while (count == 0) count = inputStream.available() //获取真正长度
                val bytes = ByteArray(count)
                var readCount = 0 // 已经成功读取的字节的个数
                while (readCount < count) readCount += inputStream.read(bytes, readCount, count - readCount)
                return@setInputStreamReadListener bytes
            }
            //收到串口数据
            addDataListener { hexString: String, byteArray: ByteArray ->
                //转发给WiFi
                Thread { sendHexWiFi(byteArray) }.start()
                showByteArray(binding.tvResult, byteArray)
            }
            start()
        }

        //设置
        Setting.setting(this, binding.includeSet) {
            if (Config.device != null && Config.baudRate != null) ySerialPort?.reStart(Config.device, Config.baudRate)
            binding.tvResult.text = ""
            binding.tvSend.text = ""
        }

        //设置TCP服务
        server.run {
            //服务,连接监听,刷新显示列表
            connectListener = YListener {
                var s = ""
                for (item in socketList) s += item.socket.inetAddress.hostAddress + "\n"
                binding.tvConnectList.text = s
            }

            //服务,收到数据
            readListener = YListener2<Socket, ByteArray> { socket, byteArray ->
                //转发给串口
                Thread { sendHexSerialPort(byteArray) }.start()
                showByteArray(binding.tvResultWifi, byteArray)
            }
        }

        //默认打开服务
        wifiOpen()
    }

    //打开wifi
    private fun wifiOpen() {
        if (YCheck.isPort(wifiPort)) {
            if (server.server == null || server.server!!.isClosed) {
                server.startListener = YListener {
                    binding.tvServerStatus.text = "服务状态:已打开"
                    binding.tvServerStatusTips.text = "单击关闭服务"
                }
                server.start(wifiPort.toInt())
            } else {
                server.close()
                binding.tvServerStatus.text = "服务状态:已关闭"
                binding.tvServerStatusTips.text = "单击打开服务"
            }
        } else {
            YToast.showSpeak("端口不正确")
        }
    }

    //设置wifi串口
    private fun wifiSetting() {
        if (server.server != null && !server.server!!.isClosed) return YToast.show("请先关闭服务")

        val editText = EditText(this).apply {
            val dp10 = YScreenUtil.dp2px(10F)
            setPadding(dp10, dp10, dp10, dp10)
            inputType = EditorInfo.TYPE_CLASS_NUMBER
            maxLines = 1
            maxLines = 5
            setBackgroundColor(Color.parseColor("#EEEEEE"))
            setText(wifiPort)
        }

        AlertDialog.Builder(this).apply {
            setIcon(android.R.drawable.ic_menu_info_details)
            setCancelable(true)
            setTitle("请输入端口号")
            setMessage("\n提示:端口 应该在1-65535之间")
            setView(editText)
            setPositiveButton("确定", null)
            setNegativeButton("取消") { dialogInterface, which -> dialogInterface.dismiss() }
        }.create().apply {
            show()
            getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
                dismiss()
                val str = editText.text.toString().trim()
                if (YCheck.isPort(str)) {
                    if (str != wifiPort) {
                        wifiPort = str
                        binding.tvPort.text = "端口:$wifiPort"
                    }
                } else {
                    YToast.showSpeak("端口不正确")
                }
            }
        }
    }

    //发送16进制给串口
    private fun sendHexSerialPort() {
        val str: String = binding.etHex.text.toString().replace("\n", "").replace(" ", "")
        if (str.isEmpty()) return YToast.showSpeak("未输入内容")

        //去空格后
        binding.etHex.setText(str)

        //保存数据,下次打开页面直接填写历史记录
        YShared.write(applicationContext, SEND_HEX, str)
        YLog.d(ySerialPort?.device + " " + ySerialPort?.baudRate + " " + str)

        sendHexSerialPort(YConvert.hexStringToByte(str))
    }

    //发送给串口
    private fun sendHexSerialPort(byteArray: ByteArray) {
        ySerialPort?.send(byteArray)
        showByteArray(binding.tvSend, byteArray)
    }

    //显示 不超过2000字符
    private fun showByteArray(tv: TextView, byteArray: ByteArray) {
        runOnUiThread {
            tv.run {
                if (text.toString().length > 10000) text = text.toString().substring(0, 2000)
                text = "HEX ${simpleDateFormat.format(Date())}:${YConvert.bytesToHexString(byteArray)}\n${text}"
            }
        }
    }

    //发送文本进制给串口
    private fun sendStringSerialPort() {
        val str = binding.editText.text.toString()
        if (str.isEmpty()) return YToast.showSpeak("未输入内容")

        //保存数据,下次打开页面直接填写历史记录
        YShared.write(applicationContext, SEND_STRING, str)

        ySerialPort?.send(
            str.toByteArray(Charset.forName("GB18030"))
        ) { value: Boolean? ->
            if (!value!!) YToast.showSpeak("串口异常")
        }
        //显示
        binding.tvSend.run {
            if (text.toString().length > 10000) text = text.toString().substring(0, 2000)
            text = "STR ${simpleDateFormat.format(Date())}:$str\n${text}"
        }
    }

    //发送16进制给wifi
    private fun sendHexWiFi() {
        if (server.socketList.isEmpty()) return YToast.showSpeak("没有已连接的设备")
        val str: String = binding.etHexWifi.text.toString().replace("\n", "").replace(" ", "")
        if (str.isEmpty()) return YToast.showSpeak("未输入内容")

        //去空格后
        binding.etHexWifi.setText(str)

        //保存数据,下次打开页面直接填写历史记录
        YShared.write(applicationContext, SEND_WIFI_HEX, str)
        sendHexWiFi(YConvert.hexStringToByte(str))
    }

    //发送给wifi
    private fun sendHexWiFi(byteArray: ByteArray) {
        //有wifi连接才转发
        if (server.socketList.size > 0) {
            //转发给wifi
            server.send(byteArray)
            showByteArray(binding.tvSendWifi, byteArray)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        ySerialPort?.onDestroy()
        server.close()
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/wifi/socket/ClientSocket.kt
================================================
package com.yujing.chuankou.activity.wifi.socket

import com.yujing.contract.YListener
import com.yujing.contract.YListener1
import com.yujing.contract.YListener2
import com.yujing.utils.YConvert
import com.yujing.utils.YLog
import com.yujing.utils.YReadInputStream
import java.net.Socket

class ClientSocket(val socket: Socket) {
    //线程
    var readThread: Thread? = null

    //读取数据监听
    var readListener: YListener2<Socket, ByteArray>? = null

    //关闭监听
    var closeListener: YListener? = null

    //读取
    @Synchronized
    fun init() {
        readThread?.interrupt()
        readThread = Thread {
            while (!Thread.interrupted()) {
                try {
                    val inputStream = socket.getInputStream()
                    val bytes = YReadInputStream.readOnce(inputStream)
                    YLog.d("接收到的原始数据:" + YConvert.bytesToHexString(bytes))
                    readListener?.value(socket,bytes)
                } catch (e: Exception) {
                    Thread.currentThread().interrupt()
                    break
                }
            }
            YLog.d("退出soket读取线程:"+socket.inetAddress.hostAddress)
            closeListener?.value()
        }
        readThread?.start()
    }

    //发送
    fun send(bytes: ByteArray) {
        Thread {
            try {
                val os = socket.getOutputStream()
                os.write(bytes)
                os.flush()
            } catch (e: Exception) {
                //连接已经断开
                YLog.d("设备已断开")
                socket.close()
                close()
                closeListener?.value()
            }
        }.start()
    }

    fun close() {
        readThread?.interrupt()
        socket.close()
    }
}

================================================
FILE: app/src/main/java/com/yujing/chuankou/activity/wifi/socket/Server.kt
================================================
package com.yujing.chuankou.activity.wifi.socket

import com.yujing.contract.YListener
import com.yujing.contract.YListener2
import com.yujing.utils.YLog
import com.yujing.utils.YThread
import com.yujing.utils.YToast
import java.net.ServerSocket
import java.net.Socket
import java.net.SocketException

/**
 * 服务,广播服务
 * @author yujing 2021年8月6日15:30:40
 */
/*
用法
//服务
val server = Server()

//服务,连接监听,刷新显示列表
server.connectListener = YListener {
    var s = ""
    for (item in server.socketList) {
        s += item.socket.inetAddress.hostAddress
        s += "\n"
    }
    binding.tvConnectList.text = s
}

//服务,收到数据
server.readListener = YListener2<Socket, ByteArray> { socket, byteArray ->

}

if (YCheck.isPort(wifiPort)) {
    if (server.server == null || server.server!!.isClosed) {
        server.startListener = YListener {
         //服务状态:已打开
        }
        //打开服务
        server.start(wifiPort.toInt())
    } else {
        //关闭服务
        server.close()
    }
} else {
    showSpeak("端口不正确")
}


override fun onDestroy() {
    super.onDestroy()
    server.close()
}
 */
class Server {
    val socketList: MutableList<ClientSocket> = ArrayList()

    //读取数据监听
    var readListener: YListener2<Socket, ByteArray>? = null

    //连接或者关闭监听
    var connectListener: YListener? = null

    //启动成功监听
    var startListener: YListener? = null

    //server
    var server: ServerSocket? = null

    fun start(port: Int) {
        Thread {
            YLog.d("启动服务")
            try {
                server = ServerSocket(port)
                YLog.d("启动服务成功")
                YThread.runOnUiThread { startListener?.value() }
                while (!server!!.isClosed) {
                    val socket = server!!.accept()
                    connect(socket)
                }
            } catch (e: SocketException) {
                if (e.message == "Socket closed") {
                    YLog.d("服务已关闭")
                } else {
                    YLog.e("服务已关闭", e)
                    YThread.runOnUiThread {
                        YToast.showSpeak("服务已关闭")
                    }
                }
            } catch (e: Exception) {
                YLog.e("启动服务失败", e)
                YThread.runOnUiThread {
                    YToast.showSpeak("启动服务失败")
                }
            }
        }.start()
    }

    //新增一个连接
    private fun connect(socket: Socket) {
        Thread {
            val socketClient = ClientSocket(socket)
            socketList.add(socketClient)
            socketClient.init()
            //读取监听
            socketClient.readListener = YListener2<Socket, ByteArray> { socket, data ->
                YThread.runOnUiThread {
                    readListener?.value(socket, data)
                }
            }
            //关闭监听
            socketClient.closeListener = YListener {
                check()
            }
            check()
        }.start()
    }


    //检查当前列表
    @Synchronized
    private fun check() {
        //删除——循环
        var i = 0
        while (i < socketList.size) {
            val next = socketList[i]
            if (next.socket.isClosed) {
                next.close()
                socketList.removeAt(i)
            }
            i++
        }

        YThread.runOnUiThread {
            connectListener?.value()
        }
    }

    //发送
    fun send(bytes: ByteArray) {
        var i = 0
        while (i < socketList.size) {
            val item = socketList[i]
            item.send(bytes)
            i++
        }
    }

    //关闭
    fun close() {
        for (item in socketList) {
            item.close()
        }
        socketList.clear()
        server?.close()
        server = null
    }
}

================================================
FILE: app/src/main/java/com/yujing/chuankou/base/BaseActivity.java
================================================
package com.yujing.chuankou.base;

import androidx.databinding.ViewDataBinding;

import com.yujing.base.YBaseActivity;

/**
 * 基础activity
 *
 * @author yujing 2021年1月13日17:21:58
 */
/* 用法举例
public class MainActivity extends BaseActivity<ActivityMainBinding> {
    public MainActivity() {
        super(R.layout.activity_main);
    }
    @Override
    protected void init() {
    }
}
*/
public abstract class BaseActivity<B extends ViewDataBinding> extends YBaseActivity<B> {
    protected B binding;

    public BaseActivity(int layout) {
        super(layout);
    }

    @Override
    public void initBefore() {
        binding = getBinding();
    }
}


================================================
FILE: app/src/main/java/com/yujing/chuankou/base/KBaseActivity.kt
================================================
@file:Suppress("MemberVisibilityCanBePrivate")

package com.yujing.chuankou.base

import android.annotation.SuppressLint
import androidx.databinding.ViewDataBinding
import com.yujing.base.YBaseActivity
import com.yujing.utils.YUtils

/**
 * 基础activity
 *
 * @param <B> ViewDataBinding
 * @author yujing 2020年9月7日21:40:20
 */
/*
用法:
//kotlin
class AboutActivity : KBaseActivity<ActivityAboutBinding>(R.layout.activity_about) {
    override fun init() {
        binding.include.ivBack.setOnClickListener { finish() }
        binding.include.tvTitle.text = "关于我们"
    }
}
//java
public class OldActivity extends KBaseActivity<Activity1101Binding> {
    public OldActivity() {
        super(R.layout.activity_1101);
    }
    @Override
    protected void init() { }
}
 */
abstract class KBaseActivity<B : ViewDataBinding>(layout: Int) : YBaseActivity<B>(layout) {
    override fun initAfter() {
        YUtils.setFullScreen(this, true)
        YUtils.setImmersive(this, true)
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            YUtils.setFullScreen(this, true)
            YUtils.setImmersive(this, true)
        }
    }

    @SuppressLint("MissingSuperCall")
    override fun onDestroy() {
        super.onDestroy()
    }
}

================================================
FILE: app/src/main/java/com/yujing/chuankou/config/Config.kt
================================================
package com.yujing.chuankou.config

import com.yujing.utils.YSaveFiles

object Config {
    //串口,此值可以在 sdcard/Android/data/包名/files/device.txt 中修改
    @JvmStatic
    var device: String?
        get() = YSaveFiles.get("device", null)
        set(value) = YSaveFiles.set("device", value)

    //波特率
    @JvmStatic
    var baudRate: String?
        get() = YSaveFiles.get("baudRate", null)
        set(value) = YSaveFiles.set("baudRate", value)
}

================================================
FILE: app/src/main/java/com/yujing/chuankou/utils/Setting.java
================================================
package com.yujing.chuankou.utils;

import android.app.Activity;
import android.app.AlertDialog;

import com.yujing.chuankou.config.Config;
import com.yujing.chuankou.databinding.ViewSetBinding;
import com.yujing.contract.YListener;
import com.yujing.yserialport.YSerialPort;

public class Setting {
    /**
     * 设置
     *
     * @param activity   activity
     * @param includeSet include
     * @param yListener  是否设置完成
     */
    public static void setting(Activity activity, ViewSetBinding includeSet, YListener yListener) {
        if (Config.getDevice() != null) {
            includeSet.tvCk.setText(Config.getDevice());
        }
        if (Config.getBaudRate() != null) {
            includeSet.tvBtl.setText(Config.getBaudRate());
        }
        includeSet.llCk.setOnClickListener(v -> {
            int index = 0;//单选框默认值:从0开始
            new AlertDialog.Builder(activity)
                    .setTitle("选择串口")//设置对话框标题
                    .setIcon(android.R.drawable.ic_menu_info_details)//设置对话框图标
                    .setSingleChoiceItems(YSerialPort.getSerialPortFinder().getAllDevices(), index, (dialog, which) -> {
                        String device = YSerialPort.getSerialPortFinder().getAllDevicesPath()[which];
                        includeSet.tvCk.setText(device);
                        Config.setDevice(device);
                        dialog.dismiss();
                        //回调
                        if (yListener != null) yListener.value();
                    })
                    .show();
        });
        includeSet.llBtl.setOnClickListener(v -> {
            int index = 0;//单选框默认值:从0开始
            new AlertDialog.Builder(activity)
                    .setTitle("选择波特率")//设置对话框标题
                    .setIcon(android.R.drawable.ic_menu_info_details)//设置对话框图标
                    .setSingleChoiceItems(YSerialPort.getBaudRates(), index, (dialog, which) -> {
                        String baudRate = YSerialPort.getBaudRates()[which];
                        includeSet.tvBtl.setText(baudRate);
                        Config.setBaudRate(baudRate);
                        //回调
                        if (yListener != null) yListener.value();
                        dialog.dismiss();
                    }).show();
        });
    }
}


================================================
FILE: app/src/main/res/drawable/bt_click.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 按下颜色 -->
    <item android:state_pressed="true">
        <shape>
            <!--   <solid android:color="#30001050" />-->
            <stroke android:width="1dp" android:color="@color/green_E" />
            <gradient android:angle="90" android:centerColor="@color/trans" android:endColor="@color/trans" android:startColor="@color/trans" android:type="linear" />
            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape>
    </item>
    <!-- 抬起颜色 -->
    <item android:state_pressed="false">
        <shape>
            <!--<solid android:color="@color/trans" />-->
            <stroke android:width="1dp" android:color="@color/white" />
            <gradient android:angle="0" android:centerColor="@color/blue_light_E" android:endColor="@color/green_grass_E" android:startColor="@color/blue_Sky_E" android:type="linear" />
            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape>
    </item>
</selector>

================================================
FILE: app/src/main/res/drawable/item_click.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 按下颜色 -->
    <item android:state_pressed="true">
        <color android:color="@color/trans_White_8" />
    </item>
    <!-- 抬起颜色 -->
    <item android:state_pressed="false">
        <color android:color="@color/trans" />
    </item>
</selector>

================================================
FILE: app/src/main/res/drawable/set_selector.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--按下颜色  -->
    <item android:state_pressed="true">
        <color android:color="#80AAAAAA" />
    </item>
    <!--抬起颜色  -->
    <item android:state_pressed="false">
        <color android:color="#80FFFFFF" />
    </item>
</selector>

================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/ButtonSendWords"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bt_click"
                android:gravity="center"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:text="发送和接收串口数据"
                android:textColor="@color/white" />

            <TextView
                android:id="@+id/btn_to_wifi"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bt_click"
                android:gravity="center"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:text="串口转TCP(WiFi)"
                android:textColor="@color/white" />

            <TextView
                android:id="@+id/btn_author"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bt_click"
                android:gravity="center"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:text="作者的专项测试——勿入"
                android:textColor="@color/white" />

            <com.google.android.material.button.MaterialButton
                android:id="@+id/ButtonAbout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:gravity="center"
                android:text="关于"
                android:textColor="@color/white"
                app:cornerRadius="10dp"
                app:rippleColor="@color/cyan_F"
                app:strokeColor="@color/blue_Sky_F"
                app:strokeWidth="1dp" />

            <com.google.android.material.button.MaterialButton
                android:id="@+id/ButtonQuit"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:gravity="center"
                android:text="退出"
                android:textColor="@color/white"
                app:cornerRadius="10dp"
                app:rippleColor="@color/cyan_F"
                app:strokeColor="@color/blue_Sky_F"
                app:strokeWidth="1dp" />
        </LinearLayout>
    </ScrollView>
</layout>

================================================
FILE: app/src/main/res/layout/activity_my_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/ButtonSendFile"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bt_click"
                android:gravity="center"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:text="发送文件"
                android:textColor="@color/white" />

            <TextView
                android:id="@+id/bt_sync"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:background="@drawable/bt_click"
                android:gravity="center"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:text="同步发送"
                android:textColor="@color/white" />

            <com.google.android.material.button.MaterialButton
                android:id="@+id/ButtonQuit"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:gravity="center"
                android:text="退出"
                android:textColor="@color/white"
                app:cornerRadius="10dp"
                app:rippleColor="@color/cyan_F"
                app:strokeColor="@color/blue_Sky_F"
                app:strokeWidth="1dp" />
        </LinearLayout>
    </ScrollView>
</layout>

================================================
FILE: app/src/main/res/layout/activity_send.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f0f0f0"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/title"
            android:paddingTop="@dimen/dp10"
            android:paddingBottom="@dimen/dp10">

            <RelativeLayout
                android:id="@+id/rl_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/item_click"
                android:padding="@dimen/dp5">

                <ImageView
                    android:layout_width="@dimen/dp50"
                    android:layout_height="@dimen/dp50"
                    android:layout_centerInParent="true"
                    android:layout_centerHorizontal="true"
                    android:src="@mipmap/back" />
            </RelativeLayout>

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_gravity="center"
                android:text="串口收发"
                android:textAlignment="center"
                android:textAllCaps="false"
                android:textColor="#FFFFFF"
                android:textSize="@dimen/sp45"
                android:textStyle="bold" />
        </RelativeLayout>

        <include
            android:id="@+id/include_set"
            layout="@layout/view_set" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#80126132" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <com.google.android.material.textfield.TextInputLayout
                    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="10dp"
                    android:hint="16进制 0-F 不区分大小写">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/et_hex"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:digits="1234567890ABCDEFabcdef\n " />
                </com.google.android.material.textfield.TextInputLayout>

                <com.google.android.material.button.MaterialButton
                    android:id="@+id/btHex"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="10dp"
                    android:text="发送hex"
                    android:textSize="16sp"
                    app:rippleColor="@color/cyan_F"
                    app:strokeColor="@color/blue_Sky_F"
                    app:strokeWidth="1dp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <com.google.android.material.textfield.TextInputLayout
                    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="10dp"
                    android:hint="文本 原样发送">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/editText"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />
                </com.google.android.material.textfield.TextInputLayout>

                <com.google.android.material.button.MaterialButton
                    android:id="@+id/button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="10dp"
                    android:text="发送"
                    android:textSize="16sp"
                    app:rippleColor="@color/cyan_F"
                    app:strokeColor="@color/blue_light_F"
                    app:strokeWidth="1dp" />
            </LinearLayout>

        </LinearLayout>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginTop="10dp"
            android:background="#f36d46" />

        <!--收到数据-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/ll_clear_serialPort_result"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="10dp"
                android:layout_marginEnd="@dimen/dp10"
                android:orientation="horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="收到串口数据:" />

                <Space
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="1" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="清除屏幕" />
            </LinearLayout>

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/tv_result"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="5dp"
                        android:layout_marginEnd="10dp"
                        android:background="#60A1D1F5"
                        android:minLines="10"
                        android:padding="4dp"
                        android:textSize="14sp" />
                </LinearLayout>
            </ScrollView>
        </LinearLayout>
        <!--发送数据-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/ll_clear_serialPort_send"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="10dp"
                android:layout_marginEnd="@dimen/dp10"
                android:orientation="horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="发送串口数据:" />

                <Space
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="1" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="清除屏幕" />
            </LinearLayout>

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/tv_send"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="5dp"
                        android:layout_marginEnd="10dp"
                        android:background="#60A1D1F5"
                        android:minLines="10"
                        android:padding="4dp"
                        android:textSize="14sp" />
                </LinearLayout>
            </ScrollView>
        </LinearLayout>
    </LinearLayout>
</layout>

================================================
FILE: app/src/main/res/layout/activity_send_file.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f0f0f0"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <include
                android:id="@+id/include_set"
                layout="@layout/view_set" />
            <Button
                android:id="@+id/buttonBrowse"
                android:layout_marginStart="5dp"
                android:layout_marginEnd="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="选择文件" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/bt_send"
                    android:layout_width="0dp"
                    android:layout_marginStart="5dp"
                    android:layout_marginEnd="5dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="直接发送" />

            </LinearLayout>

            <TextView
                android:id="@+id/FilePath"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                tools:text="文件路径" />

            <TextView
                android:id="@+id/tv_result"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="10dp"
                android:background="#60A1D1F5"
                android:minLines="5"
                android:padding="4dp"
                android:textSize="14sp" />
            <com.google.android.material.button.MaterialButton
                android:id="@+id/ButtonQuit"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="10dp"
                android:gravity="center"
                android:text="退出"
                android:textColor="@color/white"
                app:cornerRadius="10dp"
                app:rippleColor="@color/cyan_F"
                app:strokeColor="@color/blue_Sky_F"
                app:strokeWidth="1dp" />
        </LinearLayout>
    </ScrollView>
</layout>

================================================
FILE: app/src/main/res/layout/activity_serialport_to_wifi.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f0f0f0"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/title"
            android:paddingTop="@dimen/dp10"
            android:paddingBottom="@dimen/dp10">
            <RelativeLayout
                android:id="@+id/rl_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="@dimen/dp5"
                android:background="@drawable/item_click">

                <ImageView
                    android:layout_width="@dimen/dp50"
                    android:layout_height="@dimen/dp50"
                    android:layout_centerInParent="true"
                    android:layout_centerHorizontal="true"
                    android:src="@mipmap/back" />
            </RelativeLayout>

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_gravity="center"
                android:text="串口转TCP(WiFi)"
                android:textAlignment="center"
                android:textAllCaps="false"
                android:textColor="#FFFFFF"
                android:textSize="@dimen/sp45"
                android:textStyle="bold" />
        </RelativeLayout>
        <!--上边-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <!--左边-->
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <include
                    android:id="@+id/include_set"
                    layout="@layout/view_set" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:background="#80126132" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="vertical">

                        <com.google.android.material.textfield.TextInputLayout
                            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:hint="16进制0-F 发送给串口">

                            <com.google.android.material.textfield.TextInputEditText
                                android:id="@+id/et_hex"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:digits="1234567890ABCDEFabcdef\n " />
                        </com.google.android.material.textfield.TextInputLayout>

                        <com.google.android.material.button.MaterialButton
                            android:id="@+id/btHex"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:backgroundTint="@color/title"
                            android:text="发送hex"
                            android:textSize="16sp"
                            app:rippleColor="#00FFFF"
                            app:strokeColor="#88bfFF"
                            app:strokeWidth="1dp" />
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="vertical">

                        <com.google.android.material.textfield.TextInputLayout
                            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:hint="文本 原样发送给串口">

                            <com.google.android.material.textfield.TextInputEditText
                                android:id="@+id/editText"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content" />
                        </com.google.android.material.textfield.TextInputLayout>

                        <com.google.android.material.button.MaterialButton
                            android:id="@+id/button"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:backgroundTint="@color/title"
                            android:text="发送"
                            android:textSize="16sp"
                            app:rippleColor="#00FFFF"
                            app:strokeColor="#00bfFF"
                            app:strokeWidth="1dp" />
                    </LinearLayout>

                </LinearLayout>
            </LinearLayout>

            <ImageView
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="#80126132" />
            <!--右边-->
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#f0f0f0"
                    android:orientation="horizontal">

                    <LinearLayout
                        android:id="@+id/ll_wifi_set"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="1dp"
                        android:layout_weight="1"
                        android:background="@drawable/set_selector"
                        android:clickable="true"
                        android:focusable="true"
                        android:orientation="vertical"
                        android:paddingStart="20dp"
                        android:paddingTop="10dp"
                        android:paddingEnd="20dp"
                        android:paddingBottom="10dp">

                        <TextView
                            android:id="@+id/tv_ip"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="本机IP:"
                            android:marqueeRepeatLimit="marquee_forever"
                            android:singleLine="true"
                            android:ellipsize="marquee"
                            android:textColor="#000"
                            android:textSize="16sp" />

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginTop="@dimen/dp5"
                            android:orientation="horizontal">

                            <TextView
                                android:id="@+id/tv_port"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:layout_weight="1"
                                android:text="端口:"
                                android:textColor="#000"
                                android:textSize="12sp" />

                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:text="点击设置"
                                android:textColor="#666"
                                android:textSize="12sp" />
                        </LinearLayout>
                    </LinearLayout>

                    <ImageView
                        android:layout_width="1px"
                        android:layout_height="match_parent"
                        android:background="#80126132" />

                    <LinearLayout
                        android:id="@+id/ll_wifi_open"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:background="@drawable/set_selector"
                        android:clickable="true"
                        android:focusable="true"
                        android:orientation="vertical"
                        android:paddingStart="20dp"
                        android:paddingTop="10dp"
                        android:paddingEnd="20dp"
                        android:paddingBottom="10dp">

                        <TextView
                            android:id="@+id/tv_server_status"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="服务状态:已关闭"
                            android:textColor="#000"
                            android:textSize="16sp" />

                        <TextView
                            android:id="@+id/tv_server_status_tips"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginTop="5dp"
                            android:text="点击打开服务"
                            android:textColor="#666"
                            android:textSize="12sp" />
                    </LinearLayout>
                </LinearLayout>

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:background="#80126132" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="horizontal">

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:orientation="vertical">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginStart="10dp"
                            android:layout_marginTop="10dp"
                            android:text="已连接TCP客户端列表:" />

                        <ScrollView
                            android:layout_width="match_parent"
                            android:layout_marginBottom="@dimen/dp5"
                            android:layout_height="wrap_content">

                            <LinearLayout
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content">

                                <TextView
                                    android:id="@+id/tv_connect_list"
                                    android:layout_width="match_parent"
                                    android:layout_height="match_parent"
                                    android:layout_marginStart="10dp"
                                    android:layout_marginTop="5dp"
                                    android:layout_marginEnd="10dp"
                                    android:background="#60A1D1F5"
                                    android:minLines="10"
                                    android:padding="4dp"
                                    android:textSize="14sp" />
                            </LinearLayout>
                        </ScrollView>
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:orientation="vertical">

                        <com.google.android.material.textfield.TextInputLayout
                            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:hint="16进制0-F 发送给TCP客户端">

                            <com.google.android.material.textfield.TextInputEditText
                                android:id="@+id/et_hex_wifi"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:digits="1234567890ABCDEFabcdef\n " />
                        </com.google.android.material.textfield.TextInputLayout>

                        <com.google.android.material.button.MaterialButton
                            android:id="@+id/btHex_wifi"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginTop="10dp"
                            android:layout_marginRight="10dp"
                            android:backgroundTint="@color/title"
                            android:text="发送hex"
                            android:textSize="16sp"
                            app:rippleColor="#00FFFF"
                            app:strokeColor="#88bfFF"
                            app:strokeWidth="1dp" />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
        <!--下边-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:layout_marginStart="@dimen/dp5"
                    android:layout_marginEnd="@dimen/dp5"
                    android:background="#f36d46" />
                <!--收到数据-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <LinearLayout
                        android:id="@+id/ll_clear_serialPort_result"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="10dp"
                        android:layout_marginEnd="@dimen/dp10"
                        android:orientation="horizontal">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="收到串口数据:" />

                        <Space
                            android:layout_width="0dp"
                            android:layout_height="0dp"
                            android:layout_weight="1" />

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="清除屏幕" />
                    </LinearLayout>

                    <ScrollView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">

                            <TextView
                                android:id="@+id/tv_result"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_marginStart="10dp"
                                android:layout_marginTop="5dp"
                                android:layout_marginEnd="10dp"
                                android:background="#60A1D1F5"
                                android:minLines="10"
                                android:padding="4dp"
                                android:textSize="14sp" />
                        </LinearLayout>
                    </ScrollView>
                </LinearLayout>
                <!--发送数据-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <LinearLayout
                        android:id="@+id/ll_clear_serialPort_send"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="10dp"
                        android:layout_marginEnd="@dimen/dp10"
                        android:orientation="horizontal">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="发送串口数据:" />

                        <Space
                            android:layout_width="0dp"
                            android:layout_height="0dp"
                            android:layout_weight="1" />

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="清除屏幕" />
                    </LinearLayout>

                    <ScrollView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">

                            <TextView
                                android:id="@+id/tv_send"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_marginStart="10dp"
                                android:layout_marginTop="5dp"
                                android:layout_marginEnd="10dp"
                                android:background="#60A1D1F5"
                                android:minLines="10"
                                android:padding="4dp"
                                android:textSize="14sp" />
                        </LinearLayout>
                    </ScrollView>
                </LinearLayout>
            </LinearLayout>

            <ImageView
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="#80126132" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:layout_marginStart="@dimen/dp5"
                    android:layout_marginEnd="@dimen/dp5"
                    android:background="#f36d46" />
                <!--收到数据-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <LinearLayout
                        android:id="@+id/ll_clear_wifi_result"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="10dp"
                        android:layout_marginEnd="@dimen/dp10"
                        android:orientation="horizontal">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="收到TCP客户端数据:" />

                        <Space
                            android:layout_width="0dp"
                            android:layout_height="0dp"
                            android:layout_weight="1" />

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="清除屏幕" />
                    </LinearLayout>

                    <ScrollView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">

                            <TextView
                                android:id="@+id/tv_result_wifi"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_marginStart="10dp"
                                android:layout_marginTop="5dp"
                                android:layout_marginEnd="10dp"
                                android:background="#60A1D1F5"
                                android:minLines="10"
                                android:padding="4dp"
                                android:textSize="14sp" />
                        </LinearLayout>
                    </ScrollView>
                </LinearLayout>
                <!--发送数据-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <LinearLayout
                        android:id="@+id/ll_clear_wifi_send"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="10dp"
                        android:layout_marginTop="10dp"
                        android:layout_marginEnd="@dimen/dp10"
                        android:orientation="horizontal">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="发送TCP客户端数据:" />

                        <Space
                            android:layout_width="0dp"
                            android:layout_height="0dp"
                            android:layout_weight="1" />

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="清除屏幕" />
                    </LinearLayout>

                    <ScrollView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">

                            <TextView
                                android:id="@+id/tv_send_wifi"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_marginStart="10dp"
                                android:layout_marginTop="5dp"
                                android:layout_marginEnd="10dp"
                                android:background="#60A1D1F5"
                                android:minLines="10"
                                android:padding="4dp"
                                android:textSize="14sp" />
                        </LinearLayout>
                    </ScrollView>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</layout>

================================================
FILE: app/src/main/res/layout/view_set.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f0f0f0"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ll_ck"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="1dp"
            android:layout_weight="1"
            android:background="@drawable/set_selector"
            android:clickable="true"
            android:focusable="true"
            android:orientation="vertical"
            android:paddingStart="20dp"
            android:paddingTop="10dp"
            android:paddingEnd="20dp"
            android:paddingBottom="10dp">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="串口"
                android:textColor="#000"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_ck"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="点击设置"
                android:textColor="#666"
                android:textSize="12sp" />
        </LinearLayout>

        <ImageView
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:background="#80126132" />

        <LinearLayout
            android:id="@+id/ll_btl"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/set_selector"
            android:clickable="true"
            android:focusable="true"
            android:orientation="vertical"
            android:paddingStart="20dp"
            android:paddingTop="10dp"
            android:paddingEnd="20dp"
            android:paddingBottom="10dp">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="波特率"
                android:textColor="#000"
                android:textSize="16sp" />

            <TextView
                android:id="@+id/tv_btl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="点击设置"
                android:textColor="#666"
                android:textSize="12sp" />
        </LinearLayout>
    </LinearLayout>
</layout>

================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">@color/title</color>
    <color name="colorPrimaryDark">@color/title</color>
    <color name="colorAccent">@color/title</color>
    <!-- 背景 -->
    <color name="background">#F0F0F0</color>
    <!-- 标题颜色 -->
    <color name="title">@color/blue_light_E</color>
    <!-- 白色 -->
    <color name="white">#FFFFFF</color>
    <!-- 黑色 -->
    <color name="black">#000000</color>

    <!-- 分割线条颜色 -->
    <color name="division1">#004C66</color>
    <color name="division2">#003344</color>
    <color name="division3">#6000b2EE</color>
    <color name="division4">#2000b2EE</color>
    <color name="division5">#1000b2EE</color>
    <!-- 文字颜色 -->
    <color name="text1">@color/blue_light_2</color>
    <color name="text2">@color/blue_light_4</color>
    <color name="text3">@color/blue_light_6</color>
    <color name="text4">@color/blue_light_8</color>
    <color name="text5">@color/blue_light_A</color>
    <!-- QRCode scanner color begin -->
    <color name="viewfinder_mask">#60000000</color>
    <color name="result_view">#B0000000</color>
    <color name="viewfinder_frame">#90FFFFFF</color>
    <color name="result_point_color">#C0FFFF00</color>
    <color name="laser_color">#0F0</color>
    <color name="corner_color">#00FF00</color>
    <!-- QRCode scanner color end -->
    <!-- 下面颜色为基色 -->
    <!-- 红色 -->
    <color name="red_F">#FF0000</color>
    <color name="red_E">#EE0000</color>
    <color name="red_C">#CC0000</color>
    <color name="red_A">#AA0000</color>
    <color name="red_8">#880000</color>
    <color name="red_6">#660000</color>
    <color name="red_4">#440000</color>
    <color name="red_2">#220000</color>
    <!-- 绿色 -->
    <color name="green_F">#00FF00</color>
    <color name="green_E">#00EE00</color>
    <color name="green_C">#00CC00</color>
    <color name="green_A">#00AA00</color>
    <color name="green_8">#008800</color>
    <color name="green_6">#006600</color>
    <color name="green_4">#004400</color>
    <color name="green_2">#002200</color>
    <!-- 蓝色 -->
    <color name="blue_F">#0000FF</color>
    <color name="blue_E">#0000EE</color>
    <color name="blue_C">#0000CC</color>
    <color name="blue_A">#0000AA</color>
    <color name="blue_8">#000088</color>
    <color name="blue_6">#000066</color>
    <color name="blue_4">#000044</color>
    <color name="blue_2">#000022</color>
    <!-- 黄色 -->
    <color name="yellow_F">#FFFF00</color>
    <color name="yellow_E">#EEEE00</color>
    <color name="yellow_C">#CCCC00</color>
    <color name="yellow_A">#AAAA00</color>
    <color name="yellow_8">#888800</color>
    <color name="yellow_6">#666600</color>
    <color name="yellow_4">#444400</color>
    <color name="yellow_2">#222200</color>
    <!-- 青色 -->
    <color name="cyan_F">#00FFFF</color>
    <color name="cyan_E">#00EEEE</color>
    <color name="cyan_C">#00CCCC</color>
    <color name="cyan_A">#00AAAA</color>
    <color name="cyan_8">#008888</color>
    <color name="cyan_6">#006666</color>
    <color name="cyan_4">#004444</color>
    <color name="cyan_2">#002222</color>
    <!-- 紫色 -->
    <color name="purple_F">#FF00FF</color>
    <color name="purple_E">#EE00EE</color>
    <color name="purple_C">#CC00CC</color>
    <color name="purple_A">#AA00AA</color>
    <color name="purple_8">#880088</color>
    <color name="purple_6">#660066</color>
    <color name="purple_4">#440044</color>
    <color name="purple_2">#220022</color>
    <!-- 天蓝色 -->
    <color name="blue_Sky_F">#88bfFF</color>
    <color name="blue_Sky_E">#77b2EE</color>
    <color name="blue_Sky_C">#6699CC</color>
    <color name="blue_Sky_A">#557FAA</color>
    <color name="blue_Sky_8">#446688</color>
    <color name="blue_Sky_6">#334C66</color>
    <color name="blue_Sky_4">#223344</color>
    <color name="blue_Sky_2">#111922</color>
    <!-- 淡蓝色 -->
    <color name="blue_light_F">#00bfFF</color>
    <color name="blue_light_E">#00b2EE</color>
    <color name="blue_light_C">#0099CC</color>
    <color name="blue_light_A">#007FAA</color>
    <color name="blue_light_8">#006688</color>
    <color name="blue_light_6">#004C66</color>
    <color name="blue_light_4">#003344</color>
    <color name="blue_light_2">#001922</color>
    <!-- 草绿色 -->
    <color name="green_grass_F">#00FFBF</color>
    <color name="green_grass_E">#00EEB2</color>
    <color name="green_grass_C">#00CC99</color>
    <color name="green_grass_A">#00AA7F</color>
    <color name="green_grass_8">#008866</color>
    <color name="green_grass_6">#00664C</color>
    <color name="green_grass_4">#004433</color>
    <color name="green_grass_2">#002219</color>
    <!-- 透明白色 -->
    <color name="trans_White_E">#efff</color>
    <color name="trans_White_C">#cfff</color>
    <color name="trans_White_A">#afff</color>
    <color name="trans_White_8">#8fff</color>
    <color name="trans_White_6">#6fff</color>
    <color name="trans_White_4">#4fff</color>
    <color name="trans_White_2">#2fff</color>
    <color name="trans_White_1">#1fff</color>
    <!-- 透明黑色 -->
    <color name="trans_Black_E">#e000</color>
    <color name="trans_Black_C">#c000</color>
    <color name="trans_Black_A">#a000</color>
    <color name="trans_Black_8">#8000</color>
    <color name="trans_Black_6">#6000</color>
    <color name="trans_Black_4">#4000</color>
    <color name="trans_Black_2">#2000</color>
    <color name="trans_Black_1">#1000</color>
    <!-- 灰色 -->
    <color name="gray_E">#eeeeee</color>
    <color name="gray_C">#cccccc</color>
    <color name="gray_A">#aaaaaa</color>
    <color name="gray_8">#888888</color>
    <color name="gray_6">#666666</color>
    <color name="gray_4">#444444</color>
    <color name="gray_2">#222222</color>
    <!-- 透明 -->
    <color name="trans">#0000</color>
    <!-- 淡蓝 -->
    <color name="blue2">#5EB4FF</color>
    <!-- 天依蓝 -->
    <color name="blue3">#66ccff</color>
    <!-- 蓝色 -->
    <color name="blue">#1B82d2</color>
    <!-- 蓝色字体 -->
    <color name="bluefont2">#003F7A</color>
    <!-- 蓝色字体 -->
    <color name="bluefont">#000F4A</color>
    <!-- 初音绿 -->
    <color name="chuyinlv">#39C5BB</color>
    <!-- Luka粉 -->
    <color name="lukafen">#FFBFCB</color>
    <!-- 红色 3 -->
    <color name="red3">#C03050</color>
    <!-- 红色 4 -->
    <color name="red4">#B5367F</color>
    <!-- 红色 5 -->
    <color name="red5">#F06060</color>

    <!-- item按下颜色 -->
    <color name="item_click">#605EB4FF</color>
    <!-- 序号 -->
    <color name="row_number">#E4595F</color>
    <!-- 半透明 蓝色 -->
    <color name="translucent_blue">#400078d7</color>
    <!-- list背景颜色 -->
    <color name="list_background">@color/translucent_blue</color>
    <!-- row_number_text_blue -->
    <color name="row_number_text_blue">#0B36C2</color>

    <!-- item按下颜色 -->
    <color name="item_click_up">#305EB4FF</color>

    <!-- list淡淡的蓝色 -->
    <color name="pale_blue">#100078d7</color>

    <!-- list淡淡的蓝色 -->
    <color name="keyboard_start">#B01A81DE</color>
    <!-- list淡淡的蓝色 -->
    <color name="keyboard_center">#F01A81DE</color>
    <!-- list淡淡的蓝色 -->
    <color name="keyboard_end">#A01A81DE</color>
    <!-- 红色 4 -->
    <color name="red_text">#F06060</color>
    <!-- 白中带绿 -->
    <color name="white_green">#C8FFC8</color>
</resources>


================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">串口通信</string>
    <string name="app_name_debug">串口通信(测试)</string>
    <string name="about_msg">串口通信\n\n
        安卓主板(工控机)原生串口支持,部分USB转串口支持。\n\n
        作者:余静  QQ:3373217\n
该程序是Android开源项目。\n\n
github地址:https://github.com/yutils/YSerialPort\n\n
	</string>
</resources>


================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>
    <style name="AppTheme_old" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!-- 按钮带颜色的主题 -->
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

================================================
FILE: app/src/main/res/xml/file_paths.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <paths>
        <external-path path="" name="download"/>
    </paths>
</resources>

================================================
FILE: app/src/main/res/xml/network_config.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

================================================
FILE: app/src/main/res/xml/provider_paths.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
    <external-path name="beta_external_path" path="Download/"/>
    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
    <external-path name="beta_external_files_path" path="Android/data/"/>
</paths>

================================================
FILE: app/src/main/res_screen/values/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp0">0.00dp</dimen>
<dimen name="dp1">1.00dp</dimen>
<dimen name="dp2">2.00dp</dimen>
<dimen name="dp3">3.00dp</dimen>
<dimen name="dp4">4.00dp</dimen>
<dimen name="dp5">5.00dp</dimen>
<dimen name="dp6">6.00dp</dimen>
<dimen name="dp7">7.00dp</dimen>
<dimen name="dp8">8.00dp</dimen>
<dimen name="dp9">9.00dp</dimen>
<dimen name="dp10">10.00dp</dimen>
<dimen name="dp11">11.00dp</dimen>
<dimen name="dp12">12.00dp</dimen>
<dimen name="dp13">13.00dp</dimen>
<dimen name="dp14">14.00dp</dimen>
<dimen name="dp15">15.00dp</dimen>
<dimen name="dp16">16.00dp</dimen>
<dimen name="dp17">17.00dp</dimen>
<dimen name="dp18">18.00dp</dimen>
<dimen name="dp19">19.00dp</dimen>
<dimen name="dp20">20.00dp</dimen>
<dimen name="dp21">21.00dp</dimen>
<dimen name="dp22">22.00dp</dimen>
<dimen name="dp23">23.00dp</dimen>
<dimen name="dp24">24.00dp</dimen>
<dimen name="dp25">25.00dp</dimen>
<dimen name="dp26">26.00dp</dimen>
<dimen name="dp27">27.00dp</dimen>
<dimen name="dp28">28.00dp</dimen>
<dimen name="dp29">29.00dp</dimen>
<dimen name="dp30">30.00dp</dimen>
<dimen name="dp31">31.00dp</dimen>
<dimen name="dp32">32.00dp</dimen>
<dimen name="dp33">33.00dp</dimen>
<dimen name="dp34">34.00dp</dimen>
<dimen name="dp35">35.00dp</dimen>
<dimen name="dp36">36.00dp</dimen>
<dimen name="dp37">37.00dp</dimen>
<dimen name="dp38">38.00dp</dimen>
<dimen name="dp39">39.00dp</dimen>
<dimen name="dp40">40.00dp</dimen>
<dimen name="dp41">41.00dp</dimen>
<dimen name="dp42">42.00dp</dimen>
<dimen name="dp43">43.00dp</dimen>
<dimen name="dp44">44.00dp</dimen>
<dimen name="dp45">45.00dp</dimen>
<dimen name="dp46">46.00dp</dimen>
<dimen name="dp47">47.00dp</dimen>
<dimen name="dp48">48.00dp</dimen>
<dimen name="dp49">49.00dp</dimen>
<dimen name="dp50">50.00dp</dimen>
<dimen name="dp51">51.00dp</dimen>
<dimen name="dp52">52.00dp</dimen>
<dimen name="dp53">53.00dp</dimen>
<dimen name="dp54">54.00dp</dimen>
<dimen name="dp55">55.00dp</dimen>
<dimen name="dp56">56.00dp</dimen>
<dimen name="dp57">57.00dp</dimen>
<dimen name="dp58">58.00dp</dimen>
<dimen name="dp59">59.00dp</dimen>
<dimen name="dp60">60.00dp</dimen>
<dimen name="dp61">61.00dp</dimen>
<dimen name="dp62">62.00dp</dimen>
<dimen name="dp63">63.00dp</dimen>
<dimen name="dp64">64.00dp</dimen>
<dimen name="dp65">65.00dp</dimen>
<dimen name="dp66">66.00dp</dimen>
<dimen name="dp67">67.00dp</dimen>
<dimen name="dp68">68.00dp</dimen>
<dimen name="dp69">69.00dp</dimen>
<dimen name="dp70">70.00dp</dimen>
<dimen name="dp71">71.00dp</dimen>
<dimen name="dp72">72.00dp</dimen>
<dimen name="dp73">73.00dp</dimen>
<dimen name="dp74">74.00dp</dimen>
<dimen name="dp75">75.00dp</dimen>
<dimen name="dp76">76.00dp</dimen>
<dimen name="dp77">77.00dp</dimen>
<dimen name="dp78">78.00dp</dimen>
<dimen name="dp79">79.00dp</dimen>
<dimen name="dp80">80.00dp</dimen>
<dimen name="dp81">81.00dp</dimen>
<dimen name="dp82">82.00dp</dimen>
<dimen name="dp83">83.00dp</dimen>
<dimen name="dp84">84.00dp</dimen>
<dimen name="dp85">85.00dp</dimen>
<dimen name="dp86">86.00dp</dimen>
<dimen name="dp87">87.00dp</dimen>
<dimen name="dp88">88.00dp</dimen>
<dimen name="dp89">89.00dp</dimen>
<dimen name="dp90">90.00dp</dimen>
<dimen name="dp91">91.00dp</dimen>
<dimen name="dp92">92.00dp</dimen>
<dimen name="dp93">93.00dp</dimen>
<dimen name="dp94">94.00dp</dimen>
<dimen name="dp95">95.00dp</dimen>
<dimen name="dp96">96.00dp</dimen>
<dimen name="dp97">97.00dp</dimen>
<dimen name="dp98">98.00dp</dimen>
<dimen name="dp99">99.00dp</dimen>
<dimen name="dp100">100.00dp</dimen>
<dimen name="dp101">101.00dp</dimen>
<dimen name="dp102">102.00dp</dimen>
<dimen name="dp103">103.00dp</dimen>
<dimen name="dp104">104.00dp</dimen>
<dimen name="dp105">105.00dp</dimen>
<dimen name="dp106">106.00dp</dimen>
<dimen name="dp107">107.00dp</dimen>
<dimen name="dp108">108.00dp</dimen>
<dimen name="dp109">109.00dp</dimen>
<dimen name="dp110">110.00dp</dimen>
<dimen name="dp111">111.00dp</dimen>
<dimen name="dp112">112.00dp</dimen>
<dimen name="dp113">113.00dp</dimen>
<dimen name="dp114">114.00dp</dimen>
<dimen name="dp115">115.00dp</dimen>
<dimen name="dp116">116.00dp</dimen>
<dimen name="dp117">117.00dp</dimen>
<dimen name="dp118">118.00dp</dimen>
<dimen name="dp119">119.00dp</dimen>
<dimen name="dp120">120.00dp</dimen>
<dimen name="dp121">121.00dp</dimen>
<dimen name="dp122">122.00dp</dimen>
<dimen name="dp123">123.00dp</dimen>
<dimen name="dp124">124.00dp</dimen>
<dimen name="dp125">125.00dp</dimen>
<dimen name="dp126">126.00dp</dimen>
<dimen name="dp127">127.00dp</dimen>
<dimen name="dp128">128.00dp</dimen>
<dimen name="dp129">129.00dp</dimen>
<dimen name="dp130">130.00dp</dimen>
<dimen name="dp131">131.00dp</dimen>
<dimen name="dp132">132.00dp</dimen>
<dimen name="dp133">133.00dp</dimen>
<dimen name="dp134">134.00dp</dimen>
<dimen name="dp135">135.00dp</dimen>
<dimen name="dp136">136.00dp</dimen>
<dimen name="dp137">137.00dp</dimen>
<dimen name="dp138">138.00dp</dimen>
<dimen name="dp139">139.00dp</dimen>
<dimen name="dp140">140.00dp</dimen>
<dimen name="dp141">141.00dp</dimen>
<dimen name="dp142">142.00dp</dimen>
<dimen name="dp143">143.00dp</dimen>
<dimen name="dp144">144.00dp</dimen>
<dimen name="dp145">145.00dp</dimen>
<dimen name="dp146">146.00dp</dimen>
<dimen name="dp147">147.00dp</dimen>
<dimen name="dp148">148.00dp</dimen>
<dimen name="dp149">149.00dp</dimen>
<dimen name="dp150">150.00dp</dimen>
<dimen name="dp151">151.00dp</dimen>
<dimen name="dp152">152.00dp</dimen>
<dimen name="dp153">153.00dp</dimen>
<dimen name="dp154">154.00dp</dimen>
<dimen name="dp155">155.00dp</dimen>
<dimen name="dp156">156.00dp</dimen>
<dimen name="dp157">157.00dp</dimen>
<dimen name="dp158">158.00dp</dimen>
<dimen name="dp159">159.00dp</dimen>
<dimen name="dp160">160.00dp</dimen>
<dimen name="dp161">161.00dp</dimen>
<dimen name="dp162">162.00dp</dimen>
<dimen name="dp163">163.00dp</dimen>
<dimen name="dp164">164.00dp</dimen>
<dimen name="dp165">165.00dp</dimen>
<dimen name="dp166">166.00dp</dimen>
<dimen name="dp167">167.00dp</dimen>
<dimen name="dp168">168.00dp</dimen>
<dimen name="dp169">169.00dp</dimen>
<dimen name="dp170">170.00dp</dimen>
<dimen name="dp171">171.00dp</dimen>
<dimen name="dp172">172.00dp</dimen>
<dimen name="dp173">173.00dp</dimen>
<dimen name="dp174">174.00dp</dimen>
<dimen name="dp175">175.00dp</dimen>
<dimen name="dp176">176.00dp</dimen>
<dimen name="dp177">177.00dp</dimen>
<dimen name="dp178">178.00dp</dimen>
<dimen name="dp179">179.00dp</dimen>
<dimen name="dp180">180.00dp</dimen>
<dimen name="dp181">181.00dp</dimen>
<dimen name="dp182">182.00dp</dimen>
<dimen name="dp183">183.00dp</dimen>
<dimen name="dp184">184.00dp</dimen>
<dimen name="dp185">185.00dp</dimen>
<dimen name="dp186">186.00dp</dimen>
<dimen name="dp187">187.00dp</dimen>
<dimen name="dp188">188.00dp</dimen>
<dimen name="dp189">189.00dp</dimen>
<dimen name="dp190">190.00dp</dimen>
<dimen name="dp191">191.00dp</dimen>
<dimen name="dp192">192.00dp</dimen>
<dimen name="dp193">193.00dp</dimen>
<dimen name="dp194">194.00dp</dimen>
<dimen name="dp195">195.00dp</dimen>
<dimen name="dp196">196.00dp</dimen>
<dimen name="dp197">197.00dp</dimen>
<dimen name="dp198">198.00dp</dimen>
<dimen name="dp199">199.00dp</dimen>
<dimen name="dp200">200.00dp</dimen>
<dimen name="dp201">201.00dp</dimen>
<dimen name="dp202">202.00dp</dimen>
<dimen name="dp203">203.00dp</dimen>
<dimen name="dp204">204.00dp</dimen>
<dimen name="dp205">205.00dp</dimen>
<dimen name="dp206">206.00dp</dimen>
<dimen name="dp207">207.00dp</dimen>
<dimen name="dp208">208.00dp</dimen>
<dimen name="dp209">209.00dp</dimen>
<dimen name="dp210">210.00dp</dimen>
<dimen name="dp211">211.00dp</dimen>
<dimen name="dp212">212.00dp</dimen>
<dimen name="dp213">213.00dp</dimen>
<dimen name="dp214">214.00dp</dimen>
<dimen name="dp215">215.00dp</dimen>
<dimen name="dp216">216.00dp</dimen>
<dimen name="dp217">217.00dp</dimen>
<dimen name="dp218">218.00dp</dimen>
<dimen name="dp219">219.00dp</dimen>
<dimen name="dp220">220.00dp</dimen>
<dimen name="dp221">221.00dp</dimen>
<dimen name="dp222">222.00dp</dimen>
<dimen name="dp223">223.00dp</dimen>
<dimen name="dp224">224.00dp</dimen>
<dimen name="dp225">225.00dp</dimen>
<dimen name="dp226">226.00dp</dimen>
<dimen name="dp227">227.00dp</dimen>
<dimen name="dp228">228.00dp</dimen>
<dimen name="dp229">229.00dp</dimen>
<dimen name="dp230">230.00dp</dimen>
<dimen name="dp231">231.00dp</dimen>
<dimen name="dp232">232.00dp</dimen>
<dimen name="dp233">233.00dp</dimen>
<dimen name="dp234">234.00dp</dimen>
<dimen name="dp235">235.00dp</dimen>
<dimen name="dp236">236.00dp</dimen>
<dimen name="dp237">237.00dp</dimen>
<dimen name="dp238">238.00dp</dimen>
<dimen name="dp239">239.00dp</dimen>
<dimen name="dp240">240.00dp</dimen>
<dimen name="dp241">241.00dp</dimen>
<dimen name="dp242">242.00dp</dimen>
<dimen name="dp243">243.00dp</dimen>
<dimen name="dp244">244.00dp</dimen>
<dimen name="dp245">245.00dp</dimen>
<dimen name="dp246">246.00dp</dimen>
<dimen name="dp247">247.00dp</dimen>
<dimen name="dp248">248.00dp</dimen>
<dimen name="dp249">249.00dp</dimen>
<dimen name="dp250">250.00dp</dimen>
<dimen name="dp251">251.00dp</dimen>
<dimen name="dp252">252.00dp</dimen>
<dimen name="dp253">253.00dp</dimen>
<dimen name="dp254">254.00dp</dimen>
<dimen name="dp255">255.00dp</dimen>
<dimen name="dp256">256.00dp</dimen>
<dimen name="dp257">257.00dp</dimen>
<dimen name="dp258">258.00dp</dimen>
<dimen name="dp259">259.00dp</dimen>
<dimen name="dp260">260.00dp</dimen>
<dimen name="dp261">261.00dp</dimen>
<dimen name="dp262">262.00dp</dimen>
<dimen name="dp263">263.00dp</dimen>
<dimen name="dp264">264.00dp</dimen>
<dimen name="dp265">265.00dp</dimen>
<dimen name="dp266">266.00dp</dimen>
<dimen name="dp267">267.00dp</dimen>
<dimen name="dp268">268.00dp</dimen>
<dimen name="dp269">269.00dp</dimen>
<dimen name="dp270">270.00dp</dimen>
<dimen name="dp271">271.00dp</dimen>
<dimen name="dp272">272.00dp</dimen>
<dimen name="dp273">273.00dp</dimen>
<dimen name="dp274">274.00dp</dimen>
<dimen name="dp275">275.00dp</dimen>
<dimen name="dp276">276.00dp</dimen>
<dimen name="dp277">277.00dp</dimen>
<dimen name="dp278">278.00dp</dimen>
<dimen name="dp279">279.00dp</dimen>
<dimen name="dp280">280.00dp</dimen>
<dimen name="dp281">281.00dp</dimen>
<dimen name="dp282">282.00dp</dimen>
<dimen name="dp283">283.00dp</dimen>
<dimen name="dp284">284.00dp</dimen>
<dimen name="dp285">285.00dp</dimen>
<dimen name="dp286">286.00dp</dimen>
<dimen name="dp287">287.00dp</dimen>
<dimen name="dp288">288.00dp</dimen>
<dimen name="dp289">289.00dp</dimen>
<dimen name="dp290">290.00dp</dimen>
<dimen name="dp291">291.00dp</dimen>
<dimen name="dp292">292.00dp</dimen>
<dimen name="dp293">293.00dp</dimen>
<dimen name="dp294">294.00dp</dimen>
<dimen name="dp295">295.00dp</dimen>
<dimen name="dp296">296.00dp</dimen>
<dimen name="dp297">297.00dp</dimen>
<dimen name="dp298">298.00dp</dimen>
<dimen name="dp299">299.00dp</dimen>
<dimen name="dp300">300.00dp</dimen>
<dimen name="dp301">301.00dp</dimen>
<dimen name="dp302">302.00dp</dimen>
<dimen name="dp303">303.00dp</dimen>
<dimen name="dp304">304.00dp</dimen>
<dimen name="dp305">305.00dp</dimen>
<dimen name="dp306">306.00dp</dimen>
<dimen name="dp307">307.00dp</dimen>
<dimen name="dp308">308.00dp</dimen>
<dimen name="dp309">309.00dp</dimen>
<dimen name="dp310">310.00dp</dimen>
<dimen name="dp311">311.00dp</dimen>
<dimen name="dp312">312.00dp</dimen>
<dimen name="dp313">313.00dp</dimen>
<dimen name="dp314">314.00dp</dimen>
<dimen name="dp315">315.00dp</dimen>
<dimen name="dp316">316.00dp</dimen>
<dimen name="dp317">317.00dp</dimen>
<dimen name="dp318">318.00dp</dimen>
<dimen name="dp319">319.00dp</dimen>
<dimen name="dp320">320.00dp</dimen>
<dimen name="dp321">321.00dp</dimen>
<dimen name="dp322">322.00dp</dimen>
<dimen name="dp323">323.00dp</dimen>
<dimen name="dp324">324.00dp</dimen>
<dimen name="dp325">325.00dp</dimen>
<dimen name="dp326">326.00dp</dimen>
<dimen name="dp327">327.00dp</dimen>
<dimen name="dp328">328.00dp</dimen>
<dimen name="dp329">329.00dp</dimen>
<dimen name="dp330">330.00dp</dimen>
<dimen name="dp331">331.00dp</dimen>
<dimen name="dp332">332.00dp</dimen>
<dimen name="dp333">333.00dp</dimen>
<dimen name="dp334">334.00dp</dimen>
<dimen name="dp335">335.00dp</dimen>
<dimen name="dp336">336.00dp</dimen>
<dimen name="dp337">337.00dp</dimen>
<dimen name="dp338">338.00dp</dimen>
<dimen name="dp339">339.00dp</dimen>
<dimen name="dp340">340.00dp</dimen>
<dimen name="dp341">341.00dp</dimen>
<dimen name="dp342">342.00dp</dimen>
<dimen name="dp343">343.00dp</dimen>
<dimen name="dp344">344.00dp</dimen>
<dimen name="dp345">345.00dp</dimen>
<dimen name="dp346">346.00dp</dimen>
<dimen name="dp347">347.00dp</dimen>
<dimen name="dp348">348.00dp</dimen>
<dimen name="dp349">349.00dp</dimen>
<dimen name="dp350">350.00dp</dimen>
<dimen name="dp351">351.00dp</dimen>
<dimen name="dp352">352.00dp</dimen>
<dimen name="dp353">353.00dp</dimen>
<dimen name="dp354">354.00dp</dimen>
<dimen name="dp355">355.00dp</dimen>
<dimen name="dp356">356.00dp</dimen>
<dimen name="dp357">357.00dp</dimen>
<dimen name="dp358">358.00dp</dimen>
<dimen name="dp359">359.00dp</dimen>
<dimen name="dp360">360.00dp</dimen>
<dimen name="dp361">361.00dp</dimen>
<dimen name="dp362">362.00dp</dimen>
<dimen name="dp363">363.00dp</dimen>
<dimen name="dp364">364.00dp</dimen>
<dimen name="dp365">365.00dp</dimen>
<dimen name="dp366">366.00dp</dimen>
<dimen name="dp367">367.00dp</dimen>
<dimen name="dp368">368.00dp</dimen>
<dimen name="dp369">369.00dp</dimen>
<dimen name="dp370">370.00dp</dimen>
<dimen name="dp371">371.00dp</dimen>
<dimen name="dp372">372.00dp</dimen>
<dimen name="dp373">373.00dp</dimen>
<dimen name="dp374">374.00dp</dimen>
<dimen name="dp375">375.00dp</dimen>
<dimen name="dp376">376.00dp</dimen>
<dimen name="dp377">377.00dp</dimen>
<dimen name="dp378">378.00dp</dimen>
<dimen name="dp379">379.00dp</dimen>
<dimen name="dp380">380.00dp</dimen>
<dimen name="dp381">381.00dp</dimen>
<dimen name="dp382">382.00dp</dimen>
<dimen name="dp383">383.00dp</dimen>
<dimen name="dp384">384.00dp</dimen>
<dimen name="dp385">385.00dp</dimen>
<dimen name="dp386">386.00dp</dimen>
<dimen name="dp387">387.00dp</dimen>
<dimen name="dp388">388.00dp</dimen>
<dimen name="dp389">389.00dp</dimen>
<dimen name="dp390">390.00dp</dimen>
<dimen name="dp391">391.00dp</dimen>
<dimen name="dp392">392.00dp</dimen>
<dimen name="dp393">393.00dp</dimen>
<dimen name="dp394">394.00dp</dimen>
<dimen name="dp395">395.00dp</dimen>
<dimen name="dp396">396.00dp</dimen>
<dimen name="dp397">397.00dp</dimen>
<dimen name="dp398">398.00dp</dimen>
<dimen name="dp399">399.00dp</dimen>
<dimen name="dp400">400.00dp</dimen>
<dimen name="dp401">401.00dp</dimen>
<dimen name="dp402">402.00dp</dimen>
<dimen name="dp403">403.00dp</dimen>
<dimen name="dp404">404.00dp</dimen>
<dimen name="dp405">405.00dp</dimen>
<dimen name="dp406">406.00dp</dimen>
<dimen name="dp407">407.00dp</dimen>
<dimen name="dp408">408.00dp</dimen>
<dimen name="dp409">409.00dp</dimen>
<dimen name="dp410">410.00dp</dimen>
<dimen name="dp411">411.00dp</dimen>
<dimen name="dp412">412.00dp</dimen>
<dimen name="dp413">413.00dp</dimen>
<dimen name="dp414">414.00dp</dimen>
<dimen name="dp415">415.00dp</dimen>
<dimen name="dp416">416.00dp</dimen>
<dimen name="dp417">417.00dp</dimen>
<dimen name="dp418">418.00dp</dimen>
<dimen name="dp419">419.00dp</dimen>
<dimen name="dp420">420.00dp</dimen>
<dimen name="dp421">421.00dp</dimen>
<dimen name="dp422">422.00dp</dimen>
<dimen name="dp423">423.00dp</dimen>
<dimen name="dp424">424.00dp</dimen>
<dimen name="dp425">425.00dp</dimen>
<dimen name="dp426">426.00dp</dimen>
<dimen name="dp427">427.00dp</dimen>
<dimen name="dp428">428.00dp</dimen>
<dimen name="dp429">429.00dp</dimen>
<dimen name="dp430">430.00dp</dimen>
<dimen name="dp431">431.00dp</dimen>
<dimen name="dp432">432.00dp</dimen>
<dimen name="dp433">433.00dp</dimen>
<dimen name="dp434">434.00dp</dimen>
<dimen name="dp435">435.00dp</dimen>
<dimen name="dp436">436.00dp</dimen>
<dimen name="dp437">437.00dp</dimen>
<dimen name="dp438">438.00dp</dimen>
<dimen name="dp439">439.00dp</dimen>
<dimen name="dp440">440.00dp</dimen>
<dimen name="dp441">441.00dp</dimen>
<dimen name="dp442">442.00dp</dimen>
<dimen name="dp443">443.00dp</dimen>
<dimen name="dp444">444.00dp</dimen>
<dimen name="dp445">445.00dp</dimen>
<dimen name="dp446">446.00dp</dimen>
<dimen name="dp447">447.00dp</dimen>
<dimen name="dp448">448.00dp</dimen>
<dimen name="dp449">449.00dp</dimen>
<dimen name="dp450">450.00dp</dimen>
<dimen name="dp451">451.00dp</dimen>
<dimen name="dp452">452.00dp</dimen>
<dimen name="dp453">453.00dp</dimen>
<dimen name="dp454">454.00dp</dimen>
<dimen name="dp455">455.00dp</dimen>
<dimen name="dp456">456.00dp</dimen>
<dimen name="dp457">457.00dp</dimen>
<dimen name="dp458">458.00dp</dimen>
<dimen name="dp459">459.00dp</dimen>
<dimen name="dp460">460.00dp</dimen>
<dimen name="dp461">461.00dp</dimen>
<dimen name="dp462">462.00dp</dimen>
<dimen name="dp463">463.00dp</dimen>
<dimen name="dp464">464.00dp</dimen>
<dimen name="dp465">465.00dp</dimen>
<dimen name="dp466">466.00dp</dimen>
<dimen name="dp467">467.00dp</dimen>
<dimen name="dp468">468.00dp</dimen>
<dimen name="dp469">469.00dp</dimen>
<dimen name="dp470">470.00dp</dimen>
<dimen name="dp471">471.00dp</dimen>
<dimen name="dp472">472.00dp</dimen>
<dimen name="dp473">473.00dp</dimen>
<dimen name="dp474">474.00dp</dimen>
<dimen name="dp475">475.00dp</dimen>
<dimen name="dp476">476.00dp</dimen>
<dimen name="dp477">477.00dp</dimen>
<dimen name="dp478">478.00dp</dimen>
<dimen name="dp479">479.00dp</dimen>
<dimen name="dp480">480.00dp</dimen>
<dimen name="dp481">481.00dp</dimen>
<dimen name="dp482">482.00dp</dimen>
<dimen name="dp483">483.00dp</dimen>
<dimen name="dp484">484.00dp</dimen>
<dimen name="dp485">485.00dp</dimen>
<dimen name="dp486">486.00dp</dimen>
<dimen name="dp487">487.00dp</dimen>
<dimen name="dp488">488.00dp</dimen>
<dimen name="dp489">489.00dp</dimen>
<dimen name="dp490">490.00dp</dimen>
<dimen name="dp491">491.00dp</dimen>
<dimen name="dp492">492.00dp</dimen>
<dimen name="dp493">493.00dp</dimen>
<dimen name="dp494">494.00dp</dimen>
<dimen name="dp495">495.00dp</dimen>
<dimen name="dp496">496.00dp</dimen>
<dimen name="dp497">497.00dp</dimen>
<dimen name="dp498">498.00dp</dimen>
<dimen name="dp499">499.00dp</dimen>
<dimen name="dp500">500.00dp</dimen>
<dimen name="dp501">501.00dp</dimen>
<dimen name="dp502">502.00dp</dimen>
<dimen name="dp503">503.00dp</dimen>
<dimen name="dp504">504.00dp</dimen>
<dimen name="dp505">505.00dp</dimen>
<dimen name="dp506">506.00dp</dimen>
<dimen name="dp507">507.00dp</dimen>
<dimen name="dp508">508.00dp</dimen>
<dimen name="dp509">509.00dp</dimen>
<dimen name="dp510">510.00dp</dimen>
<dimen name="dp511">511.00dp</dimen>
<dimen name="dp512">512.00dp</dimen>
<dimen name="dp513">513.00dp</dimen>
<dimen name="dp514">514.00dp</dimen>
<dimen name="dp515">515.00dp</dimen>
<dimen name="dp516">516.00dp</dimen>
<dimen name="dp517">517.00dp</dimen>
<dimen name="dp518">518.00dp</dimen>
<dimen name="dp519">519.00dp</dimen>
<dimen name="dp520">520.00dp</dimen>
<dimen name="dp521">521.00dp</dimen>
<dimen name="dp522">522.00dp</dimen>
<dimen name="dp523">523.00dp</dimen>
<dimen name="dp524">524.00dp</dimen>
<dimen name="dp525">525.00dp</dimen>
<dimen name="dp526">526.00dp</dimen>
<dimen name="dp527">527.00dp</dimen>
<dimen name="dp528">528.00dp</dimen>
<dimen name="dp529">529.00dp</dimen>
<dimen name="dp530">530.00dp</dimen>
<dimen name="dp531">531.00dp</dimen>
<dimen name="dp532">532.00dp</dimen>
<dimen name="dp533">533.00dp</dimen>
<dimen name="dp534">534.00dp</dimen>
<dimen name="dp535">535.00dp</dimen>
<dimen name="dp536">536.00dp</dimen>
<dimen name="dp537">537.00dp</dimen>
<dimen name="dp538">538.00dp</dimen>
<dimen name="dp539">539.00dp</dimen>
<dimen name="dp540">540.00dp</dimen>
<dimen name="dp541">541.00dp</dimen>
<dimen name="dp542">542.00dp</dimen>
<dimen name="dp543">543.00dp</dimen>
<dimen name="dp544">544.00dp</dimen>
<dimen name="dp545">545.00dp</dimen>
<dimen name="dp546">546.00dp</dimen>
<dimen name="dp547">547.00dp</dimen>
<dimen name="dp548">548.00dp</dimen>
<dimen name="dp549">549.00dp</dimen>
<dimen name="dp550">550.00dp</dimen>
<dimen name="dp551">551.00dp</dimen>
<dimen name="dp552">552.00dp</dimen>
<dimen name="dp553">553.00dp</dimen>
<dimen name="dp554">554.00dp</dimen>
<dimen name="dp555">555.00dp</dimen>
<dimen name="dp556">556.00dp</dimen>
<dimen name="dp557">557.00dp</dimen>
<dimen name="dp558">558.00dp</dimen>
<dimen name="dp559">559.00dp</dimen>
<dimen name="dp560">560.00dp</dimen>
<dimen name="dp561">561.00dp</dimen>
<dimen name="dp562">562.00dp</dimen>
<dimen name="dp563">563.00dp</dimen>
<dimen name="dp564">564.00dp</dimen>
<dimen name="dp565">565.00dp</dimen>
<dimen name="dp566">566.00dp</dimen>
<dimen name="dp567">567.00dp</dimen>
<dimen name="dp568">568.00dp</dimen>
<dimen name="dp569">569.00dp</dimen>
<dimen name="dp570">570.00dp</dimen>
<dimen name="dp571">571.00dp</dimen>
<dimen name="dp572">572.00dp</dimen>
<dimen name="dp573">573.00dp</dimen>
<dimen name="dp574">574.00dp</dimen>
<dimen name="dp575">575.00dp</dimen>
<dimen name="dp576">576.00dp</dimen>
<dimen name="dp577">577.00dp</dimen>
<dimen name="dp578">578.00dp</dimen>
<dimen name="dp579">579.00dp</dimen>
<dimen name="dp580">580.00dp</dimen>
<dimen name="dp581">581.00dp</dimen>
<dimen name="dp582">582.00dp</dimen>
<dimen name="dp583">583.00dp</dimen>
<dimen name="dp584">584.00dp</dimen>
<dimen name="dp585">585.00dp</dimen>
<dimen name="dp586">586.00dp</dimen>
<dimen name="dp587">587.00dp</dimen>
<dimen name="dp588">588.00dp</dimen>
<dimen name="dp589">589.00dp</dimen>
<dimen name="dp590">590.00dp</dimen>
<dimen name="dp591">591.00dp</dimen>
<dimen name="dp592">592.00dp</dimen>
<dimen name="dp593">593.00dp</dimen>
<dimen name="dp594">594.00dp</dimen>
<dimen name="dp595">595.00dp</dimen>
<dimen name="dp596">596.00dp</dimen>
<dimen name="dp597">597.00dp</dimen>
<dimen name="dp598">598.00dp</dimen>
<dimen name="dp599">599.00dp</dimen>
<dimen name="dp600">600.00dp</dimen>
<dimen name="dp601">601.00dp</dimen>
<dimen name="dp602">602.00dp</dimen>
<dimen name="dp603">603.00dp</dimen>
<dimen name="dp604">604.00dp</dimen>
<dimen name="dp605">605.00dp</dimen>
<dimen name="dp606">606.00dp</dimen>
<dimen name="dp607">607.00dp</dimen>
<dimen name="dp608">608.00dp</dimen>
<dimen name="dp609">609.00dp</dimen>
<dimen name="dp610">610.00dp</dimen>
<dimen name="dp611">611.00dp</dimen>
<dimen name="dp612">612.00dp</dimen>
<dimen name="dp613">613.00dp</dimen>
<dimen name="dp614">614.00dp</dimen>
<dimen name="dp615">615.00dp</dimen>
<dimen name="dp616">616.00dp</dimen>
<dimen name="dp617">617.00dp</dimen>
<dimen name="dp618">618.00dp</dimen>
<dimen name="dp619">619.00dp</dimen>
<dimen name="dp620">620.00dp</dimen>
<dimen name="dp621">621.00dp</dimen>
<dimen name="dp622">622.00dp</dimen>
<dimen name="dp623">623.00dp</dimen>
<dimen name="dp624">624.00dp</dimen>
<dimen name="dp625">625.00dp</dimen>
<dimen name="dp626">626.00dp</dimen>
<dimen name="dp627">627.00dp</dimen>
<dimen name="dp628">628.00dp</dimen>
<dimen name="dp629">629.00dp</dimen>
<dimen name="dp630">630.00dp</dimen>
<dimen name="dp631">631.00dp</dimen>
<dimen name="dp632">632.00dp</dimen>
<dimen name="dp633">633.00dp</dimen>
<dimen name="dp634">634.00dp</dimen>
<dimen name="dp635">635.00dp</dimen>
<dimen name="dp636">636.00dp</dimen>
<dimen name="dp637">637.00dp</dimen>
<dimen name="dp638">638.00dp</dimen>
<dimen name="dp639">639.00dp</dimen>
<dimen name="dp640">640.00dp</dimen>
<dimen name="dp641">641.00dp</dimen>
<dimen name="dp642">642.00dp</dimen>
<dimen name="dp643">643.00dp</dimen>
<dimen name="dp644">644.00dp</dimen>
<dimen name="dp645">645.00dp</dimen>
<dimen name="dp646">646.00dp</dimen>
<dimen name="dp647">647.00dp</dimen>
<dimen name="dp648">648.00dp</dimen>
<dimen name="dp649">649.00dp</dimen>
<dimen name="dp650">650.00dp</dimen>
<dimen name="dp651">651.00dp</dimen>
<dimen name="dp652">652.00dp</dimen>
<dimen name="dp653">653.00dp</dimen>
<dimen name="dp654">654.00dp</dimen>
<dimen name="dp655">655.00dp</dimen>
<dimen name="dp656">656.00dp</dimen>
<dimen name="dp657">657.00dp</dimen>
<dimen name="dp658">658.00dp</dimen>
<dimen name="dp659">659.00dp</dimen>
<dimen name="dp660">660.00dp</dimen>
<dimen name="dp661">661.00dp</dimen>
<dimen name="dp662">662.00dp</dimen>
<dimen name="dp663">663.00dp</dimen>
<dimen name="dp664">664.00dp</dimen>
<dimen name="dp665">665.00dp</dimen>
<dimen name="dp666">666.00dp</dimen>
<dimen name="dp667">667.00dp</dimen>
<dimen name="dp668">668.00dp</dimen>
<dimen name="dp669">669.00dp</dimen>
<dimen name="dp670">670.00dp</dimen>
<dimen name="dp671">671.00dp</dimen>
<dimen name="dp672">672.00dp</dimen>
<dimen name="dp673">673.00dp</dimen>
<dimen name="dp674">674.00dp</dimen>
<dimen name="dp675">675.00dp</dimen>
<dimen name="dp676">676.00dp</dimen>
<dimen name="dp677">677.00dp</dimen>
<dimen name="dp678">678.00dp</dimen>
<dimen name="dp679">679.00dp</dimen>
<dimen name="dp680">680.00dp</dimen>
<dimen name="dp681">681.00dp</dimen>
<dimen name="dp682">682.00dp</dimen>
<dimen name="dp683">683.00dp</dimen>
<dimen name="dp684">684.00dp</dimen>
<dimen name="dp685">685.00dp</dimen>
<dimen name="dp686">686.00dp</dimen>
<dimen name="dp687">687.00dp</dimen>
<dimen name="dp688">688.00dp</dimen>
<dimen name="dp689">689.00dp</dimen>
<dimen name="dp690">690.00dp</dimen>
<dimen name="dp691">691.00dp</dimen>
<dimen name="dp692">692.00dp</dimen>
<dimen name="dp693">693.00dp</dimen>
<dimen name="dp694">694.00dp</dimen>
<dimen name="dp695">695.00dp</dimen>
<dimen name="dp696">696.00dp</dimen>
<dimen name="dp697">697.00dp</dimen>
<dimen name="dp698">698.00dp</dimen>
<dimen name="dp699">699.00dp</dimen>
<dimen name="dp700">700.00dp</dimen>
<dimen name="dp701">701.00dp</dimen>
<dimen name="dp702">702.00dp</dimen>
<dimen name="dp703">703.00dp</dimen>
<dimen name="dp704">704.00dp</dimen>
<dimen name="dp705">705.00dp</dimen>
<dimen name="dp706">706.00dp</dimen>
<dimen name="dp707">707.00dp</dimen>
<dimen name="dp708">708.00dp</dimen>
<dimen name="dp709">709.00dp</dimen>
<dimen name="dp710">710.00dp</dimen>
<dimen name="dp711">711.00dp</dimen>
<dimen name="dp712">712.00dp</dimen>
<dimen name="dp713">713.00dp</dimen>
<dimen name="dp714">714.00dp</dimen>
<dimen name="dp715">715.00dp</dimen>
<dimen name="dp716">716.00dp</dimen>
<dimen name="dp717">717.00dp</dimen>
<dimen name="dp718">718.00dp</dimen>
<dimen name="dp719">719.00dp</dimen>
<dimen name="dp720">720.00dp</dimen>
<dimen name="sp0">0.00sp</dimen>
<dimen name="sp1">1.00sp</dimen>
<dimen name="sp2">2.00sp</dimen>
<dimen name="sp3">3.00sp</dimen>
<dimen name="sp4">4.00sp</dimen>
<dimen name="sp5">5.00sp</dimen>
<dimen name="sp6">6.00sp</dimen>
<dimen name="sp7">7.00sp</dimen>
<dimen name="sp8">8.00sp</dimen>
<dimen name="sp9">9.00sp</dimen>
<dimen name="sp10">10.00sp</dimen>
<dimen name="sp11">11.00sp</dimen>
<dimen name="sp12">12.00sp</dimen>
<dimen name="sp13">13.00sp</dimen>
<dimen name="sp14">14.00sp</dimen>
<dimen name="sp15">15.00sp</dimen>
<dimen name="sp16">16.00sp</dimen>
<dimen name="sp17">17.00sp</dimen>
<dimen name="sp18">18.00sp</dimen>
<dimen name="sp19">19.00sp</dimen>
<dimen name="sp20">20.00sp</dimen>
<dimen name="sp21">21.00sp</dimen>
<dimen name="sp22">22.00sp</dimen>
<dimen name="sp23">23.00sp</dimen>
<dimen name="sp24">24.00sp</dimen>
<dimen name="sp25">25.00sp</dimen>
<dimen name="sp26">26.00sp</dimen>
<dimen name="sp27">27.00sp</dimen>
<dimen name="sp28">28.00sp</dimen>
<dimen name="sp29">29.00sp</dimen>
<dimen name="sp30">30.00sp</dimen>
<dimen name="sp31">31.00sp</dimen>
<dimen name="sp32">32.00sp</dimen>
<dimen name="sp33">33.00sp</dimen>
<dimen name="sp34">34.00sp</dimen>
<dimen name="sp35">35.00sp</dimen>
<dimen name="sp36">36.00sp</dimen>
<dimen name="sp37">37.00sp</dimen>
<dimen name="sp38">38.00sp</dimen>
<dimen name="sp39">39.00sp</dimen>
<dimen name="sp40">40.00sp</dimen>
<dimen name="sp41">41.00sp</dimen>
<dimen name="sp42">42.00sp</dimen>
<dimen name="sp43">43.00sp</dimen>
<dimen name="sp44">44.00sp</dimen>
<dimen name="sp45">45.00sp</dimen>
<dimen name="sp46">46.00sp</dimen>
<dimen name="sp47">47.00sp</dimen>
<dimen name="sp48">48.00sp</dimen>
<dimen name="sp49">49.00sp</dimen>
<dimen name="sp50">50.00sp</dimen>
<dimen name="sp51">51.00sp</dimen>
<dimen name="sp52">52.00sp</dimen>
<dimen name="sp53">53.00sp</dimen>
<dimen name="sp54">54.00sp</dimen>
<dimen name="sp55">55.00sp</dimen>
<dimen name="sp56">56.00sp</dimen>
<dimen name="sp57">57.00sp</dimen>
<dimen name="sp58">58.00sp</dimen>
<dimen name="sp59">59.00sp</dimen>
<dimen name="sp60">60.00sp</dimen>
<dimen name="sp61">61.00sp</dimen>
<dimen name="sp62">62.00sp</dimen>
<dimen name="sp63">63.00sp</dimen>
<dimen name="sp64">64.00sp</dimen>
<dimen name="sp65">65.00sp</dimen>
<dimen name="sp66">66.00sp</dimen>
<dimen name="sp67">67.00sp</dimen>
<dimen name="sp68">68.00sp</dimen>
<dimen name="sp69">69.00sp</dimen>
<dimen name="sp70">70.00sp</dimen>
<dimen name="sp71">71.00sp</dimen>
<dimen name="sp72">72.00sp</dimen>
<dimen name="sp73">73.00sp</dimen>
<dimen name="sp74">74.00sp</dimen>
<dimen name="sp75">75.00sp</dimen>
<dimen name="sp76">76.00sp</dimen>
<dimen name="sp77">77.00sp</dimen>
<dimen name="sp78">78.00sp</dimen>
<dimen name="sp79">79.00sp</dimen>
<dimen name="sp80">80.00sp</dimen>
<dimen name="sp81">81.00sp</dimen>
<dimen name="sp82">82.00sp</dimen>
<dimen name="sp83">83.00sp</dimen>
<dimen name="sp84">84.00sp</dimen>
<dimen name="sp85">85.00sp</dimen>
<dimen name="sp86">86.00sp</dimen>
<dimen name="sp87">87.00sp</dimen>
<dimen name="sp88">88.00sp</dimen>
<dimen name="sp89">89.00sp</dimen>
<dimen name="sp90">90.00sp</dimen>
<dimen name="sp91">91.00sp</dimen>
<dimen name="sp92">92.00sp</dimen>
<dimen name="sp93">93.00sp</dimen>
<dimen name="sp94">94.00sp</dimen>
<dimen name="sp95">95.00sp</dimen>
<dimen name="sp96">96.00sp</dimen>
<dimen name="sp97">97.00sp</dimen>
<dimen name="sp98">98.00sp</dimen>
<dimen name="sp99">99.00sp</dimen>
<dimen name="sp100">100.00sp</dimen>
<dimen name="sp101">101.00sp</dimen>
<dimen name="sp102">102.00sp</dimen>
<dimen name="sp103">103.00sp</dimen>
<dimen name="sp104">104.00sp</dimen>
<dimen name="sp105">105.00sp</dimen>
<dimen name="sp106">106.00sp</dimen>
<dimen name="sp107">107.00sp</dimen>
<dimen name="sp108">108.00sp</dimen>
<dimen name="sp109">109.00sp</dimen>
<dimen name="sp110">110.00sp</dimen>
<dimen name="sp111">111.00sp</dimen>
<dimen name="sp112">112.00sp</dimen>
<dimen name="sp113">113.00sp</dimen>
<dimen name="sp114">114.00sp</dimen>
<dimen name="sp115">115.00sp</dimen>
<dimen name="sp116">116.00sp</dimen>
<dimen name="sp117">117.00sp</dimen>
<dimen name="sp118">118.00sp</dimen>
<dimen name="sp119">119.00sp</dimen>
<dimen name="sp120">120.00sp</dimen>
<dimen name="sp121">121.00sp</dimen>
<dimen name="sp122">122.00sp</dimen>
<dimen name="sp123">123.00sp</dimen>
<dimen name="sp124">124.00sp</dimen>
<dimen name="sp125">125.00sp</dimen>
<dimen name="sp126">126.00sp</dimen>
<dimen name="sp127">127.00sp</dimen>
<dimen name="sp128">128.00sp</dimen>
<dimen name="sp129">129.00sp</dimen>
<dimen name="sp130">130.00sp</dimen>
<dimen name="sp131">131.00sp</dimen>
<dimen name="sp132">132.00sp</dimen>
<dimen name="sp133">133.00sp</dimen>
<dimen name="sp134">134.00sp</dimen>
<dimen name="sp135">135.00sp</dimen>
<dimen name="sp136">136.00sp</dimen>
<dimen name="sp137">137.00sp</dimen>
<dimen name="sp138">138.00sp</dimen>
<dimen name="sp139">139.00sp</dimen>
<dimen name="sp140">140.00sp</dimen>
<dimen name="sp141">141.00sp</dimen>
<dimen name="sp142">142.00sp</dimen>
<dimen name="sp143">143.00sp</dimen>
<dimen name="sp144">144.00sp</dimen>
<dimen name="sp145">145.00sp</dimen>
<dimen name="sp146">146.00sp</dimen>
<dimen name="sp147">147.00sp</dimen>
<dimen name="sp148">148.00sp</dimen>
<dimen name="sp149">149.00sp</dimen>
<dimen name="sp150">150.00sp</dimen>
<dimen name="sp151">151.00sp</dimen>
<dimen name="sp152">152.00sp</dimen>
<dimen name="sp153">153.00sp</dimen>
<dimen name="sp154">154.00sp</dimen>
<dimen name="sp155">155.00sp</dimen>
<dimen name="sp156">156.00sp</dimen>
<dimen name="sp157">157.00sp</dimen>
<dimen name="sp158">158.00sp</dimen>
<dimen name="sp159">159.00sp</dimen>
<dimen name="sp160">160.00sp</dimen>
<dimen name="sp161">161.00sp</dimen>
<dimen name="sp162">162.00sp</dimen>
<dimen name="sp163">163.00sp</dimen>
<dimen name="sp164">164.00sp</dimen>
<dimen name="sp165">165.00sp</dimen>
<dimen name="sp166">166.00sp</dimen>
<dimen name="sp167">167.00sp</dimen>
<dimen name="sp168">168.00sp</dimen>
<dimen name="sp169">169.00sp</dimen>
<dimen name="sp170">170.00sp</dimen>
<dimen name="sp171">171.00sp</dimen>
<dimen name="sp172">172.00sp</dimen>
<dimen name="sp173">173.00sp</dimen>
<dimen name="sp174">174.00sp</dimen>
<dimen name="sp175">175.00sp</dimen>
<dimen name="sp176">176.00sp</dimen>
<dimen name="sp177">177.00sp</dimen>
<dimen name="sp178">178.00sp</dimen>
<dimen name="sp179">179.00sp</dimen>
<dimen name="sp180">180.00sp</dimen>
<dimen name="sp181">181.00sp</dimen>
<dimen name="sp182">182.00sp</dimen>
<dimen name="sp183">183.00sp</dimen>
<dimen name="sp184">184.00sp</dimen>
<dimen name="sp185">185.00sp</dimen>
<dimen name="sp186">186.00sp</dimen>
<dimen name="sp187">187.00sp</dimen>
<dimen name="sp188">188.00sp</dimen>
<dimen name="sp189">189.00sp</dimen>
<dimen name="sp190">190.00sp</dimen>
<dimen name="sp191">191.00sp</dimen>
<dimen name="sp192">192.00sp</dimen>
<dimen name="sp193">193.00sp</dimen>
<dimen name="sp194">194.00sp</dimen>
<dimen name="sp195">195.00sp</dimen>
<dimen name="sp196">196.00sp</dimen>
<dimen name="sp197">197.00sp</dimen>
<dimen name="sp198">198.00sp</dimen>
<dimen name="sp199">199.00sp</dimen>
<dimen name="sp200">200.00sp</dimen>
</resources>


================================================
FILE: app/src/main/res_screen/values-sw1080dp/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp0">0.00dp</dimen>
<dimen name="dp1">1.50dp</dimen>
<dimen name="dp2">3.00dp</dimen>
<dimen name="dp3">4.50dp</dimen>
<dimen name="dp4">6.00dp</dimen>
<dimen name="dp5">7.50dp</dimen>
<dimen name="dp6">9.00dp</dimen>
<dimen name="dp7">10.50dp</dimen>
<dimen name="dp8">12.00dp</dimen>
<dimen name="dp9">13.50dp</dimen>
<dimen name="dp10">15.00dp</dimen>
<dimen name="dp11">16.50dp</dimen>
<dimen name="dp12">18.00dp</dimen>
<dimen name="dp13">19.50dp</dimen>
<dimen name="dp14">21.00dp</dimen>
<dimen name="dp15">22.50dp</dimen>
<dimen name="dp16">24.00dp</dimen>
<dimen name="dp17">25.50dp</dimen>
<dimen name="dp18">27.00dp</dimen>
<dimen name="dp19">28.50dp</dimen>
<dimen name="dp20">30.00dp</dimen>
<dimen name="dp21">31.50dp</dimen>
<dimen name="dp22">33.00dp</dimen>
<dimen name="dp23">34.50dp</dimen>
<dimen name="dp24">36.00dp</dimen>
<dimen name="dp25">37.50dp</dimen>
<dimen name="dp26">39.00dp</dimen>
<dimen name="dp27">40.50dp</dimen>
<dimen name="dp28">42.00dp</dimen>
<dimen name="dp29">43.50dp</dimen>
<dimen name="dp30">45.00dp</dimen>
<dimen name="dp31">46.50dp</dimen>
<dimen name="dp32">48.00dp</dimen>
<dimen name="dp33">49.50dp</dimen>
<dimen name="dp34">51.00dp</dimen>
<dimen name="dp35">52.50dp</dimen>
<dimen name="dp36">54.00dp</dimen>
<dimen name="dp37">55.50dp</dimen>
<dimen name="dp38">57.00dp</dimen>
<dimen name="dp39">58.50dp</dimen>
<dimen name="dp40">60.00dp</dimen>
<dimen name="dp41">61.50dp</dimen>
<dimen name="dp42">63.00dp</dimen>
<dimen name="dp43">64.50dp</dimen>
<dimen name="dp44">66.00dp</dimen>
<dimen name="dp45">67.50dp</dimen>
<dimen name="dp46">69.00dp</dimen>
<dimen name="dp47">70.50dp</dimen>
<dimen name="dp48">72.00dp</dimen>
<dimen name="dp49">73.50dp</dimen>
<dimen name="dp50">75.00dp</dimen>
<dimen name="dp51">76.50dp</dimen>
<dimen name="dp52">78.00dp</dimen>
<dimen name="dp53">79.50dp</dimen>
<dimen name="dp54">81.00dp</dimen>
<dimen name="dp55">82.50dp</dimen>
<dimen name="dp56">84.00dp</dimen>
<dimen name="dp57">85.50dp</dimen>
<dimen name="dp58">87.00dp</dimen>
<dimen name="dp59">88.50dp</dimen>
<dimen name="dp60">90.00dp</dimen>
<dimen name="dp61">91.50dp</dimen>
<dimen name="dp62">93.00dp</dimen>
<dimen name="dp63">94.50dp</dimen>
<dimen name="dp64">96.00dp</dimen>
<dimen name="dp65">97.50dp</dimen>
<dimen name="dp66">99.00dp</dimen>
<dimen name="dp67">100.50dp</dimen>
<dimen name="dp68">102.00dp</dimen>
<dimen name="dp69">103.50dp</dimen>
<dimen name="dp70">105.00dp</dimen>
<dimen name="dp71">106.50dp</dimen>
<dimen name="dp72">108.00dp</dimen>
<dimen name="dp73">109.50dp</dimen>
<dimen name="dp74">111.00dp</dimen>
<dimen name="dp75">112.50dp</dimen>
<dimen name="dp76">114.00dp</dimen>
<dimen name="dp77">115.50dp</dimen>
<dimen name="dp78">117.00dp</dimen>
<dimen name="dp79">118.50dp</dimen>
<dimen name="dp80">120.00dp</dimen>
<dimen name="dp81">121.50dp</dimen>
<dimen name="dp82">123.00dp</dimen>
<dimen name="dp83">124.50dp</dimen>
<dimen name="dp84">126.00dp</dimen>
<dimen name="dp85">127.50dp</dimen>
<dimen name="dp86">129.00dp</dimen>
<dimen name="dp87">130.50dp</dimen>
<dimen name="dp88">132.00dp</dimen>
<dimen name="dp89">133.50dp</dimen>
<dimen name="dp90">135.00dp</dimen>
<dimen name="dp91">136.50dp</dimen>
<dimen name="dp92">138.00dp</dimen>
<dimen name="dp93">139.50dp</dimen>
<dimen name="dp94">141.00dp</dimen>
<dimen name="dp95">142.50dp</dimen>
<dimen name="dp96">144.00dp</dimen>
<dimen name="dp97">145.50dp</dimen>
<dimen name="dp98">147.00dp</dimen>
<dimen name="dp99">148.50dp</dimen>
<dimen name="dp100">150.00dp</dimen>
<dimen name="dp101">151.50dp</dimen>
<dimen name="dp102">153.00dp</dimen>
<dimen name="dp103">154.50dp</dimen>
<dimen name="dp104">156.00dp</dimen>
<dimen name="dp105">157.50dp</dimen>
<dimen name="dp106">159.00dp</dimen>
<dimen name="dp107">160.50dp</dimen>
<dimen name="dp108">162.00dp</dimen>
<dimen name="dp109">163.50dp</dimen>
<dimen name="dp110">165.00dp</dimen>
<dimen name="dp111">166.50dp</dimen>
<dimen name="dp112">168.00dp</dimen>
<dimen name="dp113">169.50dp</dimen>
<dimen name="dp114">171.00dp</dimen>
<dimen name="dp115">172.50dp</dimen>
<dimen name="dp116">174.00dp</dimen>
<dimen name="dp117">175.50dp</dimen>
<dimen name="dp118">177.00dp</dimen>
<dimen name="dp119">178.50dp</dimen>
<dimen name="dp120">180.00dp</dimen>
<dimen name="dp121">181.50dp</dimen>
<dimen name="dp122">183.00dp</dimen>
<dimen name="dp123">184.50dp</dimen>
<dimen name="dp124">186.00dp</dimen>
<dimen name="dp125">187.50dp</dimen>
<dimen name="dp126">189.00dp</dimen>
<dimen name="dp127">190.50dp</dimen>
<dimen name="dp128">192.00dp</dimen>
<dimen name="dp129">193.50dp</dimen>
<dimen name="dp130">195.00dp</dimen>
<dimen name="dp131">196.50dp</dimen>
<dimen name="dp132">198.00dp</dimen>
<dimen name="dp133">199.50dp</dimen>
<dimen name="dp134">201.00dp</dimen>
<dimen name="dp135">202.50dp</dimen>
<dimen name="dp136">204.00dp</dimen>
<dimen name="dp137">205.50dp</dimen>
<dimen name="dp138">207.00dp</dimen>
<dimen name="dp139">208.50dp</dimen>
<dimen name="dp140">210.00dp</dimen>
<dimen name="dp141">211.50dp</dimen>
<dimen name="dp142">213.00dp</dimen>
<dimen name="dp143">214.50dp</dimen>
<dimen name="dp144">216.00dp</dimen>
<dimen name="dp145">217.50dp</dimen>
<dimen name="dp146">219.00dp</dimen>
<dimen name="dp147">220.50dp</dimen>
<dimen name="dp148">222.00dp</dimen>
<dimen name="dp149">223.50dp</dimen>
<dimen name="dp150">225.00dp</dimen>
<dimen name="dp151">226.50dp</dimen>
<dimen name="dp152">228.00dp</dimen>
<dimen name="dp153">229.50dp</dimen>
<dimen name="dp154">231.00dp</dimen>
<dimen name="dp155">232.50dp</dimen>
<dimen name="dp156">234.00dp</dimen>
<dimen name="dp157">235.50dp</dimen>
<dimen name="dp158">237.00dp</dimen>
<dimen name="dp159">238.50dp</dimen>
<dimen name="dp160">240.00dp</dimen>
<dimen name="dp161">241.50dp</dimen>
<dimen name="dp162">243.00dp</dimen>
<dimen name="dp163">244.50dp</dimen>
<dimen name="dp164">246.00dp</dimen>
<dimen name="dp165">247.50dp</dimen>
<dimen name="dp166">249.00dp</dimen>
<dimen name="dp167">250.50dp</dimen>
<dimen name="dp168">252.00dp</dimen>
<dimen name="dp169">253.50dp</dimen>
<dimen name="dp170">255.00dp</dimen>
<dimen name="dp171">256.50dp</dimen>
<dimen name="dp172">258.00dp</dimen>
<dimen name="dp173">259.50dp</dimen>
<dimen name="dp174">261.00dp</dimen>
<dimen name="dp175">262.50dp</dimen>
<dimen name="dp176">264.00dp</dimen>
<dimen name="dp177">265.50dp</dimen>
<dimen name="dp178">267.00dp</dimen>
<dimen name="dp179">268.50dp</dimen>
<dimen name="dp180">270.00dp</dimen>
<dimen name="dp181">271.50dp</dimen>
<dimen name="dp182">273.00dp</dimen>
<dimen name="dp183">274.50dp</dimen>
<dimen name="dp184">276.00dp</dimen>
<dimen name="dp185">277.50dp</dimen>
<dimen name="dp186">279.00dp</dimen>
<dimen name="dp187">280.50dp</dimen>
<dimen name="dp188">282.00dp</dimen>
<dimen name="dp189">283.50dp</dimen>
<dimen name="dp190">285.00dp</dimen>
<dimen name="dp191">286.50dp</dimen>
<dimen name="dp192">288.00dp</dimen>
<dimen name="dp193">289.50dp</dimen>
<dimen name="dp194">291.00dp</dimen>
<dimen name="dp195">292.50dp</dimen>
<dimen name="dp196">294.00dp</dimen>
<dimen name="dp197">295.50dp</dimen>
<dimen name="dp198">297.00dp</dimen>
<dimen name="dp199">298.50dp</dimen>
<dimen name="dp200">300.00dp</dimen>
<dimen name="dp201">301.50dp</dimen>
<dimen name="dp202">303.00dp</dimen>
<dimen name="dp203">304.50dp</dimen>
<dimen name="dp204">306.00dp</dimen>
<dimen name="dp205">307.50dp</dimen>
<dimen name="dp206">309.00dp</dimen>
<dimen name="dp207">310.50dp</dimen>
<dimen name="dp208">312.00dp</dimen>
<dimen name="dp209">313.50dp</dimen>
<dimen name="dp210">315.00dp</dimen>
<dimen name="dp211">316.50dp</dimen>
<dimen name="dp212">318.00dp</dimen>
<dimen name="dp213">319.50dp</dimen>
<dimen name="dp214">321.00dp</dimen>
<dimen name="dp215">322.50dp</dimen>
<dimen name="dp216">324.00dp</dimen>
<dimen name="dp217">325.50dp</dimen>
<dimen name="dp218">327.00dp</dimen>
<dimen name="dp219">328.50dp</dimen>
<dimen name="dp220">330.00dp</dimen>
<dimen name="dp221">331.50dp</dimen>
<dimen name="dp222">333.00dp</dimen>
<dimen name="dp223">334.50dp</dimen>
<dimen name="dp224">336.00dp</dimen>
<dimen name="dp225">337.50dp</dimen>
<dimen name="dp226">339.00dp</dimen>
<dimen name="dp227">340.50dp</dimen>
<dimen name="dp228">342.00dp</dimen>
<dimen name="dp229">343.50dp</dimen>
<dimen name="dp230">345.00dp</dimen>
<dimen name="dp231">346.50dp</dimen>
<dimen name="dp232">348.00dp</dimen>
<dimen name="dp233">349.50dp</dimen>
<dimen name="dp234">351.00dp</dimen>
<dimen name="dp235">352.50dp</dimen>
<dimen name="dp236">354.00dp</dimen>
<dimen name="dp237">355.50dp</dimen>
<dimen name="dp238">357.00dp</dimen>
<dimen name="dp239">358.50dp</dimen>
<dimen name="dp240">360.00dp</dimen>
<dimen name="dp241">361.50dp</dimen>
<dimen name="dp242">363.00dp</dimen>
<dimen name="dp243">364.50dp</dimen>
<dimen name="dp244">366.00dp</dimen>
<dimen name="dp245">367.50dp</dimen>
<dimen name="dp246">369.00dp</dimen>
<dimen name="dp247">370.50dp</dimen>
<dimen name="dp248">372.00dp</dimen>
<dimen name="dp249">373.50dp</dimen>
<dimen name="dp250">375.00dp</dimen>
<dimen name="dp251">376.50dp</dimen>
<dimen name="dp252">378.00dp</dimen>
<dimen name="dp253">379.50dp</dimen>
<dimen name="dp254">381.00dp</dimen>
<dimen name="dp255">382.50dp</dimen>
<dimen name="dp256">384.00dp</dimen>
<dimen name="dp257">385.50dp</dimen>
<dimen name="dp258">387.00dp</dimen>
<dimen name="dp259">388.50dp</dimen>
<dimen name="dp260">390.00dp</dimen>
<dimen name="dp261">391.50dp</dimen>
<dimen name="dp262">393.00dp</dimen>
<dimen name="dp263">394.50dp</dimen>
<dimen name="dp264">396.00dp</dimen>
<dimen name="dp265">397.50dp</dimen>
<dimen name="dp266">399.00dp</dimen>
<dimen name="dp267">400.50dp</dimen>
<dimen name="dp268">402.00dp</dimen>
<dimen name="dp269">403.50dp</dimen>
<dimen name="dp270">405.00dp</dimen>
<dimen name="dp271">406.50dp</dimen>
<dimen name="dp272">408.00dp</dimen>
<dimen name="dp273">409.50dp</dimen>
<dimen name="dp274">411.00dp</dimen>
<dimen name="dp275">412.50dp</dimen>
<dimen name="dp276">414.00dp</dimen>
<dimen name="dp277">415.50dp</dimen>
<dimen name="dp278">417.00dp</dimen>
<dimen name="dp279">418.50dp</dimen>
<dimen name="dp280">420.00dp</dimen>
<dimen name="dp281">421.50dp</dimen>
<dimen name="dp282">423.00dp</dimen>
<dimen name="dp283">424.50dp</dimen>
<dimen name="dp284">426.00dp</dimen>
<dimen name="dp285">427.50dp</dimen>
<dimen name="dp286">429.00dp</dimen>
<dimen name="dp287">430.50dp</dimen>
<dimen name="dp288">432.00dp</dimen>
<dimen name="dp289">433.50dp</dimen>
<dimen name="dp290">435.00dp</dimen>
<dimen name="dp291">436.50dp</dimen>
<dimen name="dp292">438.00dp</dimen>
<dimen name="dp293">439.50dp</dimen>
<dimen name="dp294">441.00dp</dimen>
<dimen name="dp295">442.50dp</dimen>
<dimen name="dp296">444.00dp</dimen>
<dimen name="dp297">445.50dp</dimen>
<dimen name="dp298">447.00dp</dimen>
<dimen name="dp299">448.50dp</dimen>
<dimen name="dp300">450.00dp</dimen>
<dimen name="dp301">451.50dp</dimen>
<dimen name="dp302">453.00dp</dimen>
<dimen name="dp303">454.50dp</dimen>
<dimen name="dp304">456.00dp</dimen>
<dimen name="dp305">457.50dp</dimen>
<dimen name="dp306">459.00dp</dimen>
<dimen name="dp307">460.50dp</dimen>
<dimen name="dp308">462.00dp</dimen>
<dimen name="dp309">463.50dp</dimen>
<dimen name="dp310">465.00dp</dimen>
<dimen name="dp311">466.50dp</dimen>
<dimen name="dp312">468.00dp</dimen>
<dimen name="dp313">469.50dp</dimen>
<dimen name="dp314">471.00dp</dimen>
<dimen name="dp315">472.50dp</dimen>
<dimen name="dp316">474.00dp</dimen>
<dimen name="dp317">475.50dp</dimen>
<dimen name="dp318">477.00dp</dimen>
<dimen name="dp319">478.50dp</dimen>
<dimen name="dp320">480.00dp</dimen>
<dimen name="dp321">481.50dp</dimen>
<dimen name="dp322">483.00dp</dimen>
<dimen name="dp323">484.50dp</dimen>
<dimen name="dp324">486.00dp</dimen>
<dimen name="dp325">487.50dp</dimen>
<dimen name="dp326">489.00dp</dimen>
<dimen name="dp327">490.50dp</dimen>
<dimen name="dp328">492.00dp</dimen>
<dimen name="dp329">493.50dp</dimen>
<dimen name="dp330">495.00dp</dimen>
<dimen name="dp331">496.50dp</dimen>
<dimen name="dp332">498.00dp</dimen>
<dimen name="dp333">499.50dp</dimen>
<dimen name="dp334">501.00dp</dimen>
<dimen name="dp335">502.50dp</dimen>
<dimen name="dp336">504.00dp</dimen>
<dimen name="dp337">505.50dp</dimen>
<dimen name="dp338">507.00dp</dimen>
<dimen name="dp339">508.50dp</dimen>
<dimen name="dp340">510.00dp</dimen>
<dimen name="dp341">511.50dp</dimen>
<dimen name="dp342">513.00dp</dimen>
<dimen name="dp343">514.50dp</dimen>
<dimen name="dp344">516.00dp</dimen>
<dimen name="dp345">517.50dp</dimen>
<dimen name="dp346">519.00dp</dimen>
<dimen name="dp347">520.50dp</dimen>
<dimen name="dp348">522.00dp</dimen>
<dimen name="dp349">523.50dp</dimen>
<dimen name="dp350">525.00dp</dimen>
<dimen name="dp351">526.50dp</dimen>
<dimen name="dp352">528.00dp</dimen>
<dimen name="dp353">529.50dp</dimen>
<dimen name="dp354">531.00dp</dimen>
<dimen name="dp355">532.50dp</dimen>
<dimen name="dp356">534.00dp</dimen>
<dimen name="dp357">535.50dp</dimen>
<dimen name="dp358">537.00dp</dimen>
<dimen name="dp359">538.50dp</dimen>
<dimen name="dp360">540.00dp</dimen>
<dimen name="dp361">541.50dp</dimen>
<dimen name="dp362">543.00dp</dimen>
<dimen name="dp363">544.50dp</dimen>
<dimen name="dp364">546.00dp</dimen>
<dimen name="dp365">547.50dp</dimen>
<dimen name="dp366">549.00dp</dimen>
<dimen name="dp367">550.50dp</dimen>
<dimen name="dp368">552.00dp</dimen>
<dimen name="dp369">553.50dp</dimen>
<dimen name="dp370">555.00dp</dimen>
<dimen name="dp371">556.50dp</dimen>
<dimen name="dp372">558.00dp</dimen>
<dimen name="dp373">559.50dp</dimen>
<dimen name="dp374">561.00dp</dimen>
<dimen name="dp375">562.50dp</dimen>
<dimen name="dp376">564.00dp</dimen>
<dimen name="dp377">565.50dp</dimen>
<dimen name="dp378">567.00dp</dimen>
<dimen name="dp379">568.50dp</dimen>
<dimen name="dp380">570.00dp</dimen>
<dimen name="dp381">571.50dp</dimen>
<dimen name="dp382">573.00dp</dimen>
<dimen name="dp383">574.50dp</dimen>
<dimen name="dp384">576.00dp</dimen>
<dimen name="dp385">577.50dp</dimen>
<dimen name="dp386">579.00dp</dimen>
<dimen name="dp387">580.50dp</dimen>
<dimen name="dp388">582.00dp</dimen>
<dimen name="dp389">583.50dp</dimen>
<dimen name="dp390">585.00dp</dimen>
<dimen name="dp391">586.50dp</dimen>
<dimen name="dp392">588.00dp</dimen>
<dimen name="dp393">589.50dp</dimen>
<dimen name="dp394">591.00dp</dimen>
<dimen name="dp395">592.50dp</dimen>
<dimen name="dp396">594.00dp</dimen>
<dimen name="dp397">595.50dp</dimen>
<dimen name="dp398">597.00dp</dimen>
<dimen name="dp399">598.50dp</dimen>
<dimen name="dp400">600.00dp</dimen>
<dimen name="dp401">601.50dp</dimen>
<dimen name="dp402">603.00dp</dimen>
<dimen name="dp403">604.50dp</dimen>
<dimen name="dp404">606.00dp</dimen>
<dimen name="dp405">607.50dp</dimen>
<dimen name="dp406">609.00dp</dimen>
<dimen name="dp407">610.50dp</dimen>
<dimen name="dp408">612.00dp</dimen>
<dimen name="dp409">613.50dp</dimen>
<dimen name="dp410">615.00dp</dimen>
<dimen name="dp411">616.50dp</dimen>
<dimen name="dp412">618.00dp</dimen>
<dimen name="dp413">619.50dp</dimen>
<dimen name="dp414">621.00dp</dimen>
<dimen name="dp415">622.50dp</dimen>
<dimen name="dp416">624.00dp</dimen>
<dimen name="dp417">625.50dp</dimen>
<dimen name="dp418">627.00dp</dimen>
<dimen name="dp419">628.50dp</dimen>
<dimen name="dp420">630.00dp</dimen>
<dimen name="dp421">631.50dp</dimen>
<dimen name="dp422">633.00dp</dimen>
<dimen name="dp423">634.50dp</dimen>
<dimen name="dp424">636.00dp</dimen>
<dimen name="dp425">637.50dp</dimen>
<dimen name="dp426">639.00dp</dimen>
<dimen name="dp427">640.50dp</dimen>
<dimen name="dp428">642.00dp</dimen>
<dimen name="dp429">643.50dp</dimen>
<dimen name="dp430">645.00dp</dimen>
<dimen name="dp431">646.50dp</dimen>
<dimen name="dp432">648.00dp</dimen>
<dimen name="dp433">649.50dp</dimen>
<dimen name="dp434">651.00dp</dimen>
<dimen name="dp435">652.50dp</dimen>
<dimen name="dp436">654.00dp</dimen>
<dimen name="dp437">655.50dp</dimen>
<dimen name="dp438">657.00dp</dimen>
<dimen name="dp439">658.50dp</dimen>
<dimen name="dp440">660.00dp</dimen>
<dimen name="dp441">661.50dp</dimen>
<dimen name="dp442">663.00dp</dimen>
<dimen name="dp443">664.50dp</dimen>
<dimen name="dp444">666.00dp</dimen>
<dimen name="dp445">667.50dp</dimen>
<dimen name="dp446">669.00dp</dimen>
<dimen name="dp447">670.50dp</dimen>
<dimen name="dp448">672.00dp</dimen>
<dimen name="dp449">673.50dp</dimen>
<dimen name="dp450">675.00dp</dimen>
<dimen name="dp451">676.50dp</dimen>
<dimen name="dp452">678.00dp</dimen>
<dimen name="dp453">679.50dp</dimen>
<dimen name="dp454">681.00dp</dimen>
<dimen name="dp455">682.50dp</dimen>
<dimen name="dp456">684.00dp</dimen>
<dimen name="dp457">685.50dp</dimen>
<dimen name="dp458">687.00dp</dimen>
<dimen name="dp459">688.50dp</dimen>
<dimen name="dp460">690.00dp</dimen>
<dimen name="dp461">691.50dp</dimen>
<dimen name="dp462">693.00dp</dimen>
<dimen name="dp463">694.50dp</dimen>
<dimen name="dp464">696.00dp</dimen>
<dimen name="dp465">697.50dp</dimen>
<dimen name="dp466">699.00dp</dimen>
<dimen name="dp467">700.50dp</dimen>
<dimen name="dp468">702.00dp</dimen>
<dimen name="dp469">703.50dp</dimen>
<dimen name="dp470">705.00dp</dimen>
<dimen name="dp471">706.50dp</dimen>
<dimen name="dp472">708.00dp</dimen>
<dimen name="dp473">709.50dp</dimen>
<dimen name="dp474">711.00dp</dimen>
<dimen name="dp475">712.50dp</dimen>
<dimen name="dp476">714.00dp</dimen>
<dimen name="dp477">715.50dp</dimen>
<dimen name="dp478">717.00dp</dimen>
<dimen name="dp479">718.50dp</dimen>
<dimen name="dp480">720.00dp</dimen>
<dimen name="dp481">721.50dp</dimen>
<dimen name="dp482">723.00dp</dimen>
<dimen name="dp483">724.50dp</dimen>
<dimen name="dp484">726.00dp</dimen>
<dimen name="dp485">727.50dp</dimen>
<dimen name="dp486">729.00dp</dimen>
<dimen name="dp487">730.50dp</dimen>
<dimen name="dp488">732.00dp</dimen>
<dimen name="dp489">733.50dp</dimen>
<dimen name="dp490">735.00dp</dimen>
<dimen name="dp491">736.50dp</dimen>
<dimen name="dp492">738.00dp</dimen>
<dimen name="dp493">739.50dp</dimen>
<dimen name="dp494">741.00dp</dimen>
<dimen name="dp495">742.50dp</dimen>
<dimen name="dp496">744.00dp</dimen>
<dimen name="dp497">745.50dp</dimen>
<dimen name="dp498">747.00dp</dimen>
<dimen name="dp499">748.50dp</dimen>
<dimen name="dp500">750.00dp</dimen>
<dimen name="dp501">751.50dp</dimen>
<dimen name="dp502">753.00dp</dimen>
<dimen name="dp503">754.50dp</dimen>
<dimen name="dp504">756.00dp</dimen>
<dimen name="dp505">757.50dp</dimen>
<dimen name="dp506">759.00dp</dimen>
<dimen name="dp507">760.50dp</dimen>
<dimen name="dp508">762.00dp</dimen>
<dimen name="dp509">763.50dp</dimen>
<dimen name="dp510">765.00dp</dimen>
<dimen name="dp511">766.50dp</dimen>
<dimen name="dp512">768.00dp</dimen>
<dimen name="dp513">769.50dp</dimen>
<dimen name="dp514">771.00dp</dimen>
<dimen name="dp515">772.50dp</dimen>
<dimen name="dp516">774.00dp</dimen>
<dimen name="dp517">775.50dp</dimen>
<dimen name="dp518">777.00dp</dimen>
<dimen name="dp519">778.50dp</dimen>
<dimen name="dp520">780.00dp</dimen>
<dimen name="dp521">781.50dp</dimen>
<dimen name="dp522">783.00dp</dimen>
<dimen name="dp523">784.50dp</dimen>
<dimen name="dp524">786.00dp</dimen>
<dimen name="dp525">787.50dp</dimen>
<dimen name="dp526">789.00dp</dimen>
<dimen name="dp527">790.50dp</dimen>
<dimen name="dp528">792.00dp</dimen>
<dimen name="dp529">793.50dp</dimen>
<dimen name="dp530">795.00dp</dimen>
<dimen name="dp531">796.50dp</dimen>
<dimen name="dp532">798.00dp</dimen>
<dimen name="dp533">799.50dp</dimen>
<dimen name="dp534">801.00dp</dimen>
<dimen name="dp535">802.50dp</dimen>
<dimen name="dp536">804.00dp</dimen>
<dimen name="dp537">805.50dp</dimen>
<dimen name="dp538">807.00dp</dimen>
<dimen name="dp539">808.50dp</dimen>
<dimen name="dp540">810.00dp</dimen>
<dimen name="dp541">811.50dp</dimen>
<dimen name="dp542">813.00dp</dimen>
<dimen name="dp543">814.50dp</dimen>
<dimen name="dp544">816.00dp</dimen>
<dimen name="dp545">817.50dp</dimen>
<dimen name="dp546">819.00dp</dimen>
<dimen name="dp547">820.50dp</dimen>
<dimen name="dp548">822.00dp</dimen>
<dimen name="dp549">823.50dp</dimen>
<dimen name="dp550">825.00dp</dimen>
<dimen name="dp551">826.50dp</dimen>
<dimen name="dp552">828.00dp</dimen>
<dimen name="dp553">829.50dp</dimen>
<dimen name="dp554">831.00dp</dimen>
<dimen name="dp555">832.50dp</dimen>
<dimen name="dp556">834.00dp</dimen>
<dimen name="dp557">835.50dp</dimen>
<dimen name="dp558">837.00dp</dimen>
<dimen name="dp559">838.50dp</dimen>
<dimen name="dp560">840.00dp</dimen>
<dimen name="dp561">841.50dp</dimen>
<dimen name="dp562">843.00dp</dimen>
<dimen name="dp563">844.50dp</dimen>
<dimen name="dp564">846.00dp</dimen>
<dimen name="dp565">847.50dp</dimen>
<dimen name="dp566">849.00dp</dimen>
<dimen name="dp567">850.50dp</dimen>
<dimen name="dp568">852.00dp</dimen>
<dimen name="dp569">853.50dp</dimen>
<dimen name="dp570">855.00dp</dimen>
<dimen name="dp571">856.50dp</dimen>
<dimen name="dp572">858.00dp</dimen>
<dimen name="dp573">859.50dp</dimen>
<dimen name="dp574">861.00dp</dimen>
<dimen name="dp575">862.50dp</dimen>
<dimen name="dp576">864.00dp</dimen>
<dimen name="dp577">865.50dp</dimen>
<dimen name="dp578">867.00dp</dimen>
<dimen name="dp579">868.50dp</dimen>
<dimen name="dp580">870.00dp</dimen>
<dimen name="dp581">871.50dp</dimen>
<dimen name="dp582">873.00dp</dimen>
<dimen name="dp583">874.50dp</dimen>
<dimen name="dp584">876.00dp</dimen>
<dimen name="dp585">877.50dp</dimen>
<dimen name="dp586">879.00dp</dimen>
<dimen name="dp587">880.50dp</dimen>
<dimen name="dp588">882.00dp</dimen>
<dimen name="dp589">883.50dp</dimen>
<dimen name="dp590">885.00dp</dimen>
<dimen name="dp591">886.50dp</dimen>
<dimen name="dp592">888.00dp</dimen>
<dimen name="dp593">889.50dp</dimen>
<dimen name="dp594">891.00dp</dimen>
<dimen name="dp595">892.50dp</dimen>
<dimen name="dp596">894.00dp</dimen>
<dimen name="dp597">895.50dp</dimen>
<dimen name="dp598">897.00dp</dimen>
<dimen name="dp599">898.50dp</dimen>
<dimen name="dp600">900.00dp</dimen>
<dimen name="dp601">901.50dp</dimen>
<dimen name="dp602">903.00dp</dimen>
<dimen name="dp603">904.50dp</dimen>
<dimen name="dp604">906.00dp</dimen>
<dimen name="dp605">907.50dp</dimen>
<dimen name="dp606">909.00dp</dimen>
<dimen name="dp607">910.50dp</dimen>
<dimen name="dp608">912.00dp</dimen>
<dimen name="dp609">913.50dp</dimen>
<dimen name="dp610">915.00dp</dimen>
<dimen name="dp611">916.50dp</dimen>
<dimen name="dp612">918.00dp</dimen>
<dimen name="dp613">919.50dp</dimen>
<dimen name="dp614">921.00dp</dimen>
<dimen name="dp615">922.50dp</dimen>
<dimen name="dp616">924.00dp</dimen>
<dimen name="dp617">925.50dp</dimen>
<dimen name="dp618">927.00dp</dimen>
<dimen name="dp619">928.50dp</dimen>
<dimen name="dp620">930.00dp</dimen>
<dimen name="dp621">931.50dp</dimen>
<dimen name="dp622">933.00dp</dimen>
<dimen name="dp623">934.50dp</dimen>
<dimen name="dp624">936.00dp</dimen>
<dimen name="dp625">937.50dp</dimen>
<dimen name="dp626">939.00dp</dimen>
<dimen name="dp627">940.50dp</dimen>
<dimen name="dp628">942.00dp</dimen>
<dimen name="dp629">943.50dp</dimen>
<dimen name="dp630">945.00dp</dimen>
<dimen name="dp631">946.50dp</dimen>
<dimen name="dp632">948.00dp</dimen>
<dimen name="dp633">949.50dp</dimen>
<dimen name="dp634">951.00dp</dimen>
<dimen name="dp635">952.50dp</dimen>
<dimen name="dp636">954.00dp</dimen>
<dimen name="dp637">955.50dp</dimen>
<dimen name="dp638">957.00dp</dimen>
<dimen name="dp639">958.50dp</dimen>
<dimen name="dp640">960.00dp</dimen>
<dimen name="dp641">961.50dp</dimen>
<dimen name="dp642">963.00dp</dimen>
<dimen name="dp643">964.50dp</dimen>
<dimen name="dp644">966.00dp</dimen>
<dimen name="dp645">967.50dp</dimen>
<dimen name="dp646">969.00dp</dimen>
<dimen name="dp647">970.50dp</dimen>
<dimen name="dp648">972.00dp</dimen>
<dimen name="dp649">973.50dp</dimen>
<dimen name="dp650">975.00dp</dimen>
<dimen name="dp651">976.50dp</dimen>
<dimen name="dp652">978.00dp</dimen>
<dimen name="dp653">979.50dp</dimen>
<dimen name="dp654">981.00dp</dimen>
<dimen name="dp655">982.50dp</dimen>
<dimen name="dp656">984.00dp</dimen>
<dimen name="dp657">985.50dp</dimen>
<dimen name="dp658">987.00dp</dimen>
<dimen name="dp659">988.50dp</dimen>
<dimen name="dp660">990.00dp</dimen>
<dimen name="dp661">991.50dp</dimen>
<dimen name="dp662">993.00dp</dimen>
<dimen name="dp663">994.50dp</dimen>
<dimen name="dp664">996.00dp</dimen>
<dimen name="dp665">997.50dp</dimen>
<dimen name="dp666">999.00dp</dimen>
<dimen name="dp667">1000.50dp</dimen>
<dimen name="dp668">1002.00dp</dimen>
<dimen name="dp669">1003.50dp</dimen>
<dimen name="dp670">1005.00dp</dimen>
<dimen name="dp671">1006.50dp</dimen>
<dimen name="dp672">1008.00dp</dimen>
<dimen name="dp673">1009.50dp</dimen>
<dimen name="dp674">1011.00dp</dimen>
<dimen name="dp675">1012.50dp</dimen>
<dimen name="dp676">1014.00dp</dimen>
<dimen name="dp677">1015.50dp</dimen>
<dimen name="dp678">1017.00dp</dimen>
<dimen name="dp679">1018.50dp</dimen>
<dimen name="dp680">1020.00dp</dimen>
<dimen name="dp681">1021.50dp</dimen>
<dimen name="dp682">1023.00dp</dimen>
<dimen name="dp683">1024.50dp</dimen>
<dimen name="dp684">1026.00dp</dimen>
<dimen name="dp685">1027.50dp</dimen>
<dimen name="dp686">1029.00dp</dimen>
<dimen name="dp687">1030.50dp</dimen>
<dimen name="dp688">1032.00dp</dimen>
<dimen name="dp689">1033.50dp</dimen>
<dimen name="dp690">1035.00dp</dimen>
<dimen name="dp691">1036.50dp</dimen>
<dimen name="dp692">1038.00dp</dimen>
<dimen name="dp693">1039.50dp</dimen>
<dimen name="dp694">1041.00dp</dimen>
<dimen name="dp695">1042.50dp</dimen>
<dimen name="dp696">1044.00dp</dimen>
<dimen name="dp697">1045.50dp</dimen>
<dimen name="dp698">1047.00dp</dimen>
<dimen name="dp699">1048.50dp</dimen>
<dimen name="dp700">1050.00dp</dimen>
<dimen name="dp701">1051.50dp</dimen>
<dimen name="dp702">1053.00dp</dimen>
<dimen name="dp703">1054.50dp</dimen>
<dimen name="dp704">1056.00dp</dimen>
<dimen name="dp705">1057.50dp</dimen>
<dimen name="dp706">1059.00dp</dimen>
<dimen name="dp707">1060.50dp</dimen>
<dimen name="dp708">1062.00dp</dimen>
<dimen name="dp709">1063.50dp</dimen>
<dimen name="dp710">1065.00dp</dimen>
<dimen name="dp711">1066.50dp</dimen>
<dimen name="dp712">1068.00dp</dimen>
<dimen name="dp713">1069.50dp</dimen>
<dimen name="dp714">1071.00dp</dimen>
<dimen name="dp715">1072.50dp</dimen>
<dimen name="dp716">1074.00dp</dimen>
<dimen name="dp717">1075.50dp</dimen>
<dimen name="dp718">1077.00dp</dimen>
<dimen name="dp719">1078.50dp</dimen>
<dimen name="dp720">1080.00dp</dimen>
<dimen name="sp0">0.00sp</dimen>
<dimen name="sp1">1.50sp</dimen>
<dimen name="sp2">3.00sp</dimen>
<dimen name="sp3">4.50sp</dimen>
<dimen name="sp4">6.00sp</dimen>
<dimen name="sp5">7.50sp</dimen>
<dimen name="sp6">9.00sp</dimen>
<dimen name="sp7">10.50sp</dimen>
<dimen name="sp8">12.00sp</dimen>
<dimen name="sp9">13.50sp</dimen>
<dimen name="sp10">15.00sp</dimen>
<dimen name="sp11">16.50sp</dimen>
<dimen name="sp12">18.00sp</dimen>
<dimen name="sp13">19.50sp</dimen>
<dimen name="sp14">21.00sp</dimen>
<dimen name="sp15">22.50sp</dimen>
<dimen name="sp16">24.00sp</dimen>
<dimen name="sp17">25.50sp</dimen>
<dimen name="sp18">27.00sp</dimen>
<dimen name="sp19">28.50sp</dimen>
<dimen name="sp20">30.00sp</dimen>
<dimen name="sp21">31.50sp</dimen>
<dimen name="sp22">33.00sp</dimen>
<dimen name="sp23">34.50sp</dimen>
<dimen name="sp24">36.00sp</dimen>
<dimen name="sp25">37.50sp</dimen>
<dimen name="sp26">39.00sp</dimen>
<dimen name="sp27">40.50sp</dimen>
<dimen name="sp28">42.00sp</dimen>
<dimen name="sp29">43.50sp</dimen>
<dimen name="sp30">45.00sp</dimen>
<dimen name="sp31">46.50sp</dimen>
<dimen name="sp32">48.00sp</dimen>
<dimen name="sp33">49.50sp</dimen>
<dimen name="sp34">51.00sp</dimen>
<dimen name="sp35">52.50sp</dimen>
<dimen name="sp36">54.00sp</dimen>
<dimen name="sp37">55.50sp</dimen>
<dimen name="sp38">57.00sp</dimen>
<dimen name="sp39">58.50sp</dimen>
<dimen name="sp40">60.00sp</dimen>
<dimen name="sp41">61.50sp</dimen>
<dimen name="sp42">63.00sp</dimen>
<dimen name="sp43">64.50sp</dimen>
<dimen name="sp44">66.00sp</dimen>
<dimen name="sp45">67.50sp</dimen>
<dimen name="sp46">69.00sp</dimen>
<dimen name="sp47">70.50sp</dimen>
<dimen name="sp48">72.00sp</dimen>
<dimen name="sp49">73.50sp</dimen>
<dimen name="sp50">75.00sp</dimen>
<dimen name="sp51">76.50sp</dimen>
<dimen name="sp52">78.00sp</dimen>
<dimen name="sp53">79.50sp</dimen>
<dimen name="sp54">81.00sp</dimen>
<dimen name="sp55">82.50sp</dimen>
<dimen name="sp56">84.00sp</dimen>
<dimen name="sp57">85.50sp</dimen>
<dimen name="sp58">87.00sp</dimen>
<dimen name="sp59">88.50sp</dimen>
<dimen name="sp60">90.00sp</dimen>
<dimen name="sp61">91.50sp</dimen>
<dimen name="sp62">93.00sp</dimen>
<dimen name="sp63">94.50sp</dimen>
<dimen name="sp64">96.00sp</dimen>
<dimen name="sp65">97.50sp</dimen>
<dimen name="sp66">99.00sp</dimen>
<dimen name="sp67">100.50sp</dimen>
<dimen name="sp68">102.00sp</dimen>
<dimen name="sp69">103.50sp</dimen>
<dimen name="sp70">105.00sp</dimen>
<dimen name="sp71">106.50sp</dimen>
<dimen name="sp72">108.00sp</dimen>
<dimen name="sp73">109.50sp</dimen>
<dimen name="sp74">111.00sp</dimen>
<dimen name="sp75">112.50sp</dimen>
<dimen name="sp76">114.00sp</dimen>
<dimen name="sp77">115.50sp</dimen>
<dimen name="sp78">117.00sp</dimen>
<dimen name="sp79">118.50sp</dimen>
<dimen name="sp80">120.00sp</dimen>
<dimen name="sp81">121.50sp</dimen>
<dimen name="sp82">123.00sp</dimen>
<dimen name="sp83">124.50sp</dimen>
<dimen name="sp84">126.00sp</dimen>
<dimen name="sp85">127.50sp</dimen>
<dimen name="sp86">129.00sp</dimen>
<dimen name="sp87">130.50sp</dimen>
<dimen name="sp88">132.00sp</dimen>
<dimen name="sp89">133.50sp</dimen>
<dimen name="sp90">135.00sp</dimen>
<dimen name="sp91">136.50sp</dimen>
<dimen name="sp92">138.00sp</dimen>
<dimen name="sp93">139.50sp</dimen>
<dimen name="sp94">141.00sp</dimen>
<dimen name="sp95">142.50sp</dimen>
<dimen name="sp96">144.00sp</dimen>
<dimen name="sp97">145.50sp</dimen>
<dimen name="sp98">147.00sp</dimen>
<dimen name="sp99">148.50sp</dimen>
<dimen name="sp100">150.00sp</dimen>
<dimen name="sp101">151.50sp</dimen>
<dimen name="sp102">153.00sp</dimen>
<dimen name="sp103">154.50sp</dimen>
<dimen name="sp104">156.00sp</dimen>
<dimen name="sp105">157.50sp</dimen>
<dimen name="sp106">159.00sp</dimen>
<dimen name="sp107">160.50sp</dimen>
<dimen name="sp108">162.00sp</dimen>
<dimen name="sp109">163.50sp</dimen>
<dimen name="sp110">165.00sp</dimen>
<dimen name="sp111">166.50sp</dimen>
<dimen name="sp112">168.00sp</dimen>
<dimen name="sp113">169.50sp</dimen>
<dimen name="sp114">171.00sp</dimen>
<dimen name="sp115">172.50sp</dimen>
<dimen name="sp116">174.00sp</dimen>
<dimen name="sp117">175.50sp</dimen>
<dimen name="sp118">177.00sp</dimen>
<dimen name="sp119">178.50sp</dimen>
<dimen name="sp120">180.00sp</dimen>
<dimen name="sp121">181.50sp</dimen>
<dimen name="sp122">183.00sp</dimen>
<dimen name="sp123">184.50sp</dimen>
<dimen name="sp124">186.00sp</dimen>
<dimen name="sp125">187.50sp</dimen>
<dimen name="sp126">189.00sp</dimen>
<dimen name="sp127">190.50sp</dimen>
<dimen name="sp128">192.00sp</dimen>
<dimen name="sp129">193.50sp</dimen>
<dimen name="sp130">195.00sp</dimen>
<dimen name="sp131">196.50sp</dimen>
<dimen name="sp132">198.00sp</dimen>
<dimen name="sp133">199.50sp</dimen>
<dimen name="sp134">201.00sp</dimen>
<dimen name="sp135">202.50sp</dimen>
<dimen name="sp136">204.00sp</dimen>
<dimen name="sp137">205.50sp</dimen>
<dimen name="sp138">207.00sp</dimen>
<dimen name="sp139">208.50sp</dimen>
<dimen name="sp140">210.00sp</dimen>
<dimen name="sp141">211.50sp</dimen>
<dimen name="sp142">213.00sp</dimen>
<dimen name="sp143">214.50sp</dimen>
<dimen name="sp144">216.00sp</dimen>
<dimen name="sp145">217.50sp</dimen>
<dimen name="sp146">219.00sp</dimen>
<dimen name="sp147">220.50sp</dimen>
<dimen name="sp148">222.00sp</dimen>
<dimen name="sp149">223.50sp</dimen>
<dimen name="sp150">225.00sp</dimen>
<dimen name="sp151">226.50sp</dimen>
<dimen name="sp152">228.00sp</dimen>
<dimen name="sp153">229.50sp</dimen>
<dimen name="sp154">231.00sp</dimen>
<dimen name="sp155">232.50sp</dimen>
<dimen name="sp156">234.00sp</dimen>
<dimen name="sp157">235.50sp</dimen>
<dimen name="sp158">237.00sp</dimen>
<dimen name="sp159">238.50sp</dimen>
<dimen name="sp160">240.00sp</dimen>
<dimen name="sp161">241.50sp</dimen>
<dimen name="sp162">243.00sp</dimen>
<dimen name="sp163">244.50sp</dimen>
<dimen name="sp164">246.00sp</dimen>
<dimen name="sp165">247.50sp</dimen>
<dimen name="sp166">249.00sp</dimen>
<dimen name="sp167">250.50sp</dimen>
<dimen name="sp168">252.00sp</dimen>
<dimen name="sp169">253.50sp</dimen>
<dimen name="sp170">255.00sp</dimen>
<dimen name="sp171">256.50sp</dimen>
<dimen name="sp172">258.00sp</dimen>
<dimen name="sp173">259.50sp</dimen>
<dimen name="sp174">261.00sp</dimen>
<dimen name="sp175">262.50sp</dimen>
<dimen name="sp176">264.00sp</dimen>
<dimen name="sp177">265.50sp</dimen>
<dimen name="sp178">267.00sp</dimen>
<dimen name="sp179">268.50sp</dimen>
<dimen name="sp180">270.00sp</dimen>
<dimen name="sp181">271.50sp</dimen>
<dimen name="sp182">273.00sp</dimen>
<dimen name="sp183">274.50sp</dimen>
<dimen name="sp184">276.00sp</dimen>
<dimen name="sp185">277.50sp</dimen>
<dimen name="sp186">279.00sp</dimen>
<dimen name="sp187">280.50sp</dimen>
<dimen name="sp188">282.00sp</dimen>
<dimen name="sp189">283.50sp</dimen>
<dimen name="sp190">285.00sp</dimen>
<dimen name="sp191">286.50sp</dimen>
<dimen name="sp192">288.00sp</dimen>
<dimen name="sp193">289.50sp</dimen>
<dimen name="sp194">291.00sp</dimen>
<dimen name="sp195">292.50sp</dimen>
<dimen name="sp196">294.00sp</dimen>
<dimen name="sp197">295.50sp</dimen>
<dimen name="sp198">297.00sp</dimen>
<dimen name="sp199">298.50sp</dimen>
<dimen name="sp200">300.00sp</dimen>
</resources>


================================================
FILE: app/src/main/res_screen/values-sw320dp/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp0">0.00dp</dimen>
<dimen name="dp1">0.44dp</dimen>
<dimen name="dp2">0.89dp</dimen>
<dimen name="dp3">1.33dp</dimen>
<dimen name="dp4">1.78dp</dimen>
<dimen name="dp5">2.22dp</dimen>
<dimen name="dp6">2.67dp</dimen>
<dimen name="dp7">3.11dp</dimen>
<dimen name="dp8">3.56dp</dimen>
<dimen name="dp9">4.00dp</dimen>
<dimen name="dp10">4.44dp</dimen>
<dimen name="dp11">4.89dp</dimen>
<dimen name="dp12">5.33dp</dimen>
<dimen name="dp13">5.78dp</dimen>
<dimen name="dp14">6.22dp</dimen>
<dimen name="dp15">6.67dp</dimen>
<dimen name="dp16">7.11dp</dimen>
<dimen name="dp17">7.56dp</dimen>
<dimen name="dp18">8.00dp</dimen>
<dimen name="dp19">8.44dp</dimen>
<dimen name="dp20">8.89dp</dimen>
<dimen name="dp21">9.33dp</dimen>
<dimen name="dp22">9.78dp</dimen>
<dimen name="dp23">10.22dp</dimen>
<dimen name="dp24">10.67dp</dimen>
<dimen name="dp25">11.11dp</dimen>
<dimen name="dp26">11.56dp</dimen>
<dimen name="dp27">12.00dp</dimen>
<dimen name="dp28">12.44dp</dimen>
<dimen name="dp29">12.89dp</dimen>
<dimen name="dp30">13.33dp</dimen>
<dimen name="dp31">13.78dp</dimen>
<dimen name="dp32">14.22dp</dimen>
<dimen name="dp33">14.67dp</dimen>
<dimen name="dp34">15.11dp</dimen>
<dimen name="dp35">15.56dp</dimen>
<dimen name="dp36">16.00dp</dimen>
<dimen name="dp37">16.44dp</dimen>
<dimen name="dp38">16.89dp</dimen>
<dimen name="dp39">17.33dp</dimen>
<dimen name="dp40">17.78dp</dimen>
<dimen name="dp41">18.22dp</dimen>
<dimen name="dp42">18.67dp</dimen>
<dimen name="dp43">19.11dp</dimen>
<dimen name="dp44">19.56dp</dimen>
<dimen name="dp45">20.00dp</dimen>
<dimen name="dp46">20.44dp</dimen>
<dimen name="dp47">20.89dp</dimen>
<dimen name="dp48">21.33dp</dimen>
<dimen name="dp49">21.78dp</dimen>
<dimen name="dp50">22.22dp</dimen>
<dimen name="dp51">22.67dp</dimen>
<dimen name="dp52">23.11dp</dimen>
<dimen name="dp53">23.56dp</dimen>
<dimen name="dp54">24.00dp</dimen>
<dimen name="dp55">24.44dp</dimen>
<dimen name="dp56">24.89dp</dimen>
<dimen name="dp57">25.33dp</dimen>
<dimen name="dp58">25.78dp</dimen>
<dimen name="dp59">26.22dp</dimen>
<dimen name="dp60">26.67dp</dimen>
<dimen name="dp61">27.11dp</dimen>
<dimen name="dp62">27.56dp</dimen>
<dimen name="dp63">28.00dp</dimen>
<dimen name="dp64">28.44dp</dimen>
<dimen name="dp65">28.89dp</dimen>
<dimen name="dp66">29.33dp</dimen>
<dimen name="dp67">29.78dp</dimen>
<dimen name="dp68">30.22dp</dimen>
<dimen name="dp69">30.67dp</dimen>
<dimen name="dp70">31.11dp</dimen>
<dimen name="dp71">31.56dp</dimen>
<dimen name="dp72">32.00dp</dimen>
<dimen name="dp73">32.44dp</dimen>
<dimen name="dp74">32.89dp</dimen>
<dimen name="dp75">33.33dp</dimen>
<dimen name="dp76">33.78dp</dimen>
<dimen name="dp77">34.22dp</dimen>
<dimen name="dp78">34.67dp</dimen>
<dimen name="dp79">35.11dp</dimen>
<dimen name="dp80">35.56dp</dimen>
<dimen name="dp81">36.00dp</dimen>
<dimen name="dp82">36.44dp</dimen>
<dimen name="dp83">36.89dp</dimen>
<dimen name="dp84">37.33dp</dimen>
<dimen name="dp85">37.78dp</dimen>
<dimen name="dp86">38.22dp</dimen>
<dimen name="dp87">38.67dp</dimen>
<dimen name="dp88">39.11dp</dimen>
<dimen name="dp89">39.56dp</dimen>
<dimen name="dp90">40.00dp</dimen>
<dimen name="dp91">40.44dp</dimen>
<dimen name="dp92">40.89dp</dimen>
<dimen name="dp93">41.33dp</dimen>
<dimen name="dp94">41.78dp</dimen>
<dimen name="dp95">42.22dp</dimen>
<dimen name="dp96">42.67dp</dimen>
<dimen name="dp97">43.11dp</dimen>
<dimen name="dp98">43.56dp</dimen>
<dimen name="dp99">44.00dp</dimen>
<dimen name="dp100">44.44dp</dimen>
<dimen name="dp101">44.89dp</dimen>
<dimen name="dp102">45.33dp</dimen>
<dimen name="dp103">45.78dp</dimen>
<dimen name="dp104">46.22dp</dimen>
<dimen name="dp105">46.67dp</dimen>
<dimen name="dp106">47.11dp</dimen>
<dimen name="dp107">47.56dp</dimen>
<dimen name="dp108">48.00dp</dimen>
<dimen name="dp109">48.44dp</dimen>
<dimen name="dp110">48.89dp</dimen>
<dimen name="dp111">49.33dp</dimen>
<dimen name="dp112">49.78dp</dimen>
<dimen name="dp113">50.22dp</dimen>
<dimen name="dp114">50.67dp</dimen>
<dimen name="dp115">51.11dp</dimen>
<dimen name="dp116">51.56dp</dimen>
<dimen name="dp117">52.00dp</dimen>
<dimen name="dp118">52.44dp</dimen>
<dimen name="dp119">52.89dp</dimen>
<dimen name="dp120">53.33dp</dimen>
<dimen name="dp121">53.78dp</dimen>
<dimen name="dp122">54.22dp</dimen>
<dimen name="dp123">54.67dp</dimen>
<dimen name="dp124">55.11dp</dimen>
<dimen name="dp125">55.56dp</dimen>
<dimen name="dp126">56.00dp</dimen>
<dimen name="dp127">56.44dp</dimen>
<dimen name="dp128">56.89dp</dimen>
<dimen name="dp129">57.33dp</dimen>
<dimen name="dp130">57.78dp</dimen>
<dimen name="dp131">58.22dp</dimen>
<dimen name="dp132">58.67dp</dimen>
<dimen name="dp133">59.11dp</dimen>
<dimen name="dp134">59.56dp</dimen>
<dimen name="dp135">60.00dp</dimen>
<dimen name="dp136">60.44dp</dimen>
<dimen name="dp137">60.89dp</dimen>
<dimen name="dp138">61.33dp</dimen>
<dimen name="dp139">61.78dp</dimen>
<dimen name="dp140">62.22dp</dimen>
<dimen name="dp141">62.67dp</dimen>
<dimen name="dp142">63.11dp</dimen>
<dimen name="dp143">63.56dp</dimen>
<dimen name="dp144">64.00dp</dimen>
<dimen name="dp145">64.44dp</dimen>
<dimen name="dp146">64.89dp</dimen>
<dimen name="dp147">65.33dp</dimen>
<dimen name="dp148">65.78dp</dimen>
<dimen name="dp149">66.22dp</dimen>
<dimen name="dp150">66.67dp</dimen>
<dimen name="dp151">67.11dp</dimen>
<dimen name="dp152">67.56dp</dimen>
<dimen name="dp153">68.00dp</dimen>
<dimen name="dp154">68.44dp</dimen>
<dimen name="dp155">68.89dp</dimen>
<dimen name="dp156">69.33dp</dimen>
<dimen name="dp157">69.78dp</dimen>
<dimen name="dp158">70.22dp</dimen>
<dimen name="dp159">70.67dp</dimen>
<dimen name="dp160">71.11dp</dimen>
<dimen name="dp161">71.56dp</dimen>
<dimen name="dp162">72.00dp</dimen>
<dimen name="dp163">72.44dp</dimen>
<dimen name="dp164">72.89dp</dimen>
<dimen name="dp165">73.33dp</dimen>
<dimen name="dp166">73.78dp</dimen>
<dimen name="dp167">74.22dp</dimen>
<dimen name="dp168">74.67dp</dimen>
<dimen name="dp169">75.11dp</dimen>
<dimen name="dp170">75.56dp</dimen>
<dimen name="dp171">76.00dp</dimen>
<dimen name="dp172">76.44dp</dimen>
<dimen name="dp173">76.89dp</dimen>
<dimen name="dp174">77.33dp</dimen>
<dimen name="dp175">77.78dp</dimen>
<dimen name="dp176">78.22dp</dimen>
<dimen name="dp177">78.67dp</dimen>
<dimen name="dp178">79.11dp</dimen>
<dimen name="dp179">79.56dp</dimen>
<dimen name="dp180">80.00dp</dimen>
<dimen name="dp181">80.44dp</dimen>
<dimen name="dp182">80.89dp</dimen>
<dimen name="dp183">81.33dp</dimen>
<dimen name="dp184">81.78dp</dimen>
<dimen name="dp185">82.22dp</dimen>
<dimen name="dp186">82.67dp</dimen>
<dimen name="dp187">83.11dp</dimen>
<dimen name="dp188">83.56dp</dimen>
<dimen name="dp189">84.00dp</dimen>
<dimen name="dp190">84.44dp</dimen>
<dimen name="dp191">84.89dp</dimen>
<dimen name="dp192">85.33dp</dimen>
<dimen name="dp193">85.78dp</dimen>
<dimen name="dp194">86.22dp</dimen>
<dimen name="dp195">86.67dp</dimen>
<dimen name="dp196">87.11dp</dimen>
<dimen name="dp197">87.56dp</dimen>
<dimen name="dp198">88.00dp</dimen>
<dimen name="dp199">88.44dp</dimen>
<dimen name="dp200">88.89dp</dimen>
<dimen name="dp201">89.33dp</dimen>
<dimen name="dp202">89.78dp</dimen>
<dimen name="dp203">90.22dp</dimen>
<dimen name="dp204">90.67dp</dimen>
<dimen name="dp205">91.11dp</dimen>
<dimen name="dp206">91.56dp</dimen>
<dimen name="dp207">92.00dp</dimen>
<dimen name="dp208">92.44dp</dimen>
<dimen name="dp209">92.89dp</dimen>
<dimen name="dp210">93.33dp</dimen>
<dimen name="dp211">93.78dp</dimen>
<dimen name="dp212">94.22dp</dimen>
<dimen name="dp213">94.67dp</dimen>
<dimen name="dp214">95.11dp</dimen>
<dimen name="dp215">95.56dp</dimen>
<dimen name="dp216">96.00dp</dimen>
<dimen name="dp217">96.44dp</dimen>
<dimen name="dp218">96.89dp</dimen>
<dimen name="dp219">97.33dp</dimen>
<dimen name="dp220">97.78dp</dimen>
<dimen name="dp221">98.22dp</dimen>
<dimen name="dp222">98.67dp</dimen>
<dimen name="dp223">99.11dp</dimen>
<dimen name="dp224">99.56dp</dimen>
<dimen name="dp225">100.00dp</dimen>
<dimen name="dp226">100.44dp</dimen>
<dimen name="dp227">100.89dp</dimen>
<dimen name="dp228">101.33dp</dimen>
<dimen name="dp229">101.78dp</dimen>
<dimen name="dp230">102.22dp</dimen>
<dimen name="dp231">102.67dp</dimen>
<dimen name="dp232">103.11dp</dimen>
<dimen name="dp233">103.56dp</dimen>
<dimen name="dp234">104.00dp</dimen>
<dimen name="dp235">104.44dp</dimen>
<dimen name="dp236">104.89dp</dimen>
<dimen name="dp237">105.33dp</dimen>
<dimen name="dp238">105.78dp</dimen>
<dimen name="dp239">106.22dp</dimen>
<dimen name="dp240">106.67dp</dimen>
<dimen name="dp241">107.11dp</dimen>
<dimen name="dp242">107.56dp</dimen>
<dimen name="dp243">108.00dp</dimen>
<dimen name="dp244">108.44dp</dimen>
<dimen name="dp245">108.89dp</dimen>
<dimen name="dp246">109.33dp</dimen>
<dimen name="dp247">109.78dp</dimen>
<dimen name="dp248">110.22dp</dimen>
<dimen name="dp249">110.67dp</dimen>
<dimen name="dp250">111.11dp</dimen>
<dimen name="dp251">111.56dp</dimen>
<dimen name="dp252">112.00dp</dimen>
<dimen name="dp253">112.44dp</dimen>
<dimen name="dp254">112.89dp</dimen>
<dimen name="dp255">113.33dp</dimen>
<dimen name="dp256">113.78dp</dimen>
<dimen name="dp257">114.22dp</dimen>
<dimen name="dp258">114.67dp</dimen>
<dimen name="dp259">115.11dp</dimen>
<dimen name="dp260">115.56dp</dimen>
<dimen name="dp261">116.00dp</dimen>
<dimen name="dp262">116.44dp</dimen>
<dimen name="dp263">116.89dp</dimen>
<dimen name="dp264">117.33dp</dimen>
<dimen name="dp265">117.78dp</dimen>
<dimen name="dp266">118.22dp</dimen>
<dimen name="dp267">118.67dp</dimen>
<dimen name="dp268">119.11dp</dimen>
<dimen name="dp269">119.56dp</dimen>
<dimen name="dp270">120.00dp</dimen>
<dimen name="dp271">120.44dp</dimen>
<dimen name="dp272">120.89dp</dimen>
<dimen name="dp273">121.33dp</dimen>
<dimen name="dp274">121.78dp</dimen>
<dimen name="dp275">122.22dp</dimen>
<dimen name="dp276">122.67dp</dimen>
<dimen name="dp277">123.11dp</dimen>
<dimen name="dp278">123.56dp</dimen>
<dimen name="dp279">124.00dp</dimen>
<dimen name="dp280">124.44dp</dimen>
<dimen name="dp281">124.89dp</dimen>
<dimen name="dp282">125.33dp</dimen>
<dimen name="dp283">125.78dp</dimen>
<dimen name="dp284">126.22dp</dimen>
<dimen name="dp285">126.67dp</dimen>
<dimen name="dp286">127.11dp</dimen>
<dimen name="dp287">127.56dp</dimen>
<dimen name="dp288">128.00dp</dimen>
<dimen name="dp289">128.44dp</dimen>
<dimen name="dp290">128.89dp</dimen>
<dimen name="dp291">129.33dp</dimen>
<dimen name="dp292">129.78dp</dimen>
<dimen name="dp293">130.22dp</dimen>
<dimen name="dp294">130.67dp</dimen>
<dimen name="dp295">131.11dp</dimen>
<dimen name="dp296">131.56dp</dimen>
<dimen name="dp297">132.00dp</dimen>
<dimen name="dp298">132.44dp</dimen>
<dimen name="dp299">132.89dp</dimen>
<dimen name="dp300">133.33dp</dimen>
<dimen name="dp301">133.78dp</dimen>
<dimen name="dp302">134.22dp</dimen>
<dimen name="dp303">134.67dp</dimen>
<dimen name="dp304">135.11dp</dimen>
<dimen name="dp305">135.56dp</dimen>
<dimen name="dp306">136.00dp</dimen>
<dimen name="dp307">136.44dp</dimen>
<dimen name="dp308">136.89dp</dimen>
<dimen name="dp309">137.33dp</dimen>
<dimen name="dp310">137.78dp</dimen>
<dimen name="dp311">138.22dp</dimen>
<dimen name="dp312">138.67dp</dimen>
<dimen name="dp313">139.11dp</dimen>
<dimen name="dp314">139.56dp</dimen>
<dimen name="dp315">140.00dp</dimen>
<dimen name="dp316">140.44dp</dimen>
<dimen name="dp317">140.89dp</dimen>
<dimen name="dp318">141.33dp</dimen>
<dimen name="dp319">141.78dp</dimen>
<dimen name="dp320">142.22dp</dimen>
<dimen name="dp321">142.67dp</dimen>
<dimen name="dp322">143.11dp</dimen>
<dimen name="dp323">143.56dp</dimen>
<dimen name="dp324">144.00dp</dimen>
<dimen n
Download .txt
gitextract_r9qdw748/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── doc/
│   │   └── yujingtest.jks
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── yujing/
│       │               └── chuankou/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── yujing/
│       │   │           └── chuankou/
│       │   │               ├── App.kt
│       │   │               ├── activity/
│       │   │               │   ├── MainActivity.java
│       │   │               │   ├── SendActivity.java
│       │   │               │   ├── myTest/
│       │   │               │   │   ├── MyMainActivity.java
│       │   │               │   │   ├── SendFileActivity.java
│       │   │               │   │   └── SyncActivity.java
│       │   │               │   └── wifi/
│       │   │               │       ├── SerialPortToWiFiActivity.kt
│       │   │               │       └── socket/
│       │   │               │           ├── ClientSocket.kt
│       │   │               │           └── Server.kt
│       │   │               ├── base/
│       │   │               │   ├── BaseActivity.java
│       │   │               │   └── KBaseActivity.kt
│       │   │               ├── config/
│       │   │               │   └── Config.kt
│       │   │               └── utils/
│       │   │                   └── Setting.java
│       │   ├── res/
│       │   │   ├── drawable/
│       │   │   │   ├── bt_click.xml
│       │   │   │   ├── item_click.xml
│       │   │   │   └── set_selector.xml
│       │   │   ├── layout/
│       │   │   │   ├── activity_main.xml
│       │   │   │   ├── activity_my_main.xml
│       │   │   │   ├── activity_send.xml
│       │   │   │   ├── activity_send_file.xml
│       │   │   │   ├── activity_serialport_to_wifi.xml
│       │   │   │   └── view_set.xml
│       │   │   ├── values/
│       │   │   │   ├── colors.xml
│       │   │   │   ├── dimens.xml
│       │   │   │   ├── strings.xml
│       │   │   │   └── styles.xml
│       │   │   └── xml/
│       │   │       ├── file_paths.xml
│       │   │       ├── network_config.xml
│       │   │       └── provider_paths.xml
│       │   └── res_screen/
│       │       ├── values/
│       │       │   └── dimens.xml
│       │       ├── values-sw1080dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw320dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw332dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw345dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw360dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw375dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw392dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw411dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw432dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw454dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw480dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw508dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw540dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw576dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw617dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw664dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw720dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw785dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw864dp/
│       │       │   └── dimens.xml
│       │       └── values-sw960dp/
│       │           └── dimens.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── yujing/
│                       └── chuankou/
│                           ├── ExampleUnitTest.java
│                           └── Values_sw.java
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── yserialport/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── build.gradle
    ├── consumer-rules.pro
    ├── proguard-rules.pro
    └── src/
        └── main/
            ├── AndroidManifest.xml
            ├── cpp/
            │   ├── YSerialPort.c
            │   ├── YSerialPort.h
            │   └── gen_YSerialPort_h.sh
            ├── java/
            │   └── com/
            │       └── yujing/
            │           ├── serialport/
            │           │   ├── SerialPort.java
            │           │   └── SerialPortFinder.java
            │           └── yserialport/
            │               ├── DataListener.java
            │               ├── InputStreamReadListener.java
            │               ├── ThreadMode.kt
            │               ├── YBytes.java
            │               ├── YListener.java
            │               ├── YReadInputStream.java
            │               └── YSerialPort.java
            └── res/
                └── values/
                    └── strings.xml
Download .txt
SYMBOL INDEX (193 symbols across 19 files)

FILE: app/src/androidTest/java/com/yujing/chuankou/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 13) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 15) | @Test

FILE: app/src/main/java/com/yujing/chuankou/activity/MainActivity.java
  class MainActivity (line 15) | public class MainActivity extends BaseActivity<ActivityMainBinding> {
    method MainActivity (line 17) | public MainActivity() {
    method init (line 21) | @Override

FILE: app/src/main/java/com/yujing/chuankou/activity/SendActivity.java
  class SendActivity (line 25) | public class SendActivity extends KBaseActivity<ActivitySendBinding> {
    method SendActivity (line 31) | public SendActivity() {
    method init (line 35) | @Override
    method sendHexString (line 79) | private void sendHexString() {
    method sendString (line 100) | private void sendString() {
    method onDestroy (line 126) | @Override

FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/MyMainActivity.java
  class MyMainActivity (line 7) | public class MyMainActivity extends BaseActivity<ActivityMyMainBinding> {
    method MyMainActivity (line 8) | public MyMainActivity() {
    method init (line 12) | @Override

FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/SendFileActivity.java
  class SendFileActivity (line 20) | public class SendFileActivity extends BaseActivity<ActivitySendFileBindi...
    method SendFileActivity (line 24) | public SendFileActivity() {
    method init (line 28) | @Override
    method sendFile (line 51) | private void sendFile() {
    method onClick (line 72) | public void onClick() {
    method onActivityResult (line 79) | @Override
    method onDestroy (line 101) | @Override

FILE: app/src/main/java/com/yujing/chuankou/activity/myTest/SyncActivity.java
  class SyncActivity (line 23) | public class SyncActivity extends KBaseActivity<ActivitySendBinding> {
    method SyncActivity (line 31) | public SyncActivity() {
    method init (line 35) | @Override
    method sendHexString (line 67) | private void sendHexString() {
    method sendString (line 104) | private void sendString() {
    method showData (line 136) | private void showData(byte[] bytes) {
    method showDataFail (line 147) | private void showDataFail(String fail) {
    method onDestroy (line 157) | @Override

FILE: app/src/main/java/com/yujing/chuankou/base/BaseActivity.java
  class BaseActivity (line 22) | public abstract class BaseActivity<B extends ViewDataBinding> extends YB...
    method BaseActivity (line 25) | public BaseActivity(int layout) {
    method initBefore (line 29) | @Override

FILE: app/src/main/java/com/yujing/chuankou/utils/Setting.java
  class Setting (line 11) | public class Setting {
    method setting (line 19) | public static void setting(Activity activity, ViewSetBinding includeSe...

FILE: app/src/test/java/com/yujing/chuankou/ExampleUnitTest.java
  class ExampleUnitTest (line 10) | public class ExampleUnitTest {
    method test (line 11) | @Test

FILE: app/src/test/java/com/yujing/chuankou/Values_sw.java
  class Values_sw (line 39) | public class Values_sw {
    method run (line 45) | @Test
    method setDimen (line 68) | static void setDimen(double scale, String name) {

FILE: yserialport/src/main/cpp/YSerialPort.c
  function speed_t (line 32) | static speed_t getBaudrate(jint baudrate) {
  function JNICALL (line 113) | JNICALL Java_com_yujing_serialport_SerialPort_open(JNIEnv *env, jobject ...
  function JNICALL (line 223) | JNICALL Java_com_yujing_serialport_SerialPort_close(JNIEnv *env, jobject...

FILE: yserialport/src/main/java/com/yujing/serialport/SerialPort.java
  class SerialPort (line 45) | public final class SerialPort {
    method open (line 59) | private native FileDescriptor open(String absolutePath, int baudRate, ...
    method close (line 62) | public native void close();
    method setSuPath (line 73) | public static void setSuPath(String suPath) {
    method getSuPath (line 78) | public static String getSuPath() {
    method SerialPort (line 94) | public SerialPort(File device, int baudRate, int dataBits, int parity,...
    method SerialPort (line 136) | public SerialPort(File device, int baudRate) throws SecurityException,...
    method SerialPort (line 151) | public SerialPort(File device, int baudRate, int dataBits, int parity,...
    method getInputStream (line 156) | public InputStream getInputStream() {
    method getOutputStream (line 160) | public OutputStream getOutputStream() {
    method getDevice (line 167) | public File getDevice() {
    method getBaudRate (line 174) | public int getBaudRate() {
    method getDataBits (line 181) | public int getDataBits() {
    method getParity (line 188) | public int getParity() {
    method getStopBits (line 195) | public int getStopBits() {
    method getFlags (line 199) | public int getFlags() {
    method tryClose (line 206) | public void tryClose() {
    method newBuilder (line 224) | public static Builder newBuilder(File device, int baudRate) {
    method newBuilder (line 228) | public static Builder newBuilder(String devicePath, int baudRate) {
    class Builder (line 232) | public final static class Builder {
      method Builder (line 240) | private Builder(File device, int baudRate) {
      method Builder (line 245) | private Builder(String devicePath, int baudRate) {
      method dataBits (line 255) | public Builder dataBits(int dataBits) {
      method parity (line 266) | public Builder parity(int parity) {
      method stopBits (line 277) | public Builder stopBits(int stopBits) {
      method flags (line 288) | public Builder flags(int flags) {
      method build (line 300) | public SerialPort build() throws SecurityException, IOException {

FILE: yserialport/src/main/java/com/yujing/serialport/SerialPortFinder.java
  class SerialPortFinder (line 31) | public class SerialPortFinder {
    method getDrivers (line 35) | Vector<Driver> getDrivers() throws IOException {
    method getAllDevices (line 59) | public String[] getAllDevices() {
    method getAllDevicesPath (line 83) | public String[] getAllDevicesPath() {
    class Driver (line 104) | public static class Driver {
      method Driver (line 109) | public Driver(String name, String root) {
      method getDevices (line 114) | public Vector<File> getDevices() {
      method getName (line 132) | public String getName() {

FILE: yserialport/src/main/java/com/yujing/yserialport/DataListener.java
  type DataListener (line 6) | public interface DataListener {
    method value (line 7) | void value(String hexString, byte[] bytes);

FILE: yserialport/src/main/java/com/yujing/yserialport/InputStreamReadListener.java
  type InputStreamReadListener (line 10) | public interface InputStreamReadListener {
    method inputStreamToBytes (line 11) | byte[] inputStreamToBytes(InputStream inputStream) throws IOException;

FILE: yserialport/src/main/java/com/yujing/yserialport/YBytes.java
  class YBytes (line 11) | @SuppressWarnings("unused")
    method YBytes (line 18) | public YBytes() {
    method YBytes (line 27) | public YBytes(int i) {
    method YBytes (line 36) | public YBytes(byte[] b) {
    method addByte (line 47) | public YBytes addByte(byte b) {
    method addByte (line 61) | public YBytes addByte(byte[] bs) {
    method addByte (line 76) | public YBytes addByte(byte[] bs, int length) {
    method addByte (line 92) | public YBytes addByte(byte[] bs, int start, int length) {
    method addByte (line 106) | public YBytes addByte(List<Byte> bs) {
    method addByte (line 123) | public YBytes addByte(List<Byte> bs, int length) {
    method addByte (line 141) | public YBytes addByte(List<Byte> bs, int start, int length) {
    method changeByte (line 158) | public YBytes changeByte(byte b, int index) {
    method changeByte (line 172) | public YBytes changeByte(byte[] b, int index) {
    method changeByte (line 184) | public YBytes changeByte(byte[] b, int start, int length) {
    method changeByte (line 202) | public YBytes changeByte(List<Byte> b, int index) {
    method changeByte (line 214) | public YBytes changeByte(List<Byte> b, int start, int length) {
    method setBytes (line 230) | public void setBytes(byte[] bytes) {
    method split (line 241) | public static List<byte[]> split(byte[] bytes, int length) {
    method split (line 267) | public List<byte[]> split(int length) {
    method getBytes (line 276) | public byte[] getBytes() {

FILE: yserialport/src/main/java/com/yujing/yserialport/YListener.java
  type YListener (line 9) | public interface YListener<Value> {
    method value (line 15) | void value(Value value);

FILE: yserialport/src/main/java/com/yujing/yserialport/YReadInputStream.java
  class YReadInputStream (line 38) | public class YReadInputStream {
    method YReadInputStream (line 55) | public YReadInputStream() {
    method YReadInputStream (line 58) | public YReadInputStream(InputStream inputStream, YListener<byte[]> rea...
    method setInputStream (line 63) | public void setInputStream(InputStream inputStream) {
    method setReadListener (line 67) | public void setReadListener(YListener<byte[]> readListener) {
    method start (line 72) | public void start() {
    method stop (line 80) | public void stop() {
    method setToAuto (line 94) | public void setToAuto(int maxGroupPackageTime) {
    method setToManual (line 107) | public void setToManual(int readLength, int maxTime) {
    class ReadThread (line 114) | private class ReadThread extends Thread {
      method run (line 115) | @Override
    method log (line 139) | private static void log(String string) {
    method log (line 143) | private static void log(String string, Throwable e) {
    method isShowLog (line 147) | public static boolean isShowLog() {
    method setShowLog (line 151) | public static void setShowLog(boolean showLog) {
    method isSleep (line 155) | public static boolean isSleep() {
    method setSleep (line 159) | public static void setSleep(boolean sleep) {
    method isAutoPackage (line 163) | public boolean isAutoPackage() {
    method getMaxGroupPackageTime (line 167) | public int getMaxGroupPackageTime() {
    method getReadLength (line 171) | public int getReadLength() {
    method getMaxTime (line 175) | public int getMaxTime() {
    method isNoDataNotReturn (line 179) | public boolean isNoDataNotReturn() {
    method setNoDataNotReturn (line 183) | public void setNoDataNotReturn(boolean noDataNotReturn) {
    method readOnce (line 196) | @Deprecated
    method readOnce (line 209) | public static byte[] readOnce(InputStream inputStream, long timeOut) t...
    method readTime (line 233) | @Deprecated
    method readTime (line 247) | public static YBytes readTime(InputStream inputStream, int maxGroupTim...
    method readLength (line 281) | public static YBytes readLength(final InputStream inputStream, final i...

FILE: yserialport/src/main/java/com/yujing/yserialport/YSerialPort.java
  class YSerialPort (line 119) | @SuppressWarnings("unused")
    method getSerialPortFinder (line 147) | public static SerialPortFinder getSerialPortFinder() {
    method getDevices (line 152) | public static String[] getDevices() {
    method getBaudRates (line 157) | public static String[] getBaudRates() {
    method YSerialPort (line 177) | public YSerialPort(Context context, String device, String baudRate) {
    method setToAuto (line 187) | public void setToAuto() {
    method setToAuto (line 200) | public void setToAuto(int maxGroupPackageTime) {
    method setToManual (line 213) | public void setToManual(int readLength, int maxTime) {
    method start (line 221) | public void start() {
    method start (line 230) | public void start(SerialPort sp) {
    class ReadThread (line 275) | protected class ReadThread extends Thread {
      method setReadListener (line 278) | public void setReadListener(YListener<byte[]> readListener) {
      method run (line 282) | @Override
    method reStart (line 297) | public void reStart() {
    method reStart (line 308) | public void reStart(String device, String baudRate) {
    method send (line 319) | public void send(byte[] bytes) {
    method send (line 329) | public void send(byte[] bytes, YListener<Boolean> listener) {
    method send (line 340) | public void send(final byte[] bytes, final YListener<Boolean> listener...
    method sendSynchronization (line 355) | public boolean sendSynchronization(final byte[] bytes) {
    method sendSynchronization (line 366) | public boolean sendSynchronization(final byte[] bytes, final YListener...
    method isMainThread (line 395) | private boolean isMainThread() {
    method post (line 403) | private void post(Runnable runnable) {
    method isNoDataNotReturn (line 426) | public boolean isNoDataNotReturn() {
    method setNoDataNotReturn (line 430) | public void setNoDataNotReturn(boolean noDataNotReturn) {
    method addDataListener (line 441) | public void addDataListener(DataListener dataListener) {
    method removeDataListener (line 451) | public void removeDataListener(DataListener dataListener) {
    method clearDataListener (line 458) | public void clearDataListener() {
    method setDevice (line 468) | public void setDevice(String device, String baudRate) {
    method getDevice (line 478) | public String getDevice() {
    method setDevice (line 487) | public void setDevice(String device) {
    method getBaudRate (line 496) | public String getBaudRate() {
    method setBaudRate (line 505) | public void setBaudRate(String baudRate) {
    method setInputStreamReadListener (line 514) | public void setInputStreamReadListener(InputStreamReadListener inputSt...
    method getContext (line 518) | public Context getContext() {
    method setContext (line 522) | public void setContext(Context context) {
    method setErrorListener (line 531) | public void setErrorListener(ErrorListener errorListener) {
    method getSerialPort (line 540) | public SerialPort getSerialPort() {
    method getOutputStream (line 549) | public OutputStream getOutputStream() {
    method getInputStream (line 558) | public InputStream getInputStream() {
    method getThreadMode (line 567) | public ThreadMode getThreadMode() {
    method setThreadMode (line 576) | public void setThreadMode(ThreadMode threadMode) {
    method DisplayError (line 585) | private void DisplayError(String error) {
    type ErrorListener (line 600) | public interface ErrorListener {
      method error (line 601) | void error(String error);
    method stop (line 607) | private void stop() {
    method onDestroy (line 640) | public void onDestroy() {
    method getInstance (line 660) | public static YSerialPort getInstance(Context context, String device, ...
    method bytesToHexString (line 679) | public static String bytesToHexString(byte[] bArray) {
    method saveDevice (line 693) | @Deprecated
    method readDevice (line 706) | @Deprecated
    method saveBaudRate (line 713) | @Deprecated
    method readBaudRate (line 726) | @Deprecated
    method sendSyncOnce (line 740) | @Deprecated
    method sendSyncOnce (line 754) | public static byte[] sendSyncOnce(String device, String baudRate, byte...
    method sendSyncOnce (line 775) | @Deprecated
    method sendSyncOnce (line 791) | public static byte[] sendSyncOnce(SerialPort serialPort, byte[] bytes,...
    method sendSyncTime (line 813) | @Deprecated
    method sendSyncTime (line 828) | public static byte[] sendSyncTime(String device, String baudRate, byte...
    method sendSyncTime (line 850) | public static byte[] sendSyncTime(SerialPort serialPort, byte[] bytes,...
    method sendSyncTime (line 866) | public static byte[] sendSyncTime(SerialPort serialPort, byte[] bytes,...
    method sendSyncLength (line 891) | public static byte[] sendSyncLength(String device, String baudRate, by...
    method sendSyncLength (line 914) | public static byte[] sendSyncLength(SerialPort serialPort, byte[] byte...
Condensed preview — 86 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (997K chars).
[
  {
    "path": ".gitignore",
    "chars": 96,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n/gradles/"
  },
  {
    "path": "README.md",
    "chars": 8005,
    "preview": "# YSerialPort\n\n源Android-SerialPort-API,重新封装代码,实现读取串口数据,实现重新组包一次性读取完整数据。可连续读取任意长度数据。\n\n重写串口so库名称和调用函数名称,不与其他串口工具形成so冲突或者类名"
  },
  {
    "path": "app/.gitignore",
    "chars": 15,
    "preview": "/build\n/release"
  },
  {
    "path": "app/build.gradle",
    "chars": 3807,
    "preview": "plugins {\n    id 'com.android.application'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'kotlin-par"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 1359,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "app/src/androidTest/java/com/yujing/chuankou/ExampleInstrumentedTest.java",
    "chars": 417,
    "preview": "package com.yujing.chuankou;\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.j"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 1734,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/App.kt",
    "chars": 2562,
    "preview": "package com.yujing.chuankou\n\nimport android.app.Application\nimport android.content.pm.PackageManager\nimport android.os.B"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/MainActivity.java",
    "chars": 1237,
    "preview": "package com.yujing.chuankou.activity;\n\nimport android.app.AlertDialog;\n\nimport com.yujing.chuankou.R;\nimport com.yujing."
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/SendActivity.java",
    "chars": 5213,
    "preview": "package com.yujing.chuankou.activity;\n\nimport com.yujing.chuankou.R;\nimport com.yujing.chuankou.base.KBaseActivity;\nimpo"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/myTest/MyMainActivity.java",
    "chars": 628,
    "preview": "package com.yujing.chuankou.activity.myTest;\n\nimport com.yujing.chuankou.R;\nimport com.yujing.chuankou.base.BaseActivity"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/myTest/SendFileActivity.java",
    "chars": 3710,
    "preview": "package com.yujing.chuankou.activity.myTest;\n\nimport android.content.Intent;\nimport android.net.Uri;\n\nimport com.yujing."
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/myTest/SyncActivity.java",
    "chars": 5961,
    "preview": "package com.yujing.chuankou.activity.myTest;\n\nimport com.yujing.chuankou.R;\nimport com.yujing.chuankou.base.KBaseActivit"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/wifi/SerialPortToWiFiActivity.kt",
    "chars": 9317,
    "preview": "package com.yujing.chuankou.activity.wifi\n\nimport android.app.AlertDialog\nimport android.content.DialogInterface\nimport "
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/wifi/socket/ClientSocket.kt",
    "chars": 1730,
    "preview": "package com.yujing.chuankou.activity.wifi.socket\n\nimport com.yujing.contract.YListener\nimport com.yujing.contract.YListe"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/activity/wifi/socket/Server.kt",
    "chars": 3688,
    "preview": "package com.yujing.chuankou.activity.wifi.socket\n\nimport com.yujing.contract.YListener\nimport com.yujing.contract.YListe"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/base/BaseActivity.java",
    "chars": 654,
    "preview": "package com.yujing.chuankou.base;\n\nimport androidx.databinding.ViewDataBinding;\n\nimport com.yujing.base.YBaseActivity;\n\n"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/base/KBaseActivity.kt",
    "chars": 1315,
    "preview": "@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\npackage com.yujing.chuankou.base\n\nimport android.annotation.SuppressLint"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/config/Config.kt",
    "chars": 443,
    "preview": "package com.yujing.chuankou.config\n\nimport com.yujing.utils.YSaveFiles\n\nobject Config {\n    //串口,此值可以在 sdcard/Android/da"
  },
  {
    "path": "app/src/main/java/com/yujing/chuankou/utils/Setting.java",
    "chars": 2289,
    "preview": "package com.yujing.chuankou.utils;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\n\nimport com.yujing.chua"
  },
  {
    "path": "app/src/main/res/drawable/bt_click.xml",
    "chars": 1230,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- 按下"
  },
  {
    "path": "app/src/main/res/drawable/item_click.xml",
    "chars": 364,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <!-- 按"
  },
  {
    "path": "app/src/main/res/drawable/set_selector.xml",
    "chars": 349,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!--按下颜"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "chars": 3681,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app="
  },
  {
    "path": "app/src/main/res/layout/activity_my_main.xml",
    "chars": 2403,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app="
  },
  {
    "path": "app/src/main/res/layout/activity_send.xml",
    "chars": 10062,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app="
  },
  {
    "path": "app/src/main/res/layout/activity_send_file.xml",
    "chars": 3008,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tool"
  },
  {
    "path": "app/src/main/res/layout/activity_serialport_to_wifi.xml",
    "chars": 27584,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app="
  },
  {
    "path": "app/src/main/res/layout/view_set.xml",
    "chars": 2765,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <LinearL"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 7238,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">@color/title</color>\n    <color name=\""
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 211,
    "preview": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 308,
    "preview": "<resources>\n    <string name=\"app_name\">串口通信</string>\n    <string name=\"app_name_debug\">串口通信(测试)</string>\n    <string na"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 655,
    "preview": "<resources>\n    <style name=\"AppTheme_old\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your the"
  },
  {
    "path": "app/src/main/res/xml/file_paths.xml",
    "chars": 137,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<resources>\n    <paths>\n        <external-path path=\"\" name=\"download\"/>\n    </pa"
  },
  {
    "path": "app/src/main/res/xml/network_config.xml",
    "chars": 144,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\" />\n</"
  },
  {
    "path": "app/src/main/res/xml/provider_paths.xml",
    "chars": 392,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- /stor"
  },
  {
    "path": "app/src/main/res_screen/values/dimens.xml",
    "chars": 33738,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.00dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw1080dp/dimens.xml",
    "chars": 33864,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.50dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw320dp/dimens.xml",
    "chars": 33486,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.44dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw332dp/dimens.xml",
    "chars": 33496,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.46dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw345dp/dimens.xml",
    "chars": 33506,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.48dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw360dp/dimens.xml",
    "chars": 33518,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.50dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw375dp/dimens.xml",
    "chars": 33534,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.52dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw392dp/dimens.xml",
    "chars": 33552,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.55dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw411dp/dimens.xml",
    "chars": 33572,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.57dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw432dp/dimens.xml",
    "chars": 33590,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.60dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw454dp/dimens.xml",
    "chars": 33608,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.63dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw480dp/dimens.xml",
    "chars": 33628,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.67dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw508dp/dimens.xml",
    "chars": 33644,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.71dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw540dp/dimens.xml",
    "chars": 33662,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.75dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw576dp/dimens.xml",
    "chars": 33682,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.80dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw617dp/dimens.xml",
    "chars": 33700,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.86dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw664dp/dimens.xml",
    "chars": 33718,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">0.92dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw720dp/dimens.xml",
    "chars": 33738,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.00dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw785dp/dimens.xml",
    "chars": 33754,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.09dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw864dp/dimens.xml",
    "chars": 33772,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.20dp</dimen>\n<di"
  },
  {
    "path": "app/src/main/res_screen/values-sw960dp/dimens.xml",
    "chars": 33792,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<dimen name=\"dp0\">0.00dp</dimen>\n<dimen name=\"dp1\">1.33dp</dimen>\n<di"
  },
  {
    "path": "app/src/test/java/com/yujing/chuankou/ExampleUnitTest.java",
    "chars": 329,
    "preview": "package com.yujing.chuankou;\n\nimport org.junit.Test;\n\n/**\n * Example local unit test, which will execute on the developm"
  },
  {
    "path": "app/src/test/java/com/yujing/chuankou/Values_sw.java",
    "chars": 3636,
    "preview": "package com.yujing.chuankou;\n\nimport org.junit.Test;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io"
  },
  {
    "path": "build.gradle",
    "chars": 265,
    "preview": "plugins {\n    id 'com.android.application' version '8.10.0' apply false\n    id 'com.android.library' version '8.10.0' ap"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 253,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 862,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "gradlew",
    "chars": 8710,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "gradlew.bat",
    "chars": 2843,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "settings.gradle",
    "chars": 470,
    "preview": "pluginManagement {\n    repositories {\n        gradlePluginPortal()\n        google()\n        mavenCentral()\n        maven"
  },
  {
    "path": "yserialport/.gitignore",
    "chars": 21,
    "preview": "/build\n/.cxx\n/.gradle"
  },
  {
    "path": "yserialport/CMakeLists.txt",
    "chars": 1098,
    "preview": "# 设置构建本地库所需的最低 CMake 版本\n# 此版本及以上才支持 target_link_options 等指令\ncmake_minimum_required(VERSION 3.13)\n\n# 添加一个共享库(.so 文件),名称为 "
  },
  {
    "path": "yserialport/build.gradle",
    "chars": 1528,
    "preview": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'kotlin-parceli"
  },
  {
    "path": "yserialport/consumer-rules.pro",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "yserialport/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "yserialport/src/main/AndroidManifest.xml",
    "chars": 349,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.yujing.yserialport\">\n    <!--串口权限-"
  },
  {
    "path": "yserialport/src/main/cpp/YSerialPort.c",
    "chars": 6697,
    "preview": "/*\n * Copyright 2009-2011 Cedric Priscal\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you ma"
  },
  {
    "path": "yserialport/src/main/cpp/YSerialPort.h",
    "chars": 783,
    "preview": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class com_yujing_serialport_SerialP"
  },
  {
    "path": "yserialport/src/main/cpp/gen_YSerialPort_h.sh",
    "chars": 91,
    "preview": "#!/bin/sh\njavah -o YSerialPort.h -jni -classpath ../java com.yujing.serialport.SerialPort\n\n"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/serialport/SerialPort.java",
    "chars": 7956,
    "preview": "/*\n * Copyright 2009 Cedric Priscal\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/serialport/SerialPortFinder.java",
    "chars": 4230,
    "preview": "/*\n * Copyright 2009 Cedric Priscal\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/DataListener.java",
    "chars": 131,
    "preview": "package com.yujing.yserialport;\n\n/**\n * 结果回调\n */\npublic interface DataListener {\n    void value(String hexString, byte[]"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/InputStreamReadListener.java",
    "chars": 282,
    "preview": "package com.yujing.yserialport;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * inputSteam读取解析监听,用于自定义组"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/ThreadMode.kt",
    "chars": 196,
    "preview": "package com.yujing.yserialport\n\n/**\n * 线程类型\n * CURRENT:直接执行\n * NEW:新建线程执行\n * MAIN:是主线程直接执行,不是就先回到主线程再执行\n * IO:是主线程就创建线程,"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/YBytes.java",
    "chars": 6470,
    "preview": "package com.yujing.yserialport;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * byte拼接类\n *\n * @author YuJing"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/YListener.java",
    "chars": 235,
    "preview": "package com.yujing.yserialport;\n\n/**\n * 通用监听\n *\n * @param <Value> 回调类型\n * @author yujing 2020年1月13日17:14:03\n */\npublic i"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/YReadInputStream.java",
    "chars": 9864,
    "preview": "package com.yujing.yserialport;\n\nimport android.os.SystemClock;\nimport android.util.Log;\n\nimport java.io.InputStream;\nim"
  },
  {
    "path": "yserialport/src/main/java/com/yujing/yserialport/YSerialPort.java",
    "chars": 27492,
    "preview": "package com.yujing.yserialport;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport androi"
  },
  {
    "path": "yserialport/src/main/res/values/strings.xml",
    "chars": 74,
    "preview": "<resources>\n    <string name=\"app_name\">YSerialPort</string>\n</resources>\n"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the yutils/YSerialPort GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 86 files (885.6 KB), approximately 363.7k tokens, and a symbol index with 193 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!