diff --git a/.github/ISSUE_TEMPLATE/01-bugReport.md b/.github/ISSUE_TEMPLATE/01-bugReport.md
new file mode 100644
index 000000000..27219b16f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/01-bugReport.md
@@ -0,0 +1,52 @@
+---
+name: "[BUG] 问题提交模板"
+about: 请从符号">"后面开始填写内容,填写内容可以参考 https://github.com/gedoor/legado/issues/505
+title: "[BUG] "
+labels: 'BUG'
+assignees: ''
+---
+
+
+### 机型(如Redmi K30 Pro)
+>
+
+
+### 安卓版本(如Android 7.1.1)
+>
+
+
+### 阅读Legdao版本(我的-关于-版本,如3.20.112220)
+>
+
+### 网络环境(移动,联通,电信,移动宽带,联通宽带,电信宽带,等等..)
+>
+
+
+### 问题描述(简要描述发生的问题)
+>
+
+
+### 使用书源(填写URL或者JSON)
+>
+
+
+```json
+
+
+
+
+
+
+```
+
+### 复现步骤(详细描述导致问题产生的操作步骤,如果能稳定复现)
+>
+
+
+
+
+### 日志提交(问题截图或者日志)
+>
+
+
+
diff --git a/.github/ISSUE_TEMPLATE/02-featureRequest.md b/.github/ISSUE_TEMPLATE/02-featureRequest.md
new file mode 100644
index 000000000..9a09a80b9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/02-featureRequest.md
@@ -0,0 +1,19 @@
+---
+name: "[FeatureRequest] 功能请求模板"
+about: 提交你希望能够在阅读中增加的功能
+title: "[Feature Request] "
+labels: '需求'
+assignees: ''
+---
+
+### 功能描述(请清晰的、详细的描述你想要的功能)
+>
+
+### 期望实现方式(阅读应该如何实现该功能)
+>
+
+### 附加信息(其他的与功能相关的附加信息)
+>
+
+### 效果演示(可以手绘一些草图,或者提供可借鉴的图片)
+>
diff --git a/.github/scripts/lzy_web.py b/.github/scripts/lzy_web.py
new file mode 100644
index 000000000..8cd01a62c
--- /dev/null
+++ b/.github/scripts/lzy_web.py
@@ -0,0 +1,99 @@
+import requests, os, datetime, sys
+
+# Cookie 中 phpdisk_info 的值
+cookie_phpdisk_info = os.environ.get('phpdisk_info')
+# Cookie 中 ylogin 的值
+cookie_ylogin = os.environ.get('ylogin')
+
+# 请求头
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Referer': 'https://pc.woozooo.com/account.php?action=login'
+}
+
+# 小饼干
+cookie = {
+ 'ylogin': cookie_ylogin,
+ 'phpdisk_info': cookie_phpdisk_info
+}
+
+
+# 日志打印
+def log(msg):
+ utc_time = datetime.datetime.utcnow()
+ china_time = utc_time + datetime.timedelta(hours=8)
+ print(f"[{china_time.strftime('%Y.%m.%d %H:%M:%S')}] {msg}")
+
+
+# 检查是否已登录
+def login_by_cookie():
+ url_account = "https://pc.woozooo.com/account.php"
+ if cookie['phpdisk_info'] is None:
+ log('ERROR: 请指定 Cookie 中 phpdisk_info 的值!')
+ return False
+ if cookie['ylogin'] is None:
+ log('ERROR: 请指定 Cookie 中 ylogin 的值!')
+ return False
+ res = requests.get(url_account, headers=headers, cookies=cookie, verify=True)
+ if '网盘用户登录' in res.text:
+ log('ERROR: 登录失败,请更新Cookie')
+ return False
+ else:
+ log('登录成功')
+ return True
+
+
+# 上传文件
+def upload_file(file_dir, folder_id):
+ file_name = os.path.basename(file_dir)
+ url_upload = "https://up.woozooo.com/fileup.php"
+ headers['Referer'] = f'https://up.woozooo.com/mydisk.php?item=files&action=index&u={cookie_ylogin}'
+ post_data = {
+ "task": "1",
+ "folder_id": folder_id,
+ "id": "WU_FILE_0",
+ "name": file_name,
+ }
+ files = {'upload_file': (file_name, open(file_dir, "rb"), 'application/octet-stream')}
+ res = requests.post(url_upload, data=post_data, files=files, headers=headers, cookies=cookie, timeout=120,
+ verify=True).json()
+ log(f"{file_dir} -> {res['info']}")
+ return res['zt'] == 1
+
+
+# 上传文件夹内的文件
+def upload_folder(folder_dir, folder_id):
+ file_list = os.listdir(folder_dir)
+ for file in file_list:
+ path = os.path.join(folder_dir, file)
+ if os.path.isfile(path):
+ upload_file(path, folder_id)
+ else:
+ upload_folder(path, folder_id)
+
+
+# 上传
+def upload(dir, folder_id):
+ if dir is None:
+ log('ERROR: 请指定上传的文件路径')
+ return
+ if folder_id is None:
+ log('ERROR: 请指定蓝奏云的文件夹id')
+ return
+ if os.path.isfile(dir):
+ upload_file(dir, str(folder_id))
+ else:
+ upload_folder(dir, str(folder_id))
+
+
+if __name__ == '__main__':
+ argv = sys.argv[1:]
+ if len(argv) != 2:
+ log('ERROR: 参数错误,请以这种格式重新尝试\npython lzy_web.py 需上传的路径 蓝奏云文件夹id')
+ # 需上传的路径
+ upload_path = argv[0]
+ # 蓝奏云文件夹id
+ lzy_folder_id = argv[1]
+ if login_by_cookie():
+ upload(upload_path, lzy_folder_id)
\ No newline at end of file
diff --git a/.github/workflows/legado.yml b/.github/workflows/legado.yml
index eb3ab638e..3702e0f5c 100644
--- a/.github/workflows/legado.yml
+++ b/.github/workflows/legado.yml
@@ -1,15 +1,10 @@
name: Android CI
-on:
+on:
release:
types: [published]
push:
- branches:
- - master
- tags:
- - '3.*'
- pull_request:
- branches:
+ branches:
- master
# watch:
# types: [started]
@@ -18,40 +13,68 @@ on:
jobs:
build:
-
runs-on: ubuntu-latest
-
+ env:
+ # 登录蓝奏云后在控制台运行document.cookie
+ ylogin: ${{ secrets.LANZOU_ID }}
+ phpdisk_info: ${{ secrets.LANZOU_PSD }}
+ # 蓝奏云里的文件夹ID(阅读3测试版:2670621)
+ LANZOU_FOLDER_ID: '2670621'
+ # 是否上传到artifact
+ UPLOAD_ARTIFACT: 'true'
steps:
- - uses: actions/checkout@v2
- - name: set up JDK 1.8
- uses: actions/setup-java@v1
- with:
- java-version: 1.8
- - name: clear 18PlusList.txt
- run: |
- echo "清空18PlusList.txt"
- echo "">$GITHUB_WORKSPACE/app/src/main/assets/18PlusList.txt
- - name: release apk sign
- run: |
- echo "给apk增加签名"
- cp $GITHUB_WORKSPACE/.github/workflows/legado.jks $GITHUB_WORKSPACE/app/legado.jks
- sed '$a\RELEASE_STORE_FILE=./legado.jks' $GITHUB_WORKSPACE/gradle.properties -i
- sed '$a\RELEASE_KEY_ALIAS=legado' $GITHUB_WORKSPACE/gradle.properties -i
- sed '$a\RELEASE_STORE_PASSWORD=gedoor_legado' $GITHUB_WORKSPACE/gradle.properties -i
- sed '$a\RELEASE_KEY_PASSWORD=gedoor_legado' $GITHUB_WORKSPACE/gradle.properties -i
- - name: apk live together
- run: |
- echo "设置apk共存"
- sed "s/'.release'/'.releaseA'/" $GITHUB_WORKSPACE/app/build.gradle -i
- sed 's/.release/.releaseA/' $GITHUB_WORKSPACE/app/google-services.json -i
- - name: build with gradle
- run: |
- echo "开始进行release构建"
- chmod +x gradlew
- ./gradlew assembleAppRelease
- - name : upload apk
- uses: actions/upload-artifact@master
- if: always()
- with:
- name: legado apk
- path: ${{ github.workspace }}/app/build/outputs/apk/app/release
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-legado-${{ hashFiles('**/updateLog.md') }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-legado-${{ hashFiles('**/updateLog.md') }}-
+
+ - name: Clear 18PlusList.txt
+ run: |
+ echo "清空18PlusList.txt"
+ echo "">$GITHUB_WORKSPACE/app/src/main/assets/18PlusList.txt
+ - name: Release Apk Sign
+ run: |
+ echo "给apk增加签名"
+ cp $GITHUB_WORKSPACE/.github/workflows/legado.jks $GITHUB_WORKSPACE/app/legado.jks
+ sed '$a\RELEASE_STORE_FILE=./legado.jks' $GITHUB_WORKSPACE/gradle.properties -i
+ sed '$a\RELEASE_KEY_ALIAS=legado' $GITHUB_WORKSPACE/gradle.properties -i
+ sed '$a\RELEASE_STORE_PASSWORD=gedoor_legado' $GITHUB_WORKSPACE/gradle.properties -i
+ sed '$a\RELEASE_KEY_PASSWORD=gedoor_legado' $GITHUB_WORKSPACE/gradle.properties -i
+ - name: Apk Live Together
+ run: |
+ echo "设置apk共存"
+ sed "s/'.release'/'.releaseA'/" $GITHUB_WORKSPACE/app/build.gradle -i
+ sed 's/.release/.releaseA/' $GITHUB_WORKSPACE/app/google-services.json -i
+ - name: Build With Gradle
+ run: |
+ echo "开始进行release构建"
+ chmod +x gradlew
+ ./gradlew assembleAppRelease --build-cache --parallel
+ - name: Upload App To Artifact
+ if: ${{ env.UPLOAD_ARTIFACT != 'false' }}
+ uses: actions/upload-artifact@v2
+ with:
+ name: legado apk
+ path: ${{ github.workspace }}/app/build/outputs/apk/app/release/*.apk
+ - name: Upload App To Lanzou
+ if: ${{ env.ylogin }}
+ run: |
+ path="$GITHUB_WORKSPACE/app/build/outputs/apk/app/release"
+ files=$(ls $path)
+ for f in $files
+ do
+ if [[ $f == *"apk" ]]; then
+ file=$f
+ echo "[$(date -u -d '+8 hour' '+%Y.%m.%d %H:%M:%S')] 文件:$file"
+ break
+ fi
+ done
+
+ python3 $GITHUB_WORKSPACE/.github/scripts/lzy_web.py "$path/$file" "$LANZOU_FOLDER_ID"
+ echo "[$(date -u -d '+8 hour' '+%Y.%m.%d %H:%M:%S')] 分享链接: https://kunfei.lanzoux.com/b0f810h4b"
+
diff --git a/README.md b/README.md
index e11d95c0c..843400d98 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,55 @@
-# legado
+
+
+
Legado
+
+
阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。
+
[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
+[![Build Action](https://github.com/gedoor/legado/workflows/Android%20CI/badge.svg)](https://github.com/gedoor/legado/actions)
+[![Downloads](https://img.shields.io/github/downloads/gedoor/legado/total.svg)](https://github.com/gedoor/legado/releases/latest)
+[![GitHub issues](https://img.shields.io/github/issues/gedoor/legado)](https://github.com/gedoor/legado/issues)
+[![GitHub contributors](https://img.shields.io/github/contributors/gedoor/legado)](https://github.com/gedoor/legado/graphs/contributors)
## 阅读3.0
-* 书源规则 https://celeter.github.io
-* 更新日志 [updateLog.md](/app/src/main/assets/updateLog.md)
+* [书源规则](https://alanskycn.gitee.io/teachme)
+* [更新日志](/app/src/main/assets/updateLog.md)
+* [帮助文档](/app/src/main/assets/help/appHelp.md)
+* [web端](https://github.com/celetor/web-yuedu3)
+## 下载
+ or or [Releases](https://github.com/gedoor/legado/releases/latest)
+
+## 阅读API
+* 阅读3.0 提供了2种方式的API:`Web方式`和`Content Provider方式`。您可以在[这里](api.md)根据需要自行调用。
+* 可通过url唤起阅读进行一键导入,url格式: legado://import/{path}?src={url}
+* path类型: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig
+* path类型解释: 书源,订阅源,替换规则,本地txt小说目录规则,在线朗读引擎,主题,阅读排版
+
+## 感谢
+```
+org.jsoup:jsoup
+cn.wanghaomiao:JsoupXpath
+com.jayway.jsonpath:json-path
+com.github.gedoor:rhino-android
+com.squareup.okhttp3:okhttp
+com.ljx.rxhttp:rxhttp
+com.github.bumptech.glide:glide
+org.nanohttpd:nanohttpd
+org.nanohttpd:nanohttpd-websocket
+cn.bingoogolapple:bga-qrcode-zxing
+com.jaredrummler:colorpicker
+org.apache.commons:commons-text
+io.noties.markwon:core
+io.noties.markwon:image-glide
+com.hankcs:hanlp
+com.positiondev.epublib:epublib-core
+```
+
+## 免责声明
+https://gedoor.github.io/MyBookshelf/disclaimer.html
+
+## 界面
![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B1.jpg)
![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B2.jpg)
![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B3.jpg)
@@ -13,8 +57,5 @@
![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B5.jpg)
![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B6.jpg)
-### 阅读API
-阅读3.0 提供了2种方式的API:`Web方式`和`Content Provider方式`。您可以在[这里](api.md)根据需要自行调用。
-
-## 免责声明
-https://gedoor.github.io/MyBookshelf/disclaimer.html
+## 其它
+其它网友做的IOS版本: https://github.com/kaich/Yuedu
diff --git a/api.md b/api.md
index 269044458..a8b821ec5 100644
--- a/api.md
+++ b/api.md
@@ -4,7 +4,7 @@
## 使用
### Web
以下说明假设您的操作在本机进行,且开放端口为1234。
-如果您要从远程计算机访问[阅读],请将`127.0.0.1`替换成手机IP。
+如果您要从远程计算机访问[阅读](),请将`127.0.0.1`替换成手机IP。
#### 插入单个书源
```
URL = http://127.0.0.1:1234/saveSource
@@ -74,13 +74,18 @@ Method = GET
获取指定图书的章节列表。
#### 获取书籍内容
-
```
URL = http://127.0.0.1:1234/getBookContent?url=xxx&index=1
Method = GET
```
+获取指定图书的第`index`章节的文本内容。
+
+#### 获取封面
+```
+URL = http://127.0.0.1:1234/cover?path=xxxxx
+Method = GET
+```
-获取指定图书的第`index`章节的文本内容。
### Content Provider
* 需声明`io.legado.READ_WRITE`权限
@@ -164,6 +169,11 @@ Method = query
URL = content://providerHost/book/content/query?url=xxx&index=1
Method = query
```
-
获取指定图书的第`index`章节的文本内容。
用`Cursor.getString(0)`取出返回结果。
+
+#### 获取封面
+```
+URL = content://providerHost/book/cover/query?path=xxxx
+Method = query
+```
diff --git a/app/build.gradle b/app/build.gradle
index 43a086553..902af3cd7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,13 +1,8 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-kapt'
apply plugin: 'de.timfreiheit.resourceplaceholders'
-apply plugin: 'io.fabric'
-
-androidExtensions {
- experimental = true
-}
static def releaseTime() {
return new Date().format("yy.MMddHH", TimeZone.getTimeZone("GMT+8"))
@@ -18,7 +13,7 @@ def version = "3." + releaseTime()
def gitCommits = Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
android {
- compileSdkVersion 29
+ compileSdkVersion 30
signingConfigs {
if (project.hasProperty("RELEASE_STORE_FILE")) {
myConfig {
@@ -34,15 +29,16 @@ android {
defaultConfig {
applicationId "io.legado.app"
minSdkVersion 21
- targetSdkVersion 29
+ targetSdkVersion 30
versionCode gitCommits
versionName version
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
project.ext.set("archivesBaseName", name + "_" + version)
multiDexEnabled true
+
javaCompileOptions {
annotationProcessorOptions {
- arguments = [
+ arguments += [
"room.incremental" : "true",
"room.expandProjection": "true",
"room.schemaLocation" : "$projectDir/schemas".toString()
@@ -50,6 +46,9 @@ android {
}
}
}
+ buildFeatures {
+ viewBinding true
+ }
buildTypes {
release {
if (project.hasProperty("RELEASE_STORE_FILE")) {
@@ -86,17 +85,29 @@ android {
applicationId "io.legado.play"
manifestPlaceholders = [APP_CHANNEL_VALUE: "google"]
}
+ cronet {
+ dimension "mode"
+ applicationId "io.legado.cronet"
+ manifestPlaceholders = [APP_CHANNEL_VALUE: "cronet"]
+ ndk {
+ abiFilters 'arm64-v8a','armeabi-v7a','x86_64','x86'
+ }
+ }
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
- // Sets Java compatibility to Java 8
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ // Sets Java compatibility to Java 11
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = "11"
+ }
+ buildToolsVersion '30.0.3'
+ tasks.withType(JavaCompile) {
+ //options.compilerArgs << "-Xlint:unchecked"
}
}
@@ -111,102 +122,98 @@ kapt {
}
dependencies {
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test:runner:1.3.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
- implementation "com.android.support:multidex:1.0.3"
+ coreLibraryDesugaring('com.android.tools:desugar_jdk_libs:1.1.5')
+ testImplementation('junit:junit:4.13.2')
+ androidTestImplementation('androidx.test:runner:1.4.0')
+ androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0')
+ implementation('androidx.multidex:multidex:2.0.1')
//kotlin
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
-
- //fireBase
- implementation 'com.google.firebase:firebase-core:17.5.0'
- implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version")
+ //协程
+ def coroutines_version = '1.5.1'
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version")
//androidX
- implementation 'androidx.core:core-ktx:1.3.1'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'androidx.media:media:1.1.0'
- implementation 'androidx.preference:preference:1.1.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
- implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'androidx.viewpager2:viewpager2:1.0.0'
- implementation 'com.google.android.material:material:1.2.1'
- implementation 'com.google.android:flexbox:1.1.0'
- implementation 'com.google.code.gson:gson:2.8.6'
+ implementation('androidx.appcompat:appcompat:1.3.1')
+ implementation('androidx.core:core-ktx:1.6.0')
+ implementation("androidx.activity:activity-ktx:1.3.0")
+ implementation("androidx.fragment:fragment-ktx:1.3.6")
+ implementation('androidx.preference:preference-ktx:1.1.1')
+ implementation('androidx.constraintlayout:constraintlayout:2.0.4')
+ implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
+ implementation('androidx.viewpager2:viewpager2:1.0.0')
+ implementation('com.google.android.material:material:1.4.0')
+ implementation('com.google.android.flexbox:flexbox:3.0.0')
+ implementation('com.google.code.gson:gson:2.8.7')
+ implementation('androidx.webkit:webkit:1.4.0')
+
+ //media
+ def media2_version = "1.1.3"
+ implementation("androidx.media2:media2-session:$media2_version")
+ implementation("androidx.media:media:1.4.0")
+ //implementation "androidx.media2:media2-player:$media2_version"
+ //implementation 'com.google.android.exoplayer:exoplayer:2.13.0'
+
+ //Splitties
+ def splitties_version = '2.1.1'
+ implementation("com.louiscad.splitties:splitties-appctx:$splitties_version")
+ implementation("com.louiscad.splitties:splitties-systemservices:$splitties_version")
+ implementation("com.louiscad.splitties:splitties-views:$splitties_version")
//lifecycle
- def lifecycle_version = '2.2.0'
- implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
- implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
+ def lifecycle_version = '2.3.1'
+ implementation("androidx.lifecycle:lifecycle-common-java8:$lifecycle_version")
//room
- def room_version = '2.2.5'
- implementation "androidx.room:room-runtime:$room_version"
- kapt "androidx.room:room-compiler:$room_version"
- testImplementation "androidx.room:room-testing:2.2.5"
-
- //paging
- implementation 'androidx.paging:paging-runtime-ktx:2.1.2'
-
- //anko
- def anko_version = '0.10.8'
- implementation "org.jetbrains.anko:anko-sdk27:$anko_version"
- implementation "org.jetbrains.anko:anko-sdk27-listeners:$anko_version"
+ def room_version = '2.3.0'
+ implementation("androidx.room:room-runtime:$room_version")
+ implementation("androidx.room:room-ktx:$room_version")
+ kapt("androidx.room:room-compiler:$room_version")
+ testImplementation("androidx.room:room-testing:$room_version")
//liveEventBus
- implementation 'com.jeremyliao:live-event-bus-x:1.5.7'
-
- //协程
- def coroutines_version = '1.3.7'
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
+ implementation('io.github.jeremyliao:live-event-bus-x:1.8.0')
//规则相关
- implementation 'org.jsoup:jsoup:1.13.1'
- implementation 'cn.wanghaomiao:JsoupXpath:2.3.2'
- implementation 'com.jayway.jsonpath:json-path:2.4.0'
+ implementation('org.jsoup:jsoup:1.14.1')
+ implementation('com.jayway.jsonpath:json-path:2.6.0')
+ implementation('cn.wanghaomiao:JsoupXpath:2.5.0')
+ implementation(project(path: ':epublib'))
//JS rhino
- implementation 'com.github.gedoor:rhino-android:1.4'
+ implementation('com.github.gedoor:rhino-android:1.6')
//网络
- //noinspection GradleDependency
- implementation 'com.squareup.retrofit2:retrofit:2.9.0'
- implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
+ implementation('com.squareup.okhttp3:okhttp:4.9.1')
+ compileOnly(fileTree(dir: 'cronetlib', include: ['*.jar', '*.aar']))
+ cronetImplementation(fileTree(dir: 'cronetlib', include: ['*.jar', '*.aar']))
//Glide
- implementation 'com.github.bumptech.glide:glide:4.11.0'
+ implementation('com.github.bumptech.glide:glide:4.12.0')
//webServer
- implementation 'org.nanohttpd:nanohttpd:2.3.1'
- implementation 'org.nanohttpd:nanohttpd-websocket:2.3.1'
+ implementation('org.nanohttpd:nanohttpd:2.3.1')
+ implementation('org.nanohttpd:nanohttpd-websocket:2.3.1')
+ implementation('org.nanohttpd:nanohttpd-apache-fileupload:2.3.1')
//二维码
- implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7'
+ implementation('com.github.jenly1314:zxing-lite:2.1.0')
//颜色选择
- implementation 'com.jaredrummler:colorpicker:1.1.0'
+ implementation('com.jaredrummler:colorpicker:1.1.0')
//apache
- implementation 'org.apache.commons:commons-lang3:3.11'
- implementation 'org.apache.commons:commons-text:1.8'
+ implementation('org.apache.commons:commons-text:1.9')
//MarkDown
- implementation 'ru.noties.markwon:core:3.1.0'
+ def markwonVersion = "4.6.2"
+ implementation("io.noties.markwon:core:$markwonVersion")
+ implementation("io.noties.markwon:image-glide:$markwonVersion")
+ implementation("io.noties.markwon:ext-tables:$markwonVersion")
+ implementation("io.noties.markwon:html:$markwonVersion")
//转换繁体
- implementation 'com.hankcs:hanlp:portable-1.7.8'
-
- //epub
- implementation('com.positiondev.epublib:epublib-core:3.1') {
- exclude group: 'org.slf4j'
- exclude group: 'xmlpull'
- }
+ implementation('com.github.liuyueyi.quick-chinese-transfer:quick-transfer-core:0.2.1')
- //E-Ink 有些手机会出现重影
- //implementation 'fadeapp.widgets:scrollless-recyclerView:1.0.2'
}
-
-apply plugin: 'com.google.gms.google-services'
\ No newline at end of file
diff --git a/app/cronetlib/cronet_api.jar b/app/cronetlib/cronet_api.jar
new file mode 100644
index 000000000..d62e993bb
Binary files /dev/null and b/app/cronetlib/cronet_api.jar differ
diff --git a/app/cronetlib/cronet_impl_common_java.jar b/app/cronetlib/cronet_impl_common_java.jar
new file mode 100644
index 000000000..f851e7120
Binary files /dev/null and b/app/cronetlib/cronet_impl_common_java.jar differ
diff --git a/app/cronetlib/cronet_impl_native_java.jar b/app/cronetlib/cronet_impl_native_java.jar
new file mode 100644
index 000000000..1a29039ad
Binary files /dev/null and b/app/cronetlib/cronet_impl_native_java.jar differ
diff --git a/app/cronetlib/cronet_impl_platform_java.jar b/app/cronetlib/cronet_impl_platform_java.jar
new file mode 100644
index 000000000..6adb23853
Binary files /dev/null and b/app/cronetlib/cronet_impl_platform_java.jar differ
diff --git a/app/cronetlib/src/cronet_api-src.jar b/app/cronetlib/src/cronet_api-src.jar
new file mode 100644
index 000000000..78bf99a0e
Binary files /dev/null and b/app/cronetlib/src/cronet_api-src.jar differ
diff --git a/app/cronetlib/src/cronet_impl_common_java-src.jar b/app/cronetlib/src/cronet_impl_common_java-src.jar
new file mode 100644
index 000000000..7d7da6f33
Binary files /dev/null and b/app/cronetlib/src/cronet_impl_common_java-src.jar differ
diff --git a/app/cronetlib/src/cronet_impl_native_java-src.jar b/app/cronetlib/src/cronet_impl_native_java-src.jar
new file mode 100644
index 000000000..83a357a91
Binary files /dev/null and b/app/cronetlib/src/cronet_impl_native_java-src.jar differ
diff --git a/app/cronetlib/src/cronet_impl_platform_java-src.jar b/app/cronetlib/src/cronet_impl_platform_java-src.jar
new file mode 100644
index 000000000..48c544ef7
Binary files /dev/null and b/app/cronetlib/src/cronet_impl_platform_java-src.jar differ
diff --git a/app/google-services.json b/app/google-services.json
index 314a5ea7c..fcbc11f0d 100644
--- a/app/google-services.json
+++ b/app/google-services.json
@@ -8,9 +8,9 @@
"client": [
{
"client_info": {
- "mobilesdk_app_id": "1:453392274790:android:1d2b1eefbe0e78cff624a7",
+ "mobilesdk_app_id": "1:453392274790:android:c4eac14b1410eec5f624a7",
"android_client_info": {
- "package_name": "io.legado.app"
+ "package_name": "io.legado.app.debug"
}
},
"oauth_client": [
@@ -37,12 +37,20 @@
},
{
"client_info": {
- "mobilesdk_app_id": "1:453392274790:android:c4eac14b1410eec5f624a7",
+ "mobilesdk_app_id": "1:453392274790:android:c1481c1c3d3f51eff624a7",
"android_client_info": {
- "package_name": "io.legado.app.debug"
+ "package_name": "io.legado.app.release"
}
},
"oauth_client": [
+ {
+ "client_id": "453392274790-trrgennt5njr1lhil1sgtf0ogcgd38fo.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "io.legado.app.release",
+ "certificate_hash": "fd67dba87b7b761631266f19ddde249054aac5c1"
+ }
+ },
{
"client_id": "453392274790-hnbpatpce9hbjiggj76hgo7queu86atq.apps.googleusercontent.com",
"client_type": 3
@@ -66,12 +74,20 @@
},
{
"client_info": {
- "mobilesdk_app_id": "1:453392274790:android:c1481c1c3d3f51eff624a7",
+ "mobilesdk_app_id": "1:453392274790:android:b891abd2331577dff624a7",
"android_client_info": {
- "package_name": "io.legado.app.release"
+ "package_name": "io.legado.play.release"
}
},
"oauth_client": [
+ {
+ "client_id": "453392274790-f8sjn6ohs72rg1dvp0pdvk42nkq54p0k.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "io.legado.play.release",
+ "certificate_hash": "00819ace9891386e535967cbafd6a88f3797bd5b"
+ }
+ },
{
"client_id": "453392274790-hnbpatpce9hbjiggj76hgo7queu86atq.apps.googleusercontent.com",
"client_type": 3
@@ -97,10 +113,18 @@
"client_info": {
"mobilesdk_app_id": "1:453392274790:android:b891abd2331577dff624a7",
"android_client_info": {
- "package_name": "io.legado.play.release"
+ "package_name": "io.legado.play.debug"
}
},
"oauth_client": [
+ {
+ "client_id": "453392274790-f8sjn6ohs72rg1dvp0pdvk42nkq54p0k.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "io.legado.play.debug",
+ "certificate_hash": "00819ace9891386e535967cbafd6a88f3797bd5b"
+ }
+ },
{
"client_id": "453392274790-hnbpatpce9hbjiggj76hgo7queu86atq.apps.googleusercontent.com",
"client_type": 3
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 215f31c33..a2949e6bf 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -54,6 +54,8 @@
# Android开发中一些需要保留的公共部分
#
#############################################
+# 屏蔽错误Unresolved class name
+#noinspection ShrinkerUnresolvedReference
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
@@ -66,7 +68,6 @@
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-
# 保留androidx下的所有类及其内部类
-keep class androidx.** {*;}
@@ -221,3 +222,10 @@
public static **[] values();
public static ** valueOf(java.lang.String);
}
+
+
+# Keep all of Cronet API as it's used by the Cronet module.
+-keep public class org.chromium.net.* {
+ !private *;
+ *;
+}
\ No newline at end of file
diff --git a/app/src/debug/res/values-zh-rHK/strings.xml b/app/src/debug/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 07b0a5dbe..000000000
--- a/app/src/debug/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- 閲讀.D
- 閲讀·D·搜索
-
\ No newline at end of file
diff --git a/app/src/debug/res/values-zh-rTW/strings.xml b/app/src/debug/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 07b0a5dbe..000000000
--- a/app/src/debug/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- 閲讀.D
- 閲讀·D·搜索
-
\ No newline at end of file
diff --git a/app/src/google/res/values-zh-rTW/strings.xml b/app/src/google/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000..35770fc68
--- /dev/null
+++ b/app/src/google/res/values-zh-rTW/strings.xml
@@ -0,0 +1,6 @@
+
+
+
+ 閱讀Pro
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 524fe903a..ffefdee66 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,11 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
package="io.legado.app">
-
-
-
@@ -18,6 +13,12 @@
+
+
+
+
-
+
@@ -46,6 +49,7 @@
@@ -62,6 +66,7 @@
@@ -78,6 +83,7 @@
@@ -94,6 +100,7 @@
@@ -110,6 +117,7 @@
@@ -126,6 +134,7 @@
@@ -147,7 +156,16 @@
+ android:exported="true"
+ android:launchMode="singleTask">
+
+
+
+
+
+
+
+
+
+
+ android:launchMode="standard" />
+ android:launchMode="singleTask"
+ android:screenOrientation="behind" />
+ android:launchMode="singleTask"
+ android:screenOrientation="behind" />
+ android:launchMode="singleTop"
+ android:screenOrientation="behind" />
+ android:launchMode="singleTop"
+ android:screenOrientation="behind" />
-
+ android:name=".ui.replace.ReplaceRuleActivity"
+ android:launchMode="singleTop"
+ android:screenOrientation="behind" />
+ android:launchMode="singleTop"
+ android:screenOrientation="behind" />
+ android:launchMode="singleTop"
+ android:screenOrientation="behind" />
+
+
@@ -248,13 +287,13 @@
-
+
@@ -262,10 +301,18 @@
android:name=".ui.about.ReadRecordActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" />
+
+
+ android:exported="true"
+ android:label="@string/receiving_shared_label"
+ android:theme="@style/AppTheme.Transparent">
@@ -281,10 +328,11 @@
-
+
@@ -292,74 +340,86 @@
-
+
+
-
+
+
+
-
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/18PlusList.txt b/app/src/main/assets/18PlusList.txt
index 52a5bb3cc..3451937dc 100644
--- a/app/src/main/assets/18PlusList.txt
+++ b/app/src/main/assets/18PlusList.txt
@@ -80,3 +80,205 @@ cm5neHM=
OTl3ZW5rdQ==
bGFvc2lqaXhz
ZnVzaHV6aGFpMQ==
+cG8xOA==
+czUyMTc=
+c2FuaGFveHM=
+NTJrc2h1
+NDhyeA==
+ZWNub3ZlbA==
+bGllaHVvenc=
+eGlhb3FpYW5nd3g=
+NTJrc2h1
+NDh3eA==
+NTJrc2h1
+MDB1aQ==
+MDFieg==
+c2h1YmFvMQ==
+ZG54aWFvc2h1b2E=
+am5zaHViYQ==
+MThzaHV3dQ==
+bGV4cw==
+MzM1eHM=
+dXB1
+ZnVndW9kdQ==
+ODB0eHQ=
+YWFyZWFk
+eWlkdWR1MQ==
+YmFuemh1d2FuZw==
+cWloYW9xaWhhbw==
+OHhpYW54cw==
+amluamlzaHV3dQ==
+d21wOA==
+ZXl1c2h1d3U=
+NTB4c2Y=
+aGF4d3g1
+cG93YW5qdWFu
+d2luMTBjaXR5
+eWV5ZXhzdw==
+bXlzaHVnZQ==
+eGlhbmd0eHN3
+Y3Vpd2VpanV4
+MzY2eHN3
+aHVheXVld2Vua3U=
+eW91ZGlhbmxlbg==
+c291Nzg=
+bGFucm91Mg==
+cXFib29r
+eW91d3V4cw==
+cnVpbGlzYWxl
+MzY1bXd3
+ZnV3ZW5o
+bGVzYmw=
+YXd1Ym9vaw==
+bGl5dXhpYW5nMjAyMA==
+OTJwb3Bv
+ZnVzaHV0dWFu
+ODhkYW5tZWk=
+ZG14cw==
+eXVsaW56aGFueWU=
+M2hlYmFv
+eGd1YWd1YXhz
+ZGl5aWJhbnpodTY=
+aXJlYWR4cw==
+c2h1YmFvOTY=
+ZGl5aWJhbnpodTU1NQ==
+c2Fuaml1enc=
+N3Fpbmc3
+NjZsZXdlbg==
+a3l4czU=
+MjIyMjJ4cw==
+c2hhb3NodWdl
+amlsaW41NQ==
+bWt4czY=
+amluc2h1bG91
+eGlhbndhbmdz
+eWlkdWR1
+cWR0eHQ=
+MTZib29rMQ==
+am1zaHV3dQ==
+MzY2eHN3
+ZHliejk=
+c2hvdWRhOA==
+ZnlxMTg=
+eWlzaHVn
+eXV6aGFpd3VsYQ==
+MTFiYW56aHU=
+MTIzeGlhb3FpYW5n
+ZGl5aWJhbnpodTk=
+ZGl5aWJhbnpodQ==
+MzY2eHN3
+ODdzaHV3dQ==
+NnF3eA==
+emhlbmh1bnhpYW9zaHVv
+bG9uZ3Rlbmc1Mg==
+eGlueGluZ3hpYW5nemhpZmE=
+ZHliejk=
+ZHVvemhla2Fu
+MTIzeGlhb3FpYW5n
+MzM1eHM=
+am1zaHV3dQ==
+c2hhb3NodWdl
+bGF3ZW54cw==
+cnVzaHV3dQ==
+MzY2eHN3
+NTB4c2Y=
+bGV3ZW41NQ==
+aGFpdGFuZzEyMw==
+aGViYW81MjA=
+bHVvcWl1enc=
+c3NzeHN3
+c2h1c2h1d3V4cw==
+cm5neHM=
+cWR4aWFvc2h1bw==
+dHl1ZQ==
+Y2hlNDM=
+bG9uZ3Rlbmcy
+amZ5eHNo
+aGV0dTI=
+bGFvc2lqaXhz
+bG9uZ3Rlbmd4cw==
+bGllaHVvenc=
+c2h1YmFvYW4=
+eHNodW9zaHVv
+NTIxZGFubWVp
+YmFuemh1MjI=
+cWtzaHU=
+eWZ4aWFvc2h1b2U=
+a3lnc28=
+c2h1bG91YmE=
+NXRucw==
+N3Fpbmc3
+bWlhb2R1NQ==
+eXVzaHV3ZW4=
+YWFyZWFk
+cXRzaHU=
+MTdzaHV3dQ==
+c2h1YmFvMnM=
+YnowMDE=
+ZGFtb2dl
+MTMxdGI=
+aXhpYW9z
+bXlzaHVnZQ==
+OXhpYW53ZW4=
+ZHVvemhla2Fu
+MTIwdw==
+c2h1c2h1d3U1MjA=
+c2h1YmFvMnM=
+YWd4c3c=
+OTR4c3c=
+cG8xOA==
+eWFvY2hpeHM=
+eGlhb3FpYW5neHM=
+Ym9va2Js
+c2Fuaml1eHM=
+d29kZXNodWJhbw==
+em9uZ2NhaXhpYW9zaHVvMg==
+OWI4OTEzOTRkZjVi
+MThub3ZlbA==
+YWFib29r
+YjF0eHQ=
+eXVjYWl6dw==
+Yzl0eHQ=
+ZGl5aWJhbnpodTU1NQ==
+MzBtYw==
+eGlueXVzaHV3dQ==
+c2h1YmFvd2FuZzEyMw==
+YWd4cw==
+YmlxdWdlbmw=
+c2hpcWlzaHV3dQ==
+c2lsdWtl
+ZGl5aWJhbnpodTg=
+ZGl5aWJhbnpodTk=
+aGV0dW54cw==
+OTl3ZW5rdQ==
+aGFpdGFuZ3NodXd1
+OTd5ZA==
+eXV6aGFpd3UxMQ==
+Y3Vpd2VpanV4cw==
+Y2JpcXU=
+NTIxZGFubWVp
+c2h1YmFvMzM=
+c2FuaGFvMQ==
+dGlhbm1lbmd3ZW5rdQ==
+eXVzaHV3dTUyMA==
+c2h1YmFvMjIy
+c2h1YmFvd2FuZzEyMw==
+eXVib29r
+Y2JpcXU=
+MWxld2Vu
+MTV4c3c=
+eG5jd3h3
+c2h1YmFvd2FuZzEyMw==
+c2FuaGFveHM=
+eXV3YW5nc2hl
+YmlxdXRz
+bGFtZWl4cw==
+eGJhbnpodQ==
+cWR4aWFvc2h1bw==
+bWh0bGE=
+OTl3ZW5rdQ==
+eGlhb3FpYW5nNTIw
+dGlhbm1lbmd3ZW5rdQ==
+YWlmdXNodQ==
+bWlhb2R1NQ==
+bWlmZW5neHM=
diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json
new file mode 100644
index 000000000..08d3386cd
--- /dev/null
+++ b/app/src/main/assets/defaultData/httpTTS.json
@@ -0,0 +1,237 @@
+[
+ {
+ "id": -100,
+ "name": "0",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4127&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=11&vol=5&aue=6&pit=3&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -99,
+ "name": "zaixianai.cn",
+ "url": "\nlet url='https://www.zaixianai.cn/voiceCompose';\n\nlet ua=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\";\n\nlet doc=java.get(url,{\"User-Agent\":ua});\nlet cookie=String(doc.header(\"set-cookie\")).match(/laravel_session=[^\\n]+/)[0];\nlet token=String(doc.body()).match(/token=\"([^\"]+)/)[1];\n\nurl='https://www.zaixianai.cn/Api_getVoice,'+JSON.stringify({\n\"method\": \"POST\",\n\"body\": \"content=\" + java.encodeURI(speakText) + \"&volume=50&speech_rate=0&voice=Aixia&_token=\"+token,\n\"headers\": {\n\"User-Agent\": ua,\n\"cookie\": cookie\n}\n});\n\nlet res=java.ajax(url);\n\n'https://www.zaixianai.cn/voice/'+JSON.parse(res).data.file_name+','+JSON.stringify({\n\"headers\": {\n\"User-Agent\": ua,\n\"accept\": \"*/*\",\n\"referer\": \"https://www.zaixianai.cn/voiceCompose\",\n\"cookie\": cookie,\n\"accept-encoding\": \"identity;q=1, *;q=0\"\n}\n})\n"
+ },
+ {
+ "id": -98,
+ "name": "台湾女声",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4007&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -1,
+ "name": "度丫丫",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -2,
+ "name": "度博文①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -3,
+ "name": "度博文②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -4,
+ "name": "度博文③",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -97,
+ "name": "度小乔",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=1117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=3&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -5,
+ "name": "度小娇",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -6,
+ "name": "度小宇",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=2&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -7,
+ "name": "度小童",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -96,
+ "name": "度小童",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -95,
+ "name": "度小粤",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=cte&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -8,
+ "name": "度小美",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -94,
+ "name": "度小芳",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4125&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -9,
+ "name": "度小萌",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=111&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -93,
+ "name": "度小贤",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4115&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"}"
+ },
+ {
+ "id": -92,
+ "name": "度小雯",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -10,
+ "name": "度小鹿①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -12,
+ "name": "度小鹿②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4119&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -11,
+ "name": "度小鹿③",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5118&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -91,
+ "name": "度灵儿",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5105&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -13,
+ "name": "度米朵①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -14,
+ "name": "度米朵②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -15,
+ "name": "度逍遥-基础",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=3&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -16,
+ "name": "度逍遥-精品①",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -17,
+ "name": "度逍遥-精品②",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -18,
+ "name": "情感女声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4105&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -19,
+ "name": "情感男声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4115&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -20,
+ "name": "标准女声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -90,
+ "name": "标准女声-基础",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=100&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -21,
+ "name": "标准男声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160=&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -89,
+ "name": "温柔女声",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4126&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -88,
+ "name": "甜美女声①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=1200&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=&rate=32=5&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -24,
+ "name": "甜美女声②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -25,
+ "name": "甜美女声③",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5117&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -22,
+ "name": "电台女声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5120&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=&rate=32=5&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -23,
+ "name": "电台男声",
+ "url": "http://tsn.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5121&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -26,
+ "name": "百度主持",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -87,
+ "name": "百度主持",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4127&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=11&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -86,
+ "name": "百度解说①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4123&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=12&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -85,
+ "name": "百度解说②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4128&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=12&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -84,
+ "name": "百度解说③",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4129&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=12&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -27,
+ "name": "百度评书①",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=301&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -28,
+ "name": "百度评书②",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -83,
+ "name": "萝莉少女音",
+ "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=5201&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=160&vol=5&aue=6&pit=5&_res_tag_=audio\"\n}"
+ },
+ {
+ "id": -29,
+ "name": "阿里云语音",
+ "url": "/*播音人Aiting可改其他https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/speaker.json,详见https://ai.aliyun.com/nls/tts*/;eval(''+java.ajax('https://cdn.jsdelivr.net/gh/Celeter/build/.github/scripts/ttsDemo.js'));ttsDemo(speakText,speakSpeed,'Aiting')"
+ }
+]
\ No newline at end of file
diff --git a/app/src/main/assets/defaultData/readConfig.json b/app/src/main/assets/defaultData/readConfig.json
new file mode 100644
index 000000000..cd62a05be
--- /dev/null
+++ b/app/src/main/assets/defaultData/readConfig.json
@@ -0,0 +1,107 @@
+[
+ {
+ "bgStr": "#ffc0edc6",
+ "bgStrEInk": "#FFFFFF",
+ "bgStrNight": "#000000",
+ "bgType": 0,
+ "bgTypeEInk": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": true,
+ "darkStatusIconEInk": true,
+ "darkStatusIconNight": false,
+ "footerMode": 0,
+ "footerPaddingBottom": 10,
+ "footerPaddingLeft": 13,
+ "footerPaddingRight": 17,
+ "footerPaddingTop": 0,
+ "headerMode": 0,
+ "headerPaddingBottom": 0,
+ "headerPaddingLeft": 19,
+ "headerPaddingRight": 16,
+ "headerPaddingTop": 10,
+ "letterSpacing": 0,
+ "lineSpacingExtra": 10,
+ "name": "微信读书",
+ "paddingBottom": 4,
+ "paddingLeft": 22,
+ "paddingRight": 22,
+ "paddingTop": 5,
+ "pageAnim": 3,
+ "pageAnimEInk": 3,
+ "paragraphIndent": " ",
+ "paragraphSpacing": 6,
+ "showFooterLine": true,
+ "showHeaderLine": true,
+ "textBold": 0,
+ "textColor": "#ff0b0b0b",
+ "textColorEInk": "#000000",
+ "textColorNight": "#ADADAD",
+ "textSize": 24,
+ "tipColor": -10461088,
+ "tipFooterLeft": 7,
+ "tipFooterMiddle": 0,
+ "tipFooterRight": 6,
+ "tipHeaderLeft": 1,
+ "tipHeaderMiddle": 0,
+ "tipHeaderRight": 2,
+ "titleBottomSpacing": 0,
+ "titleMode": 0,
+ "titleSize": 4,
+ "titleTopSpacing": 0
+ },
+ {
+ "name": "预设1",
+ "bgStr": "#FFFFFF",
+ "bgStrNight": "#000000",
+ "textColor": "#000000",
+ "textColorNight": "#FFFFFF",
+ "bgType": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": true,
+ "darkStatusIconNight": false
+ },
+ {
+ "name": "预设2",
+ "bgStr": "#DDC090",
+ "bgStrNight": "#3C3F43",
+ "textColor": "#3E3422",
+ "textColorNight": "#DCDFE1",
+ "bgType": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": true,
+ "darkStatusIconNight": false
+ },
+ {
+ "name": "预设3",
+ "bgStr": "#C2D8AA",
+ "bgStrNight": "#3C3F43",
+ "textColor": "#596C44",
+ "textColorNight": "#88C16F",
+ "bgType": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": false,
+ "darkStatusIconNight": false
+ },
+ {
+ "name": "预设4",
+ "bgStr": "#DBB8E2",
+ "bgStrNight": "#3C3F43",
+ "textColor": "#68516C",
+ "textColorNight": "#F6AEAE",
+ "bgType": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": false,
+ "darkStatusIconNight": false
+ },
+ {
+ "name": "预设5",
+ "bgStr": "#ABCEE0",
+ "bgStrNight": "#3C3F43",
+ "textColor": "#3D4C54",
+ "textColorNight": "#90BFF5",
+ "bgType": 0,
+ "bgTypeNight": 0,
+ "darkStatusIcon": false,
+ "darkStatusIconNight": false
+ }
+]
\ No newline at end of file
diff --git a/app/src/main/assets/defaultData/rssSources.json b/app/src/main/assets/defaultData/rssSources.json
new file mode 100644
index 000000000..0537719fa
--- /dev/null
+++ b/app/src/main/assets/defaultData/rssSources.json
@@ -0,0 +1,30 @@
+[
+ {
+ "customOrder": 1,
+ "enableJs": true,
+ "enabled": true,
+ "singleUrl": true,
+ "sourceIcon": "http:\/\/ku.mumuceo.com\/static\/images\/applogo\/yuedu.png",
+ "sourceName": "使用说明",
+ "sourceUrl": "https://www.yuque.com/legado"
+ },
+ {
+ "customOrder": 2,
+ "enableJs": true,
+ "enabled": true,
+ "singleUrl": true,
+ "sourceIcon": "http:\/\/mmbiz.qpic.cn\/mmbiz_png\/hpfMV8hEuL2eS6vnCxvTzoOiaCAibV6exBzJWq9xMic9xDg3YXAick87tsfafic0icRwkQ5ibV0bJ84JtSuxhPuEDVquA\/0?wx_fmt=png",
+ "sourceName": "小说拾遗",
+ "sourceUrl": "snssdk1128:\/\/user\/profile\/562564899806367"
+ },
+ {
+ "customOrder": 3,
+ "enableJs": true,
+ "enabled": true,
+ "loadWithBaseUrl": false,
+ "singleUrl": true,
+ "sourceIcon": "https://Cloud.miaogongzi.net/images/icon.png",
+ "sourceName": "Meow云",
+ "sourceUrl": "https://pan.miaogongzi.net"
+ }
+]
\ No newline at end of file
diff --git a/app/src/main/assets/themeConfig.json b/app/src/main/assets/defaultData/themeConfig.json
similarity index 100%
rename from app/src/main/assets/themeConfig.json
rename to app/src/main/assets/defaultData/themeConfig.json
diff --git a/app/src/main/assets/txtTocRule.json b/app/src/main/assets/defaultData/txtTocRule.json
similarity index 60%
rename from app/src/main/assets/txtTocRule.json
rename to app/src/main/assets/defaultData/txtTocRule.json
index 11131b334..ad6f7d591 100644
--- a/app/src/main/assets/txtTocRule.json
+++ b/app/src/main/assets/defaultData/txtTocRule.json
@@ -2,50 +2,50 @@
{
"id": -1,
"enable": true,
- "name": "目录",
- "rule": "^[ \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$",
+ "name": "目录(去空白)",
+ "rule": "(?<=[ \\s])(?:序章|序言|卷首语|扉页|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$",
"serialNumber": 0
},
{
"id": -2,
"enable": true,
- "name": "目录(去空白)",
- "rule": "(?<=[ \\s])(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$",
+ "name": "目录",
+ "rule": "^[ \\t]{0,4}(?:序章|序言|卷首语|扉页|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$",
"serialNumber": 1
},
{
"id": -3,
"enable": false,
"name": "目录(匹配简介)",
- "rule": "(?<=[ \\s])(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$",
+ "rule": "(?<=[ \\s])(?:(?:内容|文章)?简介|文案|前言|序章|序言|卷首语|扉页|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$",
"serialNumber": 2
},
{
"id": -4,
"enable": false,
"name": "目录(古典、轻小说备用)",
- "rule": "^[ \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$",
+ "rule": "^[ \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|话|篇(?!张))).{0,30}$",
"serialNumber": 3
},
{
"id": -5,
"enable": false,
"name": "数字(纯数字标题)",
- "rule": "(?<=[ \\s])\\d+[ \\t]{0,4}$",
+ "rule": "(?<=[ \\s])\\d+\\.?[ \\t]{0,4}$",
"serialNumber": 4
},
{
"id": -6,
"enable": true,
"name": "数字 分隔符 标题名称",
- "rule": "^[ \\t]{0,4}\\d{1,5}[,., 、_—\\-].{1,30}$",
+ "rule": "^[ \\t]{0,4}\\d{1,5}[::,., 、_—\\-].{1,30}$",
"serialNumber": 5
},
{
"id": -7,
"enable": true,
"name": "大写数字 分隔符 标题名称",
- "rule": "^[ \\t]{0,4}[零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[ 、_—\\-].{1,30}$",
+ "rule": "^[ \\t]{0,4}(?:序章|序言|卷首语|扉页|楔子|正文(?!完|结)|终章|后记|尾声|番外|[〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ 、_—\\-].{1,30}$",
"serialNumber": 6
},
{
@@ -73,7 +73,7 @@
"id": -11,
"enable": true,
"name": "特殊符号 序号 标题",
- "rule": "(?<=[\\s ])[【〔〖「『〈[\\[](?:第|[Cc]hapter)[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10}[章节].{0,20}$",
+ "rule": "(?<=[\\s ])[【〔〖「『〈[\\[](?:第|[Cc]hapter)[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10}[章节].{0,20}$",
"serialNumber": 10
},
{
@@ -94,7 +94,7 @@
"id": -14,
"enable": true,
"name": "章/卷 序号 标题",
- "rule": "^[ \\t ]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[卷章][\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ ]{0,4}.{0,30}$",
+ "rule": "^[ \\t ]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|序言|卷首语|扉页|楔子|正文(?!完|结)|终章|后记|尾声|番外|[卷章][\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ ]{0,4}.{0,30}$",
"serialNumber": 13
},
{
@@ -108,21 +108,21 @@
"id": -16,
"enable":false,
"name": "双标题(前向)",
- "rule": "(?m)(?<=[ \\t ]{0,4})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$(?=[\\s ]{0,8}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章)",
+ "rule": "(?m)(?<=[ \\t ]{0,4})第[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$(?=[\\s ]{0,8}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章)",
"serialNumber": 15
},
{
"id": -17,
"enable":false,
"name": "双标题(后向)",
- "rule": "(?m)(?<=[ \\t ]{0,4}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$[\\s ]{0,8})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$",
+ "rule": "(?m)(?<=[ \\t ]{0,4}第[\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$[\\s ]{0,8})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$",
"serialNumber": 16
},
{
"id":-18,
"enable": true,
"name": "标题 特殊符号 序号",
- "rule": "^.{1,20}[((][\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[))][ \t]{0,4}$",
+ "rule": "^.{1,20}[((][\\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[))][ \t]{0,4}$",
"serialNumber": 17
}
-]
+]
\ No newline at end of file
diff --git a/app/src/main/assets/epub/chapter.html b/app/src/main/assets/epub/chapter.html
new file mode 100644
index 000000000..6067f6649
--- /dev/null
+++ b/app/src/main/assets/epub/chapter.html
@@ -0,0 +1,16 @@
+
+
+
+
+ Chapter
+
+
+
+
+
+{title}
+{content}
+
+
diff --git a/app/src/main/assets/epub/cover.html b/app/src/main/assets/epub/cover.html
new file mode 100644
index 000000000..cb6df6353
--- /dev/null
+++ b/app/src/main/assets/epub/cover.html
@@ -0,0 +1,21 @@
+
+
+
+
+ Cover
+
+
+
+
+{name}
+{author} / 著
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/epub/fonts.css b/app/src/main/assets/epub/fonts.css
new file mode 100644
index 000000000..3457a6511
--- /dev/null
+++ b/app/src/main/assets/epub/fonts.css
@@ -0,0 +1,267 @@
+@charset "utf-8";
+/*---常用---*/
+
+@font-face {
+ font-family: "zw";
+ src:
+ local("宋体"),local("明体"),local("明朝"),
+ local("Songti"),local("Songti SC"),local("Songti TC"), /*iOS6+iBooks3*/
+ local("Song S"),local("Song T"),local("STBShusong"),local("TBMincho"),local("HYMyeongJo"), /*Kindle Paperwihite*/
+ local("DK-SONGTI"),
+ url(../Fonts/zw.ttf),
+ url(res:///opt/sony/ebook/FONT/zw.ttf),
+ url(res:///Data/FONT/zw.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/zw.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/zw.ttf),
+ url(res:///ebook/fonts/zw.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/zw.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/zw.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/zw.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/zw.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/zw.ttf),
+ url(res:///system/fonts/zw.ttf),
+ url(res:///system/media/sdcard/fonts/zw.ttf),
+ url(res:///media/fonts/zw.ttf),
+ url(res:///sdcard/fonts/zw.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/zw.ttf),
+ url(res:///media/flash/fonts/zw.ttf),
+ url(res:///media/sd/fonts/zw.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/zw.ttf),
+ url(res:///../fonts/zw.ttf),
+ url(../../../../../zw.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/zw.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/zw.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/zw.ttf);
+ /*ADE1,8, 2.0 Windows Path*/;
+}
+
+@font-face {
+ font-family: "fs";
+ src:
+ local("amasis30"),local("仿宋"),local("仿宋_GB2312"),
+ local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"), /*iOS6+iBooks3*/
+ local("DK-FANGSONG"),
+ url(../Fonts/fs.ttf),
+ url(res:///opt/sony/ebook/FONT/fs.ttf),
+ url(res:///Data/FONT/fs.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/fs.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/fs.ttf),
+ url(res:///ebook/fonts/fs.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/fs.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/fs.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/fs.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/fs.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/fs.ttf),
+ url(res:///system/fonts/fs.ttf),
+ url(res:///system/media/sdcard/fonts/fs.ttf),
+ url(res:///media/fonts/fs.ttf),
+ url(res:///sdcard/fonts/fs.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/fs.ttf),
+ url(res:///media/flash/fonts/fs.ttf),
+ url(res:///media/sd/fonts/fs.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/fs.ttf),
+ url(res:///../fonts/fs.ttf),
+ url(../../../../../fs.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/fs.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/fs.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/fs.ttf);
+ /*ADE1,8, 2.0 Windows Path*/;
+}
+
+@font-face {
+ font-family: "kt";
+ src:
+ local("Caecilia"),local("楷体"),local("楷体_GB2312"),
+ local("Kaiti"),local("Kaiti SC"),local("Kaiti TC"), /*iOS6+iBooks3*/
+ local("MKai PRC"),local("MKaiGB18030C-Medium"),local("MKaiGB18030C-Bold"), /*Kindle Paperwihite*/
+ local("DK-KAITI"),
+ url(../Fonts/kt.ttf),
+ url(res:///opt/sony/ebook/FONT/kt.ttf),
+ url(res:///Data/FONT/kt.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/kt.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/kt.ttf),
+ url(res:///ebook/fonts/kt.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/kt.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/kt.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/kt.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/kt.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/kt.ttf),
+ url(res:///system/fonts/kt.ttf),
+ url(res:///system/media/sdcard/fonts/kt.ttf),
+ url(res:///media/fonts/kt.ttf),
+ url(res:///sdcard/fonts/kt.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/kt.ttf),
+ url(res:///media/flash/fonts/kt.ttf),
+ url(res:///media/sd/fonts/kt.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/kt.ttf),
+ url(res:///../fonts/kt.ttf),
+ url(../../../../../kt.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/kt.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/kt.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/kt.ttf);
+ /*ADE1,8, 2.0 Windows Path*/;
+}
+
+@font-face {
+ font-family: "ht";
+ src:
+ local("黑体"),local("微软雅黑"),
+ local("Heiti"),local("Heiti SC"),local("Heiti TC"), /*iOS6+iBooks3*/
+ local("MYing Hei S"),local("MYing Hei T"),local("TBGothic"), /*Kindle Paperwihite*/
+ local("DK-HEITI"),
+ url(../Fonts/ht.ttf),
+ url(res:///opt/sony/ebook/FONT/ht.ttf),
+ url(res:///Data/FONT/ht.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/ht.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/ht.ttf),
+ url(res:///ebook/fonts/ht.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/ht.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/ht.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/ht.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/ht.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/ht.ttf),
+ url(res:///system/fonts/ht.ttf),
+ url(res:///system/media/sdcard/fonts/ht.ttf),
+ url(res:///media/fonts/ht.ttf),
+ url(res:///sdcard/fonts/ht.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/ht.ttf),
+ url(res:///media/flash/fonts/ht.ttf),
+ url(res:///media/sd/fonts/ht.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/ht.ttf),
+ url(res:///../fonts/ht.ttf),
+ url(../../../../../ht.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/ht.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/ht.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/ht.ttf);
+ /*ADE1,8, 2.0 Windows Path*/;
+}
+@font-face {
+ font-family:"h1";
+ src:
+ local("方正兰亭特黑长_GBK"),local("方正兰亭特黑长简体"),local("方正兰亭特黑长繁体"),
+ local("LantingTeheichang"),
+ local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"),
+ local("DK-HEITI"),
+ url(../Fonts/h1.ttf),
+ url(res:///opt/sony/ebook/FONT/h1.ttf),
+ url(res:///Data/FONT/h1.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/h1.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/h1.ttf),
+ url(res:///ebook/fonts/h1.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/h1.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/h1.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/h1.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/h1.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/h1.ttf),
+ url(res:///system/fonts/h1.ttf),
+ url(res:///system/media/sdcard/fonts/h1.ttf),
+ url(res:///media/fonts/h1.ttf),
+ url(res:///sdcard/fonts/h1.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/h1.ttf),
+ url(res:///media/flash/fonts/h1.ttf),
+ url(res:///media/sd/fonts/h1.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/h1.ttf),
+ url(res:///../fonts/h1.ttf),
+ url(../../../../../h1.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/h1.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/h1.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/h1.ttf); /*ADE1,8, 2.0 Windows Path*/
+}
+@font-face {
+ font-family:"h2";
+ src:
+ local("方正大标宋_GBK"),local("方正大标宋简体"),local("方正大标宋繁体"),
+ local("Dabiaosong"),
+ local("Heiti"),local("Heiti SC"),local("Heiti TC"),
+ local("DK-XIAOBIAOSONG"),
+ url(../Fonts/h2.ttf),
+ url(res:///opt/sony/ebook/FONT/h2.ttf),
+ url(res:///Data/FONT/h2.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/h2.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/h2.ttf),
+ url(res:///ebook/fonts/h2.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/h2.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/h2.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/h2.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/h2.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/h2.ttf),
+ url(res:///system/fonts/h2.ttf),
+ url(res:///system/media/sdcard/fonts/h2.ttf),
+ url(res:///media/fonts/h2.ttf),
+ url(res:///sdcard/fonts/h2.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/h2.ttf),
+ url(res:///media/flash/fonts/h2.ttf),
+ url(res:///media/sd/fonts/h2.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/h2.ttf),
+ url(res:///../fonts/h2.ttf),
+ url(../../../../../h2.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/h2.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/h2.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/h2.ttf); /*ADE1,8, 2.0 Windows Path*/
+}
+
+@font-face {
+ font-family:"h3";
+ src:
+ local("方正华隶_GBK"),local("方正行黑简体"),local("方正行黑繁体"),
+ local("Yuanti"),local("Yuanti SC"),local("Yuanti TC"),
+ local("DK-FANGSONG"),
+ url(../Fonts/h3.ttf),
+ url(res:///opt/sony/ebook/FONT/h3.ttf),
+ url(res:///Data/FONT/h3.ttf),
+ url(res:///opt/sony/ebook/FONT/tt0011m_.ttf),
+ url(res:///ebook/fonts/../../mnt/sdcard/fonts/h3.ttf),
+ url(res:///ebook/fonts/../../mnt/extsd/fonts/h3.ttf),
+ url(res:///ebook/fonts/h3.ttf),
+ url(res:///ebook/fonts/DroidSansFallback.ttf),
+ url(res:///fonts/ttf/h3.ttf),
+ url(res:///../../media/mmcblk0p1/fonts/h3.ttf),
+ url(file:///mnt/us/DK_System/system/fonts/h3.ttf), /*Duokan Old Path*/
+ url(file:///mnt/us/DK_System/xKindle/res/userfonts/h3.ttf), /*Duokan 2012 Path*/
+ url(res:///abook/fonts/h3.ttf),
+ url(res:///system/fonts/h3.ttf),
+ url(res:///system/media/sdcard/fonts/h3.ttf),
+ url(res:///media/fonts/h3.ttf),
+ url(res:///sdcard/fonts/h3.ttf),
+ url(res:///system/fonts/DroidSansFallback.ttf),
+ url(res:///mnt/MOVIFAT/font/h3.ttf),
+ url(res:///media/flash/fonts/h3.ttf),
+ url(res:///media/sd/fonts/h3.ttf),
+ url(res:///opt/onyx/arm/lib/fonts/AdobeHeitiStd-Regular.otf),
+ url(res:///../../fonts/h3.ttf),
+ url(res:///../fonts/h3.ttf),
+ url(../../../../../h3.ttf), /*EpubReaderI*/
+ url(res:///mnt/sdcard/fonts/h3.ttf), /*Nook for Android: fonts in TF Card*/
+ url(res:///fonts/h3.ttf), /*ADE1,8, 2.0 Program Path*/
+ url(res:///../../../../Windows/fonts/h3.ttf); /*ADE1,8, 2.0 Windows Path*/
+}
+
+@font-face {
+ font-family:"luohua";
+ src:local("汉仪落花体"),
+ url("../Fonts/hylh.ttf");
+}
\ No newline at end of file
diff --git a/app/src/main/assets/epub/intro.html b/app/src/main/assets/epub/intro.html
new file mode 100644
index 000000000..5c64026f8
--- /dev/null
+++ b/app/src/main/assets/epub/intro.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Intro
+
+
+
+
+内容简介
{intro}
+
diff --git a/app/src/main/assets/epub/logo.png b/app/src/main/assets/epub/logo.png
new file mode 100644
index 000000000..104d1777c
Binary files /dev/null and b/app/src/main/assets/epub/logo.png differ
diff --git a/app/src/main/assets/epub/main.css b/app/src/main/assets/epub/main.css
new file mode 100644
index 000000000..fcb287442
--- /dev/null
+++ b/app/src/main/assets/epub/main.css
@@ -0,0 +1,551 @@
+@charset "utf-8";
+@import url("../Styles/fonts.css");
+body {
+ padding: 0%;
+ margin-top: 0%;
+ margin-bottom: 0%;
+ margin-left: 0.5%;
+ margin-right: 0.5%;
+ line-height: 130%;
+ text-align: justify;
+ font-family: "DK-SONGTI","st","宋体","zw",sans-serif;
+}
+
+p {
+ text-align: justify;
+ text-indent: 2em;
+ line-height: 130%;
+ margin-right: 0.5%;
+ margin-left: 0.5%;
+ font-family: "DK-SONGTI","st","宋体","zw",sans-serif;
+}
+p.kaiti {
+ font-family: "DK-KAITI","kt","楷体","zw",serif;
+}
+
+p.fangsong {
+ font-family: "DK-FANGSONG","fs","仿宋","zw",serif;
+}
+
+span.xinli {
+ font-family: "DK-KAITI","kt","楷体","zw",serif;
+ color: #4e753f;
+}
+/** 英文斜体字 **/
+span.english{
+ font-style: italic;
+}
+div {
+ margin: 0px;
+ padding: 0px;
+ line-height: 120%;
+ text-align: justify;
+ font-family: "zw";
+}
+div.foot {
+ text-indent: 2em;
+ margin: 30% 5% 0 5%;
+ padding: 8px 0;
+}
+p.foot {
+ font-family: "DK-KAITI","kt","楷体","zw",serif;
+}
+
+/*扉页*/
+.booksubtitle {
+ padding: 10px 0 0px 0;
+ text-indent: 0em;
+ font-size: 75%;
+ font-family: "ht";
+}
+
+.booktitle {
+ padding: 9% 0 0 0;
+ font-size: 1.3em;
+ font-family: "方正小标宋_GBK","DK-XIAOBIAOSONG";
+ font-weight: normal;
+ text-indent: 0em;
+ color: #000;
+ text-align: center;
+ line-height: 1.6;
+}
+
+.booktitle0 {
+ font-size: 1.2em;
+ font-family: "fs";
+ text-indent: 0em;
+ text-align: center;
+ line-height: 1.8;
+}
+
+.booktitle1 {
+ padding: 0 0 0 0;
+ font-size: 0.85em;
+ font-family: "fs";
+ text-indent: 0em;
+ text-align: center;
+ line-height: 1.6;
+}
+
+.bookauthor {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ padding: 5% 5px 0px 5px;
+ text-indent: 0em;
+ text-align: center;
+ color: #000;
+ font-size: 90%;
+ line-height: 1.3;
+}
+
+.booktranslator {
+ padding: 1% 5px 0px 5px;
+ text-indent: 0em;
+ text-align: center;
+ font-size: 85%;
+ line-height: 1.3;
+}
+
+.bookpub {
+ font-family: "DK-KAITI","kt","楷体","楷体_gb2312";
+ padding: 30% 5px 5px 5px;
+ text-indent: 0em;
+ color: #000;
+ text-align: center;
+ font-size: 80%;
+}
+
+/*标题页*/
+body.head {
+ background-repeat:no-repeat no-repeat;
+ background-size:160px 229px;
+ background-position:bottom right;
+ background-attachment:fixed;
+}
+
+body.xhead {
+ background-color: #FDF5E6;
+}
+
+h1.head {
+ font-family: "DK-HEITI",黑体,sans-serif;
+ font-size: 1.2em;
+ font-weight: bold;
+ color: #311a02;
+ text-indent: 0em;
+ font-weight: normal;
+ duokan-text-indent: 0em;
+ padding: auto;
+ text-align: center;
+ margin-top: -8em;
+}
+
+div.head {
+ border: solid 2px #ffffff;
+ padding: 2px;
+ margin: 2em auto 0.7em auto;
+ text-align: center;
+ width: 1em;
+}
+
+h1.head b {
+ font-family: "方正小标宋_GBK","DK-XIAOBIAOSONG";
+ font-weight: bold;
+ font-size: 1.2em;
+ text-align: center;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+ color: #311a02;
+ margin: 0.5em auto;
+ line-height: 140%;
+}
+
+div.back {
+ text-align: center;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+ margin: 4em auto;
+}
+
+img.back {
+ width: 70%;
+}
+img.back2 {
+ width: 40%;
+ margin: 2em 0 0 0;
+}
+/*正文*/
+/**楷体引文**/
+.titou {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+}
+.yinwen {
+ font-family: "DK-KAITI","kt","楷体","zw",serif;
+ margin-left: 2em;
+ text-indent: 0em;
+}
+.nicename {
+ font-family: "DK-HEITI",黑体,sans-serif;
+ font-weight: bold;
+ font-size: 0.9em;
+}
+body.head3 {
+ background-color: #a7bdcc;
+ color: #354f66;
+}
+
+body.head4 {
+ background-color: #bfd19b;
+ color: #4e753f;
+}
+
+h2.head {
+ font-family: "小标宋";
+ text-align: left;
+ font-weight: bold;
+ font-size: 1.1em;
+ margin: -3em 2em 2em 0;
+ color: #3f83e8;
+ line-height: 140%;
+}
+
+h2.head span {
+ font-family: "仿宋";
+ font-size: 0.7em;
+ background-color: #3f83e8;
+ border-radius: 9px;
+ padding: 4px;
+ color: #fff;
+}
+
+
+div.logo {
+ margin: -2em 0% 0 0;
+ text-align: right;
+}
+
+img.logo {
+ width: 40%;
+}
+.imgl {
+ /*图片居右*/
+ margin: -8.8em 1em 4em 0em;
+ width: 80%;
+ text-align: right;
+}
+
+h1.head {
+ line-height:130%;
+ font-size:1.4em;
+ text-align: center;
+ color: #BA2213;
+ font-weight: bold;
+ margin-top: 2em;
+ margin-bottom: 1em;
+ font-family: "方正小标宋_GBK","DK-XIAOBIAOSONG";
+
+}
+h3 {
+ font-family: "DK-HEITI",黑体,sans-serif;
+ font-size: 1.1em;
+ margin: 1em 0;
+ border-left: 1.2em solid #00a1e9;
+ line-height: 120%;
+ padding-left: 3px;
+ color: #00a1e9;
+}
+h4 {
+ font-family: "DK-HEITI",黑体,sans-serif;
+ font-size: 1.1em;
+ text-align: center;
+ margin: 1em 0;
+ line-height: 120%;
+ color: #000;
+}
+h1.post {
+ font-family: "方正小标宋_GBK","DK-XIAOBIAOSONG";
+ text-align: center;
+ font-size: 1.3em;
+ color: #026fca;
+ margin: 3em auto 2em auto;
+}
+.banquan {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ text-align: left;
+ color: #000;
+ font-size:1.1em;
+ margin-bottom:1em;
+ text-indent: 1em;
+ duokan-text-indent: 1em;
+}
+p.post {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+}
+p.zy {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ margin: 1em 0 0 1em;
+ padding: 5px 0px 5px 10px;
+ text-indent: 0em;
+ border-left: 5px solid #a9b5c1;
+}
+.sign {
+ font-family: "DK-KAITI","kt","楷体","zw",serif;
+ margin: 1em 2px 0 auto;
+ text-align: right;
+ font-size: 0.8em;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+}
+
+.mark {
+ font-family: "DK-HEITI",黑体,sans-serif;
+ font-size: 0.9em;
+ color: #fff;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+ background-color: maroon;
+ text-align: center;
+ padding: 0px;
+ margin: 2em 30%;
+}
+
+/*出版社*/
+.chubanshe img{
+ width:106px;
+ height:28px;
+}
+.chubanshe {
+ margin-top:20px;
+}
+.cr {
+ font-size:0.9em;
+}
+
+/*多看画廊*/
+div.duokan-image-single {
+ text-align: center;
+ margin: 0.5em auto; /*插图盒子上下外边距为0.5em,左右设置auto是为了水平居中这个盒子*/
+}
+img.picture-80 {
+ margin: 0; /*清除img元素的外边距*/
+ width: 80%; /*预览窗口的宽度*/
+ box-shadow: 3px 3px 10px #bfbfbf; /*给图片添加阴影效果*/
+}
+p.duokan-image-maintitle {
+ margin: 1em 0 0; /*图片说明的段间距*/
+ font-family: "楷体"; /*图片说明使用的字体*/
+ font-size: 0.9em; /*字体大小*/
+ text-indent: 0; /*首行缩进为零,当你使用单标签p来指定首行缩进为2em时,记得在需要居中的文本中清除缩进,因为样式是叠加的*/
+ text-align: center; /*图片说明水平居中*/
+ color: #a52a2a; /*字体颜色*/
+ line-height: 1.25em; /*行高,防止有很长的图片说明*/
+}
+
+
+/*制作说明页*/
+body.description {
+ background-image: url(../Images/001.png);
+ background-position: bottom center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ padding: 25% 10% 0;
+ font-size: 0.9em;
+}
+
+div.description-body {
+ width: 55%;
+ padding: 2em 1.3em;
+ border-radius: 0.5em;
+ font-size: 0.9em;
+ border-style: solid;
+ border-color: #393939;
+ border-width: 0.3em;
+ border-radius: 5em;
+ background-color: #5a5a5a;
+ box-shadow: 2px 2px 3px #828281;
+}
+
+h1.description-title {
+ text-align: center;
+ font-family: "黑体";
+ font-size: 1.2em;
+ margin: 0 0 1em 0;
+ color: #FF9;
+ text-shadow: 1px 1px 0 black;
+}
+
+p.description-text {
+ color: #f9ddd2;
+ font-family: "准圆";
+ margin: 0;
+ text-align: justify;
+ text-indent: 0;
+ duokan-text-indent: 0;
+}
+
+hr.description-hr {
+ margin: 0.5em -1em;
+ border-style: dotted;
+ border-color: #9C9;
+ border-width: 0.05em 0 0 0;
+}
+
+p.tips {
+ text-align: justify;
+ text-indent: 0;
+ duokan-text-indent: 0;
+ font-family: "楷体";
+ font-size: 0.7em;
+ color: #FFC;
+ margin: 0;
+}
+
+/*版本说明页*/
+.ver {
+ font-family: "DK-CODE","DK-XIHEITI",细黑体,"xihei",sans-serif;
+ font-weight: bold;
+ font-size: 100%;
+ color: #000;
+ margin: 1em 0 1em 0;
+ text-align: center;
+}
+
+.vertitle {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ font-size: 100%;
+ text-indent: 0em;
+ text-align: left;
+ duokan-text-indent: 0em;
+}
+
+.vertxt {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ line-height: 100%;
+ font-size: 85%;
+ text-indent: 0em;
+ text-align: left;
+ duokan-text-indent: 0em;
+}
+.verchar {
+ font-family: "DK-KAITI","kt","楷体","楷体_gb2312";
+ text-align: left;
+ text-indent: 1em;
+ duokan-text-indent: 1em;
+ margin-bottom: 1em;
+ margin-top: 1em;
+}
+.vernote {
+ font-family: "DK-FANGSONG",仿宋,"fs","fangsong",sans-serif;
+ font-size: 75%;
+ color: #686d70;
+ text-indent: 0em;
+ text-align: left;
+ duokan-text-indent: 0em;
+ padding-bottom: 15px;
+}
+
+.line {
+ border: dotted #A2906A;
+ border-width: 1px 0 0 0;
+}
+
+.entry {
+ margin-left: 18px;
+ font-size: 83%;
+ color: #8fe0a3;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+}
+/*版权信息*/
+.vol {
+ text-indent: 0em;
+ text-align: center;
+ padding: 0.8em;
+ margin: 0 auto 3px auto;
+ color: #000;
+ font-family: "方正小标宋_GBK","DK-XIAOBIAOSONG";
+ font-size: 130%;
+ text-shadow: none;
+}
+
+.cp {
+ font-family: "DK-CODE","DK-XIHEITI",细黑体,"xihei",sans-serif;
+ color: #412938;
+ font-size: 70%;
+ text-align: left;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+}
+
+.xchar {
+ font-family: "DK-KAITI","kt","楷体","楷体_gb2312";
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+}
+/*多看弹注*/
+sup img {
+ line-height: 100%;
+ width: auto;
+ height: 1.0em;
+ margin: 0em;
+ padding: 0em;
+ vertical-align: text-top;
+}
+
+ol {
+ margin-bottom:0;
+ padding:0 auto;
+ list-style-type: decimal;
+}
+.hr {
+ width:50%;
+ margin:2em 0 0 0.5em;
+ padding:0;
+ height:2px;
+ background-color: #F3221D;
+}
+
+.duokan-footnote-content{
+ padding:0 auto;
+ text-align: left;
+}
+
+.duokan-footnote-item {
+ font-family:"DK-XIHEITI",细黑体,"xihei",sans-serif;
+ text-align: left;
+ font-size: 80%;
+ line-height: 100%;
+ clear: both;
+ color:#000;
+ list-style-type:decimal;
+}
+
+li.duokan-footnote-item a {
+ font-family:"DK-HEITI";
+ text-align: left;
+}
+a{
+ text-decoration: none;
+ color: #222;
+}
+
+a:hover {background: #81caf9}
+a:active {background: yellow}
+.duokan-image-maintitle {
+ font-family:"DK-HEITI",黑体,"hei",sans-serif;
+ text-align: center;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+ font-size:90%;
+ color: #1F4150;
+ margin-top: 1em;
+}
+
+.duokan-image-subtitle {
+ font-family:"DK-XIHEITI",细黑体,"xihei",sans-serif;
+ text-align: center;
+ text-indent: 0em;
+ duokan-text-indent: 0em;
+ font-size:70%;
+ color: #3A3348;
+ margin-top: 1em;
+}
\ No newline at end of file
diff --git a/app/src/main/assets/number.ttf b/app/src/main/assets/font/number.ttf
similarity index 100%
rename from app/src/main/assets/number.ttf
rename to app/src/main/assets/font/number.ttf
diff --git a/app/src/main/assets/help.md b/app/src/main/assets/help.md
deleted file mode 100644
index a6e6ecf0b..000000000
--- a/app/src/main/assets/help.md
+++ /dev/null
@@ -1,129 +0,0 @@
-## 常见问题
-
-1.为什么第一次安装好之后什么东西都没有?
-* 因为阅读只是一个转码工具,不提供内容,第一次安装app,需要自己手动导入书源,可以从公众号[开源阅读]()、QQ群、酷安评论里获取由书友制作分享的书源。
-
-2.如何导入本地书源文件?
-* 下载群文件里的书源文件(书源格式后缀有txt、json,其中json文件某些情况下无法导入,需要修改后缀为txt格式才可导入);
-* 打开阅读软件;
-* 我的 - 点击“书源管理”;
-* 点击右上角选择“本地导入”;
-* 左下角选择书源文件所在的路径;
-* 点击书源文件导入;
-* 导入后返回书源管理界面;
-* 新版qq下载路径:Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/
-
-3.如何新建大佬发的单独书源?
-* 复制书源代码;
-* 打开阅读软件;
-* 我的 - 点击“书源管理”;
-* 右上角选择“新建书源”;
-* 进入新建书源后点击右上角“粘贴源”;
-* 粘贴书源完成后点击上方保存;
-* 本次新建单独书源操作完成。
-* 注:如果书源有错误或者复制不全会显示格式错误,请重新复制。
-
-4.为什么导入2.0书源后看不了书?
-* 2.0部分书源并不适用3.0,建议导入后进行筛选。
-
-5.阅读2.0数据如何导入阅读3.0?
-* 先对阅读2.0的数据进行备份,然后进入阅读3.0,点击“我的”,选择“备份与恢复”,再点击“导入旧版本数据”。
-
-6.如何给朋友分享我的书源?
-* 打开阅读软件;
-* 点击备份;
-* 打开手机自带的文件管理;
-* 手机自带内存根目录找到YueDu3.0文件夹;
-* 找到myBookSource.json长按选择分享;
-* 选择微信分享或者QQ分享;
-* 选择你要分享的好友点击发送;
-* 好友接收后在手机自带内存根目录找到myBookSource.json文件(QQ在tencent--QQfile_recv微信在Tencent--MicroMsg--Download);
-* 复制该文件到手机自带内存根目录找到YueDu3.0文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹);
-* 打开阅读软件点击恢复。
-* 注:备份路径如已修改过请在修改后的路径下查找书源文件。
-
-7.目前阅读支持哪些格式的本地书籍?
-* 目前支持TXT、EPUB格式(只支持显示EPUB里的文本内容,还不支持显示图片)。
-
-8.如何刷新书架?
-* 在书架界面下拉即可刷新。
-
-9.书架界面书籍右上角的红色或者灰色背景小数字代表什么?
-* 红色代表书籍有更新,灰色代表无更新,数字代表未读章节。
-
-10.如何查看书籍详情?
-* 长按书籍。
-
-11.如何对书架上的书进行删除、切换书架的操作?
-* 书籍详情页操作即可。
-
-12.如何禁止或允许某本书更新?
-* 书籍详情页,点击右上角 - “允许更新”。
-
-13.如何更换小说封面、名字、作者或简介?
-* 书籍详情页,点击右上角修改按钮。
-
-14.怎么使用自定义字体?
-* 阅读界面 - 字体-点击右上角选择字体文件路径。
-
-15.目前支持哪些格式的字体文件?
-* 目前支持ttf、otf格式。
-
-16.书籍经常“正在加载中”怎么办?
-* 在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。
-
-17.书籍内容只有标题,正文内容是路径怎么办?
-* 通常是缓存路径引起的,更换缓存路径即可。
-
-18.效验书源显示失效就说明书源不能用了吗?
-* 效验书源只是测试书源,可以做个参考,失效了不代表书源不能用了。
-
-19.发现和正版书源能不能使用?
-* 发现和正版书源只能用来找书,看排行榜,不能用来看书,如需看书请切换书源。
-
-20.替换净化是什么?
-* 替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。
-
-21.如何自己填写净化替换规则?
-* 第一行:替换规则名称 - 根据自己需求对替换净化规则进行命名;
-* 第二行:分组 - 净化规则的分组组别;
-* 第三行:替换规则 - 填写需要被替换的内容;
-* 第四行:替换为 - 填写想替换成的内容(如不填则默认表示删除第二行里填写的内容);
-* 第五行:替换范围,选填书名或者源名 - 填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。
-* 注:如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第二行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行百度学习)。
-
-22.如何听书?
-* 可以使用手机自带的朗读引擎,也可使用第三方如谷歌、小米等朗读引擎。
-* 【具体操作:安装-系统设置-其他高级设置-辅助功能-TTS输出-选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。】
-
-23.如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页、自定义翻页案件?
-* 阅读界面,设置(可上划,下面还有其他设置)。
-
-24.搜索的时候感觉手机卡顿,如何解决?
-* 我的 - 其他设置 - “更新和搜索线程数”调低。
-
-25.更新前有什么注意事项?
-* 要做好备份。
-
-26.看书时如遇到“目录为空”、“加载失败”和长串英文等情况怎么办?
-* 一般是书源问题,切换书源即可。
-
-27.为什么书源这么多,发现里却只有一点点?
-* 书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。
-
-28.云备份在哪?
-* 我的 - 备份与恢复 - WebDav设置。
-
-29.如何操作进行云备份?
-* 侧栏设置,WebDav设置;
-* 正确填写WebDAV 服务器地址、WebDAV 账号、WebDAV 密码;(要获得这三项的信息,需要注册一个坚果云账号,如果直接在手机上注册,坚果云会让你下载app,过程比较麻烦,为了一步到位,最好是在电脑上打开这个注册链接:https://www.jianguoyun.com/d/signup;注册后,进入坚果云;点击右上角账户名处选择 “账户信息”,然后选择“安全选项”;在“安全选项” 中找到“第三方应用管理”,并选择“添加应用”,输入名称如“阅读”后,会生成密码,选择完成;其中https://dav.jianguoyun.com/dav/就是填入“WebDAV 服务器地址”的内容,“使用情况”后面的邮箱地址就是你的“WebDAV 账号”,点击显示密码后得到的密码就是你的“WebDAV 密码”。)
-* 无需操作,APP默认每天自动云备份一次。
-
-30.关于云备份的相关说明
-* 在正确设置好云备份的情况下,APP默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。
-
-31.本地备份和云备份都能备份哪些东西?
-* 书架、看书进度、搜索记录、书源、替换、APP设置等都会备份,基本涵盖所有内容。
-
-32.出现某些未知bug怎么办?
-* 清除软件数据试试看,不行再进行反馈。
\ No newline at end of file
diff --git a/app/src/main/assets/help/SourceMBookHelp.md b/app/src/main/assets/help/SourceMBookHelp.md
new file mode 100644
index 000000000..e14590232
--- /dev/null
+++ b/app/src/main/assets/help/SourceMBookHelp.md
@@ -0,0 +1,25 @@
+# 书源管理界面帮助
+
+* 书源右上角标志
+ * 绿点表示书源有发现,且启用了发现
+ * 红点表示书源有发现,但是未启用
+ * 没有标志表示此书源没有发现
+* 右上角有分组菜单,可以按分组筛选书源
+* 右上角更多菜单里包含
+ * 新建书源
+ * 本地导入
+ * 网络导入
+ * 二维码导入
+ * 分享选中源
+* 选择源的更多操作在右下角的菜单里面,操作都是针对选择的书源
+ * 启用所选
+ * 禁用所选
+ * 添加分组
+ * 移除分组
+ * 启用发现
+ * 禁用发现
+ * 置顶所选
+ * 置底所选
+ * 导出所选
+ * 校验所选
+* 校验失败的书源分组会加上"失效",选择"失效"分组即可批量操作
\ No newline at end of file
diff --git a/app/src/main/assets/help/SourceMRssHelp.md b/app/src/main/assets/help/SourceMRssHelp.md
new file mode 100644
index 000000000..5f29a5128
--- /dev/null
+++ b/app/src/main/assets/help/SourceMRssHelp.md
@@ -0,0 +1,21 @@
+# 订阅源管理界面帮助
+
+* 订阅源可以通过规则订阅一些网络内容
+* 书源右上角标志
+ * 绿点表示书源有发现,且启用了发现
+ * 红点表示书源有发现,但是未启用
+ * 没有标志表示此书源没有发现
+* 右上角有分组菜单,可以按分组筛选书源
+* 右上角更多菜单里包含
+ * 新建订阅源
+ * 本地导入
+ * 网络导入
+ * 二维码导入
+ * 分享选中源
+* 选择源的更多操作在右下角的菜单里面,操作都是针对选择的书源
+ * 启用所选
+ * 禁用所选
+ * 置顶所选
+ * 置底所选
+ * 导出所选
+* 校验失败的书源分组会加上"失效",选择"失效"分组即可批量操作
\ No newline at end of file
diff --git a/app/src/main/assets/help/appHelp.md b/app/src/main/assets/help/appHelp.md
new file mode 100644
index 000000000..d1e2963f7
--- /dev/null
+++ b/app/src/main/assets/help/appHelp.md
@@ -0,0 +1,190 @@
+# 帮助文档
+
+## **新人必读**
+
+【温馨提醒】 *本帮助可以在我的-右上角帮助按钮再次打开,更新前一定要做好备份,以免数据丢失!*
+
+1. 为什么第一次安装好之后什么东西都没有?
+* 阅读只是一个转码工具,不提供内容,第一次安装app,需要自己手动导入书源,可以从公众号 **[开源阅读]**、QQ群、酷安评论里获取由书友制作分享的书源。
+
+2. 正文出现缺字漏字、内容缺失、排版错乱等情况,如何处理?
+* 有可能是净化规则出现问题,先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。
+
+3. 漫画源看书显示乱码,如何解决?
+* 异次元和阅读是两个不同的软件,**两个软件的源并不通用**,请导入阅读的支持的漫画源!
+
+## 书源相关
+
+1. 如何导入本地书源文件?
+* 下载群文件里的书源文件(书源格式后缀有txt、json,其中json文件某些情况下无法导入,需要修改后缀为txt格式才可导入);
+* 打开阅读软件;
+* 我的 - 点击“书源管理”;
+* 点击右上角选择“本地导入”;
+* 左下角选择书源文件所在的路径;
+* 点击书源文件导入;
+* 导入后返回书源管理界面;
+* 新版qq下载路径:Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/
+
+![QQ导入书源](https://cdn.jsdelivr.net/gh/gedoor/gedoor.github.io@master/images/importSource.jpg)
+
+2. 如何新建大佬发的单独书源?
+* 复制书源代码;
+* 打开阅读软件;
+* 我的 - 点击“书源管理”;
+* 右上角选择“新建书源”;
+* 进入新建书源后点击右上角“粘贴源”;
+* 粘贴书源完成后点击上方保存;
+* 本次新建单独书源操作完成。
+* 注:如果书源有错误或者复制不全会显示格式错误,请重新复制。
+
+3. 为什么导入2.0书源后无法阅读?
+* 部分2.0书源并不适用于3.0版本的阅读,建议导入后进行筛选。
+
+4. 阅读2.0数据如何导入阅读3.0?
+* 先对阅读2.0的数据进行备份,然后进入阅读3.0,点击“我的”,选择“备份与恢复”,再点击“导入旧版本数据”。
+
+5. 如何给朋友分享我的书源?
+* 打开阅读软件;
+* 点击备份;
+* 打开手机自带的文件管理;
+* 手机自带内存根目录找到YueDu3.0文件夹;
+* 找到myBookSource.json长按选择分享;
+* 选择微信分享或者QQ分享;
+* 选择你要分享的好友点击发送;
+* 好友接收后在手机自带内存根目录找到myBookSource.json文件(最新版QQ 安卓10及以下版本在Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/,安卓11版本用户由于系统限制无法访问data目录,微信在Tencent/MicroMsg/Download);
+* 复制该文件到手机自带内存根目录找到YueDu3.0文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹);
+* 打开阅读软件点击恢复。
+* 注:备份路径如已修改过请在修改后的路径下查找书源文件。
+
+6. 效验书源显示失效就说明书源不能用了吗?
+* 效验书源只是测试书源,可以做个参考,失效了不代表书源不能用了。
+
+7. 发现和正版书源能不能使用?
+* 发现和正版书源只能用来找书,看排行榜,不能用来看书,如需看书请切换书源。
+
+8. 为什么书源这么多,发现里却只有一点点?
+* 书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。
+
+## 本地书籍相关
+1. 目前阅读支持哪些格式的本地书籍?
+* 目前支持TXT、EPUB格式
+
+2. 如何导入本地书籍?
+* 在书架页面点击右上角,选择“添加本地”,授予相关权限后即可导入本地书籍。也可在文件管理器中使用 **阅读** 打开相关书籍。
+
+3. 导入TXT文件提示“LoadTocError”或“List is empty”是怎么回事?
+* 请先去应用详情中确认是否授予了阅读“读写手机存储”的权限。
+* 自动识别目录失败,可能是相关目录规则未开启,请点击右上角的换源按钮手动更换目录规则。
+* 如果尝试所有规则均无法识别,请在github上提交issue并附件相关txt文件,也可以发送邮件至i@qnmlgb.trade(标题:legado本地文件章节无法识别,内容对其具体情况进行简要说明,附件上传相关txt文件)。
+
+4. 如何下载书籍到本地?
+* 把在线书籍加入到书架后,在书架页面点击右上角,选择“离线缓存”即可。
+
+5. 如何自定义导出的txt/epub文件名称?
+* 点击 **离线缓存** - **导出文件名**.
+* 使用方法:
+ - 导出文件名支持js语法
+ - 可用变量: name - 书名 author-作者
+ - 示例:
+ > {name+"作者:"+author}
+ - 导出文件名:
+ > Legado是最好的在线阅读软件 作者: kunfei.
+
+**注意:** name、author等变量与字符串的拼接都需要在js环境中进行,即必须使用{ } 将变量与字符串包裹起来.
+
+6. 为什么我打开本地的TXT文件,显示内容却是乱码?
+* 部分编码在阅读上会识别错误,建议先用文本编辑器转换为常用的UTF-8格式。
+
+7. 阅读对部分把正文(如所有含引号的句子)识别成标题,如何解决?
+* 点击右上角更换目录规则即可。
+
+## 书籍界面相关
+
+1. 如何刷新书架?
+* 在书架界面下拉即可刷新。
+
+2. 书架界面书籍右上角的红色或者灰色背景小数字代表什么?
+* 红色代表书籍有更新,灰色代表无更新,数字代表未读章节。
+
+3. 如何查看书籍详情?
+* 长按书籍。
+
+4. 如何对书架上的书进行删除、切换书架的操作?
+* 书籍详情页操作即可。
+
+5. 如何禁止或允许某本书更新?
+* 书籍详情页,点击右上角 - “允许更新”。
+
+6. 如何更换小说封面、名字、作者或简介?
+* 书籍详情页,点击右上角修改按钮。
+
+7. 怎么使用自定义字体?
+* 阅读界面 - 字体-点击右上角选择字体文件路径。
+
+8. 目前支持哪些格式的字体文件?
+* 目前支持ttf、otf格式。
+
+9. 书籍经常“正在加载中”怎么办?
+* 在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。
+
+10. 书籍内容只有标题,正文内容是路径怎么办?
+* 通常是缓存路径引起的,更换缓存路径即可。
+
+11. 看书时如遇到“目录为空”、“加载失败”和长串英文等情况怎么办?
+* 在线书籍一般是书源问题,切换或更新书源即可。本地书籍请尝试手动更换目录规则。
+
+12. 为什么每一章的最后一页,阅读的文字和横线背景总是对不齐?
+* 请在 设置-文字底部对齐 选项中关闭底部对齐,再调整排版。
+
+13. 漫画源或图片章节只能看到第一页,如何解决?
+* 请先查看原网页是否正常,若正常,请在书籍阅读界面点击右上角的 **⁝** 按钮,在弹出的菜单中,选择 **翻页动画(本书)**,将翻页动画更改为 **滚动**。
+
+14. 阅读图片章节、漫画或epub插图时,图片被缩放到一页中,以至无法看清,如何处理?
+* 临时处理方案:长按图片可以进行双指缩放。图片章节请先参考Q13中的方案将翻页动画更改为**滚动**
+* 3.0旧版可以点击书籍界面的章节标题进入 **编辑书源** 界面,在 正文-图片样式 中填入 *full*,保存更改,刷新当前章节即可。
+* 3.0新版可以直接在书籍阅读界面点击右上角的 **⁝** 按钮,选择 图片样式- *full*.
+
+
+## 替换净化相关
+1. 替换净化是什么?
+* 替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。
+
+2. 如何自己填写净化替换规则?
+* 第一行:替换规则名称 - 根据自己需求对替换净化规则进行命名;
+* 第二行:分组 - 净化规则的分组组别;
+* 第三行:替换规则 - 填写需要被替换的内容;
+* 第四行:替换为 - 填写想替换成的内容(如不填则默认表示删除第二行里填写的内容);
+* 第五行:替换范围,选填书名或者源名 - 填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。
+* 注:如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第二行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行百度学习)。
+
+
+## 备份相关
+
+1. 云备份在哪?
+* 我的 - 备份与恢复 - WebDav设置。
+
+2. 如何操作进行云备份?
+* 侧栏设置,WebDav设置;
+* 正确填写WebDAV 服务器地址、WebDAV 账号、WebDAV 密码;(要获得这三项的信息,需要注册一个坚果云账号,如果直接在手机上注册,坚果云会让你下载app,过程比较麻烦,为了一步到位,最好是在电脑上打开这个注册链接:https://www.jianguoyun.com/d/signup ;注册后,进入坚果云;点击右上角账户名处选择 “账户信息”,然后选择“安全选项”;在“安全选项” 中找到“第三方应用管理”,并选择“添加应用”,输入名称如“阅读”后,会生成密码,选择完成;其中 https://dav.jianguoyun.com/dav/ 就是填入“WebDAV 服务器地址”的内容,“使用情况”后面的邮箱地址就是你的“WebDAV 账号”,点击显示密码后得到的密码就是你的“WebDAV 密码”。)
+* 无需操作,APP默认每天自动云备份一次。
+
+3. 关于云备份的相关说明
+* 在正确设置好云备份的情况下,APP默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。
+
+4. 本地备份和云备份都能备份哪些东西?
+* 书架、看书进度、搜索记录、书源、替换、APP设置等都会备份,基本涵盖所有内容。
+
+5. 出现某些未知bug怎么办?
+* 清除软件数据试试看,不行再进行反馈。
+
+
+## 其他
+1. 如何听书?
+* 可以使用手机自带的朗读引擎,也可使用第三方如谷歌、小米等朗读引擎。
+* 【具体操作:安装-系统设置-其他高级设置-辅助功能-TTS输出-选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。】
+
+2. 如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页、自定义翻页案件?
+* 阅读界面,设置(可上划,下面还有其他设置)。
+
+3. 搜索的时候感觉手机卡顿,如何解决?
+* 我的 - 其他设置 - “更新和搜索线程数”调低。
diff --git a/app/src/main/assets/help/debugHelp.md b/app/src/main/assets/help/debugHelp.md
new file mode 100644
index 000000000..dcfd3677e
--- /dev/null
+++ b/app/src/main/assets/help/debugHelp.md
@@ -0,0 +1,22 @@
+# 书源调试
+
+* 调试搜索>>输入关键字,如:
+```
+系统
+```
+* 调试发现>>输入发现URL,如:
+```
+月票榜::https://www.qidian.com/rank/yuepiao?page={{page}}
+```
+* 调试详情页>>输入详情页URL,如:
+```
+https://m.qidian.com/book/1015609210
+```
+* 调试目录页>>输入目录页URL,如:
+```
+++https://www.zhaishuyuan.com/read/30394
+```
+* 调试正文页>>输入正文页URL,如:
+```
+--https://www.zhaishuyuan.com/chapter/30394/20940996
+```
diff --git a/app/src/main/assets/help/httpTTSHelp.md b/app/src/main/assets/help/httpTTSHelp.md
new file mode 100644
index 000000000..0f261888a
--- /dev/null
+++ b/app/src/main/assets/help/httpTTSHelp.md
@@ -0,0 +1,15 @@
+# 在线朗读规则说明
+
+* 在线朗读规则为url规则,同书源url
+* js参数
+```
+speakText //朗读文本
+speakSpeed //朗读速度,0-45
+```
+* 例:
+```
+http://tts.baidu.com/text2audio,{
+ "method": "POST",
+ "body": "tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio"
+}
+```
\ No newline at end of file
diff --git a/app/src/main/assets/help/readMenuHelp.md b/app/src/main/assets/help/readMenuHelp.md
new file mode 100644
index 000000000..85a976046
--- /dev/null
+++ b/app/src/main/assets/help/readMenuHelp.md
@@ -0,0 +1,58 @@
+# 阅读界面帮助文档
+
+## 阅读界面主菜单
+* 顶部操作
+ * 章节名称:点击可编辑书源
+ * 章节url:点击可打开浏览器浏览
+ * 菜单:**不同类型的书籍显示的菜单不同**。详情请查看菜单文字,长按菜单图标可显示文字
+* 中间左侧-亮度调节
+ * 亮度调节的顶端有跟随系统亮度的开关,打开后亮度跟随系统,关闭后才可以调节亮度条
+* 底部操作
+ * 4个圆形按钮依次为 全文搜索✧自动翻页✧替换净化✧切换夜间模式
+ * 上一章✧下一章中间的进度条为页数进度,要快速跳转章节点击目录按钮进入目录快速跳转
+ * 目录->目录和书签界面
+ * 朗读->单击开始朗读,长按进入朗读设置界面
+ * 界面->所有排版设置都在里面
+ * 设置->其它一些设置,找不到的设置去这里看看,可滚动
+
+## 朗读设置界面
+* 后台->进入后台朗读,可以做一些其它事
+* 设置->朗读引擎设置,可以切换本地TTS和在线朗读,在线朗读可自定义
+
+## 排版设置界面
+* 白天模式和夜间模式背景不同布局相同
+* 共用布局->启用共用布局时所有背景使用同一布局,关闭共用布局则每个背景单独布局
+* 长按背景可进入文字颜色和背景设置界面
+
+## 其它设置界面
+* 屏幕方向
+* 屏幕超时
+* 隐藏状态栏
+* 扩展到刘海
+* 隐藏导航栏
+* 文字两端对齐
+* 文字底部对齐
+* 音量键翻页
+* 点击翻页
+* 朗读时音量键翻页
+* 自动换源->书源被删除时自动切换到其它书源
+* 长按选择文本
+* 显示亮度调节控件
+* 点击区域设置
+* 自定义翻页按键
+
+## Txt目录正则说明
+
+### 菜单区
+
+- 新增目录规则,当Legado自带的规则不能够满足需求时,用户可根据自己的情况自定义目录规则
+- 导入默认规则 在旧版本中,Legado自带的规则不会随着软件的更新而更新。用户需要使用最新规则或对自带规则修改后需要重置时,可点击 导入默认规则。**注意:导入默认规则不会重置用户自定义的规则,但如果您对自带的规则进行了修改,则修改的规则会被重置为默认规则。**
+- 导入在线规则 为了方便异步调试以及用户导入他人的目录规则,Legado增加目录规则的网络导入功能。点击 网络导入 的输入框,可以通过内置的链接导入在线规则。(在线规则优先比内置的规则更加激进,但适配了更多类型的标题格式,用户需根据自己的情况选择是否导入)
+
+### 操作区
+![Functions][example]
+ - 按钮① 当前书籍规则 如果Legado的自动识别的目录情况不太理想,用户可以手动点击各个规则前面的按钮,临时对本书启用该规则,该按钮仅**针对当前书籍生效**。
+ - 按钮组② 左边的开关被点亮时,表示该规则针对**所有TXT书籍生效**。开启后会对所有的TXT格式的书籍启用当前规则扫描符合条件的标题格式;中间的按钮表示编辑当前规则,当识别出的目录与你所期望的不一致时,可以修改当前规则以适应你所导入的书籍;右边的按钮表示删除当前规则,当用户不需要当前规则时可直接删除。(默认的规则删除后可点击 导入默认规则 按钮恢复)
+ - 按钮组③ 在当前界面进行操作后,需要点击确认按钮使得选择生效。
+
+[example]:data:image/jpg;base64,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I1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQZ1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVudEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdoZW5QcmludGluZ2Jvb2wAAAAADmNyb3BSZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0bG9uZwAAAAAAAAANY3JvcFJlY3RSaWdodGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAAOEJJTQPtAAAAAAAQAEgAAAABAAEASAAAAAEAAThCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAHjhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAThCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAADgAAAAAAAAAAAAAAAAAAOEJJTQQwAAAAAAAHAQEBAQEBAQA4QklNBC0AAAAAAAYAAQAAAAI4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADlwAAAAYAAAAAAAAAAAAAAlgAAAEsAAAAMQBTAGMAcgBlAGUAbgBzAGgAbwB0AF8AMgAwADIAMAAtADEAMQAtADIANAAtADEANgAtADMANAAtADQANQAtADUAMQA0AF8AaQBvAC4AbABlAGcAYQBkAG8ALgBhAHAAcAAuAAAA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AGgAbwB0AG8AcwBoAG8AcAAgAEMAQwAgADIAMAAxADkAAAABADhCSU0EBgAAAAAABwABAAAAAQEA/+EOxWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2YTcwM2M3LWNiOWMtN2Q0Zi05MDZmLWZkYmEwNjEzYTc5ZSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMzIyZjg5NS1mNmJjLTZkNDAtYTY2MS1hYzNlZTY0Nzg5OWMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iODU2NzdDMTcyNUEwMDVDMUJCODcwRDIxQTdGMTk2MTciIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTExLTI0VDE2OjM4OjAyKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0xMS0yNFQxNjo0NDoyMiswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0xMS0yNFQxNjo0NDoyMiswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZkNWJiOTY2LTU5MTYtZTU0Mi1hMGM5LWM3Zjg1YzcxZTY2NCIgc3RFdnQ6d2hlbj0iMjAyMC0xMS0yNFQxNjo0NDoyMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMzIyZjg5NS1mNmJjLTZkNDAtYTY2MS1hYzNlZTY0Nzg5OWMiIHN0RXZ0OndoZW49IjIwMjAtMTEtMjRUMTY6NDQ6MjIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLikaAiIHBob3Rvc2hvcDpMYXllclRleHQ9IuKRoCIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IuKRoSIgcGhvdG9zaG9wOkxheWVyVGV4dD0i4pGhIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i4pGiIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLikaIiLz4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgCWAEsAwEiAAIRAQMRAf/dAAQAE//EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8ADJ8UpPimSXTvGryfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFKT4pkklLyfFF3H7Lz+f/wB9QUX/ALTf2/8AvqZLeH97/uJL4fLk/u/93B//0AK5gM6S5tn7RtuqII9P0Wh0j87duCppHhdNIWKsx8Y7vHQlwyB4RLwl8ru9T6T0XBtfiMvybM0sBpZtbtc5/wDNtLg1ZDcLMdkHFbQ85LfpU7TvECdWrT+tgJ60QASTVUAByTHZa2X9pPS7KWOY7rzMdn23aD6px5cfTDvzr9uz1v8A1Wqkc0oY8ZJ4zlA+f9A/ven/ACTfny8MmXLER9sYSa4B/ODX0er/ACriU9BzLulvz212mwPa2uoMkPYRJuaf3WovSum4t/TLcy3FvzLWXioVY5IIaWh+8gNcj9Pt6jd9WclmK+6yyq+trG1ucXNr2jc1oafbUm6VZTX9XbnXWZFLPtjQHYn85Owact/RpTyZOGYMtRkjEcN8XCf7qseLFxYyI6SwymeOuHiHX1JcTpGDkZVVD+k59DLHQ617iGt0+k72LFx66P2j6Nrd9XqPZsdYKpjcG7r3fQW/0nIwXdTxm15XU3vL/ay6PTJh3877vorO6O+5vVrmMxnZVVj3i5jK22OA3O2vHrA1s2u/eQhOY9yyTUAQJGcf3v8AOJyY4H2aAF5CCYxhLpH9GCc9P6WAT9mq0/8ANjX/AORVHruFj4Oc2jGBax1NdhaXb4L53RZ+c1dGzGazHza78jBdex7K6LBRWRWXktYMtjW7Get9D+Qsj6zX5IfXh3NcTSAH3vpbUHubIb9ncwbvQa0/R3JuDLI5QASRrdyn2jLi9a7mcMY4CSADoRUcenqlHgPto20fVsmkOq6iwZBAre70w10nZuYfzmtcl1HG+rmHfkYgGY7IplrXTXsL49vg/YpZX9C+r39r/wA+sU/rD1Qfb87E+xY07iz7R6Z9Xhvv9Td/OJ8eMziAZkHjv1/5vJ7fEsmIRxyJjAEe3R4P87i9zhR9L6bhX4FNtuO/Iyb7rK2tbb6TQ2tnrE/Rd+amz+k4YY/IxS+qpuFTmCtx3km1+zY5/wDJarf1bsbZTTSw+/FfkXWl3tY1tlX2enda72fpLHIObm0VUX4lxNOQzp+PiGt4IJtrfusY395u33Ns+g9Azye8QDLQjTf0yn+7/cXCGI8uDKMdQaNAeqOP9/8Av8TR6/i0YnWMnGx2enTWW7GSTEsY4/Sn85yz1q/Wn/l/L+LP/PbFlKzgJOLGSbJhH/otLmQBnygCgJzAA/vKSSSUjEpJJJJSkkkklKSSSSUpJJJJSkkkklKV3pOPRk5FrLhuazHusaJI9zG7mH2qrVYarWWtDXFhDg143NMfvsP0mrd6P1e+7Jua6jFbtxr3gsoY0y1m7aSPzP32KHPKYhLhHTfi4aZ+Vhjlkjxnr8vDxCTz4MgJK7kdVuyaDS+nGY10e6qlrHCNfa9qpKSJkR6hw/XiYpiIPplxDvXCpJJJOWtzpo6Xuu/aO+Nn6H05+l57f/OFTWr0B3UGuyvsVFd5NUWeoYgfm7f3t3+j/PWUFHE+uYvbh63/AM39BlmP1WM1vxa8PD1/f/TUi/8Aab+3/wB9QkTYPS3yZ3Rtn2/R52/vIy3h/e/7iS2Hy5P7v/dwf//RAkkkuneNSOych1ovfa91zY22lxLht+hDz7vanbk5LLzkMusbeSSbg4h5J+l+knd7kJJDhHYdvonilvZ3vfr3S05OTQXGi59Rfo8scWyP5W0+5WMTrHUMHFdjYlnote8WOe0e+QNu3cfbs/sqkkhKEZaSiD5jsmOScTcZGNWND+9u6lP1l65Va2w5TrNhnY+C0+T9u13/AElQblZLHWursdV68+rsJbuBO7adv5qEkgMcBdRiL3odkyzZZVxTkaurPduWdUyX4A6eG1V4/t3+mwNc8t+i65/56H+0M4101Ove6vHeLKWuO4NcPolu79391V0kRjgP0RvxbfpHqo5ch/SO3Dv+iOjq/wDOnr+v62df5Ff/AKTSP1o68WlpyyQRB9lfB/62spJM+74f81D/ABYr/vXMf57J/jybBz8k4A6eCG4wcXua0QXk/wCld/hNn5iPV1vqDLGWucy91dYpZ6zA+GA7xz+fu/PVBJOOOB0MRqSdusvmWDNkFETOgA36R+VLlZN2XkWZOQ7fbaZe6I8uEJJJOAAAA0AWEkkkmydSSpJJJFSkkkklKSSSSUpJJJJSkkkklKSSSSUpTrttqcXVPLHOaWktMS12j2/2lBJAi91AkGxopJJJFSkkkklJKr7qdxpsdWXja7aSJB/NMIaSSFKs1XZSL/2m/t/99QlP1Gen6X5+7dEaRt/eTZbw/vf9xJfD5cn93/u4P//S6P8A5iu/7nD/ALb/APM0v+Yrv+5w/wC2/wDzNC+vWMzL6j0PFsJFeRc+p5boQHuxmO2zu93uRv8AxuOh/wCnyv8APr/9IKU/E+c4pRiRLhrX0R3HF+4vj8A+FjBhy5sksRziUowjDJlr25yxfN78P3Vv+Yrv+5w/7b/8zS/5iu/7nD/tv/zNP/43HQ/9Plf59f8A6QS/8bjof+nyv8+v/wBIJf6R57w+2H/qtH+hPgn+fn/4Tk/+CFv+Yrv+5w/7b/8AM0v+Yrv+5w/7b/8AM0//AI3HQ/8AT5X+fX/6QS/8bjof+nyv8+v/ANIJf6R57w+2H/qtX+hPgn+fn/4Tk/8Aghb/AJiu/wC5w/7b/wDM0v8AmK7/ALnD/tv/AMzT/wDjcdD/ANPlf59f/pBL/wAbjof+nyv8+v8A9IJf6R57w+2H/qtX+hPgn+fn/wCE5P8A4IW/5iu/7nD/ALb/APM0v+Yrv+5w/wC2/wDzNP8A+Nx0P/T5X+fX/wCkEv8AxuOh/wCnyv8APr/9IJf6R57w+2H/AKrV/oT4J/n5/wDhOT/4IW/5iu/7nD/tv/zNL/mK7/ucP+2//M0//jcdD/0+V/n1/wDpBL/xuOh/6fK/z6//AEgl/pHnvD7Yf+q1f6E+Cf5+f/hOT/4IW/5iu/7nD/tv/wAzS/5iu/7nD/tv/wAzT/8AjcdD/wBPlf59f/pBL/xuOh/6fK/z6/8A0gl/pHnvD7Yf+q1f6E+Cf5+f/hOT/wCCFv8AmK7/ALnD/tv/AMzTH6jwQDntBPE18/8Agiy8v6mYD+r19K6dbcXMZ62bda5rm1sOjGMayuvddZ/XVXN6F9W6ut4nR8W7IvstsDMmzeyGT+Y3bT7rP3v3E0/FecG9DXh/Q3/8LZh/xb+FyIEMs5XA5T+qyDgxx/Sn+v8ATxO//wAxXf8Ac4f9t/8AmaX/ADFd/wBzh/23/wCZrE630PA+rHVulZVVtr8d1wstFkOc0Uvqe4t9Ntf5r/3V6K1zXNDmmWuEgjggp8PiXNSMgZcJjXSEt/8AAavNfAuRxQw5Md5ceYSMZEZMX83LgkP5ybyv/MV3/c4f9t/+Zpf8xXf9zh/23/5murSUn3/mf3/+bD/vWp/ozlP83/zp/wDfPKf8xXf9zh/23/5ml/zFd/3OH/bf/ma6tJL7/wAz+/8A82H/AHqv9Gcp/m/+dP8A755T/mK7/ucP+2//ADNL/mK7/ucP+2//ADNdWkl9/wCZ/f8A+bD/AL1X+jOU/wA3/wA6f/fPKf8AMV3/AHOH/bf/AJml/wAxXf8Ac4f9t/8Ama6tJL7/AMz+/wD82H/eq/0Zyn+b/wCdP/vnlP8AmK7/ALnD/tv/AMzS/wCYrv8AucP+2/8AzNdWkl9/5n9//mw/71X+jOU/zf8Azp/988p/zFd/3OH/AG3/AOZpf8xXf9zh/wBt/wDma6tJL7/zP7//ADYf96r/AEZyn+b/AOdP/vnlP+Yrv+5w/wC2/wDzNL/mK7/ucP8Atv8A8zXVpJff+Z/f/wCbD/vVf6M5T/N/86f/AHzyn/MV3/c4f9t/+Zpf8xXf9zh/23/5murSS+/8z+//AM2H/eq/0Zyn+b/50/8AvnlP+Yrv+5w/7b/8zS/5iu/7nD/tv/zNdWkl9/5n9/8A5sP+9V/ozlP83/zp/wDfPKf8xXf9zh/23/5mg/8ANX9e/Zn2sbvT+0b9nb+b2+nv/wCmuxWdtb/zk3QN32ON3eN3CB57mDXr21+WH/epHw3lBdY9xR9U/wC9+8//0+k+t/8Ay59Xf/DR/wDPmKtbqvW3YmRV0/BxzndUvbvZjg7WsYNPtGTb/gqv+rWT9b/+XPq5/wCGj/58xUK6zLrH1tyMSf2nW9jGFur20Ctuw1/nfzfrPaosf85l84/9B1Z4xPleSvWseTQ6RufNSxjj/qep0Tl/XKnda/H6fmtr1sxcax7bgPBj7fY5/wDWWn0vqeL1XDbmYpdsJLHseNr2Pb/OU2s/NsYvJegX5lfWsN/T3OOU+5ohpJL2k/pW2fv17N3qb16T0gNZ9Z+vMo/mD9ne8DgXuY71f7bmbfUUxDFzfKjGCPTxCPGDEcGnFHGYyhcv3/RJ18jLxMUNOVfXQHaNNr2smP3fULdyjj5+DkvLMbJpveBJbVY15A8drHOXN/XBjn9Z6QGtc8+hl6MxRmnnG/7Tv+h/x39hVuh1PZ9a8Pex7JxMqN+A3B/OxvouZ/SP6n+DQc96qzq3SqrHVW5uPXYw7XsdcwOaR+a5rnbmozMnHfR9pZax+PBd6zXAs2t+k71Adm1q4LrHVX4edZ9tFdWU7KbTZjNuc1wa/wB32+qo4Vr7MFtbPVst/wCM/wAIrFAyq/qJm12Fow7cgNqyGbwbMfJyWHKu/Ssp3UOqyHsqvaxnr1fpfTSU9vTYy+pl1LhZVa0Pre3UOa4bmPb/ACXNUce+jJpF+PY26l0htjDLTtJY73D917dqxPrZb9lrryLMS23Cw2l7raMx2GWuJFbMcU0OrsybLPYzHZ/pP0dSx/qlg5uBZiYtmBcMrH/SXh3USRVVkPtfXbd01z3Vu9j/AKO3+erf/hUlPaX3047BZkPbUxzmsa55gFzyK6mSfzrHu2MRII7Lg87puHh9Ryr+sdJstw7r3ek6usZLrLciwDHttyrbaW1/pHbMfDpxtlH+FyLEWnAy+nfVv6wXuxjhGzEcK7GzS55qZYPUfhB97cXI9/uvx8r0sj/R46Sns2X0WXW49djX3UbTdWDLmbxur9Rv5u9o9qZ+RRXdXjvsa264ONVZMOeGQbdg/O9Pd7lxGX0OqvpuRaz6r3VP9BzzcM5s7gw7bHbcrc/YtXKc49C+rWVvLsluR041vP0nG1raMn3H3fpca271ElNropaOv9ca/S82UOPnX6cVf9+WZ1npuF0/r/QRiVCs3ZN1lruXOcTS6XOPu/OWt1jpuc3MZ1jpEHNqb6duO4w2+qd3pl35lrf8G9ZXUOo4+dndPy8rHzcO/pr3vOOcZ1m8u2e1lrHbf8F9NQz0HCRrxWD4cfE6eAmWQZYEmEsRx5IR+aOSGCWCHFj/AHJS+STU/wAZvHTf+v8A/ohdZ0NtrejYDbf5wY9QdPM7G8rjvrFlX9Y6v0ZmVg2YmFZfsrF8NssD30Nu31A/ovbsXfAACBoBwEMWuXJIf1R/zU86TDkOSwyGo92ZNiX+Vnp6f+cpJJJTuWpJJJJSkklX6i61uBkOpn1BW7bHPnH9lJIFkDuaR3dY6ZTYa33gvbo4NBdB8Jasnrf136Z0yoCgOy8p+rKYLAB/pLXuH0FjiIEcdlyXWXOd1TI3dnAN/qgDanAB0uX5HFKdSJIAsi/mejp/xl9WFu6/EofTOrGFzXR/JscX/wDSau36P1fD6xgszcMnY47Xsdo5jx9KuwfvLxldt/ixfb9o6jXr6OytxHbfLm/9QkQKZee5PDHCckI8EoVttIE8L3qwH/XCn7Tk0YnSupdQbiXPx7cjGqY6r1a9Lq2Osuqf+jd7PoLoG/SHxXPfU7+a6x/6eM7/AM+BNcdNhfWmrJ6hj9Pv6b1Dp1uXvGO/LqY2t7q2+s+vfVbdtf6bXP8Actpc31G/J6n1mjpOU63pnTX3OZWBubfnWUt+0vZVbX/RensYzc+3ey3L/mq10hMmUlKVDqXX+idKcWdRzqMWwM9UVWPAeWa+5lf03/R/MV9c/wBdrn60fVt4Alzs2ncQPzsc2t5/lUpKa+D/AIx/qxl3spssfgixpfXdlGtlZjXa59dtvo2bfzL/AE10eLl4ubjsysO5mRj2TsurIcx0Ha7a9v8AKC4GrrmbmdFabrvU9T6t5uZkghvvva5uMy58N+n/ADq7bolQo6L0+kCBXi0tj4VsSU3Vn/8ArRf+gn/floLP/wDWi/8AQT/vySn/1Ok+t/8Ay59Xf/DR/wDPmKtPqfSMx2czq/R7mY/UWM9O1loJpvrGrar9vuY9n+Duasz63/8ALn1d/wDDR/8APmKuqUWP+cy+cf8AoOjzEzDlORI/zeYEHUSH3jJoXmqqPrILHnD6R0/pmRbpZn722QD9J7Kqq2ve7+utjpHSqelYpoY911tjzbk5Nn07bXfTtf8A98arqSlac80pCqER14b9Vd5T4pNDqPRMDqWTj5OX6u/FbYyoVWvp0t2epvdjursd/NN/PUMX6vdNw8+vqGP6wvqrfU31L7Lm7bCxz/bkvt2u/RN/m1pJJMTks+q/SKbcd+Ox+PXjW/afQrdDbbvcWZGZY5rsnJsr3u9P1MhGZ0DpNeJmYVNHpY3UA77RSxzgyXjY91NRJrx3a7v0DGfpP0i0EklOdndBweoVYdeY++x3TyH0WttdW/1A30/XsdSWb79v+EQ6fq10ynOo6hW7J+148tZa/ItsJrd/OY9rb32NfQ936TZ/pfetVJJTkZn1Yws1zjk5Wc9rrBaKvtVgY17XerW6usH9H6Vg31fuIv7Bxjg5eDbkZd9OdWarfXvda5rSCx3oG3d6X0lpJJKcd/1S6I+l1JGVtcw1n9cyToRs/Ov2/RVsdIxR+zhLyzpQjGrJG0uFf2ZltzY99tVO/wBP/jFdSSUpJJJJTyv1v/5c+rv/AIaP/nzFXVLlfrf/AMufV3/w0f8Az5irqlFj/nMvnH/oN/m/9x8j/czf+7GRSSSSlaCkkkklKSSSSU5tv1f6bY8vAfXu1LWOhv8AZaQdqwPrH9RGZLftPTrHNyGiHNsMtcB29o9v9ZdikjZZoczmhISjM6d9Xyer6l/WCy0VmllYmC8vBA+TfcvQvq30GnoeB9nYd9th33WHQud/31rfzFrJJEkr8/O5s4EZkCO/DEVfmoaGVztf1c69h5GY7pXWKsbGzMm3LNN2ILnNfcd9rfW9evczf9D2LokkGs4GP9X+sv6rhdQ6t1WvNb042PopqxhRL7WHHLrLPWu9jWP+jtW+kkkpSz+s9Jd1JuNZRkHDzcG318TJDRYGuLXU2Mtpft9Wm2qx7Ht31/8AGLQSSU83d9V+rZdDsPK6hi14drDRc3EwhTaaHHdbi1XvvubRXb+f+iXRta1jWsYNrGANa3wAENCdJJSlmRV/znnT1fsXjrt3furTWdA/5xzGv2Tnv9JJT//V7nrv1cwuueh9rfaz7Pv2ek5onfs3bt7LP9Gsr/xueif6bK/z6/8A0guqSUcsOORuUQSW3h+I85hgMeLNKEI3wxGw4vUXlf8Axueif6bK/wA+v/0gl/43PRP9Nlf59f8A6QXVJIfd8X7gZP8AS/P/APiibyv/AI3PRP8ATZX+fX/6QS/8bnon+myv8+v/ANILqkkvu+L9wK/0vz//AIom8r/43PRP9Nlf59f/AKQS/wDG56J/psr/AD6//SC6pJL7vi/cCv8AS/P/APiibyv/AI3PRP8ATZX+fX/6QS/8bnon+myv8+v/ANILqkkvu+L9wK/0vz//AIom8r/43PRP9Nlf59f/AKQS/wDG56J/psr/AD6//SC6pJL7vi/cCv8AS/P/APiibyv/AI3PRP8ATZX+fX/6QS/8bnon+myv8+v/ANILqkkvu+L9wK/0vz//AIom8r/43PRP9Nlf59f/AKQS/wDG56J/psr/AD6//SC6pJL7vi/cCv8AS/P/APiibzWJ9Qej4mVTlV25Jsx7G2sDn1kEsIe3dFLfb7V0vySST4QjD5RVtbmOaz8wQc2Q5DEVHi6K+SXySSTmFXyS+SSSSlfJL5JJJKV8kvkkkkpXyS+SSSSlfJL5JJJKV8kvkkkkpXyS+SSSSlfJL5JJJKV8ln/+tF/6Cf8AfloLP/8AWi/9BP8AvySn/9b05U+o9VxOnNZ62591x20Y9Td9tjvCusf9Wrix+ltbkdc6rm2+67HsZiUT+ZUGNtOz931Xv9ySlO69mUt9XM6RlUYw1da0stLR+9ZTU71FqY+RRlUMyMexttNo3V2N1BCIDGoWP0ituL1jquBSNuMDVksYOGPuB9ZjR+buc31ElOwATwnII5C5X632sb1XpVV1tVdD6spzm5GVbh1Fzfs/pn1cX32Wt3P2Vqt0G2kfWjGpxbsd1b8TJdazFzr8xpLXY/puvZlw2nbuf6T2/wAtJT2cHwKbhcF1DJxrMu7KdTdWyzMGK9pbuc3IsIa2i3Z1enZ6jvz/AEaqdi3/AKl33u6Vbi3tf6mHk31Osc5r2n9I97aq3svy/wCj1uZVYx1z/Sf+i9R6SneSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJAz734+FffX9OthLfj4/2UkgWQB10SPvorO2y1jHeDnAH7iVQ6t9YukdJxxfk3h5dpXVUQ97z/Ja0/8ATcuXPucXPO9ztXOdqSfNcn1qx1nU7p4rIrYPAAJwi6GDkIznUpGgLlT2lP8AjM6c60Nuwr6qif5wOa8jzNY2rrMTLxs3GrysSwXUWiWWN4P/AJk391eJLuP8WWVcXZ+ESTS0MuaOwcSa3x/X2tSIZOd5DFjxHJjuPBVi+LiB9L3axc365/VbAyrMPL6jVXkUnbbXD3bXfuudWxzdy22/SHxXP/UwkU9Yj/y4zv8Az4muU2em/Wz6t9Vyhh9Pz678lwLm1AOaSG6u2eoxm7a1ay5vqXULer9Zp6b0s102YNrhf1a5jXGqwNm/B6VVaP1nOfj/ANKs/mcTG/4RdIefBJSknENY6x5DWNBLnOMAAauc5xSXKfWnpPT876z9B+147bxkty6LWvkteK6Tk47bGtI3em9tiSnZ6d9Y+h9TyPs2BmMuvLS9rAHN3NH0n0+o1jbmt/4JaREaFeZiro2Z0mu49LxK32dCyupufW14Nd1JbTWMbda70atznexd39W8WrD+r/TsapuxrMaokeL3tbZa/X9+xznpKdFZ20f845/7qf8AflorP/8AWi/9BP8AvySn/9f05ZGbi5+F1B/Vem1/aW3ta3OwpDXP2fzeRjud7PXY32uY7+cWukkpyHdeybG+nh9KzH5J0DLmCqtp/wCFuc7bs/qKx0fp1uHVbblWC7OzH+rlWN0bujayqr/gqWexivyfFJJTmdU6PkZ2fiZuPmuwn4ld1Z2VssLxd6X/AHIbZWzb6P7iHi9DzKurUdSyeouzBj020tqfTVXHrGp29r8ZlX+g+jYtdJJTzeR9SsbJzaMnIv8Atm2z1cuzLYLr7Q3eK8Wt014uLifpffXXib1rdJ6U3pVBxKb7LcRkDFot2n0GAfzFdoa22yr9z1/UsZ++rySSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUmc1rmlrhua4EOB4IKdJJTiW/VhheTRkbK+zXt3EeW4ELmPrN9Ss5jvtuG4ZJdpZU0bXafnM3H3L0JIwRB1CNlsY+czY5CQlddCPm83xerpHVrbPSrw7i/iC0tA+Lne1ekfU76vO6LgvdeQ7LySHWkcAD6Fbf6q3hVUDIYAfgpJE2yczz+TPHgIEI7kR/SUDBBXMYeJ9aej3dQqwsLEzcfLzb8yu6zJdS6L3ep6TqvQs91f9ddOkg03nGYn1j6j1vpeb1LExsKjpj7rSacg3OebanYzawz0adv09+/cujSSSUpZXXem5uTZgZ/TjWc3pl5urqvJbXax9b8a+k2sa91L/AE7P0Vnp2e9aqSSnjH/V3ql2G7p+J0jF6WLMR/ThluzX5HpYtr/VyGMxvRZ61u7d6e6xn/GemuxqqZTUylk7K2tY2eYaNoUkklKWf/60X/oJ/wB+Wgs//wBaL/0E/wC/JKf/0PTpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJSpSlJJJTz/1o671Ppd+Bj9OqqutznPrDbQfpA1Nqa0iylrdzrfz1j5v1r+tuA7Zl42DS/nY6xu7/MGZvVj69svs6j0OvHf6V77ntqs/deXYwY/+y5Qd03Op6oOkdEYMd1bBbmdWyK/UsscdTtsta7d9P8xVZ8ZnOpSABiBw+MXd5YctDleXMsOGcpwyTySyie2PLOPFLJGX9z/JZJsML60fW/PJbh4uDe4CSxtjdwH9T7ZvVv8AaP8AjC/8q8X/ADh/72Kp0/Ev6pm53S+oOYOp9OIfjdToaK3gz7fU9MMa9uv0F0f1e6lfn4LhlANzMWx2PlAcepX+e3j6bTvRhEnfJPW+sf0d/wBFZzObHjsw5TlpCPDxDhyH05RxY8kZe7Hjxz/uQcf9o/4wv/KvF/zh/wC9iX7R/wAYX/lXi/5w/wDexdWkpPaP+cn9sf8AvWp/pCH/AIj5X/Ey/wDq55T9o/4wv/KvF/zh/wC9iX7R/wAYX/lXi/5w/wDexdWkl7R/zk/tj/3qv9IQ/wDEfK/4mX/1c8p+0f8AGF/5V4v+cP8A3sS/aP8AjC/8q8X/ADh/72Lq0kvaP+cn9sf+9V/pCH/iPlf8TL/6ueU/aP8AjC/8q8X/ADh/72JftH/GF/5V4v8AnD/3sXVpJe0f85P7Y/8Aeq/0hD/xHyv+Jl/9XPKftH/GF/5V4v8AnD/3sS/aP+ML/wAq8X/OH/vYurSS9o/5yf2x/wC9V/pCH/iPlf8AEy/+rnlP2j/jC/8AKvF/zh/72JftH/GF/wCVeL/nD/3sXVpJe0f85P7Y/wDeq/0hD/xHyv8AiZf/AFc8efrH9a8TqOBi9Uw8bHrzrm1AtlxILmMt27Mi3a5vq/nroP8A1ov/AEE/78sX63/8ufV3/wANH/z5ira/9aL/ANBP+/JsASckDOWhjUv0tuJk5nJjjDk+Yjy+IHJDIZ4qn7EuHJPFH08fH/44/wD/0fTkHLzMXCoORl2topboXvMCT+aP3nIyxcalnUuu5mVlD1K+mPbjYdTtWteWiy/J2/6V27YxJSRn1p6I54a+2ylrjDbbqrK6yT/wtjdi1gQQCDIOoI1BBTWsZdW6q5osreIcx4lpB7FpWR0NpwszP6M1xdj4hZbiTqWVXAu9CT+bVY32JKdhJYP1iz+p0dS6fiYL8lrMirIsubh102WE1GkV7vtv6NlX6V30EDpfUOsft/Gwsp+ace/HvsLc6nHrl9TqAz0H4Xu9vqv9RtiSnpUlxuZ9Yn/a7HUdUezGstLaZcKxM7fRY2zpVzt+72+n61tiNjfWPOs+qeZebHP6tRYcYOewtLXX3fZsCwzVjV27arar/ZSzekp6xJc99YMnqeFZh4eHnOx214WXfdkOZXa+w4raPT9U3tc33+o59uxVOhZ3WsjMH7R6uWVVswnml1FLPUfl1utdil4r3s942V7P0iSnrElxFf1k6ofrI7Ffk5DemG92PW4/ZZD2g7tzfS9Z1Ff09m71/S2K7hdY6hfg9Xtxuo/a6Meuh2J1DLqFDGmxrjkuGynGbbsbssq9uz1P8J6aSnqklwr+p/WMCrEp6hbZk1S4NNWP6rnBvswsqr7Q3fcyj1XZv/dr0n0foFtZP1jdi9Jw3485mbm0MtquyG+jQxtkBuV1Kyr9Fj1MdYxnoUb777P0VP8ApElPQJLAwM7P6VnDo/U7X9SDnM9PqFbNz2Ou3bKuo0Vbvs9VlrLfseS39B6X6G70/S9Sy3hZGRV17qPTrrDbWa6c3F3aljLd+PfQD/o2X4/qVf8AHJKdRJJJJSkkkklPJ/XFwb1v6uucYaMokk8AepirW+sXXqej4m4D1My72YtA1LnH84t/0bFjfXrGry+pdCxbZ9O+99b40O178Zjo/wA5Az/qx1V14dmYw641jRXTcMj7PaGCdrbRZ+ic7X6TVXMpCeXhHWOv+C7EMOGXL8ic0wIiOWXt+mHH+vn+nklDH/e9bt/VbpB6di2XZTxb1HNd62W+QSCdfT9v7m7/AD031ZeL7OqZtY/QZGY70XdnNY1tXqN/kvc1YuB9U+o+q51NA6LTcw1ZBFxyL3VuLXOrrc39DXv2fTXYYeJj4WNXiYzdlNLdrG+SfjB9OnCI/i1ubnAHIRk93JmMboR4ccIerh/VyyY/0YcHBP5Eyfa7wKb46juFzmY19GVbS179rXe33Hg+4d1K0Ho0lmdHzLbS/HtcX7RuY48xwWlaaSlIb8jHrdsstrY4ctc9oOvkSit5HxXH/V3oPROpu6xk9SwKMzI/a2az1bmB79rXhtbN7vdsY36DUlPWV30WktrtZY4CSGuDjH9kqa5LKwOi4XW8XH+rXTqB1zGJfa6oenRRVa30nv6m+n3P31/0XE/nfU/SrrTE6cJKUkkuY+s9GTf13pOGzOy8XF6jXlVZFONYKw401/aKy0lj9j7P0jLElPSMupsc5tdjHuZo8NcHEf1g0+1TXmGJ03o+PiUdQ6XZnYWSej5PUqbGX1/o207G/ZbNmMz7Qx73fSs/0a9A+r7bx0PAOTdZkX2UV223WmXl9jRa+SA32tc/bX/ISU4n1v8A+XPq7/4aP/nzFW1/60X/AKCf9+WL9b/+XPq7/wCGj/58xVtf+tF/6Cf9+UWP+cy+cf8AoN/m/wDcfI/3M3/uxkf/0vTli5Lrui9Tv6h6T7umZ212Uamlz6bmjZ65rb7n0Ws+ns+gtpIGOElOTZ9auhBk05P2qw/Qooa59rj+6Kw32/21PouJltOT1DPaK8zPe1zqQZ9Ktg2UUbv32t91i0msY1xc1jWuPLgAD94TpKef+svQsvquf0++inFvqxa722NyzYGg2+j6bq24/v3fo3oHRvq1m4HXqM9+PhY9DMe6p5wzbuLrHUur3tyd3s/RP+gunSSU8hnfVTq2bn0OyLwabsluXmHFe7GprdWIY6jHb6mTfnP9j/tbr62epXv9JXh9Xc/9gZ3R7L6rC8izDy2tc219rS3IZf1Le631Mj7VWz1bqnfpWf4Or6C6FJJTg9c6P1Dqz8DI9DHs9Oi2vNw77rK2E3ehbsF2NXZ61VduP+krf+jvrUW9I6nd1ejqWZ0/p/q1uZvtrycgkNr3tZYMb0K8a6+lltnoOt+h/pF0CSSnkT9VurOftLqxjuzrck/pnEhljr/0n2b0fS9XZcz/ALUKw/o/1iyOiZOBkmmuMCvCxseq1z2PsZ/OZdlllVPo+pDGMr/SLpkklPLZP1Xz6MqzqWK9uZaM5+dVhyaQTY11Wx+RZZZS30/U9R+3F3q5f0XOs6H0voc1+hWMdvUrpMhmP6dprxmR73ZN1Xpeo7+aqW6kkpoY+HfX13Pz3R6OVRjV1wfduqN5t3N/68xRwsLJHV+odRyg0esKsbEaDJFFIc/e7919+Rfa70/3GVrRSSUpJJJJSkkkklPK/W//AJc+rv8A4aP/AJ8xV1S5r63dN6vl5XS8rpdAyLMGx9pDnNaAQaX1bvUfVua70vzEL9o/4w//ACrxf85v/vYoBLgyZLjI2Y1wxMv0XVlgHMcpygjmwQljjljOOXLDFOPFmnKPpk9S4bmkDQngqNdgfpxYPpMPIP8A5Fcx+0f8Yf8A5V4v+c3/AN7FCzM+v1kb+k4jo4O4T9/2xO94fuT/AMSTD/o2f/ijlf8A2oxfxerfYysS8/Bo5J/daFjW9M6lfa+57WB1ji4jeNPBv9lqzWZX1+rMs6TiB3724E/ecxT/AGj/AIw//KvF/wA5v/vYl7w/cn/iSV/o2f8A4o5X/wBqMX8Xe6d0/wCyBz3uDrX6GOAB+aFcXK/tH/GH/wCVeL/nN/8AexL9o/4w/wDyrxf85v8A72Je8P3J/wCJJX+jZ/8Aijlf/ajF/F6saEFcj0zqGZ0K/qmJkdH6jlG/qOTlVXYlLbKnV3u9SrbY62v3bfpqf7R/xh/+VeL/AJzf/exL9o/4w/8Aysxf85v/AL2Je8P3J/4klf6Nn/4o5X/2oxfxY419+f8AWHp1mB0jO6Xj1X5GV1KzJqbTXa6yl1DHP9O2z17vUNa6xcr+0f8AGH/5WYv+c3/3sS/aP+MP/wAq8X/Ob/72Je8P3J/4klf6Nn/4o5X/ANqMX8Xqli/WLHyxldK6ti478s9Lvssux6o9V1V1NmLY6hryxtj697X+lu96z/2j/jD/APKvF/zm/wDvYl+0f8Yf/lXi/wCc3/3sS94fuT/xJK/0bP8A8Ucr/wC1GL+Ljt6c4YB6f0zp/VX5Lum3dIodl0Mppay9/rPyci4u9npfyf8AMXfY1IoxqaAZFNba58drQz+C5n9o/wCMP/ysxf8AOb/72JftH/GH/wCVeL/nN/8AexL3h+5P/Ekr/Rs//FHK/wDtRi/ir63/APLn1d/8NH/z5ira/wDWi/8AQT/vy5q/D+uHVOq9MyOo4FVNWDe2wuqez6JfU61zg7Itc7a2n8xdL/60X/oJ/wB+TYS1yT4ZUTGhw+r5eH5WXmcIMOT5cZsJnCGUTkMsPZhxZZ5Y8WX5Y+l//9P05JJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpZ/wD60X/oJ/35aCz/AP1ov/QT/vySn//U9OSJABcSABqSdAAksO2gdc6rkY+SSemdNLa3Y4JAuvcPUcb9v06aWn+bSU6lXUenX2+jTl0228bGWNLvulWFQyOg9FyKfQswqWsH0TWwMc3+VXZXtexyD0S7Jrsy+lZdhvtwHN9K930rKLBuodZ/wjP5t6SnVSWD9ZOv5HScrBxqXY9Qy23PdblC1zR6Xp/o2MxQX7n+r+cgdF+s+TndZr6dbZiZDLaLbi/FbexzDUamjf8Aa2ta5tnrfmJKelSXO5XXeqszLasYU2UtcfTe2iyyWfveozKYx/8AmJ6PrRZZ9V8jrDmVuy6HWUihkwbRacPFbYwufZV61vp72uekp6FJUL87Nw/Qpfg5HULTWPWvxRU2sPHts9uRfS5m53vb/I/PWb9XvrJ1HqWDjW5HS8nde97X5FYqFLQ22yoPLTkG79Gxn6X9Gkp6FJcf1z665uH1C3Ew6McNxjk12OvuDXOfTjty2PFW39GzdZ/6Ef8ABrZ+rfXX9ZxrHW1MquxzW2w1WC1jjZVXkbmPaG7f5z31f4NJTrpJcrlMX61dUvwczMubhYNVFxFV2TaSz05hlLm0/pbMm1jfWp9P+e3/AEElPVpLG6N18ZfRL+rZ5pqbjG43CkuJZXVJm+mz9NRe9jfU+zWfpEmfWGtvUMyvK/RYdLcH0Xljg4OzTYz9Z/0bPUbUz/gklOyksXrPXj07IyGCylzMbEdfdSPdkseXCvGuZRuYzIxrXO9N/vq2P/wvvQ+n9b6u/quLgdVwTg/acYlhOxwfk1APzNj67rHVY1bHN9DfX+m/60kp3klx/UPrtl4XULRfVTh4W2MVmRvdfY5p/S2vrwW5Lsbf7Ps2NkNq9Sv9N6v+Cr0rvrFlU/VXI61ZTQ3Mx6y92My4XMYdwawXW0/yD6lja0lO8kuFv+vmfS7LYMnpT/sdIvDh9oiwkWH0a/5f6L/wRdNZ1PJrzOkl7WjE6ox1bh+dXkGv7XR7/wA6uyuu+nZ+/wCmkp1EkjwkkpUpJc8rCyM3qNGRZSb3H03QDA1HLeySndSVDpnUH5QdVdHqsEhw03Djj95X0lKTwfBIakLj+ldJf127quXm9S6hW+rqWVjV14+VZTW2qlwrpYymv2N2tSU9gQRyEy5TIw6vq/1LAfi9Q6jnZd7nMb0m292Schjhs3n13ivEqxHfrD8t3/Frqzz4pKUkkue+sOb1yrq/TundOyqcWnqVeQDbZQbrK7KGetvr/TVNd6jHe1rm+z0/8Ikp6GCOUl55hu6rhVM6jh/WKzLc/p9/UGU5VFtld1NQbufc23Ld9nv9RzNnortuiX5mT0fCys5zHZWRSy601tLGA2D1QxrC6z+ba7Z9L3pKbqz/AP1o/wD0E/78tBZ//rRf+gn/AH5JT//V9OWGMivo3WskZZ9PC6q9ttGS76Dbw0V2Y9zv8Hv276luKNtVV1bqrmNtreIcx4DmkebXJKRZGdhYtByMjIrqpaJLy4RHl+8qHQ23ZN+Z1m2s0tzixuLW8Q/0Khtrssb+a65zt6LT9Xeg0Wi6rApbY3Vp2zB/ktdua1aPKSnnfrLh9Rv6t0y7Cqy7G1U5LbX4VldLml5x/TbZblfotj9n0PpoHS8HqrPrJiZGVTntorxshhszbqb2hz3Y+1tf2T+ae/Y7+c+mupSSU+f5/wBWupZWZj0jBrwq8nNbktrrpZknHZXvNjsnP2041ePY/wBO39mfrPq/zXrrUq6H1Fn1b6jhOxGVdRFjMhl1ZrNeS+lzMqn7OyllLsen9D6FeNdV+g/0l388usSSU879ZKb+ou6O9uDk5eK+yy3JxK3Gh4DqXGn7Q/1cdtXpW/mPu/nFT6Z0k4f1g6bZhdGyelYwGQMlz7hbUQWfomOZVkZLK/0vu97K11ySSnh7fqtn9U6rm2Omql1uS77VkYtbd7rq24fo0V+s7Itprobupy7fSZ6n+lWn9VOn9S6fX1BllJpyHNqNdFlbKqDYyr0K3VZeJZe26u1tVf2h3osuq/0K6VJJTXwMm7Kwqsi7Hfh3vafUxrYLmPBLHN3M9tle4fo7G/zlS4un6u53Tn9Ud9jcLbLajgu6XWWltjaPbay3Nve2vF9R/pWekz1PW/4P9Gu8SSU8z0zo93Uej/Y88ZePdZbj2dTfmNrc7I9IMfbjV21O/orrK/T3u/wf6NSxMN3W8nr1mZh34eH1KmjFrGS0MsJqbe226usOftax11bqbF0iSSnl+v8ATeom3Ge7HPVsZmA/CzQPbbc6x+PsFLans9C266lttuS9/oYlPqWKv0rpXU+nddxm5VGTn2imoDPtvstx6t1bm9Xex1tntvuvZS2pjqfez+2uwSSU+fv6R1PHzskYODfRU7qb3WHHqfWx+Ft+h+hy8Vl9O938yyln/Gq7T0fLd9Ucvp9eE6jK6jmuq0q9NzKTkD08q/c61/pY+K3dX6luR+YuzSSU8Z1vpHVabesWsyepZbcvEqx6PRZS82WOGU307Q2hmyirez1LP0Pp+t/OLYuxMq3K6FhOqIqwB9ryrR9Br6qTiUY7bPzrH25D3/8AFUrbSSUs4EtO3nskx4e3c3jv5H90p0N9LXO3tLq3nlzTE/1klMyWtaXOMNGpPgufyKc3IyLL/s9gFjpaC3Xbw1boobuDnudYRqNx0H9ke1ESU53ScG3H3XXDa942tZ3A5JctFJJJS45C4vof1m6D0W3rGF1XMZh5P7VzLRVaHB2yx4fVZo13ssZ7mLs08/6wkp4vD6x0TI+tmEfq/mfbbeo23v6s7WxwpZS441XqWs3Y2JTkbPTqrd/OLs08pklKXP8A1nczD6h0TrF4IwsDIuGXaAXCtl9FmO220M3ObV6pZvs/MXQJAkcJKfMWu6bj9L+y43VMfqOYOjZHSMfFxQ99tl+RZvrdUwN/m/T2scvSMKg4+Hj47tDTVXWR5ta1n8EaY4gfAQkkpSz/AP1ov/QT/vy0Fm7nf85duw7fsc75ETu+jt+kkp//1vTkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSkkoCUBJSln/8ArRf+gn/floQFn/8ArRf+gn/fklP/1/TkkljZdmZ1TqVvTMW52Lh4gb9uyK9LHveNzcWh/wDg/Z7rbElO1tPgmWOfqtgMbuxLsnEyB9HIbc9zgfF7LXOZaj9GzsrIGRiZwaM/BeK73MENsa4bqcmtv5vqs/6aSnRSWN1v60YPRcmrHyWuc64sjaf3y5u1rRuc63azfXX/AIVNg/Wrp+X1D9nuDqbnubXj6PeLLPSblZNQtqrdjtdh7/Tu/TJKdpJYTvrZXYyu3p/Ts3Opfb6b7a6HhoYC6u3IqdH6b0ns/m/8Ijn6y4AwM/M2XVnpg/T491bqrNzmiyitrH/9yNzGVpKdZJZuZ1puE7Dpyaw3IyW+pkMDxtoY1o9W11kfpP1h9OHR/wByb7lWwfrTTmdTt6cMHMqdUamix9DwJuDn/pwW/q7WbfzvppKdtJYB+uXTR1R3TXNIdXu32bhta1rzW+5x+h6Hps9Tfv8Ap/oNinh/XDpWR0y7Pt9Sl2LXXbl4/p2F9Yu/ozPfVV6r7vzPTSU7iSxf+ctn2o1npPUfs/p7hf8AZ3z6k7XUejG76H6T1Urvrb0it3SoslnWHRQ5wc0taWuc17mbHfStayj0/wDhElO0kqFHUeoWZDKrOk5NDHO2uve+gsaP33Cu99m3+oxZtn1wqbm34gxjFL8isW2WtrYXYobZc619jfToq2v9tnqJKehSWJ0n6x2dXwcnKxMP9JQzdXjuuYbHP9+ym6uvdZiut2fovVb72P3rT6fm0dQwcfOxzNOTW21k8gOE7Xfy2fQekpsJJJJKUkkkkpSSSUJKUklHy81j29YzKbX1Prr3VktPP96SnYSVXAz25jXe3Zaz6TeRB/OarSSlJJASQFy2E/60dav6jfjdYr6dj4udfh1Y4xGXe2h3piw3WWMfus+k5JT1KS5u23rnQsjHy+sdapzOm2PNN1RxRTaXvEYwwm4xvtyb3XfTq/0PqWLpCIMJKUkksTrnXepdP6jidNwcCvKs6hXa7Hvtv9JjX0jfa21npWO2MY5j/p/pElO2kuIxOt/XPDH2zMswep4v2azKdQy+utzq6xvfk4D6KnOfRX9H9Nv/ADF1nSM23qHS8XPuo+yvyq23CgP9Ta1431/pNte5zq9v5iSm2s//ANaL/wBBP+/LQWf/AOtF/wCgn/fklP8A/9D05Y3T7GYfXuoYN52vznty8Rx0Fg2tquraf9JU5n0Fsqtn9Owuo0inMr9RrTuY4Etex379VjffW9JTZOgJdoBqSdAB5rH6LY3N6j1LqtX9FuNePjv7WCgEWXN/keo7YxOfqziWAMysrMyqB/2nuuJrI/dft2usb/WWrXXXWxtdbQytgDWMaIAA4a1oSU8b9drLG9VxvTY3NfXUba8NlduRc21m70LPQx76XYeK9z/Uv6hX+m/Q+j+kS+r78Svr9Tmbv2ZZ6ren5AbY6qzqFra/2o1uTc59z2/oHvouyP5+77Zsus9JdoNONJ5KUlJTwX1kws12Xj4eQOk/tDqVtVLRTVaMj0XOLbLa3Osd6bK62u9S+v8Amv5D1qZnSuoYX1TysN1WL6eEKbcajDbYJrxrGZVtdrsqy2y57mVO2e5dSkkp5f6wNw8zrHSsxjWZDWs9assxLsix7bDtpsZkY7PSrqqba+6uvIs2et+sf4NZWPi2dK+sNeBmZguOPZ0/7HSzHLbMgMquwmPa91z2Nrxm2Psy7P8Ag/8ABLvRoIGg8BoE8mInRJT5zk2Yh61m/tHZkYLrH0ZefW3IdW3Gh9j6b+pY979+bbe5mM3pj6X0VV1+lX/o1t/Vk9Qdg5+O9jKuul1T3VZtTgz7OGso6fY9lb/0m/Ho/S+nZ+hzfVru9NdUNBA0Hh2SkpKfPG9Gs6j184FFfSX/ALPZ9pvFFdzaxkC3ZXXmOrt9V9jNr7GYzrPT/PsqWx1/D6jZl9EvzLofS64eh09u3dd6ORdZ6Tcj1dzb6avsnpWf6e9dWlp93CSng+jdPx3dWN2Pg4978N+CzNqo3FlFrxf9p+y/pHNZbg2/ZXZf0/UqrVTJysZvVc67IFlePYLzW8srDr3et6W7Df6DGX+vXUxmR+sY/o7PVs9Rejp9zvFJTyv1Y6nj1/tLLzMmuy2ipluTbTZ6tXpMdk37m2O22epX6r6X1vZ/g6/R/nPZp/VTFuxfq7gU3tLLTWbHMPLfVc/IFZ/4ttuxazvcIdqPA6hJJSkkkklKSSSSUs+dpI1I1hOCHAOGoOoKSGantJNL9gOpY4S2fL91JSRc1mXsvy7bmGWOd7T4ge3d/aXQela/S54LO7GCAf6zvpIsDwH3BJTldExrGufkPBaxzdrJ0nWS7+qtVJJJS7fpD4rnPqhdSyvrAfY1p/bGdo5wB/nB+8uiWXl/Vb6t5uQ/Ky+mY12RaZstfWC5x/ecf3klOXfWzG+t3Tcm+5nUbuo25FOMXRGHSyl2Rsw62Ocz7Rc9n61mP/S2Vfo/0a6hZ2B9XOgdOyPtOB0/HxrwC0W11gOAP0od/KWikpSwPrCa6uv/AFbybnBlIycihz3GGzfjWsqZuP51ljPYt9CysTFzcd+NmUsycez6dVrQ9hjUSx37qSngLeldU6T9Xzf1KttDMP6vZWA5xsYYybrG+hSNrjudZU1m3/MXedOpNHTsShw2mqiphB5BaxrYVLH+qn1Zxb2ZFHS8Zl1ZDq3+mCWuH0Xt3bve395aqSlLOkf849s+77HMd43crRWb6bP+c3qbff8AY9u7y3TCSn//0fTkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSkkoShJSln/APrRf+gn/floQs3eP+cvp+6fsczGn0v3klP/0vTkkllZ+fnW537K6VsbkMaLMvKtG5lDHfzbW1/4XIt/NYkp1UlkO6X12oGzG6w+64a+nk1sNLv5J9INsr/sq10nqX7QoebKzj5eO805WOTOywfuu/Orsb763JKbqSpZ/WOn9PsZVlWFjrNu32mIcSzfv+j7HD9J+emxut9NysqzEquAvrFZNb4Y4+swZFQZW8tt3ek5u9uxJTeSWRlfWz6uYrq22dQocbLhjkVva7Y525u66Hfo6mOZsss/wav4fUMDPY5+Dk1ZTGHa91Lw8NdG7a7Z9F21JTYSVe/OxqMrGw7HH7RmF4orAJJFbfUtsdH0Kq/9I7/CWV1/nodHV8C/pZ6s2wjDYx77HOaQ5gqLm3ssq+m22p7HsfWkpuJLJ/50dGFYsL7mtLnM91FrSHMO2ytwexvvYiZf1h6Vh4NOfk2Oqx8iwVVl7HNcSZ9/pOHqekxrfUfZ/ov0iSnSSWP/AM7vq99qbi/av0j2Me32Pg7yWMZ9Df6nt3ubs/m/0i0Oo5+N03DtzcsltNAl5Gp1O32j5pKbCSzcr6xdHxL3499zxZXG4NoueNRuG2yql9b/AOy5PnfWDpeBktxsqxzbHNY/RjnANtf6FLnuA9u+32JKdFJUMTreDl5b8Klt/r1HbcH0Wsaw7fUa222xja2epX76/wB9DzvrL0Xp+e3p+XktryCz1HCCQwH+bbc5v83Zd/ga/pvSU6aSz7Ov9Gr6ceqHKa/BDix19bX2AOB2uDm0se9u38/2of8Azm6G280X5bMV4pryCMk+gQy0vFYczI9Oxlv6Pe6tzPYxJTqJJmPY9jXscHscA5rmmQQdWua4fmuTpKUkkkSAJJgDUk8QkpSSyLfrLiMeW1VPuaPzwQ0H+ruWF9YPr9ZjN+y9Op2ZTgC+22HhjTxtY36Vjv5aNFnx8rmnIRjHfv8Ate0SXk1P1z+s9Vwt+3Ot1k12Na5h8tga3/or0P6tfWCnr2Ab2t9LIqOzJpmQ10S1zD/o7PzEiKX8xyOXBHilUo94/o+brJJASYXOU9b+svUL809KwcN2Lh5VuGHZORYyxzqDsss2V0WM2Pd9D3oNV6NJYdPVPrFjZVI61hYmPgW7hbl0ZDnCkhu6t2R9oqoZ6dz/ANCz3/zi3ElKSSWR1j6yY/SsurCdiZeVlZNbrMavGq3izZ/OVtsn6df+E/0e9JTrpLkcX65dcre6zq/QMnHw2sc+22mux5pLfdFotbW26vbu3XUrpem59PUsCjPoZYynJbvrba3Y/afoPLNfbY331/yElNlZvqs/5zelPv8Ase7b5boWks//ANaL/wBBP+/JKf/T9OWP0givrPWcazS99zMho7upcxrGOb/JY9uxbCo9S6TTnuqvbY/FzcefQy6o3tB+lW4H220u/wBG9JTeWR0pzbuu9XyaTNANNBcOHW1tPqx/U3bEndM6/eDTk9WDaDo449ArtcPD1XOf6f8AYatHCwsbBxmYuKwV01iGt5Mn6TnO/Oe785ySnj/r4zFb1DFvzqR9nqZ61VxsrpDradxGKx9lN32nKt3/AKHHv/V/S9ZLoOFhVfWwYljmWX4QuzGW2embXX5LKW3Yf6Fvpb+nN3/o6P5mi/GXXP6fgPyjmWY9b8ks9L1ntDnbNf0Y3Ttb7lGnpXTKK6aqMSmuvGebcdrWACux27fbX+5Y/wBR+5JTyHVR1jBqrbh9Py+nNvuZi49dWdV6LH3PP6RtDN26x73us/SP2ep/Oro/q9j5FFd32rDtx73Fgsyci6u+3I2t2Ntudi+xr62fo/oq7d0zp2Rm059+NXbl4w20XvEuYP8Ag5+j9JWUlPKZ2Jm0/WxjendRjM6jW+zLddUy92Ni1D9BXTLq/s+JbkuZWyrb+nu9a/1LPTVfFx7R0r6z5lmQbbGuyca1tbW10XPqZWftrsdu9teZ7vs99lVn6b0/0tfqrqXdK6a9uUx+LU5ueZzAWg+qQNrfW/f2t+ipM6fgV4R6fVj114RaWHHY0Nr2u+m3YyPp/nJKeCvutqtFrabS3H3UY9r6rXX3MybrcjGc/GdWdn2nKr9Kux9db/8AC/za0LK7T0To2JXj111/andMyMoEl1VJv+zW0UNu/Tb8/wBJrcj9yj1a1178LEsc976WOdaGNsJGpFZc6j/tlz3emoVdN6fTi0YlWOxmNiua+ioD2sew+oyxv8vf79ySnlms63+1ukn1asG3IzMoXVOwywl9VD63W7vtVnr120Us9C2p/wDN+l/ovSV//GDjWZX1Yyaa2Mc0uY6yx4D/AE2tcHb6q3/Tuf8AzLf+MW0OmdPHUD1P7PX9vLPT+0kS/Zxta4/R/souTjUZVD8fJrFtNgh9btQRM6pKeHyr+oV2s9DJy66Q7Mr+z4tgqqt+xVMdZ+zq302uxKK7xfTRVvv9T0v5zYp9avxMn6w9OppcMp19WIWj3m6ykG3MruewPq9VzLKPVu2eh+jt/SLsf2fg/bz1L0GHOLPS+0ke/Zz6bXfmtTZPTOm5YeMrEpvFrmvs9RjXS5o9Ot/uH02M9jUlPJ/VvHDOsY17KgwO9c15YYWsyvZ+surt2+pZ+s/pWfbG1epV+kxfUqVOjH6qeoZNWI7G6Jj473UZ2KzOeMjJfYK8r1r8y6m3a/8AS/02mv7b/gPX9L012mP0To2LeMnGwqab2/RtYwBwkbfpJWdF6NbdZkXYOPbde7dbbZUx7nEAMBc6xrvzGpKeW6tecv6h5eLg4oxBjW2YYGJc401spcfXyjewUPvpfXv/AEdjP099n6RCymZdb/s7cYepkHNrspLrn/an1YjG3OffkP8AtVtb7A+nCf8A4JdjX0vp1WJZg1Y1deJcXGzHa0Bji/Wz2N/fUv2fg/bv2h6DPtor9EZBHvFfPptd+a1JTPEdS/EofQw10uqYaq3DaWsLRsY5h+hsb7dqKkkkpSr9Qqsuwciqr+cfWQ0Duf3f7SsJJJBog9tXhR/qPBcl1hr29TyN35zg5vwI0Xr93T8C95stx63vPLiNT8YWP136ndM6nUDSwY17Po2V8/1XNd7XtThJ0eX5/HCdyiQCKPXhfLF23+LGu31+oXa+jtrZPYvBc/8A6hBq/wAW+abQLsoCqdSxnuj+07au36T0rF6ThsxMVu1jdSeSSfpOc785yRIpl57nsU8Rx4zxmdWaIEQPV+k3W/SHxXP/AFNBNPWI/wDLjO/8+Bb6wrvqdgPyb8ijN6hhfarHX204mU+qo2P1ttFTPz7Xe56a5DW6lRbf9ZMCnrgFuFkX2M6Xg1mag6mp2T9v6lvj7RkP2enj4+30Mb+XYumWLg/VXCw8+nPfl52bfjbvs4zMl97GOe30n2Vsf/hPTdsW0kpSwOusn6y/Vtx0Drcykn/jMV7v+qqW+qnU+lYfVMdtGUHj03i2m2p5rtqsbo26i6v312e5JTwOOM2vodb8iq2oYv1XzWONjXNAtNjamMdvH85sq3bf3F33Sa/R6Tg1f6PGpZ91bAs131Rw7YZmZ/Uc7HkF+LkZLnUvjUNurY2v1Gbv8H9BbqSlLP8A/Wi/9BP+/LQWbP8A2TRt/wC0f05E/S+jt+kkp//U9OSS1S1SUpJLVLVJSkktUtUlKSS1S1SUpJLVLVJSkktUtUlKSS1S1SUpJLVLVJSkktUtUlKSS1S1SUpJLVLVJSkktUtUlKSS1S1SUpJLVLVJSkktUtUlKSS1S1SUpJLVLVJSkktUtUlKWdtb/wA5N0Dd9kjdGsbvFaOqz/8A1ov/AEE/78kp/9X05JJZ3Ueqvx768HCo+2dRubvbTO1jGcevk2/4Ov8Ad/fSU6KSyH2fWuhvrOqw8to1dj0l9b48KrbPY9/9ZXundQx+o4rcrHkNJLXseIex7dH1Wt/NexJTZSSQ8e+jJpryMd7bqbQHV2MMtc08OaUlJElTd1no7HFr8/Fa5pILTdWCCNHA+9FpzsHIZ6lGTVdWHBhfXY1zd7tG17mu273bvoJKTpKuzqGDYKzXkVvFzg2ra4HcXB72NaP5TKrHf9bVmDBMccpKWSQ8e+jKx68rGsbdj2tDq7WGWuafzmuU3Oaxpe8hrGguc4mAANXOcUlLpIVOXi5BLaLmWkMZaQxwd+jsk026f4O3a703odnUum1WPqty6K7Ko9RjrWNc2fo+o1ztzN38pJTZSQMfOwcp5rxcmm94G4sqsa8gcbi1jne1Qb1Xpj6G5Lcul1D3NY2wPbtLnO9FjOfz7v0aSm0kma9j27mOD28S0gjTzCAeo9Pa1znZNTGtsdS4ue1oFjP5yr3lvvYkpsJIH2/A9A5P2mn7O07XXeo3YHfuGzds3aoT+s9HYAX5+K0OG5pddWAWzt3CX/R3NSU3EkK/LxcfGdl33MqxmN3uvc4BgaeHb/o+5FBBEgg/ApKUkkkkpSSpXda6ZTYa33S5ujtjS4A+G5qyOufXjpvTag3Ga7Ky36sqILGgf6S15/N/qo0WWGDLMgRgSTto9IkvOaf8ZXWG3brsbHsqnWtu5jo/k2bn/wDSau46P1jD6zgtzcQnaTtsrd9Jjx9KuxIghfn5TNhAlOPpP6QPEG8kksF31ua7IyacLpPUM9mJc/GsyMdlZrNtelzGerfW/wDRu9v0EGu7ySxcP6zjIz8fAyel53T7MveKLMljAxzq2+s+vdTbdsd6bXfTW0kpSSSzup/WHofSX+n1LNqxrdnqip7oe5mvurr+k/6P5qSnRSXLYP8AjJ+rWVe2q578FtjS6u7J9MMMfmWOqst9Cz+RcujxMzFzsZmVh2syMeyfTtrMtdB2u2u/rBJSZZu8f85dms/Y5mDH0v3lpLM3n/nT6cHb9h3T2nfH/UpKf//W9OWR0eD1jrbrP6QL6268ikVt9GP5H01rrN6h0vIfls6l021uPnsb6bxYJqurBkVZDW+72/4O1qSnSWR0wNH1g6y2qPSPoOsjj1iw+p/a2bNyY3fWu4ek3GxMNx0OSbTaG/yq6NrNzv66u9M6bT03G9CtzrXvcbL736vssd9O2xJTS+sRuxsW7qP7Uvwaaa9voUspeLLD7ams9em6x19z3MqZWxZ/1LxM9nT8ai7qV4v6X+rZvTCyjax7R7WOeyn1/ScxzLqbfW/S/wCkW5f0nCyOo09RyGutuxmxjse4mqt2v6xXj/zf2n3bfX+mlb0nBs6lV1TY5mbS0s9Wtzmb6z/gMprDsyamu99bLv5t/wDNpKeJss6Xi5+Z9jyMZuC57fsza78EhrWt/TusHUqr8ht1mU657/crr34NX1Z6nkOqtx3tymV51zdjnE1ip1V7K+mtrxrGsqspbVsZT6j/AOk2Lr8zFGVjvoFlmMXx+mxyK7Gwd3ss2u+kqVf1fw6umv6dVbkMrusNuRcLP01rnmbvXvcHbvW+hZs2fo/oJKeFPT7Mbp1TbLb7RVZZiNY71ab29TyamtwbXvD9v6Ftn2f9Ba+j9LvXRde6X00ZONVYMizJox68dj34mRnVbGlzt/6At/W7H/ztj7n2en+YtBv1M+rjG+kMX9WFbq2Yhe91LDZpbkVVOcfSynt9v2hn6RaN2D6nThgDJyKg1rWDJZZ+seyPc7IeH77Hx+ke76aSnjfqmzp2RmYucMZ2OPVcen/ZsK6gFsWUvdnXNN2D6Fvueymt/wCi/wAJb6v6NdB9cKcy3pNj67Kx0/Ha+/qWO9zq3ZFVY9T7IMpjbfs9Nm39P+i9S/8AmPUqr9RauBhY/TsKnBxQW4+O0MYCS4x+89zvpPc73OQuo9KxOpeg3M32U0PFv2fcRVY4Q6v7VUP59lT2+pXU/wDR+okp551nWbur9Gudj43TcvJof6LqnvtaaK215FvT87HdTj+z9J+gspt/Vb/+DsesvqltLepdTqBBycm+2moV7BYw78Ox1tzrSzbRdTX6LLN/5llda7Kjo2LV1J/U3WX35Lt4r9e11jKW2FptZiUu9lDbNjEx6F08vfZtdvtym5r3SJNjNvpsJj+Ybt/mklPMdCysO09TrLbW034kt+wubY4Bh9O6vGdS++9uVb9pqr/sfyFmtx8W3phsb0rG9S7Ev6gzHFnosY1rX4oqbR9nf9od01tdbv6R/TL/ALX+h9Vdz07oeD03J+0Y28FtRorrc4FjGOsdk2emxrW+625+97n70O36vYdnR6+jstvoxa9zZqeG2OY/d6tNlu0/orPU9+1JSvq8SzoGK+zGZiTSLHVUHcCC31DaPTrq/TXfzn0P5xcXg2ZOPgZ/rU1+qcrOyqas9js7d6DHX2Nf6ttX2B9LPToyL/032i7IrXo1VVdNTKamhldTQxjRwGtG1jf81ZeT9Wem5FGRQXW1fa7LH321PDbC253q5OL6u3c3EvcP0lSSnDyAbfq9ZV+h9SrOpmnGpbhhlzfTyGt2Pue2/wBf9F6VjbKfVrsrWPNX2Dp9wvdUHtutwHiysbbrftVt11uz1Ws2vuw8P9bf6FXr+n6nqrus3oHR86o05OMx9TnMdawaCw1sNFPrR7rPRrd+j/63+4qY+qHT2tc2vKzWNfWKSBkE/omgtZj7rGve6ljXfzb0lOR9bX32X42GMTKzsw1Ndg4fp1fYDexptufki1zPtbvTbs9P3/Z2f0b08j9Ii/VfFxcXrDn5eFZidWysdwr20Nx8VlNZrN9GIxlttllnq2VvuyMn9Pd/wVf6Jb2Z0PBzRhi91w/Z8+ia7XVuO5n2d3qW07LXfo/3XqOL9X+n4mczPpdkOurrfS0W32XN22Fjn+3IdZtd+ib9BJTpKv1E2twMg0z6grdtjnzj+yrCSSQaIPYvCiIEcdlyXWC49UyN3ZwDf6oA2r1a3oHTbbC/a+vdqWsdDZ8m67VgfWL6iVZTftHTnuZkNEOFh3NcPA7Rub/WTgQ6nLc7hjP1WOIVZHyvni7X/Fi+37R1Fgn0dlbj4b5cP+oWPV9SfrBZaK3V11idXl8gf2W+5eg/VzoNPQ8D7Ow77bDvusPLnf8AkW/mNRJFMnP83hOE44SE5Tr5fVw0eK3Wb9IfFc99Tv5rrH/p4zv/AD4F0A0MrnGfVrrmJkZb+k9bbiY2Zk2ZZosw2Xltlx33fpnXV7mb/oexMcZbqV2R1LrNHSsx1nTumWXOrprbLbs6ylv2qz9NV/ROn1tZ+/62UukJkysDG+r3V3dVwuo9W6u3PHTzY/HprxW4/vtYcdzrLG227mtre72LfSUpYHXGn/nR9W3jQudnU7vDfjGwf9Klb6z+sdJPUmY76ch2Hm4Vvr4mU1ofseWuqe2yl/ttqtqsex7PYkp4ynrufl9FZ62Q6zf9Ws3KyAY99zXNxmWv/l/zjV2/RavR6L0+mI9PFoZHwrYFkXfVfqmVQ7Ey+qUDDtYab2YuEyix1Ljutxq7zdd6Ndv5/wCjXRNa1jWsYNrGgNa0dgBDQkpdZ8n/AJxR2+yfjuWgs/8A9aL/ANBP+/JKf//X9OSS+SXySUpJL5JfJJSkkvkl8klKSS+SXySUpJL5JfJJSkkvkl8klKSS+SXySUpJL5JfJJSkkvkl8klKSS+SXySUpJL5JfJJSkkvkl8klKSS+SXySUpJL5JfJJSkkvkl8klKSS+SXySUpJL5JfJJSkkvkl8klKWf/wCtF/6Cf9+Wh8ln/wDrRf8AoJ/35JT/AP/Q9OSSVPqPVcXpwrFofbfedtGNUN9thH7jP3W/nPckpuJLId1zPob62X0fJqxxq+xjmWuaP3n01nf/AJi08bJoyqGZONYLaLRuZY3ghJSRJIAngJ4PgkpZJJJJSkkoTwR2SUskn2nwKaDMd0lKSSSSUpJPtd4FMkpSSSSSlJJJJKUkkkkpSSSSSlJIdmRj1O222sY791zgD9yz+rfWXpHSccXZF4sc7Sumoh73Efutn2/13pLo45yIEYmRO1B1ElxlP+M3BdaG3YN1dRP8417XkDx9P2/9Uutw83FzsavLxLBdRaJY9v5P5Lm/nNRor8vL5cVHJAxvr0/5qZJJYmZ9dPqtg5VuHldQazIodstYGWP2uHLC+qt7NzfzvcgxO2ksjpv1t+rnVMtuFgZzbsl4LmVFljC4NG5+z1q62v2t/NWukpSSSZzmsY6x7gxjAXPc4gAAauc4n81qSl0lmdO+svQuqZAxcHMbde5pexm17N7R9J9LrmVtua3/AIJafCSlLP8A/Wi/9BP+/LQWf/60X/oJ/wB+SU//0fTlj9Ka2/rfVsy3W6ixmJTP5lTWNthn7vqvfucthZObiZ+J1B3VemMGR6zWszcInabNn83fQ8+312N9vv8A5xJTrAxqFj9IY3F6z1bBpG3GBqyWMH0WPuB9ZrR+bv2+ond1zNsbsxOkZbsk6AXhtVbT42Xbnez+orHSOnW4VVtmTYLs7Lf62Xa3RpdG1tdQ/wBFSz2MSU1es14l3V+l4t7bic03VB9WTdQGCqt2VJqx31tudZt9P3rK+pprtNVltXUrchlmU37Zdba/FcK7bqWN/SXuY/8ARNbWz9B9Ni2OqdEys/qGNn09Rsw3YQccetlVT2h72upuscbmlz/Uqdt2IfSeg5/SxVTX1a23Dqe97sZ9NI3Gxz7rAbmM9Vv6a1z/AGJKcfq7MrH6g+rrfW8mvFxmt6j0y5lWO1zn07mZGM0/Z/02TX6lfpY//aijI/wq6D6v09ZZ06qzrOU/Jzb2NssrcytgpJEmhnoV17ts/pN+/wDSKrZ9Vq857reuZl3UrGknGa39Xqx9S6u3EpxzublV/wDcu2227/R+mr/TMLNwq7KsnPs6gzcPs77mMbaxgG307baQxuS7d/hfSY9JTylmbkWfWfrtRe7Jwy3GoDXOOJUHNc4en+06Gvuqsott9Gr/ALm2erV/gla6Vf8AaOl9TfRivw3PxLGknNuy7WOm7Hq3Yzg51O59d1jbanf4NbGV0Bt+dfmttDbH/Z7MdhaSxl2N6/pW3sY+v7Qz1Mr1fS3V/pK0Cj6qUU9MOJ9oecmzFsw7ssCA9l1jsm79XDtrffZc2j3/AKD1UlPI14xswLGW2PopNzd1oZY01HHrqoyG0us+xUstycr2Xfzn6L/hV0GVZkf82MHpdI+y5fVcsYX6DezYwXWPzb6hZZbdW37HjXP/AJ32eoiN+pTqyWVZzX0eq670snHbcXvdo12Y/wBWn7a6j/tP67P0a0sHoFeO7p9uRe7Iu6Wy5mMQNlYF+1v8251z91FLfs9H6b+aSU879Z8twz+qVW5b201jHqrwjdZVW+qyqx+UytmP/OXu/wCE/nP5tF+p/VK7H5F1WTZmVUUTh4bLrrLrK2EMfb9hzTtp/wAHXj/p/U/0i6BvS8ug9QuxMtteb1G4W+vZVvbWxjGUVUei2yr1PTrr+nv+m9E6X0fE6bRjMrHqX4uMzEGS76bq2HfH7rN1nv8Aakp8/wAamqzEc1rW5Li61hyrm2ttLw97Hmxn7Ur/AElT/Z9D/B+xegdDc89Ixa7G3NfRU2lzshobZYa2iv7RtbZd7L49Rn6VUesfVr7e5wxH4mFXZW5l27Crusc53NzLnPr2P2n85li18PFqw8SjDpn0saplNc6nbW0Vt3f5qSkqSSSSlJJJJKUkkkkpSBn3Px8K+6v6dbCW/Hx/so6ZzWuaWuEtcIcDwQeySQQCCddXhj7iXOO5x1c46knxJXJ9asdZ1O7dxWQxg8AAvS7fqxWXk05BYw8Mc3dHlukLmfrN9Sc1rvtuE4ZLiItqA2kx+cyT9JOBDrctzWETFyqxWulPGruP8WWVbvz8MmaQGXNHYPJNb4/rtauTq6L1i2z0mYV2/j3N2gfFzvavSPqf9XndFwXm4h2XkkOuI4AH0K2/yWIyIpl+I58XsGHEJSnXCAeLr8z0DfpD4rn/AKmkinrEaf5Yzv8Az4FvgwZXM4eF9aukXZ9eDi4WXjZebfmV225D6ngXuFnpPqbRZ/N/10xw2XUc+3q/WKem9NdXjuwrnNu6rcxpeyxrd1+D0iu4fpsx9H9Lv/mcXG/feukPPgudZhfWXqHW+l53U8fExKOlvus/QXPue821Oxm17X007Pp7925dEkpS5X60dK6fm/WjoBysavIGQMuixtglrgyk5OO2xv53pvY/auqWV13publPwM7pzqxndMvN1Vd5Irsa9j8a+l9lYe+lzqrP0duyz3/4NJTxAZ0fM6Sy13S8NjrehZXU3vZWQa7qi2mv7NL3ejXuc72Lu/q5iVYf1f6bjVMDGsxqiWj95zG2Wv8A6z7HOeufs+rnVbsN/T8bpWF0ttuK7p/2v7XbkGrFtf6uRXXj+jV61jne6vfaz3rr6q2VVMqZOytrWNnmGjaElMln/wDrRf8AoJ/35aCzf0n/ADl/N9P7H57p3f5u1JT/AP/S9OSSlKUlKkpJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJJSlKSlJfFKUpSUxFdYMhgB8YUkpSlJSkkpSlJSkkpSlJSkkpSlJSkkpSlJSlmzZ/wA5Y2j0/sf0p1ndxtWlKz//AFov/QT/AL8kp//T9OSSQcvNxMGg5GZa2ilpje88k/mtH0nu/qpKTJLIb9aujFwFj7aGOMNtupsrrP8A117drVrgggOBBBEgjUEHuElKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJPB8FXzc7D6fjuyc21uPS3QveY1/db+c938lqSQCTQFk9AnSXP0/Xz6s23Cr7Q+uTAssrc1n+f+b/aW+1zXtD2ODmOALXNMgg8Oa4JUuniyY644She3EOFdJJBszMOp5rtyKq3jlj3taRP8lzkliZJCqysW5xZTfXa4CS1j2uMeMNJRUlKSSSSUpJDqyca5zmU3V2ur+m1j2uLf64aTtRElKWf/AOtF/wCgn/floLN9Nn/OX1I9/wBj27vLckp//9T05YuJSzqPXs3LyR6jOmPbjYdTtWscWi2/I2/6V+7buW0sXJN/RupX9QbU+/pudtOWKhufTawbPtHpj3WU2s/nNn0ElOzY1trHV2tFlbxDmOEtIPZzSsjobPsWbn9Ha4uxsU13YgOuyu4F3oSfza7G+xSf9auhhn6C85dp0Zj0Mc6xx/d2bfZ/bU+i4mWw5PUM9oZmZ7w99QMiqtg2UY+785zW/wA5/LSU1+oZnVszqz+jdIvZg/ZqGZGZnPrFzm+q57MfHx6HuZXvf6Nj7bbFSzeode6Tn9Gx8q13VH3vy2PrxKm1OvDa2OxvVrsf6VTqnl/qW+rXQxaXUujZd2ezqvSssYOe2v0LfUr9am6oE2V15FO6p++mx36G+qz1P5ytRo6L1F2b0/P6j1BuXkYDslx2UippbkMbU2mtrXv2Mx9n07PVstSUs36yttwRlY3T8m60XPxsjHmmt1FtR2215F2RfVjf8T6dtnrITfrhiZAx29OwsvPtysd2UyqptbS1jHnHuZeb7amstqta+v8A4R/82gZP1QssuGRXkUWvGbk5goy6PWxyMoVtLX0+rXuyMb0v1fI3fn2ez9IqeD9W+t9K6ni0dMya2txun21OzLscupc63Kdk+i2iq6r0LKW2epW1tmxJTeyPrXa/K6IemYluVh9VdaLHAMa8emyzdRtuuqdVkY11X6zvbs9Ouz099isD62YJyxUKLjhuyfsQ6iPT9E5G70fT9P1ftfo+v+r/AGr7P9n9b/txMz6suxsbpTMHK2ZHSrrLvWuZ6guOQLW5vq1sfVsdc7Issr2P/RKtjfU4Yme2zHdh/Y25JymmzDZZmDc/134rc579vo+q79Hd6P2qpns9T/CJKbbPrRQ/puf1MYl9WH0+u53r3bGttfQ6yqyqlrLH2O/SVbfU2LIzuqfWDCq6dT1LqJ6VXZiMtyeqOxW3sdmPP6TCvgehhVUtc3Y97avX/wBN+jWo/wCrTndCq6KcgOp+1/aMp5af0lRyX9RfjNG7273OZTvVvqWJ127I9XpvUasal9fp2Y2Rj+uyZP6xU9lmPb6m07fSs9SlJSDJ+sDcI42GK3dVz7MduTb9j9NjPSkV/amnJuZVtyLP6NQy62yxRd9asS1mMel42R1SzKoGWKscNaWUElnqXOyX01se6xllddG/1bLKrFRf9R6aWYX2J+PbZh4ow3DqOOMqt7Gudcy5jA+l2PdXZbd9B/pem/0v8GrY+r3UMN9OR0nOqoym4zMTK9XGaaLW1lz6bq8XGfjNxraX3XbGV/off+kSUtd1/MH1gZ0z7HdXhWYDsp98Vh7DLP0vuu3NbQ1/o2V+l6v2n/gv0iej6yVDFw6sHFzer3Pw6suzaKvVbTY39FbmPssoo+15G1+zHo99myxWcnouRd1HH6g3KAezEswstrq5FrLNtnq1bXt+z2+szf8A4Vip0fVvqXTmY7ukdQrovbh0YOWb6DbXYMZvp4+XVW26p9ORW19ns9Symz+wkpK763YdjqK+nYmT1K3Jx/tdbMdrBFYeabBc7Isp9K2uxjmem7/Cfo02Z105eL0V3SLC13WsmvY4gB7cdgdlZ8seHta9tNP2f/jLUTo/1ap6Tm05NN7rGU4ZxCx49znuudm3ZTrAdv6W2x/6PYh9F+rL+mZGBZZkjIq6ZiWY2O3ZtPqXWC3IyfpO27qq6qWt/rpKcJ/1n6tVjX9UHVsWy2vMtoq6C6pnq2NbkOxK8eqyuz7X9ofV+krf6L/5f6NdI/6w1VdVZ07JxL8Zt1px8fKsNRY+yHuZ+hruflV13Nqf6F1tGyxS6L0DD6UxzvTquynX33HK9JrbIvsff6fqe6z9G2z0vprMr+pr2dSqyvtFBrozjntsOPOXYXGwux8nO9X311+rtq/RfzbK60lMc/65ZLvq6/rXTOnZHpl9TaLbxUGua+xtVlvpev6np/4Kt3+ksrs/mf0i0czqOZZ1bpHT8ZrsY5Aty86t2xz2Y9LdnoWbTdX+ly76Gb6rP8H/ADiH/wA2f+xNn1c+0w6utjGZQZ+fW9uRXZ6Jd9H1GN31+orWF0vIr6rf1XNuZfkW41GKz02FjWNr325Ba177P6Rk2ept3exjGJKdJBy8j7Ni25EbvSaXAeJ7IyjbUy6p9VgllgLXDyKSRVi9r1eMtysq95sute5559xA/stb9Fcl17LuyOoPre9zq8f2MaSSAY979fznLvrfq3nNeRS5ltf5rnHaY/lNhcl9Z/qz1TCudnGr1KbNXmo7y0j85zQPop4IdjlMuH3AOKIsVHpq86u+/wAWvUrrKcrplji6vH220T+aHktsrH8neN64FoL3BjAXvOga0En/ADQvSvqH0G/pmJdl5bdmRlx7Dy1jfotd/LdO5KWzL8SlAcuYyrikRwDrd/N/ivVN5HxXIfVzofRepHrGT1HAx8y/9r5rPVvqbY/a14DGb3gu2M/MauvGhBXI9Mzs/oV3U8W/o3UMv1+o5OXVfiMrfU6u93qVQ999Tt+36fsTHBVlYfRsXreNjfVnpuMOt4hL7rKm+lRj1Wt9J7upPx9jrX217vsuF/Ob/wBP9BdaYnThcpj25Of9YOm24fR8zpWPRfkZXUbMhldTLXW0Ox2vd6Ntvr3us9P6bV1aSlLmPrPj35HXukYgzcvHxeoV5VWRTj2+mHGmr7TVHtdte/8ASMsXTrF+sONmfauldVxMd2W7pd9ll2NWWi11V1VmLYaPUcxj7K/U3+lv/SJKeKxendGpw6M/ppzcLJPRsnqVNteQ39E2nYz7K7Zj1/aK3vd7n2/6Nd/9X23N6FgfaLrMi9+PXZbdcdz3PsaLXy791rn+z+QuOHTH/YD0/pfTeqnJf023pFL8yuqmltd9nrWZGRdv9vpfyG/9bXe49Iox6qAZFNbawfHa0M/gkpIszdZ/zn27P0X2Kd8/nb/ox/VWms//ANaL/wBBP+/JKf/V9OS44SSSUsGtaS5rQ0nkgAFOkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJnMa8bXCQnSSU1mdOwmP3sqaHeIABVkAAQNAkkkpSSSSSlJJJJKUkkkkpSSSSSlLP8A/Wi/9BP+/LQWf/60X/oJ/wB+SU//1vTkkkzi1rS5xDWtElxMADzJSUukqtPVel32+jRmUW28bG2NJ+WqtJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSSSSlJJJJKUkkkkpSSUpJKUkkkkpSSSeD4JKWSTkEchMkpSSSSSlJJEEchJJSln/APrRf+gn/floLP8A/Wi/9BP+/JKf/9f05YdlA651bJoyiXdM6a5tf2aSG3Xub6j33x9OqlrvZWtxYf2hnRes5Jyz6eB1R7bask/QZeG+nZRc7/B+pt31vSU38jonSMmj0LcOn0/zdjAxzf5Vb2bXscq/RLcmq3L6TlWG+zAc30b3fSfRYN1Pqf8ACV/zau5HUcDFoORkZNVdLRJeXA/5sfS/sqj0Nl2RfmdYurNIzyxuNU8Q8UVDbU+xv5rrnH1ElK6l1fOZ1BvSekYrMrPNQvuffYaqKKnFzKn3WVstsfZfYxzaqKmf8IqWV9Zc/pmR05nW6KcCvJfksyHVvdeHeixj8Z+Jsay39Ysf/R3UeurPUMHq2L1Z3Wej11ZTr6GY+bg3WejvFRe/Gvx8jZa1l1frPZZXY307K1BuF1rN6p0nqWfTRjHCdlGymqw2Fjbq2VY49RzK/Uu3b/V9P2JKbD/rR0FmHRnHKLsfKc5lJrqtseXMn1WHHqqfkVvq2/pG2VexNk/Wv6u4tVN12a3Zk1evR6bX2l9fHqsZQyx+1v8AhP8AR/4RZVvROv49j7MebcezqOVlXYlGS7FfYy4V/ZLHZVTWvb6G231sbf8ApN/5/prP6Tidc6F1bDxaMSrOzaumXerV65raG2Zz7mOZlWVWert3/pfUYx//AFCSnoM/63dJwszpmOX+tX1WXV31h72hm1zqrW+lXY231bG+lt3fo/536Ctf84uiftH9mfa2/bN/o7Nrtnqxv+zfadv2X7Tt/wC0/ressrH6B1TpuJ0M44qy8jpmRfdlVB5pYRli8X/ZXObZ7MV+V+ire39LUxVMT6rdQxs1mLZQcrBZmHLGU7OtZVtNxzW7+l1j+mVP+h/gLX/pbElOtnfWvpzen593TbBl5OG0NFYa/Z61j/slFT7XNbX/AEl36Wtr/UV/IyOpYlOO2vDf1O0jbkPpdVSA5oG5+zJtq9tjt2xlayH9E6gz6n3dOAa7Prtty6WtMhzxlP6lj17tPda3ZWo/Wvp1nVcfEuxulvyMnJaGWZEsbdiUuHqWbKbraa3Zfu2U/wChu/SWfuJKTfVjrnWOq4eNdl9NextxtFmY19IrGx9jG/oRa7I/M9P+b+mqmX9ZOvY+ZmA41LcetwZTS71DewkH0PWNDLaXfaodl+12yimr7Lb+tIPS+hMxOr4s/V442A0NFNzn1vtovZuf61xoyLHXU3/6R7P0WR/xqa76vdXy8ix1Vba6xl9RcfWcGAi92OcW1jXVZG9rvTt9+xJTpdC+sNuRiZd/VrsSluBtbfZWbKwCR/PWjLZV6dWQ39JS3/rah/zj6g1x6vbiOZ9Wz7G2bXfagOf2rZjfzn2B/wDN+hs+1V1frdlX+jD9XMfIqx8+/qGFdYyqjEqFVtYNl9mHVttfRRad1m+/+j2WbN71JvS+pN6V0ht1ROWeqNz8xjDu9IXWX5NrXO/7r+s2qx6SnSzurGl/S8vFsryOnZt7ca17IfPrgtxMim5h27G5DfTs/wCN/kLUWR1jDffZ0vAxqdmO3LZk3vY0CuuvG/WWs9sbX5GR6TK/+urXOuqSlJJJJKUkkkkpR4STOBLTHPZJjw9u5vHceB/dKSl+dCsLJzOoY+RZSchx2OgHTUct7Lcc5rWlzjDRqSsDIozsjIsv+zWAWOloI1DeG/8ARSU6PS89+Tuquj1WDcHDTcOOP3lfWf0rAtx911w2veNrWdwOfctBJS41IXH9I6QOuXdVy87OzxZV1LKxq20ZVtNbaqXCumtlNTmsbtauwHIXFdF+s3QuiXdYwerZQw8o9Vy7hVYyyTXY8Pps9jHt2WM9zElNnJw8foHU8B2DmdQzM65zmt6U/Iff69bhsNln2h/p4lGK/wDT/anf8WurPPiuMwus9FyvrXhf838o5dufbfZ1d+17neiyl/2as231tdRi037PSprfs3rs0lKXPfWHL63X1jp3T+n5lWJT1KvIa6x1HrPrfQz1/Ur/AEtTXeox30f8H6f+EXQrA+s7m4mf0XrFzXfY+n5Fwy7GtL/Trvosx222NrDn+l6pZvf+Ykp5rDHUcKlnUcH6w3ZD7OnX9RZVk0PsZbTUG7nZLbcx7ar/AFHN2eku36JdmZHR8LJzntsysill1rq27Gg2D1Qxte5/821/p/S968+a7plHS/smJ1OrqWYOjZHSMfFxmWOssuyLN9b6xt/m/T2tfuXpGHQcfDx8c801MrMeLGtZ/BJSZZ//AK0X/oJ/35aCz/8A1ov/AEE/78kp/9D05RsrrtrdXaxtlbxDmOALSPNrlJJJTn0fV/oePaLqcChljdWu2TB/k7vorQ5SSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpDfS1zt4JY/u5hgn+t+8iJJKRihu4Oe51hHG8yB/Z+iiJJJKUkkkkpScOcNJTJJKXLnHQlMkkkpSQMcJJJKX3O8UySSSlLM9Vn/Of0Z9/2LdHlv2rTWf8A+tF/6Cf9+SU//9H06AlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSUqAlASSSU0f250P8A8sMX/t6v/wAml+3Oh/8Alhi/9vV/+TXI/Ur6u9H6p0q3Iz8f1rW3ura7e9vtDKnbYqexv0nuXQf8yfqx/wBwv/Bbf/SqghPNOIkBCj3Mv4OpzPLfDuXzTwzycwZYzwyMYYuH6frG9+3Oh/8Alhi/9vV/+TS/bnQ//LDF/wC3q/8Ayao/8yfqx/3C/wDBbf8A0ql/zJ+rH/cL/wAFt/8ASqdebtD7Zf8AesXD8M/f5r/wvD/6tb37c6H/AOWGL/29X/5NL9udD/8ALDF/7er/APJqj/zJ+rH/AHC/8Ft/9Kpf8yfqx/3C/wDBbf8A0qlebtD7Zf8Aeq4fhn7/ADX/AIXh/wDVre/bnQ//ACwxf+3q/wDyaX7c6H/5YYv/AG9X/wCTVD/mV9V/+4f/AILb/wClVX6j9Wfqd03Efl5eLsqZ4W2kuJ+ixjfV9z3JE5hqRD7Zf96mMPhsiIxlzRkTQAx4f/Vrr/tzof8A5YYv/b1f/k0v250P/wAsMX/t6v8A8muGzOndNq22X4mH0muwbqqsq3JtyC0mGPfTjW/omu/lI2Jg9Aqay3qWDRdgvf6Y6jhX3uqY4/Rbk02W+rQme7kuqh9sv+9bJ+H8lw8QlzBvpGGE34Rl7vBOX9XHN7P9udD/APLDF/7er/8AJpftzof/AJYYv/b1f/k1QH1K+q5AIw5B1BFtv/pVP/zJ+rH/AHC/8Ft/9Kp95u0Ptl/3rV4fhn7/ADX/AIXh/wDVre/bnQ//ACwxf+3q/wDyaX7c6H/5YYv/AG9X/wCTVH/mT9WP+4X/AILb/wClUv8AmT9WP+4X/gtv/pVK83aH2y/71XD8M/f5r/wvD/6tb37c6H/5YYv/AG9X/wCTS/bnQ/8Aywxf+3q//Jqj/wAyfqx/3C/8Ft/9Kpf8yfqx/wBwv/Bbf/SqV5u0Ptl/3quH4Z+/zX/heH/1a62NlYmWw2Yt1eRWDtL6nB4BGu3cwu93uVSW/wDOPbI3fZJ2zrG7wWN/i4/5Dv8A/DT/APz3Qtna3/nJu2jd9jjdGsbuJQ90+z7la1dLvuEf9I/c+M8Pue3x/pP/0vTkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklPK/4uP+Q7/wDw0/8A890Lqlyv+Lj/AJDv/wDDT/8Az3QuqUXL/wA1Dyb/AMX/AN38x/fUkme9lbS+xwYxurnOMAD+U4obcvEeCWX1OA5h7TH/AElK0EqSg66lu3dYxu8FzJcNQ0bnub+9sb9JMMjHLi0WsLm7ZEj/AAn81/25+YkpIsHPazN+teDhW+6rDx35oYfomwvGPU4/8V9Nq3lhdfbfg52L16lhtrxmupza2iXeg/3eq3/iH+9Mnt4AgnybHK/zhANSlCcYf7SUKj/jfIjzundO6TkZfXcii7qN2QWtFYY2w1iI/RtO39Hta1u5Z/1Jxac6nq9rmMbhZ1uwYYM7B753N/M9tn/QU/8AnB1nEz78mqmzrHSMoh2LZjwfT5Pp/omF25rv0b2XKt0zLyOkv6h1TLxxRm9VePsPTG/zjnS4hz6/pMbus973t/0iiuPGD0HFenf9Li/S4nQGPN93yQJEskxiGOQn+5KP6n2f8lLD/lJ/oO79UbLHdGbRY4vOJZZjBx7trcW1/wCbXtatpZ3QcB/TOkVUZDgbgHW5DyRG95Ntnu/k7tquOy8RoYXXVgWO9Nh3CC+N+wa/S2qaAIjEHs5vMyjLPklHWJnIgjrrulSUXW1MDS57WiwhrCSIc4/Ra395zkhZWbDUHD1GtDnM7hpJDXf2tqcwskkkklPK/wCLj/kO/wD8NP8A/PdC2v8A1ov/AEE/78sX/Fx/yHf/AOGn/wDnuhbX/rRf+gn/AH5Vf/Av+C7v/l//AOrf9y//0/TkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklKSSSSUpJJJJSkkkklPK/4uP+Q7/wDw0/8A890Lqlxn1B6l07E6PdXlZVOPYclzgy2xrCQWUjdte5vt9q6X9u9D/wDLHF/7er/8mocEojFDUbd3T+K4Msue5gjHMgz3EZJepbf2bl742+hZM8fRd4rnmXYtbLszIYy5mI7HsuY70rHem6p2P/gWiv8AnHsW0/rXQLGFlmdiPY76TXW1kH4tLlW+0/VX1/X+2YkyCK/Wr9MODTW1/oh2zfsc5Sccf3h9rR+75v8ANT/xJMnUHB6fhVOexr6arC2osD/0orffvpeP5r0ff/wVlSzsS1jbcJ7LA59luO0s9Sp7QI9P9HQyljq9tdj2+x/6NX/tX1X9KuoZ2OK6q7Kqm/aGHay3Sxrdz/3fZX/o2Kb+ofV2w4+7qVG3F2musZLAwln82+xu/wB7mJccf3h9qvu+b/NT/wASTrJc6FUf270P/wAscX/t6v8A8ml+3eh/+WOL/wBvV/8Ak0uOP7w+1X3fN/mp/wCLJq3fVTotlzr66nY1j/pnHsfUD/Yrc1iP0/6v9J6bYbsWgC93NzyX2a/8JaXub/ZU/wBu9D/8scX/ALer/wDJpft3of8A5Y4v/b1f/k0P1YN+n8GU/fZR4T7xjVUfc2bGa+yvDvfUwW2NreWVmIcQDDXbvauVvAporZuYzZjmoBkNYZfQ2yxjH13fp7a7v0r10LuudCc0td1DFLXAgj1q+Dofz1Vbk/VRjXMZl4jGPa1m1t7AA1h3s2w/2+/3vd/hEeOP7w+1i+75v81P/Ekj9cN6Tim59ZwmZJotZYA5pqY9zKNtv6Pa6n02em/Z71Ypyw/r9rv8BbU3Grf431h2VZV/21d/nssSZ1D6ttpbSc/Gsax5ta6y+tzvUJL/AFtxd/O7ne1R+2fVf7IzD+24voVkPZ+sM3B7XeoLvV9T1PW9T3usS44/vD7Vfd83+an/AIknXSVH9vdEP/eji/8Ab1f/AJNL9u9D/wDLHF/7er/8mlxx/eH2q+75v81P/Ek4f+Lj/kO//wANP/8APdC2v/Wi/wDQT/vyxf8AFx/yHf8A+Gn/APnuhbG8f85dkOn7HO6Pb9L9795V/wDwL/gux/5f/wDq3/cv/9T05JfLiSSn6jSXy4kkp+o0l8uJJKfqNJfLiSSn6jSXy4kkp+o0l8uJJKfqNJfLiSSn6jSXy4kkp+o0l8uJJKfqNJfLiSSn6H/5k/Vj/uF/4Lb/AOlUv+ZP1Y/7hf8Agtv/AKVXzwkoP6N/q/8AmOp/w1/5W/8Atw/Q/wDzJ+rH/cL/AMFt/wDSqX/Mn6sf9wv/AAW3/wBKr54SS/o3+r/5iv8Ahr/yt/8Abh+h/wDmT9WP+4X/AILb/wClUv8AmT9WP+4X/gtv/pVfPCSX9G/1f/MV/wANf+Vv/tw/Q/8AzJ+rH/cL/wAFt/8ASqX/ADJ+rH/cL/wW3/0qvnhJL+jf6v8A5iv+Gv8Ayt/9uH6H/wCZP1Y/7hf+C2/+lUv+ZP1Y/wC4X/gtv/pVfPCSX9G/1f8AzFf8Nf8Alb/7cP0P/wAyfqx/3C/8Ft/9Kpf8yfqx/wBwv/Bbf/Sq+eEkv6N/q/8AmK/4a/8AK3/24fof/mT9WP8AuF/4Lb/6VS/5k/Vj/uF/4Lb/AOlV88JJf0b/AFf/ADFf8Nf+Vv8A7cP0P/zJ+rH/AHC/8Ft/9Kpf8yfqx/3C/wDBbf8A0qvnhJL+jf6v/mK/4a/8rf8A24fpnpvS8HpdDsfAq9GpzjY5u5zvcQ1u6bXPd9FjVW3n/nNsgbfsn0twndunZs+l9D3r5vSUno4P0eD/AJlNL+lfeP8AK/eeL+v944//AErxv//Z
\ No newline at end of file
diff --git a/app/src/main/assets/help/regexHelp.md b/app/src/main/assets/help/regexHelp.md
new file mode 100644
index 000000000..8598c718a
--- /dev/null
+++ b/app/src/main/assets/help/regexHelp.md
@@ -0,0 +1,226 @@
+# 正则表达式学习
+
+- [基本匹配]
+- [元字符]
+ - [英文句号]
+ - [字符集]
+ - [否定字符集]
+ - [重复]
+ - [星号]
+ - [加号]
+ - [问号]
+ - [花括号]
+ - [字符组]
+ - [分支结构]
+ - [转义特殊字符]
+ - [定位符]
+ - [插入符号]
+ - [美元符号]
+- [简写字符集]
+- [断言]
+ - [正向先行断言]
+ - [负向先行断言]
+ - [正向后行断言]
+ - [负向后行断言]
+- [标记]
+ - [不区分大小写]
+ - [全局搜索]
+ - [多行匹配]
+- [常用正则表达式]
+
+## 1. 基本匹配
+
+正则表达式只是我们用于在文本中检索字母和数字的模式。例如正则表达式 `cat`,表示: 字母 `c` 后面跟着一个字母 `a`,再后面跟着一个字母 `t`。"cat" => The cat sat on the mat
+
+正则表达式 `123` 会匹配字符串 "123"。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。
+正则表达式通常区分大小写,因此正则表达式 `Cat` 与字符串 "cat" 不匹配。"Cat" => The cat sat on the Cat
+
+## 2. 元字符
+
+元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符写在方括号内的时候有特殊含义。
+元字符如下:
+
+|元字符|描述|
+|:----:|----|
+|.|匹配除换行符以外的任意字符。|
+|[ ]|字符类,匹配方括号中包含的任意字符。|
+|[^ ]|否定字符类。匹配方括号中不包含的任意字符|
+|*|匹配前面的子表达式零次或多次|
+|+|匹配前面的子表达式一次或多次|
+|?|匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。|
+|{n,m}|花括号,匹配前面字符至少 n 次,但是不超过 m 次。|
+|(xyz)|字符组,按照确切的顺序匹配字符xyz。|
+|||分支结构,匹配符号之前的字符或后面的字符。|
+|\|转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ |
|
+|^|匹配行的开始|
+|$|匹配行的结束|
+
+## 2.1 英文句号
+
+英文句号 `.` 是元字符的最简单的例子。元字符 `.` 可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式 `.ar`,表示: 任意字符后面跟着一个字母 `a`,
+再后面跟着一个字母 `r`。".ar" => The car parked in the garage.
+
+## 2.2 字符集
+
+字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。
+例如正则表达式 `[Tt]he`,表示: 大写 `T` 或小写 `t` ,后跟字母 `h`,再后跟字母 `e`。"[Tt]he" => The car parked in the garage.
+
+然而,字符集中的英文句号表示它字面的含义。正则表达式 `ar[.]`,表示小写字母 `a`,后面跟着一个字母 `r`,再后面跟着一个英文句号 `.` 字符。"ar[.]" => A garage is a good place to park a car.
+
+### 2.2.1 否定字符集
+
+一般来说插入字符 `^` 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式 `[^c]ar`,表示: 除了字母 `c` 以外的任意字符,后面跟着字符 `a`,
+再后面跟着一个字母 `r`。"[^c]ar" => The car parked in the garage.
+
+## 2.3 重复
+
+以下元字符 `+`,`*` 或 `?` 用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。
+
+### 2.3.1 星号
+
+该符号 `*` 表示匹配上一个匹配规则的零次或多次。正则表达式 `a*` 表示小写字母 `a` 可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。
+例如正则表达式 `[a-z]*`,表示: 一行中可以包含任意数量的小写字母。"[a-z]*" => The car parked in the garage #21.
+
+该 `*` 符号可以与元符号 `.` 用在一起,用来匹配任意字符串 `.*`。该 `*` 符号可以与空格符 `\s` 一起使用,用来匹配一串空格字符。
+例如正则表达式 `\s*cat\s*`,表示: 零个或多个空格,后面跟小写字母 `c`,再后面跟小写字母 `a`,再再后面跟小写字母 `t`,后面再跟零个或多个空格。"\s*cat\s*" => The fat cat sat on the cat.
+
+### 2.3.2 加号
+
+该符号 `+` 匹配上一个字符的一次或多次。例如正则表达式 `c.+t`,表示: 一个小写字母 `c`,后跟任意数量的字符,后跟小写字母 `t`。"c.+t" => The fat cat sat on the mat.
+
+### 2.3.3 问号
+
+在正则表达式中,元字符 `?` 用来表示前一个字符是可选的。该符号匹配前一个字符的零次或一次。
+例如正则表达式 `[T]?he`,表示: 可选的大写字母 `T`,后面跟小写字母 `h`,后跟小写字母 `e`。"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.
+
+## 2.4 花括号
+
+在正则表达式中花括号(也被称为量词 ?)用于指定字符或一组字符可以重复的次数。例如正则表达式 `[0-9]{2,3}`,表示: 匹配至少2位数字但不超过3位(0到9范围内的字符)。"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+我们可以省略第二个数字。例如正则表达式 `[0-9]{2,}`,表示: 匹配2个或更多个数字。如果我们也删除逗号,则正则表达式 `[0-9]{2}`,表示: 匹配正好为2位数的数字。"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
"[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.
+
+## 2.5 字符组
+
+字符组是一组写在圆括号内的子模式 `(...)`。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。
+但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。
+例如正则表达式 `(ab)*` 表示匹配零个或多个的字符串 "ab"。我们还可以在字符组中使用元字符 `|`。例如正则表达式 `(c|g|p)ar`,表示: 小写字母 `c`、`g` 或 `p` 后面跟字母 `a`,后跟字母 `r`。"(c|g|p)ar" => The car is parked in the garage.
+
+## 2.6 分支结构
+
+在正则表达式中垂直条 `|` 用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支机构的工作方式一样。
+但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。
+例如正则表达式 `(T|t)he|car`,表示: 大写字母 `T` 或小写字母 `t`,后面跟小写字母 `h`,后跟小写字母 `e` 或小写字母 `c`,后跟小写字母 `a`,后跟小写字母 `r`。"(T|t)he|car" => The car is parked in the garage.
+
+## 2.7 转义特殊字符
+
+正则表达式中使用反斜杠 `\` 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 `{ } [ ] / \ + * . $ ^ | ?`。在特殊字符前面加 `\`,就可以使用它来做匹配字符。
+例如正则表达式 `.` 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 `.` 字符,正则表达式 `(f|c|m)at\.?`,表示: 小写字母 `f`、`c` 或者 `m` 后跟小写字母 `a`,后跟小写字母 `t`,后跟可选的 `.` 字符。"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+## 2.8 定位符
+
+在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。
+定位符有两种类型: 第一种类型是 `^` 检查匹配字符是否是起始字符,第二种类型是 `$`,它检查匹配字符是否是输入字符串的最后一个字符。
+
+### 2.8.1 插入符号
+
+插入符号 `^` 符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式 `^a` (如果a是起始符号)匹配字符串 `abc`,它会匹配到 `a`。
+但是如果我们使用正则表达式 `^b`,它是匹配不到任何东西的,因为在字符串 `abc` 中 "b" 不是起始字符。
+让我们来看看另一个正则表达式 `^(T|t)he`,这表示: 大写字母 `T` 或小写字母 `t` 是输入字符串的起始符号,后面跟着小写字母 `h`,后跟小写字母 `e`。"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
+
+### 2.8.2 美元符号
+
+美元 `$` 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 `(at\.)$`,表示: 小写字母 `a`,后跟小写字母 `t`,后跟一个 `.` 字符,且这个匹配器必须是字符串的结尾。"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat sat on the mat.
+
+## 3. 简写字符集
+
+正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:
+
+|简写|描述|
+|:----:|----|
+|.|匹配除换行符以外的任意字符|
+|\w|匹配所有字母和数字的字符: `[a-zA-Z0-9_]`|
+|\W|匹配非字母和数字的字符: `[^\w]`|
+|\d|匹配数字: `[0-9]`|
+|\D|匹配非数字: `[^\d]`|
+|\s|匹配空格符: `[\t\n\f\r\p{Z}]`|
+|\S|匹配非空格符: `[^\s]`|
+
+## 4. 断言
+
+后行断言和先行断言有时候被称为断言,它们是特殊类型的 ***非捕获组*** (用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。
+例如我们想获取输入字符串 `$4.44 and $10.88` 中带有前缀 `$` 的所有数字。我们可以使用这个正则表达式 `(?<=\$)[0-9\.]*`,表示: 获取包含 `.` 字符且前缀为 `$` 的所有数字。
+以下是正则表达式中使用的断言:
+
+|符号|描述|
+|:----:|----|
+|?=|正向先行断言|
+|?!|负向先行断言|
+|?<=|正向后行断言|
+|?"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
+
+### 4.2 负向先行断言
+
+当我们需要从输入字符串中获取不匹配表达式的内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样,
+唯一的区别是不是等号 `=`,我们使用否定符号 `!`,例如 `(?!...)`。
+我们来看看下面的正则表达式 `(T|t)he(?!\sfat)`,表示: 从输入字符串中获取全部 `The` 或者 `the` 且不匹配 `fat` 前面加上一个空格字符。"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
+
+### 4.3 正向后行断言
+
+正向后行断言是用于获取在特定模式之前的所有匹配内容。正向后行断言表示为 `(?<=...)`。例如正则表达式 `(?<=(T|t)he\s)(fat|mat)`,表示: 从输入字符串中获取在单词 `The` 或 `the` 之后的所有 `fat` 和 `mat` 单词。"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
+
+### 4.4 负向后行断言
+
+负向后行断言是用于获取不在特定模式之前的所有匹配的内容。负向后行断言表示为 `(?"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
+
+## 5. 标记
+
+标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。
+
+|标记|描述|
+|:----:|----|
+|i|不区分大小写: 将匹配设置为不区分大小写。|
+|g|全局搜索: 搜索整个输入字符串中的所有匹配。|
+|m|多行匹配: 会匹配输入字符串每一行。|
+
+### 5.1 不区分大小写
+
+`i` 修饰符用于执行不区分大小写匹配。例如正则表达式 `/The/gi`,表示: 大写字母 `T`,后跟小写字母 `h`,后跟字母 `e`。
+但是在正则匹配结束时 `i` 标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了 `g` 标记,因为我们要在整个输入字符串中搜索匹配。"The" => The fat cat sat on the mat.
"/The/gi" => The fat cat sat on the mat.
+
+### 5.2 全局搜索
+
+`g` 修饰符用于执行全局匹配 (会查找所有匹配,不会在查找到第一个匹配时就停止)。
+例如正则表达式 `/.(at)/g`,表示: 除换行符之外的任意字符,后跟小写字母 `a`,后跟小写字母 `t`。
+因为我们在正则表达式的末尾使用了 `g` 标记,它会从整个输入字符串中找到每个匹配项。".(at)" => The fat cat sat on the mat.
"/.(at)/g" => The fat cat sat on the mat.
+
+### 5.3 多行匹配
+
+`m` 修饰符被用来执行多行的匹配。正如我们前面讨论过的 `(^, $)`,使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用 `m` 修饰符。
+例如正则表达式 `/at(.)?$/gm`,表示: 小写字母 `a`,后跟小写字母 `t`,匹配除了换行符以外任意字符零次或一次。而且因为 `m` 标记,现在正则表达式引擎匹配字符串中每一行的末尾。"/.at(.)?$/" => The fat
+ cat sat
+ on the mat.
"/.at(.)?$/gm" => The fat
+ cat sat
+ on the mat.
+
+## 常用正则表达式
+
+* **数字**: `\d+$`
+* **用户名**: `^[\w\d_.]{4,16}$`
+* **字母数字字符**: `^[a-zA-Z0-9]*$`
+* **带空格的字母数字字符**: `^[a-zA-Z0-9 ]*$`
+* **小写字母**: `[a-z]+$`
+* **大写字母**: `[A-Z]+$`
+* **网址**: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
+* **日期 (MM/DD/YYYY)**: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
+* **日期 (YYYY/MM/DD)**: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
+* **求更求转发致谢**: `[\((【].*?[求更谢乐发推].*?[】)\)]`
+* **查找最新章节**: `您可以.*?查找最新章节`
+* **ps/PS**: `(?i)ps\b.*`
+* **Html标签**: `<[^>]+?>`
diff --git a/app/src/main/assets/help/replaceRuleHelp.md b/app/src/main/assets/help/replaceRuleHelp.md
new file mode 100644
index 000000000..063c8d3a3
--- /dev/null
+++ b/app/src/main/assets/help/replaceRuleHelp.md
@@ -0,0 +1,6 @@
+# 替换管理界面帮助
+
+* 替换规则是用来替换正文内容的一种规则
+ * 菜单可以新建和导入规则
+ * 可以拖动排序
+ * 可以选择操作
\ No newline at end of file
diff --git a/app/src/main/assets/help/ruleHelp.md b/app/src/main/assets/help/ruleHelp.md
new file mode 100644
index 000000000..043677f4b
--- /dev/null
+++ b/app/src/main/assets/help/ruleHelp.md
@@ -0,0 +1,177 @@
+# 源规则帮助
+
+* [书源帮助文档](https://alanskycn.gitee.io/teachme/Rule/source.html)
+* [订阅源帮助文档](https://alanskycn.gitee.io/teachme/Rule/rss.html)
+* [js扩展类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/help/JsExtensions.kt)
+* 辅助键盘❓中可插入URL参数模板,打开帮助,选择文件
+* 规则标志, {{......}}内使用规则必须有明显的规则标志,没有规则标志当作js执行
+```
+@@ 默认规则,直接写时可以省略@@
+@XPath: xpath规则,直接写时以//开头可省略@XPath
+@Json: json规则,直接写时以$.开头可省略@Json
+: regex规则,不可省略,只可以用在书籍列表和目录列表
+```
+
+* 发现url格式
+```json
+[
+ {
+ "title": "xxx",
+ "url": "",
+ "style": {
+ "layout_flexGrow": 0,
+ "layout_flexShrink": 1,
+ "layout_alignSelf": "auto",
+ "layout_flexBasisPercent": -1,
+ "layout_wrapBefore": false
+ }
+ }
+]
+```
+
+* 获取登录后的cookie
+```
+java.getCookie("http://baidu.com", null) => userid=1234;pwd=adbcd
+java.getCookie("http://baidu.com", "userid") => 1234
+```
+
+* 请求头,支持http代理,socks4 socks5代理设置
+```
+socks5代理
+{
+ "proxy":"socks5://127.0.0.1:1080"
+}
+http代理
+{
+ "proxy":"http://127.0.0.1:1080"
+}
+支持代理服务器验证
+{
+ "proxy":"socks5://127.0.0.1:1080@用户名@密码"
+}
+注意:这些请求头是无意义的,会被忽略掉
+```
+
+* js 变量和函数
+```
+java 变量-当前类
+baseUrl 变量-当前url,String
+result 变量-上一步的结果
+book 变量-书籍类,方法见 io.legado.app.data.entities.Book
+cookie 变量-cookie操作类,方法见 io.legado.app.help.http.CookieStore
+cache 变量-缓存操作类,方法见 io.legado.app.help.CacheManager
+chapter 变量-当前目录类,方法见 io.legado.app.data.entities.BookChapter
+title 变量-当前标题,String
+src 内容,源码
+```
+
+* url添加js参数,解析url时执行,可在访问url时处理url,例
+```
+https://www.baidu.com,{"js":"java.headerMap.put('xxx', 'yyy')"}
+https://www.baidu.com,{"js":"java.url=java.url+'yyyy'"}
+```
+
+* 增加js方法,用于重定向拦截
+ * `java.get(urlStr: String, headers: Map)`
+ * `java.post(urlStr: String, body: String, headers: Map)`
+* 对于搜索重定向的源,可以使用此方法获得重定向后的url
+```
+(()=>{
+ if(page==1){
+ let url='https://www.yooread.net/e/search/index.php,'+JSON.stringify({
+ "method":"POST",
+ "body":"show=title&tempid=1&keyboard="+key
+ });
+ return java.put('surl',String(java.connect(url).raw().request().url()));
+ } else {
+ return java.get('surl')+'&page='+(page-1)
+ }
+})()
+或者
+(()=>{
+ let base='https://www.yooread.net/e/search/';
+ if(page==1){
+ let url=base+'index.php';
+ let body='show=title&tempid=1&keyboard='+key;
+ return base+java.put('surl',java.post(url,body,{}).header("Location"));
+ } else {
+ return base+java.get('surl')+'&page='+(page-1);
+ }
+})()
+```
+
+* 正文图片链接支持修改headers
+```
+let options = {
+"headers": {"User-Agent": "xxxx","Referrer":baseUrl,"Cookie":"aaa=vbbb;"}
+};
+''
+```
+
+ ## 部分js对象属性说明
+上述js变量与函数中,一些js的对象属性用的频率较高,在此列举。方便写源的时候快速翻阅。
+
+### book对象的可用属性
+> 使用方法: 在js中或{{}}中使用book.属性的方式即可获取.如在正文内容后加上 ##{{book.name+"正文卷"+title}} 可以净化 书名+正文卷+章节名称(如 我是大明星正文卷第二章我爸是豪门总裁) 这一类的字符.
+```
+bookUrl // 详情页Url(本地书源存储完整文件路径)
+tocUrl // 目录页Url (toc=table of Contents)
+origin // 书源URL(默认BookType.local)
+originName //书源名称 or 本地书籍文件名
+name // 书籍名称(书源获取)
+author // 作者名称(书源获取)
+kind // 分类信息(书源获取)
+customTag // 分类信息(用户修改)
+coverUrl // 封面Url(书源获取)
+customCoverUrl // 封面Url(用户修改)
+intro // 简介内容(书源获取)
+customIntro // 简介内容(用户修改)
+charset // 自定义字符集名称(仅适用于本地书籍)
+type // 0:text 1:audio
+group // 自定义分组索引号
+latestChapterTitle // 最新章节标题
+latestChapterTime // 最新章节标题更新时间
+lastCheckTime // 最近一次更新书籍信息的时间
+lastCheckCount // 最近一次发现新章节的数量
+totalChapterNum // 书籍目录总数
+durChapterTitle // 当前章节名称
+durChapterIndex // 当前章节索引
+durChapterPos // 当前阅读的进度(首行字符的索引位置)
+durChapterTime // 最近一次阅读书籍的时间(打开正文的时间)
+canUpdate // 刷新书架时更新书籍信息
+order // 手动排序
+originOrder //书源排序
+variable // 自定义书籍变量信息(用于书源规则检索书籍信息)
+ ```
+
+### chapter对象的可用属性
+> 使用方法: 在js中或{{}}中使用chapter.属性的方式即可获取.如在正文内容后加上 ##{{chapter.title+chapter.index}} 可以净化 章节标题+序号(如 第二章 天仙下凡2) 这一类的字符.
+ ```
+ url // 章节地址
+ title // 章节标题
+ baseUrl //用来拼接相对url
+ bookUrl // 书籍地址
+ index // 章节序号
+ resourceUrl // 音频真实URL
+ tag //
+ start // 章节起始位置
+ end // 章节终止位置
+ variable //变量
+ ```
+
+### 字体解析使用
+> 使用方法,在正文替换规则中使用,原理根据f1字体的字形数据到f2中查找字形对应的编码
+```
+
+(function(){
+ var b64=String(src).match(/ttf;base64,([^\)]+)/);
+ if(b64){
+ var f1 = java.queryBase64TTF(b64[1]);
+ var f2 = java.queryTTF("https://alanskycn.gitee.io/teachme/assets/font/Source Han Sans CN Regular.ttf");
+ return java.replaceFont(result, f1, f2);
+ }
+ return result;
+})()
+
+```
+
diff --git a/app/src/main/assets/help/webDavHelp.md b/app/src/main/assets/help/webDavHelp.md
new file mode 100644
index 000000000..dee978b42
--- /dev/null
+++ b/app/src/main/assets/help/webDavHelp.md
@@ -0,0 +1,19 @@
+# WebDav备份教程
+
+### 阅读支持云备份,采用WebDav协议,所有支持WebDav的云盘都可以,建议采用坚果云,每月免费1G流量,用来备份阅读足够了,下面就采用坚果云来讲解配置步骤.
+
+1. 打开坚果云网站 https://www.jianguoyun.com/d/home#/
+2. 如果没有注册过坚果云先注册一下
+3. 登录坚果云
+4. 右上角用户名点开点账户信息
+5. 点击安全选项
+6. 在第三方管理里添加应用
+7. 将应用示例里的服务器地址,用户名,和密码填到阅读的WebDav设置里
+8. 阅读的WebDav配置在我的-备份与恢复,创建子文件夹选项保持默认即可
+9. 设置完成后手动执行一下备份,看看是否成功
+10. 恢复时选择想要恢复的备份文件
+
+### 自动备份说明
+
+* 设置好备份之后每次退出App会自动进行备份
+* WebDav同一天的备份会覆盖,不同日期的备份不会覆盖
\ No newline at end of file
diff --git a/app/src/main/assets/httpTTS.json b/app/src/main/assets/httpTTS.json
deleted file mode 100644
index 29fda4c6f..000000000
--- a/app/src/main/assets/httpTTS.json
+++ /dev/null
@@ -1,62 +0,0 @@
-[
- {
- "id": 1598233029304,
- "name": "度小美",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029305,
- "name": "度小宇",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=1&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029306,
- "name": "度逍遥",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=3&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029307,
- "name": "度丫丫",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=4&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029308,
- "name": "度小娇",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=5&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029309,
- "name": "度米朵",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029310,
- "name": "度博文",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029311,
- "name": "度小童",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029312,
- "name": "度小萌",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=111&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029313,
- "name": "百度骚男",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=11&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029314,
- "name": "百度评书",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- },
- {
- "id": 1598233029315,
- "name": "百度主持",
- "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}"
- }
-]
\ No newline at end of file
diff --git a/app/src/main/assets/readConfig.json b/app/src/main/assets/readConfig.json
deleted file mode 100644
index 968141a0c..000000000
--- a/app/src/main/assets/readConfig.json
+++ /dev/null
@@ -1,52 +0,0 @@
-[
- {
- "bgStr": "#FFFFFF",
- "bgStrNight": "#000000",
- "textColor": "#000000",
- "textColorNight": "#FFFFFF",
- "bgType": 0,
- "bgTypeNight": 0,
- "darkStatusIcon": true,
- "darkStatusIconNight": false
- },
- {
- "bgStr": "#DDC090",
- "bgStrNight": "#3C3F43",
- "textColor": "#3E3422",
- "textColorNight": "#DCDFE1",
- "bgType": 0,
- "bgTypeNight": 0,
- "darkStatusIcon": true,
- "darkStatusIconNight": false
- },
- {
- "bgStr": "#C2D8AA",
- "bgStrNight": "#3C3F43",
- "textColor": "#596C44",
- "textColorNight": "#88C16F",
- "bgType": 0,
- "bgTypeNight": 0,
- "darkStatusIcon": false,
- "darkStatusIconNight": false
- },
- {
- "bgStr": "#DBB8E2",
- "bgStrNight": "#3C3F43",
- "textColor": "#68516C",
- "textColorNight": "#F6AEAE",
- "bgType": 0,
- "bgTypeNight": 0,
- "darkStatusIcon": false,
- "darkStatusIconNight": false
- },
- {
- "bgStr": "#ABCEE0",
- "bgStrNight": "#3C3F43",
- "textColor": "#3D4C54",
- "textColorNight": "#90BFF5",
- "bgType": 0,
- "bgTypeNight": 0,
- "darkStatusIcon": false,
- "darkStatusIconNight": false
- }
-]
\ No newline at end of file
diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md
index 6563ab994..25069b073 100644
--- a/app/src/main/assets/updateLog.md
+++ b/app/src/main/assets/updateLog.md
@@ -1,674 +1,486 @@
# 更新日志
-* 关注公众号 **[开源阅读]()** 菜单•软件下载 提前享受新版本。
-* 关注合作公众号 **[小说拾遗]()** 获取好看的小说。
-- 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
-
-**2020/09/09**
-* 修复主题导入导出bug
-* 优化分屏模式状态栏
-* 书源基本属性增加“书源注释”
-
-**2020/09/08**
-* 页眉页脚跟随背景
-* 主题导入导出
-
-**2020/09/07**
-* 订阅源和替换规则添加滑动选择
-* 修复排版配置导入导出
-* 订阅界面添加下载文件功能
-
-**2020/09/06**
-* 优化翻页
-* EInk模式独立背景
-* 阅读排版配置导入导出,包括背景和字体,支持网络导入
-
-**2020/09/03**
-* 修复替换中的回车消失的bug
-* 所有内容恢复htmlFormat, 在想其它办法解决丢失一些内容的问题
-* 图片(漫画)支持导出
-
-**2020/09/02**
-* 搜索url支持put,get,js里使用java.put,java.get
-* 对于搜索重定向的源,可以使用此方法获得重定向后的url
+
+* 关注公众号 **[开源阅读]** 菜单•软件下载 提前享受新版本。
+* 关注合作公众号 **[小说拾遗]** 获取好看的小说。
+
+## **必读**
+
+【温馨提醒】 *更新前一定要做好备份,以免数据丢失!*
+
+* 阅读只是一个转码工具,不提供内容,第一次安装app,需要自己手动导入书源,可以从公众号 **[开源阅读]**、QQ群、酷安评论里获取由书友制作分享的书源。
+* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则出现问题, 出现简体变化问题检查一下简繁转换是否关闭。
+* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
+
+**2021/08/02**
+
+* 关于最近版本有时候界面没有数据的问题是因为把LiveData组件换成了谷歌推荐的Flow组件导致的问题,正在查找解决办法
+
+1. 换源界面功能添加:置顶,置底,删除 by h11128
+2. Cronet:优化 by ag2s20150909
+3. 优化自动翻页 by jiuZhouWorlds
+4. 封面设置移到主题里面,白天和夜间可分别设置
+
+**2021/08/01**
+
+1. 为webService添加快捷操作
+2. 规则内替换使用正则错误时自动切换为不使用正则
+3. 优化Cronet
+4. 阅读界面菜单显示的时候停止按键翻页和自动阅读
+5. 切换后台停止自动阅读
+
+**2021/07/29**
+
+1. 修复每次更新都重新导入text规则的bug
+2. RSS阅读页添加刷新按钮以应对页面内容过期失效的BUG by JiuZhouWorlds
+3. 规则内替换使用正则报错时自动使用非正则替换
+
+**2021/07/27**
+
+1. 修复bug
+2. web使用api获取封面,不会再出现没有封面的情况
+3. 阅读亮度手动调节分别记住白天和夜间模式
+4. legado://import/auto?src={url}, 自动识别导入类型
+5. 一些优化并更新了一下web首页,感谢沚水, 传书暂时还不好用
+
+**2021/07/22**
+
+1. 非关键规则添加try防止报错中断解析
+2. 添加获取封面的api
+3. 获取正文api使用替换规则
+4. 添加一个ronet版本,网络访问使用Chromium内核
+5. web书架增加【最近一次更新书籍信息的时间】
+6. 采用Flow替换LiveData,优化资源使用
+7. 统一网络一键导入路径legado://import/{path}?src={url}
+
+* path: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig
+* 添加了txt小说规则,在线朗读引擎,主题,排版 的一键导入支持,老url依然可用
+
+8. 替换规则管理添加置顶所选和置底所选
+
+**2021/07/16**
+
+1. js扩展函数添加删除本地文件方法
+2. js扩展函数对于文件的读写删操作都是相对路径,只能操作阅读缓存内的文件,/android/data/{package}/cache/...
+
+**2021/07/15**
+
+1. 添加js函数来修复开启js沙箱后某些书源失效。by ag2s20150909
+
+```kotlin
+/**
+ * 获取网络zip文件里面的数据
+ * @param url zip文件的链接
+ * @param path 所需获取文件在zip内的路径
+ * @return zip指定文件的数据
+ */
+fun getZipStringContent(url: String, path: String): String
+
+/**
+ * 获取网络zip文件里面的数据
+ * @param url zip文件的链接
+ * @param path 所需获取文件在zip内的路径
+ * @return zip指定文件的数据
+ */
+fun getZipByteArrayContent(url: String, path: String): ByteArray?
```
-
-var url='https://www.yooread.net/e/search/index.php,'+JSON.stringify({
-"method":"POST",
-"body":"show=title&tempid=1&keyboard="+key
-});
-String(java.connect(url).raw().request().url())
-
+
+* web服务添加一个导航页
+
+**2021/07/11**
+
+1. 开启JS沙箱限制
+
+* 禁止在js里exec运行命令
+* 禁止在js里通过geClass反射
+* 禁止在js里创建File对象
+* 禁止在js里获取Packages scope
+
+2. 优化并修复bug
+
+**2021/07/10**
+
+1. 阅读界面长按菜单改回原来样式
+2. 解决导入书源时重命名分组和保留名称冲突的问题
+
+**2021/07/09**
+
+1. 发现url添加json格式, 支持设置标签样式
+
+* 样式属性可以搜索 [FleboxLayout子元素支持的属性介绍](https://www.jianshu.com/p/3c471953e36d)
+* 样式属性可省略,有默认值
+
+```json
+[
+ {
+ "title": "xxx",
+ "url": "",
+ "style": {
+ "layout_flexGrow": 0,
+ "layout_flexShrink": 1,
+ "layout_alignSelf": "auto",
+ "layout_flexBasisPercent": -1,
+ "layout_wrapBefore": false
+ }
+ }
+]
```
-* 正文合并后替换规则支持所有规则写法,包括js
-
-**2020/09/01**
-* 导入书源列表添加全不选
-* 详情页菜单添加清理缓存,清理当前书籍缓存
-* 修复滑动选择,选择数量不更新的bug
-* 字体跟随背景,每个背景对应一个字体
-* 优化图片下载
-
-**2020/08/29**
-* 修复一个null引起的崩溃bug
-* 修复我的界面滚动时图标消失的bug
-* 修复从详情页目录打开章节内容不对的bug
-* 书源选择增加滑动选择, 选择框区域滑动时进行选择 by [Mupceet](https://github.com/Mupceet)
-* 请求头,支持http代理,socks4 socks5代理设置 by [10bits](https://github.com/10bits)
+
+**2021/07/07**
+
+1. 默认规则新增类似`jsonPath`的索引写法 by bushixuanqi
+
+* 格式形如 `[index,index, ...]` 或 `[!index,index, ...]` 其中`[!`开头表示筛选方式为排除,`index`可以是单个索引,也可以是区间。
+* 区间格式为 `start:end` 或 `start:end:step`,其中`start`为`0`可省略,`end`为`-1`可省略。
+* 索引、区间两端、区间间隔都支持负数
+* 例如 `tag.div[-1, 3:-2:-10, 2]`
+* 特殊用法 `tag.div[-1:0]` 可在任意地方让列表反向
+
+2. 允许索引作为@分段后每个部分的首规则,此时相当于前面是`children`
+
+* `head@.1@text` 与 `head@[1]@text` 与 `head@children[1]@text` 等价
+
+3. 添加Umd格式支持 by ag2s20150909
+4. 修复web页面按键重复监听的bug
+5. 亮度条往中间移了一点,防止误触
+6. 添加内置字典
+
+**2021/06/29**
+
+* 修复html格式化bug
+* 订阅界面webView支持css prefers-color-scheme: dark 查询,需webView v76或更高版本
+* 如webView低于v76可以用js调用activity.isNightTheme()来获取当前是否暗模式
+* 修复一些书籍导出epub失败 by ag2s20150909
+
+**2021/06/22**
+
+* 修复隐藏未读设置不生效的bug
+* 修复系统字体大小选择大时导入界面按钮显示不全的bug
+* 修复听书从后台打开时不对的bug
+
+**2021/06/20**
+
+* viewPager2 改回 viewPager
+* 添加配置导入文件规则功能 by bushixuanqi
+* 文件夹分组样式优化(未完成)
+* epub支持外部模板
+* 修复一些bug
+
+**2021/06/06**
+
+* 添加自定义导出文件名
+* 添加书架文件夹分组样式,未完成
+* viewPager2 3层嵌套有问题,书架换回viewPager
+
+**2021/05/29**
+
+* 谷歌版可使用外部epub模板
+* Asset文件夹下二级以内目录全文件读取,Asset->文件夹->文件
+* epub元数据修改,使修改字体只对正文生效
+* 修复epub模板文件的排序问题
+* epub可自定义模板,模板路径为书籍导出目录的Asset文件夹,[模板范例](https://wwa.lanzoux.com/ibjBspkn05i)
+
```
-socks5代理
-{
- "proxy":"socks5://127.0.0.1:1080"
-}
-http代理
-{
- "proxy":"http://127.0.0.1:1080"
-}
-支持代理服务器验证
-{
- "proxy":"socks5://127.0.0.1:1080@用户名@密码"
-}
-注意:这些请求头是无意义的,会被忽略掉
+Asset中里面必须有Text文件夹,Text文件夹里必须有chapter.html,否则导出正文会为空
+chapter.html的关键字有{title}、{content}
+其他html文件的关键字有{name}、{author}、{intro}、{kind}、{wordCount}
```
-**2020/08/28**
-* 修复一些bug
-* 换源不再改变书名和作者,防止换到一些错误的书源后不能再换源
-
-**2020/08/27**
-* 修复主题bug
-* 修复封面bug
-* 优化书籍更新,搜索,换源
-* e-ink模式不再固定背景
-
-**2020/08/26**
-* js添加java.encodeURI(speakText),用于解决js编码时有~的语句朗读不出来
-* 修复书名太长删除阅读记录按钮不显示的bug
-* 完成本地书籍编码选择
-
-**2020/08/25**
-* 阅读记录可以删除了
-* 修复翻页模式选择颜色问题
-* 修复toolbar在一些情况下文字颜色不对的bug
-* 多设备阅读记录叠加
-* 封面链接支持修改headers
-
-**2020/08/24**
-* 应用被杀死时停止朗读
-* 默认封面添加删除操作
-* 备份阅读记录
-* 书源添加移除分组支持多选,多个分组以逗号(中英均可)隔开
-* 可以自定义在线朗读了
-
-**2020/08/22**
-* 添加阅读时间记录
-
-**2020/08/21**
-* 图片(漫画源)支持离线下载了
-
-**2020/08/20**
-* 正文图片(漫画源)链接支持修改headers
-
-**2020/08/19**
-* 选择文本替换时带入书名和书源
-
-**2020/08/16**
-* 添加亮度调节控件显示开关
-* 添加应用内语言切换
-* 底栏颜色限制去除,自动适配
-
-**2020/08/12**
-* 增加了Content Provider 接口支持 by [w568w](https://github.com/w568w)
-* 修复阅读界面加入书架后,书籍详情页还是显示加入书架按钮的bug
-* 修复低版本手机自动阅读速度拉动最左边崩溃的bug
-* 给亮度调节加个半透明背景,很多人找不到
-* 修复替换分组选择无效的bug
-* 备份添加书签
-* 修复web端进度更新后手机端进入阅读界面进度不变的bug
-* 增加了txt目录规则备份
-* 优化了导入功能,导入之前对比已有书源,可选择性导入
-* 其它一些bug修复
-
-**2020/08/08**
-* 继续适配主题,现在应该所有地方都按照主题变色了
-* 朗读定时增加到3个小时,朗读暂停恢复后继续定时
-* 优化了主题颜色选择,会影响体验的颜色禁止选,会有提示
-* 订阅规则下一页支持页数,下一页规则填page
-
-**2020/08/07**
-* 修复其它一些主题色没有适配到的地方
-* 添加默认启用替换配置
-
-**2020/08/06**
-* 菜单背景根随主题色
-* 修复其它一些主题色没有适配到的地方
-* 取消图片颜色为FULL时的自动滚动
-* 其它一些优化,升级库文件之类
-* 显示订阅加入恢复忽略列表
-
-**2020/08/03**
-* 修复一些主题色没有适配到的地方
-* 尝试修复书架最新章节更新不及时的bug
-
-**2020/08/02**
-* 阅读菜单底部几个按钮的背景动态设置为底部操作栏颜色
-* 优化书签功能,解决一些bug
-
-**2020/07/29**
-* 正文图片样式为FULL的自动为滚动模式
-
-**2020/07/28**
-* 长图正文规则添加图片样式FULL,可以滚动浏览了
-
-**2020/07/26**
-* 优化翻页,加快翻页速度
-
-**2020/07/25**
-* 正文规则添加多页合并后的替换规则,格式同样是##regex##replaceTo
-* 正文图片添加长按缩放
-* 正文规则添加图片样式规则,可以设置为FULL
-* 其它一些bug修复
-
-**2020/07/21**
-* 优化文字选择,不再缓存
-* 添加忽略恢复列表,方便不同手机配置不同
-* 其它一些bug修复
-
-**2020/07/19**
-* 添加自定义默认封面
-* 修复封面选择本地图片时书架不显示的bug
-
-**2020/07/14**
-* 添加英文语言 by [52fisher](https://github.com/52fisher)
-
-**2020/07/13**
-* 在线阅读图片支持测试成功,最好把替换净化关了,防止图片url不对
-* 书源保留img标签就行,@html自动保留标签
-
-**2020/07/12**
-* epub显示图片,未完善
-* 在线阅读也支持图片,还未测试
-
-**2020/07/11**
-* epub可以正确识别书名和作者了
-* epub封面正确显示
-
-**2020/07/10**
-* 修复一些窗口再墨水屏上背景透明的问题
-* 添加epub支持
-* web阅读时记住进度
-* 导入书源时系统文件选择器可以选择json文件
-
-**2020/07/06**
-* 优化下载
-
-**2020/07/05**
-* 修复夜间模式底栏颜色调整无效的bug
-* 【web看书】加了翻页、排序等 by [Celeter](https://github.com/Celeter)
-* 两部xx' is recognized as a title by [52fisher](https://github.com/52fisher)
-* 添加下载错误日志,从下载菜单浏览
-* 修复vip标识引发的bug
-
-**2020/07/04**
-* 修复滚动bug
-* 其它一些优化
+**2021/05/24**
-**2020/07/03**
-* 修复关闭两端对齐是朗读高亮不准确的bug
-* 添加文字底部对齐开关
+* 反转目录后刷新内容
+* 修复上下滑动会导致左右切换问题
+* 精确搜索增加包含关键词的,比如搜索五行 五行天也显示出来, 五天行不显示
-**2020/06/25**
-* E-Ink模式合并到主题模式里, E-Ink模式不能修改阅读界面背景和文字颜色
-* 添加判断,防止背景透明引起重影,花屏问题
+**2021/05/21**
-**2020/06/22**
-* 修复xpath获取正文多了许多逗号的bug
-* 修复检验有效书源移除失效分组失败的bug
+* 添加反转目录功能
+* 修复分享bug
+* 详情页添加登录菜单
+* 添加发现界面隐藏配置
-**2020/06/21**
-* 双击书架图标返回顶部
+**2021/05/16**
-**2020/06/20**
-* 适配NavigationBar
+* 添加总是使用默认封面配置
+* 添加一种语言 ptbr translation by mezysinc
+* epublib 修bug by ag2s20150909
-**2020/06/19**
-* 修复eInk bug
-* 修复分组下载bug
-* 导入本地添加滚动条
+**2021/05/08**
-**2020/06/18**
-* fadeapp.widgets:scrollless-recyclerView导致有些手机重影,暂时去除
-* 下载界面添加分组
-* 修复eInk bug
+* 预下载章节可调整数目
+* 修复低版本Android使用TTS闪退。 by ag2s20150909
+* 修复WebDav报错
+* 优化翻页动画点击翻页
-**2020/06/17**
-* 修复更新书架时更新禁止更新的问题
-* 修复导入旧版本数据问题
+**2021/05/06**
-**2020/06/16**
-* 刷新时只刷新当前书架
-* 修复恢复备份需要退出重进的问题
-* 保存打开 E-Ink 模式前的主题、翻页动画,关闭后恢复之前的配置, 现在可以切着玩了
-* 修复因繁体语言导致的崩溃bug
+* 修复bug
+* url参数添加重置次数,retry
+* 修改默认tts, 手动导入
+* 升级android studio
-**2020/06/15**
-* 添加 E-Ink 模式 by [Modificator](https://github.com/Modificator)
-* 修复发现打开书时可能的错误
+**2021/04/30**
-**2020/06/14**
-* 修复txt文件目录识别
-* 书源分组添加已启用已禁用
+* epub插图,epublib优化,图片解码优化,epub读取导出优化。by ag2s20150909
+* 添加高刷设置
+* 其它一些优化
+* pro版本被play商店下架了,先把pro设置图片背景的功能开放到所有版本,使用pro版本的可以使用备份恢复功能切换最新版本
-**2020/06/13**
-* 优化搜索
+**2021/04/16**
-**2020/06/12**
-* 修复分组变化的bug
+* 去掉google统计,解决华为手机使用崩溃的bug
+* 添加规则订阅时判断重复提醒
+* 添加恢复预设布局的功能, 添加一个微信读书布局作为预设布局
-**2020/06/10**
-* 正文字体的粗细选择增加可以选择细体(Android O生效) by [hingbong](https://github.com/hingbong)
+**2021/04/08**
+
+* 缓存时重新检查并缓存图片
+* 订阅源调试添加源码查看
+* web调试不输出源码
* 修复bug
+* 换源优化 --- by ag2s20150909
+* 修复localBook获取书名作者名的逻辑
+* 修复导出的epub的标题文字过大的bug
+* 优化图片排版
+
+**2021/04/02**
-**2020/06/09**
-* 修复从发现界面打开已在书架的书时,显示不对的问题
+* 修复bug
+* 书源调试添加源码查看
+* 添加导出epub by ag2s20150909
+* 换源添加是否校验作者选项
-**2020/06/07**
-* 优化书源检测,自定义搜索关键词
-* 失效书源如果校验为有效会去掉失效标志
+**2021/03/31**
-**2020/06/06**
-* 修复一些bug,包括从阅读界面退出后还是显示红色更新的bug
+* 优化epubLib by ag2s20150909
+* 升级库,修改弃用方法
+* tts引擎添加导入导出功能
-**2020/06/03**
-* zh-TW translation by david082321
-* 修复音频播放时播放速度调节会再下一章失效的bug
+**2021/03/23**
-**2020/05/31**
-* 更新到android studio 4.0
-* 书源排序添加按url
-* 去除朗读通知的进度条
-* 修复恢复问题,暂时去除混淆
+* 修复繁简转换“勐”“十”问题。使用了剥离HanLP简繁代码的民间库。APK减少6M左右
+* js添加一个并发访问的方法 java.ajaxAll(urlList: Array) 返回 Array
+* 优化目录并发访问
+* 添加自定义epublib,支持epub v3解析目录。by ag2s20150909
-**2020/05/24**
-* 添加自动翻页速度调节
+**2021/03/19**
-**2020/05/23**
-* 添加文字两端对齐配置
+* 修复图片地址参数缺少的bug
+* 修复更改替换规则时多次重新加载正文导致朗读多次停顿的bug
+* 修复是否使用替换默认值修改后不及时生效的bug
+* 修复繁简转换“勐”“十”问题。使用了剥离HanLP简繁代码的民间库。APK减少6M左右 by hoodie13
+* 百度tsn改为tts
-**2020/05/20**
-* Rss列表增加一种显示样式
+**2021/03/15**
-**2020/05/18**
-* 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了
-* Rss列表添加样式切换
+* 优化图片TEXT样式显示
+* 图片url在解析正文时就拼接成绝对url
+* 修复一些bug
-**2020/05/17**
-* 自动翻页功能完成
-* 替换规则输入时弹出辅助输入条
+**2021/03/08**
-**2020/05/10**
-* 添加识别rss分组中的频道信息,在菜单中可以切换频道 from [yangyxd](https://github.com/yangyxd)
-* 源管理添加置底,批量置顶,批量置地
-* 封面选择本地图片完成
+* 阅读页面停留10分钟之后自动备份进度
+* 添加了针对中文的断行排版处理-by hoodie13, 需要再阅读界面设置里手动开启
+* 添加朗读快捷方式
+* 优化Epub解析 by hoodie13
+* epub书籍增加cache by hoodie13
+* 修复切换书籍或者章节时的断言崩溃问题。看漫画容易复现。 by hoodie13
+* 修正增加书签alert的正文内容较多时,确定键溢出屏幕问题 by hoodie13
+* 图片样式添加TEXT, 阅读界面菜单里可以选择图片样式
-**2020/05/04**
-* 优化txt文件目录解析
+**2021/02/26**
-**2020/05/03**
-* 优化一些界面显示问题
-* 订阅源添加style
-* 修复一些重复目录的bug
+* 添加反转内容功能
+* 更新章节时若无目录url将自动加载详情页
+* 添加变量nextChapterUrl
+* 订阅跳转外部应用时提示
+* 修复恢复bug
+* 详情页拼接url改为重定向后的地址
+* 不重复解析详情页
-**2020/05/02**
-* 修复不停换源的bug
-* 修复本地书籍自动换源
-* 修复书源校验的一些问题
+**2021/02/21**
-**2020/05/01**
-* 尝试修复朗读时可能错位的bug
-* 添加自动换源配置
-* 换源添加禁用菜单
+* 下一页规则改为在内容规则之后执行
+* 书籍导出增加编码设置和导出文件夹设置,使用替换设置
+* 导入源添加等待框
+* 修复一些崩溃bug
-**2020/04/29**
-* 修复bug
-* 订阅界面添加长按菜单
+**2021/02/16**
-**2020/04/26**
-* 添加导入旧的书源转换
-* 修复不自动朗读下一章的bug
+* 修复分享内容不对的bug
+* 优化主题颜色,添加透明度
+* rss分类url支持js
+* 打开阅读时同步阅读进度
-**2020/04/25**
-* 修复翻页按键设置为空时崩溃的bug
-* 翻页按键优先自定义按键,可覆盖音量按键
-* 写书源时的辅助键盘添加※
-* 更改了书源格式,不再需要转义符
+**2021/02/09**
-**2020/04/24**
-* 坚果云最近调整了策略,必须使用应用密码才能备份,用户信息,安全,第三方应用
-* text目录规则添加id字段,负值为系统自带规则
-* 其它一些优化
+* 修复分组内书籍数目少于搜索线程数目,会导致搜索线程数目变低
+* 修复保存书源时不更新书源时间的bug
+* 订阅添加夜间模式,需启用js,还不是很完善
+* 优化源导入界面
-**2020/04/20**
-* 优化阅读界面信息显示
+**2021/02/03**
-**2020/04/19**
-* 添加阅读界面各种信息设置
+* 排版导出文件名修改为配置名称
+* 取消在线朗读下载文件检测,会导致朗读中断
+* 修复其它一些bug
-**2020/04/18**
-* feat: 中文简繁处理库换成 HanLP, 中文增加 zh-rHK 翻译, [hingbong](https://github.com/hingbong)
-* 修复更新时间不对的bug
+**2021/01/30**
-**2020/04/13**
-* 去除rss朗读时的引号
+* 优化阅读记录界面
+* 自定义分组可以隐藏,删除按钮移到编辑对话框
+* 修复其它一些bug
-**2020/04/13**
-* 修复调用webView返回结果多了引号的bug
+**2021/01/23**
-**2020/04/12**
-* 解决无法取消加粗的bug
-* 修复换源自动加入书架的bug
+* 优化书源校验,从搜索到正文全部校验
+* play版可以设置背景图片
+* 添加几个js方法,见io.legado.app.help.JsExtensions
-**2020/04/09**
-* 修复书架刷新闪烁
+**2021/01/18**
-**2020/04/08**
-* 可以隐藏书架未分组
+* 增加三星 S Pen 支持 by [dacer](https://github.com/dacer)
+* 订阅添加阅读下载,可以从多个渠道下载
+* 修复一些BUG
-**2020/04/07**
-* 书架添加未分组,有未分组书籍时自动显示
+**2021/01/12**
+
+* 修复bug
+* 朗读时翻页防止重复发送请求 by [litcc](https://github.com/litcc)
+* 换源刷新之前删除原搜索记录
+* 优化web调试
+
+**2021/01/03**
+
+* 导出书单只保留书名与作者,导入时自动查找可用源
+* 添加预加载设置
+* 选择分组时只搜索分组
+
+**2020/12/30**
+
+* 解决文件下载异常,在线语音可正常播放 by [Celeter](https://github.com/Celeter)
+* 更新默认在线朗读库, 默认id小于0方便下次更新时删除旧数据, 有重复的自己删除
+* 导入导出书单
* 其它一些优化
-**2020/04/04**
-* 优化备份逻辑
-* 修复订阅分类太多显示不全的bug
-* 修复一些分类要手动刷新的问题
+**2020/12/27**
-**2020/04/02**
-* 书架书名和作者作为唯一值
-* 添加订阅分类,分类规则和发现一样,分类一::url1 && 分类2::url2
+* 订阅添加搜索和分组
+* 修复部分手机状态栏bug
+* 单url订阅支持内容规则和样式
-**2020/03/29**
-* 添加退出软件后是否响应耳机按键的开关
-* 优化书源校验
+**2020/12/19**
+
+* 书签转移到文本菜单里,会记录选择的文本和位置
+* 订阅源添加单url选项,直接打开url
+* 订阅源可以put,get数据
+
+**2020/12/15**
+
+* 修复一些引起崩溃的bug
+* 修复搜书和换源可能什么分组都没有的bug
+* 添加同步进度开关,默认开启,在备份与恢复里面
+
+**2020/12/13**
-**2020/03/26**
-* 修复txt目录bug
-* 最近工作比较忙,只有晚上有时间写软件,bug之类的不要催,白天不回消息
-
-**2020/03/25**
-* 修复7.1.1的网络问题,是retrofit2库最新版本的bug,暂时退回上版本
-* 去除下载路径的配置,减少错误
-* 添加隐藏状态栏是否扩展到刘海
-
-**2020/03/24**
-* txt文件第一章之前的文字不再放到简介里
-* 优化txt目录识别,章节超过3万字判断为目录识别错误重新识别
-* 修复文件关联 by [wqfantexi](https://github.com/wqfantexi)
-
-**2020/03/22**
-* 添加文件关联 by [wqfantexi](https://github.com/wqfantexi)
-* 手动排序可以了,在书架整理里面拖动排序
-* 删除分组时同时删除书籍里的分组信息,下次添加新分组时不会自动出现在分组内
-* 修复换源丢失分组信息的bug
-* 修复部分朗读引擎不自动朗读下一章的bug
-
-**2020/03/21**
-* 详情页点击书名搜索
-
-**2020/03/20**
-* 自动备份文件和手动备份文件分开
-* 修复一些rss收藏取消不了的bug
-* 修复rss请求头无效bug
-
-**2020/03/19**
-* 美化界面我的 by [yangyxd](https://github.com/yangyxd)
-* 优化搜索
-
-**2020/03/18**
-* 尝试修复搜索时崩溃
-* 解决看过书籍的移到顶部需要向上滚动才能看到的bug
-* 只有再书源被删除找不到书源时才会自动换源
-* 美化界面 by [yangyxd](https://github.com/yangyxd)
-* 订阅后台播放
-
-**2020/03/16**
-* 修复滚动模式切换章节位置不归0的bug
-* 修复文字选择更多菜单在部分手机上报错的bug
-* 修复文字选择菜单问题
-
-**2020/03/15**
-* 加载正文无书源时自动换源
-
-**2020/03/14**
-* 修改导航栏图标
-
-**2020/03/13**
-* 更改书架控件,ViewPager2替换回2.0使用的ViewPager,解决下拉不流畅问题
-* 修复点击作者搜索后,打开的详情页还是原来的书籍的bug
-* 修改朗读菜单
-* 优化rss朗读
-
-**2020/03/12**
-* 导入本地添加需要权限模式
-
-**2020/03/11**
-* 修复调节上边距时下边距一起动的bug
-* 适配沚水的web阅读 by [六月](https://github.com/Celeter)
-* 分组管理页面调整 by [yangyxd](https://github.com/yangyxd)
-
-**2020/03/10**
-* 优化文字选择菜单弹出位置
-* 添加屏幕方向控制
-* 添加点击作者搜索
-
-**2020/03/09**
-* 底部文字对齐
-* 主题添加阴影调节 by [yangyxd](https://github.com/yangyxd)
-
-**2020/03/08**
-* 订阅长按保存图片
-* 订阅全屏播放
-* 书架全部分组可以隐藏了
-* 内置web书架基本能用了 by [六月](https://github.com/Celeter)
-* 书架整理加入未分组
-* 显示总进度
-* 隐藏状态栏时,标题显示在上方
-
-**2020/03/07**
-* 添加标题上下间距调整
-* 添加标题大小调整
-* 书籍整理添加批量启用禁用更新
-* 换源禁用书源不显示
-* 修复搜索界面简介最下面显示半行文字
-* 搜索历史改为多行
-
-**2020/03/06**
-* 添加隐藏标题
-* 行距段距改成倍距,根据字体大小变化
-* 修复翻页时右下角页数闪烁
-* 修复朗读错行
-* 添加底部分隔线,开关在边距设置里
-
-**2020/03/05**
-* 修复翻页动画
-* 修复主题模式跟随
-* 修复滚动翻页切换章节时跳动
-* 适配阅读3.0的web做源
-* 本地目录规则网络导入
-
-**2020/03/04**
-* 修复仿真翻页动画
-* 添加阅读记录同步,正常退出进入软件时同步阅读记录
-
-**2020/03/03**
* 修复bug
-* 优化排版,确保段距为0时每行在相同的位置
-* 修复底部遮挡
-
-**2020/03/02**
-* 添加书源登录
-* 替换规则实时生效
-* 页面最后一行计算是否能放下时不计算行距
-* 优化翻页动画
-* 优化书源校验
-* 按键翻页有动画了
-
-**2020/03/01**
-* 修复书源解析的一个bug
-* 添加底部操作栏颜色配置
-* 修复滚动点击翻页,修复滚动最后一页显示加载中
-* 去除备份恢复默认路径
-* 尝试修复部分手机一键导入书源报错
-* 翻页还有些bug不用反馈了,我已经知道,会修复的
-
-**2020/02/29**
-* 添加书源一键导入
-* 修复主题模式跟随系统
-* 修复书源校验
-* 添加书架排序
-* 添加点击翻页开关
-* 修复共用布局没有记住配置的bug
-
-**2020/02/28**
-* 解决阅读界面部分字体超出范围的问题
-* 修复背景切换有时空白的bug
-* 修复滚动翻页问题
-
-**2020/02/27**
-* 修复bug,边距调节,换源等一些bug,记不清了
-* 修复默认字体问题
-* 改了下包名,好上架应用市场
-
-**2020/02/26**
-* 修复仿真翻页
-* 功能添加: 选择默认字体时, 可选择字体默认字体(非衬线), 系统衬线字体, 系统等宽字体by [hingbong](https://github.com/hingbong)
-
-**2020/02/25**
-* 优化文本选择和滚动,感觉很完美了
-
-**2020/02/24**
-* 滚动暂时可以滚了,先这样吧,头大
-* 紧急修复朗读报错的bug
-
-**2020/02/23**
-* 修复BUG
-* 本地目录正则自定义完成
-* 选择文本修复框选不全的问题,增加操作按钮
-
-**2020/02/22**
-* 长按选择完成
-
-**2020/02/21**
-* 重写了阅读界面,实现了段距调整,两端对齐,页眉页脚调整
-* 选择文本暂不可用,滚动暂不可用,仿真翻页还有问题
-
-**2020/02/19**
-* 导出功能完成
-* 其它一些优化,仿真翻页有点问题,还没找到问题所在
-
-**2020/02/15**
+* 网络访问框架修改为RxHttp, 有bug及时反馈
+* 优化进度同步
+* 换源界面添加分组选择
+* 沉浸模式时阅读界面导航栏透明
+
+**2020/12/09**
+
* 修复bug
-* 添加一个图标
-* 阅读界面文本选择开关
-* 书源管理发现开启关闭标志
+* 优化中文排序
+* 优化编码识别
+* 选择文字时优先选词
+* 优化进度同步,进入书籍时同步,每次同步单本书,减少同步文件大小
-**2020/02/14**
-* 书籍分组支持一本书籍在多个分组,既可以在追更,又可以在玄幻
-* 搜索界面限制刷新频率,每秒刷新一次
-* 添加一种图标,2.0的老图标
+**2020/12/04**
-**2020/02/13**
-* 修复BUG
-* 优化已下载检测,解决目录卡顿
-* 添加切换图标
+* 阅读进度从页数改为字数,排版变化时定位更准确
+* 修改viewBinding
+* 修复中文排序
+* 去掉FontJs规则,可以写在替换规则里,示例可在帮助文档查看
-**2020/02/12**
-* 修复bug
-* 优化,网页编码优先使用书源配置的编码
-* 其它一些优化
-* 添加简繁转换
+**2020/11/18**
+
+* 优化导航栏
+* js添加java.log(msg: String)用于调试时输出消息
+* js添加cookie变量,方法见io.legado.app.help.http.api.CookieManager
+* js添加cache变量,可以用来存储token之类的临时值,可以设置保存时间,方法见io.legado.app.help.CacheManager
+* 需要token的网站可以用js来写了,比如阿里tts
-**2020/02/10**
-* 多页目录并行获取解析
-* 优化详情页
-* 优化换源页面,添加换源是否加载目录配置
-* 换源顺序按书源顺序排列
+**2020/11/15**
-**2020/02/09**
-* 优化书源管理,备份恢复
-* 主题色修改,底部操作栏更明显
+* 正文规则添加字体规则,返回ByteArray
+* js添加方法:
-**2020/02/08**
-* 书架分组调整顺序后,书架及时变动
+```
+base64DecodeToByteArray(str: String?): ByteArray?
+base64DecodeToByteArray(str: String?, flags: Int): ByteArray?
+```
-**2020/02/07**
-* 优化
-* 书源校验
-* 书架整理
+**2020/11/07**
-**2020/02/05**
-* 修复bug
-* Rss收藏功能完成
-* Rss已读标记不会再丢失
+* 详情页菜单添加拷贝URL
+* 解决一些书名太长缓存报错的bug
+* 添加备份搜索记录
+* 替换编辑界面添加正则学习教程
+* 去除解析目录时拼接相对url,提升解析速度
+* 自动分段优化 by [tumuyan](https://github.com/tumuyan)
+* web支持图片显示 by [六月](https://github.com/Celeter)
-**2020/02/04**
-* 主界面切换时自动隐藏键盘
-* 添加本地书籍完成,解析txt文件完成,本地txt可以看了
-* 封面换源,书籍信息界面点击封面弹出封面换源界面
-* 默认封面绘制书名和作者
-* 修复在线朗读遇到单独标点,停止朗读的问题
+**2020/10/24**
-**2020/02/02**
-* merged commit e584606, rss修复BaseURL模式下部分图片无法加载, 修复可能出现的乱码
-* 菜单添加网址功能完成
+* 修复选择错误的bug
+* 修复长图最后一张不能滚动的bug
+* js添加java.getCookie(sourceUrl:String, key:String? = null)来获取登录后的cookie
+ by [AndyBernie](https://github.com/AndyBernie)
-**2020/01/31**
-* 修复搜索闪退,因为默认线程为0了
+```
+java.getCookie("http://baidu.com", null) => userid=1234;pwd=adbcd
+java.getCookie("http://baidu.com", "userid") => 1234
+```
-**2020/01/30**
-* 优化缓存文件夹选择,不再需要存储权限
-* 修复替换净化导入报错的bug
+* 修复简繁转换没有处理标题
+* 每本书可以单独设置翻页动画,在菜单里
+* 添加重新分段功能,针对每本书,在菜单里,分段代码来自[tumuyan](https://github.com/tumuyan)
-**2020/01/27**
-* 添加根据系统主题切换夜间模式
-* 合并Modificator提交的代码
+**2020/10/18**
-**2020/01/26**
-* 修复bug
-* 未加入书架可查看目录
+* 优化分组管理,默认分组可以重命名了
+* 修复书架空白的bug,是constraintlayout库新版本的bug
+* 修复分组和崩溃bug
-**2020/01/24**
-* 添加线程数配置
-* 记住退出时的书架
-* 添加屏幕超时配置
+**2020/10/11**
-**2020/01/11**
-* RSS阅读界面添加朗读功能
-* 其它一些优化
-* 合并KKL369提交的代码,重写LinearLayoutManager,修复书籍目录模糊搜索后scrollToPosition在可见范围不置顶
-
-**2020/01/10**
-* 合并KKL369提交的代码
-
-**2020/01/08**
-* 导入本地源不再需要存储权限
-
-**2020/01/07**
-* 修复备份问题
-* 设置背景不再需要存储权限
-
-**2020/01/06**
-* 适配Android 10 权限
-* 备份恢复不再需要存储权限
-
-**2020/01/03**
-* 适配Android 10 权限
-* 导入旧版本配置不在需要存储权限
-* 选择字体不在需要存储权限
-* 修改书源调试
- - 调试搜索>>输入关键字,如:`系统`
- - 调试发现>>输入发现URL,如:`月票榜::https://www.qidian.com/rank/yuepiao?page={{page}}`
- - 调试详情页>>输入详情页URL,如:`https://m.qidian.com/book/1015609210`
- - 调试目录页>>输入目录页URL,如:`++https://www.zhaishuyuan.com/read/30394`
- - 调试正文页>>输入正文页URL,如:`--https://www.zhaishuyuan.com/chapter/30394/20940996`
-* 修改订阅中自动添加style的情景
- 订阅源的内容规则中存在`
+
+
+
+
+
+
+