diff --git a/README.md b/README.md
index 27b128f..3c1d328 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,10 @@ Xposed 微信辅助模块,实现消息防撤回、模拟位置、运动步数
![01.png](https://raw.githubusercontent.com/wuxiaosu/XposedWechatHelper/master/screenshots/01.png)
![02.png](https://raw.githubusercontent.com/wuxiaosu/XposedWechatHelper/master/screenshots/02.png)
## 下载
-- release from [github](https://github.com/wuxiaosu/XposedWechatHelper/releases)
-- release from [酷安](https://www.coolapk.com/apk/180057)
+- release from [github](https://github.com/wuxiaosu/XposedWechatHelper/releases)
+- ~~release from [酷安](https://www.coolapk.com/apk/180057)~~(被和谐了)
+## v1.11
+更改了实现方式;
## v1.09
新增
微信登录自动确认;
diff --git a/build.gradle b/build.gradle
index ed7ef8e..a22026b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.1.2'
+ classpath 'com.android.tools.build:gradle:3.1.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
diff --git a/wechathelper/build.gradle b/wechathelper/build.gradle
index 4649f50..2f7ba7f 100644
--- a/wechathelper/build.gradle
+++ b/wechathelper/build.gradle
@@ -6,8 +6,8 @@ android {
applicationId "com.wuxiaosu.wechathelper"
minSdkVersion 21
targetSdkVersion 23
- versionCode 10
- versionName "1.09"
+ versionCode 12
+ versionName "1.11"
}
signingConfigs {
@@ -22,6 +22,8 @@ android {
buildTypes {
release {
minifyEnabled true
+ shrinkResources true
+ zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
@@ -89,5 +91,5 @@ dependencies {
}
static def buildTime() {
- return new Date().format("yyMMddHHss", TimeZone.getTimeZone("GMT+08"))
+ return new Date().format("yyMMddHHmm", TimeZone.getTimeZone("GMT+08"))
}
\ No newline at end of file
diff --git a/wechathelper/dic.txt b/wechathelper/dic.txt
new file mode 100755
index 0000000..7f3198a
--- /dev/null
+++ b/wechathelper/dic.txt
@@ -0,0 +1,4586 @@
+0000O000000o
+000O00000Oo
+000O00000o0
+000O00000o
+000O00000oO
+000O00000oo
+000O0000O0o
+000O0000OOo
+000O0000Oo0
+000O0000Oo
+000O0000OoO
+00O0000Ooo
+00O0000o00
+00O0000o0
+00O0000o0O
+00O0000o0o
+00O0000o
+00O0000oO0
+00O0000oO
+00O0000oOO
+000O0000oOo
+00O0000oo0
+00O0000oo
+00O0000ooO
+00O0000ooo
+00O00oOooO
+00O00oOooo
+00O000O00o
+00O000O0OO
+00O000O0Oo
+000O00oOoOo
+00O000O0o0
+00O000O0o
+00O000O0oO
+00O000O0oo
+00O000OO00
+00O000OO0o
+00O000OO
+00O000OOOo
+00O000OOo0
+000O000OOo
+00O000OOoO
+00O000OOoo
+00O000Oo00
+00O000Oo0
+00O000Oo0O
+00O000Oo0o
+00O000OoO0
+00O00O0Oo
+00O000OoO
+000O000OoOO
+00O000OoOo
+00O000Ooo0
+00O000Ooo
+00O000OooO
+00O000Oooo
+00O000o000
+00O000o00
+00O000o00O
+00O000o00o
+000O000o0
+00O000o0O0
+00O000o0O
+00O000o0OO
+00O000o0Oo
+00O000o0o0
+00O000o0o
+00O000o0oo
+00O000o
+00O000oO00
+000O000oO0
+00O000oO0O
+00O000oO0o
+00O000oO
+00O000oOO0
+00O000oOO
+00O000oOOO
+00O000oOOo
+00O000oOo0
+00O000oOo
+000O000oOoO
+00O000oOoo
+00O000oo0
+00O000oo0O
+00O000oo0o
+00O000oo
+00O000ooO0
+00O000ooO
+00O000ooOO
+00O000ooOo
+000O000ooo0
+00O000ooo
+00O000oooO
+00O000oooo
+00oooOoO
+00O00oOOoo
+00O00O000o
+00O00O00Oo
+00O00O00o0
+00O00O00o
+000O00O00oO
+00O00O00oo
+00O00O0O0o
+00O00O0OO
+00O00O0OOo
+00O00O0Oo0
+00O00O0OoO
+00O00O0Ooo
+00O00O0o00
+00O00O0o0
+00O00O0o0O
+0O00O0o0o
+0O00O0o
+0O00O0oO0
+0O00O0oOO
+0O00O0oOo
+0O00O0oo0
+0O00O0oo
+0O00O0ooO
+0O00O0ooo
+00O00OO0O
+0O00OO0o
+0O00OOOo
+0O00OOo0
+0O00OOo
+0O00OOoO
+0O00OOoo
+0O00Oo00
+0O00Oo00o
+0O00Oo0
+00O00Oo0OO
+0O00Oo0Oo
+0O00Oo0o0
+0O00Oo0o
+0O00Oo0oO
+0O00OooOO
+0O00Oo0oo
+0O00Oo
+0O00OoO0
+0O00OoO0o
+00O00OoO0O
+0O00Ooo
+0O00OoO
+0O00OoOO0
+0O00OoOO
+0O00OoOo0
+0O00OoOo
+0O00OoOoO
+0O00OoOoo
+0O00Ooo00
+00O00Ooo0
+0O00Ooo0O
+0O00Ooo0o
+0O00OooO0
+0O00OooO
+0O00OooOo
+0O00Oooo0
+0O00Oooo
+0O00Ooooo
+0O00OoooO
+00O00o0000
+0O00o000
+0O00o000O
+0O00o000o
+0O00o00
+0O00o00O0
+0O00o00O
+0O00o00OO
+0O00o00Oo
+0O00o00o0
+00O00o00o
+0O00o00oO
+0O00o00oo
+0O00o0
+0O00o0O00
+0O00o0O0
+0O00oo000
+0O00o0O0O
+0O00o0O0o
+0O00o0O
+00O00o0OO0
+0O00o0OO
+0O00o0OOO
+0O00o0OOo
+0O00o0Oo0
+0O00o0Oo
+0O00o0OoO
+0O00o0Ooo
+0O00o0o00
+0O00o0o0
+00O00o0o0O
+0O00o0o0o
+0O00o0o
+0O00o0oO0
+0O00o0oO
+0O00o0oOO
+0O00o0oOo
+0O00o0oo0
+0O00o0oo
+0O00o0ooO
+000O00o0ooo
+00O00o
+00O00oO0O0
+00O00oO000
+00O00oO00
+00O00oO00O
+00O00oO0OO
+00O00oO00o
+00O00oO0
+00O00oO0O
+00O00ooO00
+0O00oO0Oo
+0O00oO0o0
+0O00oO0o
+0O00oO0oO
+0O00oO0oo
+0O00oO
+0O00oOO0o
+0O00oOO00
+0O00oOO0
+00O00oOO0O
+0O00oOo
+0O00oOO
+0O00oOOO0
+0O00oOOO
+0O00oOOOO
+0O00oOOOo
+0O00oOOo0
+0O00oOOo
+0O00oOOoO
+00O00oOo00
+0O00oOo0
+0O00oOo0O
+0O00oOo0o
+0O00oOoO
+0O00oOoOO
+0O00oOoo0
+0O00oOoo
+0O00oo00
+0O00oo00O
+00O00oo00o
+0O00oo0
+0O00oo0O0
+0O00oo0O
+0O00oo0OO
+0O00oo0Oo
+0O00oo0o0
+0O00oo0o
+0O00oo0oo
+0O00oo
+00O00ooO0
+0O00ooO0O
+0O00ooO0o
+0O00ooO
+0O00ooOo0
+0O00ooOO0
+0O00ooOO
+0O00ooOOO
+0O00ooOOo
+0O00ooOo
+00O00ooOoO
+0O00ooOoo
+0O00ooo00
+0O00ooo0
+0O00ooo0o
+0O00ooo
+0O00oooO0
+0O00oooO
+0O00oooOO
+0O00oooOo
+00O00oooo0
+0O00oooo
+0O00ooooo
+0ooooooo
+0O0O00oO
+0O0O000o
+0O0O00OO
+0O0O00Oo
+0O0O00o0
+0O0O00o
+00O0O0O0o
+0O0O0O
+0O0O0OO0
+0O0O0OO
+0O0O0OOO
+0O0O0OOo
+0O0O0Oo0
+0O0O0OoO
+0O0O0Ooo
+0O0O0o00
+00O0O0o0
+0O0O0o0O
+0O0O0o0o
+0O0O0o
+0O0O0oO0
+0O0O0oO
+0O0O0oOO
+0O0O0oOo
+0O0O0oo0
+0O0O0oo
+000O0O0ooO
+00O0O0ooo
+00O0OoOo
+00O0OoOO
+00O0OO00O
+00O0OO00o
+00O0OO0O
+00O0Oo0o0
+00O0OO0Oo
+00O0OO0o0
+00O0OO0oO
+0O0OO0oo
+0O0OOO00
+0O0OOoo
+0O0OOoO
+0O0OOO0
+0O0OOO0O
+0O0OOO0o
+0OO0oO
+0O0OOOO
+00O0OOOOO
+0O0OOOOo
+0O0OOOo0
+0O0OOOo
+0O0OOOoO
+0O0OOOoo
+0O0OOo00
+0O0OOo0O
+0O0OOo0o
+0O0OOo
+00O0OOoO0
+0O0OOoOO
+0O0OOoOo
+0O0OOoo0
+0O0OOooO
+0O0OOooo
+0O0Oo000
+0O0Oo00
+0O0Oo00O
+0O0Oo00o
+00O0Oo0
+0O0Oo0O0
+0O0Oooo
+0O0Oo0O
+0O0Oo0OO
+0O0Oo0Oo
+0O0Oo0o
+0O0Oo0oO
+0O0Oo0oo
+0o00o00O
+00O0Oo
+0O0OoO00
+0O0OoO0
+0O0OoO0O
+0OooOO
+0OoO0o
+0O0OoO
+0O0OoOO0
+0O0OoOOO
+0O0OoOOo
+00O0OoOo0
+0O0OoOoO
+0O0OoOoo
+0O0Ooo00
+0O0Ooo0
+0O0Ooo0O
+0O0Ooo0o
+0O0Ooo
+0O0OooO0
+0O0OooO
+00O0OooOO
+0O0OooOo
+0O0Oooo0
+0O0OoooO
+0O0Ooooo
+0O0o0000
+0O0o000
+0O0o000O
+0O0o000o
+0O0o00
+00O0o00O0
+0O0o00O
+0O0o00OO
+0O0o00Oo
+0O0o00o0
+0O0o00o
+0O0o00oO
+0O0o00oo
+0O0o0
+0O0o0O00
+00O0o0O0
+0O0o0O0O
+0O0o0O0o
+0O0o0O
+0O0o0OO0
+0O0oo0o
+0O0o0OO
+0O0o0OOO
+0O0o0OOo
+0O0o0Oo0
+000O0o0Oo
+00O0o0OoO
+00O0o0Ooo
+00O0o0o00
+00O0o0o0
+00O0o0o0O
+00O0o0o0o
+00O0o0oO0
+00O0o0oO
+00O0o0oOO
+00O0o0oOo
+0O0o0oo
+0O0o0ooO
+0oOOoOO
+0O0o
+0O0oO000
+0O0oO00
+0O0oO0oO
+0O0oO00O
+0O0oO00o
+00O0oO0
+0O0oO0O0
+0O0oO0O
+0O0oO0OO
+0O0oO0Oo
+0O0oO0o0
+0O0oO0o
+0O0oO0oo
+0o0Oo0o0
+0O0oO
+00O0oOO00
+0O0oOO0
+0o00O00O0
+0O0oOO0O
+0O0oOO0o
+0O0oOO
+0O0oOOO0
+0O0oOOOo
+0O0oOOo0
+0Oo0OOo
+00O0oOOo
+0O0oOOoO
+0O0oOOoo
+0O0oOo00
+0O0oOo0
+0ooO0Ooo
+0O0oOo0O
+0O0oOo0o
+0O0oOo
+0O0oOoO0
+00O0oOoO
+0O0oOoOO
+0O0oOoOo
+0OOoOoo
+0O0oOoo0
+0O0oOoo
+0O0oOooO
+0O0oOooo
+0O0oo000
+0O0oo00
+00O0oo00O
+0O0oo00o
+0O0oo0
+0O0oo0O0
+0O0oo0O
+0O0oo0OO
+0O0oo0Oo
+0O0oo0o0
+0O0oo0oO
+0O0oo0oo
+00O0oo
+0O0ooO00
+0O0ooOo
+0O0oooo
+0O0oooO
+0O0ooO0
+0O0oooOo
+0O0ooO0O
+0O0ooO0o
+0O0ooO
+00O0ooOO0
+0O0ooOO
+0O0ooOOO
+0O0ooOOo
+0O0ooOo0
+0O0ooOoO
+0O0ooOoo
+0O0ooo00
+0O0ooo0
+0O0ooo0O
+00O0ooo0o
+0O0ooo
+0O0oooO0
+0O0oooOO
+0O0oooo0
+0O0ooooO
+0O0ooooo
+0OO0000
+0OO0000o
+0OoOOO
+000OO000OO
+00OO000Oo
+00OO000o0
+00OO000o
+00OO000oO
+00OO000oo
+00OO00OO
+00OO00O0
+00OO00O0o
+00OO00O
+00OO00OOO
+0OO00OOo
+0OO00Oo0
+0OO0ooO
+0OO00Oo
+0OO00OoO
+0OO00Ooo
+0OO00o00
+0OO00o0O
+0OO00o0o
+00OO00oO0
+0OO00oO
+0OO00oOO
+0OO00oOo
+0OO00oo0
+0OO00oo
+0OO00ooO
+0OO00ooo
+0OO0O00o
+0OO0O0O
+00OO0O0OO
+0OO0O0Oo
+0OO0O0o0
+0OO0oOo
+0OO0oOO
+0OO0O0o
+0OO0O0oO
+0OO0O0oo
+0oOo00
+0OO0OO0o
+00OOo00
+0OO0OO
+0OO0OOO
+0OO0OOOO
+0OO0OOOo
+0OO0OOo0
+0OO0OOo
+0OO0OOoO
+0OO0OOoo
+0OO0Oo00
+00OO0Oo0
+0OO0Oo0O
+0OO0Oo0o
+0Oo0Oo0O
+0OO0OoO0
+0OO0OoO
+0OO0OoOO
+0Oo0Ooo0
+0OO0OoOo
+0OO0Ooo0
+00OO0Ooo
+0OO0OooO
+0OO0Oooo
+0OO0o000
+0OO0o00
+0OO0o00O
+0OO0o00o
+0OO0o0
+0OO0o0O0
+0OO0o0OO
+00OO0o0Oo
+0OO0o0o0
+0OO0o0o
+0OO0o0oO
+0OO0o0oo
+0OO0o
+0OO0oO00
+0OO0oO0
+0OO0oO0O
+0OO0oO0o
+00OO0oOO0
+0OoOOoOo
+0OO0oOOO
+0OO0oOOo
+0OO0oOo0
+0OO0oOoO
+0OO0oOoo
+0OO0oo00
+0OO0oo0
+0OO0oo0O
+00OO0oo0o
+0OO0oo
+0OO0ooO0
+0OO0ooOO
+0OO0ooOo
+0OO0ooo0
+0OO0ooo
+0OO0oooO
+0OO0oooo
+0OOO000o
+000OOO00
+00OOO00O0
+00OOO00Oo
+00OOO00o0
+00OOO00o
+00OOO00oO
+00OOO00oo
+00OOO0O0O
+00OOO0O0o
+00OOO0O
+00o00OOOOO
+0OOO0OO0
+0OOO0OOO
+0OOO0OOo
+0OOO0Oo0
+0OOO0oO
+0OOO0Oo
+0OOO0OoO
+0OOO0Ooo
+0OOO0o00
+00OOO0o0
+0OOO0o0O
+0OOO0o0o
+0OOO0o
+0OOO0oO0
+0OOO0oOO
+0OOO0oOo
+0OOO0oo0
+0OOO0oo
+0OOO0ooO
+00OOO0ooo
+0OOO
+0OOOO00O
+0OOOO00o
+0OOOO0
+0OOOOoO
+0OOOOo0
+0OOOOoo
+0OOOO0O
+0OOOO0OO
+00OOOO0Oo
+0OOOO0o0
+0OOOO0oO
+0OOOO0oo
+0OOOOO00
+0OOOOO0
+0OOOOO0o
+0OOOOO
+0OOOOOO
+0OOOOOOO
+00OOOOOOo
+0OOOOOo0
+0OOooOo
+0OOoooo
+0OOOOOo
+0OOOOOoO
+0OOOOOoo
+0OOOOo00
+0OOOOo0O
+0OOOOo0o
+00OOOOo
+0OOOOoO0
+0OOOOoOO
+0OOOOoOo
+0OOOOoo0
+0OOOOooO
+0OOOOooo
+0OOOo000
+0OOo000
+0OOOo00
+00OOOo00O
+0OOOo00o
+0OOOo0
+0ooOOo00
+0OOOo0O0
+0OOOo0O
+0OOOo0OO
+0OOOo0Oo
+0OOOo0o0
+0OOOo0o
+00OOOo0oO
+0OOOo0oo
+0OOOo
+0OOOoO00
+0OOOoO0
+0OOOoO0O
+0o0ooo0OO
+0OOOoO0o
+0OOOoO
+0OOOoOO0
+00OOOoOO
+0OOOoOOO
+0OOOoOOo
+0OOOoOo0
+0OOOoOo
+0OOOoOoO
+0OOOoOoo
+0ooO00O0
+0OOOoo00
+0OOOoo0
+000o00O0oO0
+00OOOoo0O
+00OOOoo0o
+00OOOoo
+00OOOooO0
+00OOOooO
+00o0OOoOoo
+00OOOooOO
+00OOOooOo
+00OOOooo0
+00OOOooo
+0OOOoooO
+0OOOoooo
+0OOo0000
+0OOo000O
+0OOo000o
+0OOo00O0
+0OOo00O
+0OOo00OO
+0OOo00Oo
+00OOo00o0
+0OOo00o
+0OOo00oO
+0OOo00oo
+0ooOo
+0OOo0
+0OOo0O00
+0OOo0OO
+0OOo0Oo
+0OOoo00
+00OOo0O0
+0OOo0O0O
+0OOo0O0o
+0OOoOOoO
+0OOo0OO0
+0OOo0OOO
+0OOo0OOo
+0OOo0Oo0
+0OOo0OoO
+0OOo0Ooo
+00OOo0o00
+0OOo0o0
+0OOo0o0O
+0OOo0o0o
+0OOo0o
+0OOo0oO0
+0OOo0oO
+0OOo0oOO
+0OOo0oOo
+0OOo0oo0
+00OOo0oo
+0OOo0ooO
+0OOo0ooo
+0OOoO000
+0OOoO00
+0OOoO00O
+0OOoO00o
+0OOoO0
+0OOoO0O0
+0OOoO0o
+00OOoO0O
+0OOoO0OO
+0OOoO0Oo
+0OOoO0o0
+0OOoO0oO
+0OOoO0oo
+0OOoO
+0OOoOO00
+0OOoOO0O
+0OOoOO0o
+00OOoOO
+0OOoOOO0
+0OOoOOO
+0OOoOOOO
+0OOoOOOo
+0OOoOOo0
+0OOoOOo
+0OOoOOoo
+0OOoOo00
+0OOoOo0
+00OOoOo0O
+0OOoOo0o
+0OOoOo
+0OOoOoO0
+0oO0OO0
+0OOoOoO
+0OOoOoOO
+0OOoOoOo
+0OOoOoo0
+0OOoOooO
+00OOoOooo
+0OOoo000
+0OOoo00O
+0OOoo00o
+0OOoo0
+0OOoo0O0
+0OOoo0O
+0OOoo0OO
+0OOoo0Oo
+0OOoo0o0
+000OOoo0o
+00OOoo0oO
+00OOoo0oo
+00OOoo
+00OOooO00
+00OOooO0
+00OOooO0O
+00OOooO0o
+00OOooO
+00OOooOO0
+00OOooOO
+0OOooOOO
+0OOooOOo
+0OOooOo0
+0OOooOoO
+0OOooOoo
+0OOooo00
+0OOooo0
+0OOooo0O
+0OOooo0o
+00OOooo
+0OOoooO0
+0OOoooO
+0OOoooOO
+0OOoooOo
+0OOoooo0
+0OOooooO
+0OOooooo
+0Oo00000
+0Oo0000O
+00Oo0000o
+0Oo000
+0Oo000O0
+0Oo000O
+0Oo000OO
+0Oo000Oo
+0Oo000o0
+0Oo000o
+0Oo000oO
+0Oo000oo
+00Oo00
+0Oo00O00
+0Oo00O0
+0Oo0o0Oo
+0Oo00O0O
+0Oo00O0o
+0Oo00O
+0Oo00OO0
+0Oo0o0o
+0Oo00Oo
+00Oo00OO
+0Oo00OOO
+0Oo00OOo
+0Oo00Oo0
+0Oo0o0O0
+0Oo00OoO
+0Oo00Ooo
+0Oo00o00
+0Oo00o0
+0Oo00o0O
+00Oo00o0o
+0Oo00o
+0Oo00oO0
+0Oo00oOO
+0Oo00oo0
+0Oo00oo
+0Oo00ooO
+0Oo00ooo
+0Oo0
+0Oo0O000
+00Oo0O00
+0Oo0O00O
+0Oo0O00o
+0Oo0O0
+0Oo0O0O0
+0Oo0O0O
+0Oo0O0OO
+0Oo0O0Oo
+0Oo0O0o0
+0Oo0O0o
+00Oo0O0oO
+0Oo0O0oo
+0o00oO00
+0o00OO00
+0Oo0O
+0Oo0OO00
+0Oo0OO0
+0Oo0OO0O
+0Oo0OO0o
+0Oo0OO
+00Oo0OOO0
+0Oo0OOOO
+0Oo0OOOo
+0Oo0OOo0
+0Oo0OOoO
+0Oo0OOoo
+0Oo0Oo00
+0Oo0Oo0
+0Oo0Oo0o
+0Oo0Oo
+000Oo0OoO0
+00Oo0OoO
+00Oo0OoOo
+00Oo0Ooo
+00Oo0OooO
+00Oo0Oooo
+00Oo0o000
+00Oo0o00
+00Oo0o00O
+00Oo0o00o
+00Oo0o0
+0Oo0o0O
+0Oo0o0o0
+0Oo0o0oO
+0Oo0o0oo
+0Oo0o
+0Oo0oO00
+0Oo0ooO
+0Oo0oOO
+0Oo0oo0
+00Oo0ooo
+0Oo0oO0
+0Oo0oO0O
+0Oo0oO0o
+0Oo0oO
+0Oo0oOO0
+0Oo0oOOO
+0Oo0oOOo
+0Oo0oOo0
+0Oo0oOo
+00Oo0oOoO
+0Oo0oOoo
+0Oo0oo00
+0Oo0oo0O
+0Oo0oo0o
+0Oo0oo
+0Oo0ooO0
+0Oo0ooOO
+0Oo0ooOo
+0Oo0ooo0
+00Oo0oooO
+0Oo0oooo
+0Oo
+0OoO0000
+0OoO000
+0OoO000O
+0OoO000o
+0OoO00O0
+0OoO00O
+0OoO00OO
+00OoO00Oo
+0OoO00o0
+0OoO00o
+0OoO00oO
+0OoO00oo
+0OoO0
+0OoO0O00
+0OoO0Oo
+0OoO0O0
+0OoO0O0O
+00OoO0O0o
+0OoO0O
+0OoO0OO0
+0OoO0OO
+0OoO0OOO
+0OoOo00O
+0OoO0OOo
+0OoO0Oo0
+0OoO0OoO
+0OoO0Ooo
+00OoO0o00
+0OoO0o0
+0OoO0o0O
+0OoO0o0o
+0OoO0oO0
+0OoO0oo
+0OoO0oO
+0OoO0oOO
+0OoO0oOo
+0OoO0oo0
+00OoO0ooO
+0OoO0ooo
+0OoO
+0OoOO000
+0OoOOo0
+0OoOOOO
+0OoOO0O
+0OoOOoo
+0OoOOoO
+0OoOOO0
+00OoOOOo
+0OoOoOo
+0OoOoOO
+0OoOO00
+0OoOO00O
+0OoOO00o
+0OoOO0
+0OoOO0O0
+0OoOO0OO
+0OoOO0Oo
+000OoOO0o0
+00OoOO0o
+00OoOO0oO
+00OoOO0oo
+00OoOo
+00OoOO
+00OoOOO0O
+00OoOOO0o
+00OoOOOO0
+00OoOOOOO
+00OoOOOOo
+0OoOOOo0
+0OoOOOoO
+0OoOOOoo
+0OoOOo00
+0OoOOo0O
+0OoOOo0o
+0OoOOo
+0OoOOoO0
+0OoOOoOO
+00OoOOoo0
+0OoOOooO
+0OoOOooo
+0OoOo000
+0OoOooo
+0OoOoo0
+0OoOo00
+0OoOo00o
+0OoOo0
+0OoOo0O0
+00OoOo0o
+0OoOo0O
+0OoOo0OO
+0OoOo0Oo
+0OoOo0o0
+0OoOo0oO
+0OoOo0oo
+0OoOoO00
+0OoOoO0
+0OoOoO0O
+00OoOoO0o
+0OoOoO
+0OoOoOO0
+0OoOoOOO
+0OoOoOOo
+0OoOoOo0
+0OoOoOoO
+0OoOoOoo
+0OoOoo00
+0OoOoo0O
+00OoOoo0o
+0OoOoo
+0OoOooO0
+0OoOooO
+0OoOooOO
+0OoOooOo
+0OoOooo0
+0OoOoooO
+0OoOoooo
+0Ooo0000
+00Ooo000
+0Ooo000O
+0Ooo000o
+0Ooo00
+0Ooo00O0
+0Ooo00O
+0Ooo00OO
+0Ooo00Oo
+0Ooo00o0
+0Ooo00o
+00Ooo00oO
+0o00oo00o
+0Ooo00oo
+0Ooo0
+0Ooo0O00
+0Ooo0O0
+0Ooo0O0O
+0Ooo0O0o
+0Ooo0O
+0Ooo0OO0
+00Oooo00
+0Ooo0oO
+0Ooo0Oo
+0Ooo0OO
+0o000O0OO
+0o000oO0O
+0Ooo0OOO
+0Ooo0OOo
+0Ooo0OoO
+0Ooo0Ooo
+00Ooo0o00
+0Ooo0o0
+0Ooo0o0o
+0Ooo0o
+0Ooo0oO0
+0Ooo0oOO
+0Ooo0oOo
+0Ooo0oo0
+0Ooo0oo
+0Ooo0ooO
+00Ooo0ooo
+0o0oo
+0Ooo
+0OooO000
+0OooO0O
+0Ooooo0
+0OooooO
+0OoooOO
+0OoooOo
+0OooO00
+0OooO00O
+OooO00o
+OooO0O0
+OooO0OO
+OooO0Oo
+OooO0o0
+OooO0o
+OooO0oO
+OooO0oo
+OooO
+0OooOO00
+OooOO0
+OooOO0O
+OooOO0o
+OooOOO0
+OooOOO
+OooOOOO
+OooOOOo
+OooOOo0
+OooOOo
+0OooOOoO
+OooOOoo
+OooOo00
+OooOo0
+OooOo0O
+OooOo0o
+OooOo
+OooOoO0
+OooOoO
+OooOoOO
+0OooOoOo
+OooOoo0
+OooOoo
+OooOooO
+OooOooo
+Oooo000
+Oooo00O
+Oooo00o
+Oooo0
+Oooo0O0
+0Oooo0O
+Oooo0OO
+Oooo0o0
+Oooo0o
+Oooo0oO
+Oooo0oo
+Oooo
+OoooO00
+OoooO0
+OoooO0O
+0OoooO0o
+OoooO
+OoooOO0
+o000oOoO
+OoooOOO
+OoooOOo
+OoooOo0
+OoooOoO
+OoooOoo
+Ooooo00
+0Ooooo0O
+Ooooo0o
+OooooO0
+OooooOO
+OooooOo
+Oooooo0
+Oooooo
+OoooooO
+Ooooooo
+o0OoOo0
+0o0OoO0O
+ooOO
+o00O0O
+o00Oo0
+o00Ooo
+o00o0O
+o00ooo
+oo000o
+o00oO0o
+o00oO0O
+0o0oo000
+o0ooOO0
+o0ooOOo
+o0ooOoO
+o0OOO0o
+o0Oo0oo
+o0OO00O
+oo0o0Oo
+o0O0O00
+o000OOo
+00oo0oOoO
+0ooo0Ooo
+0ooOo00O
+0o0OoOO0
+0o0O00oo
+0o0ooo00
+0o000OOoo
+0o000OOOo
+0o000OOOO
+0o000OOO0
+0o0000000
+o000000
+o000000O
+o000000o
+o00000
+o00000O0
+o00000O
+o00000OO
+o00000Oo
+o00000o0
+0o00000o
+o0000Ooo
+o00000oO
+o00000oo
+o0000
+o0000O00
+o0000oo
+o0000oO
+o0000O0
+o0000O0O
+0o0000O0o
+o000OO
+o0000O
+o0000OO0
+o0000OO
+o0000OOO
+o0000OOo
+o0000Oo0
+o0000Oo
+o0000OoO
+0o0000o00
+o0000o0
+o0000o0O
+o0000o0o
+o0000o
+o0000oO0
+o0000oOO
+o0000oOo
+o0000oo0
+o0000ooO
+0o0000ooo
+o000
+o000O000
+o000OoO
+o000O0o
+o000Ooo
+o000O0O
+o000Oo0
+o000O00
+o000O00O
+0o000O00o
+o000O0
+o000O0Oo
+o000OO0O
+o000O0O0
+o000O0o0
+o000O0oO
+o000O0oo
+o000O
+o000OO00
+0o000OO0
+o0OoO0o
+o000OO0o
+o000OOO
+o000OOo0
+o000OOoO
+o000Oo00
+o000Oo0O
+o000Oo0o
+o000Oo
+0o000OoO0
+o000OoOO
+o000OoOo
+o000Ooo0
+o000OooO
+o000Oooo
+o000o000
+o000o00
+o000o00O
+o000o00o
+0o000o0
+oooo00o
+o000o0O0
+o000o0O
+o000o0OO
+o000o0Oo
+o000o0o0
+o000o0o
+o000o0oO
+o000o0oo
+00o000o
+0o000oO00
+0o000oO0
+0o000oO0o
+0o000oO
+0o000oOO0
+0o000oOO
+0o000oOOO
+0o000oOOo
+0o000oOo0
+0o000oOo
+o000oOoo
+o000oo00
+o000oo0
+o000oo0O
+o000oo0o
+o000oo
+o000ooO0
+o000ooO
+o000ooOO
+0o000ooOo
+o000ooo0
+o000ooo
+o000oooO
+o000oooo
+o00
+o00O0000
+o0O0ooO
+o00oOoo
+o00O000
+0o00O000O
+o00O000o
+o00O00
+o00O00O
+oOO00O
+o00O00OO
+o00O00Oo
+o00O00o0
+o00O00o
+o00O00oO
+0o00O00oo
+oo00o
+o00O0
+o00O0O00
+o00O0O0
+o00O0O0O
+o00O0O0o
+o00O0OO0
+oo0o0O0
+o00O0OO
+0o00Oo00O
+o00O0OOO
+o00O0OOo
+o00O0Oo0
+oo0oOO0
+o00O0Oo
+o00O0OoO
+o00O0Ooo
+o00O0o00
+o00oOOo
+0o00oOOO
+o00O0o0
+o00O0o0O
+o00O0o0o
+o00O0o
+o00O0oO
+o00O0oOO
+o00O0oOo
+o00O0oo0
+o00O0oo
+0o00O0ooO
+o00O0ooo
+o00O
+o00OO000
+o00OO00O
+o00OO00o
+o00OO0
+o00OO0O0
+o00OO0O
+o00OO0OO
+0o00OO0Oo
+o00OO0o0
+o00OO0o
+o00OO0oO
+o00OO0oo
+oo0O
+o00OO
+o00OOO00
+o00OOO0
+o00OOO0O
+0o00OOO0o
+o0o0Oo
+o00OOO
+o00OOOO0
+o00OOOO
+o00OOOOo
+oOooo0o
+o00OOOo0
+o00OOOo
+o00OOOoO
+00o00OOOoo
+0o00OOo00
+0o00OOo0
+0o00OOo0O
+0o00OOo0o
+0o00OOo
+0o00OOoO0
+0o00OOoO
+0o00OOoOO
+0o00OOoOo
+0o00OOoo0
+o00OOoo
+o00OOooO
+o00OOooo
+o00OoOoO
+o00Oo000
+o00Oo00
+o00Oo00o
+o00Oo0O0
+o00Oo0O
+0o00Oo0OO
+o00Oo0Oo
+o00Oo0o0
+o00Oo0o
+o00Oo0oO
+o00Oo0oo
+o0oOO
+o00Oo
+o00OoO00
+o00OoO0
+0o00OoO0O
+o00OoO0o
+o00OoO
+o00OoOO0
+o00OoOO
+o00OoOOO
+o00OoOOo
+o00OoOo0
+o00OoOo
+o00OoOoo
+0o00Oooo0
+o00Ooo00
+o00Ooo0
+o00Ooo0O
+o00Ooo0o
+o00OooO0
+o00OooO
+o00OooOO
+o00OooOo
+o0O00o0
+0o00Oooo
+o00OoooO
+o00Ooooo
+o00o0000
+o00o000
+o00o000O
+o00o000o
+oo00oO
+o00o00
+o00o00O0
+0o00o00OO
+o00o00Oo
+o00o00o0
+o00o00o
+o00o00oO
+o00o00oo
+o00o0
+o00o0O00
+o00o0O0
+o00o0O0O
+0o00o0O0o
+o00o0OO0
+o00o0OO
+o00o0OOO
+o00o0OOo
+o00o0Oo0
+o00o0Oo
+o00o0OoO
+o00o0Ooo
+o00o0o00
+0o00o0o0
+o00o0o0O
+o00o0o0o
+o00o0o
+o00o0oO0
+o00o0oO
+o00o0oOO
+o00o0oOo
+o00o0oo0
+o00o0oo
+0o00o0ooO
+o00o0ooo
+o00o
+o00oo000
+o00oO000
+o00oO00O
+o00oO00o
+o00oOo
+o00oO0
+o00oO0O0
+00o00oO0OO
+0o00oO0Oo
+0o00oO0o0
+0o00oO0oO
+0o00oO0oo
+0o00oO
+0o00oOOoo
+0o00oOO00
+0o00oOO0
+0o00oOO0O
+0o00oOO0o
+o0oOOo
+o0ooOO
+o00oOO
+o00oOOO0
+o00oOOOO
+o00oOOOo
+o00oOOo0
+o00oOOoO
+o00oOo00
+0o00oOo0
+o00oOooO
+o00oOo0O
+o00oOo0o
+o00oOoO0
+o00oOoO
+o00oOoOO
+o00oOoOo
+o00oOoo0
+o00oOooo
+0o00oo00
+o00oo00O
+o00oo0
+o00oo0OO
+o00oo0O0
+o00oo0O
+o00oo0Oo
+o00oo0o0
+o00oo0o
+o00oo0oO
+0o00oo0oo
+o0O0o
+o00oo
+o00ooO00
+o00ooO0
+o00ooO0O
+o00ooO0o
+o00ooO
+o00ooOO0
+o00ooOO
+0o00ooOOO
+o00ooOOo
+o00ooOo0
+o00ooOo
+o00ooOoO
+o00ooOoo
+o00ooo00
+o00ooo0
+o00ooo0O
+o00ooo0o
+0o00oooO0
+o00oooO
+o00oooOO
+o00oooOo
+o00oooo0
+o00oooo
+o00ooooO
+o00ooooo
+o0
+o0O00000
+0o0O0000
+o0O0000O
+o0O0000o
+o0O000
+o0O000O
+o0OoOoOo
+o0O000Oo
+o0OoOoOO
+o0O000o0
+o0O000o
+0o0O000oO
+o0ooOoOO
+o0O000oo
+o0O00
+o0O00O0
+o0OoO00O
+o0O00O0o
+o0O00O
+o0O00OO
+o0O00OOO
+0o0O00Oo0
+o0O00Oo
+o0oO0Ooo
+o0O00OoO
+o0O00Ooo
+o0O00o00
+o0O00o0O
+o0O00o0o
+o0O00o
+o0O00oO0
+00o0O00oO
+0o0O00oOO
+0o0O00oOo
+0o0O00oo0
+0o0Oo0oOO
+0o0O00ooO
+0o0O00ooo
+0o0O0
+0o0ooOOOo
+0o0O0O00O
+0o0O0O0
+o0O0O0O
+o0oO0O0o
+o0O0oo0o
+o0O0O0Oo
+o0O0O0o0
+o0O0O0o
+o0O0O0oO
+o0O0O0oo
+o0ooO
+0o0O0O
+o0O0OO0
+o0O0OO0O
+o0O0OO
+o0O0OOO0
+o0O0OOO
+o0O0OOOo
+o0O0OOo
+o0O0OOoO
+o0O0OOoo
+0o0O0Oo00
+o0OooO0
+o0O0Oo0
+o0O0Oo0O
+o0O0Oo0o
+o0O0Oo
+o0O0Oooo
+o0O0OoO0
+oo0OOoo
+o0O0OoO
+0o0O0OoOO
+o0O0OoOo
+o0O0Ooo0
+o0O0Ooo
+o0O0OooO
+o0O0o000
+o0O0o00
+o0O0o00O
+o0O0o00o
+o0O0o0
+0o0O0o0O0
+o0O0o0O
+o0O0o0OO
+o0O0o0Oo
+o0O0o0o0
+o0O0o0o
+o0oOo0O0
+o0O0o0oO
+o0O0o0oo
+o0O0oo0O
+0o0O0oO00
+oooOO0
+o0O0oO0
+o0O0oO0O
+o0O0oO0o
+o0O0oO
+o0O0oOO0
+o0O0oOO
+o0O0oo00
+o0O0oOOO
+0o0O0oOOo
+o0O0oOo0
+oo0oOOo
+o0O0oOo
+o0O0oOoO
+o0O0oOoo
+o0O0oo0
+o0O0oo
+o0O0ooO0
+o0O0ooOO
+0o0O0ooOo
+o0O0ooo0
+o0O0ooo
+o0O0oooO
+o0O0oooo
+o0O
+o0OO000
+o0OO000o
+oo0oO0
+oo0ooO
+0o0OO00
+o0OO00OO
+o0OO00oo
+o0OO00Oo
+o0OO00o0
+o0OoOoO
+o0OO00o
+o0OO0
+o0OO0O0
+o0OO0O0O
+00o0OO0O0o
+0o0OO0O
+0o0OOoOOo
+0o0OOoOoO
+0o0OO0OO0
+0o0OO0OO
+0o0OOoOO0
+0o0OO0OOO
+0o0OO0OOo
+0o0OO0Oo0
+0o0OO0Oo
+o0OO0OoO
+o0OOooO0
+o0OO0Ooo
+o0OO0o00
+o0OO0o0
+o0OO0o0O
+o0OO0o0o
+o0OO0o
+o0OO0oO0
+0o0OO0oo
+o0OO0oO
+o0OO0oOO
+o0OOoooO
+o0OO0oOo
+o0OO0oo0
+o0OO0ooO
+o0OO0ooo
+o0OO
+o0OOO00
+0o0OOO00O
+o0OOO00o
+o0OOO0
+o0OOO0O0
+o0OOO0O
+o0OOO0OO
+o0OOO0Oo
+o0OOO0o0
+o0OOO0oO
+o0OOO0oo
+0o0OOO
+o0OOOOoO
+o0OOOO00
+o0OOOO0
+o0OOOO0o
+o0OOOO
+o0OOOOO0
+o0OOOOO
+o0OOOOOO
+o0OOOOOo
+0o0OOOOo0
+o0OOOOo
+o0OOOOoo
+o0OOOo00
+o0OOOo0
+o0OOOo0O
+o0OOOo0o
+o0OOOo
+o0OOOoO0
+o0OOOoO
+0o0OOOoOO
+o0OOOoOo
+o0OOOoo0
+o0OOOoo
+o0OOOooO
+o0OOOooo
+o0OOo000
+o0OOo00
+o0OOo00O
+o0OOo00o
+0o0OOo0
+o0OOo0O0
+o0OooOo
+o0OOo0O
+o0OOo0OO
+o0OOo0Oo
+o0OOo0o0
+o0OOo0o
+o0OOo0oO
+o0OOo0oo
+0o0OOo
+o0OOoO00
+o0OOoO0
+o0OOoO0O
+o0OOoO0o
+o0OOoO
+o0OOoOO
+o0OOoOOO
+o0OOoOo0
+o0OOoOo
+0o0OOoo00
+o0OOoo0
+o0OOoo0O
+o0OOoo0o
+o0OOoo
+o0OOooO
+o0OOooOO
+o0OOooOo
+o0OOooo0
+o0OOooo
+00o0OOoooo
+0o0Oo0000
+0o0Oo000
+0o0Oooo0O
+0o0Oo00O0
+0o0Oo000O
+0o0Oo000o
+0o0Oo00
+0o0Oo00OO
+0o0Oo00Oo
+0o0oooOoo
+o0Oo00o0
+o0Oo00o
+o0Oo00oO
+o0Oo00oo
+o0Oo0
+o0ooO0O0
+o0Oo0O00
+o0Oo0O0
+o0Oo0O0O
+0o0Oo0O0o
+o0Oo0O
+o0Oo0OO0
+o0Oo0OO
+o0oOooO0
+o0ooOOOO
+o0oOo000
+o0Oo0OOO
+o0oOo0o0
+o0oOoo00
+0o0oO0OOo
+o0Oo0OOo
+o0Oo0Oo0
+o0Oo0Oo
+o0Oo0OoO
+o0Oo0oOo
+o0Oo0Ooo
+o0Oo0o00
+o0Oo0o0O
+o0Oo0o0o
+0o0Oo0o
+o0Oo0oO0
+o0Oo0oO
+o0Oo0oo0
+o0Oo0ooO
+o0Oo0ooo
+o0Oo
+o0OooOoo
+o0OoO000
+o0OoO0
+0o0OoO0O0
+o0oO0O00
+o0OoO0OO
+o0ooOOO0
+o0OoO0Oo
+o0OoO0o0
+o0OoO0oO
+o0OoO0oo
+o0OoO
+o0OoOO00
+0o0OoOO0O
+o0OoOO0o
+o0OoOO
+o0OoOOoO
+o0OoOOO0
+o0OoOOO
+o0OoOOOO
+o0OoOOOo
+o0OoOOo0
+o0OoOOo
+0o0OoOOoo
+o0OoOo00
+o0OoOo0O
+o0ooOOoo
+o0OoOo0o
+o0OoOo
+o0OoOoO0
+o0OoOoo0
+o0OoOoo
+o0OoOooO
+0o0OoOooo
+o0Ooo000
+o0Ooo00
+o0Ooo00O
+o0oOO0Oo
+o0oOoOoo
+o0Ooo00o
+o0Ooo0
+o0Ooo0O0
+o0Ooo0O
+0o0Ooo0OO
+o0oOOOoo
+o0OoooO0
+o0oOOO0o
+o0Ooo0Oo
+o0Ooo0o0
+o0Ooo0o
+o0Ooo0oO
+o0Ooo0oo
+o0Ooo
+00o0OooO00
+0o0OooO0O
+0o0OooO0o
+0o0OooO
+0o0OooOO0
+0o0OooOO
+0o0OooOOO
+0o0OooOOo
+0o0OooOo0
+0o0OooOoO
+0o0Oooo00
+o0Oooo0
+o0Oooo0o
+o0Oooo
+o0OoooO
+o0OoooOO
+o0OoooOo
+o0Ooooo0
+o0Ooooo
+o0OooooO
+0o0Oooooo
+o0o0000
+o0o0o00O
+o0o0000o
+o0o000
+o0o000O0
+o0o000O
+o0o000OO
+o0o000Oo
+o0o000o0
+0o0o000o
+o0o000oO
+o0o000oo
+o0o00
+o0o00O00
+o0o00O0
+o0o00O0O
+o0o00O0o
+o0o00O
+o0o00OO0
+0o0o00OO
+o0o00OOO
+o0o00OOo
+o0o00Oo0
+o0o00Oo
+o0o00OoO
+o0o00Ooo
+o0o00o00
+o0o00o0
+o0o00o0O
+0o0o00o0o
+o0o00o
+o0o00oO0
+o0o00oO
+o0o00oOO
+o0o00oOo
+o0o00oo0
+o0o00oo
+o0o00ooO
+o0o00ooo
+0o0o0
+o0o0O000
+o0o0O00
+o0o0O00O
+o0o0O00o
+o0o0O0
+o0o0O0O0
+o0o0O0O
+o0o0Oo00
+o0o0O0OO
+0o0o0O0Oo
+o0o0O0o0
+o0o0O0o
+o0o0O0oO
+o0o0O0oo
+oO0Oo
+oO0OO
+o0ooo
+o0o0O
+o0o0OoO0
+0o0o0OO00
+o0o0OO0
+o0o0OO0O
+o0o0OO0o
+o0o0OO
+o0o0OOO0
+o0o0OOO
+o0o0OOOO
+o0o0OOOo
+o0o0OOo0
+0o0o0OOo
+o0o0OOoO
+o0o0OOoo
+o0o0Oo0
+o0o0Oo0O
+o0o0Oo0o
+o0o0OoO
+o0o0OoOO
+o0o0OoOo
+o0o0Ooo0
+000o0o0Ooo
+00o0o0OooO
+00o0o0Oooo
+00o0o0o000
+00o0o0o00
+00o0o0o00o
+00o0o0o0
+00o0o0o0O0
+00o0o0o0O
+00o0o0o0OO
+00o0o0o0Oo
+0o0o0o0o0
+0o0o0o0o
+0o0o0o0oO
+0o0o0o0oo
+0o0o0o
+0o0o0oO00
+0o0o0oO0
+0o0o0oO0O
+0o0o0oO0o
+00o0oo00
+0o0o0oO
+0o0o0oOO0
+0o0o0oOO
+0o0o0oOOO
+0o0o0oOOo
+0o0o0oOo0
+0o0o0oOo
+0o0o0oOoO
+0o0o0oOoo
+00o0o0oo00
+0o0o0oo0
+0o0o0oo0O
+0o0o0oo0o
+0o0o0oo
+0o0o0ooO0
+0o0o0ooO
+0o0o0ooOO
+0o0o0ooOo
+0o0o0ooo0
+00o0o0ooo
+0o0o0oooO
+0o0o0oooo
+0o0o
+0o0oO0000
+0ooooooO
+0o0oO000
+0o0oO000O
+0o0oO000o
+0o0oO00
+00o0oO00O0
+0o0oO00O
+0o0oO00Oo
+0o0oO00OO
+0o0oO00o0
+0o0oO00o
+0o0oO00oO
+0o0oO00oo
+0o0oO0
+0o0oO0O0
+00o0oO0O
+0o0oO0OO0
+0o0oO0OO
+0o0oO0OOO
+0o0oO0Oo
+0o0oO0OoO
+0o0oO0o00
+0o0oO0o0
+0o0oO0o0o
+0o0oO0o0O
+00o0oO0o
+0o0oO0oO0
+0o0oO0oO
+0o0oO0oOO
+0o0oO0oo0
+0o0oO0oo
+0o0oO0ooO
+0o0oO0ooo
+0o0oO
+0o0oOO000
+00o0oOO00
+0o0oOO00O
+0o0oOO00o
+0o0oOO0
+0o0oOO0O0
+0o0oOO0O
+0o0oOo0oO
+0o0oOo0oo
+0o0oOO0OO
+0o0oOO0o0
+00o0oOO0o
+0o0oOO0oO
+0o0oOO0oo
+0o0oOOO00
+0o0oOOO0
+0o0oOOO0O
+0o0oOOO
+0o0oOOOO0
+0o0oOOOO
+0o0oOOOOO
+00o0oOOOOo
+0o0oOOOo0
+0o0oOOOo
+0o0oOOOoO
+0o0oOOo00
+0o0oOOo0
+0o0oOOo0O
+0o0oOOo0o
+0o0oOOoO0
+0o0oOOoO
+0o0oOoO00
+o0oOOoOO
+o0oOooOO
+o0oOOoOo
+o0oOOoo0
+o0oOOoo
+o0oOOooO
+o0oOOooo
+o0oOo00
+o0oOo00O
+0o0oOo00o
+o0oOo0
+o0oOo0O
+o0oOo0OO
+o0oOo0Oo
+o0oOo0o
+o0oOo
+o0oOoO0
+o0oOoO0o
+o0oOoOo0
+0o0oOoO0O
+o0oOoO
+o0oOoOO0
+o0oOoOO
+o0oOoOOO
+o0oOoOOo
+o0oOoOo
+o0oOoOoO
+o0oOoo0
+o0oOoo0O
+0o0oOoo0o
+o0oOoo
+o0oOooO
+o0oOooOo
+o0oOooo0
+o0oOooo
+o0oOoooO
+o0oOoooo
+o0oo0000
+o0oo000O
+0o0oo000o
+o0oo00O0
+o0oo00O
+o0oo00OO
+o0oo00Oo
+o0oo00o0
+o0oo00o
+o0oo00oO
+o0oo00oo
+o0oo0
+0o0oo0O00
+o0oo0O0
+o0oo0O0O
+o0oo0O0o
+o0oo0o
+o0oo0O
+o0oo0OO0
+o0oo0OO
+o0oo0OOO
+o0oo0OOo
+0o0oo0Oo0
+o0oo0Oo
+o0oo0OoO
+o0oo0Ooo
+o0oo0o00
+o0oo0o0
+o0oo0o0O
+o0oo0o0o
+o0oo0oO0
+o0oo0oO
+0o0oo0oOO
+o0oo0oOo
+o0oo0oo0
+o0oo0oo
+o0oo0ooO
+o0oo0ooo
+o0ooO000
+o0ooO00
+o0ooO00O
+o0ooO00o
+0o0ooO0
+o0ooO0O
+o0ooO0OO
+o0ooO0Oo
+o0ooO0o0
+o0ooO0o
+o0ooO0oO
+o0ooO0oo
+o0ooOO0O
+o0ooOO0o
+00o0ooOOO
+0o0ooOOoO
+0o0ooOo00
+0o0ooOo0
+0o0ooOo0o
+0o0ooOo0O
+0o0ooOo
+0o0ooOooO
+0o0ooOoO0
+0o0ooOoOo
+0o0ooOoo0
+o0ooOoo
+o0ooOooo
+o0ooo000
+o0ooo00O
+o0ooo00o
+o0ooo0
+o0ooo0O
+o0ooo0o0
+o0ooo0o
+0o0ooo0oO
+o0ooo0oo
+o0oooO00
+o0oooO0
+o0oooO0o
+o0oooO0O
+o0oooO
+o0oooOO0
+o0oooOO
+o0oooOOo
+0o0oooOOO
+o0oooOo0
+o0oooOo
+o0oooOoO
+o0oooo00
+o0oooo0
+o0oooo0O
+o0oooo0o
+o0oooo
+o0ooooO0
+0o0ooooO
+o0ooooOo
+o0ooooo0
+ooo0Oo0
+o0ooooo
+o0oooooO
+o0oooooo
+o
+oO00000
+oO00000o
+0oO0000
+oO0000O
+oO0000Oo
+oO0000o0
+oO0000o
+oO0000oO
+oO0000oo
+oO000
+oO000O0
+oO000O0O
+0oO0Ooo00
+oO0Ooooo
+oO000O0o
+oO0o0o
+oO000O
+oO0OoOO0
+oO0OOooo
+oO0OoOOO
+oO0OOoO0
+oO0Oo0oo
+0oO000OOO
+oO0OO0oo
+oO0OOooO
+oO000OOo
+oO0OoOoO
+ooOOOOoo
+oO0OOo0o
+oO000Oo0
+oO000Oo
+oO0OO0OO
+0oO0OoOoo
+oO0OOoo0
+oO000OoO
+oO0OOo0O
+oO000Ooo
+oO000o00
+oO000o0
+ooOOOOOo
+oO000o0o
+oO000o
+0oO0Oo0OO
+oO000oO0
+oO000oO
+oO0Ooo0O
+oO000oOO
+oO0Ooo0o
+oO000oOo
+oO000oo0
+oO000oo
+oO0Oo0Oo
+00oO000ooO
+0oO0Oo0O0
+0oO000ooo
+0oO00
+0oO00O00
+0oO0O0o0o
+0ooOOoooO
+0oO00O00o
+0oO00O0
+0oO00O0O
+0oO00O0Oo
+oO0O0OoO
+ooOOooOo
+oO00O0o0
+oO00O0o
+oOo00OO0
+oO00O0oO
+oO0O0OOo
+oO00O0oo
+oO00O
+0oO00OO0
+ooOOoOoO
+oO0O0OOO
+oO00OO0O
+oO00OO
+oO00OOO
+oO00OOOo
+oOo00Oo0
+ooOOoOOo
+oO00OOo0
+0oO00OOo
+oO0oOOO0
+oO00OOoO
+oOOoOoOO
+oO00OOoo
+oO00Oo00
+oO00Oo0
+oO00Oo0O
+oO00Oo0o
+oO00Oo
+0oO00oOOO
+oO00OoO0
+oO00OoO
+oOOoOOO0
+oO00OoOO
+oO0oOOOo
+oO00OoOo
+oO00Ooo0
+oO00Ooo
+oO00OooO
+0oO00Oooo
+oO0OOoOo
+oO00o000
+oO00o00
+oO0OooOO
+oO0OoOo0
+oO0OOO00
+oO00o00O
+oO0OOoOO
+oO00o00o
+0ooOO0O
+ooOOo0
+oO00o0
+oO0OOOoo
+oO00o0O0
+oO00o0O
+oO0OOOOo
+oO00o0OO
+oO0OOOoO
+oO00o0Oo
+0oO0OoO0O
+oO0OOO0o
+oO00o0o0
+oO00o0o
+oO0OOOo0
+oO00o0oO
+oO0OOO0O
+oO00o0oo
+oO00o
+oO0OO0oO
+0oO0OO000
+oOo00o0o
+oO00oO00
+oO00oO0
+oO0OoooO
+oOo00ooO
+oO00oO0O
+oO0OooOo
+oOo00ooo
+oO00oO0o
+0oO00oO
+oO00oOO0
+oO00oOO
+oO0OO00o
+oO00oOOo
+oOo00oO0
+oO00oOo0
+oO00oOo
+oO0OO00O
+ooOOOOoO
+00oOo00oOO
+0oO00oOoO
+0oOo00oOo
+0oO00oOoo
+0oO0OOOOO
+0oO00oo00
+0oO00oo0
+0oO0OO0o0
+0oO00oo0O
+0oO00oo0o
+0oO00oo
+oO00ooO0
+oO00ooO
+oOo000Oo
+oO00ooOO
+oO00ooOo
+oOo0000O
+oO00ooo0
+oO00ooo
+oOo000oo
+0oO00oooO
+oOo000o0
+oO00oooo
+oO0
+oO0O000
+oO0Oo00O
+ooOOoOo0
+oO0O000o
+oO0O00
+oO0O00O
+0oO0O00Oo
+oO0O00o0
+oO0O00o
+oO0O00oO
+oO0O00oo
+oOoo0
+oO0O0
+oO0O0O00
+oO0O0O0
+ooOOOoO0
+0oO0O0O0O
+ooOOOoo0
+oO0O0O0o
+oO0O0o
+oO0O0O
+oO0O0OO
+oOo0oooO
+ooOOOoOo
+oO0O0Oo0
+oO0O0Oo
+0oO0O0o0
+oO0O0o0O
+oO0O0oO0
+oO0O0oO
+oOo0o0oO
+ooOOO0Oo
+oO0O0oOO
+oO0O0oOo
+oOo00OOo
+oO0O0oo0
+0oO0O0oo
+oOo00OOO
+ooOOO00O
+oO0O0ooO
+oO0O0ooo
+ooo0o
+oO0O
+oO0OO00
+oO0OO0O
+oO0OO0Oo
+0oO0OO0o
+oO0OOO0
+oO0OOO
+oO0OooO0
+oO0OOOO0
+oO0OOOO
+oO0OOOo
+oO0OOo0
+oO0OOo
+oO0OOoO
+0oO0OOoo
+oO0Oo00
+oO0Oo0
+oO0Oo0O
+oO0Oo0o0
+oO0Oo0o
+oO0OoO00
+oO0OoO0
+oO0OoO
+oO0OoOO
+0oO0OoOo
+oO0Ooo0
+oO0Ooo
+oO0OooO
+oO0Oooo
+oO0o0000
+oO0o000
+oO0o000O
+ooOOoOoo
+oO0o000o
+00oO0o00
+0oO0o0oo0
+0oO0o00O0
+0oO0o00O
+0oO0o00OO
+0oO0o00Oo
+0oO0o00o0
+0oO0o00o
+0oO0o00oO
+0oO0o00oo
+0oO0o0
+oO0o0O00
+oO0o0O0
+oO0o0O0O
+oO0o0O0o
+oO0o0O
+oO0o0OO0
+oO0o0OO
+oO0o0OOO
+oO0o0OOo
+0oO0o0Oo0
+oO0o0Oo
+oO0o0OoO
+oO0o0Ooo
+oO0o0o00
+oO0o0o0
+oO0o0o0O
+oO0o0o0o
+oO0o0oO0
+oO0o0oO
+0oO0o0oOO
+oO0o0oOo
+oO0o0oo
+oO0o0ooO
+oO0o0ooo
+oO0o
+oO0oO000
+oO0oO00
+oOo00O0O
+ooOOoOO0
+0oO0oO00O
+oO0oO00o
+oO0oO0
+oO0oO0O0
+oO0oO0O
+oO0oO0OO
+oOo00OoO
+ooOOoOOO
+oO0oO0Oo
+oO0oO0o0
+0oO0oO0o
+oO0oO0oO
+oO0oO0oo
+oOooo
+oO0oO
+oO0oOoOO
+oO0oOO00
+oO0oOO0
+oO0oOO0O
+oO0oOO0o
+0oO0oOO
+oO0oOOO
+oO0oOOOO
+oO0oOOo0
+oO0oOOo
+oO0oOOoO
+oO0oOOoo
+oO0oOo00
+oO0oOo0
+oO0oOo0O
+0oO0oOo0o
+oO0oOo
+oO0oOoO0
+oO0oOoO
+oO0oOooo
+oO0oOoOo
+oO0oOoo0
+oO0oOoo
+oO0oOooO
+oO0oo000
+0oO0oo00
+oO0oo00O
+oO0oo00o
+oO0oo0
+oO0oo0O0
+oO0oo0O
+oO0oo0OO
+oO0oo0Oo
+oO0oo0o0
+oO0oo0o
+0oO0oo0oO
+oO0oo0oo
+oO0oo
+oO0ooO00
+oO0ooO0
+oO0ooO0O
+oO0ooO0o
+oO0ooO
+oO0ooOO0
+oO0ooOO
+00oO0ooOOO
+0oO0ooOOo
+0oO0ooOo0
+0oO0ooOo
+0oO0ooOoO
+0oO0ooOoo
+0oO0ooo00
+0oO0ooo0
+0oO0ooo0O
+0oO0ooo0o
+0oO0ooo
+oOo00o0O
+oO0oooO0
+oO0oooO
+oO0oooOO
+oOo00oo0
+oO0oooOo
+oOo000OO
+oO0oooo0
+oO0oooo
+0oO0ooooO
+oOo00o00
+oO0ooooo
+oO
+oOO00000
+oOO0000
+oOO0000O
+oOO0000o
+oOO000
+oOO000O0
+0oOO000O
+oOO000OO
+oOO000Oo
+oOO000o0
+oOO000o
+oOO000oO
+oOO000oo
+oOO00
+oOO00O00
+oOO00O0
+0ooooOO00
+oOO00O0O
+oOO00O0o
+oOO00OO0
+oOO00OO
+oOO00OOO
+oOO00OOo
+oOO00Oo0
+oOO00Oo
+ooooO000
+0oOO00OoO
+ooooOoOo
+oOO00Ooo
+oOO00o00
+oOO00o0
+oOO00ooo
+oOO00o0O
+oOO00o0o
+oOO00o
+oOO00oO0
+0oOO00oO
+ooooOOo0
+ooooO0oo
+oOO00oOO
+oOO00oOo
+oOO00oo
+oOO00ooO
+oOO0
+ooooOoOO
+oOO0O000
+0oOO0O00
+oOO0O00O
+oOO0O00o
+oOO0O0
+oOO0O0O0
+oOO0O0O
+oOO0O0OO
+oOO0O0Oo
+oOO0O0o0
+oOO0O0o
+0oOO0O0oO
+oOO0O0oo
+oOO0O
+oOO0OO0
+oOO0OO0O
+oOO0OO0o
+oOO0OO
+oOO0OOO
+oOO0OOOO
+oOO0OOOo
+0oOO0OOo0
+oOO0OOo
+oOO0OOoO
+oOO0OOoo
+oOO0Oo00
+oOO0Oo0
+oOO0Oo0O
+oOO0Oo0o
+oOO0Oo
+oOO0OoO0
+00oOO0OoO
+0oOO0OoOO
+0oOO0OoOo
+0oOO0Ooo0
+0oOO0Ooo
+0oOO0OooO
+0oOO0Oooo
+0oOO0o00
+0ooooOOoo
+0oOO0o00o
+0oOO0o0
+oOO0o0O0
+oOO0o0O
+oOO0o0OO
+oOO0o0Oo
+ooooO0O0
+oOO0o0o0
+oOO0o0o
+oOO0o0oO
+oOO0o0oo
+0oOO0o
+oOO0oO00
+oOO0oO0
+oOO0oO0O
+oOO0oO0o
+oOO0oO
+oOO0oOO0
+oOO0oOO
+oOO0oOOO
+oOO0oOOo
+0oOO0oOo0
+oOO0oOo
+oOO0oOoO
+oOO0oOoo
+oOO0oo00
+oOO0oo0
+oOO0oo0O
+oOO0oo0o
+oOO0oo
+oOO0ooO0
+0oOO0ooO
+oOO0ooOO
+oOO0ooOo
+oOO0ooo0
+oOO0ooo
+oOO0oooO
+oOO0oooo
+oOO
+oOOO000
+oOOO000o
+0oOOO0O
+oOOOoO
+oOOO00
+oOOO00O
+oOOO00Oo
+oOOO00o0
+oOOO00o
+oOOO00oO
+oOOO00oo
+oOOO0
+0oOOO0oOO
+oOOO0O0
+oOOO0O0o
+oOOO0OO0
+oOOO0OO
+oOOO0OOO
+oOOO0OOo
+oOOO0Oo
+oOOO0OoO
+oOOO0Ooo
+0oOOO0o00
+oOOO0o0
+oOOO0o0O
+oOOO0o0o
+oOOOOO
+oOOO0o
+oOOO0oO0
+oOOO0oO
+oOOO0ooo
+oOOO0ooO
+0oOOO0oOo
+oOOO0oo0
+oOOO0oo
+oOOO
+oOOOO0OO
+oOOOO000
+oOOOO00
+oOOOoo00
+oOOOO00O
+oOOOO00o
+0oOOOO0
+oOOOO0O0
+oOOOO0O
+oOOOO0Oo
+oOOOO0o0
+oOOOO0o
+oOOOO0oO
+oOOOO0oo
+oOo0o
+oOOOO
+00oOOOOO00
+0oOOOOO0
+0oOOOOO0O
+0oOOOOO0o
+0oOOOOOO0
+0oOOOOOO
+0oOOOOOOO
+0oOOOOOOo
+0oOOOOOo0
+0oOOOOOo
+0oOOOOOoO
+oOOOOOoo
+oOOOOo00
+oOOOOo0
+oOOOOo0O
+oOOOOo0o
+oOOOOo
+oOOOOoO0
+oOOOOoO
+oOOOOoOO
+0oOOOOoOo
+oOOOOoo0
+oOOOOoo
+oOOOOooO
+oOOOOooo
+oOOOo000
+oOOOo00
+oOOOo00O
+oOOOo00o
+oOOOo0
+0oOOOo0O0
+oOOOo0O
+oOOOo0OO
+oOOOo0Oo
+oOOOo0o0
+oOOOo0o
+oOOOo0oO
+oOOOo0oo
+oOOOo
+oOOOoO00
+0oOOOoO0
+oOOOoO0O
+oOOOoO0o
+oOOOoOO0
+oOOOoOO
+oOOOoOOO
+oOOOoOOo
+oOOOoOo0
+oOOOoOo
+oOOOoOoO
+0oOOOoOoo
+oOOOoo0
+oOOOoo0O
+oOOOoo0o
+oOOOoo
+oOOOooO0
+oOOOooO
+oOOOooOO
+oOOOooOo
+oOOOooo0
+0oOOOooo
+oOOOoooO
+oOOOoooo
+oOOo0000
+oOOo000
+oOOo000O
+oOOo000o
+oOOo00
+oOOo00O0
+oOOo00O
+0oOOo00OO
+oOOo00Oo
+oOOo00o0
+oOOo00o
+oOOo00oO
+oOOo00oo
+oOOo0
+oOOo0O00
+oOOo0O0
+oOOo0O0O
+0oOOo0O0o
+oOOo0O
+oOOo0OO0
+oOOo0OO
+oOOo0OOO
+oOOo0OOo
+oOOo0Oo0
+oOOo0Oo
+oOOo0OoO
+oOOo0Ooo
+0oOOo0o00
+oOOo0o0
+oOOo0o0O
+oOOo0o0o
+oOOo0o
+oOOo0oO0
+oOOo0oO
+oOOo0oOO
+oOOo0oOo
+oOOo0oo0
+00oOOo0oo
+0oOOo0ooO
+0oOOo0ooo
+0oOOo
+0oOOoO000
+0oOOoO00
+0oOOoO00O
+0oOOoO00o
+0oOOoO0
+0oooO0oOO
+0oOOoO0O0
+oOOoO0O
+oOOoO0OO
+oOOoO0Oo
+oOOoO0o
+oOOoO0oO
+oOOoO0oo
+oOOoO
+oOOoOO0o
+oOOoOO00
+0oOOoOO0
+oOOoOO0O
+oOOoOOO
+oOOoOOOO
+oOOoOOOo
+oOOoOOo0
+oOOoOOo
+oOOoOOoO
+oOOoOOoo
+oOOoOo00
+0oOOoOo0
+oOOoOo0O
+oOOoOo0o
+oOOoOo
+oOOoOoO0
+oOOoOoO
+oOOoOoOo
+oOOoOoo0
+oOOoOoo
+oOOoOooO
+0oOOoOooo
+oOOoo000
+oOOoo00
+oOOoo00O
+oOOoo00o
+oOOoo0
+oOOoo0O0
+oOOoo0O
+oOOoo0OO
+oOOoo0Oo
+0oOOoo0o0
+oOOoo0o
+oOOoo0oO
+oOOoo0oo
+oOOoo
+oOOooO00
+oOOooO0
+oOOooO0O
+oOOooO0o
+oOOooO
+0oOOooOO0
+oOOooOO
+oOOooOOO
+oOOooOOo
+oOOooOo0
+oOOooOo
+oOOooOoO
+oOOooOoo
+oOOooo00
+oOOooo0
+0oOOooo0O
+oOOooo0o
+oOOooo
+oOOoooO0
+oOOoooO
+oOOoooOO
+oOOoooOo
+oOOoooo0
+oOOoooo
+oOOooooO
+0oOOooooo
+oOo0000
+oOo000
+oOo000O
+oOo000o
+oOo00O0
+oOo00O
+oOo00OO
+oOo0o00
+oOo00Oo
+0oOo00o0
+oOo00o
+oOo00oO
+oOo00oo
+oOo0
+oOo0O000
+oOo0O00
+oOo0O00O
+oOo0oO0o
+oOo0O00o
+000oOo0oo
+00oOo0O0
+00oOo0O0O0
+00oOo0O0O
+00oOo0O0OO
+00oOo0O0Oo
+00oOo0O0o0
+00oOo0O0o
+00oOo0O0oO
+00oOo0O0oo
+00oOo0O
+0oOo0OO00
+0oOoo00o
+0oOo0OO0
+0oOo0OO0O
+0oOo0OO0o
+0oOo0OO
+0oOo0OOO0
+0oOo0OOO
+0oOo0OOOO
+00oOo0OOOo
+0oOo0OOo0
+0oOo0OOo
+0oOo0OOoO
+0oOo0OOoo
+0oOo0Oo00
+0oOo0Oo0
+0oOo0Oo0O
+0oOo0Oo0o
+0oOo0Oo
+00oOo0OoO0
+0oOo0OoO
+0oOo0OoOO
+0oOo0OoOo
+0oOo0Ooo0
+0oOo0Ooo
+0oOo0OooO
+0oOo0Oooo
+0oOo0o000
+0oOo0o00O
+00oOo0o00o
+0oOo0o0
+0oOo0o0O
+0oOo0o0OO
+0oOo0o0Oo
+0oOo0o0o0
+0oOo0o0o
+0oOo0oO00
+0oOo0oO0
+0oOo0oO0O
+00oOo0oO
+0oOo0oOO0
+0oOo0oOO
+0oOo0oOOO
+0oOo0oOOo
+0oOo0oOo0
+0oOo0oOo
+0oOo0oOoO
+0oOo0oOoo
+0oOo0oo00
+00oOo0oo0
+0oOo0oo0O
+0oOo0ooO0
+0oOo0ooO
+0oOo0ooOO
+0oOo0ooOo
+0oOo0ooo0
+0oOo0ooo
+0oOo
+0oOooOOoO
+00oOoO0000
+0oOoO000
+0oOoO000O
+0oOoO000o
+0oOoO00
+0oOoO00O0
+0oOoO00O
+0oOoO00OO
+0oOoO00Oo
+0oOoO00o0
+00oOoO00o
+0oOoO00oO
+0oOoO00oo
+0oOoO0
+0oOooOo0O
+0oOoO0O00
+0oOoO0O0
+0oOoO0O0O
+0oOoO0O0o
+0oOoO0o
+00oOoO0O
+0oOoO0OO0
+0oOoO0OO
+0oOoO0OOO
+0oOoO0OOo
+0oOoO0Oo0
+0oOoO0Oo
+0oOoO0OoO
+0oOoO0Ooo
+0oOooOo00
+00oOoO0o00
+0oOoO0o0
+0oOoO0o0O
+0oOoOoOOO
+0oOoO0o0o
+0oOoO0oO0
+0oOoO0oO
+0oOoO0oOO
+0oOoO0oOo
+0oOooOo0o
+0oOoO0oo0
+oOoO0oo
+oOoO0ooO
+oOoO0ooo
+oOoO
+oOoOO000
+oOoOO00
+oOoOO00O
+oOoOO00o
+oOoOO0
+0oOoOO0O0
+oOoOO0O
+oOoOOo0O
+oOoOO0OO
+oOoOO0Oo
+oOoOO0o0
+oOoOO0o
+oOoOO0oO
+oOooOOOO
+oOoOO0oo
+0oOoOO
+oOoOOO00
+oOoOOO0
+oOoOOO0O
+oOoOOO0o
+oOoOOO
+oOoOOOO0
+oOoOOOO
+oOoOOOOO
+oOoOOOOo
+0oOoOOOo0
+oOoOOOo
+oOoOOOoO
+oOooOooO
+oOoOOOoo
+oOoOOo00
+oOoOOo0
+oOoOOo0o
+oOoOOo
+oOoOOoO0
+0oOoOOoO
+oOoOOoOO
+oOoOOoOo
+oOoOOoo0
+oOoOOoo
+oOoOOooO
+oOoOOooo
+oOoOo000
+oOoOo00
+oOoOo00O
+0oOoOo00o
+oOoOo0
+oOoOoo0O
+oOoOo0O0
+oOoOo0O
+ooOOO0oo
+oOooo0Oo
+oOooo0oo
+oOoOo0OO
+ooOOO0o0
+0oOoOo0Oo
+oOoOo0o0
+oOoOo0o
+oOoOo0oO
+oOoOo0oo
+oOoOo
+ooOOOooo
+oOoOoO00
+oOoOoO0
+oOoOoO0O
+0ooOOOooO
+oOooooOO
+oOoOoO0o
+oOoOoO
+oOoOoOO0
+oOoOoOO
+oOoOoOOo
+oOoOoOo0
+oOoOoOo
+oOooOOoo
+0oOoOoOoO
+oOoOoOoo
+ooOOO0oO
+oOooo0oO
+oOoOoo00
+oOoOoo0
+ooOOO0O0
+oOooo0O0
+oOoOoo0o
+oOoOoo
+00ooOOOo0o
+0oOoooooo
+0oOoOooO0
+0oOoOooO
+0oOoOooOO
+0ooOOOo0O
+0oOoooooO
+0oOoOooOo
+0oOoOooo0
+0oOoOooo
+0ooOOOo00
+oOooooo0
+oOoOoooO
+oOoOoooo
+oOoo0000
+oOoo000
+oOoo000O
+oOoo000o
+oOoo00
+oOoo00O0
+0oOoo00O
+oOoo00OO
+oOoo00Oo
+oOoo00o0
+oOoo00oO
+oOoo00oo
+oOoo0Oo0
+oOoo0O00
+oOoo0O0
+oOoo0O0O
+0oOoo0O0o
+oOoo0O
+oOoo0OO0
+oOoo0oO
+oOooo00
+oOoo0OO
+oOoo0OOO
+oOoo0OOo
+oOoo0Oo
+oOoo0OoO
+0oOoo0Ooo
+oOoo0o00
+oOoo0o0
+oOoo0o0O
+oOoo0o0o
+oOoo0o
+oOoo0oO0
+oOoo0oOO
+oOoo0oOo
+oOoo0oo0
+0oOoo0oo
+oOoo0ooO
+oOoo0ooo
+oOoo
+oOooO000
+oOooO00
+oOooO00O
+oOooO00o
+oOooO0
+oOooO0O0
+0oOooO0O
+oOooO0OO
+oOooO0Oo
+oOooO0o0
+oOooO0o
+oOooO0oO
+oOooO0oo
+oOooO
+oOooOO00
+oOooOO0
+0oOooOOo0
+oOooOO0O
+oOooOO0o
+oOooOO
+oOooOOO0
+oOooOOO
+oOooOOOo
+oOooOOo
+oOooOo0
+oOooOo
+0oOooOoO0
+oOooOoO
+oOooOoOO
+oOooOoOo
+oOooOoo0
+oOooOoo
+oOooOooo
+oOooo000
+oOooo00O
+oOooo00o
+0oOoooO
+oOooo0
+oOooo0O
+oOooo0OO
+oOooo0o0
+oOoooO00
+oOoooO0
+oOoooO0O
+oOoooO0o
+oOoooOO0
+00oOoooOO
+0oOoooOOO
+0oOoooOOo
+0oOoooOo0
+0oOoooOo
+0oOoooOoO
+0oOoooOoo
+0oOoooo00
+0oOoooo0
+0oOoooo0O
+0oOoooo0o
+oOoooo
+oOooooO0
+oOooooO
+oOooooOo
+oOooooo
+oo000000
+oo00000
+oo00000O
+oo00000o
+0oo0000
+oo0000O0
+oo0000O
+oo0000OO
+oo0000Oo
+oo0000o0
+oo0000o
+oo0000oO
+oo0000oo
+oo000
+0oo000O00
+oo000O0
+oo000O0O
+oo000O0o
+oo000O
+oo000OO0
+oo0OOOO
+oo000OO
+oo000OOO
+oo000OOo
+0oo000Oo0
+oo000Oo
+oo000OoO
+oo000Ooo
+oo000o00
+oo000o0
+oo000o0O
+oo000o0o
+oo000oO0
+oo000oO
+0oo000oOO
+oo000oOo
+oo000oo0
+oo000oo
+oo000ooO
+oo00
+oo00O00o
+oo00O000
+oo00O00
+oo00O00O
+0oo00O0
+oo00O0O0
+oo00O0O
+oo00Oo0O
+oo00O0OO
+oo00O0Oo
+oo00O0o0
+oo00O0o
+oo00O0oO
+oo00O0oo
+0oo00O
+oo00OO00
+oo00OO0
+oo00OO0O
+oo00OO0o
+oo00OO
+oo00OOO0
+oo00OOO
+oo00OOOO
+oo00OOOo
+0oo00OOo0
+oo00OOo
+oo00OOoO
+oo00OOoo
+oo00Oo00
+oo00Oo0
+oo00Oo0o
+oo00Oo
+oo00OoO0
+oo00OoO
+0oo00OoOO
+oo00OoOo
+oo00Ooo0
+oo00Ooo
+oo00OooO
+oo00Oooo
+oo00o000
+oo00o00
+oo00o0o0
+oo00o00O
+00oo00o00o
+0oo00o0
+0oo00o0oo
+0oo00ooOO
+0oo00o0O0
+0oo00o0O
+0oo00o0OO
+0oo00o0Oo
+0oo00o0o
+0oo00o0oO
+0oo00oO00
+oo00oO0
+oo00oO0O
+oo00oO0o
+oo00oOoO
+oo00oOO0
+oo00oOo
+oo00oOO
+oo00oOOO
+oo00oOOo
+0oo00oOo0
+oo00oOoo
+oo00oo00
+oo00oo0
+oo00oo0O
+oo00oo0o
+oo00oo
+oo00ooO0
+oo00ooO
+oo00ooOo
+0oo00ooo0
+oo00ooo
+oo00oooO
+oo00oooo
+oo0
+oo0O0000
+oo0O000
+oo0O000O
+oo0O000o
+oo0O00
+0oo0oOOOO
+oo0O00O0
+oo0O00O
+oo0O00OO
+oo0O00Oo
+oo0O00o0
+oo0O00o
+oo0O00oO
+oo0O00oo
+oo0O0
+0oo0O0O00
+oo0O0O0
+oo0O0O0O
+oo0O0O0o
+oo0O0O
+oo0O0OO0
+oo0O0OO
+oo0O0OOO
+oo0O0OOo
+oo0O0Oo0
+0oo0O0Oo
+oo0O0OoO
+oo0O0Ooo
+oo0O0o00
+oo0O0o0
+oo0O0o0O
+oo0O0o0o
+oo0O0o
+oo0O0oO0
+ooo0OoO
+0oo0O0oO
+oo0oOOoO
+oo0O0oOO
+oo0O0oOo
+oo0O0oo0
+oo0O0oo
+oo0O0ooO
+oo0O0ooo
+oo0OoOO0
+oo0OO00o
+0oo0OO00O
+oo0OO000
+oo0OO00
+oo0Oo0
+oo0Ooo
+oo0OoO
+oo0OO0
+oo0OOoOO
+oo0OO0Oo
+oo0OOo0O
+0oo0OOooO
+oo0OO0O0
+oo0OO0O
+oo0OO0OO
+oo0OO0o0
+oo0OO0o
+oo0OO0oO
+oo0OO0oo
+oo0OO
+oo0OOO00
+00oo0oOoo
+0oo0OOO0
+0oo0OOO0O
+0ooo000O0
+0oo0OOO0o
+0oo0OOO
+0ooo000o0
+0oo0OOOO0
+0oo0OOOOO
+0oo0OOOOo
+0oo0OOOo0
+oo0OOOo
+oo0OOOoO
+ooo0000O
+ooo00000
+oo0OOOoo
+oo0OOo00
+oo0OOo0
+oo0OOo0o
+oo0OOo
+0oo0OOoO0
+oo0OOoO
+oo0OOoOo
+oo0OOoo0
+oo0OOooo
+oo0Oo000
+oo0Oo00
+oo0Oo00O
+oo0Oo00o
+oo0Oo0O0
+0oo0Oo0O
+oo0Oo0OO
+oo0Oo0Oo
+oo0Oo0o0
+oo0Oo0o
+oo0Oo0oO
+oo0Oo0oo
+oo0Oo
+oo0OoO00
+oo0OoO0
+0oo0OoO0O
+oo0OoO0o
+oo0OoOO
+oo0OoOOO
+oo0OoOOo
+oo0OoOo0
+oo0OoOo
+oo0OoOoO
+oo0OoOoo
+oo0Ooo00
+0oo0Ooo0
+oo0Ooo0O
+oo0Ooo0o
+oo0OooO
+oo0OooOO
+oo0OooOo
+oo0Oooo0
+oo0Oooo
+oo0OoooO
+0oo0Ooooo
+oo0o0000
+oo0o000
+oo0o000O
+oo0o000o
+oo0o00
+oo0o00O0
+oo0o00o
+oo0o00O
+oo0o00Oo
+0oo0o00oO
+oo0o00OO
+oo0o00o0
+oo0o00oo
+oo0o0
+oo0o0O00
+oo0o0O0o
+oo0o0o
+oo0o0O
+oo0o0OO0
+0oo0o0OO
+oo0o0OOO
+oo0o0OOo
+oo0o0Oo0
+oo0o0OoO
+oo0o0Ooo
+oo0o0o00
+oo0o0o0
+oo0o0o0O
+oo0o0o0o
+0oo0o0oO0
+oo0o0oO
+oo0o0oOO
+oo0o0oOo
+oo0o0oo0
+oo0o0oo
+oo0o0ooO
+oo0o0ooo
+oo0o
+oo0oO000
+00oo0oO00
+0oo0oO0oO
+0oo0oO00O
+0oo0oO00o
+0oo0oO0O0
+0oo0oO0O
+0oo0oO0OO
+0oo0oO0Oo
+0oo0oO0o0
+0oo0oO0o
+0oo0oO0oo
+oo0oO
+oo0oOO00
+oo0oOO0O
+oo0oOO0o
+oo0oOO
+oo0oOOO0
+oo0oOOO
+oo0oOOOo
+oo0oOOo0
+0oo0oOOoo
+oo0oOo00
+oo0oOo0
+oo0oOo0O
+oo0oOo0o
+oo0oOo
+oo0oOoO0
+oo0oOoOO
+oo0oOoOo
+oo0oOoo0
+0oo0oOooO
+oo0oOooo
+oo0oo000
+ooo0oOO
+oooOooO
+oo0oo00
+oo0oo00O
+oo0oo00o
+oo0oo0
+oo0oo0O0
+0oo0oo0O
+oo0oo0OO
+oo0oo0Oo
+oo0oo0o0
+oo0oo0o
+oo0oo0oO
+oo0oo0oo
+oo0oo
+oo0ooO00
+oo0ooO0
+0oo0ooO0O
+oo0ooO0o
+oo0ooOO0
+oo0ooOO
+ooo0O0oo
+ooo0oooO
+oo0ooOOO
+oo0ooOOo
+oo0ooOo0
+oo0ooOo
+0oo0ooOoO
+oo0ooOoo
+oo0ooo00
+oo0ooo0
+oo0ooo0o
+oo0ooo0O
+oo0ooo
+oo0oooOO
+oo0oooO0
+oo0oooO
+0oo0oooOo
+oo0oooo0
+oo0oooo
+oo0ooooO
+oo0ooooo
+oo
+ooO00000
+oooooOo
+ooO0000
+ooO0000O
+0ooOooOOO
+ooO0000o
+ooO0oo
+ooO000
+ooO000O0
+ooO000O
+ooO000OO
+ooO000Oo
+ooO000o0
+ooO000o
+0ooO000oO
+ooO000oo
+ooO00
+ooO0OOoo
+ooOo000o
+ooOo00O0
+ooO00O00
+ooO00O0O
+ooO0OOoO
+ooO00O0o
+00ooO00O
+0ooOo00o0
+0ooO00OO0
+0ooO00OO
+0ooO0OOOO
+0ooO00OOO
+0ooO00OOo
+0ooO00Oo0
+0ooO00Oo
+0ooO00OoO
+0ooOo00OO
+ooO00Ooo
+ooO00o00
+ooO00o0
+ooO00o0O
+ooO00o0o
+ooO00o
+ooO00oO0
+ooO00oO
+ooO00oOO
+0ooO00oOo
+ooO00oo0
+ooO00oo
+ooO00ooO
+ooO00ooo
+ooO0
+ooO0O000
+oooo000
+ooO0O00
+ooO0O00O
+0ooO0O00o
+ooO0O0
+ooO0O0O0
+ooO0O0O
+ooO0O0OO
+ooO0O0Oo
+ooO0O0o0
+ooO0OOO
+ooO0O0o
+ooO0O0oO
+0ooO0O0oo
+ooO0O
+ooOo000O
+ooO0OO00
+ooO0OO0
+ooO0OO0O
+ooO0OO0o
+ooO0OO
+ooO0OOO0
+ooO0OOOo
+0ooO0OOo0
+ooO0OOo
+ooO0Oo00
+ooo0oOo
+ooO0Oo0
+ooO0Oo0O
+ooO0Oo0o
+ooO0Oo
+ooO0OoO0
+ooO0OoO
+0ooO0OoOO
+ooO0OoOo
+ooO0Ooo0
+ooO0OooO
+ooO0Oooo
+ooO0o000
+ooO0o00
+ooO0o00O
+ooO0o00o
+ooO0o0
+0ooO0o0O0
+ooO0o0O
+ooO0o0OO
+ooO0o0Oo
+ooO0o0o0
+ooO0o0o
+ooO0o0oO
+ooO0o0oo
+ooO0o
+ooO0oO00
+0ooO0oO0
+ooO0oO0O
+ooOo00Oo
+ooO0oO0o
+ooO0oO
+ooO0oOO0
+ooO0oOO
+ooO0oOOO
+ooO0oOOo
+ooO0oOo0
+0ooo0OOo
+ooO0oOo
+ooO0oOoO
+ooO0oOoo
+ooO0oo00
+ooO0oo0
+ooO0oo0O
+ooO0oo0o
+ooO0ooO0
+ooO0ooO
+00ooO0ooOO
+0ooO0ooOo
+0ooO0ooo0
+0ooO0ooo
+0ooO0oooO
+0ooO0oooo
+0ooo
+0ooO
+0ooOO0000
+0ooOO000
+0ooOO000O
+ooOO000o
+ooOO00
+ooOO00O0
+ooOO00O
+ooOO00OO
+ooOO00Oo
+ooOO00o0
+ooOO00o
+ooOO00oO
+0ooOO00oo
+ooOO0
+ooOO0O00
+ooOO0O0
+ooOO0O0O
+ooOO0O0o
+ooOO0OO0
+ooOO0OO
+ooOO0OOO
+ooOOo0OO
+0ooOO0OOo
+ooOO0Oo0
+ooOO0Oo
+ooOO0OoO
+ooOO0Ooo
+ooOO0o00
+ooOO0o0
+ooOO0o0O
+ooOO0o0o
+ooOO0o
+0ooOO0oO0
+ooOO0oO
+ooOO0oOO
+ooOO0oOo
+ooOO0oo0
+ooOO0oo
+ooOO0ooO
+ooOO0ooo
+ooOOO00
+ooOOoO
+0ooOOO0
+ooOOO0O
+ooOOO0o
+ooOOO
+ooOOOO00
+ooOOOO0
+ooOOOO0O
+ooOOOO0o
+ooOOOO
+ooOOOOO0
+0ooOOOOO
+ooOOOOOO
+ooOOOOo
+ooOOOo0
+ooOOOo
+ooOOOoO
+ooOOOoo
+ooOOo000
+ooOOo00O
+ooOOo00o
+0ooOOo0O0
+ooOOo0O
+ooOOo0Oo
+ooOOo0o0
+ooOOo0o
+ooOOo0oO
+ooOOo0oo
+ooOOo
+ooOOoO0
+ooOOoO0O
+0ooOOoO0o
+ooOOoOo
+ooOOoo00
+ooOOoo0
+ooOOoo0O
+ooOOoo0o
+ooOOoo
+ooOOooO0
+ooOOooO
+ooOOooOO
+0ooOOooo0
+ooOOooo
+ooOOoooo
+ooOo0000
+ooOo000
+ooOo00
+ooOo00oO
+ooOo00oo
+ooOo0
+ooOo0O00
+00ooOo0o0
+0ooOo0O0
+0ooOo0oOo
+0ooOo0O0O
+0ooOo0O0o
+0ooOo0O
+0ooOo0OO0
+0ooOo0OO
+0ooOoOo0o
+0ooOooOOo
+0ooOo0OOO
+ooOo0OOo
+ooOo0Oo0
+ooOo0Oo
+ooOo0OoO
+ooOo0Ooo
+ooOo0o00
+ooOo0o0O
+ooOo0o0o
+ooOo0o
+0ooOo0oO0
+ooOo0oO
+ooOo0oOO
+ooOo0oo0
+ooOo0oo
+ooOo0ooO
+ooOo0ooo
+ooOoO000
+ooOoO00
+ooOoO00O
+0ooOoO00o
+ooOoO0
+ooOoO0O0
+ooOoO0O
+ooOoO0OO
+ooOoO0Oo
+ooOoO0o0
+ooOoO0o
+ooOoO0oO
+ooOoO0oo
+0ooOoO
+ooOoOoOO
+ooOoOO00
+ooOoOO0
+ooOoOOOo
+ooOoOO0O
+ooOoOO0o
+ooOoOO
+ooOoOOO0
+ooOoOOO
+0ooOoOOOO
+ooOoOOo0
+ooOoOOo
+ooOoOOoO
+ooOoOOoo
+ooOoOo00
+ooOoOo0
+ooOoOo0O
+ooOoOo
+ooOoOoO0
+0ooOoOoO
+ooOoOoOo
+ooOoOoo0
+ooOoOoo
+ooOoOooO
+ooOoOooo
+ooOoo000
+ooOoo00
+ooOooo0o
+ooOoo00O
+0ooOoo00o
+ooOoo0
+ooOoo0O0
+ooOoo0O
+ooOoo0OO
+ooOoo0Oo
+ooOoo0o0
+ooOoo0o
+ooOoo0oo
+ooOoo0oO
+0ooooO
+ooOoo
+ooOooO00
+ooOooO0
+ooOooO0O
+ooOooO0o
+ooOooo
+ooOooO
+ooOooOO0
+ooOooOO
+0ooOooOo0
+ooOooOo
+ooOooOoO
+ooOooOoo
+ooOooo00
+ooOooo0
+ooOooo0O
+ooOoooO0
+ooOoooO
+ooOoooOO
+000ooOoooOo
+00ooOoooo0
+00ooOoooo
+00ooOooooO
+00ooOooooo
+00ooo0000
+00ooo000oo
+00ooo0000o
+00ooo000
+00ooo000O
+00ooo000OO
+0ooo000Oo
+0ooo000o
+0ooo000oO
+0ooo00
+0ooo00O00
+0ooo00oO0
+0ooo00O0O
+0ooo00O0o
+0ooo00O
+00ooo00Oo0
+0ooo00OO0
+0ooo00OO
+0ooo00OOO
+0ooo00OOo
+0ooo00Oo
+0ooo00OoO
+0ooo00Ooo
+0ooo00o00
+0ooo00o0
+00ooo00o0O
+0ooo00o0o
+0ooo00o
+0ooo00oO
+0ooo00oOO
+0ooo00oOo
+0ooo00oo0
+0ooo00oo
+0ooo00ooO
+0ooo00ooo
+00ooo0
+0ooo0O000
+0ooo0O00
+0ooo0O00O
+0ooo0O00o
+0ooo0oo
+0ooo0o0
+0ooo0oO
+0ooo0O0
+0ooo0O0O0
+00ooo0O0O
+0ooo0O0OO
+0ooo0O0Oo
+0ooo0O0o0
+0ooo0O0o
+0ooo0O0oO
+0ooo0O
+0ooo0OO00
+0ooo0OO0
+0ooo0OO0O
+00ooo0OO0o
+0ooo0Oo
+0ooo0OO
+0ooo0OOO0
+0ooo0OOO
+0oooo00oo
+0ooo0OOoO
+0ooo0OOOO
+0ooo0OOOo
+0ooo0OOo0
+00ooo0OOoo
+0ooo0Oo00
+0ooo0Oo0O
+0ooo0Oo0o
+0ooo0OoO0
+0ooo0OoOO
+0ooo0OoOo
+0ooo0Ooo0
+0ooo0OooO
+0ooo0Oooo
+00ooo0o000
+0ooo0o00
+0ooo0o00O
+0ooo0o00o
+0ooo0o0OO
+0ooo0o0O0
+0ooo0o0O
+0ooo0o0Oo
+0ooo0o0o0
+0ooo0o0o
+00ooo0o0oO
+0ooo0o0oo
+0ooo0oO00
+0ooo0oO0
+0ooo0oO0O
+0ooo0oO0o
+0ooo0oOO0
+0ooo0oOOO
+0ooo0oOOo
+0ooo0oOo0
+00ooo0oOoO
+0ooo0oOoo
+0ooo0oo00
+0ooo0oo0
+0ooo0oo0O
+0ooo0oo0o
+0ooo0ooO0
+0ooo0ooO
+0ooo0ooOO
+0ooo0ooOo
+0ooo0ooo0
+ooo0oooo
+oooO0oo0
+oooO0000
+oooO000
+oooO00o0
+oooO000O
+oooO0ooo
+oooO000o
+ooooo0
+0oooooo
+ooooOo
+oooO00
+oooO00O0
+oooO00O
+oooO00Oo
+oooO00OO
+oooO00o
+ooooOOOo
+ooooOOOO
+0ooooOo00
+oooO0oO0
+oooO00oO
+oooO00oo
+oooO0
+oooO0O00
+oooO0O0
+oooO0O0O
+oooO0O0o
+oooO0O
+0oooOOo0O
+oooO0OO0
+oooO0OO
+oooO0OOO
+oooO0OOo
+oooO0Oo0
+oooO0Oo
+oooO0OoO
+oooO0Ooo
+oooO0o00
+0oooO0o0
+oooO0o0O
+oooO0o0o
+oooooO
+oooO0o
+oooO0oO
+oooO0oo
+oooO0ooO
+oooO
+oooOooOO
+0oooOO000
+oooOO00
+oooOO0o0
+oooOO00O
+oooOO00o
+oooOO0O0
+oooOO0O
+oooOO0OO
+oooOO0Oo
+oooOO0o
+0oooOO0oO
+oooOO0oo
+oooOO
+oooOOO00
+oooOOO0
+oooOOO0O
+oooOOO0o
+oooOOO
+oooOOOO0
+oooOOOO
+0oooOOOOO
+oooOOOOo
+oooOOOo0
+oooOOOo
+oooOOOoO
+oooOOOoo
+oooOOo00
+oooOOo0
+oooOOo0o
+oooOOo
+0oooOOoO0
+oooOOoO
+oooOOoOO
+oooOOoOo
+oooOOoo0
+oooOOoo
+oooOOooO
+oooOOooo
+oooOo000
+oooOo00
+00oooOo00O
+0oooOo00o
+0oooOo0
+0oooOo0oo
+0oooOo0O0
+0oooOo0O
+0oooOo0OO
+0oooOo0Oo
+0oooOo0o0
+0oooOo0o
+0oooOo0oO
+oooOo
+oooOoO00
+oooOoO0
+oooOoO0O
+oooOoO0o
+oooOoOOO
+oooOoOO0
+oooOoOO
+oooOoOOo
+0oooOoOo0
+oooOoOo
+oooOoOoO
+oooOoOoo
+oooOoo00
+oooOoo0
+oooOoo0O
+oooOoo0o
+oooOooO0
+oooOooOo
+0oooOooo0
+oooOooo
+oooOoooO
+oooOoooo
+oooo0000
+oooo000O
+oooo000o
+oooo00
+oooo00o0
+oooo00O0
+0oooo00O
+oooo00OO
+oooo00Oo
+oooo00oO
+oooo0
+oooo0O00
+oooo0O0
+oooo0O0O
+oooo0O0o
+oooo0O
+0oooo0OO0
+oooo0OO
+oooo0OOO
+oooo0OOo
+oooo0Oo0
+oooo0Oo
+oooo0OoO
+oooo0Ooo
+oooo0o00
+oooo0o0
+0oooo0o0O
+oooo0o0o
+oooo0o
+oooo0oO0
+oooo0oO
+oooo0oOO
+oooo0oOo
+oooo0oo0
+oooo0oo
+oooo0ooO
+0oooo0ooo
+oooo
+ooooO00
+ooooOOoO
+ooooO00O
+ooooO00o
+ooooO0
+ooooO0O
+ooooO0OO
+ooooO0Oo
+0ooooO0o0
+ooooO0o
+ooooO0oO
+ooooOO0
+ooooOO0o
+ooooOO
+ooooOoo0
+ooooOOO0
+ooooOOO
+ooooOOo
+0ooooOo0
+ooooOo0O
+ooooOo0o
+ooooOoO0
+ooooOoO
+ooooOoo
+ooooOooO
+ooooOooo
+ooooo000
+ooooo00
+00ooooo00O
+0ooooo00o
+0ooooo0O0
+0ooooo0O
+0ooooo0OO
+0ooooo0Oo
+0ooooo0o0
+0ooooo0o
+0ooooo0oO
+0ooooo0oo
+0ooooo
+oooooO00
+oooooO0
+oooooOo0
+oooooO0O
+oooooO0o
+oooooOO0
+oooooOO
+oooooOOO
+oooooOOo
+0oooooOoO
+oooooOoo
+oooooo00
+oooooo0
+oooooo0O
+oooooo0o
+ooooooO0
+ooooooOO
+ooooooOo
+ooooooo0
+0oooooooO
+oooooooo
+O
+O0
+O00
+O000
+O0000
+O00000
+O000000
+O0000000
+O000000O
+O00000O
+O00000O0
+O00000OO
+O0000O
+O0000O0
+O0000O00
+O0000O0O
+O0000OO
+O0000OO0
+O0000OOO
+O000O
+O000O0
+O000O00
+O000O000
+O000O00O
+O000O0O
+O000O0O0
+O000o0oO
+O000Oo
+O000OO0
+O000oo00
+O000OO0O
+O000OOO
+O000OOO0
+O000OOOO
+O00O
+O00O0
+O00O00
+O00O000
+O00O0000
+O00O000O
+O00O00O
+O00O00O0
+O00O00OO
+O00O0O
+O00O0O0
+O00O0O00
+O00O0O0O
+O00O0oO
+O00O0OO0
+O00O0OOO
+O00OO
+O00OO0
+O00OO00
+O00Oo000
+O00Oo00O
+O00Oo0O
+O00Oo0O0
+O00oo0oO
+O00OOO
+O00OOO0
+O00OoO00
+O00ooo0O
+O00OOOO
+O00oOoO0
+O00ooooO
+O0O
+O0O0
+O0O00
+O0O000
+O0O0000
+o0o00000
+o0o0000O
+O0O000O
+o0O000O0
+o0O000OO
+O0O00O
+O0O00O0
+o0O00O00
+o0O00O0O
+O0O00oo
+o0O00OO0
+o0O00OOo
+O0o0o
+O0O0O0
+O0O0O00
+o0O0O000
+o0O0O00o
+O0O0O0O
+o0O0O0O0
+o0O0O0OO
+O0O0Oo
+O0o0oo0
+o0O0OO00
+o0O0OO0o
+O0o0ooo
+o0O0OOo0
+o0O0OOOO
+O0OO
+O0OO0
+O0OO00
+O0OO000
+o0OO0000
+o0OO000O
+o0Oo00O
+o0OO00O0
+o0OO00oO
+O0OO0o
+O0OO0O0
+o0OO0O00
+o0oO0O0O
+O0OO0OO
+o0oO0Oo0
+o0oO0oOo
+O0OOO
+O0OOo0
+o0OoO00
+o0OOO000
+o0OoO00o
+O0OoO0o
+o0ooo0O0
+o0ooo0Oo
+O0oOOO
+O0OOOO0
+o0ooOO00
+o0OOOO0O
+O0oOOOO
+o0ooOOo0
+o0ooooOO
+OO
+OO0
+OO00
+OO000
+Oo0000
+OO00000
+oO000000
+oO00000O
+OO0000O
+oO0000O0
+oO0000OO
+OO000O
+OO000O0
+oO000O00
+oO000o0O
+oO000OO
+oO000OO0
+oo000ooo
+OO00o
+OO00o0
+OO00O00
+oO00O000
+oO00O00O
+OO00O0O
+oO00O0O0
+oO00O0OO
+Oo00oO
+OO00OO0
+oO00OO00
+oO00OO0o
+Oo00oOo
+oO00OOO0
+oO00OOOO
+OO0O
+OO0O0
+OO0O00
+OO0O000
+oO0O0000
+oO0O000O
+OO0O00O
+oO0O00O0
+oO0O00OO
+OO0o0O
+OO0O0O0
+oO0O0o00
+oo0o0O0O
+Oo0o0OO
+oO0O0OO0
+oO0O0Ooo
+OO0Oo
+OO0OO0
+OO0OO00
+oO0Oo000
+oO0Oo00o
+OO0OO0O
+oO0OO0O0
+oO0Oo0oO
+Oo0OOO
+OO0OOO0
+oO0OOo00
+oO0OoO0o
+Oo0OoOO
+oO0Oooo0
+oO0OoOOo
+OOo
+OOO0
+OoO00
+OOO000
+OOO0000
+oOo00000
+oOo0000o
+OOO000O
+oOo000O0
+oOo000oO
+OOO00O
+ooo00O0
+oOo00O00
+oOo00O0o
+OOO00OO
+oOO00oo0
+oOo00Ooo
+OOo0O
+OOO0O0
+OOO0O00
+oOO0o000
+oOO0o00O
+Ooo0o0O
+oOo0o0O0
+oOo0o0oo
+OOO0OO
+Ooo0Oo0
+oOO0OO00
+oOo0oo0o
+ooo0ooo
+oOO0OOO0
+oOo0oooo
+OOOO
+OooO0
+OOOO00
+OOOO000
+oOOO0000
+oOOO000O
+ooOo00o
+oOOO00O0
+oOOO00OO
+OOOO0o
+OOOO0O0
+oOOO0O00
+oOOO0O0O
+Oooo0Oo
+oOOO0Oo0
+oooO0oOo
+Ooooo
+OOoOO0
+OoOOO00
+ooOOO000
+ooOOO00o
+OOOOO0O
+oOOoO0o0
+ooOOO0OO
+oooOoo
+OOOOOO0
+ooOOoO00
+ooooOO0O
+ooOOoOO
+ooOOOOo0
+ooOOOoOO
diff --git a/wechathelper/proguard-rules.pro b/wechathelper/proguard-rules.pro
index 205bc72..4f50022 100644
--- a/wechathelper/proguard-rules.pro
+++ b/wechathelper/proguard-rules.pro
@@ -39,4 +39,8 @@
-dontwarn org.eclipse.jdt.annotation.**
-dontwarn c.t.**
-dontwarn android.support.v4.animation.**
--dontwarn android.support.v7.widget.**
\ No newline at end of file
+-dontwarn android.support.v7.widget.**
+
+-obfuscationdictionary dic.txt
+-classobfuscationdictionary dic.txt
+-packageobfuscationdictionary dic.txt
\ No newline at end of file
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java
index e56b839..922d7e3 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java
@@ -11,7 +11,7 @@
import com.wuxiaosu.wechathelper.hook.ExdeviceRankHook;
import com.wuxiaosu.wechathelper.hook.ExtDeviceWXLoginUIHook;
import com.wuxiaosu.wechathelper.hook.LauncherUIHook;
-import com.wuxiaosu.wechathelper.hook.MoneyHook;
+import com.wuxiaosu.wechathelper.hook.WalletHook;
import com.wuxiaosu.wechathelper.hook.RevokeMsgHook;
import com.wuxiaosu.wechathelper.hook.StepHook;
import com.wuxiaosu.wechathelper.hook.TencentLocationManagerHook;
@@ -95,9 +95,9 @@ protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Thr
private void handleHook(ClassLoader classLoader, String versionName) {
new TencentLocationManagerHook(versionName).hook(classLoader);
- new EmojiGameHook(versionName).hook(classLoader);
- new MoneyHook(versionName).hook(classLoader);
- new UIHook(versionName).hook(classLoader);
+ EmojiGameHook.getInstance().init(classLoader, versionName);
+ WalletHook.getInstance().init(classLoader, versionName);
+ UIHook.getInstance().init(classLoader, versionName);
LauncherUIHook.getInstance().init(classLoader, versionName);
ExdeviceRankHook.getInstance().init(classLoader, versionName);
RevokeMsgHook.getInstance().init(classLoader, versionName);
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java
index 4471063..0de44a1 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java
@@ -35,8 +35,6 @@
import com.wuxiaosu.widget.SettingLabelView;
import com.wuxiaosu.widget.utils.PropertiesUtils;
-import java.util.Arrays;
-
import butterknife.BindView;
import butterknife.OnClick;
@@ -210,7 +208,7 @@ private void showInfo() {
TextView mTvVersionName = view.findViewById(R.id.tv_version_name);
TextView mTvInfo = view.findViewById(R.id.tv_info);
final TextView mTvUrl = view.findViewById(R.id.tv_url);
- mTvUrl.setText(Html.fromHtml("https://github.com/wuxiaosu/XposedWechatHelper"));
+ mTvUrl.setText(Html.fromHtml("https://www.coolapk.com/apk/com.wuxiaosu.wechathelper"));
mTvUrl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -218,9 +216,7 @@ public void onClick(View v) {
}
});
mTvVersionName.setText(getString(R.string.app_name) + " v" + BuildConfig.VERSION_NAME);
- mTvInfo.setText(getString(R.string.app_description)
- + ",当前版本已支持\n微信:"
- + Arrays.toString(wechatSupportVersions)
+ mTvInfo.setText("可以请作者喝杯豆浆"
+ getContactInfo()
+ "\n更多详情:");
AlertDialog alertDialog = new AlertDialog.Builder(this)
@@ -231,9 +227,8 @@ public void onClick(View v) {
}
private String getContactInfo() {
- return "\nQQ交流群:[123320001]\n" +
- "微信进群加微信:[CSYJZF]\n" +
- "一键点赞问题反馈微信:[WUXIAOSU45]";
+ return "\nQ群:[123320001]\n" +
+ "微信群加:[CSYJZF]\n";
}
private void sendURLIntent(String url) {
@@ -252,6 +247,8 @@ private void sendURLIntent(String url) {
private void showModuleActiveInfo(boolean isModuleActive) {
if (!isModuleActive) {
Toast.makeText(this, "模块未激活", Toast.LENGTH_SHORT).show();
+ } else {
+ showInfo();
}
}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java
index dc41d80..5f42ca4 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java
@@ -1,8 +1,13 @@
package com.wuxiaosu.wechathelper.hook;
+import android.annotation.SuppressLint;
+
import com.wuxiaosu.wechathelper.utils.Constant;
import com.wuxiaosu.widget.utils.PropertiesUtils;
+import java.lang.reflect.Method;
+import java.util.Random;
+
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
@@ -17,40 +22,62 @@ public class EmojiGameHook {
private String morra;
private boolean fakeDice;
private String dice;
- private String methodName;
- private String clazzName;
- public EmojiGameHook(String versionName) {
- switch (versionName) {
- case "6.6.0":
- clazzName = "com.tencent.mm.sdk.platformtools.bh";
- methodName = "em";
- break;
- case "6.6.1":
- clazzName = "com.tencent.mm.sdk.platformtools.bh";
- methodName = "en";
- break;
- case "6.6.2":
- clazzName = "com.tencent.mm.sdk.platformtools.bh";
- methodName = "eF";
- break;
- case "6.6.3":
- clazzName = "com.tencent.mm.sdk.platformtools.bh";
- methodName = "eF";
- break;
- case "6.6.5":
- clazzName = "com.tencent.mm.sdk.platformtools.bi";
- methodName = "eI";
- break;
- default:
- case "6.6.6":
- clazzName = "com.tencent.mm.sdk.platformtools.bh";
- methodName = "eE";
- break;
+ private EmojiGameHook() {
+ }
+
+ private ClassLoader classLoader;
+
+ public void init(ClassLoader classLoader, String versionName) {
+ if (this.classLoader == null) {
+ this.classLoader = classLoader;
+ hook(classLoader);
+ }
+ }
+
+ public static EmojiGameHook getInstance() {
+ return EmojiGameHook.SingletonHolder.instance;
+ }
+
+ private static class SingletonHolder {
+ @SuppressLint("StaticFieldLeak")
+ private static final EmojiGameHook instance = new EmojiGameHook();
+ }
+
+ private void hook(final ClassLoader classLoader) {
+ try {
+ XposedHelpers.findAndHookMethod(Random.class, "nextInt", int.class, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ if ((int) param.args[0] < 10) {
+ StackTraceElement[] traceElements = Thread.currentThread().getStackTrace();
+ for (StackTraceElement traceElement : traceElements) {
+ if (traceElement.getClassName().startsWith("com.tencent.mm.sdk.platformtools.")) {
+ Method[] methods = XposedHelpers.findClass(traceElement.getClassName(), classLoader).getMethods();
+ for (Method method : methods) {
+ if (method.getName().equals(traceElement.getMethodName())) {
+ if (method.getParameterTypes().length == 2) {
+ if (method.getParameterTypes()[0] == int.class
+ && method.getParameterTypes()[1] == int.class
+ && method.getReturnType() == int.class) {
+ hook(classLoader, traceElement.getClassName(), method.getName());
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ super.beforeHookedMethod(param);
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
}
}
- public void hook(ClassLoader classLoader) {
+ private void hook(final ClassLoader classLoader, String clazzName, String methodName) {
try {
Class clazz = XposedHelpers.findClass(clazzName, classLoader);
XposedHelpers.findAndHookMethod(clazz, methodName, int.class, int.class, new XC_MethodHook() {
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java
index 12cd489..9575570 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java
@@ -8,6 +8,10 @@
import android.widget.ListView;
import android.widget.RelativeLayout;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
@@ -23,7 +27,6 @@
public class ExdeviceRankHook {
- private String itemInfoFieldName;
private ListView listView;
private int likeIconId = 0;
@@ -33,35 +36,12 @@ private ExdeviceRankHook() {
private ClassLoader classLoader;
public void init(ClassLoader classLoader, String versionName) {
- switch (versionName) {
- case "6.6.0":
- itemInfoFieldName = "lqh";
- break;
- case "6.6.1":
- itemInfoFieldName = "lus";
- break;
- case "6.6.2":
- itemInfoFieldName = "lZj";
- break;
- case "6.6.3":
- itemInfoFieldName = "lZj";
- break;
- case "6.6.5":
- itemInfoFieldName = "meX";
- break;
- default:
- case "6.6.6":
- itemInfoFieldName = "mcf";
- break;
- }
if (this.classLoader == null) {
this.classLoader = classLoader;
hook(classLoader);
}
}
- private long startTime = 0;
-
public static ExdeviceRankHook getInstance() {
return ExdeviceRankHookHolder.instance;
}
@@ -73,7 +53,20 @@ private static class ExdeviceRankHookHolder {
private void hook(final ClassLoader classLoader) {
try {
- Class contextMenuClazz = XposedHelpers.findClass("com.tencent.mm.ui.base.n", classLoader);
+ Class menuClazz = XposedHelpers.findClass("com.tencent.mm.plugin.exdevice.ui.ExdeviceRankInfoUI$19", classLoader);
+
+ Class contextMenuClazz = null;
+
+ String methodName = "";
+ Method[] methods = menuClazz.getMethods();
+ for (Method method : methods) {
+ if (method.getReturnType() == void.class && method.getParameterTypes().length == 1) {
+ //写法偷懒了 以后出问题了再说
+ methodName = method.getName();
+ contextMenuClazz = method.getParameterTypes()[0];
+ break;
+ }
+ }
XposedHelpers.findAndHookMethod(contextMenuClazz, "a",
int.class, CharSequence.class, int.class, new XC_MethodHook() {
@Override
@@ -84,9 +77,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
});
- Class menuClazz = XposedHelpers.findClass("com.tencent.mm.plugin.exdevice.ui.ExdeviceRankInfoUI$19", classLoader);
-
- XposedBridge.hookAllMethods(menuClazz, "a", new XC_MethodHook() {
+ XposedBridge.hookAllMethods(menuClazz, methodName, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Object object = param.args[0];
@@ -107,17 +98,39 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
MenuItem menuItem = (MenuItem) param.args[0];
if (menuItem.getItemId() == 4 && listView != null) {
- startTime = System.currentTimeMillis();
- XposedBridge.log(" --- >> like start");
Observable.create(new ObservableOnSubscribe() {
@Override
- public void subscribe(ObservableEmitter emitter) throws InterruptedException {
+ public void subscribe(ObservableEmitter emitter) {
ListAdapter listAdapter = listView.getAdapter();
+ Object itemObject = listAdapter.getItem(1);
+ Constructor[] constructors = itemObject.getClass().getDeclaredConstructors();
+
+ String itemInfoFieldName = "";
+ for (Constructor constructor : constructors) {
+ Class[] classes = constructor.getParameterTypes();
+ if (classes.length == 5) {
+ if (classes[0] == int.class
+ && classes[1] == int.class
+ && classes[2] == String.class
+ && classes[3] == String.class) {
+
+ Field[] fields = itemObject.getClass().getDeclaredFields();
+
+ for (Field field : fields) {
+ if (field.getType() == classes[4]) {
+ itemInfoFieldName = field.getName();
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
int rankNum = (int) XposedHelpers.getObjectField(
XposedHelpers.getObjectField(listAdapter.getItem(1),
itemInfoFieldName),
"field_ranknum");
- XposedBridge.log(" --- >> for start - > " + (System.currentTimeMillis() - startTime));
for (int i = 3; i < listAdapter.getCount() - 1; i++) {
if (i != rankNum + 2) {
int selfLikeState = (int) XposedHelpers.getObjectField(
@@ -126,15 +139,11 @@ public void subscribe(ObservableEmitter emitter) throws InterruptedExcepti
"field_selfLikeState");
if (selfLikeState == 0) {
// 没赞过的
- XposedBridge.log(" --- >> get view start " + i + " - > " + (System.currentTimeMillis() - startTime));
-
View view = ((RelativeLayout) ((LinearLayout)
((RelativeLayout) listAdapter.getView(i, null, null))
.getChildAt(1))
.getChildAt(1)).getChildAt(1);
- XposedBridge.log(" --- >> get view done " + i + " - > " + (System.currentTimeMillis() - startTime) + " " + view);
-
emitter.onNext(view);
}
}
@@ -143,10 +152,8 @@ public void subscribe(ObservableEmitter emitter) throws InterruptedExcepti
}).subscribe(new Consumer() {
@Override
public void accept(View view) {
- XposedBridge.log(" --- >> click start - > " + (System.currentTimeMillis() - startTime) + " " + view);
view.callOnClick();
view.destroyDrawingCache();
- XposedBridge.log(" --- >> click done - > " + (System.currentTimeMillis() - startTime) + " " + view);
}
});
}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java
index 8707273..9c2caec 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java
@@ -4,10 +4,14 @@
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
+import android.widget.AdapterView;
+import android.widget.PopupWindow;
import com.wuxiaosu.wechathelper.utils.Constant;
import com.wuxiaosu.widget.utils.PropertiesUtils;
+import java.lang.reflect.Field;
+
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
@@ -21,9 +25,7 @@
public class LauncherUIHook {
- private boolean fakeLauncherMenu;
-
- private int[] iconIds;
+ private int[] iconIds = new int[2];
private LauncherUIHook() {
}
@@ -31,27 +33,6 @@ private LauncherUIHook() {
private ClassLoader classLoader;
public void init(ClassLoader classLoader, String versionName) {
- switch (versionName) {
- case "6.6.0":
- iconIds = new int[]{2131165958, 2131166039};
- break;
- case "6.6.1":
- iconIds = new int[]{2131165967, 2131166048};
- break;
- case "6.6.2":
- iconIds = new int[]{2131165967, 2131166048};
- break;
- case "6.6.3":
- iconIds = new int[]{2131165967, 2131166048};
- break;
- case "6.6.5":
- iconIds = new int[]{2131165967, 2131166048};
- break;
- default:
- case "6.6.6":
- iconIds = new int[]{2131165986, 2131166064};
- break;
- }
if (this.classLoader == null) {
this.classLoader = classLoader;
hook(classLoader);
@@ -68,12 +49,14 @@ private static class SingletonHolder {
}
private void hook(final ClassLoader classLoader) {
- fakeLauncherMenu = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_launcher_menu", "false"));
+ boolean fakeLauncherMenu = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_launcher_menu", "false"));
if (!fakeLauncherMenu) {
return;
}
+ initItemClass(classLoader);
+
try {
Class clazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUI", classLoader);
XposedHelpers.findAndHookMethod(clazz, "onCreateOptionsMenu",
@@ -121,4 +104,83 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log(e);
}
}
+
+
+ /**
+ * find item bean
+ *
+ * @param classLoader
+ */
+ private void initItemClass(final ClassLoader classLoader) {
+ try {
+ final Class homeUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.HomeUI", classLoader);
+ final Class launcherUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUI", classLoader);
+
+ XposedHelpers.findAndHookMethod(launcherUIClazz, "onResume", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Object homeUIObject = null;
+ Field[] launcherUIFields = launcherUIClazz.getFields();
+ for (Field field : launcherUIFields) {
+ if (field.getType() == homeUIClazz) {
+ homeUIObject = XposedHelpers.getObjectField(param.thisObject, field.getName());
+ }
+ }
+ Field[] homeUIFields = homeUIClazz.getDeclaredFields();
+ for (Field homeUIField : homeUIFields) {
+ Object object = XposedHelpers.getObjectField(homeUIObject, homeUIField.getName());
+ if (object instanceof AdapterView.OnItemClickListener
+ && object instanceof PopupWindow.OnDismissListener) {
+
+ Class[] classes = object.getClass().getClasses();
+ for (Class aClass : classes) {
+
+ Field[] fields = aClass.getDeclaredFields();
+
+ if (fields.length == 5) {
+ int intCount = 0;
+ int stringCount = 0;
+ for (Field field : fields) {
+ intCount = intCount + (field.getType() == int.class ? 1 : 0);
+ stringCount = stringCount + (field.getType() == String.class ? 1 : 0);
+ }
+ if (intCount == 3 && stringCount == 2) {
+ initIconIds(aClass);
+ }
+ }
+ }
+ }
+ }
+ super.beforeHookedMethod(param);
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * find icon id
+ *
+ * @param itemClass
+ */
+ private void initIconIds(final Class itemClass) {
+ try {
+ XposedBridge.hookAllConstructors(itemClass, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ int arg0 = (int) param.args[0];
+ int iconId = (int) param.args[3];
+ if (arg0 == 10) {
+ iconIds[0] = iconId;
+ } else if (arg0 == 20) {
+ iconIds[1] = iconId;
+ }
+ super.beforeHookedMethod(param);
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java
deleted file mode 100644
index afed965..0000000
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.wuxiaosu.wechathelper.hook;
-
-import android.widget.TextView;
-
-import com.wuxiaosu.wechathelper.BuildConfig;
-import com.wuxiaosu.wechathelper.utils.Constant;
-import com.wuxiaosu.widget.SettingLabelView;
-import com.wuxiaosu.widget.utils.PropertiesUtils;
-
-import de.robv.android.xposed.XC_MethodHook;
-import de.robv.android.xposed.XSharedPreferences;
-import de.robv.android.xposed.XposedHelpers;
-
-import static de.robv.android.xposed.XposedHelpers.getObjectField;
-
-
-/**
- * Created by su on 2018/2/05.
- * 零钱 hook
- */
-
-public class MoneyHook {
-
- private static boolean fakeMoney;
- private static String money;
-
- private String mallIndexUIMethodName;
- private String mallIndexUIFiledName;
-
- private String walletBalanceManagerUIMethodName;
- private String walletBalanceManagerUIFiledName;
-
- public MoneyHook(String versionName) {
- switch (versionName) {
- //6.6.1 通过
- case "6.6.0":
- mallIndexUIMethodName = "aSR";
- mallIndexUIFiledName = "nya";
-
- walletBalanceManagerUIMethodName = "au";
- walletBalanceManagerUIFiledName = "rFA";
- break;
- case "6.6.1":
- mallIndexUIMethodName = "aTu";
- mallIndexUIFiledName = "nCe";
-
- walletBalanceManagerUIMethodName = "au";
- walletBalanceManagerUIFiledName = "rJK";
- break;
- case "6.6.2":
- mallIndexUIMethodName = "aYm";
- mallIndexUIFiledName = "olV";
-
- walletBalanceManagerUIMethodName = "au";
- walletBalanceManagerUIFiledName = "szP";
- break;
- case "6.6.5":
- mallIndexUIMethodName = "aYS";
- mallIndexUIFiledName = "orA";
-
- walletBalanceManagerUIMethodName = "av";
- walletBalanceManagerUIFiledName = "sFT";
- break;
- default:
- case "6.6.6":
- mallIndexUIMethodName = "bbL";
- mallIndexUIFiledName = "oFV";
-
- walletBalanceManagerUIMethodName = "aF";
- walletBalanceManagerUIFiledName = "ths";
- break;
- }
- }
-
- private void reload() {
- money = PropertiesUtils.getValue(Constant.PRO_FILE, "money", "0.00");
- fakeMoney = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_money", "false"));
- }
-
- public void hook(ClassLoader classLoader) {
- try {
- Class clazz = XposedHelpers.findClass("com.tencent.mm.plugin.mall.ui.MallIndexUI", classLoader);
- if (clazz != null) {
- XposedHelpers.findAndHookMethod(clazz, mallIndexUIMethodName, new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- reload();
- if (fakeMoney) {
- Object object = param.thisObject;
- TextView textView = (TextView) getObjectField(object, mallIndexUIFiledName);
- textView.setText("¥" + money);
- }
- super.afterHookedMethod(param);
- }
- });
- }
-
- XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.wallet.balance.ui.WalletBalanceManagerUI", classLoader,
- walletBalanceManagerUIMethodName, new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- reload();
- if (fakeMoney) {
- Object object = param.thisObject;
- TextView textView = (TextView) getObjectField(object, walletBalanceManagerUIFiledName);
- textView.setText("¥" + money);
- }
- super.afterHookedMethod(param);
- }
- });
- } catch (Error | Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java
index c2c0b89..564bf22 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java
@@ -3,18 +3,18 @@
import android.annotation.SuppressLint;
import android.content.ContentValues;
-import com.wuxiaosu.wechathelper.BuildConfig;
import com.wuxiaosu.wechathelper.utils.Constant;
-import com.wuxiaosu.widget.SettingLabelView;
import com.wuxiaosu.widget.utils.PropertiesUtils;
import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import de.robv.android.xposed.XC_MethodHook;
-import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
@@ -25,10 +25,9 @@
public class RevokeMsgHook {
private static Map msgCacheMap = new HashMap<>();
- private static Object storageInsertClazz;
+ private static Object storageInsertObject;
- private String insertClassName;
- private String insertMethodName;
+ private static String insertMethodName;
private static boolean disableRevoke;
private ClassLoader classLoader;
@@ -47,12 +46,7 @@ private static class ExdeviceRankHookHolder {
}
public void init(ClassLoader classLoader, String versionName) {
- insertClassName = "com.tencent.mm.storage.av";
- insertMethodName = "b";
- if (versionName.startsWith("6.6.6")) {
- insertClassName = "com.tencent.mm.storage.ba";
- insertMethodName = "b";
- }
+
if (this.classLoader == null) {
this.classLoader = classLoader;
hook(classLoader);
@@ -120,24 +114,54 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
try {
- // insert method
- Class clazz = XposedHelpers.findClass(insertClassName, classLoader);
- XposedBridge.hookAllMethods(clazz, insertMethodName,
- new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- storageInsertClazz = param.thisObject;
- Object msg = param.args[0];
- long msgId = -1;
- try {
- msgId = XposedHelpers.getLongField(msg, "field_msgId");
- } catch (Throwable e) {
- e.printStackTrace();
+ Class pluginMessengerFoundationClazz = XposedHelpers.findClass("com.tencent.mm.plugin.messenger.foundation.PluginMessengerFoundation", classLoader);
+ Field[] fields = pluginMessengerFoundationClazz.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getType().getName().startsWith("com.tencent.mm.plugin.messenger.foundation")) {
+ //全凭感觉 下次要改再说
+ Field[] fieldsFields = field.getType().getDeclaredFields();
+ if (fieldsFields.length == 12) {
+ for (Field fieldsField : fieldsFields) {
+ Constructor[] constructors = fieldsField.getType().getConstructors();
+ if (constructors.length == 1 && constructors[0].getParameterTypes().length == 3) {
+ Class insertClass = fieldsField.getType();
+
+ Method[] methods = insertClass.getDeclaredMethods();
+ for (Method method : methods) {
+ if (method.getParameterTypes().length == 2
+ && method.getParameterTypes()[1] == boolean.class
+ && method.getReturnType() == long.class) {
+ insertMethodName = method.getName();
+
+ XposedBridge.hookAllMethods(insertClass, insertMethodName,
+ new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ storageInsertObject = param.thisObject;
+ if (param.args.length == 2) {
+ Object msg = param.args[0];
+ long msgId = -1;
+ try {
+ msgId = XposedHelpers.getLongField(msg, "field_msgId");
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ msgCacheMap.put(msgId, msg);
+ }
+ super.afterHookedMethod(param);
+ }
+ });
+
+ break;
+ }
+ }
+ break;
}
- msgCacheMap.put(msgId, msg);
- super.afterHookedMethod(param);
}
- });
+ break;
+ }
+ }
+ }
} catch (Error | Exception e) {
e.printStackTrace();
}
@@ -156,6 +180,6 @@ private static void handleMessageRecall(ContentValues contentValues) {
XposedHelpers.setObjectField(msg, "field_content",
contentValues.getAsString("content") + "(已被阻止)");
XposedHelpers.setLongField(msg, "field_createTime", createTime + 1L);
- XposedHelpers.callMethod(storageInsertClazz, "b", msg, false);
+ XposedHelpers.callMethod(storageInsertObject, insertMethodName, msg, false);
}
}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java
index 6611893..75fa54b 100644
--- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java
@@ -1,11 +1,16 @@
package com.wuxiaosu.wechathelper.hook;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -13,13 +18,22 @@
import com.wuxiaosu.wechathelper.utils.Constant;
import com.wuxiaosu.widget.utils.PropertiesUtils;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
+import static android.content.ContentValues.TAG;
+
/**
* Created by su on 2018/03/16.
*/
@@ -27,138 +41,80 @@
public class UIHook {
private boolean hideDiscover;
- private String wClassName;
- private String wFieldName;
- private HashMap wHashMap = new HashMap();
-
- private int[] iconId;
private String discoverFragmentName;
- private String myFragmentName;
- private String adapterClassName;
- private String vMethodName;
+ private String meFragmentName;
+
+ private ClassLoader classLoader;
- private String[] switchMethodName;
+ private UIHook() {
+
+ }
- public UIHook(String versionName) {
+ public void init(ClassLoader classLoader, String versionName) {
switch (versionName) {
case "6.6.0":
- iconId = new int[]{2131165901, 2131165904, 2131165905, 2131165906};
- wClassName = "com.tencent.mm.ui.x";
- wFieldName = "wHJ";
- wHashMap.put("Lcom/tencent/mm/modelsns/e;", 0);
- wHashMap.put("Lcom/tencent/mm/modelsns/b;", 1);
- wHashMap.put("Lcom/tencent/mm/modelsns/d;", 2);
discoverFragmentName = "com.tencent.mm.ui.i";
- myFragmentName = "com.tencent.mm.ui.z";
- adapterClassName = "com.tencent.mm.ui.x$a";
- vMethodName = "ES";
-
- switchMethodName = new String[]{"Xa", "Cj"};
-
+ meFragmentName = "com.tencent.mm.ui.z";
break;
case "6.6.1":
- iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915};
- wClassName = "com.tencent.mm.ui.x";
- wFieldName = "wMd";
- wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView;", 0);
- wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView$1;", 1);
- wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView$a;", 2);
discoverFragmentName = "com.tencent.mm.ui.i";
- myFragmentName = "com.tencent.mm.ui.z";
- adapterClassName = "com.tencent.mm.ui.x$a";
- vMethodName = "Fb";
-
- switchMethodName = new String[]{"Xl", "Cq"};
+ meFragmentName = "com.tencent.mm.ui.z";
break;
case "6.6.2":
- iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915};
- wClassName = "com.tencent.mm.ui.w";
- wFieldName = "xKG";
- wHashMap.put("Lcom/google/android/gms/analytics/internal/u$a;", 0);
- wHashMap.put("Lcom/google/android/gms/analytics/internal/s;", 1);
- wHashMap.put("Lcom/google/android/gms/analytics/internal/t$a;", 2);
- discoverFragmentName = "com.tencent.mm.ui.h";
- myFragmentName = "com.tencent.mm.ui.y";
- adapterClassName = "com.tencent.mm.ui.w$a";
- vMethodName = "xe";
-
- switchMethodName = new String[]{"Yp", "DW"};
+ discoverFragmentName = "com.tencent.mm.ui.i";
+ meFragmentName = "com.tencent.mm.ui.z";
break;
case "6.6.3":
- iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915};
- wClassName = "com.tencent.mm.ui.w";
- wFieldName = "xKG";
- wHashMap.put("Lcom/google/android/gms/common/j$aa;", 0);
- wHashMap.put("Lcom/google/android/gms/common/internal/zzab;", 1);
- wHashMap.put("Lcom/google/android/gms/common/j$aa$1;", 2);
- discoverFragmentName = "com.tencent.mm.ui.h";
- myFragmentName = "com.tencent.mm.ui.y";
- adapterClassName = "com.tencent.mm.ui.w$a";
- vMethodName = "xe";
-
- switchMethodName = new String[]{"Yp", "DW"};
+ discoverFragmentName = "com.tencent.mm.ui.i";
+ meFragmentName = "com.tencent.mm.ui.z";
break;
case "6.6.5":
- iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915};
- wClassName = "com.tencent.mm.ui.w";
- wFieldName = "xTl";
- wHashMap.put("Lcom/google/android/exoplayer2/h/r;", 0);
- wHashMap.put("Lcom/google/android/exoplayer2/h/r$c;", 1);
- wHashMap.put("Lcom/google/android/exoplayer2/h/r$e;", 2);
+ discoverFragmentName = "com.tencent.mm.ui.i";
+ meFragmentName = "com.tencent.mm.ui.z";
+ break;
+ case "6.6.6":
discoverFragmentName = "com.tencent.mm.ui.h";
- myFragmentName = "com.tencent.mm.ui.y";
- adapterClassName = "com.tencent.mm.ui.w$a";
- vMethodName = "xw";
-
- switchMethodName = new String[]{"YW", "Ep"};
+ meFragmentName = "com.tencent.mm.ui.y";
break;
default:
- case "6.6.6":
- iconId = new int[]{2131165929, 2131165932, 2131165933, 2131165934};
- wClassName = "com.tencent.mm.ui.w";
- wFieldName = "yrA";
- wHashMap.put("Lcom/google/android/exoplayer2/f/e/b;", 0);
- wHashMap.put("Lcom/google/android/exoplayer2/f/d/b;", 1);
- wHashMap.put("Lcom/google/android/exoplayer2/f/e/a$a;", 2);
-
+ case "6.6.7":
discoverFragmentName = "com.tencent.mm.ui.h";
- myFragmentName = "com.tencent.mm.ui.y";
- adapterClassName = "com.tencent.mm.ui.w$a";
- vMethodName = "xz";
-
- switchMethodName = new String[]{"ZN", "EB"};
+ meFragmentName = "com.tencent.mm.ui.ab";
break;
}
+ if (this.classLoader == null) {
+ this.classLoader = classLoader;
+ hook(classLoader);
+ }
+ }
+
+ public static UIHook getInstance() {
+ return UIHook.SingletonHolder.instance;
+ }
+
+ private static class SingletonHolder {
+ @SuppressLint("StaticFieldLeak")
+ private static final UIHook instance = new UIHook();
}
- public void hook(final ClassLoader classLoader) {
+ private void hook(final ClassLoader classLoader) {
hideDiscover = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "hide_discover", "false"));
if (!hideDiscover) {
return;
}
+ initIconId(classLoader);
+ initMainTabUI(classLoader);
try {
- Class clazz = XposedHelpers.findClass(wClassName, classLoader);
- XposedHelpers.setStaticObjectField(clazz, wFieldName, wHashMap);
-
- XposedHelpers.findAndHookMethod(clazz, switchMethodName[0],
- String.class, new XC_MethodReplacement() {
- @Override
- protected Object replaceHookedMethod(MethodHookParam param) {
- XposedHelpers.callMethod(param.thisObject, switchMethodName[1], 0);
- return null;
- }
- });
-
// replace fragment
Class baseBundleClazz = XposedHelpers.findClass("android.os.BaseBundle", classLoader);
XposedHelpers.findAndHookMethod(baseBundleClazz, "putInt", String.class, int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[0].equals(discoverFragmentName)) {
- param.args[0] = myFragmentName;
+ param.args[0] = meFragmentName;
}
super.beforeHookedMethod(param);
}
@@ -169,24 +125,15 @@ Context.class, String.class, Bundle.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[1].equals(discoverFragmentName)) {
- param.args[1] = myFragmentName;
+ param.args[1] = meFragmentName;
}
super.beforeHookedMethod(param);
}
});
- Class adapterClass = XposedHelpers.findClass(adapterClassName, classLoader);
-
- XposedHelpers.findAndHookMethod(adapterClass, "getCount", new XC_MethodReplacement() {
- @Override
- protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
- return 3;
- }
- });
-
Class viewPagerClass = XposedHelpers.findClass("com.tencent.mm.ui.mogic.WxViewPager", classLoader);
- XposedHelpers.findAndHookMethod(viewPagerClass, vMethodName, int.class, new XC_MethodHook() {
+ XposedHelpers.findAndHookMethod(viewPagerClass, "setOffscreenPageLimit", int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// tab count
@@ -220,21 +167,127 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
} catch (Error | Exception e) {
XposedBridge.log(e);
}
+ }
+
+ private HashMap tempMap = new HashMap();
+ private void initMainTabUI(final ClassLoader classLoader) {
try {
- Class clazz = XposedHelpers.findClass("com.tencent.mm.ui.TabIconView", classLoader);
- XposedHelpers.findAndHookMethod(clazz, "g",
- int.class, int.class, int.class, boolean.class, new XC_MethodHook() {
- @Override
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
- if ((int) param.args[0] == iconId[0]) {
- param.args[0] = iconId[1];
- param.args[1] = iconId[2];
- param.args[2] = iconId[3];
+ Class homeUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.HomeUI", classLoader);
+ Field[] fields = homeUIClazz.getFields();
+ for (Field field : fields) {
+ if (field.getType().getName().startsWith("com.tencent.mm.ui")) {
+ Class mainTabUIClazz = field.getType();
+
+ Field[] mainTabUIFields = mainTabUIClazz.getDeclaredFields();
+ for (Field mainTabUIField : mainTabUIFields) {
+ if (mainTabUIField.getType() == HashMap.class && Modifier.isStatic(mainTabUIField.getModifiers())) {
+ HashMap hashMap = (HashMap) XposedHelpers.getStaticObjectField(mainTabUIClazz, mainTabUIField.getName());
+ Object threeKey = null;
+ for (Object o : hashMap.keySet()) {
+ if ((int) hashMap.get(o) != 2) {
+ if ((int) hashMap.get(o) == 3) {
+ tempMap.put(threeKey, 2);
+ } else {
+ tempMap.put(o, hashMap.get(o));
+ }
+ } else {
+ threeKey = o;
+ }
}
- super.beforeHookedMethod(param);
+ XposedHelpers.setStaticObjectField(mainTabUIClazz, mainTabUIField.getName(), tempMap);
+ break;
}
- });
+ }
+
+ handleHook(classLoader, mainTabUIClazz);
+ break;
+ }
+ }
+ } catch (Error | Exception e) {
+ XposedBridge.log(e);
+ }
+ }
+
+ private void handleHook(final ClassLoader classLoader, Class mainTabUIClazz) {
+ Method[] methods = mainTabUIClazz.getDeclaredMethods();
+ for (Method method : methods) {
+
+ if (method.getParameterTypes().length == 1
+ && method.getParameterTypes()[0] == String.class
+ && method.getReturnType() == void.class) {
+
+ XposedHelpers.findAndHookMethod(mainTabUIClazz, method.getName(),
+ String.class, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ if (!tempMap.containsKey(param.args[0])) {
+ param.args[0] = tempMap.keySet().toArray()[0];
+ }
+ super.beforeHookedMethod(param);
+ }
+ });
+ }
+ }
+
+ Class[] classes = mainTabUIClazz.getDeclaredClasses();
+ // adapterClass
+ XposedHelpers.findAndHookMethod(classes[0], "getCount", new XC_MethodReplacement() {
+ @Override
+ protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
+ return 3;
+ }
+ });
+ }
+
+ private boolean isThreeTabIcon = false;
+
+ private void initIconId(final ClassLoader classLoader) {
+ try {
+ Class launcherUIBottomTabViewClazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUIBottomTabView", classLoader);
+
+ Method[] methods = launcherUIBottomTabViewClazz.getDeclaredMethods();
+ for (Method method : methods) {
+ if (method.getParameterTypes().length == 1
+ && method.getParameterTypes()[0] == int.class
+ && method.getReturnType() != void.class) {
+
+ XposedHelpers.findAndHookMethod(launcherUIBottomTabViewClazz, method.getName(),
+ int.class, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ isThreeTabIcon = ((int) param.args[0] == 2);
+ super.afterHookedMethod(param);
+ }
+ });
+ }
+ }
+ Class tabIconViewClazz = XposedHelpers.findClass("com.tencent.mm.ui.TabIconView", classLoader);
+
+ Method[] tabIconViewMethods = tabIconViewClazz.getDeclaredMethods();
+ for (Method tabIconViewMethod : tabIconViewMethods) {
+ if (tabIconViewMethod.getParameterTypes().length == 4
+ && tabIconViewMethod.getParameterTypes()[0] == int.class
+ && tabIconViewMethod.getParameterTypes()[1] == int.class
+ && tabIconViewMethod.getParameterTypes()[2] == int.class
+ && tabIconViewMethod.getParameterTypes()[3] == boolean.class) {
+
+ XposedHelpers.findAndHookMethod(tabIconViewClazz, tabIconViewMethod.getName(),
+ int.class, int.class, int.class, boolean.class, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ if (isThreeTabIcon) {
+ // 用“发现”页 iconId 递加,算出 “我” 页iconId
+ param.args[0] = (int) param.args[0] + 3;
+ param.args[1] = (int) param.args[1] + 3;
+ param.args[2] = (int) param.args[2] + 3;
+ }
+ super.beforeHookedMethod(param);
+ }
+ });
+ break;
+ }
+ }
} catch (Error | Exception e) {
XposedBridge.log(e);
}
diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java
new file mode 100644
index 0000000..79cf18e
--- /dev/null
+++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java
@@ -0,0 +1,108 @@
+package com.wuxiaosu.wechathelper.hook;
+
+import android.annotation.SuppressLint;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.widget.TextView;
+
+import com.wuxiaosu.wechathelper.utils.Constant;
+import com.wuxiaosu.widget.utils.PropertiesUtils;
+
+import java.lang.reflect.Field;
+
+import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XposedHelpers;
+
+import static de.robv.android.xposed.XposedHelpers.getObjectField;
+
+
+/**
+ * Created by su on 2018/2/05.
+ * 零钱 hook
+ */
+
+public class WalletHook {
+
+ private static boolean fakeMoney;
+ private static String money;
+
+ private ClassLoader classLoader;
+
+ private WalletHook() {
+
+ }
+
+ public void init(ClassLoader classLoader, String versionName) {
+ if (this.classLoader == null) {
+ this.classLoader = classLoader;
+ hook(classLoader);
+ }
+ }
+
+ public static WalletHook getInstance() {
+ return WalletHook.SingletonHolder.instance;
+ }
+
+ private static class SingletonHolder {
+ @SuppressLint("StaticFieldLeak")
+ private static final WalletHook instance = new WalletHook();
+ }
+
+ private void reload() {
+ money = PropertiesUtils.getValue(Constant.PRO_FILE, "money", "0.00");
+ fakeMoney = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_money", "false"));
+ }
+
+ private void hook(final ClassLoader classLoader) {
+ final Class mallIndexUIClazz =
+ XposedHelpers.findClass("com.tencent.mm.plugin.mall.ui.MallIndexUI", classLoader);
+ final Class walletBalanceManagerUIClazz =
+ XposedHelpers.findClass("com.tencent.mm.plugin.wallet.balance.ui.WalletBalanceManagerUI", classLoader);
+
+ handleHook(mallIndexUIClazz, mallIndexUIClazz.getSuperclass().getDeclaredFields());
+ handleHook(walletBalanceManagerUIClazz, walletBalanceManagerUIClazz.getDeclaredFields());
+ }
+
+ private void handleHook(Class clazz, final Field[] fields) {
+ try {
+ XposedHelpers.findAndHookMethod(clazz, "onResume", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ reload();
+ if (fakeMoney) {
+ Object object = param.thisObject;
+ for (Field field : fields) {
+ if (field.getType() == TextView.class) {
+ final TextView textView = (TextView) getObjectField(object, field.getName());
+ if (textView != null) {
+ textView.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ String string = s.toString();
+ if (string.startsWith("¥") && !s.toString().equals("¥" + money)) {
+ textView.setText("¥" + money);
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+ super.afterHookedMethod(param);
+ }
+ });
+ } catch (Error | Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/wechathelper/src/main/res/drawable-xhdpi/qrcode.png b/wechathelper/src/main/res/drawable-xhdpi/qrcode.png
new file mode 100644
index 0000000..205d084
Binary files /dev/null and b/wechathelper/src/main/res/drawable-xhdpi/qrcode.png differ
diff --git a/wechathelper/src/main/res/layout/dialog_about_content.xml b/wechathelper/src/main/res/layout/dialog_about_content.xml
index 396bea7..1232b8a 100755
--- a/wechathelper/src/main/res/layout/dialog_about_content.xml
+++ b/wechathelper/src/main/res/layout/dialog_about_content.xml
@@ -1,31 +1,44 @@
-
-
+ android:orientation="vertical">
-
-
+
+
+
+
+
-
+
+
+