commit 1791a114e3014d7c6d6a29151af1020448b04e6a Author: 18401019693 Date: Mon Jul 18 15:31:45 2022 +0800 androidx版本首次提交 diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..edcd6a0c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.iml +local.properties + +/baidu/build/ +/app/build/ +/.idea/ +/.gradle/ +/beauty/build/ +/billing/build/ +/build/ +/common/build/ +/lib_beauty360/build/ +/lib_country_code/build/ +/live/build/ +/main/build/ +/video/build/ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 000000000..59eb31b94 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,113 @@ +apply plugin: 'com.android.application' +apply plugin: 'img-optimizer' +apply plugin: 'com.google.gms.google-services' +// 可根据需要选择性排除 + +android { + dexOptions { + jumboMode = true + } + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + signingConfigs { + release { + keyAlias 'phonelive' + keyPassword 'phonelive' + storeFile file('../hdl.jks') + storePassword 'phonelive' + } + //陌陌本地配置需要 + config {//TODO BEAUTYSDK 这里需要配置keystore相关信息 + keyAlias 'phonelive' + keyPassword 'phonelive' + storeFile file('../hdl.jks')//keystore的存放路径 + storePassword 'phonelive' + v2SigningEnabled true // android 5.0-8.0,必须用V2,否则会有安全问题 + v1SigningEnabled true + } + } + aaptOptions { + cruncherEnabled = false + useNewCruncher = false + } + + packagingOptions {//加上这写代码 为了mob兼容性androidx + pickFirst 'META-INF/*' + } + + + defaultConfig { +// applicationId "myname.pdlive.shayu" + applicationId "com.pdlive.shayu" + minSdkVersion rootProject.ext.android.minSdkVersion + //版本在这里修改 + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + multiDexEnabled true + ndk { + // TODO: 谷歌商城需要兼容两个平台 + abiFilters "armeabi-v7a", "arm64-v8a" + } + javaCompileOptions { + annotationProcessorOptions { + arguments = [AROUTER_MODULE_NAME: project.getName()] + } + } + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + debug { + signingConfig signingConfigs.release + } + } + lintOptions { + checkReleaseBuilds false + abortOnError false + } +} + + +repositories { + flatDir { + dirs 'libs', '../libs' + } +} + +dependencies { + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + //直播 + api project(':main') + //短视频 + api project(':video') + annotationProcessor rootProject.ext.dependencies["arouter-compiler"] +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 000000000..fca7df245 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,70 @@ +{ + "project_info": { + "project_number": "292494634914", + "project_id": "pdlive-1631521064967", + "storage_bucket": "pdlive-1631521064967.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:292494634914:android:d8db197d7e7a6c3a3a4cfb", + "android_client_info": { + "package_name": "com.pdlive.shayu" + } + }, + "oauth_client": [ + { + "client_id": "292494634914-8nuhhoeo061ki1jevbcsrl7dfdl6dlm0.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pdlive.shayu", + "certificate_hash": "38cc19306c9facee36a9224e9a4070bc0be15c7d" + } + }, + { + "client_id": "292494634914-ctr3fptp5mkv2qqr4gkgjo9uluq2joqb.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pdlive.shayu", + "certificate_hash": "15fc5e70cf238323bf7111c8c627803985478e87" + } + }, + { + "client_id": "292494634914-ejtqvaj86a2lldv0di2pr3d5gngprahd.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pdlive.shayu", + "certificate_hash": "b66dc8d21cfcf6c729577ddcf0c312b2a31ed872" + } + }, + { + "client_id": "292494634914-ha2kbgtclkv20hl3a1l8r7861a1a0m5i.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDVnuGnQzjI_vDrxh20Hv_S1OMUD7Vp3zU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "292494634914-ha2kbgtclkv20hl3a1l8r7861a1a0m5i.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "292494634914-v9j4rei86q2pfh9as4seotb23vr2744a.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.live.pd" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/img_optimizer.log b/app/img_optimizer.log new file mode 100644 index 000000000..e8d34e068 --- /dev/null +++ b/app/img_optimizer.log @@ -0,0 +1,20 @@ +2019-11-01 13:58:25 info: Task optimizeAppRelease begin: +---------------------------------------- +2019-11-01 13:58:25 info: 6 images need to be optimized. +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 21139B-->2066B, 90.22659% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-mdpi/ic_launcher.png +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 22015B-->2465B, 88.803085% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-hdpi/ic_launcher.png +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 115988B-->13798B, 88.10394% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-xxxhdpi/screen.png +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 37339B-->8295B, 77.78462% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 26351B-->4102B, 84.43323% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +---------------------------------------- +2019-11-01 13:58:25 info: Succeed! 24070B-->3315B, 86.22767% saved! /Users/yaling/Documents/bayue/denglong_release4/app/src/main/res/mipmap-xhdpi/ic_launcher.png +---------------------------------------- +2019-11-01 13:58:25 info: Total: 6, Succeed: 6, Skipped: 0, Failed: 0, Saved: 207.8720703125KB +---------------------------------------- +2019-11-01 13:58:25 info: Task optimizeAppRelease executed successfully. +---------------------------------------- diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 000000000..23601ff11 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,37 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/macpro/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the groupLast number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the groupLast number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile +-keep class com.adjust.sdk.**{ *; } +-keep class com.google.android.gms.common.ConnectionResult { + int SUCCESS; +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { + com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { + java.lang.String getId(); + boolean isLimitAdTrackingEnabled(); +} +-keep public class com.android.installreferrer.**{ *; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..1dd881b18 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java new file mode 100644 index 000000000..7fe8d6dea --- /dev/null +++ b/app/src/main/java/com/shayu/phonelive/AppContext.java @@ -0,0 +1,269 @@ +package com.shayu.phonelive; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.net.http.HttpResponseCache; +import android.os.Bundle; +import android.os.Message; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustConfig; +import com.adjust.sdk.AdjustEvent; +import com.adjust.sdk.LogLevel; +import com.alibaba.android.arouter.launcher.ARouter; +import com.blankj.utilcode.util.Utils; +import com.facebook.appevents.AppEventsLogger; +import com.fm.openinstall.OpenInstall; +import com.tencent.imsdk.v2.V2TIMGroupMemberInfo; +import com.tencent.imsdk.v2.V2TIMManager; +import com.tencent.imsdk.v2.V2TIMSimpleMsgListener; +import com.tencent.imsdk.v2.V2TIMUserInfo; +import com.yunbao.common.BuildConfig; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.Constants; +import com.yunbao.common.utils.L; +import com.yunbao.live.socket.SocketRyClient; +import com.yunbao.live.utils.LiveImDeletUtil; + +import java.io.File; +import java.io.IOException; + +import io.rong.imlib.RongIMClient; +import io.rong.imlib.model.Conversation; +import io.rong.message.TextMessage; + +import static com.adjust.sdk.AdjustConfig.ENVIRONMENT_PRODUCTION; +import static com.yunbao.live.socket.SocketClient.mSocketHandler; + +//import cn.tillusory.sdk.TiSDK; + +//import com.squareup.leakcanary.LeakCanary; + + +/** + * Created by cxf on 2017/8/3. + */ + +public class AppContext extends CommonAppContext { + + public static AppContext sInstance; + public LiveImDeletUtil liveImDeletUtil; + + private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks { + @Override + public void onActivityResumed(Activity activity) { + Adjust.onResume(); + } + + @Override + public void onActivityPaused(Activity activity) { + Adjust.onPause(); + } + + @Override + public void onActivityStopped(@NonNull Activity activity) { + + } + + @Override + public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { + + } + + @Override + public void onActivityDestroyed(@NonNull Activity activity) { + + } + + @Override + public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { + + } + + @Override + public void onActivityStarted(@NonNull Activity activity) { + + } + + } + + @Override + public void onCreate() { + super.onCreate(); + sInstance = this; + L.setDeBug(BuildConfig.DEBUG); + AppEventsLogger.activateApp(this); + + File httpCacheDir = new File(getCacheDir(), "https"); + try { + HttpResponseCache.install(httpCacheDir, 1024 * 1024 * 128); + } catch (IOException e) { + e.printStackTrace(); + } + //初始化 ARouter + if (BuildConfig.DEBUG) { + ARouter.openLog(); + ARouter.openDebug(); + } + ARouter.init(this); + + //初始化 邀请码库 + if (isMainProcess()) { + OpenInstall.init(this); + } + + String environment = AdjustConfig.ENVIRONMENT_PRODUCTION; + AdjustConfig config = new AdjustConfig(this, "3om5fbglyqdc", environment); + Adjust.onCreate(config); + registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks()); + config.setLogLevel(LogLevel.WARN); + //激活操作记录 + AdjustEvent adjustEvent = new AdjustEvent("m7wk0c"); + Adjust.trackEvent(adjustEvent); + + //谷歌激活 + mFirebaseAnalytics.logEvent("FS_activation", null); + + //FB激活 + logger.logEvent("FB_activation"); + + AdjustEvent adjustEvent2 = new AdjustEvent("p7igfz"); + Adjust.trackEvent(adjustEvent2); + //谷歌激活 + mFirebaseAnalytics.logEvent("FS_complete_1st_loading", null); + + //FB激活 + logger.logEvent("FB_complete_1st_loading"); + //初始化 AndroidUtilCode + Utils.init(this); + liveImDeletUtil = new LiveImDeletUtil(); + // 融云 + RongIMClient.getInstance().setOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() { + /** + * 接收实时或者离线消息。 + * 注意: + * 1. 针对接收离线消息时,服务端会将 200 条消息打成一个包发到客户端,客户端对这包数据进行解析。 + * 2. hasPackage 标识是否还有剩余的消息包,left 标识这包消息解析完逐条抛送给 App 层后,剩余多少条。 + * 如何判断离线消息收完: + * 1. hasPackage 和 left 都为 0; + * 2. hasPackage 为 0 标识当前正在接收最后一包(200条)消息,left 为 0 标识最后一包的最后一条消息也已接收完毕。 + * + * @param message 接收到的消息对象 + * @param left 每个数据包数据逐条上抛后,还剩余的条数 + * @param hasPackage 是否在服务端还存在未下发的消息包 + * @param offline 消息是否离线消息 + * @return 是否处理消息。 如果 App 处理了此消息,返回 true; 否则返回 false 由 SDK 处理。 + */ + + @Override + public boolean onReceived(io.rong.imlib.model.Message message, int left, boolean hasPackage, boolean offline) { + Log.e("rytest", message.getContent() + ""); + if (message.getConversationType() == Conversation.ConversationType.CHATROOM) { + //群聊 + Message msg = Message.obtain(); + msg.what = Constants.SOCKET_WHAT_BROADCAST; + if (!"".equals(message.getContent()) && message.getContent() != null) { + if (message.getObjectName().equals("RC:TxtMsg")) { + TextMessage content = (TextMessage) message.getContent(); + msg.obj = content.getContent(); + if (SocketRyClient.mSocketHandler != null && Ingroup == 1) { + SocketRyClient.mSocketHandler.sendMessage(msg); + } + TextMessage rongMsg = (TextMessage) message.getContent(); + String firstIndexRM = ""; + if (rongMsg.getContent().length() > 4) { + firstIndexRM = rongMsg.getContent().substring(0, 5); + } + String firstIndexRM2 = ""; + if (rongMsg.getContent().length() > 9) { + firstIndexRM2 = rongMsg.getContent().substring(0, 10); + } + if ("{\"msg".equals(firstIndexRM) || "{\"retcode\"".equals(firstIndexRM2)) { + liveImDeletUtil.deleteMessages(message.getTargetId(), message.getMessageId()); + } + } + } + } else { + + //私聊 + Message msg = Message.obtain(); + msg.what = Constants.SOCKET_WHAT_BROADCAST; + if (!"".equals(message.getContent()) && message.getContent() != null) { + if (message.getObjectName().equals("RC:TxtMsg")) { + TextMessage content = (TextMessage) message.getContent(); + msg.obj = content.getContent(); + if (content.getContent().contains("_method_")) { + if (SocketRyClient.mSocketHandler != null) { + CommonAppContext.Ingroup = 1; + SocketRyClient.mSocketHandler.sendMessage(msg); + } + } + TextMessage rongMsg = (TextMessage) message.getContent(); + String firstIndexRM = ""; + if (rongMsg.getContent().length() > 4) { + firstIndexRM = rongMsg.getContent().substring(0, 5); + } + String firstIndexRM2 = ""; + if (rongMsg.getContent().length() > 9) { + firstIndexRM2 = rongMsg.getContent().substring(0, 10); + } + if ("{\"msg".equals(firstIndexRM) || "{\"retcode\"".equals(firstIndexRM2)) { + liveImDeletUtil.deleteMessages(message.getTargetId(), message.getMessageId()); + } + } + } + } + + return false; + } + + + }); + + //监听im消息 + V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() { + @Override + public void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) { + super.onRecvGroupTextMessage(msgID, groupID, sender, text); + Log.e("asasas", text); + Message msg = Message.obtain(); + msg.what = Constants.SOCKET_WHAT_BROADCAST; + msg.obj = text; + if (mSocketHandler != null && Ingroup == 1) { + mSocketHandler.sendMessage(msg); + } + } + + @Override + public void onRecvC2CTextMessage(String msgID, V2TIMUserInfo sender, String text) { + super.onRecvC2CTextMessage(msgID, sender, text); + Message msg = Message.obtain(); + msg.what = Constants.SOCKET_WHAT_BROADCAST; + msg.obj = text; + if (mSocketHandler != null) { + CommonAppContext.Ingroup = 1; + mSocketHandler.sendMessage(msg); + } + } + }); + + } + + + public boolean isMainProcess() { + int pid = android.os.Process.myPid(); + ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) { + if (appProcess.pid == pid) { + return getApplicationInfo().packageName.equals(appProcess.processName); + } + } + return false; + } + +} diff --git a/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java b/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java new file mode 100644 index 000000000..9f4593cfc --- /dev/null +++ b/app/src/main/java/com/shayu/phonelive/activity/LauncherActivity.java @@ -0,0 +1,524 @@ +package com.shayu.phonelive.activity; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import com.adjust.sdk.Adjust; +import com.adjust.sdk.AdjustEvent; +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.tencent.rtmp.ITXLivePlayListener; +import com.tencent.rtmp.TXLiveBase; +import com.tencent.rtmp.TXLiveConstants; +import com.tencent.rtmp.TXLivePlayer; +import com.tencent.rtmp.ui.TXCloudVideoView; +import com.tencent.ugc.TXUGCBase; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.bean.AdBean; +import com.yunbao.common.bean.ConfigBean; +import com.yunbao.common.bean.UserBean; +import com.yunbao.common.custom.CircleProgress; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.http.CommonHttpConsts; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.interfaces.CommonCallback; +import com.yunbao.common.utils.DownloadUtil; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.MD5Util; +import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.SpUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.live.views.LauncherAdViewHolder; +import com.yunbao.main.activity.EntryActivity; +import com.yunbao.main.activity.MainActivity; +import com.yunbao.main.http.MainHttpConsts; +import com.yunbao.main.http.MainHttpUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import myname.pdlive.shayu.R; + +import static com.yunbao.common.CommonAppContext.logger; +import static com.yunbao.common.CommonAppContext.mFirebaseAnalytics; + +/** + * Created by cxf on 2018/9/17. + */ +@Route(path = RouteUtil.PATH_LAUNCHER) +public class LauncherActivity extends AppCompatActivity implements View.OnClickListener { + + private static final String TAG = "LauncherActivity"; + private static final int WHAT_GET_CONFIG = 0; + private static final int WHAT_COUNT_DOWN = 1; + private Handler mHandler; + protected Context mContext; + private ViewGroup mRoot; + private ImageView mCover; + private ViewGroup mContainer; + private CircleProgress mCircleProgress; + private List mAdList; + private List mImageViewList; + private int mMaxProgressVal; + private int mCurProgressVal; + private int mAdIndex; + private int mInterval = 2000; + private View mBtnSkipImage; + private View mBtnSkipVideo; + private TXCloudVideoView mTXCloudVideoView; + private TXLivePlayer mPlayer; + private LauncherAdViewHolder mLauncherAdViewHolder; + private boolean mPaused; + private int mVideoLastProgress; + private boolean mForward; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStatusBar(); +// if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { +// finish(); +// return; +// } + setContentView(R.layout.activity_launcher); + //开屏 + AdjustEvent adjustEvent = new AdjustEvent("vjqk8g"); + Adjust.trackEvent(adjustEvent); + + //谷歌激活 + mFirebaseAnalytics.logEvent("FS_screen", null); + //FB激活 + logger.logEvent("FB_screen"); + mContext = this; + mRoot = findViewById(R.id.root); + mCover = findViewById(R.id.cover); + mCircleProgress = findViewById(R.id.progress); + mContainer = findViewById(R.id.container); + mBtnSkipImage = findViewById(R.id.btn_skip_img); + mBtnSkipVideo = findViewById(R.id.btn_skip_video); + mBtnSkipImage.setOnClickListener(this); + mBtnSkipVideo.setOnClickListener(this); + ImgLoader.display(mContext, R.mipmap.screen, mCover); + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case WHAT_GET_CONFIG: + getConfig(); + break; + case WHAT_COUNT_DOWN: + updateCountDown(); + break; + } + } + }; + mHandler.sendEmptyMessageDelayed(WHAT_GET_CONFIG, 1000); + } + + + /** + * 图片倒计时 + */ + private void updateCountDown() { + mCurProgressVal += 100; + if (mCurProgressVal > mMaxProgressVal) { + return; + } + if (mCircleProgress != null) { + mCircleProgress.setCurProgress(mCurProgressVal); + } + int index = mCurProgressVal / mInterval; + if (index < mAdList.size() && mAdIndex != index) { + View v = mImageViewList.get(mAdIndex); + if (v != null && v.getVisibility() == View.VISIBLE) { + v.setVisibility(View.INVISIBLE); + } + mAdIndex = mCurProgressVal / mInterval; + } + if (mCurProgressVal < mMaxProgressVal) { + if (mHandler != null) { + mHandler.sendEmptyMessageDelayed(WHAT_COUNT_DOWN, 100); + } + } else if (mCurProgressVal == mMaxProgressVal) { + checkUidAndToken(); + } + } + + + /** + * 获取Config信息 + */ + private void getConfig() { + CommonHttpUtil.getConfig(mContext, new CommonCallback() { + @Override + public void callback(ConfigBean bean) { + if (bean != null) { + L.e(TAG, "----------> getPaster360Url:" + bean.getBeautyKey() + " " + bean.getPaster360Url()); + CommonAppConfig.getInstance().setBeautySdkType(bean.getSproutType()); + //转盘开关 + CommonAppConfig.getInstance().setTurnTableEnable(bean.getTurntableEnable()); + CommonAppConfig.getInstance().setBeauty360TieZhiUrl(bean.getPaster360Url()); + CommonAppConfig.getInstance().setAnchorPkTime(bean.getPkTime()); + if (!TextUtils.isEmpty(bean.getTxVideoUgcLicenceUrl()) && !TextUtils.isEmpty(bean.getTxVideoUgcKey())) + Log.i("tvv", bean.getTxVideoUgcLicenceUrl() + "是" + bean.getTxVideoUgcKey()); + TXLiveBase.getInstance().setLicence(LauncherActivity.this, bean.getTxVideoUgcLicenceUrl(), bean.getTxVideoUgcKey()); + TXUGCBase.getInstance().setLicence(LauncherActivity.this, bean.getTxPlayUgcLicenceUrl(), bean.getTxVideoUgcKey()); + + String adInfo = bean.getAdInfo(); + if (!TextUtils.isEmpty(adInfo)) { + JSONObject obj = JSON.parseObject(adInfo); + if (obj.getIntValue("switch") == 1) { + List list = JSON.parseArray(obj.getString("list"), AdBean.class); + if (list != null && list.size() > 0) { + mAdList = list; + mInterval = obj.getIntValue("time") * 1000; + if (mContainer != null) { + mContainer.setOnClickListener(LauncherActivity.this); + } + String[] uidAndToken = SpUtil.getInstance().getMultiStringValue( + new String[]{SpUtil.UID, SpUtil.TOKEN}); + final String uid = uidAndToken[0]; + final String token = uidAndToken[1]; + if (!TextUtils.isEmpty(uid) && !TextUtils.isEmpty(token)) { + playAD(obj.getIntValue("type") == 0); + } else { + releaseVideo(); + LauncherActivity.this.startActivity(new Intent(LauncherActivity.this, EntryActivity.class)); + LauncherActivity.this.finish(); + } + } else { + checkUidAndToken(); + } + } else { + checkUidAndToken(); + } + } else { + checkUidAndToken(); + } + } + } + }); + } + + /** + * 检查uid和token是否存在 + */ + private void checkUidAndToken() { + if (mForward) { + return; + } + mForward = true; + if (mHandler != null) { + mHandler.removeCallbacksAndMessages(null); + mHandler = null; + } + String[] uidAndToken = SpUtil.getInstance().getMultiStringValue( + new String[]{SpUtil.UID, SpUtil.TOKEN}); + final String uid = uidAndToken[0]; + final String token = uidAndToken[1]; + if (!TextUtils.isEmpty(uid) && !TextUtils.isEmpty(token)) { + MainHttpUtil.getBaseInfo(uid, token, new CommonCallback() { + @Override + public void callback(UserBean bean) { + if (bean != null) { + CommonAppConfig.getInstance().setLoginInfo(uid, token, false); + forwardMainActivity(); + } + } + }); + } else { + releaseVideo(); + this.startActivity(new Intent(this, EntryActivity.class)); + this.finish(); + } + } + + + /** + * 跳转到首页 + */ + private void forwardMainActivity() { + releaseVideo(); + MainActivity.forward(mContext); +// this.startActivity(new Intent(this, TestActivity.class)); + finish(); + } + + + @Override + protected void onDestroy() { + if (mHandler != null) { + mHandler.removeCallbacksAndMessages(null); + mHandler = null; + } + MainHttpUtil.cancel(MainHttpConsts.GET_BASE_INFO); + CommonHttpUtil.cancel(CommonHttpConsts.GET_CONFIG); + releaseVideo(); + if (mLauncherAdViewHolder != null) { + mLauncherAdViewHolder.release(); + } + mLauncherAdViewHolder = null; + super.onDestroy(); + L.e(TAG, "----------> onDestroy"); + } + + /** + * 设置透明状态栏 + */ + private void setStatusBar() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(0); + } + } + + @Override + public void onClick(View v) { + int i = v.getId(); + if (i == R.id.btn_skip_img || i == R.id.btn_skip_video) { + if (mBtnSkipImage != null) { + mBtnSkipImage.setClickable(false); + } + if (mBtnSkipVideo != null) { + mBtnSkipVideo.setClickable(false); + } + checkUidAndToken(); + } else if (i == R.id.container) { + clickAD(); + } + } + + /** + * 点击广告 + */ + private void clickAD() { + if (mAdList != null && mAdList.size() > mAdIndex) { + AdBean adBean = mAdList.get(mAdIndex); + if (adBean != null) { + String link = adBean.getLink(); + if (!TextUtils.isEmpty(link)) { + if (mHandler != null) { + mHandler.removeCallbacksAndMessages(null); + } + if (mContainer != null) { + mContainer.setClickable(false); + } + releaseVideo(); + if (mLauncherAdViewHolder == null) { + mLauncherAdViewHolder = new LauncherAdViewHolder(mContext, mRoot, link + "?uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken()); + mLauncherAdViewHolder.addToParent(); + mLauncherAdViewHolder.loadData(); + mLauncherAdViewHolder.show(); + mLauncherAdViewHolder.setActionListener(new LauncherAdViewHolder.ActionListener() { + @Override + public void onHideClick() { + checkUidAndToken(); + } + }); + } + } + } + } + } + + private void releaseVideo() { + if (mPlayer != null) { + mPlayer.stopPlay(false); + mPlayer.setPlayListener(null); + } + mPlayer = null; + } + + + /** + * 播放广告 + */ + private void playAD(boolean isImage) { + if (mContainer == null) { + return; + } + if (isImage) { + int imgSize = mAdList.size(); + if (imgSize > 0) { + mImageViewList = new ArrayList<>(); + for (int i = 0; i < imgSize; i++) { + ImageView imageView = new ImageView(mContext); + imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + imageView.setBackgroundColor(0xffffffff); + mImageViewList.add(imageView); + ImgLoader.display(mContext, mAdList.get(i).getUrl(), imageView); + } + for (int i = imgSize - 1; i >= 0; i--) { + mContainer.addView(mImageViewList.get(i)); + } + if (mBtnSkipImage != null && mBtnSkipImage.getVisibility() != View.VISIBLE) { + mBtnSkipImage.setVisibility(View.VISIBLE); + } + mMaxProgressVal = imgSize * mInterval; + if (mCircleProgress != null) { + mCircleProgress.setMaxProgress(mMaxProgressVal); + } + if (mHandler != null) { + mHandler.sendEmptyMessageDelayed(WHAT_COUNT_DOWN, 100); + } + if (mCover != null && mCover.getVisibility() == View.VISIBLE) { + mCover.setVisibility(View.INVISIBLE); + } + } else { + checkUidAndToken(); + } + } else { + if (mAdList == null || mAdList.size() == 0) { + checkUidAndToken(); + return; + } + String videoUrl = mAdList.get(0).getUrl(); + if (TextUtils.isEmpty(videoUrl)) { + checkUidAndToken(); + return; + } + String videoFileName = MD5Util.getMD5(videoUrl); + if (TextUtils.isEmpty(videoFileName)) { + checkUidAndToken(); + return; + } + File file = new File(getCacheDir(), videoFileName); + if (file.exists()) { + playAdVideo(file); + } else { + downloadAdFile(videoUrl, videoFileName); + } + } + } + + @Override + protected void onPause() { + mPaused = true; + if (mPlayer != null && mPlayer.isPlaying()) { + mPlayer.setMute(true); + } + super.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + if (mPaused) { + if (mPlayer != null && mPlayer.isPlaying()) { + mPlayer.setMute(false); + } + } + mPaused = false; + } + + /** + * 下载视频 + */ + private void downloadAdFile(String url, String fileName) { + DownloadUtil downloadUtil = new DownloadUtil(); + downloadUtil.download("ad_video", getCacheDir(), fileName, url, new DownloadUtil.Callback() { + @Override + public void onSuccess(File file) { + playAdVideo(file); + } + + @Override + public void onProgress(int progress) { + + } + + @Override + public void onError(Throwable e) { + checkUidAndToken(); + } + }); + } + + + /** + * 播放视频 + */ + private void playAdVideo(File videoFile) { + if (mBtnSkipVideo != null && mBtnSkipVideo.getVisibility() != View.VISIBLE) { + mBtnSkipVideo.setVisibility(View.VISIBLE); + } + mTXCloudVideoView = new TXCloudVideoView(mContext); + mTXCloudVideoView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + mTXCloudVideoView.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN); + mContainer.addView(mTXCloudVideoView); + mPlayer = new TXLivePlayer(mContext); + mPlayer.setPlayerView(mTXCloudVideoView); + mPlayer.setAutoPlay(true); + mPlayer.setPlayListener(new ITXLivePlayListener() { + @Override + public void onPlayEvent(int e, Bundle bundle) { + if (e == TXLiveConstants.PLAY_EVT_PLAY_END) {//获取到视频播放完毕的回调 + checkUidAndToken(); + L.e(TAG, "视频播放结束------>"); + } else if (e == TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION) {////获取到视频宽高回调 + float videoWidth = bundle.getInt("EVT_PARAM1", 0); + float videoHeight = bundle.getInt("EVT_PARAM2", 0); + if (mTXCloudVideoView != null && videoWidth > 0 && videoHeight > 0) { + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mTXCloudVideoView.getLayoutParams(); + int targetH = 0; + if (videoWidth >= videoHeight) {//横屏 + params.gravity = Gravity.CENTER_VERTICAL; + targetH = (int) (mTXCloudVideoView.getWidth() / videoWidth * videoHeight); + } else { + targetH = ViewGroup.LayoutParams.MATCH_PARENT; + } + if (targetH != params.height) { + params.height = targetH; + mTXCloudVideoView.requestLayout(); + } + } + } else if (e == TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME) { + if (mCover != null && mCover.getVisibility() == View.VISIBLE) { + mCover.setVisibility(View.INVISIBLE); + } + } else if (e == TXLiveConstants.PLAY_ERR_NET_DISCONNECT || + e == TXLiveConstants.PLAY_ERR_FILE_NOT_FOUND) { + ToastUtil.show(WordUtil.getString(R.string.live_play_error)); + checkUidAndToken(); + } else if (e == TXLiveConstants.PLAY_EVT_PLAY_PROGRESS) { + int progress = bundle.getInt("EVT_PLAY_PROGRESS_MS"); + if (mVideoLastProgress == progress) { + L.e(TAG, "视频播放结束------>"); + checkUidAndToken(); + } else { + mVideoLastProgress = progress; + } + } + } + + @Override + public void onNetStatus(Bundle bundle) { + + } + + }); + mPlayer.startPlay(videoFile.getAbsolutePath(), TXLivePlayer.PLAY_TYPE_LOCAL_VIDEO); + } +} diff --git a/app/src/main/res/drawable/bg_launcher_skip.xml b/app/src/main/res/drawable/bg_launcher_skip.xml new file mode 100644 index 000000000..456bd4be5 --- /dev/null +++ b/app/src/main/res/drawable/bg_launcher_skip.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_launcher_skip_2.xml b/app/src/main/res/drawable/bg_launcher_skip_2.xml new file mode 100644 index 000000000..411b08055 --- /dev/null +++ b/app/src/main/res/drawable/bg_launcher_skip_2.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_launcher.xml b/app/src/main/res/layout/activity_launcher.xml new file mode 100644 index 000000000..92776f82c --- /dev/null +++ b/app/src/main/res/layout/activity_launcher.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..50257bea6 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..33cbef52d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a70ceeb93 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..072f87ff3 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/screen.png b/app/src/main/res/mipmap-xxxhdpi/screen.png new file mode 100644 index 000000000..291bac726 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/screen.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..6d30238ee --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + PDLIVE + \ No newline at end of file diff --git a/baidu/build.gradle b/baidu/build.gradle new file mode 100644 index 000000000..61deab963 --- /dev/null +++ b/baidu/build.gradle @@ -0,0 +1,59 @@ +apply plugin: 'com.android.library' +apply plugin: 'img-optimizer' + + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + + } + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + ndk { + abiFilters "armeabi-v7a","arm64-v8a" + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} +repositories { + +} +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + api rootProject.ext.dependencies["appcompat-androidx"] + //fastJson解析json + implementation rootProject.ext.dependencies["fastjson"] + //百度语音识别 +// compile files('libs/bdasr_3.0.8.2.jar') +} diff --git a/baidu/libs/bdasr_3.0.8.2.jar b/baidu/libs/bdasr_3.0.8.2.jar new file mode 100644 index 000000000..cc0dc5014 Binary files /dev/null and b/baidu/libs/bdasr_3.0.8.2.jar differ diff --git a/baidu/proguard-rules.pro b/baidu/proguard-rules.pro new file mode 100644 index 000000000..adcfd4222 --- /dev/null +++ b/baidu/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/macpro/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/baidu/src/main/AndroidManifest.xml b/baidu/src/main/AndroidManifest.xml new file mode 100644 index 000000000..cd15e971f --- /dev/null +++ b/baidu/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + diff --git a/baidu/src/main/java/com/yunbao/baidu/utils/ImAsrUtil.java b/baidu/src/main/java/com/yunbao/baidu/utils/ImAsrUtil.java new file mode 100644 index 000000000..f6e2cbb6a --- /dev/null +++ b/baidu/src/main/java/com/yunbao/baidu/utils/ImAsrUtil.java @@ -0,0 +1,120 @@ +package com.yunbao.baidu.utils; + +import android.content.Context; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +//import com.baidu.speech.EventListener; +//import com.baidu.speech.EventManager; +//import com.baidu.speech.EventManagerFactory; +//import com.baidu.speech.asr.SpeechConstant; + +/** + * Created by cxf on 2018/7/28. + * 聊天时候语音识别 + */ + +public class ImAsrUtil { +// +// private EventManager mManager; +// private EventListener mEventListener; +// private String mJsonString; +// private AsrCallback mCallback; + + public ImAsrUtil(Context context) { +// mManager = EventManagerFactory.create(context, "asr"); +// mEventListener = new EventListener() { +// @Override +// public void onEvent(String name, String params, byte[] bytes, int offset, int length) { +// switch (name) { +// case SpeechConstant.CALLBACK_EVENT_ASR_READY://引擎准备就绪,可以开始说话 +// //L.e(TAG, "引擎准备就绪,可以开始说话------>"+params); +// break; +// case SpeechConstant.CALLBACK_EVENT_ASR_BEGIN://检测到说话开始 +// //L.e(TAG, "检测到说话开始------>" + params); +//// if(mCallback!=null){ +//// mCallback.onSpeakStart(); +//// } +// break; +// case SpeechConstant.CALLBACK_EVENT_ASR_END://检测到说话结束 +// //L.e(TAG, "检测到说话结束------>" + params); +//// if (mCallback != null) { +//// mCallback.onSpeakEnd(); +//// } +// break; +// case SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL://识别结果,类型json +// JSONObject obj = JSON.parseObject(params); +// String result = obj.getJSONArray("results_recognition").getString(0); +// //L.e(TAG, "识别结果------>" + result); +// if (mCallback != null) { +// mCallback.onResult(result); +// } +// break; +// case SpeechConstant.CALLBACK_EVENT_ASR_FINISH://识别结束(可能含有错误信息) +// //L.e(TAG, "识别结束------>" + params); +// break; +// case SpeechConstant.CALLBACK_EVENT_ASR_LONG_SPEECH://长语音额外的回调,表示长语音识别结束 +// //L.e(TAG, "长语音识别结束------>" + params); +// break; +// +// } +// } +// }; +// mManager.registerListener(mEventListener); +// JSONObject params = new JSONObject(); +// //DECODER = 0 ,表示禁用离线功能,只使用在线功能;DECODER = 2 ,表示启用离线功能,但是SDK强制在线优先。 +// params.put(SpeechConstant.DECODER, 0); +// //开启长语音 +// params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0); +// //关闭自动断句 +// params.put(SpeechConstant.VAD, SpeechConstant.VAD_TOUCH); +// //在选择PID为长句(输入法模式)的时候,是否禁用标点符号 +// params.put(SpeechConstant.DISABLE_PUNCTUATION, true); +// //是否需要语音音量数据回调,开启后有CALLBACK_EVENT_ASR_VOLUME事件回调 +// params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); +// //是否需要语音音频数据回调,开启后有CALLBACK_EVENT_ASR_AUDIO事件 +// params.put(SpeechConstant.ACCEPT_AUDIO_DATA, false); +// mJsonString = params.toJSONString(); +// } +// +// /** +// * 开始录音 +// */ +// public void start() { +// if (mManager != null) { +// mManager.send(SpeechConstant.ASR_START, mJsonString, null, 0, 0); +// } +// } +// +// /** +// * 停止录音 +// */ +// public void stop() { +// if (mManager != null) { +// mManager.send(SpeechConstant.ASR_STOP, null, null, 0, 0); +// mManager.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); +// } +// } +// +// +// public void release() { +// if (mManager != null) { +// mManager.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); +// mManager.unregisterListener(mEventListener); +// } +// mManager=null; +// mCallback=null; +// } + +// public interface AsrCallback { +// //void onSpeakStart(); +// +// void onResult(String result); +// +// //void onSpeakEnd(); +// } +// +// public void setAsrCallback(AsrCallback callback){ +// mCallback=callback; + } +} diff --git a/baidu/src/main/jniLibs/arm64-v8a/libBaiduSpeechSDK.so b/baidu/src/main/jniLibs/arm64-v8a/libBaiduSpeechSDK.so new file mode 100644 index 000000000..5a0d4e791 Binary files /dev/null and b/baidu/src/main/jniLibs/arm64-v8a/libBaiduSpeechSDK.so differ diff --git a/baidu/src/main/jniLibs/arm64-v8a/libbdEASRAndroid.so b/baidu/src/main/jniLibs/arm64-v8a/libbdEASRAndroid.so new file mode 100644 index 000000000..c824ce9e5 Binary files /dev/null and b/baidu/src/main/jniLibs/arm64-v8a/libbdEASRAndroid.so differ diff --git a/baidu/src/main/jniLibs/arm64-v8a/libbdSpilWakeup.so b/baidu/src/main/jniLibs/arm64-v8a/libbdSpilWakeup.so new file mode 100644 index 000000000..a4816337b Binary files /dev/null and b/baidu/src/main/jniLibs/arm64-v8a/libbdSpilWakeup.so differ diff --git a/baidu/src/main/jniLibs/arm64-v8a/libbd_easr_s1_merge_normal_20151216.dat.so b/baidu/src/main/jniLibs/arm64-v8a/libbd_easr_s1_merge_normal_20151216.dat.so new file mode 100644 index 000000000..826c81fc5 Binary files /dev/null and b/baidu/src/main/jniLibs/arm64-v8a/libbd_easr_s1_merge_normal_20151216.dat.so differ diff --git a/baidu/src/main/jniLibs/arm64-v8a/libvad.dnn.so b/baidu/src/main/jniLibs/arm64-v8a/libvad.dnn.so new file mode 100644 index 000000000..0550061c2 Binary files /dev/null and b/baidu/src/main/jniLibs/arm64-v8a/libvad.dnn.so differ diff --git a/baidu/src/main/jniLibs/armeabi-v7a/libBaiduSpeechSDK.so b/baidu/src/main/jniLibs/armeabi-v7a/libBaiduSpeechSDK.so new file mode 100644 index 000000000..253f5a14f Binary files /dev/null and b/baidu/src/main/jniLibs/armeabi-v7a/libBaiduSpeechSDK.so differ diff --git a/baidu/src/main/jniLibs/armeabi-v7a/libbdEASRAndroid.so b/baidu/src/main/jniLibs/armeabi-v7a/libbdEASRAndroid.so new file mode 100644 index 000000000..0fef52af5 Binary files /dev/null and b/baidu/src/main/jniLibs/armeabi-v7a/libbdEASRAndroid.so differ diff --git a/baidu/src/main/jniLibs/armeabi-v7a/libbdSpilWakeup.so b/baidu/src/main/jniLibs/armeabi-v7a/libbdSpilWakeup.so new file mode 100644 index 000000000..f7809e2dd Binary files /dev/null and b/baidu/src/main/jniLibs/armeabi-v7a/libbdSpilWakeup.so differ diff --git a/baidu/src/main/jniLibs/armeabi-v7a/libbd_easr_s1_merge_normal_20151216.dat.so b/baidu/src/main/jniLibs/armeabi-v7a/libbd_easr_s1_merge_normal_20151216.dat.so new file mode 100644 index 000000000..826c81fc5 Binary files /dev/null and b/baidu/src/main/jniLibs/armeabi-v7a/libbd_easr_s1_merge_normal_20151216.dat.so differ diff --git a/baidu/src/main/jniLibs/armeabi-v7a/libvad.dnn.so b/baidu/src/main/jniLibs/armeabi-v7a/libvad.dnn.so new file mode 100644 index 000000000..0550061c2 Binary files /dev/null and b/baidu/src/main/jniLibs/armeabi-v7a/libvad.dnn.so differ diff --git a/beauty/build.gradle b/beauty/build.gradle new file mode 100644 index 000000000..c3e8a3175 --- /dev/null +++ b/beauty/build.gradle @@ -0,0 +1,64 @@ +apply plugin: 'com.android.library' +apply plugin: 'img-optimizer' + + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + + } + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + ndk { + abiFilters "armeabi-v7a","arm64-v8a" + } + } + aaptOptions { + cruncherEnabled = false + useNewCruncher = false + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} +repositories { + flatDir { + dirs 'libs','../libs' + } +} +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + //萌颜sdk内部解析json用 + api(name: 'ti-sdk', ext: 'aar') + //common + implementation project(':common') + implementation project(path: ':lib_beauty360') +} diff --git a/beauty/img_optimizer.log b/beauty/img_optimizer.log new file mode 100644 index 000000000..40714cef9 --- /dev/null +++ b/beauty/img_optimizer.log @@ -0,0 +1,58 @@ +2019-11-01 13:58:52 info: Task optimizeBeautyRelease begin: +---------------------------------------- +2019-11-01 13:58:52 info: 25 images need to be optimized. +---------------------------------------- +2019-11-01 13:58:52 info: Succeed! 55954B-->19421B, 65.29113% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_qingxin.png +---------------------------------------- +2019-11-01 13:58:52 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_none.png +---------------------------------------- +2019-11-01 13:58:52 info: Succeed! 3913B-->2602B, 33.503704% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_record_haha_1.png +---------------------------------------- +2019-11-01 13:58:52 info: Succeed! 59473B-->19330B, 67.497856% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_qingliang.png +---------------------------------------- +2019-11-01 13:58:52 info: Succeed! 4192B-->2683B, 35.99714% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_record_haha_2.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 4094B-->2681B, 34.513924% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_record_haha_3.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 3340B-->2496B, 25.26946% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_record_haha_4.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 58992B-->19385B, 67.13961% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_langman.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 54709B-->20351B, 62.80137% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_huaijiu.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 57811B-->19404B, 66.435455% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_weimei.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 2484B-->1931B, 22.26248% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_none.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 57630B-->19658B, 65.8893% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_landiao.png +---------------------------------------- +2019-11-01 13:58:53 info: Succeed! 4201B-->1800B, 57.153057% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_selected.png +---------------------------------------- +2019-11-01 13:58:54 info: Succeed! 57238B-->19354B, 66.1868% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_orginal.png +---------------------------------------- +2019-11-01 13:58:54 info: Succeed! 57400B-->19610B, 65.836235% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_fennen.png +---------------------------------------- +2019-11-01 13:58:54 info: Succeed! 55963B-->19519B, 65.1216% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_filter_rixi.png +---------------------------------------- +2019-11-01 13:58:54 info: Succeed! 914B-->698B, 23.632385% saved! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_download.png +---------------------------------------- +2019-11-01 13:58:57 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_rixi.png +---------------------------------------- +2019-11-01 13:58:59 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_qingliang.png +---------------------------------------- +2019-11-01 13:59:00 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_huaijiu.png +---------------------------------------- +2019-11-01 13:59:03 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_langman.png +---------------------------------------- +2019-11-01 13:59:06 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_qingxin.png +---------------------------------------- +2019-11-01 13:59:09 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_fennen.png +---------------------------------------- +2019-11-01 13:59:11 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_landiao.png +---------------------------------------- +2019-11-01 13:59:13 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/beauty/src/main/res/mipmap-xxxhdpi/filter_weimei.png +---------------------------------------- +2019-11-01 13:59:13 info: Total: 25, Succeed: 16, Skipped: 9, Failed: 0, Saved: 339.2431640625KB +---------------------------------------- +2019-11-01 13:59:13 info: Task optimizeBeautyRelease executed successfully. +---------------------------------------- diff --git a/beauty/proguard-rules.pro b/beauty/proguard-rules.pro new file mode 100644 index 000000000..adcfd4222 --- /dev/null +++ b/beauty/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/macpro/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/beauty/src/main/AndroidManifest.xml b/beauty/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c6ceee92c --- /dev/null +++ b/beauty/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/beauty/src/main/assets/beauty/beauty.png b/beauty/src/main/assets/beauty/beauty.png new file mode 100644 index 000000000..426ae3ca6 Binary files /dev/null and b/beauty/src/main/assets/beauty/beauty.png differ diff --git a/beauty/src/main/assets/beauty/mask.png b/beauty/src/main/assets/beauty/mask.png new file mode 100644 index 000000000..980640489 Binary files /dev/null and b/beauty/src/main/assets/beauty/mask.png differ diff --git a/beauty/src/main/assets/filter/ARABICA/filter.png b/beauty/src/main/assets/filter/ARABICA/filter.png new file mode 100644 index 000000000..38a5d0073 Binary files /dev/null and b/beauty/src/main/assets/filter/ARABICA/filter.png differ diff --git a/beauty/src/main/assets/filter/AVA/filter.png b/beauty/src/main/assets/filter/AVA/filter.png new file mode 100644 index 000000000..962dd88a4 Binary files /dev/null and b/beauty/src/main/assets/filter/AVA/filter.png differ diff --git a/beauty/src/main/assets/filter/AZREAL/filter.png b/beauty/src/main/assets/filter/AZREAL/filter.png new file mode 100644 index 000000000..6b7165c43 Binary files /dev/null and b/beauty/src/main/assets/filter/AZREAL/filter.png differ diff --git a/beauty/src/main/assets/filter/BOURBON/filter.png b/beauty/src/main/assets/filter/BOURBON/filter.png new file mode 100644 index 000000000..2396cbf42 Binary files /dev/null and b/beauty/src/main/assets/filter/BOURBON/filter.png differ diff --git a/beauty/src/main/assets/filter/BYERS/filter.png b/beauty/src/main/assets/filter/BYERS/filter.png new file mode 100644 index 000000000..cf64f439e Binary files /dev/null and b/beauty/src/main/assets/filter/BYERS/filter.png differ diff --git a/beauty/src/main/assets/filter/CHEMICAL/filter.png b/beauty/src/main/assets/filter/CHEMICAL/filter.png new file mode 100644 index 000000000..239f6723f Binary files /dev/null and b/beauty/src/main/assets/filter/CHEMICAL/filter.png differ diff --git a/beauty/src/main/assets/filter/CHOCOLATE/filter.png b/beauty/src/main/assets/filter/CHOCOLATE/filter.png new file mode 100644 index 000000000..955e73194 Binary files /dev/null and b/beauty/src/main/assets/filter/CHOCOLATE/filter.png differ diff --git a/beauty/src/main/assets/filter/CLAYTON/filter.png b/beauty/src/main/assets/filter/CLAYTON/filter.png new file mode 100644 index 000000000..8aaf2aaa6 Binary files /dev/null and b/beauty/src/main/assets/filter/CLAYTON/filter.png differ diff --git a/beauty/src/main/assets/filter/CLOUSEAU/filter.png b/beauty/src/main/assets/filter/CLOUSEAU/filter.png new file mode 100644 index 000000000..226be9b36 Binary files /dev/null and b/beauty/src/main/assets/filter/CLOUSEAU/filter.png differ diff --git a/beauty/src/main/assets/filter/COBI/filter.png b/beauty/src/main/assets/filter/COBI/filter.png new file mode 100644 index 000000000..5dd044fa2 Binary files /dev/null and b/beauty/src/main/assets/filter/COBI/filter.png differ diff --git a/beauty/src/main/assets/filter/COCO/filter.png b/beauty/src/main/assets/filter/COCO/filter.png new file mode 100644 index 000000000..95dd8896f Binary files /dev/null and b/beauty/src/main/assets/filter/COCO/filter.png differ diff --git a/beauty/src/main/assets/filter/COFFEE/filter.png b/beauty/src/main/assets/filter/COFFEE/filter.png new file mode 100644 index 000000000..4acb318c8 Binary files /dev/null and b/beauty/src/main/assets/filter/COFFEE/filter.png differ diff --git a/beauty/src/main/assets/filter/CONTRAIL/filter.png b/beauty/src/main/assets/filter/CONTRAIL/filter.png new file mode 100644 index 000000000..9d56d62a2 Binary files /dev/null and b/beauty/src/main/assets/filter/CONTRAIL/filter.png differ diff --git a/beauty/src/main/assets/filter/CUBICLE/filter.png b/beauty/src/main/assets/filter/CUBICLE/filter.png new file mode 100644 index 000000000..97395a04f Binary files /dev/null and b/beauty/src/main/assets/filter/CUBICLE/filter.png differ diff --git a/beauty/src/main/assets/filter/DELICIOUS/filter.png b/beauty/src/main/assets/filter/DELICIOUS/filter.png new file mode 100644 index 000000000..c7110c25e Binary files /dev/null and b/beauty/src/main/assets/filter/DELICIOUS/filter.png differ diff --git a/beauty/src/main/assets/filter/DJANGO/filter.png b/beauty/src/main/assets/filter/DJANGO/filter.png new file mode 100644 index 000000000..1a64458c1 Binary files /dev/null and b/beauty/src/main/assets/filter/DJANGO/filter.png differ diff --git a/beauty/src/main/assets/filter/FILTER39/filter.png b/beauty/src/main/assets/filter/FILTER39/filter.png new file mode 100644 index 000000000..962dd88a4 Binary files /dev/null and b/beauty/src/main/assets/filter/FILTER39/filter.png differ diff --git a/beauty/src/main/assets/filter/FIRSTLOVE/filter.png b/beauty/src/main/assets/filter/FIRSTLOVE/filter.png new file mode 100644 index 000000000..7cf59a4d6 Binary files /dev/null and b/beauty/src/main/assets/filter/FIRSTLOVE/filter.png differ diff --git a/beauty/src/main/assets/filter/FOREST/filter.png b/beauty/src/main/assets/filter/FOREST/filter.png new file mode 100644 index 000000000..0c0a5895b Binary files /dev/null and b/beauty/src/main/assets/filter/FOREST/filter.png differ diff --git a/beauty/src/main/assets/filter/FUJI_REALA/filter.png b/beauty/src/main/assets/filter/FUJI_REALA/filter.png new file mode 100644 index 000000000..b61345bcd Binary files /dev/null and b/beauty/src/main/assets/filter/FUJI_REALA/filter.png differ diff --git a/beauty/src/main/assets/filter/GLOSSY/filter.png b/beauty/src/main/assets/filter/GLOSSY/filter.png new file mode 100644 index 000000000..4a2cc8ac2 Binary files /dev/null and b/beauty/src/main/assets/filter/GLOSSY/filter.png differ diff --git a/beauty/src/main/assets/filter/GRASS/filter.png b/beauty/src/main/assets/filter/GRASS/filter.png new file mode 100644 index 000000000..16125240c Binary files /dev/null and b/beauty/src/main/assets/filter/GRASS/filter.png differ diff --git a/beauty/src/main/assets/filter/HOLIDAY/filter.png b/beauty/src/main/assets/filter/HOLIDAY/filter.png new file mode 100644 index 000000000..d9ece3ba8 Binary files /dev/null and b/beauty/src/main/assets/filter/HOLIDAY/filter.png differ diff --git a/beauty/src/main/assets/filter/KISS/filter.png b/beauty/src/main/assets/filter/KISS/filter.png new file mode 100644 index 000000000..4eb940c2e Binary files /dev/null and b/beauty/src/main/assets/filter/KISS/filter.png differ diff --git a/beauty/src/main/assets/filter/LOLITA/filter.png b/beauty/src/main/assets/filter/LOLITA/filter.png new file mode 100644 index 000000000..54584a54e Binary files /dev/null and b/beauty/src/main/assets/filter/LOLITA/filter.png differ diff --git a/beauty/src/main/assets/filter/MEMORY/filter.png b/beauty/src/main/assets/filter/MEMORY/filter.png new file mode 100644 index 000000000..0b88aad41 Binary files /dev/null and b/beauty/src/main/assets/filter/MEMORY/filter.png differ diff --git a/beauty/src/main/assets/filter/MOUSSE/filter.png b/beauty/src/main/assets/filter/MOUSSE/filter.png new file mode 100644 index 000000000..01995e17a Binary files /dev/null and b/beauty/src/main/assets/filter/MOUSSE/filter.png differ diff --git a/beauty/src/main/assets/filter/NASHVILLE/filter.png b/beauty/src/main/assets/filter/NASHVILLE/filter.png new file mode 100644 index 000000000..d72953056 Binary files /dev/null and b/beauty/src/main/assets/filter/NASHVILLE/filter.png differ diff --git a/beauty/src/main/assets/filter/NORMAL/filter.png b/beauty/src/main/assets/filter/NORMAL/filter.png new file mode 100644 index 000000000..12de54ce0 Binary files /dev/null and b/beauty/src/main/assets/filter/NORMAL/filter.png differ diff --git a/beauty/src/main/assets/filter/OXGEN/filter.png b/beauty/src/main/assets/filter/OXGEN/filter.png new file mode 100644 index 000000000..b148d2276 Binary files /dev/null and b/beauty/src/main/assets/filter/OXGEN/filter.png differ diff --git a/beauty/src/main/assets/filter/PLATYCODON/filter.png b/beauty/src/main/assets/filter/PLATYCODON/filter.png new file mode 100644 index 000000000..3169b37b9 Binary files /dev/null and b/beauty/src/main/assets/filter/PLATYCODON/filter.png differ diff --git a/beauty/src/main/assets/filter/RED/filter.png b/beauty/src/main/assets/filter/RED/filter.png new file mode 100644 index 000000000..2212960f7 Binary files /dev/null and b/beauty/src/main/assets/filter/RED/filter.png differ diff --git a/beauty/src/main/assets/filter/SUNLESS/filter.png b/beauty/src/main/assets/filter/SUNLESS/filter.png new file mode 100644 index 000000000..ae2d313d5 Binary files /dev/null and b/beauty/src/main/assets/filter/SUNLESS/filter.png differ diff --git a/beauty/src/main/assets/gift/gifts.json b/beauty/src/main/assets/gift/gifts.json new file mode 100644 index 000000000..d1374ce4e --- /dev/null +++ b/beauty/src/main/assets/gift/gifts.json @@ -0,0 +1,68 @@ +{ + "gifts": [ + { + "name": "aixin", + "dir": "aixin", + "category": "default", + "thumb": "aixin_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "kaixinle", + "dir": "kaixinle", + "category": "default", + "thumb": "kaixinle_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "meihua", + "dir": "meihua", + "category": "default", + "thumb": "meihua_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "chengbao", + "dir": "chengbao", + "category": "default", + "thumb": "chengbao_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "yuanbao", + "dir": "yuanbao", + "category": "default", + "thumb": "yuanbao_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "kuaiting", + "dir": "kuaiting", + "category": "default", + "thumb": "kuaiting_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "qiubite", + "dir": "qiubite", + "category": "default", + "thumb": "qiubite_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "semimi", + "dir": "semimi", + "category": "default", + "thumb": "semimi_icon.png", + "voiced": false, + "downloaded": false + } + ] +} \ No newline at end of file diff --git a/beauty/src/main/assets/mask/fox/fox.png b/beauty/src/main/assets/mask/fox/fox.png new file mode 100644 index 000000000..d169fc417 Binary files /dev/null and b/beauty/src/main/assets/mask/fox/fox.png differ diff --git a/beauty/src/main/assets/mask/leopard/leopard.png b/beauty/src/main/assets/mask/leopard/leopard.png new file mode 100644 index 000000000..446de0044 Binary files /dev/null and b/beauty/src/main/assets/mask/leopard/leopard.png differ diff --git a/beauty/src/main/assets/mask/masks.json b/beauty/src/main/assets/mask/masks.json new file mode 100644 index 000000000..1ade820e1 --- /dev/null +++ b/beauty/src/main/assets/mask/masks.json @@ -0,0 +1,29 @@ +{ + "masks": [ + { + "name": "panda", + "thumb": "panda_icon.png", + "downloaded": true + }, + { + "name": "leopard", + "thumb": "leopard_icon.png", + "downloaded": true + }, + { + "name": "fox", + "thumb": "fox_icon.png", + "downloaded": true + }, + { + "name": "pig", + "thumb": "pig_icon.png", + "downloaded": true + }, + { + "name": "spirit", + "thumb": "spirit_icon.png", + "downloaded": true + } + ] +} diff --git a/beauty/src/main/assets/mask/panda/panda.png b/beauty/src/main/assets/mask/panda/panda.png new file mode 100644 index 000000000..304c4c4c8 Binary files /dev/null and b/beauty/src/main/assets/mask/panda/panda.png differ diff --git a/beauty/src/main/assets/mask/pig/pig.png b/beauty/src/main/assets/mask/pig/pig.png new file mode 100644 index 000000000..86ddb18e8 Binary files /dev/null and b/beauty/src/main/assets/mask/pig/pig.png differ diff --git a/beauty/src/main/assets/mask/spirit/spirit.png b/beauty/src/main/assets/mask/spirit/spirit.png new file mode 100644 index 000000000..598163b02 Binary files /dev/null and b/beauty/src/main/assets/mask/spirit/spirit.png differ diff --git a/beauty/src/main/assets/model/ti_face_detector.xml b/beauty/src/main/assets/model/ti_face_detector.xml new file mode 100644 index 000000000..cbd1aa89e --- /dev/null +++ b/beauty/src/main/assets/model/ti_face_detector.xml @@ -0,0 +1,33314 @@ + + + +BOOST + HAAR + 24 + 24 + + 211 + + 0 + 25 + + <_> + 9 + -5.0425500869750977e+00 + + <_> + + 0 -1 0 -3.1511999666690826e-02 + + 2.0875380039215088e+00 -2.2172100543975830e+00 + <_> + + 0 -1 1 1.2396000325679779e-02 + + -1.8633940219879150e+00 1.3272049427032471e+00 + <_> + + 0 -1 2 2.1927999332547188e-02 + + -1.5105249881744385e+00 1.0625729560852051e+00 + <_> + + 0 -1 3 5.7529998011887074e-03 + + -8.7463897466659546e-01 1.1760339736938477e+00 + <_> + + 0 -1 4 1.5014000236988068e-02 + + -7.7945697307586670e-01 1.2608419656753540e+00 + <_> + + 0 -1 5 9.9371001124382019e-02 + + 5.5751299858093262e-01 -1.8743000030517578e+00 + <_> + + 0 -1 6 2.7340000960975885e-03 + + -1.6911929845809937e+00 4.4009700417518616e-01 + <_> + + 0 -1 7 -1.8859000876545906e-02 + + -1.4769539833068848e+00 4.4350099563598633e-01 + <_> + + 0 -1 8 5.9739998541772366e-03 + + -8.5909199714660645e-01 8.5255599021911621e-01 + <_> + 16 + -4.9842400550842285e+00 + + <_> + + 0 -1 9 -2.1110000088810921e-02 + + 1.2435649633407593e+00 -1.5713009834289551e+00 + <_> + + 0 -1 10 2.0355999469757080e-02 + + -1.6204780340194702e+00 1.1817760467529297e+00 + <_> + + 0 -1 11 2.1308999508619308e-02 + + -1.9415930509567261e+00 7.0069098472595215e-01 + <_> + + 0 -1 12 9.1660000383853912e-02 + + -5.5670100450515747e-01 1.7284419536590576e+00 + <_> + + 0 -1 13 3.6288000643253326e-02 + + 2.6763799786567688e-01 -2.1831810474395752e+00 + <_> + + 0 -1 14 -1.9109999760985374e-02 + + -2.6730210781097412e+00 4.5670801401138306e-01 + <_> + + 0 -1 15 8.2539999857544899e-03 + + -1.0852910280227661e+00 5.3564202785491943e-01 + <_> + + 0 -1 16 1.8355000764131546e-02 + + -3.5200199484825134e-01 9.3339198827743530e-01 + <_> + + 0 -1 17 -7.0569999516010284e-03 + + 9.2782098054885864e-01 -6.6349899768829346e-01 + <_> + + 0 -1 18 -9.8770000040531158e-03 + + 1.1577470302581787e+00 -2.9774799942970276e-01 + <_> + + 0 -1 19 1.5814000740647316e-02 + + -4.1960600018501282e-01 1.3576040267944336e+00 + <_> + + 0 -1 20 -2.0700000226497650e-02 + + 1.4590020179748535e+00 -1.9739399850368500e-01 + <_> + + 0 -1 21 -1.3760800659656525e-01 + + 1.1186759471893311e+00 -5.2915501594543457e-01 + <_> + + 0 -1 22 1.4318999834358692e-02 + + -3.5127198696136475e-01 1.1440860033035278e+00 + <_> + + 0 -1 23 1.0253000073134899e-02 + + -6.0850602388381958e-01 7.7098500728607178e-01 + <_> + + 0 -1 24 9.1508001089096069e-02 + + 3.8817799091339111e-01 -1.5122940540313721e+00 + <_> + 27 + -4.6551899909973145e+00 + + <_> + + 0 -1 25 6.9747000932693481e-02 + + -1.0130879878997803e+00 1.4687349796295166e+00 + <_> + + 0 -1 26 3.1502999365329742e-02 + + -1.6463639736175537e+00 1.0000629425048828e+00 + <_> + + 0 -1 27 1.4260999858379364e-02 + + 4.6480301022529602e-01 -1.5959889888763428e+00 + <_> + + 0 -1 28 1.4453000389039516e-02 + + -6.5511900186538696e-01 8.3021801710128784e-01 + <_> + + 0 -1 29 -3.0509999487549067e-03 + + -1.3982310295104980e+00 4.2550599575042725e-01 + <_> + + 0 -1 30 3.2722998410463333e-02 + + -5.0702601671218872e-01 1.0526109933853149e+00 + <_> + + 0 -1 31 -7.2960001416504383e-03 + + 3.6356899142265320e-01 -1.3464889526367188e+00 + <_> + + 0 -1 32 5.0425000488758087e-02 + + -3.0461400747299194e-01 1.4504129886627197e+00 + <_> + + 0 -1 33 4.6879000961780548e-02 + + -4.0286201238632202e-01 1.2145609855651855e+00 + <_> + + 0 -1 34 -6.9358997046947479e-02 + + 1.0539360046386719e+00 -4.5719701051712036e-01 + <_> + + 0 -1 35 -4.9033999443054199e-02 + + -1.6253089904785156e+00 1.5378999710083008e-01 + <_> + + 0 -1 36 8.4827996790409088e-02 + + 2.8402999043464661e-01 -1.5662059783935547e+00 + <_> + + 0 -1 37 -1.7229999648407102e-03 + + -1.0147459506988525e+00 2.3294800519943237e-01 + <_> + + 0 -1 38 1.1562199890613556e-01 + + -1.6732899844646454e-01 1.2804069519042969e+00 + <_> + + 0 -1 39 -5.1279999315738678e-02 + + 1.5162390470504761e+00 -3.0271100997924805e-01 + <_> + + 0 -1 40 -4.2706999927759171e-02 + + 1.7631920576095581e+00 -5.1832001656293869e-02 + <_> + + 0 -1 41 3.7178099155426025e-01 + + -3.1389200687408447e-01 1.5357979536056519e+00 + <_> + + 0 -1 42 1.9412999972701073e-02 + + -1.0017599910497665e-01 9.3655401468276978e-01 + <_> + + 0 -1 43 1.7439000308513641e-02 + + -4.0379899740219116e-01 9.6293002367019653e-01 + <_> + + 0 -1 44 3.9638999849557877e-02 + + 1.7039099335670471e-01 -2.9602990150451660e+00 + <_> + + 0 -1 45 -9.1469995677471161e-03 + + 8.8786798715591431e-01 -4.3818700313568115e-01 + <_> + + 0 -1 46 1.7219999572262168e-03 + + -3.7218600511550903e-01 4.0018901228904724e-01 + <_> + + 0 -1 47 3.0231000855565071e-02 + + 6.5924003720283508e-02 -2.6469180583953857e+00 + <_> + + 0 -1 48 -7.8795999288558960e-02 + + -1.7491459846496582e+00 2.8475299477577209e-01 + <_> + + 0 -1 49 2.1110000088810921e-03 + + -9.3908101320266724e-01 2.3205199837684631e-01 + <_> + + 0 -1 50 2.7091000229120255e-02 + + -5.2664000540971756e-02 1.0756820440292358e+00 + <_> + + 0 -1 51 -4.4964998960494995e-02 + + -1.8294479846954346e+00 9.9561996757984161e-02 + <_> + 32 + -4.4531588554382324e+00 + + <_> + + 0 -1 52 -6.5701000392436981e-02 + + 1.1558510065078735e+00 -1.0716359615325928e+00 + <_> + + 0 -1 53 1.5839999541640282e-02 + + -1.5634720325469971e+00 7.6877099275588989e-01 + <_> + + 0 -1 54 1.4570899307727814e-01 + + -5.7450097799301147e-01 1.3808720111846924e+00 + <_> + + 0 -1 55 6.1389999464154243e-03 + + -1.4570560455322266e+00 5.1610302925109863e-01 + <_> + + 0 -1 56 6.7179999314248562e-03 + + -8.3533602952957153e-01 5.8522200584411621e-01 + <_> + + 0 -1 57 1.8518000841140747e-02 + + -3.1312099099159241e-01 1.1696679592132568e+00 + <_> + + 0 -1 58 1.9958000630140305e-02 + + -4.3442600965499878e-01 9.5446902513504028e-01 + <_> + + 0 -1 59 -2.7755001187324524e-01 + + 1.4906179904937744e+00 -1.3815900683403015e-01 + <_> + + 0 -1 60 9.1859996318817139e-03 + + -9.6361500024795532e-01 2.7665498852729797e-01 + <_> + + 0 -1 61 -3.7737999111413956e-02 + + -2.4464108943939209e+00 2.3619599640369415e-01 + <_> + + 0 -1 62 1.8463000655174255e-02 + + 1.7539200186729431e-01 -1.3423130512237549e+00 + <_> + + 0 -1 63 -1.1114999651908875e-02 + + 4.8710799217224121e-01 -8.9851897954940796e-01 + <_> + + 0 -1 64 3.3927999436855316e-02 + + 1.7874200642108917e-01 -1.6342279911041260e+00 + <_> + + 0 -1 65 -3.5649001598358154e-02 + + -1.9607399702072144e+00 1.8102499842643738e-01 + <_> + + 0 -1 66 -1.1438000015914440e-02 + + 9.9010699987411499e-01 -3.8103199005126953e-01 + <_> + + 0 -1 67 -6.5236002206802368e-02 + + -2.5794160366058350e+00 2.4753600358963013e-01 + <_> + + 0 -1 68 -4.2272001504898071e-02 + + 1.4411840438842773e+00 -2.9508298635482788e-01 + <_> + + 0 -1 69 1.9219999667257071e-03 + + -4.9608600139617920e-01 6.3173598051071167e-01 + <_> + + 0 -1 70 -1.2921799719333649e-01 + + -2.3314270973205566e+00 5.4496999830007553e-02 + <_> + + 0 -1 71 2.2931000217795372e-02 + + -8.4447097778320312e-01 3.8738098740577698e-01 + <_> + + 0 -1 72 -3.4120000898838043e-02 + + -1.4431500434875488e+00 9.8422996699810028e-02 + <_> + + 0 -1 73 2.6223000138998032e-02 + + 1.8223099410533905e-01 -1.2586519718170166e+00 + <_> + + 0 -1 74 2.2236999124288559e-02 + + 6.9807998836040497e-02 -2.3820950984954834e+00 + <_> + + 0 -1 75 -5.8240001089870930e-03 + + 3.9332500100135803e-01 -2.7542799711227417e-01 + <_> + + 0 -1 76 4.3653000146150589e-02 + + 1.4832699298858643e-01 -1.1368780136108398e+00 + <_> + + 0 -1 77 5.7266999036073685e-02 + + 2.4628099799156189e-01 -1.2687400579452515e+00 + <_> + + 0 -1 78 2.3409998975694180e-03 + + -7.5448900461196899e-01 2.7163800597190857e-01 + <_> + + 0 -1 79 1.2996000237762928e-02 + + -3.6394900083541870e-01 7.0959198474884033e-01 + <_> + + 0 -1 80 -2.6517000049352646e-02 + + -2.3221859931945801e+00 3.5744000226259232e-02 + <_> + + 0 -1 81 -5.8400002308189869e-03 + + 4.2194300889968872e-01 -4.8184998333454132e-02 + <_> + + 0 -1 82 -1.6568999737501144e-02 + + 1.1099940538406372e+00 -3.4849700331687927e-01 + <_> + + 0 -1 83 -6.8157002329826355e-02 + + -3.3269989490509033e+00 2.1299000084400177e-01 + <_> + 52 + -4.3864588737487793e+00 + + <_> + + 0 -1 84 3.9974000304937363e-02 + + -1.2173449993133545e+00 1.0826710462570190e+00 + <_> + + 0 -1 85 1.8819500505924225e-01 + + -4.8289400339126587e-01 1.4045250415802002e+00 + <_> + + 0 -1 86 7.8027002513408661e-02 + + -1.0782150030136108e+00 7.4040299654006958e-01 + <_> + + 0 -1 87 1.1899999663000926e-04 + + -1.2019979953765869e+00 3.7749201059341431e-01 + <_> + + 0 -1 88 8.5056997835636139e-02 + + -4.3939098715782166e-01 1.2647340297698975e+00 + <_> + + 0 -1 89 8.9720003306865692e-03 + + -1.8440499901771545e-01 4.5726400613784790e-01 + <_> + + 0 -1 90 8.8120000436902046e-03 + + 3.0396699905395508e-01 -9.5991098880767822e-01 + <_> + + 0 -1 91 -2.3507999256253242e-02 + + 1.2487529516220093e+00 4.6227999031543732e-02 + <_> + + 0 -1 92 7.0039997808635235e-03 + + -5.9442102909088135e-01 5.3963297605514526e-01 + <_> + + 0 -1 93 3.3851999789476395e-02 + + 2.8496098518371582e-01 -1.4895249605178833e+00 + <_> + + 0 -1 94 -3.2530000898987055e-03 + + 4.8120799660682678e-01 -5.2712398767471313e-01 + <_> + + 0 -1 95 2.9097000136971474e-02 + + 2.6743900775909424e-01 -1.6007850170135498e+00 + <_> + + 0 -1 96 -8.4790000692009926e-03 + + -1.3107639551162720e+00 1.5243099629878998e-01 + <_> + + 0 -1 97 -1.0795000009238720e-02 + + 4.5613598823547363e-01 -7.2050899267196655e-01 + <_> + + 0 -1 98 -2.4620000272989273e-02 + + -1.7320619821548462e+00 6.8363003432750702e-02 + <_> + + 0 -1 99 3.7380000576376915e-03 + + -1.9303299486637115e-01 6.8243497610092163e-01 + <_> + + 0 -1 100 -1.2264000251889229e-02 + + -1.6095290184020996e+00 7.5268000364303589e-02 + <_> + + 0 -1 101 -4.8670000396668911e-03 + + 7.4286502599716187e-01 -2.1510200202465057e-01 + <_> + + 0 -1 102 7.6725997030735016e-02 + + -2.6835098862648010e-01 1.3094140291213989e+00 + <_> + + 0 -1 103 2.8578000143170357e-02 + + -5.8793000876903534e-02 1.2196329832077026e+00 + <_> + + 0 -1 104 1.9694000482559204e-02 + + -3.5142898559570312e-01 8.4926998615264893e-01 + <_> + + 0 -1 105 -2.9093999415636063e-02 + + -1.0507299900054932e+00 2.9806300997734070e-01 + <_> + + 0 -1 106 -2.9144000262022018e-02 + + 8.2547801733016968e-01 -3.2687199115753174e-01 + <_> + + 0 -1 107 1.9741000607609749e-02 + + 2.0452600717544556e-01 -8.3760201930999756e-01 + <_> + + 0 -1 108 4.3299999088048935e-03 + + 2.0577900111675262e-01 -6.6829800605773926e-01 + <_> + + 0 -1 109 -3.5500999540090561e-02 + + -1.2969900369644165e+00 1.3897499442100525e-01 + <_> + + 0 -1 110 -1.6172999516129494e-02 + + -1.3110569715499878e+00 7.5751997530460358e-02 + <_> + + 0 -1 111 -2.2151000797748566e-02 + + -1.0524389743804932e+00 1.9241100549697876e-01 + <_> + + 0 -1 112 -2.2707000374794006e-02 + + -1.3735309839248657e+00 6.6780999302864075e-02 + <_> + + 0 -1 113 1.6607999801635742e-02 + + -3.7135999649763107e-02 7.7846401929855347e-01 + <_> + + 0 -1 114 -1.3309000059962273e-02 + + -9.9850702285766602e-01 1.2248100340366364e-01 + <_> + + 0 -1 115 -3.3732000738382339e-02 + + 1.4461359977722168e+00 1.3151999562978745e-02 + <_> + + 0 -1 116 1.6935000196099281e-02 + + -3.7121298909187317e-01 5.2842199802398682e-01 + <_> + + 0 -1 117 3.3259999472647905e-03 + + -5.7568502426147461e-01 3.9261901378631592e-01 + <_> + + 0 -1 118 8.3644002676010132e-02 + + 1.6116000711917877e-02 -2.1173279285430908e+00 + <_> + + 0 -1 119 2.5785198807716370e-01 + + -8.1609003245830536e-02 9.8782497644424438e-01 + <_> + + 0 -1 120 -3.6566998809576035e-02 + + -1.1512110233306885e+00 9.6459001302719116e-02 + <_> + + 0 -1 121 -1.6445999965071678e-02 + + 3.7315499782562256e-01 -1.4585399627685547e-01 + <_> + + 0 -1 122 -3.7519999314099550e-03 + + 2.6179298758506775e-01 -5.8156698942184448e-01 + <_> + + 0 -1 123 -6.3660000450909138e-03 + + 7.5477397441864014e-01 -1.7055200040340424e-01 + <_> + + 0 -1 124 -3.8499999791383743e-03 + + 2.2653999924659729e-01 -6.3876402378082275e-01 + <_> + + 0 -1 125 -4.5494001358747482e-02 + + -1.2640299797058105e+00 2.5260698795318604e-01 + <_> + + 0 -1 126 -2.3941000923514366e-02 + + 8.7068402767181396e-01 -2.7104699611663818e-01 + <_> + + 0 -1 127 -7.7558003365993500e-02 + + -1.3901610374450684e+00 2.3612299561500549e-01 + <_> + + 0 -1 128 2.3614000529050827e-02 + + 6.6140003502368927e-02 -1.2645419836044312e+00 + <_> + + 0 -1 129 -2.5750000495463610e-03 + + -5.3841698169708252e-01 3.0379098653793335e-01 + <_> + + 0 -1 130 1.2010800093412399e-01 + + -3.5343000292778015e-01 5.2866202592849731e-01 + <_> + + 0 -1 131 2.2899999748915434e-03 + + -5.8701997995376587e-01 2.4061000347137451e-01 + <_> + + 0 -1 132 6.9716997444629669e-02 + + -3.3348900079727173e-01 5.1916301250457764e-01 + <_> + + 0 -1 133 -4.6670001000165939e-02 + + 6.9795399904251099e-01 -1.4895999804139137e-02 + <_> + + 0 -1 134 -5.0129000097513199e-02 + + 8.6146199703216553e-01 -2.5986000895500183e-01 + <_> + + 0 -1 135 3.0147999525070190e-02 + + 1.9332799315452576e-01 -5.9131097793579102e-01 + <_> + 53 + -4.1299300193786621e+00 + + <_> + + 0 -1 136 9.1085001826286316e-02 + + -8.9233100414276123e-01 1.0434230566024780e+00 + <_> + + 0 -1 137 1.2818999588489532e-02 + + -1.2597670555114746e+00 5.5317097902297974e-01 + <_> + + 0 -1 138 1.5931999310851097e-02 + + -8.6254400014877319e-01 6.3731801509857178e-01 + <_> + + 0 -1 139 2.2780001163482666e-03 + + -7.4639201164245605e-01 5.3155601024627686e-01 + <_> + + 0 -1 140 3.1840998679399490e-02 + + -1.2650489807128906e+00 3.6153900623321533e-01 + <_> + + 0 -1 141 2.6960000395774841e-03 + + -9.8290401697158813e-01 3.6013001203536987e-01 + <_> + + 0 -1 142 -1.2055000290274620e-02 + + 6.4068400859832764e-01 -5.0125002861022949e-01 + <_> + + 0 -1 143 2.1324999630451202e-02 + + -2.4034999310970306e-01 8.5448002815246582e-01 + <_> + + 0 -1 144 3.0486000701785088e-02 + + -3.4273600578308105e-01 1.1428849697113037e+00 + <_> + + 0 -1 145 -4.5079998672008514e-02 + + 1.0976949930191040e+00 -1.7974600195884705e-01 + <_> + + 0 -1 146 -7.1700997650623322e-02 + + 1.5735000371932983e+00 -3.1433498859405518e-01 + <_> + + 0 -1 147 5.9218000620603561e-02 + + -2.7582401037216187e-01 1.0448570251464844e+00 + <_> + + 0 -1 148 6.7010000348091125e-03 + + -1.0974019765853882e+00 1.9801199436187744e-01 + <_> + + 0 -1 149 4.1046999394893646e-02 + + 3.0547699332237244e-01 -1.3287999629974365e+00 + <_> + + 0 -1 150 -8.5499999113380909e-04 + + 2.5807100534439087e-01 -7.0052897930145264e-01 + <_> + + 0 -1 151 -3.0360000208020210e-02 + + -1.2306419610977173e+00 2.2609399259090424e-01 + <_> + + 0 -1 152 -1.2930000200867653e-02 + + 4.0758600831031799e-01 -5.1234501600265503e-01 + <_> + + 0 -1 153 3.7367999553680420e-02 + + -9.4755001366138458e-02 6.1765098571777344e-01 + <_> + + 0 -1 154 2.4434000253677368e-02 + + -4.1100600361824036e-01 4.7630500793457031e-01 + <_> + + 0 -1 155 5.7007998228073120e-02 + + 2.5249299407005310e-01 -6.8669801950454712e-01 + <_> + + 0 -1 156 -1.6313999891281128e-02 + + -9.3928402662277222e-01 1.1448100209236145e-01 + <_> + + 0 -1 157 -1.7648899555206299e-01 + + 1.2451089620590210e+00 -5.6519001722335815e-02 + <_> + + 0 -1 158 1.7614600062370300e-01 + + -3.2528200745582581e-01 8.2791501283645630e-01 + <_> + + 0 -1 159 -7.3910001665353775e-03 + + 3.4783700108528137e-01 -1.7929099500179291e-01 + <_> + + 0 -1 160 6.0890998691320419e-02 + + 5.5098000913858414e-02 -1.5480779409408569e+00 + <_> + + 0 -1 161 -2.9123000800609589e-02 + + -1.0255639553070068e+00 2.4106900393962860e-01 + <_> + + 0 -1 162 -4.5648999512195587e-02 + + 1.0301599502563477e+00 -3.1672099232673645e-01 + <_> + + 0 -1 163 3.7333000451326370e-02 + + 2.1620599925518036e-01 -8.2589900493621826e-01 + <_> + + 0 -1 164 -2.4411000311374664e-02 + + -1.5957959890365601e+00 5.1139000803232193e-02 + <_> + + 0 -1 165 -5.9806998819112778e-02 + + -1.0312290191650391e+00 1.3092300295829773e-01 + <_> + + 0 -1 166 -3.0106000602245331e-02 + + -1.4781630039215088e+00 3.7211999297142029e-02 + <_> + + 0 -1 167 7.4209999293088913e-03 + + -2.4024100601673126e-01 4.9333998560905457e-01 + <_> + + 0 -1 168 -2.1909999195486307e-03 + + 2.8941500186920166e-01 -5.7259601354598999e-01 + <_> + + 0 -1 169 2.0860999822616577e-02 + + -2.3148399591445923e-01 6.3765901327133179e-01 + <_> + + 0 -1 170 -6.6990000195801258e-03 + + -1.2107750177383423e+00 6.4018003642559052e-02 + <_> + + 0 -1 171 1.8758000805974007e-02 + + 2.4461300671100616e-01 -9.9786698818206787e-01 + <_> + + 0 -1 172 -4.4323001056909561e-02 + + -1.3699189424514771e+00 3.6051999777555466e-02 + <_> + + 0 -1 173 2.2859999909996986e-02 + + 2.1288399398326874e-01 -1.0397620201110840e+00 + <_> + + 0 -1 174 -9.8600005730986595e-04 + + 3.2443600893020630e-01 -5.4291802644729614e-01 + <_> + + 0 -1 175 1.7239000648260117e-02 + + -2.8323900699615479e-01 4.4468200206756592e-01 + <_> + + 0 -1 176 -3.4531001001596451e-02 + + -2.3107020854949951e+00 -3.1399999279528856e-03 + <_> + + 0 -1 177 6.7006997764110565e-02 + + 2.8715699911117554e-01 -6.4481002092361450e-01 + <_> + + 0 -1 178 2.3776899278163910e-01 + + -2.7174800634384155e-01 8.0219101905822754e-01 + <_> + + 0 -1 179 -1.2903000228106976e-02 + + -1.5317620038986206e+00 2.1423600614070892e-01 + <_> + + 0 -1 180 1.0514999739825726e-02 + + 7.7037997543811798e-02 -1.0581140518188477e+00 + <_> + + 0 -1 181 1.6969000920653343e-02 + + 1.4306700229644775e-01 -8.5828399658203125e-01 + <_> + + 0 -1 182 -7.2460002265870571e-03 + + -1.1020129919052124e+00 6.4906999468803406e-02 + <_> + + 0 -1 183 1.0556999593973160e-02 + + 1.3964000158011913e-02 6.3601499795913696e-01 + <_> + + 0 -1 184 6.1380001716315746e-03 + + -3.4545901417732239e-01 5.6296801567077637e-01 + <_> + + 0 -1 185 1.3158000074326992e-02 + + 1.9927300512790680e-01 -1.5040320158004761e+00 + <_> + + 0 -1 186 3.1310000922530890e-03 + + -4.0903699398040771e-01 3.7796398997306824e-01 + <_> + + 0 -1 187 -1.0920699685811996e-01 + + -2.2227079868316650e+00 1.2178199738264084e-01 + <_> + + 0 -1 188 8.1820003688335419e-03 + + -2.8652000427246094e-01 6.7890799045562744e-01 + <_> + 62 + -4.0218091011047363e+00 + + <_> + + 0 -1 189 3.1346999108791351e-02 + + -8.8884598016738892e-01 9.4936800003051758e-01 + <_> + + 0 -1 190 3.1918000429868698e-02 + + -1.1146880388259888e+00 4.8888999223709106e-01 + <_> + + 0 -1 191 6.5939999185502529e-03 + + -1.0097689628601074e+00 4.9723801016807556e-01 + <_> + + 0 -1 192 2.6148000732064247e-02 + + 2.5991299748420715e-01 -1.2537480592727661e+00 + <_> + + 0 -1 193 1.2845000252127647e-02 + + -5.7138597965240479e-01 5.9659498929977417e-01 + <_> + + 0 -1 194 2.6344999670982361e-02 + + -5.5203199386596680e-01 3.0217400193214417e-01 + <_> + + 0 -1 195 -1.5083000063896179e-02 + + -1.2871240377426147e+00 2.2354200482368469e-01 + <_> + + 0 -1 196 -3.8887001574039459e-02 + + 1.7425049543380737e+00 -9.9747002124786377e-02 + <_> + + 0 -1 197 -5.7029998861253262e-03 + + -1.0523240566253662e+00 1.8362599611282349e-01 + <_> + + 0 -1 198 -1.4860000228509307e-03 + + 5.6784200668334961e-01 -4.6742001175880432e-01 + <_> + + 0 -1 199 -2.8486000373959541e-02 + + 1.3082909584045410e+00 -2.6460900902748108e-01 + <_> + + 0 -1 200 6.6224999725818634e-02 + + -4.6210700273513794e-01 4.1749599575996399e-01 + <_> + + 0 -1 201 8.8569996878504753e-03 + + -4.1474899649620056e-01 5.9204798936843872e-01 + <_> + + 0 -1 202 1.1355999857187271e-02 + + 3.6103099584579468e-01 -4.5781201124191284e-01 + <_> + + 0 -1 203 -2.7679998893290758e-03 + + -8.9238899946212769e-01 1.4199000597000122e-01 + <_> + + 0 -1 204 1.1246999725699425e-02 + + 2.9353401064872742e-01 -9.7330600023269653e-01 + <_> + + 0 -1 205 7.1970000863075256e-03 + + -7.9334902763366699e-01 1.8313400447368622e-01 + <_> + + 0 -1 206 3.1768999993801117e-02 + + 1.5523099899291992e-01 -1.3245639801025391e+00 + <_> + + 0 -1 207 2.5173999369144440e-02 + + 3.4214999526739120e-02 -2.0948131084442139e+00 + <_> + + 0 -1 208 7.5360001064836979e-03 + + -3.9450600743293762e-01 5.1333999633789062e-01 + <_> + + 0 -1 209 3.2873000949621201e-02 + + 8.8372997939586639e-02 -1.2814120054244995e+00 + <_> + + 0 -1 210 -2.7379998937249184e-03 + + 5.5286502838134766e-01 -4.6384999155998230e-01 + <_> + + 0 -1 211 -3.8075000047683716e-02 + + -1.8497270345687866e+00 4.5944001525640488e-02 + <_> + + 0 -1 212 -3.8984000682830811e-02 + + -4.8223701119422913e-01 3.4760600328445435e-01 + <_> + + 0 -1 213 2.8029999230057001e-03 + + -4.5154699683189392e-01 4.2806300520896912e-01 + <_> + + 0 -1 214 -5.4145999252796173e-02 + + -8.4520798921585083e-01 1.6674900054931641e-01 + <_> + + 0 -1 215 -8.3280000835657120e-03 + + 3.5348299145698547e-01 -4.7163200378417969e-01 + <_> + + 0 -1 216 3.3778000622987747e-02 + + 1.8463100492954254e-01 -1.6686669588088989e+00 + <_> + + 0 -1 217 -1.1238099634647369e-01 + + -1.2521569728851318e+00 3.5992000252008438e-02 + <_> + + 0 -1 218 -1.0408000089228153e-02 + + -8.1620401144027710e-01 2.3428599536418915e-01 + <_> + + 0 -1 219 -4.9439999274909496e-03 + + -9.2584699392318726e-01 1.0034800320863724e-01 + <_> + + 0 -1 220 -9.3029998242855072e-03 + + 5.6499302387237549e-01 -1.8881900608539581e-01 + <_> + + 0 -1 221 -1.1749999597668648e-02 + + 8.0302399396896362e-01 -3.8277000188827515e-01 + <_> + + 0 -1 222 -2.3217000067234039e-02 + + -8.4926998615264893e-01 1.9671200215816498e-01 + <_> + + 0 -1 223 1.6866000369191170e-02 + + -4.0591898560523987e-01 5.0695300102233887e-01 + <_> + + 0 -1 224 -2.4031000211834908e-02 + + -1.5297520160675049e+00 2.3344999551773071e-01 + <_> + + 0 -1 225 -3.6945998668670654e-02 + + 6.3007700443267822e-01 -3.1780400872230530e-01 + <_> + + 0 -1 226 -6.1563998460769653e-02 + + 5.8627897500991821e-01 -1.2107999995350838e-02 + <_> + + 0 -1 227 2.1661000326275826e-02 + + -2.5623700022697449e-01 1.0409849882125854e+00 + <_> + + 0 -1 228 -3.6710000131279230e-03 + + 2.9171100258827209e-01 -8.3287298679351807e-01 + <_> + + 0 -1 229 4.4849000871181488e-02 + + -3.9633199572563171e-01 4.5662000775337219e-01 + <_> + + 0 -1 230 5.7195000350475311e-02 + + 2.1023899316787720e-01 -1.5004800558090210e+00 + <_> + + 0 -1 231 -1.1342000216245651e-02 + + 4.4071298837661743e-01 -3.8653799891471863e-01 + <_> + + 0 -1 232 -1.2004000134766102e-02 + + 9.3954598903656006e-01 -1.0589499771595001e-01 + <_> + + 0 -1 233 2.2515999153256416e-02 + + 9.4480002298951149e-03 -1.6799509525299072e+00 + <_> + + 0 -1 234 -1.9809000194072723e-02 + + -1.0133639574050903e+00 2.4146600067615509e-01 + <_> + + 0 -1 235 1.5891000628471375e-02 + + -3.7507599592208862e-01 4.6614098548889160e-01 + <_> + + 0 -1 236 -9.1420002281665802e-03 + + -8.0484098196029663e-01 1.7816999554634094e-01 + <_> + + 0 -1 237 -4.4740000739693642e-03 + + -1.0562069416046143e+00 7.3305003345012665e-02 + <_> + + 0 -1 238 1.2742500007152557e-01 + + 2.0165599882602692e-01 -1.5467929840087891e+00 + <_> + + 0 -1 239 4.7703001648187637e-02 + + -3.7937799096107483e-01 3.7885999679565430e-01 + <_> + + 0 -1 240 5.3608000278472900e-02 + + 2.1220499277114868e-01 -1.2399710416793823e+00 + <_> + + 0 -1 241 -3.9680998772382736e-02 + + -1.0257550477981567e+00 5.1282998174428940e-02 + <_> + + 0 -1 242 -6.7327000200748444e-02 + + -1.0304750204086304e+00 2.3005299270153046e-01 + <_> + + 0 -1 243 1.3337600231170654e-01 + + -2.0869000256061554e-01 1.2272510528564453e+00 + <_> + + 0 -1 244 -2.0919300615787506e-01 + + 8.7929898500442505e-01 -4.4254999607801437e-02 + <_> + + 0 -1 245 -6.5589003264904022e-02 + + 1.0443429946899414e+00 -2.1682099997997284e-01 + <_> + + 0 -1 246 6.1882998794317245e-02 + + 1.3798199594020844e-01 -1.9009059667587280e+00 + <_> + + 0 -1 247 -2.5578999891877174e-02 + + -1.6607600450515747e+00 5.8439997956156731e-03 + <_> + + 0 -1 248 -3.4827001392841339e-02 + + 7.9940402507781982e-01 -8.2406997680664062e-02 + <_> + + 0 -1 249 -1.8209999427199364e-02 + + -9.6073997020721436e-01 6.6320002079010010e-02 + <_> + + 0 -1 250 1.5070999972522259e-02 + + 1.9899399578571320e-01 -7.6433002948760986e-01 + <_> + 72 + -3.8832089900970459e+00 + + <_> + + 0 -1 251 4.6324998140335083e-02 + + -1.0362670421600342e+00 8.2201498746871948e-01 + <_> + + 0 -1 252 1.5406999737024307e-02 + + -1.2327589988708496e+00 2.9647698998451233e-01 + <_> + + 0 -1 253 1.2808999978005886e-02 + + -7.5852298736572266e-01 5.7985502481460571e-01 + <_> + + 0 -1 254 4.9150999635457993e-02 + + -3.8983899354934692e-01 8.9680302143096924e-01 + <_> + + 0 -1 255 1.2621000409126282e-02 + + -7.1799302101135254e-01 5.0440901517868042e-01 + <_> + + 0 -1 256 -1.8768999725580215e-02 + + 5.5147600173950195e-01 -7.0555400848388672e-01 + <_> + + 0 -1 257 4.1965000331401825e-02 + + -4.4782099127769470e-01 7.0985502004623413e-01 + <_> + + 0 -1 258 -5.1401998847723007e-02 + + -1.0932120084762573e+00 2.6701900362968445e-01 + <_> + + 0 -1 259 -7.0960998535156250e-02 + + 8.3618402481079102e-01 -3.8318100571632385e-01 + <_> + + 0 -1 260 1.6745999455451965e-02 + + -2.5733101367950439e-01 2.5966501235961914e-01 + <_> + + 0 -1 261 -6.2400000169873238e-03 + + 3.1631499528884888e-01 -5.8796900510787964e-01 + <_> + + 0 -1 262 -3.9397999644279480e-02 + + -1.0491210222244263e+00 1.6822400689125061e-01 + <_> + + 0 -1 263 0. + + 1.6144199669361115e-01 -8.7876898050308228e-01 + <_> + + 0 -1 264 -2.2307999432086945e-02 + + -6.9053500890731812e-01 2.3607000708580017e-01 + <_> + + 0 -1 265 1.8919999711215496e-03 + + 2.4989199638366699e-01 -5.6583297252655029e-01 + <_> + + 0 -1 266 1.0730000212788582e-03 + + -5.0415802001953125e-01 3.8374501466751099e-01 + <_> + + 0 -1 267 3.9230998605489731e-02 + + 4.2619001120328903e-02 -1.3875889778137207e+00 + <_> + + 0 -1 268 6.2238000333309174e-02 + + 1.4119400084018707e-01 -1.0688860416412354e+00 + <_> + + 0 -1 269 2.1399999968707561e-03 + + -8.9622402191162109e-01 1.9796399772167206e-01 + <_> + + 0 -1 270 9.1800000518560410e-04 + + -4.5337298512458801e-01 4.3532699346542358e-01 + <_> + + 0 -1 271 -6.9169998168945312e-03 + + 3.3822798728942871e-01 -4.4793000817298889e-01 + <_> + + 0 -1 272 -2.3866999894380569e-02 + + -7.8908598423004150e-01 2.2511799633502960e-01 + <_> + + 0 -1 273 -1.0262800008058548e-01 + + -2.2831439971923828e+00 -5.3960001096129417e-03 + <_> + + 0 -1 274 -9.5239998772740364e-03 + + 3.9346700906753540e-01 -5.2242201566696167e-01 + <_> + + 0 -1 275 3.9877001196146011e-02 + + 3.2799001783132553e-02 -1.5079489946365356e+00 + <_> + + 0 -1 276 -1.3144999742507935e-02 + + -1.0839990377426147e+00 1.8482400476932526e-01 + <_> + + 0 -1 277 -5.0590999424457550e-02 + + -1.8822289705276489e+00 -2.2199999075382948e-03 + <_> + + 0 -1 278 2.4917000904679298e-02 + + 1.4593400061130524e-01 -2.2196519374847412e+00 + <_> + + 0 -1 279 -7.6370001770555973e-03 + + -1.0164569616317749e+00 5.8797001838684082e-02 + <_> + + 0 -1 280 4.2911998927593231e-02 + + 1.5443000197410583e-01 -1.1843889951705933e+00 + <_> + + 0 -1 281 2.3000000510364771e-04 + + -7.7305799722671509e-01 1.2189900130033493e-01 + <_> + + 0 -1 282 9.0929996222257614e-03 + + -1.1450099945068359e-01 7.1091300249099731e-01 + <_> + + 0 -1 283 1.1145000346004963e-02 + + 7.0000998675823212e-02 -1.0534820556640625e+00 + <_> + + 0 -1 284 -5.2453000098466873e-02 + + -1.7594360113143921e+00 1.9523799419403076e-01 + <_> + + 0 -1 285 -2.3020699620246887e-01 + + 9.5840299129486084e-01 -2.5045698881149292e-01 + <_> + + 0 -1 286 -1.6365999355912209e-02 + + 4.6731901168823242e-01 -2.1108399331569672e-01 + <_> + + 0 -1 287 -1.7208000645041466e-02 + + 7.0835697650909424e-01 -2.8018298745155334e-01 + <_> + + 0 -1 288 -3.6648001521825790e-02 + + -1.1013339757919312e+00 2.4341100454330444e-01 + <_> + + 0 -1 289 -1.0304999537765980e-02 + + -1.0933129787445068e+00 5.6258998811244965e-02 + <_> + + 0 -1 290 -1.3713000342249870e-02 + + -2.6438099145889282e-01 1.9821000099182129e-01 + <_> + + 0 -1 291 2.9308000579476357e-02 + + -2.2142399847507477e-01 1.0525950193405151e+00 + <_> + + 0 -1 292 2.4077000096440315e-02 + + 1.8485699594020844e-01 -1.7203969955444336e+00 + <_> + + 0 -1 293 6.1280000954866409e-03 + + -9.2721498012542725e-01 5.8752998709678650e-02 + <_> + + 0 -1 294 -2.2377999499440193e-02 + + 1.9646559953689575e+00 2.7785999700427055e-02 + <_> + + 0 -1 295 -7.0440000854432583e-03 + + 2.1427600085735321e-01 -4.8407599329948425e-01 + <_> + + 0 -1 296 -4.0603000670671463e-02 + + -1.1754349470138550e+00 1.6061200201511383e-01 + <_> + + 0 -1 297 -2.4466000497341156e-02 + + -1.1239900588989258e+00 4.1110001504421234e-02 + <_> + + 0 -1 298 2.5309999473392963e-03 + + -1.7169700562953949e-01 3.2178801298141479e-01 + <_> + + 0 -1 299 -1.9588999450206757e-02 + + 8.2720202207565308e-01 -2.6376700401306152e-01 + <_> + + 0 -1 300 -2.9635999351739883e-02 + + -1.1524770259857178e+00 1.4999300241470337e-01 + <_> + + 0 -1 301 -1.5030000358819962e-02 + + -1.0491830110549927e+00 4.0160998702049255e-02 + <_> + + 0 -1 302 -6.0715001076459885e-02 + + -1.0903840065002441e+00 1.5330800414085388e-01 + <_> + + 0 -1 303 -1.2790000066161156e-02 + + 4.2248600721359253e-01 -4.2399200797080994e-01 + <_> + + 0 -1 304 -2.0247999578714371e-02 + + -9.1866999864578247e-01 1.8485699594020844e-01 + <_> + + 0 -1 305 -3.0683999881148338e-02 + + -1.5958670377731323e+00 2.5760000571608543e-03 + <_> + + 0 -1 306 -2.0718000829219818e-02 + + -6.6299998760223389e-01 3.1037199497222900e-01 + <_> + + 0 -1 307 -1.7290000105276704e-03 + + 1.9183400273323059e-01 -6.5084999799728394e-01 + <_> + + 0 -1 308 -3.1394001096487045e-02 + + -6.3643002510070801e-01 1.5408399701118469e-01 + <_> + + 0 -1 309 1.9003000110387802e-02 + + -1.8919399380683899e-01 1.5294510126113892e+00 + <_> + + 0 -1 310 6.1769997701048851e-03 + + -1.0597900301218033e-01 6.4859598875045776e-01 + <_> + + 0 -1 311 -1.0165999643504620e-02 + + -1.0802700519561768e+00 3.7176001816987991e-02 + <_> + + 0 -1 312 -1.4169999631121755e-03 + + 3.4157499670982361e-01 -9.7737997770309448e-02 + <_> + + 0 -1 313 -4.0799998678267002e-03 + + 4.7624599933624268e-01 -3.4366300702095032e-01 + <_> + + 0 -1 314 -4.4096998870372772e-02 + + 9.7634297609329224e-01 -1.9173000007867813e-02 + <_> + + 0 -1 315 -6.0669999569654465e-02 + + -2.1752851009368896e+00 -2.8925999999046326e-02 + <_> + + 0 -1 316 -3.2931998372077942e-02 + + -6.4383101463317871e-01 1.6494099795818329e-01 + <_> + + 0 -1 317 -1.4722800254821777e-01 + + -1.4745830297470093e+00 2.5839998852461576e-03 + <_> + + 0 -1 318 -1.1930000036954880e-02 + + 4.2441400885581970e-01 -1.7712600529193878e-01 + <_> + + 0 -1 319 1.4517900347709656e-01 + + 2.5444999337196350e-02 -1.2779400348663330e+00 + <_> + + 0 -1 320 5.1447998732328415e-02 + + 1.5678399801254272e-01 -1.5188430547714233e+00 + <_> + + 0 -1 321 3.1479999888688326e-03 + + -4.0424400568008423e-01 3.2429701089859009e-01 + <_> + + 0 -1 322 -4.3600000441074371e-02 + + -1.9932260513305664e+00 1.5018600225448608e-01 + <_> + 83 + -3.8424909114837646e+00 + + <_> + + 0 -1 323 1.2899599969387054e-01 + + -6.2161999940872192e-01 1.1116520166397095e+00 + <_> + + 0 -1 324 -9.1261997818946838e-02 + + 1.0143059492111206e+00 -6.1335200071334839e-01 + <_> + + 0 -1 325 1.4271999709308147e-02 + + -1.0261659622192383e+00 3.9779999852180481e-01 + <_> + + 0 -1 326 3.2889999449253082e-02 + + -1.1386079788208008e+00 2.8690800070762634e-01 + <_> + + 0 -1 327 1.2590000405907631e-02 + + -5.6645601987838745e-01 4.5172399282455444e-01 + <_> + + 0 -1 328 1.4661000110208988e-02 + + 3.0505999922752380e-01 -6.8129599094390869e-01 + <_> + + 0 -1 329 -3.3555999398231506e-02 + + -1.7208939790725708e+00 6.1439000070095062e-02 + <_> + + 0 -1 330 1.4252699911594391e-01 + + 2.3192200064659119e-01 -1.7297149896621704e+00 + <_> + + 0 -1 331 -6.2079997733235359e-03 + + -1.2163300514221191e+00 1.2160199880599976e-01 + <_> + + 0 -1 332 1.8178999423980713e-02 + + 3.2553699612617493e-01 -8.1003999710083008e-01 + <_> + + 0 -1 333 2.5036999955773354e-02 + + -3.1698799133300781e-01 6.7361402511596680e-01 + <_> + + 0 -1 334 4.6560999006032944e-02 + + -1.1089800298213959e-01 8.4082502126693726e-01 + <_> + + 0 -1 335 -8.9999996125698090e-03 + + 3.9574500918388367e-01 -4.7624599933624268e-01 + <_> + + 0 -1 336 4.0805999189615250e-02 + + -1.8000000272877514e-04 9.4570702314376831e-01 + <_> + + 0 -1 337 -3.4221999347209930e-02 + + 7.5206297636032104e-01 -3.1531500816345215e-01 + <_> + + 0 -1 338 -3.9716001600027084e-02 + + -8.3139598369598389e-01 1.7744399607181549e-01 + <_> + + 0 -1 339 2.5170000735670328e-03 + + -5.9377998113632202e-01 2.4657000601291656e-01 + <_> + + 0 -1 340 2.7428999543190002e-02 + + 1.5998399257659912e-01 -4.2781999707221985e-01 + <_> + + 0 -1 341 3.4986000508069992e-02 + + 3.5055998712778091e-02 -1.5988600254058838e+00 + <_> + + 0 -1 342 4.4970000162720680e-03 + + -5.2034300565719604e-01 3.7828299403190613e-01 + <_> + + 0 -1 343 2.7699999045580626e-03 + + -5.3182601928710938e-01 2.4951000511646271e-01 + <_> + + 0 -1 344 3.5174001008272171e-02 + + 1.9983400404453278e-01 -1.4446129798889160e+00 + <_> + + 0 -1 345 2.5970999151468277e-02 + + 4.4426999986171722e-02 -1.3622980117797852e+00 + <_> + + 0 -1 346 -1.5783999115228653e-02 + + -9.1020399332046509e-01 2.7190300822257996e-01 + <_> + + 0 -1 347 -7.5880000367760658e-03 + + 9.2064999043941498e-02 -8.1628900766372681e-01 + <_> + + 0 -1 348 2.0754000172019005e-02 + + 2.1185700595378876e-01 -7.4729001522064209e-01 + <_> + + 0 -1 349 5.9829000383615494e-02 + + -2.7301099896430969e-01 8.0923300981521606e-01 + <_> + + 0 -1 350 3.9039000868797302e-02 + + -1.0432299971580505e-01 8.6226201057434082e-01 + <_> + + 0 -1 351 2.1665999665856361e-02 + + 6.2709003686904907e-02 -9.8894298076629639e-01 + <_> + + 0 -1 352 -2.7496999129652977e-02 + + -9.2690998315811157e-01 1.5586300194263458e-01 + <_> + + 0 -1 353 1.0462000034749508e-02 + + 1.3418099284172058e-01 -7.0386397838592529e-01 + <_> + + 0 -1 354 2.4870999157428741e-02 + + 1.9706700742244720e-01 -4.0263301134109497e-01 + <_> + + 0 -1 355 -1.6036000102758408e-02 + + -1.1409829854965210e+00 7.3997996747493744e-02 + <_> + + 0 -1 356 4.8627000302076340e-02 + + 1.6990399360656738e-01 -7.2152197360992432e-01 + <_> + + 0 -1 357 1.2619999470189214e-03 + + -4.7389799356460571e-01 2.6254999637603760e-01 + <_> + + 0 -1 358 -8.8035002350807190e-02 + + -2.1606519222259521e+00 1.4554800093173981e-01 + <_> + + 0 -1 359 1.8356999382376671e-02 + + 4.4750999659299850e-02 -1.0766370296478271e+00 + <_> + + 0 -1 360 3.5275001078844070e-02 + + -3.2919000834226608e-02 1.2153890132904053e+00 + <_> + + 0 -1 361 -2.0392900705337524e-01 + + -1.3187999725341797e+00 1.5503999777138233e-02 + <_> + + 0 -1 362 -1.6619000583887100e-02 + + 3.6850199103355408e-01 -1.5283699333667755e-01 + <_> + + 0 -1 363 3.7739001214504242e-02 + + -2.5727799534797668e-01 7.0655298233032227e-01 + <_> + + 0 -1 364 2.2720000706613064e-03 + + -7.7602997422218323e-02 3.3367800712585449e-01 + <_> + + 0 -1 365 -1.4802999794483185e-02 + + -7.8524798154830933e-01 7.6934002339839935e-02 + <_> + + 0 -1 366 -4.8319000750780106e-02 + + 1.7022320032119751e+00 4.9722000956535339e-02 + <_> + + 0 -1 367 -2.9539000242948532e-02 + + 7.7670699357986450e-01 -2.4534299969673157e-01 + <_> + + 0 -1 368 -4.6169001609086990e-02 + + -1.4922779798507690e+00 1.2340000271797180e-01 + <_> + + 0 -1 369 -2.8064999729394913e-02 + + -2.1345369815826416e+00 -2.5797000154852867e-02 + <_> + + 0 -1 370 -5.7339998893439770e-03 + + 5.6982600688934326e-01 -1.2056600302457809e-01 + <_> + + 0 -1 371 -1.0111000388860703e-02 + + 6.7911398410797119e-01 -2.6638001203536987e-01 + <_> + + 0 -1 372 1.1359999887645245e-02 + + 2.4789799749851227e-01 -6.4493000507354736e-01 + <_> + + 0 -1 373 5.1809001713991165e-02 + + 1.4716000296175480e-02 -1.2395579814910889e+00 + <_> + + 0 -1 374 3.3291999250650406e-02 + + -8.2559995353221893e-03 1.0168470144271851e+00 + <_> + + 0 -1 375 -1.4494000002741814e-02 + + 4.5066800713539124e-01 -3.6250999569892883e-01 + <_> + + 0 -1 376 -3.4221999347209930e-02 + + -9.5292502641677856e-01 2.0684599876403809e-01 + <_> + + 0 -1 377 -8.0654002726078033e-02 + + -2.0139501094818115e+00 -2.3084999993443489e-02 + <_> + + 0 -1 378 -8.9399999706074595e-04 + + 3.9572000503540039e-01 -2.9351300001144409e-01 + <_> + + 0 -1 379 9.7162000834941864e-02 + + -2.4980300664901733e-01 1.0859220027923584e+00 + <_> + + 0 -1 380 3.6614000797271729e-02 + + -5.7844001799821854e-02 1.2162159681320190e+00 + <_> + + 0 -1 381 5.1693998277187347e-02 + + 4.3062999844551086e-02 -1.0636160373687744e+00 + <_> + + 0 -1 382 -2.4557000026106834e-02 + + -4.8946800827980042e-01 1.7182900011539459e-01 + <_> + + 0 -1 383 3.2736799120903015e-01 + + -2.9688599705696106e-01 5.1798301935195923e-01 + <_> + + 0 -1 384 7.6959999278187752e-03 + + -5.9805899858474731e-01 2.4803200364112854e-01 + <_> + + 0 -1 385 1.6172200441360474e-01 + + -2.9613999649882317e-02 -2.3162529468536377e+00 + <_> + + 0 -1 386 -4.7889999113976955e-03 + + 3.7457901239395142e-01 -3.2779198884963989e-01 + <_> + + 0 -1 387 -1.8402999266982079e-02 + + -9.9692702293395996e-01 7.2948001325130463e-02 + <_> + + 0 -1 388 7.7665001153945923e-02 + + 1.4175699651241302e-01 -1.7238730192184448e+00 + <_> + + 0 -1 389 1.8921000882983208e-02 + + -2.1273100376129150e-01 1.0165189504623413e+00 + <_> + + 0 -1 390 -7.9397998750209808e-02 + + -1.3164349794387817e+00 1.4981999993324280e-01 + <_> + + 0 -1 391 -6.8037003278732300e-02 + + 4.9421998858451843e-01 -2.9091000556945801e-01 + <_> + + 0 -1 392 -6.1010001227259636e-03 + + 4.2430499196052551e-01 -3.3899301290512085e-01 + <_> + + 0 -1 393 3.1927000731229782e-02 + + -3.1046999618411064e-02 -2.3459999561309814e+00 + <_> + + 0 -1 394 -2.9843999072909355e-02 + + -7.8989601135253906e-01 1.5417699515819550e-01 + <_> + + 0 -1 395 -8.0541998147964478e-02 + + -2.2509229183197021e+00 -3.0906999483704567e-02 + <_> + + 0 -1 396 3.8109999150037766e-03 + + -2.5577300786972046e-01 2.3785500228404999e-01 + <_> + + 0 -1 397 3.3647000789642334e-02 + + -2.2541399300098419e-01 9.2307400703430176e-01 + <_> + + 0 -1 398 8.2809999585151672e-03 + + -2.8896200656890869e-01 3.1046199798583984e-01 + <_> + + 0 -1 399 1.0104399919509888e-01 + + -3.4864000976085663e-02 -2.7102620601654053e+00 + <_> + + 0 -1 400 -1.0009000077843666e-02 + + 5.9715402126312256e-01 -3.3831000328063965e-02 + <_> + + 0 -1 401 7.1919998154044151e-03 + + -4.7738000750541687e-01 2.2686000168323517e-01 + <_> + + 0 -1 402 2.4969000369310379e-02 + + 2.2877700626850128e-01 -1.0435529947280884e+00 + <_> + + 0 -1 403 2.7908000349998474e-01 + + -2.5818100571632385e-01 7.6780498027801514e-01 + <_> + + 0 -1 404 -4.4213000684976578e-02 + + -5.9798002243041992e-01 2.8039899468421936e-01 + <_> + + 0 -1 405 -1.4136999845504761e-02 + + 7.0987302064895630e-01 -2.5645199418067932e-01 + <_> + 91 + -3.6478610038757324e+00 + + <_> + + 0 -1 406 1.3771200180053711e-01 + + -5.5870598554611206e-01 1.0953769683837891e+00 + <_> + + 0 -1 407 3.4460999071598053e-02 + + -7.1171897649765015e-01 5.2899599075317383e-01 + <_> + + 0 -1 408 1.8580000847578049e-02 + + -1.1157519817352295e+00 4.0593999624252319e-01 + <_> + + 0 -1 409 2.5041999295353889e-02 + + -4.0892499685287476e-01 7.4129998683929443e-01 + <_> + + 0 -1 410 5.7179000228643417e-02 + + -3.8054299354553223e-01 7.3647701740264893e-01 + <_> + + 0 -1 411 1.4932000078260899e-02 + + -6.9945502281188965e-01 3.7950998544692993e-01 + <_> + + 0 -1 412 8.8900001719594002e-03 + + -5.4558598995208740e-01 3.6332499980926514e-01 + <_> + + 0 -1 413 3.0435999855399132e-02 + + -1.0124599933624268e-01 7.9585897922515869e-01 + <_> + + 0 -1 414 -4.4160000979900360e-02 + + 8.4410899877548218e-01 -3.2976400852203369e-01 + <_> + + 0 -1 415 1.8461000174283981e-02 + + 2.6326599717140198e-01 -9.6736502647399902e-01 + <_> + + 0 -1 416 1.0614999569952488e-02 + + 1.5251900255680084e-01 -1.0589870214462280e+00 + <_> + + 0 -1 417 -4.5974001288414001e-02 + + -1.9918340444564819e+00 1.3629099726676941e-01 + <_> + + 0 -1 418 8.2900002598762512e-02 + + -3.2037198543548584e-01 6.0304200649261475e-01 + <_> + + 0 -1 419 -8.9130001142621040e-03 + + 5.9586602449417114e-01 -2.1139599382877350e-01 + <_> + + 0 -1 420 4.2814001441001892e-02 + + 2.2925000637769699e-02 -1.4679330587387085e+00 + <_> + + 0 -1 421 -8.7139997631311417e-03 + + -4.3989500403404236e-01 2.0439699292182922e-01 + <_> + + 0 -1 422 -4.3390002101659775e-03 + + -8.9066797494888306e-01 1.0469999909400940e-01 + <_> + + 0 -1 423 8.0749997869133949e-03 + + 2.1164199709892273e-01 -4.0231600403785706e-01 + <_> + + 0 -1 424 9.6739001572132111e-02 + + 1.3319999910891056e-02 -1.6085360050201416e+00 + <_> + + 0 -1 425 -3.0536999925971031e-02 + + 1.0063740015029907e+00 -1.3413299620151520e-01 + <_> + + 0 -1 426 -6.0855999588966370e-02 + + -1.4689979553222656e+00 9.4240000471472740e-03 + <_> + + 0 -1 427 -3.8162000477313995e-02 + + -8.1636399030685425e-01 2.6171201467514038e-01 + <_> + + 0 -1 428 -9.6960002556443214e-03 + + 1.1561699956655502e-01 -7.1693199872970581e-01 + <_> + + 0 -1 429 4.8902999609708786e-02 + + 1.3050499558448792e-01 -1.6448370218276978e+00 + <_> + + 0 -1 430 -4.1611999273300171e-02 + + -1.1795840263366699e+00 2.5017000734806061e-02 + <_> + + 0 -1 431 -2.0188000053167343e-02 + + 6.3188201189041138e-01 -1.0490400344133377e-01 + <_> + + 0 -1 432 -9.7900000400841236e-04 + + 1.8507799506187439e-01 -5.3565901517868042e-01 + <_> + + 0 -1 433 -3.3622000366449356e-02 + + -9.3127602338790894e-01 2.0071500539779663e-01 + <_> + + 0 -1 434 1.9455999135971069e-02 + + 3.8029000163078308e-02 -1.0112210512161255e+00 + <_> + + 0 -1 435 -3.1800000579096377e-04 + + 3.6457699537277222e-01 -2.7610900998115540e-01 + <_> + + 0 -1 436 -3.8899999344721437e-04 + + 1.9665899872779846e-01 -5.3410500288009644e-01 + <_> + + 0 -1 437 -9.3496002256870270e-02 + + -1.6772350072860718e+00 2.0727099478244781e-01 + <_> + + 0 -1 438 -7.7877998352050781e-02 + + -3.0760629177093506e+00 -3.5803999751806259e-02 + <_> + + 0 -1 439 1.6947999596595764e-02 + + 2.1447399258613586e-01 -7.1376299858093262e-01 + <_> + + 0 -1 440 -2.1459000185132027e-02 + + -1.1468060016632080e+00 1.5855999663472176e-02 + <_> + + 0 -1 441 -1.2865999713540077e-02 + + 8.3812397718429565e-01 -6.5944001078605652e-02 + <_> + + 0 -1 442 7.8220004215836525e-03 + + -2.8026801347732544e-01 7.9376900196075439e-01 + <_> + + 0 -1 443 1.0294400155544281e-01 + + 1.7832300066947937e-01 -6.8412202596664429e-01 + <_> + + 0 -1 444 -3.7487998604774475e-02 + + 9.6189999580383301e-01 -2.1735599637031555e-01 + <_> + + 0 -1 445 2.5505999103188515e-02 + + 1.0103999637067318e-02 1.2461110353469849e+00 + <_> + + 0 -1 446 6.6700001480057836e-04 + + -5.3488200902938843e-01 1.4746299386024475e-01 + <_> + + 0 -1 447 -2.8867900371551514e-01 + + 8.2172799110412598e-01 -1.4948000200092793e-02 + <_> + + 0 -1 448 9.1294996440410614e-02 + + -1.9605399668216705e-01 1.0803170204162598e+00 + <_> + + 0 -1 449 1.2056600302457809e-01 + + -2.3848999291658401e-02 1.1392610073089600e+00 + <_> + + 0 -1 450 -7.3775000870227814e-02 + + -1.3583840131759644e+00 -4.2039998807013035e-03 + <_> + + 0 -1 451 -3.3128000795841217e-02 + + -6.4483201503753662e-01 2.4142199754714966e-01 + <_> + + 0 -1 452 -4.3937001377344131e-02 + + 8.4285402297973633e-01 -2.0624800026416779e-01 + <_> + + 0 -1 453 1.8110199272632599e-01 + + 1.9212099909782410e-01 -1.2222139835357666e+00 + <_> + + 0 -1 454 -1.1850999668240547e-02 + + -7.2677397727966309e-01 5.2687998861074448e-02 + <_> + + 0 -1 455 4.5920000411570072e-03 + + -3.6305201053619385e-01 2.9223799705505371e-01 + <_> + + 0 -1 456 7.0620002225041389e-03 + + 5.8116000145673752e-02 -6.7161601781845093e-01 + <_> + + 0 -1 457 -2.3715000599622726e-02 + + 4.7142100334167480e-01 1.8580000847578049e-02 + <_> + + 0 -1 458 -6.7171998322010040e-02 + + -1.1331889629364014e+00 2.3780999705195427e-02 + <_> + + 0 -1 459 -6.5310001373291016e-02 + + 9.8253500461578369e-01 2.8362000361084938e-02 + <_> + + 0 -1 460 2.2791000083088875e-02 + + -2.8213700652122498e-01 5.8993399143218994e-01 + <_> + + 0 -1 461 -1.9037999212741852e-02 + + -6.3711500167846680e-01 2.6514598727226257e-01 + <_> + + 0 -1 462 -6.8689999170601368e-03 + + 3.7487301230430603e-01 -3.3232098817825317e-01 + <_> + + 0 -1 463 -4.0146000683307648e-02 + + -1.3048729896545410e+00 1.5724299848079681e-01 + <_> + + 0 -1 464 -4.0530998259782791e-02 + + -2.0458049774169922e+00 -2.6925999671220779e-02 + <_> + + 0 -1 465 -1.2253999710083008e-02 + + 7.7649402618408203e-01 -4.2971000075340271e-02 + <_> + + 0 -1 466 -2.7219999581575394e-02 + + 1.7424400150775909e-01 -4.4600901007652283e-01 + <_> + + 0 -1 467 -8.8366001844406128e-02 + + -1.5036419630050659e+00 1.4289900660514832e-01 + <_> + + 0 -1 468 -7.9159997403621674e-03 + + 2.8666698932647705e-01 -3.7923699617385864e-01 + <_> + + 0 -1 469 -4.1960000991821289e-02 + + 1.3846950531005859e+00 6.5026998519897461e-02 + <_> + + 0 -1 470 4.5662999153137207e-02 + + -2.2452299296855927e-01 7.9521000385284424e-01 + <_> + + 0 -1 471 -1.4090600609779358e-01 + + -1.5879319906234741e+00 1.1359000205993652e-01 + <_> + + 0 -1 472 -5.9216000139713287e-02 + + -1.1945960521697998e+00 -7.1640000678598881e-03 + <_> + + 0 -1 473 4.3390002101659775e-03 + + -1.5528699755668640e-01 4.0664499998092651e-01 + <_> + + 0 -1 474 -2.0369999110698700e-03 + + 2.5927901268005371e-01 -3.8368299603462219e-01 + <_> + + 0 -1 475 2.7516499161720276e-01 + + -8.8497996330261230e-02 7.6787501573562622e-01 + <_> + + 0 -1 476 -2.6601999998092651e-02 + + 7.5024497509002686e-01 -2.2621999680995941e-01 + <_> + + 0 -1 477 4.0906000882387161e-02 + + 1.2158600240945816e-01 -1.4566910266876221e+00 + <_> + + 0 -1 478 5.5320002138614655e-03 + + -3.6611500382423401e-01 2.5968599319458008e-01 + <_> + + 0 -1 479 3.1879000365734100e-02 + + -7.5019001960754395e-02 4.8484799265861511e-01 + <_> + + 0 -1 480 -4.1482001543045044e-02 + + 7.8220397233963013e-01 -2.1992200613021851e-01 + <_> + + 0 -1 481 -9.6130996942520142e-02 + + -8.9456301927566528e-01 1.4680700004100800e-01 + <_> + + 0 -1 482 -1.1568999849259853e-02 + + 8.2714098691940308e-01 -2.0275600254535675e-01 + <_> + + 0 -1 483 1.8312999978661537e-02 + + 1.6367999836802483e-02 2.7306801080703735e-01 + <_> + + 0 -1 484 -3.4166000783443451e-02 + + 1.1307320594787598e+00 -1.8810899555683136e-01 + <_> + + 0 -1 485 -2.4476999416947365e-02 + + -5.7791298627853394e-01 1.5812499821186066e-01 + <_> + + 0 -1 486 4.8957001417875290e-02 + + -2.2564999759197235e-02 -1.6373280286788940e+00 + <_> + + 0 -1 487 -2.0702999085187912e-02 + + -5.4512101411819458e-01 2.4086999893188477e-01 + <_> + + 0 -1 488 -2.3002000525593758e-02 + + -1.2236540317535400e+00 -7.3440000414848328e-03 + <_> + + 0 -1 489 6.4585000276565552e-02 + + 1.4695599675178528e-01 -4.4967499375343323e-01 + <_> + + 0 -1 490 1.2666000053286552e-02 + + -2.7873900532722473e-01 4.3876600265502930e-01 + <_> + + 0 -1 491 -1.2002999894320965e-02 + + -2.4289099872112274e-01 2.5350099802017212e-01 + <_> + + 0 -1 492 -2.6443999260663986e-02 + + -8.5864800214767456e-01 2.6025999337434769e-02 + <_> + + 0 -1 493 -2.5547999888658524e-02 + + 6.9287902116775513e-01 -2.1160000469535589e-03 + <_> + + 0 -1 494 3.9115000516176224e-02 + + -1.6589100658893585e-01 1.5209139585494995e+00 + <_> + + 0 -1 495 -6.0330000706017017e-03 + + 4.3856900930404663e-01 -2.1613700687885284e-01 + <_> + + 0 -1 496 -3.3936999738216400e-02 + + -9.7998398542404175e-01 2.2133000195026398e-02 + <_> + 99 + -3.8700489997863770e+00 + + <_> + + 0 -1 497 4.0672998875379562e-02 + + -9.0474700927734375e-01 6.4410597085952759e-01 + <_> + + 0 -1 498 2.5609999895095825e-02 + + -7.9216998815536499e-01 5.7489997148513794e-01 + <_> + + 0 -1 499 1.9959500432014465e-01 + + -3.0099600553512573e-01 1.3143850564956665e+00 + <_> + + 0 -1 500 1.2404999695718288e-02 + + -8.9882999658584595e-01 2.9205799102783203e-01 + <_> + + 0 -1 501 3.9207998663187027e-02 + + -4.1955199837684631e-01 5.3463298082351685e-01 + <_> + + 0 -1 502 -3.0843999236822128e-02 + + 4.5793399214744568e-01 -4.4629099965095520e-01 + <_> + + 0 -1 503 -3.5523001104593277e-02 + + 9.1310501098632812e-01 -2.7373200654983521e-01 + <_> + + 0 -1 504 -6.1650000512599945e-02 + + -1.4697799682617188e+00 2.0364099740982056e-01 + <_> + + 0 -1 505 -1.1739999987185001e-02 + + -1.0482879877090454e+00 6.7801997065544128e-02 + <_> + + 0 -1 506 6.6933996975421906e-02 + + 2.9274499416351318e-01 -5.2282899618148804e-01 + <_> + + 0 -1 507 -2.0631000399589539e-02 + + -1.2855139970779419e+00 4.4550999999046326e-02 + <_> + + 0 -1 508 -2.2357000038027763e-02 + + -8.5753798484802246e-01 1.8434000015258789e-01 + <_> + + 0 -1 509 1.1500000255182385e-03 + + 1.6405500471591949e-01 -6.9125002622604370e-01 + <_> + + 0 -1 510 3.5872999578714371e-02 + + 1.5756499767303467e-01 -8.4262597560882568e-01 + <_> + + 0 -1 511 3.0659999698400497e-02 + + 2.1637000143527985e-02 -1.3634690046310425e+00 + <_> + + 0 -1 512 5.5559999309480190e-03 + + -1.6737000644207001e-01 2.5888401269912720e-01 + <_> + + 0 -1 513 -6.1160000041127205e-03 + + -9.7271800041198730e-01 6.6100001335144043e-02 + <_> + + 0 -1 514 -3.0316999182105064e-02 + + 9.8474198579788208e-01 -1.6448000445961952e-02 + <_> + + 0 -1 515 -9.7200004383921623e-03 + + 4.7604700922966003e-01 -3.2516700029373169e-01 + <_> + + 0 -1 516 -5.7126998901367188e-02 + + -9.5920699834823608e-01 1.9938200712203979e-01 + <_> + + 0 -1 517 4.0059997700154781e-03 + + -5.2612501382827759e-01 2.2428700327873230e-01 + <_> + + 0 -1 518 3.3734001219272614e-02 + + 1.7070099711418152e-01 -1.0737580060958862e+00 + <_> + + 0 -1 519 -3.4641999751329422e-02 + + -1.1343129873275757e+00 3.6540001630783081e-02 + <_> + + 0 -1 520 4.6923000365495682e-02 + + 2.5832301378250122e-01 -7.1535801887512207e-01 + <_> + + 0 -1 521 -8.7660001590847969e-03 + + 1.9640900194644928e-01 -5.3355097770690918e-01 + <_> + + 0 -1 522 6.5627999603748322e-02 + + -5.1194999366998672e-02 9.7610700130462646e-01 + <_> + + 0 -1 523 -4.4165000319480896e-02 + + 1.0631920099258423e+00 -2.3462599515914917e-01 + <_> + + 0 -1 524 1.7304999753832817e-02 + + -1.8582899868488312e-01 4.5889899134635925e-01 + <_> + + 0 -1 525 3.3135998994112015e-02 + + -2.9381999745965004e-02 -2.6651329994201660e+00 + <_> + + 0 -1 526 -2.1029999479651451e-02 + + 9.9979901313781738e-01 2.4937000125646591e-02 + <_> + + 0 -1 527 2.9783999547362328e-02 + + -2.9605999588966370e-02 -2.1695868968963623e+00 + <_> + + 0 -1 528 5.5291999131441116e-02 + + -7.5599999399855733e-04 7.4651998281478882e-01 + <_> + + 0 -1 529 -3.3597998321056366e-02 + + -1.5274159908294678e+00 1.1060000397264957e-02 + <_> + + 0 -1 530 1.9602999091148376e-02 + + 3.3574998378753662e-02 9.9526202678680420e-01 + <_> + + 0 -1 531 -2.0787000656127930e-02 + + 7.6612901687622070e-01 -2.4670800566673279e-01 + <_> + + 0 -1 532 3.2536000013351440e-02 + + 1.6263400018215179e-01 -6.1134302616119385e-01 + <_> + + 0 -1 533 -1.0788000188767910e-02 + + -9.7839701175689697e-01 2.8969999402761459e-02 + <_> + + 0 -1 534 -9.9560003727674484e-03 + + 4.6145799756050110e-01 -1.3510499894618988e-01 + <_> + + 0 -1 535 -3.7489999085664749e-03 + + 2.5458198785781860e-01 -5.1955598592758179e-01 + <_> + + 0 -1 536 -4.1779998689889908e-02 + + -8.0565100908279419e-01 1.5208500623703003e-01 + <_> + + 0 -1 537 -3.4221000969409943e-02 + + -1.3137799501419067e+00 -3.5800000187009573e-03 + <_> + + 0 -1 538 1.0130000300705433e-02 + + 2.0175799727439880e-01 -6.1339598894119263e-01 + <_> + + 0 -1 539 -8.9849002659320831e-02 + + 9.7632801532745361e-01 -2.0884799957275391e-01 + <_> + + 0 -1 540 2.6097999885678291e-02 + + -1.8807999789714813e-01 4.7705799341201782e-01 + <_> + + 0 -1 541 -3.7539999466389418e-03 + + -6.7980402708053589e-01 1.1288800090551376e-01 + <_> + + 0 -1 542 3.1973000615835190e-02 + + 1.8951700627803802e-01 -1.4967479705810547e+00 + <_> + + 0 -1 543 1.9332999363541603e-02 + + -2.3609900474548340e-01 8.1320500373840332e-01 + <_> + + 0 -1 544 1.9490000559017062e-03 + + 2.4830399453639984e-01 -6.9211997091770172e-02 + <_> + + 0 -1 545 -4.4146999716758728e-02 + + -1.0418920516967773e+00 4.8053000122308731e-02 + <_> + + 0 -1 546 -4.4681999832391739e-02 + + 5.1346302032470703e-01 -7.3799998499453068e-03 + <_> + + 0 -1 547 -1.0757499933242798e-01 + + 1.6202019453048706e+00 -1.8667599558830261e-01 + <_> + + 0 -1 548 -1.2846800684928894e-01 + + 2.9869480133056641e+00 9.5427997410297394e-02 + <_> + + 0 -1 549 -4.4757999479770660e-02 + + 6.0405302047729492e-01 -2.7058699727058411e-01 + <_> + + 0 -1 550 -4.3990999460220337e-02 + + -6.1790502071380615e-01 1.5997199714183807e-01 + <_> + + 0 -1 551 -1.2268999963998795e-01 + + 6.6327202320098877e-01 -2.3636999726295471e-01 + <_> + + 0 -1 552 -1.9982999190688133e-02 + + -1.1228660345077515e+00 1.9616700708866119e-01 + <_> + + 0 -1 553 -1.5527999959886074e-02 + + -1.0770269632339478e+00 2.0693000406026840e-02 + <_> + + 0 -1 554 -4.8971001058816910e-02 + + 8.1168299913406372e-01 -1.7252000048756599e-02 + <_> + + 0 -1 555 5.5975999683141708e-02 + + -2.2529000416398048e-02 -1.7356760501861572e+00 + <_> + + 0 -1 556 -9.8580000922083855e-03 + + 6.7881399393081665e-01 -5.8180000633001328e-02 + <_> + + 0 -1 557 1.3481000438332558e-02 + + 5.7847999036312103e-02 -7.7255302667617798e-01 + <_> + + 0 -1 558 6.5609999001026154e-03 + + -1.3146899640560150e-01 6.7055797576904297e-01 + <_> + + 0 -1 559 7.1149999275803566e-03 + + -3.7880599498748779e-01 3.0978998541831970e-01 + <_> + + 0 -1 560 4.8159998841583729e-03 + + -5.8470398187637329e-01 2.5602099299430847e-01 + <_> + + 0 -1 561 9.5319999381899834e-03 + + -3.0217000842094421e-01 4.1253298521041870e-01 + <_> + + 0 -1 562 -2.7474999427795410e-02 + + 5.9154701232910156e-01 1.7963999882340431e-02 + <_> + + 0 -1 563 -3.9519999176263809e-02 + + 9.6913498640060425e-01 -2.1020300686359406e-01 + <_> + + 0 -1 564 -3.0658999457955360e-02 + + 9.1155898571014404e-01 4.0550000965595245e-02 + <_> + + 0 -1 565 -1.4680000022053719e-03 + + -6.0489797592163086e-01 1.6960899531841278e-01 + <_> + + 0 -1 566 1.9077600538730621e-01 + + 4.3515000492334366e-02 8.1892901659011841e-01 + <_> + + 0 -1 567 5.1790000870823860e-03 + + -9.3617302179336548e-01 2.4937000125646591e-02 + <_> + + 0 -1 568 2.4126000702381134e-02 + + 1.8175500631332397e-01 -3.4185901284217834e-01 + <_> + + 0 -1 569 -2.6383999735116959e-02 + + -1.2912579774856567e+00 -3.4280000254511833e-03 + <_> + + 0 -1 570 5.4139997810125351e-03 + + -4.6291999518871307e-02 2.5269600749015808e-01 + <_> + + 0 -1 571 5.4216001182794571e-02 + + -1.2848000042140484e-02 -1.4304540157318115e+00 + <_> + + 0 -1 572 2.3799999326001853e-04 + + -2.6676699519157410e-01 3.3588299155235291e-01 + <_> + + 0 -1 573 1.5216999687254429e-02 + + -5.1367300748825073e-01 1.3005100190639496e-01 + <_> + + 0 -1 574 1.7007999122142792e-02 + + 4.1575899720191956e-01 -3.1241199374198914e-01 + <_> + + 0 -1 575 3.0496999621391296e-02 + + -2.4820999801158905e-01 7.0828497409820557e-01 + <_> + + 0 -1 576 6.5430002287030220e-03 + + -2.2637000679969788e-01 1.9184599816799164e-01 + <_> + + 0 -1 577 1.4163999259471893e-01 + + 6.5227001905441284e-02 -8.8809502124786377e-01 + <_> + + 0 -1 578 1.9338000565767288e-02 + + 1.8891200423240662e-01 -2.7397701144218445e-01 + <_> + + 0 -1 579 -1.7324000597000122e-02 + + -9.4866698980331421e-01 2.4196999147534370e-02 + <_> + + 0 -1 580 -6.2069999985396862e-03 + + 3.6938399076461792e-01 -1.7494900524616241e-01 + <_> + + 0 -1 581 -1.6109000891447067e-02 + + 9.6159499883651733e-01 -2.0005300641059875e-01 + <_> + + 0 -1 582 -1.0122500360012054e-01 + + -3.0699110031127930e+00 1.1363799870014191e-01 + <_> + + 0 -1 583 -7.5509999878704548e-03 + + 2.2921000421047211e-01 -4.5645099878311157e-01 + <_> + + 0 -1 584 4.4247999787330627e-02 + + -3.1599999056197703e-04 3.9225301146507263e-01 + <_> + + 0 -1 585 -1.1636000126600266e-01 + + 9.5233702659606934e-01 -2.0201599597930908e-01 + <_> + + 0 -1 586 4.7360002063214779e-03 + + -9.9177002906799316e-02 2.0370499789714813e-01 + <_> + + 0 -1 587 2.2459000349044800e-02 + + 8.7280003353953362e-03 -1.0217070579528809e+00 + <_> + + 0 -1 588 -1.2109000235795975e-02 + + 6.4812600612640381e-01 -9.0149000287055969e-02 + <_> + + 0 -1 589 5.6120000779628754e-02 + + -3.6759998649358749e-02 -1.9275590181350708e+00 + <_> + + 0 -1 590 -8.7379999458789825e-03 + + 6.9261300563812256e-01 -6.8374998867511749e-02 + <_> + + 0 -1 591 6.6399998031556606e-03 + + -4.0569800138473511e-01 1.8625700473785400e-01 + <_> + + 0 -1 592 -1.8131999298930168e-02 + + -6.4518201351165771e-01 2.1976399421691895e-01 + <_> + + 0 -1 593 -2.2718999534845352e-02 + + 9.7776198387145996e-01 -1.8654300272464752e-01 + <_> + + 0 -1 594 1.2705000117421150e-02 + + -1.0546600073575974e-01 3.7404099106788635e-01 + <_> + + 0 -1 595 -1.3682999648153782e-02 + + 6.1064100265502930e-01 -2.6881098747253418e-01 + <_> + 115 + -3.7160909175872803e+00 + + <_> + + 0 -1 596 3.1357999891042709e-02 + + -1.0183910131454468e+00 5.7528597116470337e-01 + <_> + + 0 -1 597 9.3050003051757812e-02 + + -4.1297501325607300e-01 1.0091199874877930e+00 + <_> + + 0 -1 598 2.5949999690055847e-02 + + -5.8587902784347534e-01 5.6606197357177734e-01 + <_> + + 0 -1 599 1.6472000628709793e-02 + + -9.2857497930526733e-01 3.0924499034881592e-01 + <_> + + 0 -1 600 -1.8779999809339643e-03 + + 1.1951000243425369e-01 -1.1180130243301392e+00 + <_> + + 0 -1 601 -9.0129999443888664e-03 + + -5.7849502563476562e-01 3.3154401183128357e-01 + <_> + + 0 -1 602 2.2547999396920204e-02 + + -3.8325101137161255e-01 5.2462202310562134e-01 + <_> + + 0 -1 603 -3.7780001759529114e-02 + + 1.1790670156478882e+00 -3.4166999161243439e-02 + <_> + + 0 -1 604 -5.3799999877810478e-03 + + -8.6265897750854492e-01 1.1867900192737579e-01 + <_> + + 0 -1 605 -2.3893000558018684e-02 + + -7.4950599670410156e-01 2.1011400222778320e-01 + <_> + + 0 -1 606 -2.6521999388933182e-02 + + 9.2128598690032959e-01 -2.8252801299095154e-01 + <_> + + 0 -1 607 1.2280000373721123e-02 + + 2.6662799715995789e-01 -7.0013600587844849e-01 + <_> + + 0 -1 608 9.6594996750354767e-02 + + -2.8453999757766724e-01 7.3168998956680298e-01 + <_> + + 0 -1 609 -2.7414999902248383e-02 + + -6.1492699384689331e-01 1.5576200187206268e-01 + <_> + + 0 -1 610 -1.5767000615596771e-02 + + 5.7551199197769165e-01 -3.4362199902534485e-01 + <_> + + 0 -1 611 -2.1100000012665987e-03 + + 3.2599699497222900e-01 -1.3008299469947815e-01 + <_> + + 0 -1 612 1.2006999924778938e-02 + + 8.9322999119758606e-02 -9.6025598049163818e-01 + <_> + + 0 -1 613 -1.5421999618411064e-02 + + 3.4449499845504761e-01 -4.6711999177932739e-01 + <_> + + 0 -1 614 -4.1579999960958958e-03 + + 2.3696300387382507e-01 -5.2563297748565674e-01 + <_> + + 0 -1 615 -2.1185999736189842e-02 + + -7.4267697334289551e-01 2.1702000498771667e-01 + <_> + + 0 -1 616 -1.7077000811696053e-02 + + -9.0471798181533813e-01 6.6012002527713776e-02 + <_> + + 0 -1 617 -4.0849998593330383e-02 + + -3.4446600079536438e-01 2.1503700315952301e-01 + <_> + + 0 -1 618 -8.1930002197623253e-03 + + -9.3388599157333374e-01 5.0471000373363495e-02 + <_> + + 0 -1 619 -1.9238000735640526e-02 + + -5.3203701972961426e-01 1.7240600287914276e-01 + <_> + + 0 -1 620 -4.4192001223564148e-02 + + 9.2075002193450928e-01 -2.2148500382900238e-01 + <_> + + 0 -1 621 -6.2392000108957291e-02 + + -7.1053802967071533e-01 1.8323899805545807e-01 + <_> + + 0 -1 622 -1.0079999919980764e-03 + + -8.7063097953796387e-01 5.5330000817775726e-02 + <_> + + 0 -1 623 2.3870000615715981e-02 + + -2.2854200005531311e-01 5.2415597438812256e-01 + <_> + + 0 -1 624 2.1391000598669052e-02 + + -3.0325898528099060e-01 5.5860602855682373e-01 + <_> + + 0 -1 625 2.0254999399185181e-02 + + 2.6901501417160034e-01 -7.0261800289154053e-01 + <_> + + 0 -1 626 -2.8772000223398209e-02 + + -1.1835030317306519e+00 4.6512000262737274e-02 + <_> + + 0 -1 627 3.4199999645352364e-03 + + -5.4652100801467896e-01 2.5962498784065247e-01 + <_> + + 0 -1 628 5.6983001530170441e-02 + + -2.6982900500297546e-01 5.8170700073242188e-01 + <_> + + 0 -1 629 -9.3892000615596771e-02 + + -9.1046398878097534e-01 1.9677700102329254e-01 + <_> + + 0 -1 630 1.7699999734759331e-02 + + -4.4003298878669739e-01 2.1349500119686127e-01 + <_> + + 0 -1 631 2.2844199836254120e-01 + + 2.3605000227689743e-02 7.7171599864959717e-01 + <_> + + 0 -1 632 -1.8287500739097595e-01 + + 7.9228597879409790e-01 -2.4644799530506134e-01 + <_> + + 0 -1 633 -6.9891996681690216e-02 + + 8.0267798900604248e-01 -3.6072000861167908e-02 + <_> + + 0 -1 634 1.5297000296413898e-02 + + -2.0072300732135773e-01 1.1030600070953369e+00 + <_> + + 0 -1 635 6.7500001750886440e-03 + + -4.5967999845743179e-02 7.2094500064849854e-01 + <_> + + 0 -1 636 -1.5983000397682190e-02 + + -9.0357202291488647e-01 4.4987998902797699e-02 + <_> + + 0 -1 637 1.3088000006973743e-02 + + 3.5297098755836487e-01 -3.7710601091384888e-01 + <_> + + 0 -1 638 1.3061000034213066e-02 + + -1.9583599269390106e-01 1.1198940277099609e+00 + <_> + + 0 -1 639 -3.9907000958919525e-02 + + -1.3998429775238037e+00 1.9145099818706512e-01 + <_> + + 0 -1 640 1.5026999637484550e-02 + + 2.3600000422447920e-03 -1.1611249446868896e+00 + <_> + + 0 -1 641 -2.0517999306321144e-02 + + -4.8908099532127380e-01 1.6743400692939758e-01 + <_> + + 0 -1 642 -2.2359000518918037e-02 + + -1.2202980518341064e+00 -1.1975999921560287e-02 + <_> + + 0 -1 643 -7.9150004312396049e-03 + + 3.7228098511695862e-01 -8.5063003003597260e-02 + <_> + + 0 -1 644 1.5258000232279301e-02 + + -2.9412600398063660e-01 5.9406399726867676e-01 + <_> + + 0 -1 645 -3.1665999442338943e-02 + + -1.4395569562911987e+00 1.3578799366950989e-01 + <_> + + 0 -1 646 -3.0773999169468880e-02 + + -2.2545371055603027e+00 -3.3971000462770462e-02 + <_> + + 0 -1 647 -1.5483000315725803e-02 + + 3.7700700759887695e-01 1.5847999602556229e-02 + <_> + + 0 -1 648 3.5167001187801361e-02 + + -2.9446101188659668e-01 5.3159099817276001e-01 + <_> + + 0 -1 649 -1.7906000837683678e-02 + + -9.9788200855255127e-01 1.6235999763011932e-01 + <_> + + 0 -1 650 -3.1799999997019768e-03 + + 4.7657001763582230e-02 -7.5249898433685303e-01 + <_> + + 0 -1 651 1.5720000490546227e-02 + + 1.4873799681663513e-01 -6.5375399589538574e-01 + <_> + + 0 -1 652 2.9864000156521797e-02 + + -1.4952000230550766e-02 -1.2275190353393555e+00 + <_> + + 0 -1 653 2.9899999499320984e-03 + + -1.4263699948787689e-01 4.3272799253463745e-01 + <_> + + 0 -1 654 8.4749996662139893e-02 + + -1.9280999898910522e-02 -1.1946409940719604e+00 + <_> + + 0 -1 655 -5.8724999427795410e-02 + + -1.7328219413757324e+00 1.4374700188636780e-01 + <_> + + 0 -1 656 4.4755998998880386e-02 + + -2.4140599370002747e-01 5.4019999504089355e-01 + <_> + + 0 -1 657 4.0369000285863876e-02 + + 5.7680001482367516e-03 5.6578099727630615e-01 + <_> + + 0 -1 658 3.7735998630523682e-02 + + 3.8180999457836151e-02 -7.9370397329330444e-01 + <_> + + 0 -1 659 6.0752999037504196e-02 + + 7.6453000307083130e-02 1.4813209772109985e+00 + <_> + + 0 -1 660 -1.9832000136375427e-02 + + -1.6971720457077026e+00 -2.7370000258088112e-02 + <_> + + 0 -1 661 -1.6592699289321899e-01 + + 6.2976002693176270e-01 3.1762998551130295e-02 + <_> + + 0 -1 662 6.9014996290206909e-02 + + -3.3463200926780701e-01 3.0076700448989868e-01 + <_> + + 0 -1 663 1.1358000338077545e-02 + + 2.2741499543190002e-01 -3.8224700093269348e-01 + <_> + + 0 -1 664 1.7000000225380063e-03 + + 1.9223800301551819e-01 -5.2735102176666260e-01 + <_> + + 0 -1 665 7.9769000411033630e-02 + + 9.1491997241973877e-02 2.1049048900604248e+00 + <_> + + 0 -1 666 -5.7144001126289368e-02 + + -1.7452130317687988e+00 -4.0910001844167709e-02 + <_> + + 0 -1 667 7.3830001056194305e-03 + + -2.4214799702167511e-01 3.5577800869941711e-01 + <_> + + 0 -1 668 -1.8040999770164490e-02 + + 1.1779999732971191e+00 -1.7676700651645660e-01 + <_> + + 0 -1 669 9.4503000378608704e-02 + + 1.3936099410057068e-01 -1.2993700504302979e+00 + <_> + + 0 -1 670 5.4210000671446323e-03 + + -5.4608601331710815e-01 1.3916400074958801e-01 + <_> + + 0 -1 671 7.0290002040565014e-03 + + -2.1597200632095337e-01 3.9258098602294922e-01 + <_> + + 0 -1 672 3.4515999257564545e-02 + + 6.3188999891281128e-02 -7.2108101844787598e-01 + <_> + + 0 -1 673 -5.1924999803304672e-02 + + 6.8667602539062500e-01 6.3272997736930847e-02 + <_> + + 0 -1 674 -6.9162003695964813e-02 + + 1.7411810159683228e+00 -1.6619299352169037e-01 + <_> + + 0 -1 675 -5.5229999125003815e-03 + + 3.0694699287414551e-01 -1.6662900149822235e-01 + <_> + + 0 -1 676 6.8599998950958252e-02 + + -2.1405400335788727e-01 7.3185002803802490e-01 + <_> + + 0 -1 677 -6.7038998007774353e-02 + + -7.9360598325729370e-01 2.0525799691677094e-01 + <_> + + 0 -1 678 -2.1005000919103622e-02 + + 3.7344399094581604e-01 -2.9618600010871887e-01 + <_> + + 0 -1 679 2.0278999581933022e-02 + + -1.5200000256299973e-02 4.0555301308631897e-01 + <_> + + 0 -1 680 -4.7107998281717300e-02 + + 1.2116849422454834e+00 -1.7464299499988556e-01 + <_> + + 0 -1 681 1.8768499791622162e-01 + + -2.2909000515937805e-02 6.9645798206329346e-01 + <_> + + 0 -1 682 -4.3228998780250549e-02 + + -1.0602480173110962e+00 -5.5599998449906707e-04 + <_> + + 0 -1 683 2.0004000514745712e-02 + + -3.2751001417636871e-02 5.3805100917816162e-01 + <_> + + 0 -1 684 8.0880001187324524e-03 + + 3.7548001855611801e-02 -7.4768900871276855e-01 + <_> + + 0 -1 685 2.7101000770926476e-02 + + -8.1790000200271606e-02 3.3387100696563721e-01 + <_> + + 0 -1 686 -9.1746002435684204e-02 + + -1.9213509559631348e+00 -3.8952998816967010e-02 + <_> + + 0 -1 687 -1.2454999610781670e-02 + + 4.8360601067543030e-01 1.8168000504374504e-02 + <_> + + 0 -1 688 1.4649000018835068e-02 + + -1.9906699657440186e-01 7.2815400362014771e-01 + <_> + + 0 -1 689 2.9101999476552010e-02 + + 1.9871099293231964e-01 -4.9216800928115845e-01 + <_> + + 0 -1 690 8.7799998000264168e-03 + + -1.9499599933624268e-01 7.7317398786544800e-01 + <_> + + 0 -1 691 -5.4740000516176224e-02 + + 1.8087190389633179e+00 6.8323001265525818e-02 + <_> + + 0 -1 692 -1.4798000454902649e-02 + + 7.8064900636672974e-01 -1.8709599971771240e-01 + <_> + + 0 -1 693 2.5012999773025513e-02 + + 1.5285299718379974e-01 -1.6021020412445068e+00 + <_> + + 0 -1 694 4.6548001468181610e-02 + + -1.6738200187683105e-01 1.1902060508728027e+00 + <_> + + 0 -1 695 1.7624000087380409e-02 + + -1.0285499691963196e-01 3.9175900816917419e-01 + <_> + + 0 -1 696 1.6319599747657776e-01 + + -3.5624001175165176e-02 -1.6098170280456543e+00 + <_> + + 0 -1 697 1.3137999922037125e-02 + + -5.6359000504016876e-02 5.4158902168273926e-01 + <_> + + 0 -1 698 -1.5665000304579735e-02 + + 2.8063100576400757e-01 -3.1708601117134094e-01 + <_> + + 0 -1 699 8.0554001033306122e-02 + + 1.2640400230884552e-01 -1.0297529697418213e+00 + <_> + + 0 -1 700 3.5363998264074326e-02 + + 2.0752999931573868e-02 -7.9105597734451294e-01 + <_> + + 0 -1 701 3.2986998558044434e-02 + + 1.9057099521160126e-01 -8.3839899301528931e-01 + <_> + + 0 -1 702 1.2195000424981117e-02 + + 7.3729000985622406e-02 -6.2780702114105225e-01 + <_> + + 0 -1 703 4.3065998703241348e-02 + + 4.7384999692440033e-02 1.5712939500808716e+00 + <_> + + 0 -1 704 3.0326999723911285e-02 + + -2.7314600348472595e-01 3.8572001457214355e-01 + <_> + + 0 -1 705 3.5493001341819763e-02 + + 5.4593998938798904e-02 5.2583402395248413e-01 + <_> + + 0 -1 706 -1.4596999622881413e-02 + + 3.8152599334716797e-01 -2.8332400321960449e-01 + <_> + + 0 -1 707 1.2606999836862087e-02 + + 1.5455099940299988e-01 -3.0501499772071838e-01 + <_> + + 0 -1 708 1.0172000154852867e-02 + + 2.3637000471353531e-02 -8.7217897176742554e-01 + <_> + + 0 -1 709 2.8843000531196594e-02 + + 1.6090999543666840e-01 -2.0277599990367889e-01 + <_> + + 0 -1 710 5.5100000463426113e-04 + + -6.1545401811599731e-01 8.0935999751091003e-02 + <_> + 127 + -3.5645289421081543e+00 + + <_> + + 0 -1 711 4.8344001173973083e-02 + + -8.4904599189758301e-01 5.6974399089813232e-01 + <_> + + 0 -1 712 3.2460000365972519e-02 + + -8.1417298316955566e-01 4.4781699776649475e-01 + <_> + + 0 -1 713 3.3339999616146088e-02 + + -3.6423799395561218e-01 6.7937397956848145e-01 + <_> + + 0 -1 714 6.4019998535513878e-03 + + -1.1885459423065186e+00 1.9238699972629547e-01 + <_> + + 0 -1 715 -5.6889997795224190e-03 + + 3.3085298538208008e-01 -7.1334099769592285e-01 + <_> + + 0 -1 716 1.2698000296950340e-02 + + -5.0990802049636841e-01 1.1376299709081650e-01 + <_> + + 0 -1 717 6.0549997724592686e-03 + + -1.0470550060272217e+00 2.0222599804401398e-01 + <_> + + 0 -1 718 2.6420000940561295e-03 + + -5.0559401512145996e-01 3.6441200971603394e-01 + <_> + + 0 -1 719 -1.6925999894738197e-02 + + -9.9541902542114258e-01 1.2602199614048004e-01 + <_> + + 0 -1 720 2.8235999867320061e-02 + + -9.4137996435165405e-02 5.7780402898788452e-01 + <_> + + 0 -1 721 1.0428999550640583e-02 + + 2.3272900283336639e-01 -5.2569699287414551e-01 + <_> + + 0 -1 722 9.8860003054141998e-03 + + -1.0316299647092819e-01 4.7657600045204163e-01 + <_> + + 0 -1 723 2.6015000417828560e-02 + + -1.0920000495389104e-03 -1.5581729412078857e+00 + <_> + + 0 -1 724 -2.5537999346852303e-02 + + -6.5451401472091675e-01 1.8843199312686920e-01 + <_> + + 0 -1 725 -3.5310001112520695e-03 + + 2.8140598535537720e-01 -4.4575300812721252e-01 + <_> + + 0 -1 726 9.2449998483061790e-03 + + 1.5612000226974487e-01 -2.1370999515056610e-01 + <_> + + 0 -1 727 2.1030999720096588e-02 + + -2.9170298576354980e-01 5.2234101295471191e-01 + <_> + + 0 -1 728 -5.1063001155853271e-02 + + 1.3661290407180786e+00 3.0465999618172646e-02 + <_> + + 0 -1 729 -6.2330000102519989e-02 + + 1.2207020521163940e+00 -2.2434400022029877e-01 + <_> + + 0 -1 730 -3.2963000237941742e-02 + + -8.2016801834106445e-01 1.4531899988651276e-01 + <_> + + 0 -1 731 -3.7418000400066376e-02 + + -1.2218099832534790e+00 1.9448999315500259e-02 + <_> + + 0 -1 732 1.2402799725532532e-01 + + 1.2082300335168839e-01 -9.8729300498962402e-01 + <_> + + 0 -1 733 -8.9229997247457504e-03 + + -1.1688489913940430e+00 2.1105000749230385e-02 + <_> + + 0 -1 734 -5.9879999607801437e-02 + + -1.0689330101013184e+00 1.9860200583934784e-01 + <_> + + 0 -1 735 6.2620001845061779e-03 + + -3.6229598522186279e-01 3.8000801205635071e-01 + <_> + + 0 -1 736 -1.7673000693321228e-02 + + 4.9094098806381226e-01 -1.4606699347496033e-01 + <_> + + 0 -1 737 1.7579000443220139e-02 + + 5.8728098869323730e-01 -2.7774399518966675e-01 + <_> + + 0 -1 738 5.1560001447796822e-03 + + -7.5194999575614929e-02 6.0193097591400146e-01 + <_> + + 0 -1 739 -1.0599999688565731e-02 + + 2.7637401223182678e-01 -3.7794300913810730e-01 + <_> + + 0 -1 740 2.0884099602699280e-01 + + -5.3599998354911804e-03 1.0317809581756592e+00 + <_> + + 0 -1 741 -2.6412999257445335e-02 + + 8.2336401939392090e-01 -2.2480599582195282e-01 + <_> + + 0 -1 742 5.8892000466585159e-02 + + 1.3098299503326416e-01 -1.1853699684143066e+00 + <_> + + 0 -1 743 -1.1579000391066074e-02 + + -9.0667802095413208e-01 4.4126998633146286e-02 + <_> + + 0 -1 744 4.5988000929355621e-02 + + 1.0143999941647053e-02 1.0740900039672852e+00 + <_> + + 0 -1 745 -2.2838000208139420e-02 + + 1.7791990041732788e+00 -1.7315499484539032e-01 + <_> + + 0 -1 746 -8.1709995865821838e-03 + + 5.7386302947998047e-01 -7.4106000363826752e-02 + <_> + + 0 -1 747 3.5359999164938927e-03 + + -3.2072898745536804e-01 4.0182501077651978e-01 + <_> + + 0 -1 748 4.9444999545812607e-02 + + 1.9288000464439392e-01 -1.2166700363159180e+00 + <_> + + 0 -1 749 3.5139999818056822e-03 + + 6.9568000733852386e-02 -7.1323698759078979e-01 + <_> + + 0 -1 750 -3.0996000394225121e-02 + + -3.8862198591232300e-01 1.8098799884319305e-01 + <_> + + 0 -1 751 8.6452998220920563e-02 + + -2.5792999193072319e-02 -1.5453219413757324e+00 + <_> + + 0 -1 752 -1.3652600347995758e-01 + + -1.9199420213699341e+00 1.6613300144672394e-01 + <_> + + 0 -1 753 -5.7689999230206013e-03 + + -1.2822589874267578e+00 -1.5907999128103256e-02 + <_> + + 0 -1 754 -1.7899999395012856e-02 + + -4.0409898757934570e-01 2.3591600358486176e-01 + <_> + + 0 -1 755 -1.9969999790191650e-02 + + -7.2891902923583984e-01 5.6235000491142273e-02 + <_> + + 0 -1 756 -5.7493001222610474e-02 + + 5.7830798625946045e-01 -1.5796000137925148e-02 + <_> + + 0 -1 757 -8.3056002855300903e-02 + + 9.1511601209640503e-01 -2.1121400594711304e-01 + <_> + + 0 -1 758 -5.3771000355482101e-02 + + -5.1931297779083252e-01 1.8576000630855560e-01 + <_> + + 0 -1 759 -8.3670001477003098e-03 + + 2.4109700322151184e-01 -3.9648601412773132e-01 + <_> + + 0 -1 760 5.5406998842954636e-02 + + 1.6771200299263000e-01 -2.5664970874786377e+00 + <_> + + 0 -1 761 -6.7180998623371124e-02 + + -1.3658570051193237e+00 -1.4232000336050987e-02 + <_> + + 0 -1 762 -2.3900000378489494e-02 + + -1.7084569931030273e+00 1.6507799923419952e-01 + <_> + + 0 -1 763 5.5949999950826168e-03 + + -3.1373998522758484e-01 3.2837900519371033e-01 + <_> + + 0 -1 764 2.1294999867677689e-02 + + 1.4953400194644928e-01 -4.8579800128936768e-01 + <_> + + 0 -1 765 -2.4613000452518463e-02 + + 7.4346399307250977e-01 -2.2305199503898621e-01 + <_> + + 0 -1 766 -1.9626000896096230e-02 + + -4.0918299555778503e-01 1.8893200159072876e-01 + <_> + + 0 -1 767 -5.3266000002622604e-02 + + 8.1381601095199585e-01 -2.0853699743747711e-01 + <_> + + 0 -1 768 7.1290000341832638e-03 + + 3.2996100187301636e-01 -5.9937399625778198e-01 + <_> + + 0 -1 769 -2.2486999630928040e-02 + + -1.2551610469818115e+00 -2.0413000136613846e-02 + <_> + + 0 -1 770 -8.2310996949672699e-02 + + 1.3821430206298828e+00 5.9308998286724091e-02 + <_> + + 0 -1 771 1.3097000122070312e-01 + + -3.5843998193740845e-02 -1.5396369695663452e+00 + <_> + + 0 -1 772 1.4293000102043152e-02 + + -1.8475200235843658e-01 3.7455001473426819e-01 + <_> + + 0 -1 773 6.3479999080300331e-03 + + -4.4901099801063538e-01 1.3876999914646149e-01 + <_> + + 0 -1 774 -4.6055000275373459e-02 + + 6.7832601070404053e-01 -1.7071999609470367e-02 + <_> + + 0 -1 775 5.7693999260663986e-02 + + -1.1955999769270420e-02 -1.2261159420013428e+00 + <_> + + 0 -1 776 -6.0609998181462288e-03 + + 3.3958598971366882e-01 6.2800000887364149e-04 + <_> + + 0 -1 777 -5.2163001149892807e-02 + + -1.0621069669723511e+00 -1.3779999688267708e-02 + <_> + + 0 -1 778 4.6572998166084290e-02 + + 1.4538800716400146e-01 -1.2384550571441650e+00 + <_> + + 0 -1 779 7.5309998355805874e-03 + + -2.4467700719833374e-01 5.1377099752426147e-01 + <_> + + 0 -1 780 2.1615000441670418e-02 + + 1.3072599470615387e-01 -7.0996797084808350e-01 + <_> + + 0 -1 781 -1.7864000052213669e-02 + + -1.0474660396575928e+00 4.9599999329075217e-04 + <_> + + 0 -1 782 -3.7195000797510147e-02 + + -1.5126730203628540e+00 1.4801399409770966e-01 + <_> + + 0 -1 783 -3.1100001069717109e-04 + + 1.3971500098705292e-01 -4.6867498755455017e-01 + <_> + + 0 -1 784 2.5042999535799026e-02 + + 2.8632000088691711e-01 -4.1794699430465698e-01 + <_> + + 0 -1 785 9.3449996784329414e-03 + + -2.7336201071739197e-01 4.3444699048995972e-01 + <_> + + 0 -1 786 3.2363999634981155e-02 + + 1.8438899517059326e-01 -9.5019298791885376e-01 + <_> + + 0 -1 787 -6.2299999408423901e-03 + + 3.2581999897956848e-01 -3.0815601348876953e-01 + <_> + + 0 -1 788 5.1488999277353287e-02 + + 1.1416000127792358e-01 -1.9795479774475098e+00 + <_> + + 0 -1 789 -2.6449000462889671e-02 + + -1.1067299842834473e+00 -8.5519999265670776e-03 + <_> + + 0 -1 790 -1.5420000068843365e-02 + + 8.0138701200485229e-01 -3.2035000622272491e-02 + <_> + + 0 -1 791 1.9456999376416206e-02 + + -2.6449498534202576e-01 3.8753899931907654e-01 + <_> + + 0 -1 792 3.3620998263359070e-02 + + 1.6052000224590302e-02 5.8840900659561157e-01 + <_> + + 0 -1 793 2.8906000778079033e-02 + + 1.5216000378131866e-02 -9.4723600149154663e-01 + <_> + + 0 -1 794 2.0300000323913991e-04 + + -3.0766001343727112e-01 2.1235899627208710e-01 + <_> + + 0 -1 795 -4.9141999334096909e-02 + + -1.6058609485626221e+00 -3.1094999983906746e-02 + <_> + + 0 -1 796 7.6425999402999878e-02 + + 7.4758999049663544e-02 1.1639410257339478e+00 + <_> + + 0 -1 797 2.3897999897599220e-02 + + -6.4320000819861889e-03 -1.1150749921798706e+00 + <_> + + 0 -1 798 3.8970001041889191e-03 + + -2.4105699360370636e-01 2.0858900249004364e-01 + <_> + + 0 -1 799 -8.9445002377033234e-02 + + 1.9157789945602417e+00 -1.5721100568771362e-01 + <_> + + 0 -1 800 -1.5008999966084957e-02 + + -2.5174099206924438e-01 1.8179899454116821e-01 + <_> + + 0 -1 801 -1.1145999655127525e-02 + + -6.9349497556686401e-01 4.4927999377250671e-02 + <_> + + 0 -1 802 9.4578996300697327e-02 + + 1.8102100491523743e-01 -7.4978601932525635e-01 + <_> + + 0 -1 803 5.5038899183273315e-01 + + -3.0974000692367554e-02 -1.6746139526367188e+00 + <_> + + 0 -1 804 4.1381001472473145e-02 + + 6.3910000026226044e-02 7.6561200618743896e-01 + <_> + + 0 -1 805 2.4771999567747116e-02 + + 1.1380000039935112e-02 -8.8559401035308838e-01 + <_> + + 0 -1 806 5.0999000668525696e-02 + + 1.4890299737453461e-01 -2.4634211063385010e+00 + <_> + + 0 -1 807 -1.6893999651074409e-02 + + 3.8870999217033386e-01 -2.9880300164222717e-01 + <_> + + 0 -1 808 -1.2162300199270248e-01 + + -1.5542800426483154e+00 1.6300800442695618e-01 + <_> + + 0 -1 809 -3.6049999762326479e-03 + + 2.1842800080776215e-01 -3.7312099337577820e-01 + <_> + + 0 -1 810 1.1575400084257126e-01 + + -4.7061000019311905e-02 5.9403699636459351e-01 + <_> + + 0 -1 811 3.6903999745845795e-02 + + -2.5508600473403931e-01 5.5397301912307739e-01 + <_> + + 0 -1 812 1.1483999900519848e-02 + + -1.8129499256610870e-01 4.0682798624038696e-01 + <_> + + 0 -1 813 -2.0233999937772751e-02 + + 5.4311197996139526e-01 -2.3822399973869324e-01 + <_> + + 0 -1 814 -2.8765000402927399e-02 + + -6.9172298908233643e-01 1.5943300724029541e-01 + <_> + + 0 -1 815 -5.8320001699030399e-03 + + 2.9447799921035767e-01 -3.4005999565124512e-01 + <_> + + 0 -1 816 -5.5468998849391937e-02 + + 9.2200797796249390e-01 9.4093002378940582e-02 + <_> + + 0 -1 817 -1.4801000244915485e-02 + + -7.9539698362350464e-01 3.1521998345851898e-02 + <_> + + 0 -1 818 -7.0940000005066395e-03 + + 3.3096000552177429e-01 -5.0886999815702438e-02 + <_> + + 0 -1 819 -4.5124001801013947e-02 + + -1.3719749450683594e+00 -2.1408999338746071e-02 + <_> + + 0 -1 820 6.4377002418041229e-02 + + 6.3901998102664948e-02 9.1478300094604492e-01 + <_> + + 0 -1 821 -1.4727000147104263e-02 + + 3.6050599813461304e-01 -2.8614500164985657e-01 + <_> + + 0 -1 822 4.5007001608610153e-02 + + -1.5619699656963348e-01 5.3160297870635986e-01 + <_> + + 0 -1 823 -1.1330000124871731e-03 + + 1.3422900438308716e-01 -4.4358900189399719e-01 + <_> + + 0 -1 824 4.9451000988483429e-02 + + 1.0571800172328949e-01 -2.5589139461517334e+00 + <_> + + 0 -1 825 2.9102999716997147e-02 + + -1.0088000446557999e-02 -1.1073939800262451e+00 + <_> + + 0 -1 826 3.4786000847816467e-02 + + -2.7719999197870493e-03 5.6700998544692993e-01 + <_> + + 0 -1 827 -6.1309998854994774e-03 + + -4.6889400482177734e-01 1.2636399269104004e-01 + <_> + + 0 -1 828 1.5525000169873238e-02 + + -8.4279999136924744e-03 8.7469202280044556e-01 + <_> + + 0 -1 829 2.9249999206513166e-03 + + -3.4434300661087036e-01 2.0851600170135498e-01 + <_> + + 0 -1 830 -5.3571000695228577e-02 + + 1.4982949495315552e+00 5.7328000664710999e-02 + <_> + + 0 -1 831 -1.9217999652028084e-02 + + -9.9234098196029663e-01 -9.3919998034834862e-03 + <_> + + 0 -1 832 -5.5282998830080032e-02 + + -5.7682299613952637e-01 1.6860599815845490e-01 + <_> + + 0 -1 833 5.6336000561714172e-02 + + -3.3775001764297485e-02 -1.3889650106430054e+00 + <_> + + 0 -1 834 -2.3824000731110573e-02 + + 4.0182098746299744e-01 1.8360000103712082e-03 + <_> + + 0 -1 835 1.7810000572353601e-03 + + 1.8145999312400818e-01 -4.1743400692939758e-01 + <_> + + 0 -1 836 -3.7689000368118286e-02 + + 5.4683101177215576e-01 1.8219999969005585e-02 + <_> + + 0 -1 837 -2.4144999682903290e-02 + + 6.8352097272872925e-01 -1.9650200009346008e-01 + <_> + 135 + -3.7025990486145020e+00 + + <_> + + 0 -1 838 2.7444999665021896e-02 + + -8.9984202384948730e-01 5.1876497268676758e-01 + <_> + + 0 -1 839 1.1554100364446640e-01 + + -5.6524401903152466e-01 7.0551300048828125e-01 + <_> + + 0 -1 840 -2.2297000512480736e-02 + + 3.6079999804496765e-01 -6.6864597797393799e-01 + <_> + + 0 -1 841 1.3325000181794167e-02 + + -5.5573397874832153e-01 3.5789999365806580e-01 + <_> + + 0 -1 842 -3.8060001097619534e-03 + + -1.0713000297546387e+00 1.8850000202655792e-01 + <_> + + 0 -1 843 -2.6819999329745770e-03 + + -7.1584302186965942e-01 2.6344498991966248e-01 + <_> + + 0 -1 844 3.3819999080151320e-03 + + -4.6930798888206482e-01 2.6658400893211365e-01 + <_> + + 0 -1 845 3.7643000483512878e-02 + + 2.1098700165748596e-01 -1.0804339647293091e+00 + <_> + + 0 -1 846 -1.3861999846994877e-02 + + 6.6912001371383667e-01 -2.7942800521850586e-01 + <_> + + 0 -1 847 -2.7350001037120819e-03 + + -9.5332300662994385e-01 2.4051299691200256e-01 + <_> + + 0 -1 848 -3.8336999714374542e-02 + + 8.1432801485061646e-01 -2.4919399619102478e-01 + <_> + + 0 -1 849 -3.4697998315095901e-02 + + 1.2330100536346436e+00 6.8600000813603401e-03 + <_> + + 0 -1 850 2.3360999301075935e-02 + + -3.0794700980186462e-01 7.0714497566223145e-01 + <_> + + 0 -1 851 3.5057999193668365e-02 + + 2.1205900609493256e-01 -1.4399830102920532e+00 + <_> + + 0 -1 852 -1.3256999664008617e-02 + + -9.0260702371597290e-01 4.8610001802444458e-02 + <_> + + 0 -1 853 1.2740000151097775e-02 + + 2.2655199468135834e-01 -4.4643801450729370e-01 + <_> + + 0 -1 854 3.6400000099092722e-03 + + -3.9817899465560913e-01 3.4665399789810181e-01 + <_> + + 0 -1 855 1.0064700245857239e-01 + + 1.8383599817752838e-01 -1.3410769701004028e+00 + <_> + + 0 -1 856 0. + + 1.5536400675773621e-01 -5.1582497358322144e-01 + <_> + + 0 -1 857 1.1708999983966351e-02 + + 2.1651400625705719e-01 -7.2705197334289551e-01 + <_> + + 0 -1 858 -3.5964999347925186e-02 + + -1.4789500236511230e+00 -2.4317000061273575e-02 + <_> + + 0 -1 859 -2.1236000582575798e-02 + + -1.6844099760055542e-01 1.9526599347591400e-01 + <_> + + 0 -1 860 1.4874000102281570e-02 + + 3.7335999310016632e-02 -8.7557297945022583e-01 + <_> + + 0 -1 861 -5.1409997977316380e-03 + + 3.3466500043869019e-01 -2.4109700322151184e-01 + <_> + + 0 -1 862 2.3450000211596489e-02 + + 5.5320002138614655e-03 -1.2509720325469971e+00 + <_> + + 0 -1 863 -2.5062000378966331e-02 + + 4.5212399959564209e-01 -8.4469996392726898e-02 + <_> + + 0 -1 864 -7.7400001464411616e-04 + + 1.5249900519847870e-01 -4.8486500978469849e-01 + <_> + + 0 -1 865 -4.0483999997377396e-02 + + -1.3024920225143433e+00 1.7983500659465790e-01 + <_> + + 0 -1 866 2.8170999139547348e-02 + + -2.4410900473594666e-01 6.2271100282669067e-01 + <_> + + 0 -1 867 4.5692998915910721e-02 + + 2.8122000396251678e-02 9.2394399642944336e-01 + <_> + + 0 -1 868 3.9707001298666000e-02 + + -2.2332799434661865e-01 7.7674001455307007e-01 + <_> + + 0 -1 869 5.0517000257968903e-02 + + 2.0319999754428864e-01 -1.0895930528640747e+00 + <_> + + 0 -1 870 -1.7266999930143356e-02 + + 6.8598401546478271e-01 -2.3304499685764313e-01 + <_> + + 0 -1 871 8.0186001956462860e-02 + + -1.0292000137269497e-02 6.1881101131439209e-01 + <_> + + 0 -1 872 9.7676001489162445e-02 + + -2.0070299506187439e-01 1.0088349580764771e+00 + <_> + + 0 -1 873 -1.5572000294923782e-02 + + 4.7615298628807068e-01 4.5623999089002609e-02 + <_> + + 0 -1 874 -1.5305000357329845e-02 + + -1.1077369451522827e+00 4.5239999890327454e-03 + <_> + + 0 -1 875 -1.6485000029206276e-02 + + 1.0152939558029175e+00 1.6327999532222748e-02 + <_> + + 0 -1 876 -2.6141999289393425e-02 + + 4.1723299026489258e-01 -2.8645500540733337e-01 + <_> + + 0 -1 877 8.8679995387792587e-03 + + 2.1404999494552612e-01 -1.6772800683975220e-01 + <_> + + 0 -1 878 -2.6886999607086182e-02 + + -1.1564220190048218e+00 -1.0324000380933285e-02 + <_> + + 0 -1 879 7.7789998613297939e-03 + + 3.5359498858451843e-01 -2.9611301422119141e-01 + <_> + + 0 -1 880 -1.5974000096321106e-02 + + -1.5374109745025635e+00 -2.9958000406622887e-02 + <_> + + 0 -1 881 2.0866999402642250e-02 + + 2.0244100689888000e-01 -7.1270197629928589e-01 + <_> + + 0 -1 882 8.5482001304626465e-02 + + -2.5932999327778816e-02 -1.5156569480895996e+00 + <_> + + 0 -1 883 2.3872999474406242e-02 + + 1.6803400218486786e-01 -3.8806200027465820e-01 + <_> + + 0 -1 884 -3.9105001837015152e-02 + + -1.1958349943161011e+00 -2.0361000671982765e-02 + <_> + + 0 -1 885 -7.7946998178958893e-02 + + -1.0898950099945068e+00 1.4530299603939056e-01 + <_> + + 0 -1 886 -1.6876000910997391e-02 + + 2.8049701452255249e-01 -4.1336300969123840e-01 + <_> + + 0 -1 887 1.1875600367784500e-01 + + -4.3490998446941376e-02 4.1263699531555176e-01 + <_> + + 0 -1 888 1.5624199807643890e-01 + + -2.6429599523544312e-01 5.5127799510955811e-01 + <_> + + 0 -1 889 -4.5908000320196152e-02 + + 6.0189199447631836e-01 1.8921000882983208e-02 + <_> + + 0 -1 890 -1.0309999808669090e-02 + + 3.8152998685836792e-01 -2.9507899284362793e-01 + <_> + + 0 -1 891 9.5769003033638000e-02 + + 1.3246500492095947e-01 -4.6266800165176392e-01 + <_> + + 0 -1 892 1.3686999678611755e-02 + + 1.1738699674606323e-01 -5.1664102077484131e-01 + <_> + + 0 -1 893 2.3990001063793898e-03 + + -3.4007599949836731e-01 2.0953500270843506e-01 + <_> + + 0 -1 894 3.3264998346567154e-02 + + -1.7052799463272095e-01 1.4366799592971802e+00 + <_> + + 0 -1 895 -3.3206000924110413e-02 + + 6.1295700073242188e-01 -4.1549999266862869e-02 + <_> + + 0 -1 896 2.7979998849332333e-03 + + -4.8554301261901855e-01 1.3372699916362762e-01 + <_> + + 0 -1 897 -6.5792001783847809e-02 + + -4.0257668495178223e+00 1.0876700282096863e-01 + <_> + + 0 -1 898 2.1430000197142363e-03 + + -3.9179998636245728e-01 2.2427099943161011e-01 + <_> + + 0 -1 899 2.2363999858498573e-02 + + -8.6429998278617859e-02 3.7785199284553528e-01 + <_> + + 0 -1 900 -5.7410001754760742e-02 + + 1.1454069614410400e+00 -1.9736599922180176e-01 + <_> + + 0 -1 901 6.6550001502037048e-03 + + -2.1105000749230385e-02 5.8453398942947388e-01 + <_> + + 0 -1 902 1.2326999567449093e-02 + + 3.7817001342773438e-02 -6.6987001895904541e-01 + <_> + + 0 -1 903 -8.1869997084140778e-03 + + 5.6366002559661865e-01 -7.6877996325492859e-02 + <_> + + 0 -1 904 3.6681000143289566e-02 + + -1.7343300580978394e-01 1.1670149564743042e+00 + <_> + + 0 -1 905 -4.0220400691032410e-01 + + 1.2640819549560547e+00 4.3398998677730560e-02 + <_> + + 0 -1 906 -2.2126000374555588e-02 + + 6.6978102922439575e-01 -2.1605299413204193e-01 + <_> + + 0 -1 907 -1.3156999833881855e-02 + + -4.1198599338531494e-01 2.0215000212192535e-01 + <_> + + 0 -1 908 -1.2860000133514404e-02 + + -9.1582697629928589e-01 3.9232999086380005e-02 + <_> + + 0 -1 909 2.1627999842166901e-02 + + 3.8719999138265848e-03 3.5668200254440308e-01 + <_> + + 0 -1 910 1.1896000243723392e-02 + + -3.7303900718688965e-01 1.9235099852085114e-01 + <_> + + 0 -1 911 -1.9548999145627022e-02 + + -4.2374899983406067e-01 2.4429599940776825e-01 + <_> + + 0 -1 912 6.4444996416568756e-02 + + -1.6558900475502014e-01 1.2697030305862427e+00 + <_> + + 0 -1 913 1.0898499935865402e-01 + + 1.4894300699234009e-01 -2.1534640789031982e+00 + <_> + + 0 -1 914 -3.4077998250722885e-02 + + 1.3779460191726685e+00 -1.6198499500751495e-01 + <_> + + 0 -1 915 -3.7489999085664749e-03 + + -3.3828601241111755e-01 2.1152900159358978e-01 + <_> + + 0 -1 916 -1.0971999727189541e-02 + + 7.6517897844314575e-01 -1.9692599773406982e-01 + <_> + + 0 -1 917 -1.1485000140964985e-02 + + -6.9271200895309448e-01 2.1657100319862366e-01 + <_> + + 0 -1 918 2.5984000414609909e-02 + + -1.1983999982476234e-02 -9.9697297811508179e-01 + <_> + + 0 -1 919 4.2159999720752239e-03 + + -1.0205700248479843e-01 4.8884400725364685e-01 + <_> + + 0 -1 920 -4.7697000205516815e-02 + + 1.0666010379791260e+00 -1.7576299607753754e-01 + <_> + + 0 -1 921 4.0300001273863018e-04 + + 1.8524800240993500e-01 -7.4790000915527344e-01 + <_> + + 0 -1 922 1.1539600044488907e-01 + + -2.2019700706005096e-01 5.4509997367858887e-01 + <_> + + 0 -1 923 1.6021000221371651e-02 + + 2.5487500429153442e-01 -5.0740098953247070e-01 + <_> + + 0 -1 924 5.6632000952959061e-02 + + -1.1256000027060509e-02 -9.5968097448348999e-01 + <_> + + 0 -1 925 -1.0726000182330608e-02 + + -2.8544700145721436e-01 1.6994799673557281e-01 + <_> + + 0 -1 926 1.2420000135898590e-01 + + -3.6139998584985733e-02 -1.3132710456848145e+00 + <_> + + 0 -1 927 -5.3799999877810478e-03 + + 3.3092701435089111e-01 1.3307999819517136e-02 + <_> + + 0 -1 928 1.1908000335097313e-02 + + -3.4830299019813538e-01 2.4041900038719177e-01 + <_> + + 0 -1 929 -4.3007999658584595e-02 + + -1.4390469789505005e+00 1.5599599480628967e-01 + <_> + + 0 -1 930 -3.3149998635053635e-02 + + -1.1805850267410278e+00 -1.2347999960184097e-02 + <_> + + 0 -1 931 -2.1341999992728233e-02 + + 2.2119441032409668e+00 6.2737002968788147e-02 + <_> + + 0 -1 932 -1.2218999676406384e-02 + + -1.8709750175476074e+00 -4.5499999076128006e-02 + <_> + + 0 -1 933 -1.6860999166965485e-02 + + -7.6912701129913330e-01 1.5330000221729279e-01 + <_> + + 0 -1 934 -2.4999999441206455e-03 + + -6.2987399101257324e-01 5.1600001752376556e-02 + <_> + + 0 -1 935 -4.5037999749183655e-02 + + 8.5428899526596069e-01 6.2600001692771912e-03 + <_> + + 0 -1 936 3.9057999849319458e-02 + + -3.2458998262882233e-02 -1.3325669765472412e+00 + <_> + + 0 -1 937 6.6720000468194485e-03 + + -1.9423599541187286e-01 3.7328699231147766e-01 + <_> + + 0 -1 938 -1.6361000016331673e-02 + + 2.0605869293212891e+00 -1.5042699873447418e-01 + <_> + + 0 -1 939 6.1719999648630619e-03 + + -1.1610999703407288e-01 2.5455400347709656e-01 + <_> + + 0 -1 940 4.5722000300884247e-02 + + -1.6340000554919243e-02 -1.0449140071868896e+00 + <_> + + 0 -1 941 4.1209999471902847e-03 + + -4.1997998952865601e-02 3.9680999517440796e-01 + <_> + + 0 -1 942 -1.7800000205170363e-04 + + -6.6422599554061890e-01 3.3443000167608261e-02 + <_> + + 0 -1 943 7.1109998971223831e-03 + + -5.8231998234987259e-02 3.7857300043106079e-01 + <_> + + 0 -1 944 -4.9864001572132111e-02 + + 6.1019402742385864e-01 -2.1005700528621674e-01 + <_> + + 0 -1 945 -2.5011999532580376e-02 + + -5.7100099325180054e-01 1.7848399281501770e-01 + <_> + + 0 -1 946 3.0939999967813492e-02 + + 5.6363001465797424e-02 -6.4731001853942871e-01 + <_> + + 0 -1 947 4.6271000057458878e-02 + + 1.7482399940490723e-01 -9.8909401893615723e-01 + <_> + + 0 -1 948 -3.1870000530034304e-03 + + -6.6804802417755127e-01 3.2267000526189804e-02 + <_> + + 0 -1 949 -2.4351999163627625e-02 + + 2.9444900155067444e-01 -1.3599999947473407e-03 + <_> + + 0 -1 950 1.1974000371992588e-02 + + -2.8345099091529846e-01 4.7171199321746826e-01 + <_> + + 0 -1 951 1.3070000335574150e-02 + + -1.0834600031375885e-01 5.7193297147750854e-01 + <_> + + 0 -1 952 5.9163000434637070e-02 + + -5.0939001142978668e-02 -1.9059720039367676e+00 + <_> + + 0 -1 953 -4.1094999760389328e-02 + + 4.5104598999023438e-01 -9.7599998116493225e-03 + <_> + + 0 -1 954 -8.3989001810550690e-02 + + -2.0349199771881104e+00 -5.1019001752138138e-02 + <_> + + 0 -1 955 4.4619001448154449e-02 + + 1.7041100561618805e-01 -1.2278720140457153e+00 + <_> + + 0 -1 956 2.4419000372290611e-02 + + -2.1796999499201775e-02 -1.0822949409484863e+00 + <_> + + 0 -1 957 -4.3870001100003719e-03 + + 3.0466699600219727e-01 -3.7066599726676941e-01 + <_> + + 0 -1 958 2.4607999250292778e-02 + + -3.1169500946998596e-01 2.3657299578189850e-01 + <_> + + 0 -1 959 -8.5182003676891327e-02 + + -1.7982350587844849e+00 1.5254299342632294e-01 + <_> + + 0 -1 960 2.1844999864697456e-02 + + -5.1888000220060349e-02 -1.9017189741134644e+00 + <_> + + 0 -1 961 -1.6829000785946846e-02 + + 2.1025900542736053e-01 2.1656999364495277e-02 + <_> + + 0 -1 962 3.2547999173402786e-02 + + -2.0292599499225616e-01 6.0944002866744995e-01 + <_> + + 0 -1 963 2.4709999561309814e-03 + + -9.5371198654174805e-01 1.8568399548530579e-01 + <_> + + 0 -1 964 5.5415999144315720e-02 + + -1.4405299723148346e-01 2.1506340503692627e+00 + <_> + + 0 -1 965 -1.0635499656200409e-01 + + -1.0911970138549805e+00 1.3228000700473785e-01 + <_> + + 0 -1 966 -7.9889995977282524e-03 + + 1.0253400355577469e-01 -5.1744902133941650e-01 + <_> + + 0 -1 967 7.5567997992038727e-02 + + 5.8965001255273819e-02 1.2354209423065186e+00 + <_> + + 0 -1 968 -9.2805996537208557e-02 + + -1.3431650400161743e+00 -3.4462999552488327e-02 + <_> + + 0 -1 969 4.9431998282670975e-02 + + 4.9601998180150986e-02 1.6054730415344238e+00 + <_> + + 0 -1 970 -1.1772999539971352e-02 + + -1.0261050462722778e+00 -4.1559999808669090e-03 + <_> + + 0 -1 971 8.5886001586914062e-02 + + 8.4642998874187469e-02 9.5220798254013062e-01 + <_> + + 0 -1 972 8.1031002104282379e-02 + + -1.4687100052833557e-01 1.9359990358352661e+00 + <_> + 136 + -3.4265899658203125e+00 + + <_> + + 0 -1 973 -3.3840999007225037e-02 + + 6.5889501571655273e-01 -6.9755297899246216e-01 + <_> + + 0 -1 974 1.5410000458359718e-02 + + -9.0728402137756348e-01 3.0478599667549133e-01 + <_> + + 0 -1 975 5.4905999451875687e-02 + + -4.9774798750877380e-01 5.7132601737976074e-01 + <_> + + 0 -1 976 2.1390000358223915e-02 + + -4.2565199732780457e-01 5.8096802234649658e-01 + <_> + + 0 -1 977 7.8849997371435165e-03 + + -4.7905999422073364e-01 4.3016499280929565e-01 + <_> + + 0 -1 978 -3.7544999271631241e-02 + + 5.0861597061157227e-01 -1.9985899329185486e-01 + <_> + + 0 -1 979 1.5925799310207367e-01 + + -2.3263600468635559e-01 1.0993319749832153e+00 + <_> + + 0 -1 980 -6.8939998745918274e-02 + + 4.0569001436233521e-01 5.6855000555515289e-02 + <_> + + 0 -1 981 -3.3695001155138016e-02 + + 4.5132800936698914e-01 -3.3332800865173340e-01 + <_> + + 0 -1 982 -6.3314996659755707e-02 + + -8.5015702247619629e-01 2.2341699898242950e-01 + <_> + + 0 -1 983 7.3699997738003731e-03 + + -9.3082201480865479e-01 5.9216998517513275e-02 + <_> + + 0 -1 984 -9.5969997346401215e-03 + + -1.2794899940490723e+00 1.8447299301624298e-01 + <_> + + 0 -1 985 -1.3067999482154846e-01 + + 5.8426898717880249e-01 -2.6007199287414551e-01 + <_> + + 0 -1 986 5.7402998208999634e-02 + + -5.3789000958204269e-02 7.1175599098205566e-01 + <_> + + 0 -1 987 -7.2340001352131367e-03 + + -8.6962199211120605e-01 7.5214996933937073e-02 + <_> + + 0 -1 988 3.1098999083042145e-02 + + -7.5006999075412750e-02 9.0781599283218384e-01 + <_> + + 0 -1 989 3.5854000598192215e-02 + + -2.4795499444007874e-01 7.2272098064422607e-01 + <_> + + 0 -1 990 -3.1534999608993530e-02 + + -1.1238329410552979e+00 2.0988300442695618e-01 + <_> + + 0 -1 991 -1.9437000155448914e-02 + + -1.4499390125274658e+00 -1.5100000426173210e-02 + <_> + + 0 -1 992 -7.2420001961290836e-03 + + 5.3864902257919312e-01 -1.1375399678945541e-01 + <_> + + 0 -1 993 8.1639997661113739e-03 + + 6.6889002919197083e-02 -7.6872897148132324e-01 + <_> + + 0 -1 994 -4.3653000146150589e-02 + + 1.1413530111312866e+00 4.0217000991106033e-02 + <_> + + 0 -1 995 2.6569999754428864e-02 + + -2.4719099700450897e-01 5.9295099973678589e-01 + <_> + + 0 -1 996 3.2216999679803848e-02 + + -4.0024999529123306e-02 3.2688000798225403e-01 + <_> + + 0 -1 997 -7.2236001491546631e-02 + + 5.8729398250579834e-01 -2.5396001338958740e-01 + <_> + + 0 -1 998 3.1424999237060547e-02 + + 1.5315100550651550e-01 -5.6042098999023438e-01 + <_> + + 0 -1 999 -4.7699999413453043e-04 + + 1.6958899796009064e-01 -5.2626699209213257e-01 + <_> + + 0 -1 1000 2.7189999818801880e-03 + + -1.4944599568843842e-01 2.9658699035644531e-01 + <_> + + 0 -1 1001 3.2875001430511475e-02 + + -3.9943501353263855e-01 2.5156599283218384e-01 + <_> + + 0 -1 1002 -1.4553000219166279e-02 + + 2.7972599864006042e-01 -4.7203800082206726e-01 + <_> + + 0 -1 1003 3.8017999380826950e-02 + + -2.9200001154094934e-03 -1.1300059556961060e+00 + <_> + + 0 -1 1004 2.8659999370574951e-03 + + 4.1111800074577332e-01 -2.6220801472663879e-01 + <_> + + 0 -1 1005 -4.1606999933719635e-02 + + -1.4293819665908813e+00 -1.9132999703288078e-02 + <_> + + 0 -1 1006 -2.4802999570965767e-02 + + -2.5013598799705505e-01 1.5978699922561646e-01 + <_> + + 0 -1 1007 1.0098000057041645e-02 + + 4.3738998472690582e-02 -6.9986099004745483e-01 + <_> + + 0 -1 1008 -2.0947000011801720e-02 + + -9.4137799739837646e-01 2.3204000294208527e-01 + <_> + + 0 -1 1009 2.2458000108599663e-02 + + -2.7185800671577454e-01 4.5319199562072754e-01 + <_> + + 0 -1 1010 -3.7110999226570129e-02 + + -1.0314660072326660e+00 1.4421799778938293e-01 + <_> + + 0 -1 1011 -1.0648000054061413e-02 + + 6.3107001781463623e-01 -2.5520798563957214e-01 + <_> + + 0 -1 1012 5.5422998964786530e-02 + + 1.6206599771976471e-01 -1.7722640037536621e+00 + <_> + + 0 -1 1013 2.1601999178528786e-02 + + -2.5016099214553833e-01 5.4119801521301270e-01 + <_> + + 0 -1 1014 8.7000000348780304e-05 + + -2.9008901119232178e-01 3.3507999777793884e-01 + <_> + + 0 -1 1015 1.4406000263988972e-02 + + -7.8840004280209541e-03 -1.1677219867706299e+00 + <_> + + 0 -1 1016 1.0777399688959122e-01 + + 1.1292000114917755e-01 -2.4940319061279297e+00 + <_> + + 0 -1 1017 3.5943999886512756e-02 + + -1.9480599462985992e-01 9.5757502317428589e-01 + <_> + + 0 -1 1018 -3.9510000497102737e-03 + + 3.0927801132202148e-01 -2.5530201196670532e-01 + <_> + + 0 -1 1019 2.0942000672221184e-02 + + -7.6319999061524868e-03 -1.0086350440979004e+00 + <_> + + 0 -1 1020 -2.9877999797463417e-02 + + -4.6027699112892151e-01 1.9507199525833130e-01 + <_> + + 0 -1 1021 2.5971999391913414e-02 + + -1.2187999673187733e-02 -1.0035500526428223e+00 + <_> + + 0 -1 1022 1.0603000409901142e-02 + + -7.5969003140926361e-02 4.1669899225234985e-01 + <_> + + 0 -1 1023 8.5819996893405914e-03 + + -2.6648598909378052e-01 3.9111500978469849e-01 + <_> + + 0 -1 1024 2.1270999684929848e-02 + + 1.8273900449275970e-01 -3.6052298545837402e-01 + <_> + + 0 -1 1025 7.4518002569675446e-02 + + -1.8938399851322174e-01 9.2658001184463501e-01 + <_> + + 0 -1 1026 4.6569998376071453e-03 + + -1.4506199955940247e-01 3.3294600248336792e-01 + <_> + + 0 -1 1027 1.7119999974966049e-03 + + -5.2464002370834351e-01 8.9879997074604034e-02 + <_> + + 0 -1 1028 9.8500004969537258e-04 + + -3.8381999731063843e-01 2.4392999708652496e-01 + <_> + + 0 -1 1029 2.8233999386429787e-02 + + -5.7879998348653316e-03 -1.2617139816284180e+00 + <_> + + 0 -1 1030 -3.2678000628948212e-02 + + -5.7953298091888428e-01 1.6955299675464630e-01 + <_> + + 0 -1 1031 2.2536000236868858e-02 + + 2.2281000390648842e-02 -8.7869602441787720e-01 + <_> + + 0 -1 1032 -2.1657999604940414e-02 + + -6.5108501911163330e-01 1.2966899573802948e-01 + <_> + + 0 -1 1033 7.6799998059868813e-03 + + -3.3965200185775757e-01 2.2013300657272339e-01 + <_> + + 0 -1 1034 1.4592000283300877e-02 + + 1.5077300369739532e-01 -5.0452399253845215e-01 + <_> + + 0 -1 1035 2.7868000790476799e-02 + + -2.5045299530029297e-01 4.5741999149322510e-01 + <_> + + 0 -1 1036 5.6940000504255295e-03 + + -1.0948500037193298e-01 5.5757802724838257e-01 + <_> + + 0 -1 1037 -1.0002999566495419e-02 + + -9.7366297245025635e-01 1.8467999994754791e-02 + <_> + + 0 -1 1038 -4.0719998069107533e-03 + + 3.8222199678421021e-01 -1.6921100020408630e-01 + <_> + + 0 -1 1039 -2.2593999281525612e-02 + + -1.0391089916229248e+00 5.1839998923242092e-03 + <_> + + 0 -1 1040 -3.9579998701810837e-02 + + -5.5109229087829590e+00 1.1163999885320663e-01 + <_> + + 0 -1 1041 -1.7537999898195267e-02 + + 9.5485800504684448e-01 -1.8584500253200531e-01 + <_> + + 0 -1 1042 9.0300003066658974e-03 + + 1.0436000302433968e-02 8.2114797830581665e-01 + <_> + + 0 -1 1043 -7.9539995640516281e-03 + + 2.2632899880409241e-01 -3.4568199515342712e-01 + <_> + + 0 -1 1044 2.7091000229120255e-02 + + 1.6430099308490753e-01 -1.3926379680633545e+00 + <_> + + 0 -1 1045 -2.0625999197363853e-02 + + -8.6366099119186401e-01 2.3880000226199627e-03 + <_> + + 0 -1 1046 -7.1989998221397400e-02 + + -2.8192629814147949e+00 1.1570499837398529e-01 + <_> + + 0 -1 1047 -2.6964999735355377e-02 + + -1.2946130037307739e+00 -2.4661000818014145e-02 + <_> + + 0 -1 1048 -4.7377999871969223e-02 + + -8.1306397914886475e-01 1.1831399798393250e-01 + <_> + + 0 -1 1049 -1.0895600169897079e-01 + + 6.5937900543212891e-01 -2.0843900740146637e-01 + <_> + + 0 -1 1050 1.3574000447988510e-02 + + 7.4240001849830151e-03 5.3152197599411011e-01 + <_> + + 0 -1 1051 -6.6920001991093159e-03 + + 3.0655801296234131e-01 -3.1084299087524414e-01 + <_> + + 0 -1 1052 -3.9070001803338528e-03 + + 2.5576499104499817e-01 -5.2932001650333405e-02 + <_> + + 0 -1 1053 -3.7613000720739365e-02 + + -1.4350049495697021e+00 -1.5448000282049179e-02 + <_> + + 0 -1 1054 8.6329998448491096e-03 + + -1.6884399950504303e-01 4.2124900221824646e-01 + <_> + + 0 -1 1055 -3.2097000628709793e-02 + + -6.4979398250579834e-01 4.1110001504421234e-02 + <_> + + 0 -1 1056 5.8495998382568359e-02 + + -5.2963998168706894e-02 6.3368302583694458e-01 + <_> + + 0 -1 1057 -4.0901999920606613e-02 + + -9.2101097106933594e-01 9.0640000998973846e-03 + <_> + + 0 -1 1058 -1.9925000146031380e-02 + + 5.3759998083114624e-01 -6.2996998429298401e-02 + <_> + + 0 -1 1059 -4.6020001173019409e-03 + + -5.4333502054214478e-01 8.4104999899864197e-02 + <_> + + 0 -1 1060 1.6824999824166298e-02 + + 1.5563699603080750e-01 -4.0171200037002563e-01 + <_> + + 0 -1 1061 9.4790002331137657e-03 + + -2.4245299398899078e-01 5.1509499549865723e-01 + <_> + + 0 -1 1062 -1.9534999504685402e-02 + + -5.1118397712707520e-01 1.3831999897956848e-01 + <_> + + 0 -1 1063 1.0746000334620476e-02 + + -2.1854999661445618e-01 6.2828701734542847e-01 + <_> + + 0 -1 1064 3.7927001714706421e-02 + + 1.1640299856662750e-01 -2.7301959991455078e+00 + <_> + + 0 -1 1065 1.6390999779105186e-02 + + -1.4635999687016010e-02 -1.0797250270843506e+00 + <_> + + 0 -1 1066 -1.9785000011324883e-02 + + 1.2166420221328735e+00 3.3275000751018524e-02 + <_> + + 0 -1 1067 1.1067000217735767e-02 + + -2.5388300418853760e-01 4.4038599729537964e-01 + <_> + + 0 -1 1068 5.2479999139904976e-03 + + 2.2496800124645233e-01 -2.4216499924659729e-01 + <_> + + 0 -1 1069 -1.1141999624669552e-02 + + 2.5018098950386047e-01 -3.0811500549316406e-01 + <_> + + 0 -1 1070 -1.0666999965906143e-02 + + -3.2729101181030273e-01 2.6168298721313477e-01 + <_> + + 0 -1 1071 1.0545299947261810e-01 + + -5.5750001221895218e-02 -1.9605729579925537e+00 + <_> + + 0 -1 1072 5.4827999323606491e-02 + + -1.9519999623298645e-03 7.3866099119186401e-01 + <_> + + 0 -1 1073 1.7760999500751495e-02 + + -3.0647200345993042e-01 2.6346999406814575e-01 + <_> + + 0 -1 1074 -3.1185999512672424e-02 + + -2.4600900709629059e-01 1.7082199454307556e-01 + <_> + + 0 -1 1075 -5.7296000421047211e-02 + + 4.7033500671386719e-01 -2.6048299670219421e-01 + <_> + + 0 -1 1076 -1.1312000453472137e-02 + + 3.8628900051116943e-01 -2.8817000985145569e-01 + <_> + + 0 -1 1077 3.0592000111937523e-02 + + -4.8826001584529877e-02 -1.7638969421386719e+00 + <_> + + 0 -1 1078 1.8489999929443002e-03 + + 2.1099899709224701e-01 -2.5940999388694763e-02 + <_> + + 0 -1 1079 1.1419000104069710e-02 + + -1.6829599440097809e-01 1.0278660058975220e+00 + <_> + + 0 -1 1080 8.1403002142906189e-02 + + 1.1531999707221985e-01 -1.2482399940490723e+00 + <_> + + 0 -1 1081 5.3495999425649643e-02 + + -4.6303998678922653e-02 -1.7165969610214233e+00 + <_> + + 0 -1 1082 -2.3948000743985176e-02 + + -4.0246599912643433e-01 2.0562100410461426e-01 + <_> + + 0 -1 1083 6.7690000869333744e-03 + + -3.3152300119400024e-01 2.0683400332927704e-01 + <_> + + 0 -1 1084 -3.2343998551368713e-02 + + -7.2632801532745361e-01 2.0073500275611877e-01 + <_> + + 0 -1 1085 3.7863001227378845e-02 + + -1.5631000697612762e-01 1.6697460412979126e+00 + <_> + + 0 -1 1086 1.5440000221133232e-02 + + 1.9487400352954865e-01 -3.5384199023246765e-01 + <_> + + 0 -1 1087 -4.4376000761985779e-02 + + 8.2093602418899536e-01 -1.8193599581718445e-01 + <_> + + 0 -1 1088 -2.3102000355720520e-02 + + -4.3044099211692810e-01 1.2375400215387344e-01 + <_> + + 0 -1 1089 1.9400000572204590e-02 + + -2.9726000502705574e-02 -1.1597590446472168e+00 + <_> + + 0 -1 1090 1.0385700315237045e-01 + + 1.1149899661540985e-01 -4.6835222244262695e+00 + <_> + + 0 -1 1091 -1.8964000046253204e-02 + + 2.1773819923400879e+00 -1.4544400572776794e-01 + <_> + + 0 -1 1092 3.8750998675823212e-02 + + -4.9446001648902893e-02 3.4018298983573914e-01 + <_> + + 0 -1 1093 2.2766999900341034e-02 + + -3.2802999019622803e-01 3.0531400442123413e-01 + <_> + + 0 -1 1094 -3.1357001513242722e-02 + + 1.1520819664001465e+00 2.7305999770760536e-02 + <_> + + 0 -1 1095 9.6909999847412109e-03 + + -3.8799500465393066e-01 2.1512599289417267e-01 + <_> + + 0 -1 1096 -4.9284998327493668e-02 + + -1.6774909496307373e+00 1.5774199366569519e-01 + <_> + + 0 -1 1097 -3.9510998874902725e-02 + + -9.7647899389266968e-01 -1.0552000254392624e-02 + <_> + + 0 -1 1098 4.7997999936342239e-02 + + 2.0843900740146637e-01 -6.8992799520492554e-01 + <_> + + 0 -1 1099 5.1422998309135437e-02 + + -1.6665300726890564e-01 1.2149239778518677e+00 + <_> + + 0 -1 1100 1.4279999770224094e-02 + + 2.3627699911594391e-01 -4.1396799683570862e-01 + <_> + + 0 -1 1101 -9.1611996293067932e-02 + + -9.2830902338027954e-01 -1.8345000222325325e-02 + <_> + + 0 -1 1102 6.5080001950263977e-03 + + -7.3647201061248779e-01 1.9497099518775940e-01 + <_> + + 0 -1 1103 3.5723000764846802e-02 + + 1.4197799563407898e-01 -4.2089301347732544e-01 + <_> + + 0 -1 1104 5.0638001412153244e-02 + + 1.1644000187516212e-02 7.8486597537994385e-01 + <_> + + 0 -1 1105 -1.4613999985158443e-02 + + -1.1909500360488892e+00 -3.5128001123666763e-02 + <_> + + 0 -1 1106 -3.8662999868392944e-02 + + 2.4314730167388916e+00 6.5647996962070465e-02 + <_> + + 0 -1 1107 -4.0346998721361160e-02 + + 7.1755301952362061e-01 -1.9108299911022186e-01 + <_> + + 0 -1 1108 2.3902000859379768e-02 + + 1.5646199882030487e-01 -7.9294800758361816e-01 + <_> + 137 + -3.5125269889831543e+00 + + <_> + + 0 -1 1109 8.5640000179409981e-03 + + -8.1450700759887695e-01 5.8875298500061035e-01 + <_> + + 0 -1 1110 -1.3292600214481354e-01 + + 9.3213397264480591e-01 -2.9367300868034363e-01 + <_> + + 0 -1 1111 9.8400004208087921e-03 + + -5.6462901830673218e-01 4.1647699475288391e-01 + <_> + + 0 -1 1112 5.0889998674392700e-03 + + -7.9232800006866455e-01 1.6975000500679016e-01 + <_> + + 0 -1 1113 -6.1039000749588013e-02 + + -1.4169000387191772e+00 2.5020999833941460e-02 + <_> + + 0 -1 1114 -4.6599999768659472e-04 + + 3.7982499599456787e-01 -4.1567099094390869e-01 + <_> + + 0 -1 1115 3.3889999613165855e-03 + + -4.0768599510192871e-01 3.5548499226570129e-01 + <_> + + 0 -1 1116 2.1006999537348747e-02 + + -2.4080100655555725e-01 8.6112701892852783e-01 + <_> + + 0 -1 1117 7.5559997931122780e-03 + + -8.7467199563980103e-01 9.8572000861167908e-02 + <_> + + 0 -1 1118 2.4779999628663063e-02 + + 1.5566200017929077e-01 -6.9229799509048462e-01 + <_> + + 0 -1 1119 -3.5620000213384628e-02 + + -1.1472270488739014e+00 3.6359999328851700e-02 + <_> + + 0 -1 1120 1.9810000434517860e-02 + + 1.5516200661659241e-01 -6.9520097970962524e-01 + <_> + + 0 -1 1121 1.5019999817013741e-02 + + 4.1990000754594803e-02 -9.6622800827026367e-01 + <_> + + 0 -1 1122 -2.3137999698519707e-02 + + 4.3396899104118347e-01 2.4160000029951334e-03 + <_> + + 0 -1 1123 -1.8743000924587250e-02 + + 4.3481099605560303e-01 -3.2522499561309814e-01 + <_> + + 0 -1 1124 4.5080000162124634e-01 + + -9.4573996961116791e-02 7.2421300411224365e-01 + <_> + + 0 -1 1125 1.1854999698698521e-02 + + -3.8133099675178528e-01 3.0098399519920349e-01 + <_> + + 0 -1 1126 -2.4830000475049019e-02 + + 8.9300602674484253e-01 -1.0295899957418442e-01 + <_> + + 0 -1 1127 -4.4743001461029053e-02 + + 8.6280298233032227e-01 -2.1716499328613281e-01 + <_> + + 0 -1 1128 -1.4600000344216824e-02 + + 6.0069400072097778e-01 -1.5906299650669098e-01 + <_> + + 0 -1 1129 -2.4527000263333321e-02 + + -1.5872869491577148e+00 -2.1817000582814217e-02 + <_> + + 0 -1 1130 2.3024000227451324e-02 + + 1.6853399574756622e-01 -3.8106900453567505e-01 + <_> + + 0 -1 1131 -2.4917000904679298e-02 + + 5.0810897350311279e-01 -2.7279898524284363e-01 + <_> + + 0 -1 1132 1.0130000300705433e-03 + + -4.3138799071311951e-01 2.6438099145889282e-01 + <_> + + 0 -1 1133 1.5603000298142433e-02 + + -3.1624200940132141e-01 5.5715900659561157e-01 + <_> + + 0 -1 1134 -2.6685999706387520e-02 + + 1.0553920269012451e+00 2.9074000194668770e-02 + <_> + + 0 -1 1135 1.3940000208094716e-03 + + -7.1873801946640015e-01 6.5390996634960175e-02 + <_> + + 0 -1 1136 -6.4799998654052615e-04 + + 2.4884399771690369e-01 -2.0978200435638428e-01 + <_> + + 0 -1 1137 -3.1888000667095184e-02 + + -6.8844497203826904e-01 6.3589997589588165e-02 + <_> + + 0 -1 1138 -4.9290000461041927e-03 + + -5.9152501821517944e-01 2.7943599224090576e-01 + <_> + + 0 -1 1139 3.1168000772595406e-02 + + 4.5223999768495560e-02 -8.8639199733734131e-01 + <_> + + 0 -1 1140 -3.3663000911474228e-02 + + -6.1590200662612915e-01 1.5749299526214600e-01 + <_> + + 0 -1 1141 1.1966999620199203e-02 + + -3.0606698989868164e-01 4.2293301224708557e-01 + <_> + + 0 -1 1142 -3.4680001437664032e-02 + + -1.3734940290451050e+00 1.5908700227737427e-01 + <_> + + 0 -1 1143 9.9290004000067711e-03 + + -5.5860197544097900e-01 1.2119200080633163e-01 + <_> + + 0 -1 1144 5.9574998915195465e-02 + + 4.9720001406967640e-03 8.2055401802062988e-01 + <_> + + 0 -1 1145 -6.5428003668785095e-02 + + 1.5651429891586304e+00 -1.6817499697208405e-01 + <_> + + 0 -1 1146 -9.2895999550819397e-02 + + -1.5794529914855957e+00 1.4661799371242523e-01 + <_> + + 0 -1 1147 -4.1184000670909882e-02 + + -1.5518720149993896e+00 -2.9969999566674232e-02 + <_> + + 0 -1 1148 2.1447999402880669e-02 + + 1.7196300625801086e-01 -6.9343197345733643e-01 + <_> + + 0 -1 1149 -2.5569999590516090e-02 + + -1.3061310052871704e+00 -2.4336999282240868e-02 + <_> + + 0 -1 1150 -4.1200999170541763e-02 + + -1.3821059465408325e+00 1.4801800251007080e-01 + <_> + + 0 -1 1151 -1.7668999731540680e-02 + + -7.0889997482299805e-01 3.6524001508951187e-02 + <_> + + 0 -1 1152 9.0060001239180565e-03 + + -4.0913999080657959e-02 8.0373102426528931e-01 + <_> + + 0 -1 1153 -1.1652999557554722e-02 + + 5.7546800374984741e-01 -2.4991700053215027e-01 + <_> + + 0 -1 1154 -7.4780001305043697e-03 + + -4.9280899763107300e-01 1.9810900092124939e-01 + <_> + + 0 -1 1155 8.5499999113380909e-04 + + -4.8858100175857544e-01 1.3563099503517151e-01 + <_> + + 0 -1 1156 -3.0538000166416168e-02 + + -6.0278397798538208e-01 1.8522000312805176e-01 + <_> + + 0 -1 1157 -1.8846999853849411e-02 + + 2.3565599322319031e-01 -3.5136300325393677e-01 + <_> + + 0 -1 1158 -8.1129996106028557e-03 + + -8.1304997205734253e-02 2.1069599688053131e-01 + <_> + + 0 -1 1159 -3.4830000251531601e-02 + + -1.2065670490264893e+00 -1.4251999557018280e-02 + <_> + + 0 -1 1160 1.9021000713109970e-02 + + 2.3349900543689728e-01 -4.5664900541305542e-01 + <_> + + 0 -1 1161 -1.9004000350832939e-02 + + -8.1075799465179443e-01 1.3140000402927399e-02 + <_> + + 0 -1 1162 -8.9057996869087219e-02 + + 6.1542397737503052e-01 3.2983001321554184e-02 + <_> + + 0 -1 1163 6.8620000965893269e-03 + + -2.9583099484443665e-01 2.7003699541091919e-01 + <_> + + 0 -1 1164 -2.8240999206900597e-02 + + -6.1102700233459473e-01 1.7357499897480011e-01 + <_> + + 0 -1 1165 -3.2099999953061342e-04 + + -5.3322899341583252e-01 6.8539001047611237e-02 + <_> + + 0 -1 1166 -1.0829100012779236e-01 + + -1.2879559993743896e+00 1.1801700294017792e-01 + <_> + + 0 -1 1167 1.5878999605774879e-02 + + -1.7072600126266479e-01 1.1103910207748413e+00 + <_> + + 0 -1 1168 8.6859995499253273e-03 + + -1.0995099693536758e-01 4.6010500192642212e-01 + <_> + + 0 -1 1169 -2.5234999135136604e-02 + + 1.0220669507980347e+00 -1.8694299459457397e-01 + <_> + + 0 -1 1170 -1.3508999720215797e-02 + + -7.8316599130630493e-01 1.4202600717544556e-01 + <_> + + 0 -1 1171 -7.7149998396635056e-03 + + -8.8060700893402100e-01 1.1060000397264957e-02 + <_> + + 0 -1 1172 7.1580000221729279e-02 + + 1.1369399726390839e-01 -1.1032789945602417e+00 + <_> + + 0 -1 1173 -1.3554000295698643e-02 + + -8.1096500158309937e-01 3.4080001059919596e-03 + <_> + + 0 -1 1174 2.9450000729411840e-03 + + -7.2879999876022339e-02 3.4998100996017456e-01 + <_> + + 0 -1 1175 -5.0833001732826233e-02 + + -1.2868590354919434e+00 -2.8842000290751457e-02 + <_> + + 0 -1 1176 -8.7989997118711472e-03 + + 4.7613599896430969e-01 -1.4690400660037994e-01 + <_> + + 0 -1 1177 2.1424399316310883e-01 + + -5.9702001512050629e-02 -2.4802260398864746e+00 + <_> + + 0 -1 1178 1.3962999917566776e-02 + + 1.7420299351215363e-01 -4.3911001086235046e-01 + <_> + + 0 -1 1179 4.2502000927925110e-02 + + -1.9965299963951111e-01 7.0654797554016113e-01 + <_> + + 0 -1 1180 1.9827999174594879e-02 + + -6.9136001169681549e-02 6.1643397808074951e-01 + <_> + + 0 -1 1181 -3.3560000360012054e-02 + + -1.2740780115127563e+00 -2.5673000141978264e-02 + <_> + + 0 -1 1182 6.3542999327182770e-02 + + 1.2403500080108643e-01 -1.0776289701461792e+00 + <_> + + 0 -1 1183 2.1933000534772873e-02 + + 1.4952000230550766e-02 -7.1023499965667725e-01 + <_> + + 0 -1 1184 -7.8424997627735138e-02 + + 6.2033998966217041e-01 3.3610999584197998e-02 + <_> + + 0 -1 1185 1.4390000142157078e-02 + + -3.6324599385261536e-01 1.7308300733566284e-01 + <_> + + 0 -1 1186 -6.7309997975826263e-02 + + 5.2374100685119629e-01 1.2799999676644802e-02 + <_> + + 0 -1 1187 1.3047499954700470e-01 + + -1.7122499644756317e-01 1.1235200166702271e+00 + <_> + + 0 -1 1188 -4.6245999634265900e-02 + + -1.1908329725265503e+00 1.7425599694252014e-01 + <_> + + 0 -1 1189 -2.9842000454664230e-02 + + 8.3930599689483643e-01 -1.8064199388027191e-01 + <_> + + 0 -1 1190 -3.8099999073892832e-04 + + 3.5532799363136292e-01 -2.3842300474643707e-01 + <_> + + 0 -1 1191 -2.2378999739885330e-02 + + -8.7943899631500244e-01 -7.8399997437372804e-04 + <_> + + 0 -1 1192 -1.5569999814033508e-03 + + -1.4253300428390503e-01 2.5876200199127197e-01 + <_> + + 0 -1 1193 1.2013000436127186e-02 + + -2.9015499353408813e-01 2.6051101088523865e-01 + <_> + + 0 -1 1194 2.4384999647736549e-02 + + -3.1438998878002167e-02 5.8695900440216064e-01 + <_> + + 0 -1 1195 -4.7180999070405960e-02 + + 6.9430100917816162e-01 -2.1816100180149078e-01 + <_> + + 0 -1 1196 -2.4893999099731445e-02 + + -6.4599299430847168e-01 1.5611599385738373e-01 + <_> + + 0 -1 1197 2.1944999694824219e-02 + + -2.7742000296711922e-02 -1.1346880197525024e+00 + <_> + + 0 -1 1198 1.8809899687767029e-01 + + -1.0076000355184078e-02 1.2429029941558838e+00 + <_> + + 0 -1 1199 -7.7872000634670258e-02 + + 8.5008001327514648e-01 -1.9015499949455261e-01 + <_> + + 0 -1 1200 -4.8769000917673111e-02 + + -2.0763080120086670e+00 1.2179400026798248e-01 + <_> + + 0 -1 1201 -1.7115000635385513e-02 + + -8.5687297582626343e-01 7.8760003671050072e-03 + <_> + + 0 -1 1202 -2.7499999850988388e-03 + + 3.8645499944686890e-01 -1.1391499638557434e-01 + <_> + + 0 -1 1203 -9.8793998360633850e-02 + + -1.7233899831771851e+00 -5.6063000112771988e-02 + <_> + + 0 -1 1204 -2.1936999633908272e-02 + + 5.4749399423599243e-01 -4.2481999844312668e-02 + <_> + + 0 -1 1205 6.1096999794244766e-02 + + -3.8945000618696213e-02 -1.0807880163192749e+00 + <_> + + 0 -1 1206 -2.4563999846577644e-02 + + 5.8311098814010620e-01 -9.7599998116493225e-04 + <_> + + 0 -1 1207 3.3752001821994781e-02 + + -1.3795999810099602e-02 -8.4730297327041626e-01 + <_> + + 0 -1 1208 3.8199000060558319e-02 + + 1.5114299952983856e-01 -7.9473400115966797e-01 + <_> + + 0 -1 1209 -2.0117999985814095e-02 + + 5.1579099893569946e-01 -2.1445399522781372e-01 + <_> + + 0 -1 1210 2.4734999984502792e-02 + + -2.2105000913143158e-02 4.2917698621749878e-01 + <_> + + 0 -1 1211 -2.4357000365853310e-02 + + -8.6201298236846924e-01 -3.6760000512003899e-03 + <_> + + 0 -1 1212 -2.6442000642418861e-02 + + -4.5397499203681946e-01 2.2462800145149231e-01 + <_> + + 0 -1 1213 -3.4429999068379402e-03 + + 1.3073000311851501e-01 -3.8622701168060303e-01 + <_> + + 0 -1 1214 1.0701700299978256e-01 + + 1.3158600032329559e-01 -7.9306900501251221e-01 + <_> + + 0 -1 1215 4.5152999460697174e-02 + + -2.5296801328659058e-01 4.0672400593757629e-01 + <_> + + 0 -1 1216 4.4349998235702515e-02 + + 2.2613000124692917e-02 7.9618102312088013e-01 + <_> + + 0 -1 1217 1.0839999886229634e-03 + + -3.9158400893211365e-01 1.1639100313186646e-01 + <_> + + 0 -1 1218 7.1433000266551971e-02 + + 8.2466997206211090e-02 1.2530590295791626e+00 + <_> + + 0 -1 1219 3.5838000476360321e-02 + + -1.8203300237655640e-01 7.7078700065612793e-01 + <_> + + 0 -1 1220 -2.0839000120759010e-02 + + -6.1744397878646851e-01 1.5891399979591370e-01 + <_> + + 0 -1 1221 4.2525801062583923e-01 + + -4.8978000879287720e-02 -1.8422030210494995e+00 + <_> + + 0 -1 1222 1.1408000253140926e-02 + + 1.7918199300765991e-01 -1.5383499860763550e-01 + <_> + + 0 -1 1223 -1.5364999882876873e-02 + + -8.4016501903533936e-01 -1.0280000278726220e-03 + <_> + + 0 -1 1224 -1.5212000347673893e-02 + + -1.8995699286460876e-01 1.7130999267101288e-01 + <_> + + 0 -1 1225 -1.8972000107169151e-02 + + -7.9541999101638794e-01 6.6800001077353954e-03 + <_> + + 0 -1 1226 -3.3330000005662441e-03 + + -2.3530800640583038e-01 2.4730099737644196e-01 + <_> + + 0 -1 1227 9.3248002231121063e-02 + + -5.4758001118898392e-02 -1.8324300050735474e+00 + <_> + + 0 -1 1228 -1.2555000372231007e-02 + + 2.6385200023651123e-01 -3.8526400923728943e-01 + <_> + + 0 -1 1229 -2.7070000767707825e-02 + + -6.6929799318313599e-01 2.0340999588370323e-02 + <_> + + 0 -1 1230 -2.3677000775933266e-02 + + 6.7265301942825317e-01 -1.4344000257551670e-02 + <_> + + 0 -1 1231 -1.4275000430643559e-02 + + 3.0186399817466736e-01 -2.8514400124549866e-01 + <_> + + 0 -1 1232 2.8096999973058701e-02 + + 1.4766000211238861e-01 -1.4078520536422729e+00 + <_> + + 0 -1 1233 5.0840001553297043e-02 + + -1.8613600730895996e-01 7.9953002929687500e-01 + <_> + + 0 -1 1234 1.1505999602377415e-02 + + 1.9118399918079376e-01 -8.5035003721714020e-02 + <_> + + 0 -1 1235 -1.4661000110208988e-02 + + 4.5239299535751343e-01 -2.2205199301242828e-01 + <_> + + 0 -1 1236 2.2842499613761902e-01 + + 1.3488399982452393e-01 -1.2894610166549683e+00 + <_> + + 0 -1 1237 1.1106900125741959e-01 + + -2.0753799378871918e-01 5.4561597108840942e-01 + <_> + + 0 -1 1238 3.2450000289827585e-03 + + 3.2053700089454651e-01 -1.6403500735759735e-01 + <_> + + 0 -1 1239 8.5309997200965881e-02 + + -2.0210500061511993e-01 5.3296798467636108e-01 + <_> + + 0 -1 1240 2.2048000246286392e-02 + + 1.5698599815368652e-01 -1.7014099657535553e-01 + <_> + + 0 -1 1241 -1.5676999464631081e-02 + + -6.2863498926162720e-01 4.0761999785900116e-02 + <_> + + 0 -1 1242 3.3112901449203491e-01 + + 1.6609300673007965e-01 -1.0326379537582397e+00 + <_> + + 0 -1 1243 8.8470000773668289e-03 + + -2.5076198577880859e-01 3.1660598516464233e-01 + <_> + + 0 -1 1244 4.6080000698566437e-02 + + 1.5352100133895874e-01 -1.6333500146865845e+00 + <_> + + 0 -1 1245 -3.7703000009059906e-02 + + 5.6873798370361328e-01 -2.0102599263191223e-01 + <_> + 159 + -3.5939640998840332e+00 + + <_> + + 0 -1 1246 -8.1808999180793762e-02 + + 5.7124799489974976e-01 -6.7438799142837524e-01 + <_> + + 0 -1 1247 2.1761199831962585e-01 + + -3.8610199093818665e-01 9.0343999862670898e-01 + <_> + + 0 -1 1248 1.4878000132739544e-02 + + 2.2241599857807159e-01 -1.2779350280761719e+00 + <_> + + 0 -1 1249 5.2434999495744705e-02 + + -2.8690400719642639e-01 7.5742298364639282e-01 + <_> + + 0 -1 1250 9.1429995372891426e-03 + + -6.4880400896072388e-01 2.2268800437450409e-01 + <_> + + 0 -1 1251 7.9169999808073044e-03 + + -2.9253599047660828e-01 3.1030198931694031e-01 + <_> + + 0 -1 1252 -2.6084000244736671e-02 + + 4.5532700419425964e-01 -3.8500601053237915e-01 + <_> + + 0 -1 1253 -2.9400000348687172e-03 + + -5.1264399290084839e-01 2.7432298660278320e-01 + <_> + + 0 -1 1254 5.7130001485347748e-02 + + 1.5788000077009201e-02 -1.2133100032806396e+00 + <_> + + 0 -1 1255 -6.1309998854994774e-03 + + 3.9174601435661316e-01 -3.0866798758506775e-01 + <_> + + 0 -1 1256 -4.0405001491308212e-02 + + 1.1901949644088745e+00 -2.0347100496292114e-01 + <_> + + 0 -1 1257 -2.0297000184655190e-02 + + -6.8239498138427734e-01 2.0458699762821198e-01 + <_> + + 0 -1 1258 -1.7188999801874161e-02 + + -8.4939897060394287e-01 3.8433000445365906e-02 + <_> + + 0 -1 1259 -2.4215999990701675e-02 + + -1.1039420366287231e+00 1.5975099802017212e-01 + <_> + + 0 -1 1260 5.6869000196456909e-02 + + -1.9595299661159515e-01 1.1806850433349609e+00 + <_> + + 0 -1 1261 3.6199999158270657e-04 + + -4.0847799181938171e-01 3.2938599586486816e-01 + <_> + + 0 -1 1262 9.9790003150701523e-03 + + -2.9673001170158386e-01 4.1547900438308716e-01 + <_> + + 0 -1 1263 -5.2625000476837158e-02 + + -1.3069299459457397e+00 1.7862600088119507e-01 + <_> + + 0 -1 1264 -1.3748999685049057e-02 + + 2.3665800690650940e-01 -4.4536599516868591e-01 + <_> + + 0 -1 1265 -3.0517000705003738e-02 + + 2.9018300771713257e-01 -1.1210100352764130e-01 + <_> + + 0 -1 1266 -3.0037501454353333e-01 + + -2.4237680435180664e+00 -4.2830999940633774e-02 + <_> + + 0 -1 1267 -3.5990998148918152e-02 + + 8.8206499814987183e-01 -4.7012999653816223e-02 + <_> + + 0 -1 1268 -5.5112000554800034e-02 + + 8.0119001865386963e-01 -2.0490999519824982e-01 + <_> + + 0 -1 1269 3.3762000501155853e-02 + + 1.4617599546909332e-01 -1.1349489688873291e+00 + <_> + + 0 -1 1270 -8.2710003480315208e-03 + + -8.1604897975921631e-01 1.8988000229001045e-02 + <_> + + 0 -1 1271 -5.4399999789893627e-03 + + -7.0980900526046753e-01 2.2343699634075165e-01 + <_> + + 0 -1 1272 3.1059999018907547e-03 + + -7.2808599472045898e-01 4.0224999189376831e-02 + <_> + + 0 -1 1273 5.3651999682188034e-02 + + 1.7170900106430054e-01 -1.1163710355758667e+00 + <_> + + 0 -1 1274 -1.2541399896144867e-01 + + 2.7680370807647705e+00 -1.4611500501632690e-01 + <_> + + 0 -1 1275 9.2542000114917755e-02 + + 1.1609800159931183e-01 -3.9635529518127441e+00 + <_> + + 0 -1 1276 3.8513999432325363e-02 + + -7.6399999670684338e-03 -9.8780900239944458e-01 + <_> + + 0 -1 1277 -2.0200000144541264e-03 + + 2.3059999942779541e-01 -7.4970299005508423e-01 + <_> + + 0 -1 1278 9.7599998116493225e-03 + + -3.1137999892234802e-01 3.0287799239158630e-01 + <_> + + 0 -1 1279 2.4095000699162483e-02 + + -4.9529999494552612e-02 5.2690100669860840e-01 + <_> + + 0 -1 1280 -1.7982000485062599e-02 + + -1.1610640287399292e+00 -5.7000000961124897e-03 + <_> + + 0 -1 1281 -1.0555000044405460e-02 + + -2.7189099788665771e-01 2.3597699403762817e-01 + <_> + + 0 -1 1282 -7.2889998555183411e-03 + + -5.4219102859497070e-01 8.1914000213146210e-02 + <_> + + 0 -1 1283 2.3939000442624092e-02 + + 1.7975799739360809e-01 -6.7049497365951538e-01 + <_> + + 0 -1 1284 -1.8365999683737755e-02 + + 6.2664300203323364e-01 -2.0970100164413452e-01 + <_> + + 0 -1 1285 1.5715999528765678e-02 + + 2.4193699657917023e-01 -1.0444309711456299e+00 + <_> + + 0 -1 1286 -4.8804000020027161e-02 + + -9.4060599803924561e-01 -3.7519999314099550e-03 + <_> + + 0 -1 1287 6.7130001261830330e-03 + + -7.5432002544403076e-02 6.1575299501419067e-01 + <_> + + 0 -1 1288 9.7770001739263535e-03 + + 3.9285000413656235e-02 -8.4810298681259155e-01 + <_> + + 0 -1 1289 1.4744999818503857e-02 + + 1.6968999803066254e-01 -5.0906401872634888e-01 + <_> + + 0 -1 1290 9.7079001367092133e-02 + + -3.3103000372648239e-02 -1.2706379890441895e+00 + <_> + + 0 -1 1291 4.8285998404026031e-02 + + 9.4329997897148132e-02 2.7203190326690674e+00 + <_> + + 0 -1 1292 9.7810002043843269e-03 + + -3.9533400535583496e-01 1.5363800525665283e-01 + <_> + + 0 -1 1293 -3.9893999695777893e-02 + + -2.2767400741577148e-01 1.3913999497890472e-01 + <_> + + 0 -1 1294 2.2848000749945641e-02 + + -2.7391999959945679e-01 3.4199500083923340e-01 + <_> + + 0 -1 1295 6.7179999314248562e-03 + + -1.0874299705028534e-01 4.8125401139259338e-01 + <_> + + 0 -1 1296 5.9599999338388443e-02 + + -4.9522001296281815e-02 -2.0117089748382568e+00 + <_> + + 0 -1 1297 6.9340001791715622e-03 + + 1.5037499368190765e-01 -1.1271899938583374e-01 + <_> + + 0 -1 1298 1.5757000073790550e-02 + + -2.0885000005364418e-02 -1.1651979684829712e+00 + <_> + + 0 -1 1299 -4.9690000712871552e-02 + + -8.0213499069213867e-01 1.4372299611568451e-01 + <_> + + 0 -1 1300 5.2347000688314438e-02 + + -2.0836700499057770e-01 6.1677598953247070e-01 + <_> + + 0 -1 1301 2.2430999204516411e-02 + + 2.0305900275707245e-01 -7.5326198339462280e-01 + <_> + + 0 -1 1302 4.1142001748085022e-02 + + -1.8118199706077576e-01 1.0033359527587891e+00 + <_> + + 0 -1 1303 -2.1632000803947449e-02 + + 4.9998998641967773e-01 -3.4662999212741852e-02 + <_> + + 0 -1 1304 -8.2808002829551697e-02 + + 1.1711900234222412e+00 -1.8433600664138794e-01 + <_> + + 0 -1 1305 8.5060000419616699e-03 + + -6.3225001096725464e-02 2.9024899005889893e-01 + <_> + + 0 -1 1306 7.8905001282691956e-02 + + -2.3274500668048859e-01 5.9695798158645630e-01 + <_> + + 0 -1 1307 -9.0207003057003021e-02 + + -8.2211899757385254e-01 1.7772200703620911e-01 + <_> + + 0 -1 1308 -2.9269000515341759e-02 + + 6.0860699415206909e-01 -2.1468900144100189e-01 + <_> + + 0 -1 1309 6.9499998353421688e-03 + + -4.2665999382734299e-02 6.0512101650238037e-01 + <_> + + 0 -1 1310 -8.0629996955394745e-03 + + -1.1508270502090454e+00 -2.7286000549793243e-02 + <_> + + 0 -1 1311 1.9595999270677567e-02 + + -9.1880001127719879e-03 5.6857800483703613e-01 + <_> + + 0 -1 1312 -1.4884999953210354e-02 + + 3.7658798694610596e-01 -2.7149501442909241e-01 + <_> + + 0 -1 1313 2.5217000395059586e-02 + + -9.9991001188755035e-02 2.4664700031280518e-01 + <_> + + 0 -1 1314 -1.5855999663472176e-02 + + 6.6826701164245605e-01 -2.0614700019359589e-01 + <_> + + 0 -1 1315 2.9441000893712044e-02 + + 1.5832200646400452e-01 -7.6060897111892700e-01 + <_> + + 0 -1 1316 -8.5279997438192368e-03 + + 3.8212299346923828e-01 -2.5407800078392029e-01 + <_> + + 0 -1 1317 2.4421999230980873e-02 + + 1.5105099976062775e-01 -2.8752899169921875e-01 + <_> + + 0 -1 1318 -3.3886998891830444e-02 + + -6.8002802133560181e-01 3.4327000379562378e-02 + <_> + + 0 -1 1319 -2.0810000132769346e-03 + + 2.5413900613784790e-01 -2.6859098672866821e-01 + <_> + + 0 -1 1320 3.0358999967575073e-02 + + -3.0842000618577003e-02 -1.1476809978485107e+00 + <_> + + 0 -1 1321 4.0210001170635223e-03 + + -3.5253798961639404e-01 2.9868099093437195e-01 + <_> + + 0 -1 1322 2.7681000530719757e-02 + + -3.8148999214172363e-02 -1.3262039422988892e+00 + <_> + + 0 -1 1323 7.9039996489882469e-03 + + -2.3737000301480293e-02 7.0503002405166626e-01 + <_> + + 0 -1 1324 4.4031001627445221e-02 + + 1.0674899816513062e-01 -4.5261201262474060e-01 + <_> + + 0 -1 1325 -3.2370999455451965e-02 + + 4.6674901247024536e-01 -6.1546999961137772e-02 + <_> + + 0 -1 1326 2.0933000370860100e-02 + + -2.8447899222373962e-01 4.3845599889755249e-01 + <_> + + 0 -1 1327 2.5227999314665794e-02 + + -2.2537000477313995e-02 7.0389097929000854e-01 + <_> + + 0 -1 1328 6.5520000644028187e-03 + + -3.2554900646209717e-01 2.4023699760437012e-01 + <_> + + 0 -1 1329 -5.8557998389005661e-02 + + -1.2227720022201538e+00 1.1668799817562103e-01 + <_> + + 0 -1 1330 3.1899999827146530e-02 + + -1.9305000081658363e-02 -1.0973169803619385e+00 + <_> + + 0 -1 1331 -3.0445000156760216e-02 + + 6.5582501888275146e-01 7.5090996921062469e-02 + <_> + + 0 -1 1332 1.4933000318706036e-02 + + -5.2155798673629761e-01 1.1523099988698959e-01 + <_> + + 0 -1 1333 -4.9008000642061234e-02 + + -7.8303998708724976e-01 1.6657200455665588e-01 + <_> + + 0 -1 1334 8.3158999681472778e-02 + + -2.6879999786615372e-03 -8.5282301902770996e-01 + <_> + + 0 -1 1335 2.3902999237179756e-02 + + -5.1010999828577042e-02 4.1999098658561707e-01 + <_> + + 0 -1 1336 1.6428999602794647e-02 + + 1.9232999533414841e-02 -6.5049099922180176e-01 + <_> + + 0 -1 1337 -1.1838000267744064e-02 + + -6.2409800291061401e-01 1.5411199629306793e-01 + <_> + + 0 -1 1338 -1.6799999866634607e-04 + + 1.7589199542999268e-01 -3.4338700771331787e-01 + <_> + + 0 -1 1339 1.9193999469280243e-02 + + 4.3418999761343002e-02 7.9069197177886963e-01 + <_> + + 0 -1 1340 -1.0032000020146370e-02 + + 4.5648899674415588e-01 -2.2494800388813019e-01 + <_> + + 0 -1 1341 -1.4004000462591648e-02 + + 3.3570998907089233e-01 -4.8799999058246613e-03 + <_> + + 0 -1 1342 -1.0319899767637253e-01 + + -2.3378000259399414e+00 -5.8933001011610031e-02 + <_> + + 0 -1 1343 -9.5697000622749329e-02 + + -6.6153901815414429e-01 2.0098599791526794e-01 + <_> + + 0 -1 1344 -4.1480999439954758e-02 + + 4.5939201116561890e-01 -2.2314099967479706e-01 + <_> + + 0 -1 1345 2.4099999573081732e-03 + + -2.6898598670959473e-01 2.4922999739646912e-01 + <_> + + 0 -1 1346 1.0724999755620956e-01 + + -1.8640199303627014e-01 7.2769802808761597e-01 + <_> + + 0 -1 1347 3.1870000530034304e-03 + + -2.4608999490737915e-02 2.8643900156021118e-01 + <_> + + 0 -1 1348 2.9167000204324722e-02 + + -3.4683000296354294e-02 -1.1162580251693726e+00 + <_> + + 0 -1 1349 1.1287000030279160e-02 + + 6.3760001212358475e-03 6.6632097959518433e-01 + <_> + + 0 -1 1350 -1.2001000344753265e-02 + + 4.2420101165771484e-01 -2.6279801130294800e-01 + <_> + + 0 -1 1351 -1.2695999816060066e-02 + + -2.1957000717520714e-02 1.8936799466609955e-01 + <_> + + 0 -1 1352 2.4597000330686569e-02 + + -3.4963998943567276e-02 -1.0989320278167725e+00 + <_> + + 0 -1 1353 4.5953001827001572e-02 + + 1.1109799891710281e-01 -2.9306049346923828e+00 + <_> + + 0 -1 1354 -2.7241000905632973e-02 + + 2.9101699590682983e-01 -2.7407899498939514e-01 + <_> + + 0 -1 1355 4.0063999593257904e-02 + + 1.1877900362014771e-01 -6.2801802158355713e-01 + <_> + + 0 -1 1356 2.3055000230669975e-02 + + 1.4813800156116486e-01 -3.7007498741149902e-01 + <_> + + 0 -1 1357 -2.3737000301480293e-02 + + -5.3724801540374756e-01 1.9358199834823608e-01 + <_> + + 0 -1 1358 7.7522002160549164e-02 + + -6.0194000601768494e-02 -1.9489669799804688e+00 + <_> + + 0 -1 1359 -1.3345000334084034e-02 + + -4.5229598879814148e-01 1.8741500377655029e-01 + <_> + + 0 -1 1360 -2.1719999611377716e-02 + + 1.2144249677658081e+00 -1.5365800261497498e-01 + <_> + + 0 -1 1361 -7.1474999189376831e-02 + + -2.3047130107879639e+00 1.0999900102615356e-01 + <_> + + 0 -1 1362 -5.4999999701976776e-03 + + -7.1855199337005615e-01 2.0100999623537064e-02 + <_> + + 0 -1 1363 2.6740999892354012e-02 + + 7.3545001447200775e-02 9.8786002397537231e-01 + <_> + + 0 -1 1364 -3.9407998323440552e-02 + + -1.2227380275726318e+00 -4.3506998568773270e-02 + <_> + + 0 -1 1365 2.5888999924063683e-02 + + 1.3409300148487091e-01 -1.1770780086517334e+00 + <_> + + 0 -1 1366 4.8925001174211502e-02 + + -3.0810000374913216e-02 -9.3479502201080322e-01 + <_> + + 0 -1 1367 3.6892998963594437e-02 + + 1.3333700597286224e-01 -1.4998290538787842e+00 + <_> + + 0 -1 1368 7.8929997980594635e-02 + + -1.4538800716400146e-01 1.5631790161132812e+00 + <_> + + 0 -1 1369 2.9006000608205795e-02 + + 1.9383700191974640e-01 -6.7642802000045776e-01 + <_> + + 0 -1 1370 6.3089998438954353e-03 + + -3.7465399503707886e-01 1.0857500135898590e-01 + <_> + + 0 -1 1371 -6.5830998122692108e-02 + + 8.1059402227401733e-01 3.0201999470591545e-02 + <_> + + 0 -1 1372 -6.8965002894401550e-02 + + 8.3772599697113037e-01 -1.7140999436378479e-01 + <_> + + 0 -1 1373 -1.1669100075960159e-01 + + -9.4647198915481567e-01 1.3123199343681335e-01 + <_> + + 0 -1 1374 -1.3060000492259860e-03 + + 4.6007998287677765e-02 -5.2011597156524658e-01 + <_> + + 0 -1 1375 -4.4558998197317123e-02 + + -1.9423669576644897e+00 1.3200700283050537e-01 + <_> + + 0 -1 1376 5.1033001393079758e-02 + + -2.1480999886989594e-01 4.8673900961875916e-01 + <_> + + 0 -1 1377 -3.1578000634908676e-02 + + 5.9989798069000244e-01 7.9159997403621674e-03 + <_> + + 0 -1 1378 2.1020000800490379e-02 + + -2.2069500386714935e-01 5.4046201705932617e-01 + <_> + + 0 -1 1379 -1.3824200630187988e-01 + + 6.2957501411437988e-01 -2.1712999790906906e-02 + <_> + + 0 -1 1380 5.2228998392820358e-02 + + -2.3360900580883026e-01 4.9760800600051880e-01 + <_> + + 0 -1 1381 2.5884000584483147e-02 + + 1.8041999638080597e-01 -2.2039200365543365e-01 + <_> + + 0 -1 1382 -1.2138999998569489e-02 + + -6.9731897115707397e-01 1.5712000429630280e-02 + <_> + + 0 -1 1383 -2.4237999692559242e-02 + + 3.4593299031257629e-01 7.1469999849796295e-02 + <_> + + 0 -1 1384 -2.5272000581026077e-02 + + -8.7583297491073608e-01 -9.8240002989768982e-03 + <_> + + 0 -1 1385 1.2597000226378441e-02 + + 2.3649999499320984e-01 -2.8731200098991394e-01 + <_> + + 0 -1 1386 5.7330999523401260e-02 + + -6.1530999839305878e-02 -2.2326040267944336e+00 + <_> + + 0 -1 1387 1.6671000048518181e-02 + + -1.9850100576877594e-01 4.0810701251029968e-01 + <_> + + 0 -1 1388 -2.2818999364972115e-02 + + 9.6487599611282349e-01 -2.0245699584484100e-01 + <_> + + 0 -1 1389 3.7000001611886546e-05 + + -5.8908998966217041e-02 2.7055400609970093e-01 + <_> + + 0 -1 1390 -7.6700001955032349e-03 + + -4.5317101478576660e-01 8.9628003537654877e-02 + <_> + + 0 -1 1391 9.4085998833179474e-02 + + 1.1604599654674530e-01 -1.0951169729232788e+00 + <_> + + 0 -1 1392 -6.2267001718282700e-02 + + 1.8096530437469482e+00 -1.4773200452327728e-01 + <_> + + 0 -1 1393 1.7416000366210938e-02 + + 2.3068200051784515e-01 -4.2417600750923157e-01 + <_> + + 0 -1 1394 -2.2066000849008560e-02 + + 4.9270299077033997e-01 -2.0630900561809540e-01 + <_> + + 0 -1 1395 -1.0404000058770180e-02 + + 6.0924297571182251e-01 2.8130000457167625e-02 + <_> + + 0 -1 1396 -9.3670003116130829e-03 + + 4.0171200037002563e-01 -2.1681700646877289e-01 + <_> + + 0 -1 1397 -2.9039999470114708e-02 + + -8.4876501560211182e-01 1.4246800541877747e-01 + <_> + + 0 -1 1398 -2.1061999723315239e-02 + + -7.9198300838470459e-01 -1.2595999985933304e-02 + <_> + + 0 -1 1399 -3.7000998854637146e-02 + + -6.7488902807235718e-01 1.2830400466918945e-01 + <_> + + 0 -1 1400 1.0735999792814255e-02 + + 3.6779999732971191e-02 -6.3393002748489380e-01 + <_> + + 0 -1 1401 1.6367599368095398e-01 + + 1.3803899288177490e-01 -4.7189000248908997e-01 + <_> + + 0 -1 1402 9.4917997717857361e-02 + + -1.3855700194835663e-01 1.9492419958114624e+00 + <_> + + 0 -1 1403 3.5261999815702438e-02 + + 1.3721899688243866e-01 -2.1186530590057373e+00 + <_> + + 0 -1 1404 1.2811000458896160e-02 + + -2.0008100569248199e-01 4.9507799744606018e-01 + <_> + 155 + -3.3933560848236084e+00 + + <_> + + 0 -1 1405 1.3904400169849396e-01 + + -4.6581199765205383e-01 7.6431602239608765e-01 + <_> + + 0 -1 1406 1.1916999705135822e-02 + + -9.4398999214172363e-01 3.9726299047470093e-01 + <_> + + 0 -1 1407 -1.0006999596953392e-02 + + 3.2718798518180847e-01 -6.3367402553558350e-01 + <_> + + 0 -1 1408 -6.0479999519884586e-03 + + 2.7427899837493896e-01 -5.7446998357772827e-01 + <_> + + 0 -1 1409 -1.2489999644458294e-03 + + 2.3629300296306610e-01 -6.8593502044677734e-01 + <_> + + 0 -1 1410 3.2382000237703323e-02 + + -5.7630199193954468e-01 2.7492699027061462e-01 + <_> + + 0 -1 1411 -1.3957999646663666e-02 + + -6.1061501502990723e-01 2.4541600048542023e-01 + <_> + + 0 -1 1412 1.1159999994561076e-03 + + -5.6539100408554077e-01 2.7179300785064697e-01 + <_> + + 0 -1 1413 2.7000000045518391e-05 + + -8.0235999822616577e-01 1.1509100347757339e-01 + <_> + + 0 -1 1414 -2.5700000696815550e-04 + + -8.1205898523330688e-01 2.3844699561595917e-01 + <_> + + 0 -1 1415 4.0460000745952129e-03 + + 1.3909600675106049e-01 -6.6163200139999390e-01 + <_> + + 0 -1 1416 1.4356000348925591e-02 + + -1.6485199332237244e-01 4.1901698708534241e-01 + <_> + + 0 -1 1417 -5.5374998599290848e-02 + + 1.4425870180130005e+00 -1.8820199370384216e-01 + <_> + + 0 -1 1418 9.3594998121261597e-02 + + 1.3548299670219421e-01 -9.1636097431182861e-01 + <_> + + 0 -1 1419 2.6624999940395355e-02 + + -3.3748298883438110e-01 3.9233601093292236e-01 + <_> + + 0 -1 1420 3.7469998933374882e-03 + + -1.1615400016307831e-01 4.4399300217628479e-01 + <_> + + 0 -1 1421 -3.1886000186204910e-02 + + -9.9498301744461060e-01 1.6120000509545207e-03 + <_> + + 0 -1 1422 -2.2600000724196434e-02 + + -4.8067399859428406e-01 1.7007300257682800e-01 + <_> + + 0 -1 1423 2.5202000513672829e-02 + + 3.5580001771450043e-02 -8.0215400457382202e-01 + <_> + + 0 -1 1424 -3.1036999076604843e-02 + + -1.0895340442657471e+00 1.8081900477409363e-01 + <_> + + 0 -1 1425 -2.6475999504327774e-02 + + 9.5671200752258301e-01 -2.1049399673938751e-01 + <_> + + 0 -1 1426 -1.3853999786078930e-02 + + -1.0370320081710815e+00 2.2166700661182404e-01 + <_> + + 0 -1 1427 -6.2925003468990326e-02 + + 9.0199398994445801e-01 -1.9085299968719482e-01 + <_> + + 0 -1 1428 -4.4750999659299850e-02 + + -1.0119110345840454e+00 1.4691199362277985e-01 + <_> + + 0 -1 1429 -2.0428000018000603e-02 + + 6.1624497175216675e-01 -2.3552699387073517e-01 + <_> + + 0 -1 1430 -8.0329999327659607e-03 + + -8.3279997110366821e-02 2.1728700399398804e-01 + <_> + + 0 -1 1431 8.7280003353953362e-03 + + 6.5458998084068298e-02 -6.0318702459335327e-01 + <_> + + 0 -1 1432 -2.7202000841498375e-02 + + -9.3447399139404297e-01 1.5270000696182251e-01 + <_> + + 0 -1 1433 -1.6471000388264656e-02 + + -8.4177100658416748e-01 1.3332000002264977e-02 + <_> + + 0 -1 1434 -1.3744000345468521e-02 + + 6.0567200183868408e-01 -9.2021003365516663e-02 + <_> + + 0 -1 1435 2.9164999723434448e-02 + + -2.8114000335335732e-02 -1.4014569520950317e+00 + <_> + + 0 -1 1436 3.7457000464200974e-02 + + 1.3080599904060364e-01 -4.9382498860359192e-01 + <_> + + 0 -1 1437 -2.5070000439882278e-02 + + -1.1289390325546265e+00 -1.4600000344216824e-02 + <_> + + 0 -1 1438 -6.3812002539634705e-02 + + 7.5871598720550537e-01 -1.8200000049546361e-03 + <_> + + 0 -1 1439 -9.3900002539157867e-03 + + 2.9936400055885315e-01 -2.9487800598144531e-01 + <_> + + 0 -1 1440 -7.6000002445653081e-04 + + 1.9725000485777855e-02 1.9993899762630463e-01 + <_> + + 0 -1 1441 -2.1740999072790146e-02 + + -8.5247898101806641e-01 4.9169998615980148e-02 + <_> + + 0 -1 1442 -1.7869999632239342e-02 + + -5.9985999017953873e-02 1.5222500264644623e-01 + <_> + + 0 -1 1443 -2.4831000715494156e-02 + + 3.5603401064872742e-01 -2.6259899139404297e-01 + <_> + + 0 -1 1444 1.5715500712394714e-01 + + 1.5599999460391700e-04 1.0428730249404907e+00 + <_> + + 0 -1 1445 6.9026999175548553e-02 + + -3.3006999641656876e-02 -1.1796669960021973e+00 + <_> + + 0 -1 1446 -1.1021999642252922e-02 + + 5.8987700939178467e-01 -5.7647999376058578e-02 + <_> + + 0 -1 1447 -1.3834999874234200e-02 + + 5.9502798318862915e-01 -2.4418599903583527e-01 + <_> + + 0 -1 1448 -3.0941000208258629e-02 + + -1.1723799705505371e+00 1.6907000541687012e-01 + <_> + + 0 -1 1449 2.1258000284433365e-02 + + -1.8900999799370766e-02 -1.0684759616851807e+00 + <_> + + 0 -1 1450 9.3079999089241028e-02 + + 1.6305600106716156e-01 -1.3375270366668701e+00 + <_> + + 0 -1 1451 2.9635999351739883e-02 + + -2.2524799406528473e-01 4.5400100946426392e-01 + <_> + + 0 -1 1452 -1.2199999764561653e-04 + + 2.7409100532531738e-01 -3.7371399998664856e-01 + <_> + + 0 -1 1453 -4.2098000645637512e-02 + + -7.5828802585601807e-01 1.7137000337243080e-02 + <_> + + 0 -1 1454 -2.2505000233650208e-02 + + -2.2759300470352173e-01 2.3698699474334717e-01 + <_> + + 0 -1 1455 -1.2862999923527241e-02 + + 1.9252400100231171e-01 -3.2127100229263306e-01 + <_> + + 0 -1 1456 2.7860000729560852e-02 + + 1.6723699867725372e-01 -1.0209059715270996e+00 + <_> + + 0 -1 1457 -2.7807999402284622e-02 + + 1.2824759483337402e+00 -1.7225299775600433e-01 + <_> + + 0 -1 1458 -6.1630001291632652e-03 + + -5.4072898626327515e-01 2.3885700106620789e-01 + <_> + + 0 -1 1459 -2.0436000078916550e-02 + + 6.3355398178100586e-01 -2.1090599894523621e-01 + <_> + + 0 -1 1460 -1.2307999655604362e-02 + + -4.9778199195861816e-01 1.7402599751949310e-01 + <_> + + 0 -1 1461 -4.0493998676538467e-02 + + -1.1848740577697754e+00 -3.3890999853610992e-02 + <_> + + 0 -1 1462 2.9657000675797462e-02 + + 2.1740999072790146e-02 1.0069919824600220e+00 + <_> + + 0 -1 1463 6.8379999138414860e-03 + + 2.9217999428510666e-02 -5.9906297922134399e-01 + <_> + + 0 -1 1464 1.6164999455213547e-02 + + -2.1000799536705017e-01 3.7637299299240112e-01 + <_> + + 0 -1 1465 5.0193000584840775e-02 + + 2.5319999549537897e-03 -7.1668201684951782e-01 + <_> + + 0 -1 1466 1.9680000841617584e-03 + + -2.1921400725841522e-01 3.2298699021339417e-01 + <_> + + 0 -1 1467 2.4979999288916588e-02 + + -9.6840001642704010e-03 -7.7572900056838989e-01 + <_> + + 0 -1 1468 -1.5809999778866768e-02 + + 4.4637501239776611e-01 -6.1760000884532928e-02 + <_> + + 0 -1 1469 3.7206999957561493e-02 + + -2.0495399832725525e-01 5.7722198963165283e-01 + <_> + + 0 -1 1470 -7.9264998435974121e-02 + + -7.6745402812957764e-01 1.2550400197505951e-01 + <_> + + 0 -1 1471 -1.7152000218629837e-02 + + -1.4121830463409424e+00 -5.1704000681638718e-02 + <_> + + 0 -1 1472 3.2740000635385513e-02 + + 1.9334000349044800e-01 -6.3633698225021362e-01 + <_> + + 0 -1 1473 -1.1756999790668488e-01 + + 8.4325402975082397e-01 -1.8018600344657898e-01 + <_> + + 0 -1 1474 1.2057200074195862e-01 + + 1.2530000507831573e-01 -2.1213600635528564e+00 + <_> + + 0 -1 1475 4.2779999785125256e-03 + + -4.6604400873184204e-01 8.9643999934196472e-02 + <_> + + 0 -1 1476 -7.2544999420642853e-02 + + 5.1826500892639160e-01 1.6823999583721161e-02 + <_> + + 0 -1 1477 1.7710599303245544e-01 + + -3.0910000205039978e-02 -1.1046639680862427e+00 + <_> + + 0 -1 1478 8.4229996427893639e-03 + + 2.4445800483226776e-01 -3.8613098859786987e-01 + <_> + + 0 -1 1479 -1.3035000301897526e-02 + + 9.8004400730133057e-01 -1.7016500234603882e-01 + <_> + + 0 -1 1480 1.8912000581622124e-02 + + 2.0248499512672424e-01 -3.8545900583267212e-01 + <_> + + 0 -1 1481 2.1447999402880669e-02 + + -2.5717198848724365e-01 3.5181200504302979e-01 + <_> + + 0 -1 1482 6.3357003033161163e-02 + + 1.6994799673557281e-01 -9.1383802890777588e-01 + <_> + + 0 -1 1483 -3.2435998320579529e-02 + + -8.5681599378585815e-01 -2.1680999547243118e-02 + <_> + + 0 -1 1484 -2.3564999923110008e-02 + + 5.6115597486495972e-01 -2.2400000307243317e-04 + <_> + + 0 -1 1485 1.8789000809192657e-02 + + -2.5459799170494080e-01 3.4512901306152344e-01 + <_> + + 0 -1 1486 3.1042000278830528e-02 + + 7.5719999149441719e-03 3.4800198674201965e-01 + <_> + + 0 -1 1487 -1.1226999573409557e-02 + + -6.0219800472259521e-01 4.2814999818801880e-02 + <_> + + 0 -1 1488 -1.2845999561250210e-02 + + 4.2020401358604431e-01 -5.3801000118255615e-02 + <_> + + 0 -1 1489 -1.2791999615728855e-02 + + 2.2724500298500061e-01 -3.2398000359535217e-01 + <_> + + 0 -1 1490 6.8651996552944183e-02 + + 9.3532003462314606e-02 10. + <_> + + 0 -1 1491 5.2789999172091484e-03 + + -2.6926299929618835e-01 3.3303201198577881e-01 + <_> + + 0 -1 1492 -3.8779001682996750e-02 + + -7.2365301847457886e-01 1.7806500196456909e-01 + <_> + + 0 -1 1493 6.1820000410079956e-03 + + -3.5119399428367615e-01 1.6586300730705261e-01 + <_> + + 0 -1 1494 1.7515200376510620e-01 + + 1.1623100191354752e-01 -1.5419290065765381e+00 + <_> + + 0 -1 1495 1.1627999693155289e-01 + + -9.1479998081922531e-03 -9.9842602014541626e-01 + <_> + + 0 -1 1496 -2.2964000701904297e-02 + + 2.0565399527549744e-01 1.5432000160217285e-02 + <_> + + 0 -1 1497 -5.1410000771284103e-02 + + 5.8072400093078613e-01 -2.0118400454521179e-01 + <_> + + 0 -1 1498 2.2474199533462524e-01 + + 1.8728999421000481e-02 1.0829299688339233e+00 + <_> + + 0 -1 1499 9.4860000535845757e-03 + + -3.3171299099922180e-01 1.9902999699115753e-01 + <_> + + 0 -1 1500 -1.1846300214529037e-01 + + 1.3711010217666626e+00 6.8926997482776642e-02 + <_> + + 0 -1 1501 3.7810999900102615e-02 + + -9.3600002583116293e-04 -8.3996999263763428e-01 + <_> + + 0 -1 1502 2.2202000021934509e-02 + + -1.1963999830186367e-02 3.6673998832702637e-01 + <_> + + 0 -1 1503 -3.6366000771522522e-02 + + 3.7866500020027161e-01 -2.7714800834655762e-01 + <_> + + 0 -1 1504 -1.3184699416160583e-01 + + -2.7481179237365723e+00 1.0666900128126144e-01 + <_> + + 0 -1 1505 -4.1655998677015305e-02 + + 4.7524300217628479e-01 -2.3249800503253937e-01 + <_> + + 0 -1 1506 -3.3151999115943909e-02 + + -5.7929402589797974e-01 1.7434400320053101e-01 + <_> + + 0 -1 1507 1.5769999474287033e-02 + + -1.1284000240266323e-02 -8.3701401948928833e-01 + <_> + + 0 -1 1508 -3.9363000541925430e-02 + + 3.4821599721908569e-01 -1.7455400526523590e-01 + <_> + + 0 -1 1509 -6.7849002778530121e-02 + + 1.4225699901580811e+00 -1.4765599370002747e-01 + <_> + + 0 -1 1510 -2.6775000616908073e-02 + + 2.3947000503540039e-01 1.3271999545395374e-02 + <_> + + 0 -1 1511 3.9919000118970871e-02 + + -8.9999996125698090e-03 -7.5938898324966431e-01 + <_> + + 0 -1 1512 1.0065600275993347e-01 + + -1.8685000017285347e-02 7.6245301961898804e-01 + <_> + + 0 -1 1513 -8.1022001802921295e-02 + + -9.0439099073410034e-01 -8.5880002006888390e-03 + <_> + + 0 -1 1514 -2.1258000284433365e-02 + + -2.1319599449634552e-01 2.1919700503349304e-01 + <_> + + 0 -1 1515 -1.0630999691784382e-02 + + 1.9598099589347839e-01 -3.5768100619316101e-01 + <_> + + 0 -1 1516 8.1300002057105303e-04 + + -9.2794999480247498e-02 2.6145899295806885e-01 + <_> + + 0 -1 1517 3.4650000743567944e-03 + + -5.5336099863052368e-01 2.7386000379920006e-02 + <_> + + 0 -1 1518 1.8835999071598053e-02 + + 1.8446099758148193e-01 -6.6934299468994141e-01 + <_> + + 0 -1 1519 -2.5631999596953392e-02 + + 1.9382879734039307e+00 -1.4708900451660156e-01 + <_> + + 0 -1 1520 -4.0939999744296074e-03 + + -2.6451599597930908e-01 2.0733200013637543e-01 + <_> + + 0 -1 1521 -8.9199998183175921e-04 + + -5.5031597614288330e-01 5.0374999642372131e-02 + <_> + + 0 -1 1522 -4.9518000334501266e-02 + + -2.5615389347076416e+00 1.3141700625419617e-01 + <_> + + 0 -1 1523 1.1680999770760536e-02 + + -2.4819800257682800e-01 3.9982700347900391e-01 + <_> + + 0 -1 1524 3.4563999623060226e-02 + + 1.6178800165653229e-01 -7.1418899297714233e-01 + <_> + + 0 -1 1525 -8.2909995689988136e-03 + + 2.2180099785327911e-01 -2.9181700944900513e-01 + <_> + + 0 -1 1526 -2.2358000278472900e-02 + + 3.1044098734855652e-01 -2.7280000504106283e-03 + <_> + + 0 -1 1527 -3.0801000073552132e-02 + + -9.5672702789306641e-01 -8.3400001749396324e-03 + <_> + + 0 -1 1528 4.3779000639915466e-02 + + 1.2556900084018707e-01 -1.1759619712829590e+00 + <_> + + 0 -1 1529 4.3046001344919205e-02 + + -5.8876998722553253e-02 -1.8568470478057861e+00 + <_> + + 0 -1 1530 2.7188999578356743e-02 + + 4.2858000844717026e-02 3.9036700129508972e-01 + <_> + + 0 -1 1531 9.4149997457861900e-03 + + -4.3567001819610596e-02 -1.1094470024108887e+00 + <_> + + 0 -1 1532 9.4311997294425964e-02 + + 4.0256999433040619e-02 9.8442298173904419e-01 + <_> + + 0 -1 1533 1.7025099694728851e-01 + + 2.9510000720620155e-02 -6.9509297609329224e-01 + <_> + + 0 -1 1534 -4.7148000448942184e-02 + + 1.0338569879531860e+00 6.7602001130580902e-02 + <_> + + 0 -1 1535 1.1186300218105316e-01 + + -6.8682998418807983e-02 -2.4985830783843994e+00 + <_> + + 0 -1 1536 -1.4353999868035316e-02 + + -5.9481900930404663e-01 1.5001699328422546e-01 + <_> + + 0 -1 1537 3.4024000167846680e-02 + + -6.4823001623153687e-02 -2.1382639408111572e+00 + <_> + + 0 -1 1538 2.1601999178528786e-02 + + 5.5309999734163284e-02 7.8292900323867798e-01 + <_> + + 0 -1 1539 2.1771999076008797e-02 + + -7.1279997937381268e-03 -7.2148102521896362e-01 + <_> + + 0 -1 1540 8.2416996359825134e-02 + + 1.4609499275684357e-01 -1.3636670112609863e+00 + <_> + + 0 -1 1541 8.4671996533870697e-02 + + -1.7784699797630310e-01 7.2857701778411865e-01 + <_> + + 0 -1 1542 -5.5128000676631927e-02 + + -5.9402400255203247e-01 1.9357800483703613e-01 + <_> + + 0 -1 1543 -6.4823001623153687e-02 + + -1.0783840417861938e+00 -4.0734000504016876e-02 + <_> + + 0 -1 1544 -2.2769000381231308e-02 + + 7.7900201082229614e-01 3.4960000775754452e-03 + <_> + + 0 -1 1545 5.4756000638008118e-02 + + -6.5683998167514801e-02 -1.8188409805297852e+00 + <_> + + 0 -1 1546 -8.9000001025851816e-05 + + -1.7891999334096909e-02 2.0768299698829651e-01 + <_> + + 0 -1 1547 9.8361998796463013e-02 + + -5.5946998298168182e-02 -1.4153920412063599e+00 + <_> + + 0 -1 1548 -7.0930002257227898e-03 + + 3.4135299921035767e-01 -1.2089899927377701e-01 + <_> + + 0 -1 1549 5.0278000533580780e-02 + + -2.6286700367927551e-01 2.5797298550605774e-01 + <_> + + 0 -1 1550 -5.7870000600814819e-03 + + -1.3178600370883942e-01 1.7350199818611145e-01 + <_> + + 0 -1 1551 1.3973999768495560e-02 + + 2.8518000617623329e-02 -6.1152201890945435e-01 + <_> + + 0 -1 1552 2.1449999883770943e-02 + + 2.6181999593973160e-02 3.0306598544120789e-01 + <_> + + 0 -1 1553 -2.9214000329375267e-02 + + 4.4940599799156189e-01 -2.2803099453449249e-01 + <_> + + 0 -1 1554 4.8099999548867345e-04 + + -1.9879999756813049e-01 2.0744499564170837e-01 + <_> + + 0 -1 1555 1.7109999898821115e-03 + + -5.4037201404571533e-01 6.7865997552871704e-02 + <_> + + 0 -1 1556 8.6660003289580345e-03 + + -1.3128000311553478e-02 5.2297902107238770e-01 + <_> + + 0 -1 1557 6.3657999038696289e-02 + + 6.8299002945423126e-02 -4.9235099554061890e-01 + <_> + + 0 -1 1558 -2.7968000620603561e-02 + + 6.8183898925781250e-01 7.8781001269817352e-02 + <_> + + 0 -1 1559 4.8953998833894730e-02 + + -2.0622399449348450e-01 5.0388097763061523e-01 + <_> + 169 + -3.2396929264068604e+00 + + <_> + + 0 -1 1560 -2.9312999919056892e-02 + + 7.1284699440002441e-01 -5.8230698108673096e-01 + <_> + + 0 -1 1561 1.2415099889039993e-01 + + -3.6863499879837036e-01 6.0067200660705566e-01 + <_> + + 0 -1 1562 7.9349996522068977e-03 + + -8.6008298397064209e-01 2.1724699437618256e-01 + <_> + + 0 -1 1563 3.0365999788045883e-02 + + -2.7186998724937439e-01 6.1247897148132324e-01 + <_> + + 0 -1 1564 2.5218000635504723e-02 + + -3.4748300909996033e-01 5.0427699089050293e-01 + <_> + + 0 -1 1565 1.0014000348746777e-02 + + -3.1898999214172363e-01 4.1376799345016479e-01 + <_> + + 0 -1 1566 -1.6775000840425491e-02 + + -6.9048100709915161e-01 9.4830997288227081e-02 + <_> + + 0 -1 1567 -2.6950000319629908e-03 + + -2.0829799771308899e-01 2.3737199604511261e-01 + <_> + + 0 -1 1568 4.2257998138666153e-02 + + -4.9366700649261475e-01 1.8170599639415741e-01 + <_> + + 0 -1 1569 -4.8505000770092010e-02 + + 1.3429640531539917e+00 3.9769001305103302e-02 + <_> + + 0 -1 1570 2.8992999345064163e-02 + + 4.6496000140905380e-02 -8.1643497943878174e-01 + <_> + + 0 -1 1571 -4.0089000016450882e-02 + + -7.1197801828384399e-01 2.2553899884223938e-01 + <_> + + 0 -1 1572 -4.1021998971700668e-02 + + 1.0057929754257202e+00 -1.9690200686454773e-01 + <_> + + 0 -1 1573 1.1838000267744064e-02 + + -1.2600000016391277e-02 8.0767101049423218e-01 + <_> + + 0 -1 1574 -2.1328000351786613e-02 + + -8.2023900747299194e-01 2.0524999126791954e-02 + <_> + + 0 -1 1575 -2.3904999718070030e-02 + + 5.4210501909255981e-01 -7.4767000973224640e-02 + <_> + + 0 -1 1576 1.8008999526500702e-02 + + -3.3827701210975647e-01 4.2358601093292236e-01 + <_> + + 0 -1 1577 -4.3614000082015991e-02 + + -1.1983489990234375e+00 1.5566200017929077e-01 + <_> + + 0 -1 1578 -9.2449998483061790e-03 + + -8.9029997587203979e-01 1.1003999970853329e-02 + <_> + + 0 -1 1579 4.7485001385211945e-02 + + 1.6664099693298340e-01 -9.0764498710632324e-01 + <_> + + 0 -1 1580 -1.4233999885618687e-02 + + 6.2695199251174927e-01 -2.5791200995445251e-01 + <_> + + 0 -1 1581 3.8010000716894865e-03 + + -2.8229999542236328e-01 2.6624599099159241e-01 + <_> + + 0 -1 1582 3.4330000635236502e-03 + + -6.3771998882293701e-01 9.8422996699810028e-02 + <_> + + 0 -1 1583 -2.9221000149846077e-02 + + -7.6769900321960449e-01 2.2634500265121460e-01 + <_> + + 0 -1 1584 -6.4949998632073402e-03 + + 4.5600101351737976e-01 -2.6528900861740112e-01 + <_> + + 0 -1 1585 -3.0034000054001808e-02 + + -7.6551097631454468e-01 1.4009299874305725e-01 + <_> + + 0 -1 1586 7.8360000625252724e-03 + + 4.6755999326705933e-02 -7.2356200218200684e-01 + <_> + + 0 -1 1587 8.8550001382827759e-03 + + -4.9141999334096909e-02 5.1472699642181396e-01 + <_> + + 0 -1 1588 9.5973998308181763e-02 + + -2.0068999379873276e-02 -1.0850950479507446e+00 + <_> + + 0 -1 1589 -3.2876998186111450e-02 + + -9.5875298976898193e-01 1.4543600380420685e-01 + <_> + + 0 -1 1590 -1.3384000398218632e-02 + + -7.0013600587844849e-01 2.9157999902963638e-02 + <_> + + 0 -1 1591 1.5235999599099159e-02 + + -2.8235700726509094e-01 2.5367999076843262e-01 + <_> + + 0 -1 1592 1.2054000049829483e-02 + + -2.5303399562835693e-01 4.6526700258255005e-01 + <_> + + 0 -1 1593 -7.6295003294944763e-02 + + -6.9915801286697388e-01 1.3217200338840485e-01 + <_> + + 0 -1 1594 -1.2040000408887863e-02 + + 4.5894598960876465e-01 -2.3856499791145325e-01 + <_> + + 0 -1 1595 2.1916000172495842e-02 + + 1.8268600106239319e-01 -6.1629700660705566e-01 + <_> + + 0 -1 1596 -2.7330000884830952e-03 + + -6.3257902860641479e-01 3.4219000488519669e-02 + <_> + + 0 -1 1597 -4.8652000725269318e-02 + + -1.0297729969024658e+00 1.7386500537395477e-01 + <_> + + 0 -1 1598 -1.0463999584317207e-02 + + 3.4757301211357117e-01 -2.7464100718498230e-01 + <_> + + 0 -1 1599 -6.6550001502037048e-03 + + -2.8980299830436707e-01 2.4037900567054749e-01 + <_> + + 0 -1 1600 8.5469996556639671e-03 + + -4.4340500235557556e-01 1.4267399907112122e-01 + <_> + + 0 -1 1601 1.9913999363780022e-02 + + 1.7740400135517120e-01 -2.4096299707889557e-01 + <_> + + 0 -1 1602 2.2012999281287193e-02 + + -1.0812000371515751e-02 -9.4690799713134766e-01 + <_> + + 0 -1 1603 -5.2179001271724701e-02 + + 1.6547499895095825e+00 9.6487000584602356e-02 + <_> + + 0 -1 1604 1.9698999822139740e-02 + + -6.7560002207756042e-03 -8.6311501264572144e-01 + <_> + + 0 -1 1605 2.3040000349283218e-02 + + -2.3519999813288450e-03 3.8531300425529480e-01 + <_> + + 0 -1 1606 -1.5038000419735909e-02 + + -6.1905699968338013e-01 3.1077999621629715e-02 + <_> + + 0 -1 1607 -4.9956001341342926e-02 + + 7.0657497644424438e-01 4.7880999743938446e-02 + <_> + + 0 -1 1608 -6.9269999861717224e-02 + + 3.9212900400161743e-01 -2.3848000168800354e-01 + <_> + + 0 -1 1609 4.7399997711181641e-03 + + -2.4309000000357628e-02 2.5386300683021545e-01 + <_> + + 0 -1 1610 -3.3923998475074768e-02 + + 4.6930399537086487e-01 -2.3321899771690369e-01 + <_> + + 0 -1 1611 -1.6231000423431396e-02 + + 3.2319200038909912e-01 -2.0545600354671478e-01 + <_> + + 0 -1 1612 -5.0193000584840775e-02 + + -1.2277870178222656e+00 -4.0798000991344452e-02 + <_> + + 0 -1 1613 5.6944001466035843e-02 + + 4.5184001326560974e-02 6.0197502374649048e-01 + <_> + + 0 -1 1614 4.0936999022960663e-02 + + -1.6772800683975220e-01 8.9819300174713135e-01 + <_> + + 0 -1 1615 -3.0839999672025442e-03 + + 3.3716198801994324e-01 -2.7240800857543945e-01 + <_> + + 0 -1 1616 -3.2600000500679016e-02 + + -8.5446500778198242e-01 1.9664999097585678e-02 + <_> + + 0 -1 1617 9.8480999469757080e-02 + + 5.4742000997066498e-02 6.3827300071716309e-01 + <_> + + 0 -1 1618 -3.8185000419616699e-02 + + 5.2274698019027710e-01 -2.3384800553321838e-01 + <_> + + 0 -1 1619 -4.5917000621557236e-02 + + 6.2829202413558960e-01 3.2859001308679581e-02 + <_> + + 0 -1 1620 -1.1955499649047852e-01 + + -6.1572700738906860e-01 3.4680001437664032e-02 + <_> + + 0 -1 1621 -1.2044399976730347e-01 + + -8.4380000829696655e-01 1.6530700027942657e-01 + <_> + + 0 -1 1622 7.0619001984596252e-02 + + -6.3261002302169800e-02 -1.9863929748535156e+00 + <_> + + 0 -1 1623 8.4889996796846390e-03 + + -1.7663399875164032e-01 3.8011199235916138e-01 + <_> + + 0 -1 1624 2.2710999473929405e-02 + + -2.7605999261140823e-02 -9.1921401023864746e-01 + <_> + + 0 -1 1625 4.9700000090524554e-04 + + -2.4293200671672821e-01 2.2878900170326233e-01 + <_> + + 0 -1 1626 3.4651998430490494e-02 + + -2.3705999553203583e-01 5.4010999202728271e-01 + <_> + + 0 -1 1627 -4.4700000435113907e-03 + + 3.9078998565673828e-01 -1.2693800032138824e-01 + <_> + + 0 -1 1628 2.3643000051379204e-02 + + -2.6663699746131897e-01 3.2312598824501038e-01 + <_> + + 0 -1 1629 1.2813000008463860e-02 + + 1.7540800571441650e-01 -6.0787999629974365e-01 + <_> + + 0 -1 1630 -1.1250999756157398e-02 + + -1.0852589607238770e+00 -2.8046000748872757e-02 + <_> + + 0 -1 1631 -4.1535001248121262e-02 + + 7.1887397766113281e-01 2.7982000261545181e-02 + <_> + + 0 -1 1632 -9.3470998108386993e-02 + + -1.1906319856643677e+00 -4.4810999184846878e-02 + <_> + + 0 -1 1633 -2.7249999344348907e-02 + + 6.2942498922348022e-01 9.5039997249841690e-03 + <_> + + 0 -1 1634 -2.1759999915957451e-02 + + 1.3233649730682373e+00 -1.5027000010013580e-01 + <_> + + 0 -1 1635 -9.6890004351735115e-03 + + -3.3947101235389709e-01 1.7085799574851990e-01 + <_> + + 0 -1 1636 6.9395996630191803e-02 + + -2.5657799839973450e-01 4.7652098536491394e-01 + <_> + + 0 -1 1637 3.1208999454975128e-02 + + 1.4154000580310822e-01 -3.4942001104354858e-01 + <_> + + 0 -1 1638 -4.9727000296115875e-02 + + -1.1675560474395752e+00 -4.0757998824119568e-02 + <_> + + 0 -1 1639 -2.0301999524235725e-02 + + -3.9486399292945862e-01 1.5814900398254395e-01 + <_> + + 0 -1 1640 -1.5367000363767147e-02 + + 4.9300000071525574e-01 -2.0092099905014038e-01 + <_> + + 0 -1 1641 -5.0735000520944595e-02 + + 1.8736059665679932e+00 8.6730003356933594e-02 + <_> + + 0 -1 1642 -2.0726000890135765e-02 + + -8.8938397169113159e-01 -7.3199998587369919e-03 + <_> + + 0 -1 1643 -3.0993999913334846e-02 + + -1.1664899587631226e+00 1.4274600148200989e-01 + <_> + + 0 -1 1644 -4.4269999489188194e-03 + + -6.6815102100372314e-01 4.4120000675320625e-03 + <_> + + 0 -1 1645 -4.5743998140096664e-02 + + -4.7955200076103210e-01 1.5121999382972717e-01 + <_> + + 0 -1 1646 1.6698999330401421e-02 + + 1.2048599869012833e-01 -4.5235899090766907e-01 + <_> + + 0 -1 1647 3.2210000790655613e-03 + + -7.7615000307559967e-02 2.7846598625183105e-01 + <_> + + 0 -1 1648 2.4434000253677368e-02 + + -1.9987100362777710e-01 6.7253702878952026e-01 + <_> + + 0 -1 1649 -7.9677999019622803e-02 + + 9.2222398519515991e-01 9.2557996511459351e-02 + <_> + + 0 -1 1650 4.4530000537633896e-02 + + -2.6690500974655151e-01 3.3320501446723938e-01 + <_> + + 0 -1 1651 -1.2528300285339355e-01 + + -5.4253101348876953e-01 1.3976299762725830e-01 + <_> + + 0 -1 1652 1.7971999943256378e-02 + + 1.8219999969005585e-02 -6.8048501014709473e-01 + <_> + + 0 -1 1653 1.9184000790119171e-02 + + -1.2583999894559383e-02 5.4126697778701782e-01 + <_> + + 0 -1 1654 4.0024001151323318e-02 + + -1.7638799548149109e-01 7.8810399770736694e-01 + <_> + + 0 -1 1655 1.3558999635279179e-02 + + 2.0737600326538086e-01 -4.7744300961494446e-01 + <_> + + 0 -1 1656 1.6220999881625175e-02 + + 2.3076999932527542e-02 -6.1182099580764771e-01 + <_> + + 0 -1 1657 1.1229000054299831e-02 + + -1.7728000879287720e-02 4.1764199733734131e-01 + <_> + + 0 -1 1658 3.9193000644445419e-02 + + -1.8948499858379364e-01 7.4019300937652588e-01 + <_> + + 0 -1 1659 -9.5539996400475502e-03 + + 4.0947100520133972e-01 -1.3508899509906769e-01 + <_> + + 0 -1 1660 2.7878999710083008e-02 + + -2.0350700616836548e-01 6.1625397205352783e-01 + <_> + + 0 -1 1661 -2.3600999265909195e-02 + + -1.6967060565948486e+00 1.4633199572563171e-01 + <_> + + 0 -1 1662 2.6930000633001328e-02 + + -3.0401999130845070e-02 -1.0909470319747925e+00 + <_> + + 0 -1 1663 2.8999999631196260e-04 + + -2.0076000690460205e-01 2.2314099967479706e-01 + <_> + + 0 -1 1664 -4.1124999523162842e-02 + + -4.5242199301719666e-01 5.7392001152038574e-02 + <_> + + 0 -1 1665 6.6789998672902584e-03 + + 2.3824900388717651e-01 -2.1262100338935852e-01 + <_> + + 0 -1 1666 4.7864999622106552e-02 + + -1.8194800615310669e-01 6.1918401718139648e-01 + <_> + + 0 -1 1667 -3.1679999083280563e-03 + + -2.7393200993537903e-01 2.5017300248146057e-01 + <_> + + 0 -1 1668 -8.6230002343654633e-03 + + -4.6280300617218018e-01 4.2397998273372650e-02 + <_> + + 0 -1 1669 -7.4350000359117985e-03 + + 4.1796800494194031e-01 -1.7079999670386314e-03 + <_> + + 0 -1 1670 -1.8769999733194709e-03 + + 1.4602300524711609e-01 -3.3721101284027100e-01 + <_> + + 0 -1 1671 -8.6226001381874084e-02 + + 7.5143402814865112e-01 1.0711999610066414e-02 + <_> + + 0 -1 1672 4.6833999454975128e-02 + + -1.9119599461555481e-01 4.8414900898933411e-01 + <_> + + 0 -1 1673 -9.2000002041459084e-05 + + 3.5220399498939514e-01 -1.7333300411701202e-01 + <_> + + 0 -1 1674 -1.6343999654054642e-02 + + -6.4397698640823364e-01 9.0680001303553581e-03 + <_> + + 0 -1 1675 4.5703999698162079e-02 + + 1.8216000869870186e-02 3.1970798969268799e-01 + <_> + + 0 -1 1676 -2.7382999658584595e-02 + + 1.0564049482345581e+00 -1.7276400327682495e-01 + <_> + + 0 -1 1677 -2.7602000162005424e-02 + + 2.9715499281883240e-01 -9.4600003212690353e-03 + <_> + + 0 -1 1678 7.6939999125897884e-03 + + -2.1660299599170685e-01 4.7385200858116150e-01 + <_> + + 0 -1 1679 -7.0500001311302185e-04 + + 2.4048799276351929e-01 -2.6776000857353210e-01 + <_> + + 0 -1 1680 1.1054199934005737e-01 + + -3.3539000898599625e-02 -1.0233880281448364e+00 + <_> + + 0 -1 1681 6.8765997886657715e-02 + + -4.3239998631179333e-03 5.7153397798538208e-01 + <_> + + 0 -1 1682 1.7999999690800905e-03 + + 7.7574998140335083e-02 -4.2092698812484741e-01 + <_> + + 0 -1 1683 1.9232000410556793e-01 + + 8.2021996378898621e-02 2.8810169696807861e+00 + <_> + + 0 -1 1684 1.5742099285125732e-01 + + -1.3708199560642242e-01 2.0890059471130371e+00 + <_> + + 0 -1 1685 -4.9387000501155853e-02 + + -1.8610910177230835e+00 1.4332099258899689e-01 + <_> + + 0 -1 1686 5.1929000765085220e-02 + + -1.8737000226974487e-01 5.4231601953506470e-01 + <_> + + 0 -1 1687 4.9965001642704010e-02 + + 1.4175300300121307e-01 -1.5625779628753662e+00 + <_> + + 0 -1 1688 -4.2633000761270523e-02 + + 1.6059479713439941e+00 -1.4712899923324585e-01 + <_> + + 0 -1 1689 -3.7553999572992325e-02 + + -8.0974900722503662e-01 1.3256999850273132e-01 + <_> + + 0 -1 1690 -3.7174999713897705e-02 + + -1.3945020437240601e+00 -5.7055000215768814e-02 + <_> + + 0 -1 1691 1.3945999555289745e-02 + + 3.3427000045776367e-02 5.7474797964096069e-01 + <_> + + 0 -1 1692 -4.4800000614486635e-04 + + -5.5327498912811279e-01 2.1952999755740166e-02 + <_> + + 0 -1 1693 3.1993001699447632e-02 + + 2.0340999588370323e-02 3.7459200620651245e-01 + <_> + + 0 -1 1694 -4.2799999937415123e-03 + + 4.4428700208663940e-01 -2.2999699413776398e-01 + <_> + + 0 -1 1695 9.8550003021955490e-03 + + 1.8315799534320831e-01 -4.0964999794960022e-01 + <_> + + 0 -1 1696 9.3356996774673462e-02 + + -6.3661001622676849e-02 -1.6929290294647217e+00 + <_> + + 0 -1 1697 1.7209999263286591e-02 + + 2.0153899490833282e-01 -4.6061098575592041e-01 + <_> + + 0 -1 1698 8.4319999441504478e-03 + + -3.2003998756408691e-01 1.5312199294567108e-01 + <_> + + 0 -1 1699 -1.4054999686777592e-02 + + 8.6882400512695312e-01 3.2575000077486038e-02 + <_> + + 0 -1 1700 -7.7180000953376293e-03 + + 6.3686698675155640e-01 -1.8425500392913818e-01 + <_> + + 0 -1 1701 2.8005000203847885e-02 + + 1.7357499897480011e-01 -4.7883599996566772e-01 + <_> + + 0 -1 1702 -1.8884999677538872e-02 + + 2.4101600050926208e-01 -2.6547598838806152e-01 + <_> + + 0 -1 1703 -1.8585000187158585e-02 + + 5.4232501983642578e-01 5.3633000701665878e-02 + <_> + + 0 -1 1704 -3.6437001079320908e-02 + + 2.3908898830413818e+00 -1.3634699583053589e-01 + <_> + + 0 -1 1705 3.2455001026391983e-02 + + 1.5910699963569641e-01 -6.7581498622894287e-01 + <_> + + 0 -1 1706 5.9781998395919800e-02 + + -2.3479999508708715e-03 -7.3053699731826782e-01 + <_> + + 0 -1 1707 9.8209995776414871e-03 + + -1.1444099992513657e-01 3.0570301413536072e-01 + <_> + + 0 -1 1708 -3.5163998603820801e-02 + + -1.0511469841003418e+00 -3.3103000372648239e-02 + <_> + + 0 -1 1709 2.7429999317973852e-03 + + -2.0135399699211121e-01 3.2754099369049072e-01 + <_> + + 0 -1 1710 8.1059997901320457e-03 + + -2.1383500099182129e-01 4.3362098932266235e-01 + <_> + + 0 -1 1711 8.8942997157573700e-02 + + 1.0940899699926376e-01 -4.7609338760375977e+00 + <_> + + 0 -1 1712 -3.0054999515414238e-02 + + -1.7169300317764282e+00 -6.0919001698493958e-02 + <_> + + 0 -1 1713 -2.1734999492764473e-02 + + 6.4778900146484375e-01 -3.2830998301506042e-02 + <_> + + 0 -1 1714 3.7648998200893402e-02 + + -1.0060000233352184e-02 -7.6569098234176636e-01 + <_> + + 0 -1 1715 2.7189999818801880e-03 + + 1.9888900220394135e-01 -8.2479000091552734e-02 + <_> + + 0 -1 1716 -1.0548000223934650e-02 + + -8.6613601446151733e-01 -2.5986000895500183e-02 + <_> + + 0 -1 1717 1.2966300547122955e-01 + + 1.3911999762058258e-01 -2.2271950244903564e+00 + <_> + + 0 -1 1718 -1.7676999792456627e-02 + + 3.3967700600624084e-01 -2.3989599943161011e-01 + <_> + + 0 -1 1719 -7.7051997184753418e-02 + + -2.5017969608306885e+00 1.2841999530792236e-01 + <_> + + 0 -1 1720 -1.9230000674724579e-02 + + 5.0641202926635742e-01 -1.9751599431037903e-01 + <_> + + 0 -1 1721 -5.1222998648881912e-02 + + -2.9333369731903076e+00 1.3858500123023987e-01 + <_> + + 0 -1 1722 2.0830000285059214e-03 + + -6.0043597221374512e-01 2.9718000441789627e-02 + <_> + + 0 -1 1723 2.5418000295758247e-02 + + 3.3915799856185913e-01 -1.4392000436782837e-01 + <_> + + 0 -1 1724 -2.3905999958515167e-02 + + -1.1082680225372314e+00 -4.7377001494169235e-02 + <_> + + 0 -1 1725 -6.3740001060068607e-03 + + 4.4533699750900269e-01 -6.7052997648715973e-02 + <_> + + 0 -1 1726 -3.7698999047279358e-02 + + -1.0406579971313477e+00 -4.1790001094341278e-02 + <_> + + 0 -1 1727 2.1655100584030151e-01 + + 3.3863000571727753e-02 8.2017302513122559e-01 + <_> + + 0 -1 1728 -1.3400999829173088e-02 + + 5.2903497219085693e-01 -1.9133000075817108e-01 + <_> + 196 + -3.2103500366210938e+00 + + <_> + + 0 -1 1729 7.1268998086452484e-02 + + -5.3631198406219482e-01 6.0715299844741821e-01 + <_> + + 0 -1 1730 5.6111000478267670e-02 + + -5.0141602754592896e-01 4.3976101279258728e-01 + <_> + + 0 -1 1731 4.0463998913764954e-02 + + -3.2922199368476868e-01 5.4834699630737305e-01 + <_> + + 0 -1 1732 6.3155002892017365e-02 + + -3.1701698899269104e-01 4.6152999997138977e-01 + <_> + + 0 -1 1733 1.0320999659597874e-02 + + 1.0694999992847443e-01 -9.8243898153305054e-01 + <_> + + 0 -1 1734 6.2606997787952423e-02 + + -1.4329700171947479e-01 7.1095001697540283e-01 + <_> + + 0 -1 1735 -3.9416000247001648e-02 + + 9.4380199909210205e-01 -2.1572099626064301e-01 + <_> + + 0 -1 1736 -5.3960001096129417e-03 + + -5.4611998796463013e-01 2.5303798913955688e-01 + <_> + + 0 -1 1737 1.0773199796676636e-01 + + 1.2496000155806541e-02 -1.0809199810028076e+00 + <_> + + 0 -1 1738 1.6982000321149826e-02 + + -3.1536400318145752e-01 5.1239997148513794e-01 + <_> + + 0 -1 1739 3.1216999515891075e-02 + + -4.5199999585747719e-03 -1.2443480491638184e+00 + <_> + + 0 -1 1740 -2.3106999695301056e-02 + + -7.6492899656295776e-01 2.0640599727630615e-01 + <_> + + 0 -1 1741 -1.1203999631106853e-02 + + 2.4092699587345123e-01 -3.5142099857330322e-01 + <_> + + 0 -1 1742 -4.7479998320341110e-03 + + -9.7007997334003448e-02 2.0638099312782288e-01 + <_> + + 0 -1 1743 -1.7358999699354172e-02 + + -7.9020297527313232e-01 2.1852999925613403e-02 + <_> + + 0 -1 1744 1.8851999193429947e-02 + + -1.0394600033760071e-01 5.4844200611114502e-01 + <_> + + 0 -1 1745 7.2249998338520527e-03 + + -4.0409401059150696e-01 2.6763799786567688e-01 + <_> + + 0 -1 1746 1.8915999680757523e-02 + + 2.0508000254631042e-01 -1.0206340551376343e+00 + <_> + + 0 -1 1747 3.1156999990344048e-02 + + 1.2400000123307109e-03 -8.7293499708175659e-01 + <_> + + 0 -1 1748 2.0951999351382256e-02 + + -5.5559999309480190e-03 8.0356198549270630e-01 + <_> + + 0 -1 1749 1.1291000060737133e-02 + + -3.6478400230407715e-01 2.2767899930477142e-01 + <_> + + 0 -1 1750 -5.7011000812053680e-02 + + -1.4295619726181030e+00 1.4322000741958618e-01 + <_> + + 0 -1 1751 7.2194002568721771e-02 + + -4.1850000619888306e-02 -1.9111829996109009e+00 + <_> + + 0 -1 1752 -1.9874000921845436e-02 + + 2.6425498723983765e-01 -3.2617700099945068e-01 + <_> + + 0 -1 1753 -1.6692999750375748e-02 + + -8.3907800912857056e-01 4.0799999260343611e-04 + <_> + + 0 -1 1754 -3.9834998548030853e-02 + + -4.8858499526977539e-01 1.6436100006103516e-01 + <_> + + 0 -1 1755 2.7009999379515648e-02 + + -1.8862499296665192e-01 8.3419400453567505e-01 + <_> + + 0 -1 1756 -3.9420002140104771e-03 + + 2.3231500387191772e-01 -7.2360001504421234e-02 + <_> + + 0 -1 1757 2.2833000868558884e-02 + + -3.5884000360965729e-02 -1.1549400091171265e+00 + <_> + + 0 -1 1758 -6.8888001143932343e-02 + + -1.7837309837341309e+00 1.5159000456333160e-01 + <_> + + 0 -1 1759 4.3097000569105148e-02 + + -2.1608099341392517e-01 5.0624102354049683e-01 + <_> + + 0 -1 1760 8.6239995434880257e-03 + + -1.7795599997043610e-01 2.8957900404930115e-01 + <_> + + 0 -1 1761 1.4561000280082226e-02 + + -1.1408000253140926e-02 -8.9402002096176147e-01 + <_> + + 0 -1 1762 -1.1501000262796879e-02 + + 3.0171999335289001e-01 -4.3659001588821411e-02 + <_> + + 0 -1 1763 -1.0971499979496002e-01 + + -9.5147097110748291e-01 -1.9973000511527061e-02 + <_> + + 0 -1 1764 4.5228000730276108e-02 + + 3.3110998570919037e-02 9.6619802713394165e-01 + <_> + + 0 -1 1765 -2.7047999203205109e-02 + + 9.7963601350784302e-01 -1.7261900007724762e-01 + <_> + + 0 -1 1766 1.8030999228358269e-02 + + -2.0801000297069550e-02 2.7385899424552917e-01 + <_> + + 0 -1 1767 5.0524998456239700e-02 + + -5.6802999228239059e-02 -1.7775089740753174e+00 + <_> + + 0 -1 1768 -2.9923999682068825e-02 + + 6.5329200029373169e-01 -2.3537000641226768e-02 + <_> + + 0 -1 1769 3.8058001548051834e-02 + + 2.6317000389099121e-02 -7.0665699243545532e-01 + <_> + + 0 -1 1770 1.8563899397850037e-01 + + -5.6039998307824135e-03 3.2873699069023132e-01 + <_> + + 0 -1 1771 -4.0670000016689301e-03 + + 3.4204798936843872e-01 -3.0171599984169006e-01 + <_> + + 0 -1 1772 1.0108999907970428e-02 + + -7.3600001633167267e-03 5.7981598377227783e-01 + <_> + + 0 -1 1773 -1.1567000299692154e-02 + + -5.2722197771072388e-01 4.6447999775409698e-02 + <_> + + 0 -1 1774 -6.5649999305605888e-03 + + -5.8529102802276611e-01 1.9101899862289429e-01 + <_> + + 0 -1 1775 1.0582000017166138e-02 + + 2.1073000505566597e-02 -6.8892598152160645e-01 + <_> + + 0 -1 1776 -2.0304000005125999e-02 + + -3.6400699615478516e-01 1.5338799357414246e-01 + <_> + + 0 -1 1777 2.3529999889433384e-03 + + 3.6164000630378723e-02 -5.9825098514556885e-01 + <_> + + 0 -1 1778 -1.4690000098198652e-03 + + -1.4707699418067932e-01 3.7507998943328857e-01 + <_> + + 0 -1 1779 8.6449999362230301e-03 + + -2.1708500385284424e-01 5.1936799287796021e-01 + <_> + + 0 -1 1780 -2.4326000362634659e-02 + + -1.0846769809722900e+00 1.4084799587726593e-01 + <_> + + 0 -1 1781 7.4418999254703522e-02 + + -1.5513800084590912e-01 1.1822769641876221e+00 + <_> + + 0 -1 1782 1.7077999189496040e-02 + + 4.4231001287698746e-02 9.1561102867126465e-01 + <_> + + 0 -1 1783 -2.4577999487519264e-02 + + -1.5504100322723389e+00 -5.4745998233556747e-02 + <_> + + 0 -1 1784 3.0205000191926956e-02 + + 1.6662800312042236e-01 -1.0001239776611328e+00 + <_> + + 0 -1 1785 1.2136000208556652e-02 + + -7.7079099416732788e-01 -4.8639997839927673e-03 + <_> + + 0 -1 1786 8.6717002093791962e-02 + + 1.1061699688434601e-01 -1.6857999563217163e+00 + <_> + + 0 -1 1787 -4.2309001088142395e-02 + + 1.1075930595397949e+00 -1.5438599884510040e-01 + <_> + + 0 -1 1788 -2.6420000940561295e-03 + + 2.7451899647712708e-01 -1.8456199765205383e-01 + <_> + + 0 -1 1789 -5.6662000715732574e-02 + + -8.0625599622726440e-01 -1.6928000375628471e-02 + <_> + + 0 -1 1790 2.3475000634789467e-02 + + 1.4187699556350708e-01 -2.5500899553298950e-01 + <_> + + 0 -1 1791 -2.0803000777959824e-02 + + 1.9826300442218781e-01 -3.1171199679374695e-01 + <_> + + 0 -1 1792 7.2599998675286770e-03 + + -5.0590999424457550e-02 4.1923800110816956e-01 + <_> + + 0 -1 1793 3.4160000085830688e-01 + + -1.6674900054931641e-01 9.2748600244522095e-01 + <_> + + 0 -1 1794 6.2029999680817127e-03 + + -1.2625899910926819e-01 4.0445300936698914e-01 + <_> + + 0 -1 1795 3.2692000269889832e-02 + + -3.2634999603033066e-02 -9.8939800262451172e-01 + <_> + + 0 -1 1796 2.1100000594742596e-04 + + -6.4534001052379608e-02 2.5473698973655701e-01 + <_> + + 0 -1 1797 7.2100001852959394e-04 + + -3.6618599295616150e-01 1.1973100155591965e-01 + <_> + + 0 -1 1798 5.4490998387336731e-02 + + 1.2073499709367752e-01 -1.0291390419006348e+00 + <_> + + 0 -1 1799 -1.0141000151634216e-02 + + -5.2177202701568604e-01 3.3734999597072601e-02 + <_> + + 0 -1 1800 -1.8815999850630760e-02 + + 6.5181797742843628e-01 1.3399999588727951e-03 + <_> + + 0 -1 1801 -5.3480002097785473e-03 + + 1.7370699346065521e-01 -3.4132000803947449e-01 + <_> + + 0 -1 1802 -1.0847000405192375e-02 + + -1.9699899852275848e-01 1.5045499801635742e-01 + <_> + + 0 -1 1803 -4.9926001578569412e-02 + + -5.0888502597808838e-01 3.0762000009417534e-02 + <_> + + 0 -1 1804 1.2160000391304493e-02 + + -6.9251999258995056e-02 1.8745499849319458e-01 + <_> + + 0 -1 1805 -2.2189998999238014e-03 + + -4.0849098563194275e-01 7.9954996705055237e-02 + <_> + + 0 -1 1806 3.1580000650137663e-03 + + -2.1124599874019623e-01 2.2366400063037872e-01 + <_> + + 0 -1 1807 4.1439998894929886e-03 + + -4.9900299310684204e-01 6.2917001545429230e-02 + <_> + + 0 -1 1808 -7.3730000294744968e-03 + + -2.0553299784660339e-01 2.2096699476242065e-01 + <_> + + 0 -1 1809 5.1812000572681427e-02 + + 1.8096800148487091e-01 -4.3495801091194153e-01 + <_> + + 0 -1 1810 1.8340000882744789e-02 + + 1.5200000256299973e-02 3.7991699576377869e-01 + <_> + + 0 -1 1811 1.7490799725055695e-01 + + -2.0920799672603607e-01 4.0013000369071960e-01 + <_> + + 0 -1 1812 5.3993999958038330e-02 + + 2.4751600623130798e-01 -2.6712900400161743e-01 + <_> + + 0 -1 1813 -3.2033199071884155e-01 + + -1.9094380140304565e+00 -6.6960997879505157e-02 + <_> + + 0 -1 1814 -2.7060000225901604e-02 + + -7.1371299028396606e-01 1.5904599428176880e-01 + <_> + + 0 -1 1815 7.7463999390602112e-02 + + -1.6970199346542358e-01 7.7552998065948486e-01 + <_> + + 0 -1 1816 2.3771999403834343e-02 + + 1.9021899998188019e-01 -6.0162097215652466e-01 + <_> + + 0 -1 1817 1.1501000262796879e-02 + + 7.7039999887347221e-03 -6.1730301380157471e-01 + <_> + + 0 -1 1818 3.2616000622510910e-02 + + 1.7159199714660645e-01 -7.0978200435638428e-01 + <_> + + 0 -1 1819 -4.4383000582456589e-02 + + -2.2606229782104492e+00 -7.3276996612548828e-02 + <_> + + 0 -1 1820 -5.8476001024246216e-02 + + 2.4087750911712646e+00 8.3091996610164642e-02 + <_> + + 0 -1 1821 1.9303999841213226e-02 + + -2.7082300186157227e-01 2.7369999885559082e-01 + <_> + + 0 -1 1822 -4.4705998152494431e-02 + + 3.1355598568916321e-01 -6.2492001801729202e-02 + <_> + + 0 -1 1823 -6.0334999114274979e-02 + + -1.4515119791030884e+00 -5.8761000633239746e-02 + <_> + + 0 -1 1824 1.1667000129818916e-02 + + -1.8084999173879623e-02 5.0479698181152344e-01 + <_> + + 0 -1 1825 2.8009999543428421e-02 + + -2.3302899301052094e-01 3.0708700418472290e-01 + <_> + + 0 -1 1826 6.5397001802921295e-02 + + 1.4135900139808655e-01 -5.0010901689529419e-01 + <_> + + 0 -1 1827 9.6239997074007988e-03 + + -2.2054600715637207e-01 3.9191201329231262e-01 + <_> + + 0 -1 1828 2.5510000996291637e-03 + + -1.1381500214338303e-01 2.0032300055027008e-01 + <_> + + 0 -1 1829 3.1847000122070312e-02 + + 2.5476999580860138e-02 -5.3326398134231567e-01 + <_> + + 0 -1 1830 3.3055000007152557e-02 + + 1.7807699739933014e-01 -6.2793898582458496e-01 + <_> + + 0 -1 1831 4.7600999474525452e-02 + + -1.4747899770736694e-01 1.4204180240631104e+00 + <_> + + 0 -1 1832 -1.9571999087929726e-02 + + -5.2693498134613037e-01 1.5838600695133209e-01 + <_> + + 0 -1 1833 -5.4730001837015152e-02 + + 8.8231599330902100e-01 -1.6627800464630127e-01 + <_> + + 0 -1 1834 -2.2686000913381577e-02 + + -4.8386898636817932e-01 1.5000100433826447e-01 + <_> + + 0 -1 1835 1.0713200271129608e-01 + + -2.1336199343204498e-01 4.2333900928497314e-01 + <_> + + 0 -1 1836 -3.6380000412464142e-02 + + -7.4198000133037567e-02 1.4589400589466095e-01 + <_> + + 0 -1 1837 1.3935999944806099e-02 + + -2.4911600351333618e-01 2.6771199703216553e-01 + <_> + + 0 -1 1838 2.0991999655961990e-02 + + 8.7959999218583107e-03 4.3064999580383301e-01 + <_> + + 0 -1 1839 4.9118999391794205e-02 + + -1.7591999471187592e-01 6.9282901287078857e-01 + <_> + + 0 -1 1840 3.6315999925136566e-02 + + 1.3145299255847931e-01 -3.3597299456596375e-01 + <_> + + 0 -1 1841 4.1228000074625015e-02 + + -4.5692000538110733e-02 -1.3515930175781250e+00 + <_> + + 0 -1 1842 1.5672000125050545e-02 + + 1.7544099688529968e-01 -6.0550000518560410e-02 + <_> + + 0 -1 1843 -1.6286000609397888e-02 + + -1.1308189630508423e+00 -3.9533000439405441e-02 + <_> + + 0 -1 1844 -3.0229999683797359e-03 + + -2.2454300522804260e-01 2.3628099262714386e-01 + <_> + + 0 -1 1845 -1.3786299526691437e-01 + + 4.5376899838447571e-01 -2.1098700165748596e-01 + <_> + + 0 -1 1846 -9.6760001033544540e-03 + + -1.5105099976062775e-01 2.0781700313091278e-01 + <_> + + 0 -1 1847 -2.4839999154210091e-02 + + -6.8350297212600708e-01 -8.0040004104375839e-03 + <_> + + 0 -1 1848 -1.3964399695396423e-01 + + 6.5011298656463623e-01 4.6544000506401062e-02 + <_> + + 0 -1 1849 -8.2153998315334320e-02 + + 4.4887199997901917e-01 -2.3591999709606171e-01 + <_> + + 0 -1 1850 3.8449999410659075e-03 + + -8.8173002004623413e-02 2.7346798777580261e-01 + <_> + + 0 -1 1851 -6.6579999402165413e-03 + + -4.6866598725318909e-01 7.7001996338367462e-02 + <_> + + 0 -1 1852 -1.5898000448942184e-02 + + 2.9268398880958557e-01 -2.1941000595688820e-02 + <_> + + 0 -1 1853 -5.0946000963449478e-02 + + -1.2093789577484131e+00 -4.2109999805688858e-02 + <_> + + 0 -1 1854 1.6837999224662781e-02 + + -4.5595999807119370e-02 5.0180697441101074e-01 + <_> + + 0 -1 1855 1.5918999910354614e-02 + + -2.6904299855232239e-01 2.6516300439834595e-01 + <_> + + 0 -1 1856 3.6309999413788319e-03 + + -1.3046100735664368e-01 3.1807100772857666e-01 + <_> + + 0 -1 1857 -8.6144998669624329e-02 + + 1.9443659782409668e+00 -1.3978299498558044e-01 + <_> + + 0 -1 1858 3.3140998333692551e-02 + + 1.5266799926757812e-01 -3.0866000801324844e-02 + <_> + + 0 -1 1859 -3.9679999463260174e-03 + + -7.1202301979064941e-01 -1.3844000175595284e-02 + <_> + + 0 -1 1860 -2.4008000269532204e-02 + + 9.2007797956466675e-01 4.6723999083042145e-02 + <_> + + 0 -1 1861 8.7320003658533096e-03 + + -2.2567300498485565e-01 3.1931799650192261e-01 + <_> + + 0 -1 1862 -2.7786999940872192e-02 + + -7.2337102890014648e-01 1.7018599808216095e-01 + <_> + + 0 -1 1863 -1.9455300271511078e-01 + + 1.2461860179901123e+00 -1.4736199378967285e-01 + <_> + + 0 -1 1864 -1.0869699716567993e-01 + + -1.4465179443359375e+00 1.2145300209522247e-01 + <_> + + 0 -1 1865 -1.9494999200105667e-02 + + -7.8153097629547119e-01 -2.3732999339699745e-02 + <_> + + 0 -1 1866 3.0650000553578138e-03 + + -8.5471397638320923e-01 1.6686999797821045e-01 + <_> + + 0 -1 1867 5.9193998575210571e-02 + + -1.4853699505329132e-01 1.1273469924926758e+00 + <_> + + 0 -1 1868 -5.4207999259233475e-02 + + 5.4726999998092651e-01 3.5523999482393265e-02 + <_> + + 0 -1 1869 -3.9324998855590820e-02 + + 3.6642599105834961e-01 -2.0543999969959259e-01 + <_> + + 0 -1 1870 8.2278996706008911e-02 + + -3.5007998347282410e-02 5.3994202613830566e-01 + <_> + + 0 -1 1871 -7.4479999020695686e-03 + + -6.1537498235702515e-01 -3.5319998860359192e-03 + <_> + + 0 -1 1872 7.3770000599324703e-03 + + -6.5591000020503998e-02 4.1961398720741272e-01 + <_> + + 0 -1 1873 7.0779998786747456e-03 + + -3.4129500389099121e-01 1.2536799907684326e-01 + <_> + + 0 -1 1874 -1.5581999905407429e-02 + + -3.0240398645401001e-01 2.1511000394821167e-01 + <_> + + 0 -1 1875 -2.7399999089539051e-03 + + 7.6553001999855042e-02 -4.1060501337051392e-01 + <_> + + 0 -1 1876 -7.0600003004074097e-02 + + -9.7356200218200684e-01 1.1241800338029861e-01 + <_> + + 0 -1 1877 -1.1706000193953514e-02 + + 1.8560700118541718e-01 -2.9755198955535889e-01 + <_> + + 0 -1 1878 7.1499997284263372e-04 + + -5.9650000184774399e-02 2.4824699759483337e-01 + <_> + + 0 -1 1879 -3.6866001784801483e-02 + + 3.2751700282096863e-01 -2.3059600591659546e-01 + <_> + + 0 -1 1880 -3.2526999711990356e-02 + + -2.9320299625396729e-01 1.5427699685096741e-01 + <_> + + 0 -1 1881 -7.4813999235630035e-02 + + -1.2143570184707642e+00 -5.2244000136852264e-02 + <_> + + 0 -1 1882 4.1469998657703400e-02 + + 1.3062499463558197e-01 -2.3274369239807129e+00 + <_> + + 0 -1 1883 -2.8880000114440918e-02 + + -6.6074597835540771e-01 -9.0960003435611725e-03 + <_> + + 0 -1 1884 4.6381998807191849e-02 + + 1.6630199551582336e-01 -6.6949498653411865e-01 + <_> + + 0 -1 1885 2.5424998998641968e-01 + + -5.4641999304294586e-02 -1.2676080465316772e+00 + <_> + + 0 -1 1886 2.4000001139938831e-03 + + 2.0276799798011780e-01 1.4667999930679798e-02 + <_> + + 0 -1 1887 -8.2805998623371124e-02 + + -7.8713601827621460e-01 -2.4468999356031418e-02 + <_> + + 0 -1 1888 -1.1438000015914440e-02 + + 2.8623399138450623e-01 -3.0894000083208084e-02 + <_> + + 0 -1 1889 -1.2913399934768677e-01 + + 1.7292929887771606e+00 -1.4293900132179260e-01 + <_> + + 0 -1 1890 3.8552999496459961e-02 + + 1.9232999533414841e-02 3.7732601165771484e-01 + <_> + + 0 -1 1891 1.0191400349140167e-01 + + -7.4533998966217041e-02 -3.3868899345397949e+00 + <_> + + 0 -1 1892 -1.9068000838160515e-02 + + 3.1814101338386536e-01 1.9261000677943230e-02 + <_> + + 0 -1 1893 -6.0775000602006912e-02 + + 7.6936298608779907e-01 -1.7644000053405762e-01 + <_> + + 0 -1 1894 2.4679999798536301e-02 + + 1.8396499752998352e-01 -3.0868801474571228e-01 + <_> + + 0 -1 1895 2.6759000495076180e-02 + + -2.3454900085926056e-01 3.3056598901748657e-01 + <_> + + 0 -1 1896 1.4969999901950359e-02 + + 1.7213599383831024e-01 -1.8248899281024933e-01 + <_> + + 0 -1 1897 2.6142999529838562e-02 + + -4.6463999897241592e-02 -1.1318379640579224e+00 + <_> + + 0 -1 1898 -3.7512000650167465e-02 + + 8.0404001474380493e-01 6.9660000503063202e-02 + <_> + + 0 -1 1899 -5.3229997865855694e-03 + + -8.1884402036666870e-01 -1.8224999308586121e-02 + <_> + + 0 -1 1900 1.7813000828027725e-02 + + 1.4957800507545471e-01 -1.8667200207710266e-01 + <_> + + 0 -1 1901 -3.4010000526905060e-02 + + -7.2852301597595215e-01 -1.6615999862551689e-02 + <_> + + 0 -1 1902 -1.5953000634908676e-02 + + 5.6944000720977783e-01 1.3832000084221363e-02 + <_> + + 0 -1 1903 1.9743999466300011e-02 + + 4.0525000542402267e-02 -4.1773399710655212e-01 + <_> + + 0 -1 1904 -1.0374800115823746e-01 + + -1.9825149774551392e+00 1.1960200220346451e-01 + <_> + + 0 -1 1905 -1.9285000860691071e-02 + + 5.0230598449707031e-01 -1.9745899736881256e-01 + <_> + + 0 -1 1906 -1.2780000455677509e-02 + + 4.0195000171661377e-01 -2.6957999914884567e-02 + <_> + + 0 -1 1907 -1.6352999955415726e-02 + + -7.6608800888061523e-01 -2.4209000170230865e-02 + <_> + + 0 -1 1908 -1.2763699889183044e-01 + + 8.6578500270843506e-01 6.4205996692180634e-02 + <_> + + 0 -1 1909 1.9068999215960503e-02 + + -5.5929797887802124e-01 -1.6880000475794077e-03 + <_> + + 0 -1 1910 3.2480999827384949e-02 + + 4.0722001343965530e-02 4.8925098776817322e-01 + <_> + + 0 -1 1911 9.4849998131394386e-03 + + -1.9231900572776794e-01 5.1139700412750244e-01 + <_> + + 0 -1 1912 5.0470000132918358e-03 + + 1.8706800043582916e-01 -1.6113600134849548e-01 + <_> + + 0 -1 1913 4.1267998516559601e-02 + + -4.8817999660968781e-02 -1.1326299905776978e+00 + <_> + + 0 -1 1914 -7.6358996331691742e-02 + + 1.4169390201568604e+00 8.7319999933242798e-02 + <_> + + 0 -1 1915 -7.2834998369216919e-02 + + 1.3189860582351685e+00 -1.4819100499153137e-01 + <_> + + 0 -1 1916 5.9576999396085739e-02 + + 4.8376999795436859e-02 8.5611802339553833e-01 + <_> + + 0 -1 1917 2.0263999700546265e-02 + + -2.1044099330902100e-01 3.3858999609947205e-01 + <_> + + 0 -1 1918 -8.0301001667976379e-02 + + -1.2464400529861450e+00 1.1857099831104279e-01 + <_> + + 0 -1 1919 -1.7835000529885292e-02 + + 2.5782299041748047e-01 -2.4564799666404724e-01 + <_> + + 0 -1 1920 1.1431000195443630e-02 + + 2.2949799895286560e-01 -2.9497599601745605e-01 + <_> + + 0 -1 1921 -2.5541000068187714e-02 + + -8.6252999305725098e-01 -7.0400000549852848e-04 + <_> + + 0 -1 1922 -7.6899997657164931e-04 + + 3.1511399149894714e-01 -1.4349000155925751e-01 + <_> + + 0 -1 1923 -1.4453999698162079e-02 + + 2.5148499011993408e-01 -2.8232899308204651e-01 + <_> + + 0 -1 1924 8.6730001494288445e-03 + + 2.6601400971412659e-01 -2.8190800547599792e-01 + <_> + 197 + -3.2772979736328125e+00 + + <_> + + 0 -1 1925 5.4708998650312424e-02 + + -5.4144299030303955e-01 6.1043000221252441e-01 + <_> + + 0 -1 1926 -1.0838799923658371e-01 + + 7.1739900112152100e-01 -4.1196098923683167e-01 + <_> + + 0 -1 1927 2.2996999323368073e-02 + + -5.8269798755645752e-01 2.9645600914955139e-01 + <_> + + 0 -1 1928 2.7540000155568123e-03 + + -7.4243897199630737e-01 1.4183300733566284e-01 + <_> + + 0 -1 1929 -2.1520000882446766e-03 + + 1.7879900336265564e-01 -6.8548601865768433e-01 + <_> + + 0 -1 1930 -2.2559000179171562e-02 + + -1.0775549411773682e+00 1.2388999760150909e-01 + <_> + + 0 -1 1931 8.3025000989437103e-02 + + 2.4500999599695206e-02 -1.0251879692077637e+00 + <_> + + 0 -1 1932 -6.6740000620484352e-03 + + -4.5283100008964539e-01 2.1230199933052063e-01 + <_> + + 0 -1 1933 7.6485000550746918e-02 + + -2.6972699165344238e-01 4.8580199480056763e-01 + <_> + + 0 -1 1934 5.4910001344978809e-03 + + -4.8871201276779175e-01 3.1616398692131042e-01 + <_> + + 0 -1 1935 -1.0414999909698963e-02 + + 4.1512900590896606e-01 -3.0044800043106079e-01 + <_> + + 0 -1 1936 2.7607999742031097e-02 + + 1.6203799843788147e-01 -9.9868500232696533e-01 + <_> + + 0 -1 1937 -2.3272000253200531e-02 + + -1.1024399995803833e+00 2.1124999970197678e-02 + <_> + + 0 -1 1938 -5.5619999766349792e-02 + + 6.5033102035522461e-01 -2.7938000857830048e-02 + <_> + + 0 -1 1939 -4.0631998330354691e-02 + + 4.2117300629615784e-01 -2.6763799786567688e-01 + <_> + + 0 -1 1940 -7.3560001328587532e-03 + + 3.5277798771858215e-01 -3.7854000926017761e-01 + <_> + + 0 -1 1941 1.7007000744342804e-02 + + -2.9189500212669373e-01 4.1053798794746399e-01 + <_> + + 0 -1 1942 -3.7034001201391220e-02 + + -1.3216309547424316e+00 1.2966500222682953e-01 + <_> + + 0 -1 1943 -1.9633000716567039e-02 + + -8.7702298164367676e-01 1.0799999581649899e-03 + <_> + + 0 -1 1944 -2.3546999320387840e-02 + + 2.6106101274490356e-01 -2.1481400728225708e-01 + <_> + + 0 -1 1945 -4.3352998793125153e-02 + + -9.9089699983596802e-01 -9.9560003727674484e-03 + <_> + + 0 -1 1946 -2.2183999419212341e-02 + + 6.3454401493072510e-01 -5.6547001004219055e-02 + <_> + + 0 -1 1947 1.6530999913811684e-02 + + 2.4664999917149544e-02 -7.3326802253723145e-01 + <_> + + 0 -1 1948 -3.2744001597166061e-02 + + -5.6297200918197632e-01 1.6640299558639526e-01 + <_> + + 0 -1 1949 7.1415998041629791e-02 + + -3.0000001424923539e-04 -9.3286401033401489e-01 + <_> + + 0 -1 1950 8.0999999772757292e-04 + + -9.5380000770092010e-02 2.5184699892997742e-01 + <_> + + 0 -1 1951 -8.4090000018477440e-03 + + -6.5496802330017090e-01 6.7300997674465179e-02 + <_> + + 0 -1 1952 -1.7254000529646873e-02 + + -4.6492999792098999e-01 1.6070899367332458e-01 + <_> + + 0 -1 1953 -1.8641000613570213e-02 + + -1.0594010353088379e+00 -1.9617000594735146e-02 + <_> + + 0 -1 1954 -9.1979997232556343e-03 + + 5.0716197490692139e-01 -1.5339200198650360e-01 + <_> + + 0 -1 1955 1.8538000062108040e-02 + + -3.0498200654983521e-01 7.3506200313568115e-01 + <_> + + 0 -1 1956 -5.0335001200437546e-02 + + -1.1140480041503906e+00 1.8000100553035736e-01 + <_> + + 0 -1 1957 -2.3529000580310822e-02 + + -8.6907899379730225e-01 -1.2459999881684780e-02 + <_> + + 0 -1 1958 -2.7100000530481339e-02 + + 6.5942901372909546e-01 -3.5323999822139740e-02 + <_> + + 0 -1 1959 6.5879998728632927e-03 + + -2.2953400015830994e-01 4.2425099015235901e-01 + <_> + + 0 -1 1960 2.3360000923275948e-02 + + 1.8356199562549591e-01 -9.8587298393249512e-01 + <_> + + 0 -1 1961 1.2946999631822109e-02 + + -3.3147400617599487e-01 2.1323199570178986e-01 + <_> + + 0 -1 1962 -6.6559999249875546e-03 + + -1.1951400339603424e-01 2.9752799868583679e-01 + <_> + + 0 -1 1963 -2.2570999339222908e-02 + + 3.8499400019645691e-01 -2.4434499442577362e-01 + <_> + + 0 -1 1964 -6.3813999295234680e-02 + + -8.9383500814437866e-01 1.4217500388622284e-01 + <_> + + 0 -1 1965 -4.9945000559091568e-02 + + 5.3864401578903198e-01 -2.0485299825668335e-01 + <_> + + 0 -1 1966 6.8319998681545258e-03 + + -5.6678999215364456e-02 3.9970999956130981e-01 + <_> + + 0 -1 1967 -5.5835999548435211e-02 + + -1.5239470005035400e+00 -5.1183000206947327e-02 + <_> + + 0 -1 1968 3.1957000494003296e-01 + + 7.4574001133441925e-02 1.2447799444198608e+00 + <_> + + 0 -1 1969 8.0955997109413147e-02 + + -1.9665500521659851e-01 5.9889698028564453e-01 + <_> + + 0 -1 1970 -1.4911999925971031e-02 + + -6.4020597934722900e-01 1.5807600319385529e-01 + <_> + + 0 -1 1971 4.6709001064300537e-02 + + 8.5239000618457794e-02 -4.5487201213836670e-01 + <_> + + 0 -1 1972 6.0539999976754189e-03 + + -4.3184000253677368e-01 2.2452600300312042e-01 + <_> + + 0 -1 1973 -3.4375999122858047e-02 + + 4.0202501416206360e-01 -2.3903599381446838e-01 + <_> + + 0 -1 1974 -3.4924000501632690e-02 + + 5.2870100736618042e-01 3.9709001779556274e-02 + <_> + + 0 -1 1975 3.0030000489205122e-03 + + -3.8754299283027649e-01 1.4192600548267365e-01 + <_> + + 0 -1 1976 -1.4132999815046787e-02 + + 8.7528401613235474e-01 8.5507996380329132e-02 + <_> + + 0 -1 1977 -6.7940000444650650e-03 + + -1.1649219989776611e+00 -3.3943001180887222e-02 + <_> + + 0 -1 1978 -5.2886001765727997e-02 + + 1.0930680036544800e+00 5.1187001168727875e-02 + <_> + + 0 -1 1979 -2.1079999860376120e-03 + + 1.3696199655532837e-01 -3.3849999308586121e-01 + <_> + + 0 -1 1980 1.8353000283241272e-02 + + 1.3661600649356842e-01 -4.0777799487113953e-01 + <_> + + 0 -1 1981 1.2671999633312225e-02 + + -1.4936000108718872e-02 -8.1707501411437988e-01 + <_> + + 0 -1 1982 1.2924999929964542e-02 + + 1.7625099420547485e-01 -3.2491698861122131e-01 + <_> + + 0 -1 1983 -1.7921000719070435e-02 + + -5.2745401859283447e-01 4.4443000108003616e-02 + <_> + + 0 -1 1984 1.9160000374540687e-03 + + -1.0978599637746811e-01 2.2067500650882721e-01 + <_> + + 0 -1 1985 -1.4697999693453312e-02 + + 3.9067798852920532e-01 -2.2224999964237213e-01 + <_> + + 0 -1 1986 -1.4972999691963196e-02 + + -2.5450900197029114e-01 1.7790000140666962e-01 + <_> + + 0 -1 1987 1.4636999927461147e-02 + + -2.5125000625848770e-02 -8.7121301889419556e-01 + <_> + + 0 -1 1988 -1.0974000208079815e-02 + + 7.9082798957824707e-01 2.0121000707149506e-02 + <_> + + 0 -1 1989 -9.1599998995661736e-03 + + -4.7906899452209473e-01 5.2232000976800919e-02 + <_> + + 0 -1 1990 4.6179997734725475e-03 + + -1.7244599759578705e-01 3.4527799487113953e-01 + <_> + + 0 -1 1991 2.3476999253034592e-02 + + 3.7760001141577959e-03 -6.5333700180053711e-01 + <_> + + 0 -1 1992 3.1766999512910843e-02 + + 1.6364000737667084e-02 5.8723700046539307e-01 + <_> + + 0 -1 1993 -1.8419999629259109e-02 + + 1.9993899762630463e-01 -3.2056498527526855e-01 + <_> + + 0 -1 1994 1.9543999806046486e-02 + + 1.8450200557708740e-01 -2.3793600499629974e-01 + <_> + + 0 -1 1995 4.1159498691558838e-01 + + -6.0382001101970673e-02 -1.6072119474411011e+00 + <_> + + 0 -1 1996 -4.1595999151468277e-02 + + -3.2756200432777405e-01 1.5058000385761261e-01 + <_> + + 0 -1 1997 -1.0335999540984631e-02 + + -6.2394398450851440e-01 1.3112000189721584e-02 + <_> + + 0 -1 1998 1.2392999604344368e-02 + + -3.3114999532699585e-02 5.5579900741577148e-01 + <_> + + 0 -1 1999 -8.7270000949501991e-03 + + 1.9883200526237488e-01 -3.7635600566864014e-01 + <_> + + 0 -1 2000 1.6295000910758972e-02 + + 2.0373000204563141e-01 -4.2800799012184143e-01 + <_> + + 0 -1 2001 -1.0483999736607075e-02 + + -5.6847000122070312e-01 4.4199001044034958e-02 + <_> + + 0 -1 2002 -1.2431999668478966e-02 + + 7.4641901254653931e-01 4.3678998947143555e-02 + <_> + + 0 -1 2003 -5.0374999642372131e-02 + + 8.5090100765228271e-01 -1.7773799598217010e-01 + <_> + + 0 -1 2004 4.9548000097274780e-02 + + 1.6784900426864624e-01 -2.9877498745918274e-01 + <_> + + 0 -1 2005 -4.1085001081228256e-02 + + -1.3302919864654541e+00 -4.9182001501321793e-02 + <_> + + 0 -1 2006 1.0069999843835831e-03 + + -6.0538999736309052e-02 1.8483200669288635e-01 + <_> + + 0 -1 2007 -5.0142999738454819e-02 + + 7.6447701454162598e-01 -1.8356999754905701e-01 + <_> + + 0 -1 2008 -8.7879998609423637e-03 + + 2.2655999660491943e-01 -6.3156999647617340e-02 + <_> + + 0 -1 2009 -5.0170999020338058e-02 + + -1.5899070501327515e+00 -6.1255000531673431e-02 + <_> + + 0 -1 2010 1.0216099768877029e-01 + + 1.2071800231933594e-01 -1.4120110273361206e+00 + <_> + + 0 -1 2011 -1.4372999779880047e-02 + + -1.3116970062255859e+00 -5.1936000585556030e-02 + <_> + + 0 -1 2012 1.0281999595463276e-02 + + -2.1639999467879534e-03 4.4247201085090637e-01 + <_> + + 0 -1 2013 -1.1814000084996223e-02 + + 6.5378099679946899e-01 -1.8723699450492859e-01 + <_> + + 0 -1 2014 7.2114996612071991e-02 + + 7.1846999228000641e-02 8.1496298313140869e-01 + <_> + + 0 -1 2015 -1.9001999869942665e-02 + + -6.7427200078964233e-01 -4.3200000072829425e-04 + <_> + + 0 -1 2016 -4.6990001574158669e-03 + + 3.3311501145362854e-01 5.5794000625610352e-02 + <_> + + 0 -1 2017 -5.8157000690698624e-02 + + 4.5572298765182495e-01 -2.0305100083351135e-01 + <_> + + 0 -1 2018 1.1360000353306532e-03 + + -4.4686999171972275e-02 2.2681899368762970e-01 + <_> + + 0 -1 2019 -4.9414999783039093e-02 + + 2.6694598793983459e-01 -2.6116999983787537e-01 + <_> + + 0 -1 2020 -1.1913800239562988e-01 + + -8.3017998933792114e-01 1.3248500227928162e-01 + <_> + + 0 -1 2021 -1.8303999677300453e-02 + + -6.7499202489852905e-01 1.7092000693082809e-02 + <_> + + 0 -1 2022 -7.9199997708201408e-03 + + -7.2287000715732574e-02 1.4425800740718842e-01 + <_> + + 0 -1 2023 5.1925998181104660e-02 + + 3.0921999365091324e-02 -5.5860602855682373e-01 + <_> + + 0 -1 2024 6.6724002361297607e-02 + + 1.3666400313377380e-01 -2.9411000013351440e-01 + <_> + + 0 -1 2025 -1.3778000138700008e-02 + + -5.9443902969360352e-01 1.5300000086426735e-02 + <_> + + 0 -1 2026 -1.7760999500751495e-02 + + 4.0496501326560974e-01 -3.3559999428689480e-03 + <_> + + 0 -1 2027 -4.2234998196363449e-02 + + -1.0897940397262573e+00 -4.0224999189376831e-02 + <_> + + 0 -1 2028 -1.3524999842047691e-02 + + 2.8921899199485779e-01 -2.5194799900054932e-01 + <_> + + 0 -1 2029 -1.1106000281870365e-02 + + 6.5312802791595459e-01 -1.8053700029850006e-01 + <_> + + 0 -1 2030 -1.2284599989652634e-01 + + -1.9570649862289429e+00 1.4815400540828705e-01 + <_> + + 0 -1 2031 4.7715999186038971e-02 + + -2.2875599563121796e-01 3.4233701229095459e-01 + <_> + + 0 -1 2032 3.1817000359296799e-02 + + 1.5976299345493317e-01 -1.0091969966888428e+00 + <_> + + 0 -1 2033 4.2570000514388084e-03 + + -3.8881298899650574e-01 8.4210000932216644e-02 + <_> + + 0 -1 2034 -6.1372999101877213e-02 + + 1.7152810096740723e+00 5.9324998408555984e-02 + <_> + + 0 -1 2035 -2.7030000928789377e-03 + + -3.8161700963973999e-01 8.5127003490924835e-02 + <_> + + 0 -1 2036 -6.8544000387191772e-02 + + -3.0925889015197754e+00 1.1788000166416168e-01 + <_> + + 0 -1 2037 1.0372500121593475e-01 + + -1.3769300282001495e-01 1.9009410142898560e+00 + <_> + + 0 -1 2038 1.5799000859260559e-02 + + -6.2660001218318939e-02 2.5917699933052063e-01 + <_> + + 0 -1 2039 -9.8040001466870308e-03 + + -5.6291598081588745e-01 4.3923001736402512e-02 + <_> + + 0 -1 2040 -9.0229995548725128e-03 + + 2.5287100672721863e-01 -4.1225999593734741e-02 + <_> + + 0 -1 2041 -6.3754998147487640e-02 + + -2.6178569793701172e+00 -7.4005998671054840e-02 + <_> + + 0 -1 2042 3.8954999297857285e-02 + + 5.9032998979091644e-02 8.5945600271224976e-01 + <_> + + 0 -1 2043 -3.9802998304367065e-02 + + 9.3600499629974365e-01 -1.5639400482177734e-01 + <_> + + 0 -1 2044 5.0301998853683472e-02 + + 1.3725900650024414e-01 -2.5549728870391846e+00 + <_> + + 0 -1 2045 4.6250000596046448e-02 + + -1.3964000158011913e-02 -7.1026200056076050e-01 + <_> + + 0 -1 2046 6.2196001410484314e-02 + + 5.9526000171899796e-02 1.6509100198745728e+00 + <_> + + 0 -1 2047 -6.4776003360748291e-02 + + 7.1368998289108276e-01 -1.7270000278949738e-01 + <_> + + 0 -1 2048 2.7522999793291092e-02 + + 1.4631600677967072e-01 -8.1428997218608856e-02 + <_> + + 0 -1 2049 3.9900001138448715e-04 + + -3.7144500017166138e-01 1.0152699798345566e-01 + <_> + + 0 -1 2050 -4.3299999088048935e-03 + + -2.3756299912929535e-01 2.6798400282859802e-01 + <_> + + 0 -1 2051 4.7297000885009766e-02 + + -2.7682000771164894e-02 -8.4910297393798828e-01 + <_> + + 0 -1 2052 1.2508999556303024e-02 + + 1.8730199337005615e-01 -5.6001102924346924e-01 + <_> + + 0 -1 2053 4.5899000018835068e-02 + + -1.5601199865341187e-01 9.7073000669479370e-01 + <_> + + 0 -1 2054 1.9853399693965912e-01 + + 1.4895500242710114e-01 -1.1015529632568359e+00 + <_> + + 0 -1 2055 1.6674999147653580e-02 + + -1.6615299880504608e-01 8.2210999727249146e-01 + <_> + + 0 -1 2056 1.9829999655485153e-03 + + -7.1249999105930328e-02 2.8810900449752808e-01 + <_> + + 0 -1 2057 2.2447999566793442e-02 + + -2.0981000736355782e-02 -7.8416502475738525e-01 + <_> + + 0 -1 2058 -1.3913000002503395e-02 + + -1.8165799975395203e-01 2.0491799712181091e-01 + <_> + + 0 -1 2059 -7.7659999951720238e-03 + + -4.5595899224281311e-01 6.3576996326446533e-02 + <_> + + 0 -1 2060 -1.3209000229835510e-02 + + 2.6632300019264221e-01 -1.7795999348163605e-01 + <_> + + 0 -1 2061 4.9052998423576355e-02 + + -1.5476800501346588e-01 1.1069979667663574e+00 + <_> + + 0 -1 2062 2.0263999700546265e-02 + + 6.8915002048015594e-02 6.9867497682571411e-01 + <_> + + 0 -1 2063 -1.6828000545501709e-02 + + 2.7607199549674988e-01 -2.5139200687408447e-01 + <_> + + 0 -1 2064 -1.6939499974250793e-01 + + -3.0767529010772705e+00 1.1617500334978104e-01 + <_> + + 0 -1 2065 -1.1336100101470947e-01 + + -1.4639229774475098e+00 -5.1447000354528427e-02 + <_> + + 0 -1 2066 -7.7685996890068054e-02 + + 8.8430202007293701e-01 4.3306998908519745e-02 + <_> + + 0 -1 2067 -1.5568000264465809e-02 + + 1.3672499358654022e-01 -3.4505501389503479e-01 + <_> + + 0 -1 2068 -6.6018998622894287e-02 + + -1.0300110578536987e+00 1.1601399630308151e-01 + <_> + + 0 -1 2069 8.3699999377131462e-03 + + 7.6429001986980438e-02 -4.4002500176429749e-01 + <_> + + 0 -1 2070 3.5402998328208923e-02 + + 1.1979500204324722e-01 -7.2668302059173584e-01 + <_> + + 0 -1 2071 -3.9051000028848648e-02 + + 6.7375302314758301e-01 -1.8196000158786774e-01 + <_> + + 0 -1 2072 -9.7899995744228363e-03 + + 2.1264599263668060e-01 3.6756001412868500e-02 + <_> + + 0 -1 2073 -2.3047000169754028e-02 + + 4.4742199778556824e-01 -2.0986700057983398e-01 + <_> + + 0 -1 2074 3.1169999856501818e-03 + + 3.7544000893831253e-02 2.7808201313018799e-01 + <_> + + 0 -1 2075 1.3136000372469425e-02 + + -1.9842399656772614e-01 5.4335701465606689e-01 + <_> + + 0 -1 2076 1.4782000333070755e-02 + + 1.3530600070953369e-01 -1.1153600364923477e-01 + <_> + + 0 -1 2077 -6.0139000415802002e-02 + + 8.4039300680160522e-01 -1.6711600124835968e-01 + <_> + + 0 -1 2078 5.1998998969793320e-02 + + 1.7372000217437744e-01 -7.8547602891921997e-01 + <_> + + 0 -1 2079 2.4792000651359558e-02 + + -1.7739200592041016e-01 6.6752600669860840e-01 + <_> + + 0 -1 2080 -1.2014999985694885e-02 + + -1.4263699948787689e-01 1.6070500016212463e-01 + <_> + + 0 -1 2081 -9.8655998706817627e-02 + + 1.0429769754409790e+00 -1.5770199894905090e-01 + <_> + + 0 -1 2082 1.1758299916982651e-01 + + 1.0955700278282166e-01 -4.4920377731323242e+00 + <_> + + 0 -1 2083 -1.8922999501228333e-02 + + -7.8543400764465332e-01 1.2984000146389008e-02 + <_> + + 0 -1 2084 -2.8390999883413315e-02 + + -6.0569900274276733e-01 1.2903499603271484e-01 + <_> + + 0 -1 2085 1.3182999566197395e-02 + + -1.4415999874472618e-02 -7.3210501670837402e-01 + <_> + + 0 -1 2086 -1.1653000116348267e-01 + + -2.0442469120025635e+00 1.4053100347518921e-01 + <_> + + 0 -1 2087 -3.8880000356584787e-03 + + -4.1861599683761597e-01 7.8704997897148132e-02 + <_> + + 0 -1 2088 3.1229000538587570e-02 + + 2.4632999673485756e-02 4.1870400309562683e-01 + <_> + + 0 -1 2089 2.5198999792337418e-02 + + -1.7557799816131592e-01 6.4710599184036255e-01 + <_> + + 0 -1 2090 -2.8124000877141953e-02 + + -2.2005599737167358e-01 1.4121000468730927e-01 + <_> + + 0 -1 2091 3.6499001085758209e-02 + + -6.8426996469497681e-02 -2.3410849571228027e+00 + <_> + + 0 -1 2092 -7.2292998433113098e-02 + + 1.2898750305175781e+00 8.4875002503395081e-02 + <_> + + 0 -1 2093 -4.1671000421047211e-02 + + -1.1630970239639282e+00 -5.3752999752759933e-02 + <_> + + 0 -1 2094 4.7703001648187637e-02 + + 7.0101000368595123e-02 7.3676502704620361e-01 + <_> + + 0 -1 2095 6.5793000161647797e-02 + + -1.7755299806594849e-01 6.9780498743057251e-01 + <_> + + 0 -1 2096 1.3904999941587448e-02 + + 2.1936799585819244e-01 -2.0390799641609192e-01 + <_> + + 0 -1 2097 -2.7730999514460564e-02 + + 6.1867898702621460e-01 -1.7804099619388580e-01 + <_> + + 0 -1 2098 -1.5879999846220016e-02 + + -4.6484100818634033e-01 1.8828600645065308e-01 + <_> + + 0 -1 2099 7.4128001928329468e-02 + + -1.2858100235462189e-01 3.2792479991912842e+00 + <_> + + 0 -1 2100 -8.9000002481043339e-04 + + -3.0117601156234741e-01 2.3818799853324890e-01 + <_> + + 0 -1 2101 1.7965000122785568e-02 + + -2.2284999489784241e-01 2.9954001307487488e-01 + <_> + + 0 -1 2102 -2.5380000006407499e-03 + + 2.5064399838447571e-01 -1.3665600121021271e-01 + <_> + + 0 -1 2103 -9.0680001303553581e-03 + + 2.9017499089241028e-01 -2.8929701447486877e-01 + <_> + + 0 -1 2104 4.9169998615980148e-02 + + 1.9156399369239807e-01 -6.8328702449798584e-01 + <_> + + 0 -1 2105 -3.0680999159812927e-02 + + -7.5677001476287842e-01 -1.3279999606311321e-02 + <_> + + 0 -1 2106 1.0017400234937668e-01 + + 8.4453999996185303e-02 1.0888710021972656e+00 + <_> + + 0 -1 2107 3.1950001139193773e-03 + + -2.6919400691986084e-01 1.9537900388240814e-01 + <_> + + 0 -1 2108 3.5503000020980835e-02 + + 1.3632300496101379e-01 -5.6917202472686768e-01 + <_> + + 0 -1 2109 4.5900000259280205e-04 + + -4.0443998575210571e-01 1.4074799418449402e-01 + <_> + + 0 -1 2110 2.5258999317884445e-02 + + 1.6243200004100800e-01 -5.5741798877716064e-01 + <_> + + 0 -1 2111 -5.1549999043345451e-03 + + 3.1132599711418152e-01 -2.2756099700927734e-01 + <_> + + 0 -1 2112 1.5869999770075083e-03 + + -2.6867699623107910e-01 1.9565400481224060e-01 + <_> + + 0 -1 2113 -1.6204999759793282e-02 + + 1.5486499667167664e-01 -3.4057798981666565e-01 + <_> + + 0 -1 2114 -2.9624000191688538e-02 + + 1.1466799974441528e+00 9.0557999908924103e-02 + <_> + + 0 -1 2115 -1.5930000226944685e-03 + + -7.1257501840591431e-01 -7.0400000549852848e-04 + <_> + + 0 -1 2116 -5.4019000381231308e-02 + + 4.1537499427795410e-01 2.7246000245213509e-02 + <_> + + 0 -1 2117 -6.6211000084877014e-02 + + -1.3340090513229370e+00 -4.7352999448776245e-02 + <_> + + 0 -1 2118 2.7940999716520309e-02 + + 1.4446300268173218e-01 -5.1518398523330688e-01 + <_> + + 0 -1 2119 2.8957000002264977e-02 + + -4.9966000020503998e-02 -1.1929039955139160e+00 + <_> + + 0 -1 2120 -2.0424999296665192e-02 + + 6.3881301879882812e-01 3.8141001015901566e-02 + <_> + + 0 -1 2121 1.2416999787092209e-02 + + -2.1547000110149384e-01 4.9477699398994446e-01 + <_> + 181 + -3.3196411132812500e+00 + + <_> + + 0 -1 2122 4.3274000287055969e-02 + + -8.0494397878646851e-01 3.9897298812866211e-01 + <_> + + 0 -1 2123 1.8615500628948212e-01 + + -3.1655299663543701e-01 6.8877297639846802e-01 + <_> + + 0 -1 2124 3.1860999763011932e-02 + + -6.4266198873519897e-01 2.5550898909568787e-01 + <_> + + 0 -1 2125 1.4022000133991241e-02 + + -4.5926600694656372e-01 3.1171199679374695e-01 + <_> + + 0 -1 2126 -6.3029997982084751e-03 + + 4.6026900410652161e-01 -2.7438500523567200e-01 + <_> + + 0 -1 2127 -5.4310001432895660e-03 + + 3.6608600616455078e-01 -2.7205801010131836e-01 + <_> + + 0 -1 2128 1.6822999343276024e-02 + + 2.3476999253034592e-02 -8.8443797826766968e-01 + <_> + + 0 -1 2129 2.6039000600576401e-02 + + 1.7488799989223480e-01 -5.4564702510833740e-01 + <_> + + 0 -1 2130 -2.6720000430941582e-02 + + -9.6396499872207642e-01 2.3524999618530273e-02 + <_> + + 0 -1 2131 -1.7041999846696854e-02 + + -7.0848798751831055e-01 2.1468099951744080e-01 + <_> + + 0 -1 2132 5.9569999575614929e-03 + + 7.3601000010967255e-02 -6.8225598335266113e-01 + <_> + + 0 -1 2133 -2.8679999522864819e-03 + + -7.4935001134872437e-01 2.3803399503231049e-01 + <_> + + 0 -1 2134 -4.3774999678134918e-02 + + 6.8323302268981934e-01 -2.1380299329757690e-01 + <_> + + 0 -1 2135 5.1633000373840332e-02 + + -1.2566499412059784e-01 6.7523801326751709e-01 + <_> + + 0 -1 2136 8.1780003383755684e-03 + + 7.0689998567104340e-02 -8.0665898323059082e-01 + <_> + + 0 -1 2137 -5.2841998636722565e-02 + + 9.5433902740478516e-01 1.6548000276088715e-02 + <_> + + 0 -1 2138 5.2583999931812286e-02 + + -2.8414401412010193e-01 4.7129800915718079e-01 + <_> + + 0 -1 2139 -1.2659000232815742e-02 + + 3.8445401191711426e-01 -6.2288001179695129e-02 + <_> + + 0 -1 2140 1.1694000102579594e-02 + + 5.6000000768108293e-05 -1.0173139572143555e+00 + <_> + + 0 -1 2141 -2.3918999359011650e-02 + + 8.4921300411224365e-01 5.7399999350309372e-03 + <_> + + 0 -1 2142 -6.1673998832702637e-02 + + -9.2571401596069336e-01 -1.7679999582469463e-03 + <_> + + 0 -1 2143 -1.8279999494552612e-03 + + -5.4372298717498779e-01 2.4932399392127991e-01 + <_> + + 0 -1 2144 3.5257998853921890e-02 + + -7.3719997890293598e-03 -9.3963998556137085e-01 + <_> + + 0 -1 2145 -1.8438000231981277e-02 + + 7.2136700153350830e-01 1.0491999797523022e-02 + <_> + + 0 -1 2146 -3.8389001041650772e-02 + + 1.9272600114345551e-01 -3.5832101106643677e-01 + <_> + + 0 -1 2147 9.9720999598503113e-02 + + 1.1354199796915054e-01 -1.6304190158843994e+00 + <_> + + 0 -1 2148 8.4462001919746399e-02 + + -5.3420998156070709e-02 -1.6981120109558105e+00 + <_> + + 0 -1 2149 4.0270000696182251e-02 + + -1.0783199965953827e-01 5.1926600933074951e-01 + <_> + + 0 -1 2150 5.8935999870300293e-02 + + -1.8053700029850006e-01 9.5119798183441162e-01 + <_> + + 0 -1 2151 1.4957000315189362e-01 + + 1.6785299777984619e-01 -1.1591869592666626e+00 + <_> + + 0 -1 2152 6.9399998756125569e-04 + + 2.0491400361061096e-01 -3.3118200302124023e-01 + <_> + + 0 -1 2153 -3.3369001001119614e-02 + + 9.3468099832534790e-01 -2.9639999847859144e-03 + <_> + + 0 -1 2154 9.3759996816515923e-03 + + 3.7000000011175871e-03 -7.7549797296524048e-01 + <_> + + 0 -1 2155 4.3193999677896500e-02 + + -2.2040000185370445e-03 7.4589699506759644e-01 + <_> + + 0 -1 2156 -6.7555002868175507e-02 + + 7.2292101383209229e-01 -1.8404200673103333e-01 + <_> + + 0 -1 2157 -3.1168600916862488e-01 + + 1.0014270544052124e+00 3.4003000706434250e-02 + <_> + + 0 -1 2158 2.9743999242782593e-02 + + -4.6356000006198883e-02 -1.2781809568405151e+00 + <_> + + 0 -1 2159 1.0737000033259392e-02 + + 1.4812000095844269e-02 6.6649997234344482e-01 + <_> + + 0 -1 2160 -2.8841000050306320e-02 + + -9.4222599267959595e-01 -2.0796999335289001e-02 + <_> + + 0 -1 2161 -5.7649998925626278e-03 + + -4.3541899323463440e-01 2.3386000096797943e-01 + <_> + + 0 -1 2162 2.8410999104380608e-02 + + -1.7615799605846405e-01 8.5765302181243896e-01 + <_> + + 0 -1 2163 -2.9007999226450920e-02 + + 5.7978099584579468e-01 2.8565999120473862e-02 + <_> + + 0 -1 2164 2.4965999647974968e-02 + + -2.2729000076651573e-02 -9.6773099899291992e-01 + <_> + + 0 -1 2165 1.2036000378429890e-02 + + -1.4214700460433960e-01 5.1687997579574585e-01 + <_> + + 0 -1 2166 -4.2514000087976456e-02 + + 9.7273802757263184e-01 -1.8119800090789795e-01 + <_> + + 0 -1 2167 1.0276000015437603e-02 + + -8.3099998533725739e-02 3.1762799620628357e-01 + <_> + + 0 -1 2168 -6.9191999733448029e-02 + + -2.0668580532073975e+00 -6.0173999518156052e-02 + <_> + + 0 -1 2169 -4.6769999898970127e-03 + + 4.4131800532341003e-01 2.3209000006318092e-02 + <_> + + 0 -1 2170 -1.3923999853432178e-02 + + 2.8606700897216797e-01 -2.9152700304985046e-01 + <_> + + 0 -1 2171 -1.5333999879658222e-02 + + -5.7414501905441284e-01 2.3063300549983978e-01 + <_> + + 0 -1 2172 -1.0239000432193279e-02 + + 3.4479200839996338e-01 -2.6080399751663208e-01 + <_> + + 0 -1 2173 -5.0988998264074326e-02 + + 5.6154102087020874e-01 6.1218999326229095e-02 + <_> + + 0 -1 2174 3.0689999461174011e-02 + + -1.4772799611091614e-01 1.6378489732742310e+00 + <_> + + 0 -1 2175 -1.1223999783396721e-02 + + 2.4006199836730957e-01 -4.4864898920059204e-01 + <_> + + 0 -1 2176 -6.2899999320507050e-03 + + 4.3119499087333679e-01 -2.3808999359607697e-01 + <_> + + 0 -1 2177 7.8590996563434601e-02 + + 1.9865000620484352e-02 8.0853801965713501e-01 + <_> + + 0 -1 2178 -1.0178999975323677e-02 + + 1.8193200230598450e-01 -3.2877799868583679e-01 + <_> + + 0 -1 2179 3.1227000057697296e-02 + + 1.4973899722099304e-01 -1.4180339574813843e+00 + <_> + + 0 -1 2180 4.0196999907493591e-02 + + -1.9760499894618988e-01 5.8508199453353882e-01 + <_> + + 0 -1 2181 1.6138000413775444e-02 + + 5.0000002374872565e-04 3.9050000905990601e-01 + <_> + + 0 -1 2182 -4.5519001781940460e-02 + + 1.2646820545196533e+00 -1.5632599592208862e-01 + <_> + + 0 -1 2183 -1.8130000680685043e-02 + + 6.5148502588272095e-01 1.0235999710857868e-02 + <_> + + 0 -1 2184 -1.4001999981701374e-02 + + -1.0344820022583008e+00 -3.2182998955249786e-02 + <_> + + 0 -1 2185 -3.8816001266241074e-02 + + -4.7874298691749573e-01 1.6290700435638428e-01 + <_> + + 0 -1 2186 3.1656000763177872e-02 + + -2.0983399450778961e-01 5.4575902223587036e-01 + <_> + + 0 -1 2187 -1.0839999653398991e-02 + + 5.1898801326751709e-01 -1.5080000273883343e-02 + <_> + + 0 -1 2188 1.2032999657094479e-02 + + -2.1107600629329681e-01 7.5937002897262573e-01 + <_> + + 0 -1 2189 7.0772998034954071e-02 + + 1.8048800528049469e-01 -7.4048501253128052e-01 + <_> + + 0 -1 2190 5.3139799833297729e-01 + + -1.4491699635982513e-01 1.5360039472579956e+00 + <_> + + 0 -1 2191 -1.4774000272154808e-02 + + -2.8153699636459351e-01 2.0407299697399139e-01 + <_> + + 0 -1 2192 -2.2410000674426556e-03 + + -4.4876301288604736e-01 5.3989000618457794e-02 + <_> + + 0 -1 2193 4.9968000501394272e-02 + + 4.1514001786708832e-02 2.9417100548744202e-01 + <_> + + 0 -1 2194 -4.7701999545097351e-02 + + 3.9674299955368042e-01 -2.8301799297332764e-01 + <_> + + 0 -1 2195 -9.1311000287532806e-02 + + 2.1994259357452393e+00 8.7964996695518494e-02 + <_> + + 0 -1 2196 3.8070000708103180e-02 + + -2.8025600314140320e-01 2.5156199932098389e-01 + <_> + + 0 -1 2197 -1.5538999810814857e-02 + + 3.4157499670982361e-01 1.7924999818205833e-02 + <_> + + 0 -1 2198 -1.5445999801158905e-02 + + 2.8680199384689331e-01 -2.5135898590087891e-01 + <_> + + 0 -1 2199 -5.7388000190258026e-02 + + 6.3830000162124634e-01 8.8597998023033142e-02 + <_> + + 0 -1 2200 -5.9440000914037228e-03 + + 7.9016998410224915e-02 -4.0774899721145630e-01 + <_> + + 0 -1 2201 -6.9968998432159424e-02 + + -4.4644200801849365e-01 1.7219600081443787e-01 + <_> + + 0 -1 2202 -2.5064999237656593e-02 + + -9.8270201683044434e-01 -3.5388000309467316e-02 + <_> + + 0 -1 2203 1.7216000705957413e-02 + + 2.2705900669097900e-01 -8.0550098419189453e-01 + <_> + + 0 -1 2204 -4.4279001653194427e-02 + + 8.3951997756958008e-01 -1.7429600656032562e-01 + <_> + + 0 -1 2205 4.3988998979330063e-02 + + 1.1557199805974960e-01 -1.9666889905929565e+00 + <_> + + 0 -1 2206 1.5907000750303268e-02 + + -3.7576001137495041e-02 -1.0311100482940674e+00 + <_> + + 0 -1 2207 -9.2754997313022614e-02 + + -1.3530019521713257e+00 1.2141299992799759e-01 + <_> + + 0 -1 2208 7.1037001907825470e-02 + + -1.7684300243854523e-01 7.4485200643539429e-01 + <_> + + 0 -1 2209 5.7762000709772110e-02 + + 1.2835599482059479e-01 -4.4444200396537781e-01 + <_> + + 0 -1 2210 -1.6432000324130058e-02 + + 8.0152702331542969e-01 -1.7491699755191803e-01 + <_> + + 0 -1 2211 2.3939000442624092e-02 + + 1.6144999861717224e-01 -1.2364500015974045e-01 + <_> + + 0 -1 2212 1.2636000290513039e-02 + + 1.5411999821662903e-01 -3.3293798565864563e-01 + <_> + + 0 -1 2213 -5.4347999393939972e-02 + + -1.8400700092315674e+00 1.4835999906063080e-01 + <_> + + 0 -1 2214 -1.3261999934911728e-02 + + -8.0838799476623535e-01 -2.7726000174880028e-02 + <_> + + 0 -1 2215 6.1340001411736012e-03 + + -1.3785000145435333e-01 3.2858499884605408e-01 + <_> + + 0 -1 2216 2.8991000726819038e-02 + + -2.5516999885439873e-02 -8.3387202024459839e-01 + <_> + + 0 -1 2217 -2.1986000239849091e-02 + + -7.3739999532699585e-01 1.7887100577354431e-01 + <_> + + 0 -1 2218 5.3269998170435429e-03 + + -4.5449298620223999e-01 6.8791002035140991e-02 + <_> + + 0 -1 2219 8.6047999560832977e-02 + + 2.1008500456809998e-01 -3.7808901071548462e-01 + <_> + + 0 -1 2220 -8.5549997165799141e-03 + + 4.0134999155998230e-01 -2.1074099838733673e-01 + <_> + + 0 -1 2221 6.7790001630783081e-03 + + -2.1648999303579330e-02 4.5421499013900757e-01 + <_> + + 0 -1 2222 -6.3959998078644276e-03 + + -4.9818599224090576e-01 7.5907997786998749e-02 + <_> + + 0 -1 2223 8.9469999074935913e-03 + + 1.7857700586318970e-01 -2.8454899787902832e-01 + <_> + + 0 -1 2224 3.2589999027550220e-03 + + 4.6624999493360519e-02 -5.5206298828125000e-01 + <_> + + 0 -1 2225 4.1476998478174210e-02 + + 1.7550499737262726e-01 -2.0703999698162079e-01 + <_> + + 0 -1 2226 -6.7449999041855335e-03 + + -4.6392598748207092e-01 6.9303996860980988e-02 + <_> + + 0 -1 2227 3.0564999207854271e-02 + + 5.1734998822212219e-02 7.5550502538681030e-01 + <_> + + 0 -1 2228 -7.4780001305043697e-03 + + 1.4893899857997894e-01 -3.1906801462173462e-01 + <_> + + 0 -1 2229 8.9088998734951019e-02 + + 1.3738800585269928e-01 -1.1379710435867310e+00 + <_> + + 0 -1 2230 7.3230001144111156e-03 + + -2.8829199075698853e-01 1.9088600575923920e-01 + <_> + + 0 -1 2231 -1.8205000087618828e-02 + + -3.0178600549697876e-01 1.6795800626277924e-01 + <_> + + 0 -1 2232 -2.5828000158071518e-02 + + -9.8137998580932617e-01 -1.9860999658703804e-02 + <_> + + 0 -1 2233 1.0936199873685837e-01 + + 4.8790000379085541e-02 5.3118300437927246e-01 + <_> + + 0 -1 2234 -1.1424999684095383e-02 + + 2.3705999553203583e-01 -2.7925300598144531e-01 + <_> + + 0 -1 2235 -5.7565998286008835e-02 + + 4.7255399823188782e-01 6.5171003341674805e-02 + <_> + + 0 -1 2236 1.0278300195932388e-01 + + -2.0765100419521332e-01 5.0947701930999756e-01 + <_> + + 0 -1 2237 2.7041999623179436e-02 + + 1.6421200335025787e-01 -1.4508620500564575e+00 + <_> + + 0 -1 2238 -1.3635000213980675e-02 + + -5.6543898582458496e-01 2.3788999766111374e-02 + <_> + + 0 -1 2239 -3.2158198952674866e-01 + + -3.5602829456329346e+00 1.1801300197839737e-01 + <_> + + 0 -1 2240 2.0458100736141205e-01 + + -3.7016000598669052e-02 -1.0225499868392944e+00 + <_> + + 0 -1 2241 -7.0347003638744354e-02 + + -5.6491899490356445e-01 1.8525199592113495e-01 + <_> + + 0 -1 2242 3.7831000983715057e-02 + + -2.9901999980211258e-02 -8.2921499013900757e-01 + <_> + + 0 -1 2243 -7.0298001170158386e-02 + + -5.3172302246093750e-01 1.4430199563503265e-01 + <_> + + 0 -1 2244 6.3221000134944916e-02 + + -2.2041200101375580e-01 4.7952198982238770e-01 + <_> + + 0 -1 2245 3.6393001675605774e-02 + + 1.4222699403762817e-01 -6.1193901300430298e-01 + <_> + + 0 -1 2246 4.0099998004734516e-03 + + -3.4560799598693848e-01 1.1738699674606323e-01 + <_> + + 0 -1 2247 -4.9106001853942871e-02 + + 9.5984101295471191e-01 6.4934998750686646e-02 + <_> + + 0 -1 2248 -7.1583002805709839e-02 + + 1.7385669946670532e+00 -1.4252899587154388e-01 + <_> + + 0 -1 2249 -3.8008999079465866e-02 + + 1.3872820138931274e+00 6.6188000142574310e-02 + <_> + + 0 -1 2250 -3.1570000573992729e-03 + + 5.3677000105381012e-02 -5.4048001766204834e-01 + <_> + + 0 -1 2251 1.9458999857306480e-02 + + -9.3620002269744873e-02 3.9131000638008118e-01 + <_> + + 0 -1 2252 1.1293999850749969e-02 + + 3.7223998457193375e-02 -5.4251801967620850e-01 + <_> + + 0 -1 2253 -3.3495001494884491e-02 + + 9.5307898521423340e-01 3.7696998566389084e-02 + <_> + + 0 -1 2254 9.2035003006458282e-02 + + -1.3488399982452393e-01 2.2897069454193115e+00 + <_> + + 0 -1 2255 3.7529999390244484e-03 + + 2.2824199497699738e-01 -5.9983700513839722e-01 + <_> + + 0 -1 2256 1.2848000042140484e-02 + + -2.2005200386047363e-01 3.7221899628639221e-01 + <_> + + 0 -1 2257 -1.4316199719905853e-01 + + 1.2855789661407471e+00 4.7237001359462738e-02 + <_> + + 0 -1 2258 -9.6879996359348297e-02 + + -3.9550929069519043e+00 -7.2903998196125031e-02 + <_> + + 0 -1 2259 -8.8459998369216919e-03 + + 3.7674999237060547e-01 -4.6484000980854034e-02 + <_> + + 0 -1 2260 1.5900000929832458e-02 + + -2.4457000195980072e-02 -8.0034798383712769e-01 + <_> + + 0 -1 2261 7.0372000336647034e-02 + + 1.7019000649452209e-01 -6.3068997859954834e-01 + <_> + + 0 -1 2262 -3.7953998893499374e-02 + + -9.3667197227478027e-01 -4.1214000433683395e-02 + <_> + + 0 -1 2263 5.1597899198532104e-01 + + 1.3080599904060364e-01 -1.5802290439605713e+00 + <_> + + 0 -1 2264 -3.2843001186847687e-02 + + -1.1441620588302612e+00 -4.9173999577760696e-02 + <_> + + 0 -1 2265 -3.6357000470161438e-02 + + 4.9606400728225708e-01 -3.4458998590707779e-02 + <_> + + 0 -1 2266 6.8080001510679722e-03 + + -3.0997800827026367e-01 1.7054800689220428e-01 + <_> + + 0 -1 2267 -1.6114000231027603e-02 + + -3.7904599308967590e-01 1.6078999638557434e-01 + <_> + + 0 -1 2268 8.4530003368854523e-03 + + -1.8655499815940857e-01 5.6367701292037964e-01 + <_> + + 0 -1 2269 -1.3752399384975433e-01 + + -5.8989900350570679e-01 1.1749500036239624e-01 + <_> + + 0 -1 2270 1.7688000202178955e-01 + + -1.5424899756908417e-01 9.2911100387573242e-01 + <_> + + 0 -1 2271 7.9309996217489243e-03 + + 3.2190701365470886e-01 -1.6392600536346436e-01 + <_> + + 0 -1 2272 1.0971800237894058e-01 + + -1.5876500308513641e-01 1.0186259746551514e+00 + <_> + + 0 -1 2273 -3.0293000862002373e-02 + + 7.5587302446365356e-01 3.1794998794794083e-02 + <_> + + 0 -1 2274 -2.3118000477552414e-02 + + -8.8451498746871948e-01 -9.5039997249841690e-03 + <_> + + 0 -1 2275 -3.0900000128895044e-03 + + 2.3838299512863159e-01 -1.1606200039386749e-01 + <_> + + 0 -1 2276 -3.3392000943422318e-02 + + -1.8738139867782593e+00 -6.8502999842166901e-02 + <_> + + 0 -1 2277 1.3190000317990780e-02 + + 1.2919899821281433e-01 -6.7512202262878418e-01 + <_> + + 0 -1 2278 1.4661000110208988e-02 + + -2.4829000234603882e-02 -7.4396800994873047e-01 + <_> + + 0 -1 2279 -1.3248000293970108e-02 + + 4.6820199489593506e-01 -2.4165000766515732e-02 + <_> + + 0 -1 2280 -1.6218999400734901e-02 + + 4.0083798766136169e-01 -2.1255700290203094e-01 + <_> + + 0 -1 2281 -2.9052000492811203e-02 + + -1.5650019645690918e+00 1.4375899732112885e-01 + <_> + + 0 -1 2282 -1.0153199732303619e-01 + + -1.9220689535140991e+00 -6.9559998810291290e-02 + <_> + + 0 -1 2283 3.7753999233245850e-02 + + 1.3396799564361572e-01 -2.2639141082763672e+00 + <_> + + 0 -1 2284 -2.8555598855018616e-01 + + 1.0215270519256592e+00 -1.5232199430465698e-01 + <_> + + 0 -1 2285 1.5360699594020844e-01 + + -9.7409002482891083e-02 4.1662400960922241e-01 + <_> + + 0 -1 2286 -2.1199999901000410e-04 + + 1.1271899938583374e-01 -4.1653999686241150e-01 + <_> + + 0 -1 2287 -2.0597999915480614e-02 + + 6.0540497303009033e-01 6.2467999756336212e-02 + <_> + + 0 -1 2288 3.7353999912738800e-02 + + -1.8919000029563904e-01 4.6464699506759644e-01 + <_> + + 0 -1 2289 5.7275000959634781e-02 + + 1.1565300077199936e-01 -1.3213009834289551e+00 + <_> + + 0 -1 2290 5.1029999740421772e-03 + + -2.8061500191688538e-01 1.9313399493694305e-01 + <_> + + 0 -1 2291 -5.4644998162984848e-02 + + 7.2428500652313232e-01 7.5447998940944672e-02 + <_> + + 0 -1 2292 2.5349000468850136e-02 + + -1.9481800496578217e-01 4.6032801270484924e-01 + <_> + + 0 -1 2293 2.4311000481247902e-02 + + 1.5564100444316864e-01 -4.9913901090621948e-01 + <_> + + 0 -1 2294 3.5962000489234924e-02 + + -5.8573000133037567e-02 -1.5418399572372437e+00 + <_> + + 0 -1 2295 -1.0000699758529663e-01 + + -1.6100039482116699e+00 1.1450500041246414e-01 + <_> + + 0 -1 2296 8.4435999393463135e-02 + + -6.1406999826431274e-02 -1.4673349857330322e+00 + <_> + + 0 -1 2297 1.5947999432682991e-02 + + 1.6287900507450104e-01 -1.1026400327682495e-01 + <_> + + 0 -1 2298 3.3824000507593155e-02 + + -1.7932699620723724e-01 5.7218402624130249e-01 + <_> + + 0 -1 2299 -6.1996001750230789e-02 + + 4.6511812210083008e+00 9.4534002244472504e-02 + <_> + + 0 -1 2300 6.9876998662948608e-02 + + -1.6985900700092316e-01 8.7028998136520386e-01 + <_> + + 0 -1 2301 -2.7916999533772469e-02 + + 9.1042500734329224e-01 5.6827001273632050e-02 + <_> + + 0 -1 2302 -1.2764000333845615e-02 + + 2.2066700458526611e-01 -2.7769100666046143e-01 + <_> + 199 + -3.2573320865631104e+00 + + <_> + + 0 -1 2303 2.1662000566720963e-02 + + -8.9868897199630737e-01 2.9436299204826355e-01 + <_> + + 0 -1 2304 1.0044500231742859e-01 + + -3.7659201025962830e-01 6.0891002416610718e-01 + <_> + + 0 -1 2305 2.6003999635577202e-02 + + -3.8128501176834106e-01 3.9217400550842285e-01 + <_> + + 0 -1 2306 2.8441000729799271e-02 + + -1.8182300031185150e-01 5.8927202224731445e-01 + <_> + + 0 -1 2307 3.8612000644207001e-02 + + -2.2399599850177765e-01 6.3779997825622559e-01 + <_> + + 0 -1 2308 -4.6594999730587006e-02 + + 7.0812201499938965e-01 -1.4666199684143066e-01 + <_> + + 0 -1 2309 -4.2791999876499176e-02 + + 4.7680398821830750e-01 -2.9233199357986450e-01 + <_> + + 0 -1 2310 3.7960000336170197e-03 + + -1.8510299921035767e-01 5.2626699209213257e-01 + <_> + + 0 -1 2311 4.2348999530076981e-02 + + 3.9244998246431351e-02 -8.9197701215744019e-01 + <_> + + 0 -1 2312 1.9598999992012978e-02 + + -2.3358400166034698e-01 4.4146499037742615e-01 + <_> + + 0 -1 2313 8.7400001939386129e-04 + + -4.6063598990440369e-01 1.7689600586891174e-01 + <_> + + 0 -1 2314 -4.3629999272525311e-03 + + 3.3493199944496155e-01 -2.9893401265144348e-01 + <_> + + 0 -1 2315 1.6973000019788742e-02 + + -1.6408699750900269e-01 1.5993679761886597e+00 + <_> + + 0 -1 2316 3.6063998937606812e-02 + + 2.2601699829101562e-01 -5.3186100721359253e-01 + <_> + + 0 -1 2317 -7.0864997804164886e-02 + + 1.5220500528812408e-01 -4.1914600133895874e-01 + <_> + + 0 -1 2318 -6.3075996935367584e-02 + + -1.4874019622802734e+00 1.2953700125217438e-01 + <_> + + 0 -1 2319 2.9670000076293945e-02 + + -1.9145900011062622e-01 9.8184901475906372e-01 + <_> + + 0 -1 2320 3.7873998284339905e-02 + + 1.3459500670433044e-01 -5.6316298246383667e-01 + <_> + + 0 -1 2321 -3.3289000391960144e-02 + + -1.0828030109405518e+00 -1.1504000052809715e-02 + <_> + + 0 -1 2322 -3.1608998775482178e-02 + + -5.9224498271942139e-01 1.3394799828529358e-01 + <_> + + 0 -1 2323 1.0740000288933516e-03 + + -4.9185800552368164e-01 9.4446003437042236e-02 + <_> + + 0 -1 2324 -7.1556001901626587e-02 + + 5.9710198640823364e-01 -3.9553001523017883e-02 + <_> + + 0 -1 2325 -8.1170000135898590e-02 + + -1.1817820072174072e+00 -2.8254000470042229e-02 + <_> + + 0 -1 2326 4.4860001653432846e-03 + + -6.1028099060058594e-01 2.2619099915027618e-01 + <_> + + 0 -1 2327 -4.2176000773906708e-02 + + -1.1435619592666626e+00 -2.9001999646425247e-02 + <_> + + 0 -1 2328 -6.5640002489089966e-02 + + -1.6470279693603516e+00 1.2810300290584564e-01 + <_> + + 0 -1 2329 1.8188999965786934e-02 + + -3.1149399280548096e-01 2.5739601254463196e-01 + <_> + + 0 -1 2330 -5.1520001143217087e-02 + + -6.9206899404525757e-01 1.5270799398422241e-01 + <_> + + 0 -1 2331 -4.7150999307632446e-02 + + -7.1868300437927246e-01 2.6879999786615372e-03 + <_> + + 0 -1 2332 1.7488999292254448e-02 + + 2.2371199727058411e-01 -5.5381798744201660e-01 + <_> + + 0 -1 2333 -2.5264000520110130e-02 + + 1.0319819450378418e+00 -1.7496499419212341e-01 + <_> + + 0 -1 2334 -4.0745001286268234e-02 + + 4.4961598515510559e-01 3.9349000900983810e-02 + <_> + + 0 -1 2335 -3.7666998803615570e-02 + + -8.5475701093673706e-01 -1.2463999912142754e-02 + <_> + + 0 -1 2336 -1.3411000370979309e-02 + + 5.7845598459243774e-01 -1.7467999830842018e-02 + <_> + + 0 -1 2337 -7.8999997640494257e-05 + + -3.7749201059341431e-01 1.3961799442768097e-01 + <_> + + 0 -1 2338 -1.1415000073611736e-02 + + -2.6186600327491760e-01 2.3712499439716339e-01 + <_> + + 0 -1 2339 3.7200000137090683e-02 + + -2.8626000508666039e-02 -1.2945239543914795e+00 + <_> + + 0 -1 2340 3.4050000831484795e-03 + + 2.0531399548053741e-01 -1.8747499585151672e-01 + <_> + + 0 -1 2341 -2.2483000531792641e-02 + + 6.7027199268341064e-01 -1.9594000279903412e-01 + <_> + + 0 -1 2342 2.3274999111890793e-02 + + 1.7405399680137634e-01 -3.2746300101280212e-01 + <_> + + 0 -1 2343 -1.3917000032961369e-02 + + -8.3954298496246338e-01 -6.3760001212358475e-03 + <_> + + 0 -1 2344 7.5429999269545078e-03 + + -3.4194998443126678e-02 5.8998197317123413e-01 + <_> + + 0 -1 2345 -1.1539000086486340e-02 + + 4.2142799496650696e-01 -2.3510499298572540e-01 + <_> + + 0 -1 2346 5.2501998841762543e-02 + + 6.9303996860980988e-02 7.3226499557495117e-01 + <_> + + 0 -1 2347 5.2715998142957687e-02 + + -1.5688100457191467e-01 1.0907289981842041e+00 + <_> + + 0 -1 2348 -1.1726000346243382e-02 + + -7.0934301614761353e-01 1.6828800737857819e-01 + <_> + + 0 -1 2349 9.5945999026298523e-02 + + -1.6192899644374847e-01 1.0072519779205322e+00 + <_> + + 0 -1 2350 -1.5871999785304070e-02 + + 3.9008399844169617e-01 -5.3777001798152924e-02 + <_> + + 0 -1 2351 3.4818001091480255e-02 + + 1.7179999500513077e-02 -9.3941801786422729e-01 + <_> + + 0 -1 2352 3.4791998565196991e-02 + + 5.0462998449802399e-02 5.4465699195861816e-01 + <_> + + 0 -1 2353 1.6284000128507614e-02 + + -2.6981300115585327e-01 4.0365299582481384e-01 + <_> + + 0 -1 2354 -4.4319000095129013e-02 + + 8.4399998188018799e-01 3.2882999628782272e-02 + <_> + + 0 -1 2355 -5.5689997971057892e-03 + + 1.5309399366378784e-01 -3.4959799051284790e-01 + <_> + + 0 -1 2356 -6.5842002630233765e-02 + + -9.2711198329925537e-01 1.6800999641418457e-01 + <_> + + 0 -1 2357 -7.3337003588676453e-02 + + 5.1614499092102051e-01 -2.0236000418663025e-01 + <_> + + 0 -1 2358 1.6450000926852226e-02 + + 1.3950599730014801e-01 -4.9301299452781677e-01 + <_> + + 0 -1 2359 -9.2630004510283470e-03 + + -9.0101999044418335e-01 -1.6116000711917877e-02 + <_> + + 0 -1 2360 5.9139998629689217e-03 + + 1.9858199357986450e-01 -1.6731299459934235e-01 + <_> + + 0 -1 2361 -8.4699998842552304e-04 + + 9.4005003571510315e-02 -4.1570898890495300e-01 + <_> + + 0 -1 2362 2.0532900094985962e-01 + + -6.0022000223398209e-02 7.0993602275848389e-01 + <_> + + 0 -1 2363 -1.6883000731468201e-02 + + 2.4392199516296387e-01 -3.0551800131797791e-01 + <_> + + 0 -1 2364 -1.9111000001430511e-02 + + 6.1229902505874634e-01 2.4252999573945999e-02 + <_> + + 0 -1 2365 -2.5962999090552330e-02 + + 9.0764999389648438e-01 -1.6722099483013153e-01 + <_> + + 0 -1 2366 -2.1762000396847725e-02 + + -3.1384700536727905e-01 2.0134599506855011e-01 + <_> + + 0 -1 2367 -2.4119999259710312e-02 + + -6.6588401794433594e-01 7.4559999629855156e-03 + <_> + + 0 -1 2368 4.7129999846220016e-02 + + 5.9533998370170593e-02 8.7804502248764038e-01 + <_> + + 0 -1 2369 -4.5984998345375061e-02 + + 8.0067998170852661e-01 -1.7252300679683685e-01 + <_> + + 0 -1 2370 2.6507999747991562e-02 + + 1.8774099647998810e-01 -6.0850602388381958e-01 + <_> + + 0 -1 2371 -4.8615001142024994e-02 + + 5.8644098043441772e-01 -1.9427700340747833e-01 + <_> + + 0 -1 2372 -1.8562000244855881e-02 + + -2.5587901473045349e-01 1.6326199471950531e-01 + <_> + + 0 -1 2373 1.2678000144660473e-02 + + -1.4228000305593014e-02 -7.6738101243972778e-01 + <_> + + 0 -1 2374 -1.1919999960809946e-03 + + 2.0495000481605530e-01 -1.1404299736022949e-01 + <_> + + 0 -1 2375 -4.9088999629020691e-02 + + -1.0740849971771240e+00 -3.8940999656915665e-02 + <_> + + 0 -1 2376 -1.7436999827623367e-02 + + -5.7973802089691162e-01 1.8584500253200531e-01 + <_> + + 0 -1 2377 -1.4770000241696835e-02 + + -6.6150301694869995e-01 5.3119999356567860e-03 + <_> + + 0 -1 2378 -2.2905200719833374e-01 + + -4.8305100202560425e-01 1.2326399981975555e-01 + <_> + + 0 -1 2379 -1.2707099318504333e-01 + + 5.7452601194381714e-01 -1.9420400261878967e-01 + <_> + + 0 -1 2380 1.0339000262320042e-02 + + -5.4641999304294586e-02 2.4501800537109375e-01 + <_> + + 0 -1 2381 6.9010001607239246e-03 + + 1.2180600315332413e-01 -3.8797399401664734e-01 + <_> + + 0 -1 2382 2.9025399684906006e-01 + + 1.0966199636459351e-01 -30. + <_> + + 0 -1 2383 -2.3804999887943268e-01 + + -1.7352679967880249e+00 -6.3809998333454132e-02 + <_> + + 0 -1 2384 6.2481001019477844e-02 + + 1.3523000478744507e-01 -7.0301097631454468e-01 + <_> + + 0 -1 2385 4.7109997831285000e-03 + + -4.6984100341796875e-01 6.0341998934745789e-02 + <_> + + 0 -1 2386 -2.7815999463200569e-02 + + 6.9807600975036621e-01 1.3719999697059393e-03 + <_> + + 0 -1 2387 -1.7020000144839287e-02 + + 1.6870440244674683e+00 -1.4314800500869751e-01 + <_> + + 0 -1 2388 -4.9754999577999115e-02 + + 7.9497700929641724e-01 7.7199999941512942e-04 + <_> + + 0 -1 2389 -7.4732996523380280e-02 + + -1.0132360458374023e+00 -1.9388999789953232e-02 + <_> + + 0 -1 2390 3.2009001821279526e-02 + + 1.4412100613117218e-01 -4.2139101028442383e-01 + <_> + + 0 -1 2391 -9.4463996589183807e-02 + + 5.0682598352432251e-01 -2.0478899776935577e-01 + <_> + + 0 -1 2392 -1.5426999889314175e-02 + + -1.5811300277709961e-01 1.7806899547576904e-01 + <_> + + 0 -1 2393 -4.0540001355111599e-03 + + -5.4366701841354370e-01 3.1235000118613243e-02 + <_> + + 0 -1 2394 3.0080000869929790e-03 + + -1.7376799881458282e-01 3.0441701412200928e-01 + <_> + + 0 -1 2395 -1.0091999545693398e-02 + + 2.5103801488876343e-01 -2.6224100589752197e-01 + <_> + + 0 -1 2396 -3.8818001747131348e-02 + + 9.3226701021194458e-01 7.2659999132156372e-02 + <_> + + 0 -1 2397 3.4651998430490494e-02 + + -3.3934999257326126e-02 -8.5707902908325195e-01 + <_> + + 0 -1 2398 -4.6729999594390392e-03 + + 3.4969300031661987e-01 -4.8517998307943344e-02 + <_> + + 0 -1 2399 6.8499997723847628e-04 + + 6.6573001444339752e-02 -4.4973799586296082e-01 + <_> + + 0 -1 2400 3.5317000001668930e-02 + + 1.4275799691677094e-01 -4.6726399660110474e-01 + <_> + + 0 -1 2401 -2.3569999262690544e-02 + + -1.0286079645156860e+00 -4.5288000255823135e-02 + <_> + + 0 -1 2402 -1.9109999993816018e-03 + + -1.9652199745178223e-01 2.8661000728607178e-01 + <_> + + 0 -1 2403 -1.6659000888466835e-02 + + -7.7532202005386353e-01 -8.3280000835657120e-03 + <_> + + 0 -1 2404 6.6062200069427490e-01 + + 1.3232499361038208e-01 -3.5266680717468262e+00 + <_> + + 0 -1 2405 1.0970599949359894e-01 + + -1.5547199547290802e-01 1.4674140214920044e+00 + <_> + + 0 -1 2406 1.3500999659299850e-02 + + 1.5233400464057922e-01 -1.3020930290222168e+00 + <_> + + 0 -1 2407 -2.2871999070048332e-02 + + -7.1325999498367310e-01 -8.7040001526474953e-03 + <_> + + 0 -1 2408 -8.1821002066135406e-02 + + 1.1127580404281616e+00 8.3219997584819794e-02 + <_> + + 0 -1 2409 -5.2728001028299332e-02 + + 9.3165099620819092e-01 -1.7103999853134155e-01 + <_> + + 0 -1 2410 -2.5242000818252563e-02 + + -1.9733799993991852e-01 2.5359401106834412e-01 + <_> + + 0 -1 2411 -4.3818999081850052e-02 + + 4.1815200448036194e-01 -2.4585500359535217e-01 + <_> + + 0 -1 2412 -1.8188999965786934e-02 + + -5.1743197441101074e-01 2.0174199342727661e-01 + <_> + + 0 -1 2413 2.3466000333428383e-02 + + -4.3071001768112183e-02 -1.0636579990386963e+00 + <_> + + 0 -1 2414 3.4216001629829407e-02 + + 5.3780999034643173e-02 4.9707201123237610e-01 + <_> + + 0 -1 2415 2.5692999362945557e-02 + + -2.3800100386142731e-01 4.1651499271392822e-01 + <_> + + 0 -1 2416 -2.6565000414848328e-02 + + -8.8574802875518799e-01 1.3365900516510010e-01 + <_> + + 0 -1 2417 6.0942001640796661e-02 + + -2.0669700205326080e-01 5.8309000730514526e-01 + <_> + + 0 -1 2418 1.4474500715732574e-01 + + 1.3282300531864166e-01 -3.1449348926544189e+00 + <_> + + 0 -1 2419 5.3410999476909637e-02 + + -1.7325200140476227e-01 6.9190698862075806e-01 + <_> + + 0 -1 2420 1.1408000253140926e-02 + + 5.4822001606225967e-02 3.0240398645401001e-01 + <_> + + 0 -1 2421 -2.3179999552667141e-03 + + 1.5820899605751038e-01 -3.1973201036453247e-01 + <_> + + 0 -1 2422 -2.9695000499486923e-02 + + 7.1274799108505249e-01 5.8136001229286194e-02 + <_> + + 0 -1 2423 2.7249999344348907e-02 + + -1.5754100680351257e-01 9.2143797874450684e-01 + <_> + + 0 -1 2424 -3.6200000904500484e-03 + + -3.4548398852348328e-01 2.0220999419689178e-01 + <_> + + 0 -1 2425 -1.2578999623656273e-02 + + -5.5650299787521362e-01 2.0388999953866005e-02 + <_> + + 0 -1 2426 -8.8849000632762909e-02 + + -3.6100010871887207e+00 1.3164199888706207e-01 + <_> + + 0 -1 2427 -1.9256999716162682e-02 + + 5.1908999681472778e-01 -1.9284300506114960e-01 + <_> + + 0 -1 2428 -1.6666999086737633e-02 + + -8.7499998509883881e-02 1.5812499821186066e-01 + <_> + + 0 -1 2429 1.2931999750435352e-02 + + 2.7405999600887299e-02 -5.5123901367187500e-01 + <_> + + 0 -1 2430 -1.3431999832391739e-02 + + 2.3457799851894379e-01 -4.3235000222921371e-02 + <_> + + 0 -1 2431 1.8810000270605087e-02 + + -3.9680998772382736e-02 -9.4373297691345215e-01 + <_> + + 0 -1 2432 -6.4349998719990253e-03 + + 4.5703700184822083e-01 -4.0520001202821732e-03 + <_> + + 0 -1 2433 -2.4249000474810600e-02 + + -7.6248002052307129e-01 -1.9857000559568405e-02 + <_> + + 0 -1 2434 -2.9667999595403671e-02 + + -3.7412509918212891e+00 1.1250600218772888e-01 + <_> + + 0 -1 2435 5.1150000654160976e-03 + + -6.3781797885894775e-01 1.1223999783396721e-02 + <_> + + 0 -1 2436 -5.7819997891783714e-03 + + 1.9374400377273560e-01 -8.2042001187801361e-02 + <_> + + 0 -1 2437 1.6606999561190605e-02 + + -1.6192099452018738e-01 1.1334990262985229e+00 + <_> + + 0 -1 2438 3.8228001445531845e-02 + + 2.1105000749230385e-02 7.6264202594757080e-01 + <_> + + 0 -1 2439 -5.7094000279903412e-02 + + -1.6974929571151733e+00 -5.9762001037597656e-02 + <_> + + 0 -1 2440 -5.3883001208305359e-02 + + 1.1850190162658691e+00 9.0966999530792236e-02 + <_> + + 0 -1 2441 -2.6110000908374786e-03 + + -4.0941199660301208e-01 8.3820998668670654e-02 + <_> + + 0 -1 2442 2.9714399576187134e-01 + + 1.5529899299144745e-01 -1.0995409488677979e+00 + <_> + + 0 -1 2443 -8.9063003659248352e-02 + + 4.8947200179100037e-01 -2.0041200518608093e-01 + <_> + + 0 -1 2444 -5.6193001568317413e-02 + + -2.4581399559974670e-01 1.4365500211715698e-01 + <_> + + 0 -1 2445 3.7004999816417694e-02 + + -4.8168998211622238e-02 -1.2310709953308105e+00 + <_> + + 0 -1 2446 -8.4840003401041031e-03 + + 4.3372601270675659e-01 1.3779999688267708e-02 + <_> + + 0 -1 2447 -2.4379999376833439e-03 + + 1.8949699401855469e-01 -3.2294198870658875e-01 + <_> + + 0 -1 2448 -7.1639999747276306e-02 + + -4.3979001045227051e-01 2.2730199992656708e-01 + <_> + + 0 -1 2449 5.2260002121329308e-03 + + -2.0548400282859802e-01 5.0933301448822021e-01 + <_> + + 0 -1 2450 -6.1360001564025879e-03 + + 3.1157198548316956e-01 7.0680998265743256e-02 + <_> + + 0 -1 2451 1.5595000237226486e-02 + + -3.0934798717498779e-01 1.5627700090408325e-01 + <_> + + 0 -1 2452 2.5995999574661255e-02 + + 1.3821600377559662e-01 -1.7616599798202515e-01 + <_> + + 0 -1 2453 -1.2085000053048134e-02 + + -5.1070201396942139e-01 5.8440998196601868e-02 + <_> + + 0 -1 2454 -6.7836001515388489e-02 + + 4.7757101058959961e-01 -7.1446001529693604e-02 + <_> + + 0 -1 2455 -1.4715000055730343e-02 + + 4.5238900184631348e-01 -1.9861400127410889e-01 + <_> + + 0 -1 2456 2.5118999183177948e-02 + + 1.2954899668693542e-01 -8.6266398429870605e-01 + <_> + + 0 -1 2457 1.8826000392436981e-02 + + -4.1570000350475311e-02 -1.1354700326919556e+00 + <_> + + 0 -1 2458 -2.1263999864459038e-02 + + -3.4738001227378845e-01 1.5779499709606171e-01 + <_> + + 0 -1 2459 9.4609996303915977e-03 + + 4.8639997839927673e-03 -6.1654800176620483e-01 + <_> + + 0 -1 2460 2.2957700490951538e-01 + + 8.1372998654842377e-02 6.9841402769088745e-01 + <_> + + 0 -1 2461 -3.8061998784542084e-02 + + 1.1616369485855103e+00 -1.4976699650287628e-01 + <_> + + 0 -1 2462 -1.3484999537467957e-02 + + -3.2036399841308594e-01 1.7365099489688873e-01 + <_> + + 0 -1 2463 3.6238998174667358e-02 + + -1.8158499896526337e-01 6.1956697702407837e-01 + <_> + + 0 -1 2464 6.7210001870989799e-03 + + 7.9600000753998756e-04 4.2441400885581970e-01 + <_> + + 0 -1 2465 9.6525996923446655e-02 + + -1.4696800708770752e-01 1.2525680065155029e+00 + <_> + + 0 -1 2466 -3.5656999796628952e-02 + + -3.9781698584556580e-01 1.4191399514675140e-01 + <_> + + 0 -1 2467 1.0772000066936016e-02 + + -1.8194000422954559e-01 5.9762197732925415e-01 + <_> + + 0 -1 2468 7.9279996454715729e-02 + + 1.4642499387264252e-01 -7.8836899995803833e-01 + <_> + + 0 -1 2469 3.2841000705957413e-02 + + -6.2408000230789185e-02 -1.4227490425109863e+00 + <_> + + 0 -1 2470 -2.7781000360846519e-02 + + 3.4033098816871643e-01 3.0670000240206718e-02 + <_> + + 0 -1 2471 -4.0339999832212925e-03 + + 3.1084701418876648e-01 -2.2595700621604919e-01 + <_> + + 0 -1 2472 7.4260002002120018e-03 + + -3.8936998695135117e-02 3.1702101230621338e-01 + <_> + + 0 -1 2473 1.1213999986648560e-01 + + -1.7578299343585968e-01 6.5056598186492920e-01 + <_> + + 0 -1 2474 -1.1878100037574768e-01 + + -1.0092990398406982e+00 1.1069700121879578e-01 + <_> + + 0 -1 2475 -4.1584998369216919e-02 + + -5.3806400299072266e-01 1.9905000925064087e-02 + <_> + + 0 -1 2476 -2.7966000139713287e-02 + + 4.8143199086189270e-01 3.3590998500585556e-02 + <_> + + 0 -1 2477 -1.2506400048732758e-01 + + 2.6352199912071228e-01 -2.5737899541854858e-01 + <_> + + 0 -1 2478 2.3666900396347046e-01 + + 3.6508001387119293e-02 9.0655601024627686e-01 + <_> + + 0 -1 2479 -2.9475999996066093e-02 + + -6.0048800706863403e-01 9.5880003646016121e-03 + <_> + + 0 -1 2480 3.7792999297380447e-02 + + 1.5506200492382050e-01 -9.5733499526977539e-01 + <_> + + 0 -1 2481 7.2044000029563904e-02 + + -1.4525899291038513e-01 1.3676730394363403e+00 + <_> + + 0 -1 2482 9.7759999334812164e-03 + + 1.2915999628603458e-02 2.1640899777412415e-01 + <_> + + 0 -1 2483 5.2154000848531723e-02 + + -1.6359999775886536e-02 -8.8356298208236694e-01 + <_> + + 0 -1 2484 -4.3790999799966812e-02 + + 3.5829600691795349e-01 6.5131001174449921e-02 + <_> + + 0 -1 2485 -3.8378998637199402e-02 + + 1.1961040496826172e+00 -1.4971500635147095e-01 + <_> + + 0 -1 2486 -9.8838999867439270e-02 + + -6.1834001541137695e-01 1.2786200642585754e-01 + <_> + + 0 -1 2487 -1.2190700322389603e-01 + + -1.8276120424270630e+00 -6.4862996339797974e-02 + <_> + + 0 -1 2488 -1.1981700360774994e-01 + + -30. 1.1323300004005432e-01 + <_> + + 0 -1 2489 3.0910000205039978e-02 + + -2.3934000730514526e-01 3.6332899332046509e-01 + <_> + + 0 -1 2490 1.0800999589264393e-02 + + -3.5140000283718109e-02 2.7707898616790771e-01 + <_> + + 0 -1 2491 5.6844998151063919e-02 + + -1.5524299442768097e-01 1.0802700519561768e+00 + <_> + + 0 -1 2492 1.0280000278726220e-03 + + -6.1202999204397202e-02 2.0508000254631042e-01 + <_> + + 0 -1 2493 -2.8273999691009521e-02 + + -6.4778000116348267e-01 2.3917000740766525e-02 + <_> + + 0 -1 2494 -1.6013599932193756e-01 + + 1.0892050266265869e+00 5.8389000594615936e-02 + <_> + + 0 -1 2495 4.9629998393356800e-03 + + -2.5806298851966858e-01 2.0834599435329437e-01 + <_> + + 0 -1 2496 4.6937000006437302e-02 + + 1.3886299729347229e-01 -1.5662620067596436e+00 + <_> + + 0 -1 2497 2.4286000058054924e-02 + + -2.0728300511837006e-01 5.2430999279022217e-01 + <_> + + 0 -1 2498 7.0202000439167023e-02 + + 1.4796899259090424e-01 -1.3095090389251709e+00 + <_> + + 0 -1 2499 9.8120002076029778e-03 + + 2.7906000614166260e-02 -5.0864601135253906e-01 + <_> + + 0 -1 2500 -5.6200999766588211e-02 + + 1.2618130445480347e+00 6.3801996409893036e-02 + <_> + + 0 -1 2501 1.0982800275087357e-01 + + -1.2850099802017212e-01 3.0776169300079346e+00 + <_> + 211 + -3.3703000545501709e+00 + + <_> + + 0 -1 2502 2.0910000428557396e-02 + + -6.8559402227401733e-01 3.8984298706054688e-01 + <_> + + 0 -1 2503 3.5032000392675400e-02 + + -4.7724398970603943e-01 4.5027199387550354e-01 + <_> + + 0 -1 2504 3.9799001067876816e-02 + + -4.7011101245880127e-01 4.2702499032020569e-01 + <_> + + 0 -1 2505 -4.8409998416900635e-03 + + 2.5614300370216370e-01 -6.6556298732757568e-01 + <_> + + 0 -1 2506 2.3439999204128981e-03 + + -4.8083499073982239e-01 2.8013798594474792e-01 + <_> + + 0 -1 2507 2.5312999263405800e-02 + + -2.3948200047016144e-01 4.4191798567771912e-01 + <_> + + 0 -1 2508 -3.2193001359701157e-02 + + 7.6086699962615967e-01 -2.5059100985527039e-01 + <_> + + 0 -1 2509 7.5409002602100372e-02 + + -3.4974598884582520e-01 3.4380298852920532e-01 + <_> + + 0 -1 2510 -1.8469000235199928e-02 + + -7.9085600376129150e-01 3.4788001328706741e-02 + <_> + + 0 -1 2511 -1.2802000157535076e-02 + + 4.7107800841331482e-01 -6.0006000101566315e-02 + <_> + + 0 -1 2512 -2.6598000898957253e-02 + + 6.7116099596023560e-01 -2.4257500469684601e-01 + <_> + + 0 -1 2513 2.1988999098539352e-02 + + 2.4717499315738678e-01 -4.8301699757575989e-01 + <_> + + 0 -1 2514 1.4654099941253662e-01 + + -2.1504099667072296e-01 7.2055900096893311e-01 + <_> + + 0 -1 2515 3.5310001112520695e-03 + + 2.7930998802185059e-01 -3.4339898824691772e-01 + <_> + + 0 -1 2516 9.4010001048445702e-03 + + 5.5861998349428177e-02 -8.2143598794937134e-01 + <_> + + 0 -1 2517 -8.6390003561973572e-03 + + -9.9620598554611206e-01 1.8874999880790710e-01 + <_> + + 0 -1 2518 -3.9193000644445419e-02 + + -1.1945559978485107e+00 -2.9198000207543373e-02 + <_> + + 0 -1 2519 2.4855000898241997e-02 + + 1.4987599849700928e-01 -5.4137802124023438e-01 + <_> + + 0 -1 2520 -3.4995000809431076e-02 + + -1.4210180044174194e+00 -4.2314000427722931e-02 + <_> + + 0 -1 2521 -1.8378999084234238e-02 + + -2.8242599964141846e-01 1.5581800043582916e-01 + <_> + + 0 -1 2522 -1.3592000119388103e-02 + + 4.7317099571228027e-01 -2.1937200427055359e-01 + <_> + + 0 -1 2523 6.2629999592900276e-03 + + -5.9714000672101974e-02 6.0625898838043213e-01 + <_> + + 0 -1 2524 -1.8478000536561012e-02 + + -8.5647201538085938e-01 -1.3783999718725681e-02 + <_> + + 0 -1 2525 1.4236000366508961e-02 + + 1.6654799878597260e-01 -2.7713999152183533e-01 + <_> + + 0 -1 2526 -3.2547000795602798e-02 + + -1.1728240251541138e+00 -4.0185000747442245e-02 + <_> + + 0 -1 2527 -2.6410000864416361e-03 + + 2.6514300704002380e-01 -5.6343000382184982e-02 + <_> + + 0 -1 2528 -8.7799999164417386e-04 + + 3.6556001752614975e-02 -5.5075198411941528e-01 + <_> + + 0 -1 2529 4.7371998429298401e-02 + + -4.2614001780748367e-02 4.8194900155067444e-01 + <_> + + 0 -1 2530 -7.0790001191198826e-03 + + 2.8698998689651489e-01 -3.2923001050949097e-01 + <_> + + 0 -1 2531 -4.3145999312400818e-02 + + -1.4065419435501099e+00 1.2836399674415588e-01 + <_> + + 0 -1 2532 2.0592000335454941e-02 + + -2.1435299515724182e-01 5.3981798887252808e-01 + <_> + + 0 -1 2533 -2.2367000579833984e-02 + + 3.3718299865722656e-01 4.5212000608444214e-02 + <_> + + 0 -1 2534 5.0039999186992645e-02 + + -2.5121700763702393e-01 4.1750499606132507e-01 + <_> + + 0 -1 2535 6.1794999986886978e-02 + + 4.0084999054670334e-02 6.8779802322387695e-01 + <_> + + 0 -1 2536 -4.1861999779939651e-02 + + 5.3027397394180298e-01 -2.2901999950408936e-01 + <_> + + 0 -1 2537 -3.1959998887032270e-03 + + 2.5161498785018921e-01 -2.1514600515365601e-01 + <_> + + 0 -1 2538 2.4255000054836273e-02 + + 7.2320001199841499e-03 -7.2519099712371826e-01 + <_> + + 0 -1 2539 -1.7303999513387680e-02 + + -4.9958199262619019e-01 1.8394500017166138e-01 + <_> + + 0 -1 2540 -4.1470001451671124e-03 + + 8.5211999714374542e-02 -4.6364700794219971e-01 + <_> + + 0 -1 2541 -1.4369999989867210e-02 + + -5.2258902788162231e-01 2.3892599344253540e-01 + <_> + + 0 -1 2542 -9.0399999171495438e-03 + + -6.3250398635864258e-01 3.2551001757383347e-02 + <_> + + 0 -1 2543 -1.2373100221157074e-01 + + 1.2856210470199585e+00 7.6545000076293945e-02 + <_> + + 0 -1 2544 -8.2221999764442444e-02 + + 8.3208197355270386e-01 -1.8590599298477173e-01 + <_> + + 0 -1 2545 6.5659001469612122e-02 + + 1.1298800259828568e-01 -30. + <_> + + 0 -1 2546 -3.1582999974489212e-02 + + -1.3485900163650513e+00 -4.7097001224756241e-02 + <_> + + 0 -1 2547 -7.9636000096797943e-02 + + -1.3533639907836914e+00 1.5668800473213196e-01 + <_> + + 0 -1 2548 -1.8880000337958336e-02 + + 4.0300300717353821e-01 -2.5148901343345642e-01 + <_> + + 0 -1 2549 -5.0149997696280479e-03 + + -2.6287099719047546e-01 1.8582500517368317e-01 + <_> + + 0 -1 2550 -1.2218000367283821e-02 + + 5.8692401647567749e-01 -1.9427700340747833e-01 + <_> + + 0 -1 2551 1.2710000155493617e-03 + + -1.6688999533653259e-01 2.3006899654865265e-01 + <_> + + 0 -1 2552 2.9743999242782593e-02 + + 1.2520000338554382e-02 -6.6723597049713135e-01 + <_> + + 0 -1 2553 2.8175000101327896e-02 + + -1.7060000449419022e-02 6.4579397439956665e-01 + <_> + + 0 -1 2554 3.0345000326633453e-02 + + -2.4178700149059296e-01 3.4878900647163391e-01 + <_> + + 0 -1 2555 -1.7325999215245247e-02 + + -5.3599399328231812e-01 2.0995999872684479e-01 + <_> + + 0 -1 2556 -8.4178000688552856e-02 + + 7.5093299150466919e-01 -1.7593200504779816e-01 + <_> + + 0 -1 2557 7.4950000271201134e-03 + + -1.6188099980354309e-01 3.0657500028610229e-01 + <_> + + 0 -1 2558 5.6494999676942825e-02 + + -1.7318800091743469e-01 1.0016150474548340e+00 + <_> + + 0 -1 2559 -5.2939997985959053e-03 + + 2.3417599499225616e-01 -6.5347000956535339e-02 + <_> + + 0 -1 2560 -1.4945000410079956e-02 + + 2.5018900632858276e-01 -3.0591198801994324e-01 + <_> + + 0 -1 2561 5.4919000715017319e-02 + + 1.3121999800205231e-01 -9.3765097856521606e-01 + <_> + + 0 -1 2562 -1.9721999764442444e-02 + + -8.3978497982025146e-01 -2.3473000153899193e-02 + <_> + + 0 -1 2563 -6.7158997058868408e-02 + + 2.3586840629577637e+00 8.2970999181270599e-02 + <_> + + 0 -1 2564 -1.4325999654829502e-02 + + 1.8814499676227570e-01 -3.1221601366996765e-01 + <_> + + 0 -1 2565 2.9841000214219093e-02 + + 1.4825099706649780e-01 -8.4681701660156250e-01 + <_> + + 0 -1 2566 5.1883000880479813e-02 + + -4.3731000274419785e-02 -1.3366169929504395e+00 + <_> + + 0 -1 2567 4.1127000004053116e-02 + + 1.7660099267959595e-01 -6.0904097557067871e-01 + <_> + + 0 -1 2568 -1.2865099310874939e-01 + + -9.8701000213623047e-01 -3.7785001099109650e-02 + <_> + + 0 -1 2569 2.4170000106096268e-03 + + -1.6119599342346191e-01 3.2675701379776001e-01 + <_> + + 0 -1 2570 7.7030002139508724e-03 + + -2.3841500282287598e-01 2.9319399595260620e-01 + <_> + + 0 -1 2571 4.5520000159740448e-02 + + 1.4424599707126617e-01 -1.5010160207748413e+00 + <_> + + 0 -1 2572 -7.8700996935367584e-02 + + -1.0394560098648071e+00 -4.5375999063253403e-02 + <_> + + 0 -1 2573 7.8619997948408127e-03 + + 1.9633600115776062e-01 -1.4472399652004242e-01 + <_> + + 0 -1 2574 -1.3458999805152416e-02 + + -9.0634697675704956e-01 -3.8049001246690750e-02 + <_> + + 0 -1 2575 2.8827000409364700e-02 + + -2.9473999515175819e-02 6.0058397054672241e-01 + <_> + + 0 -1 2576 -2.7365999296307564e-02 + + -9.9804002046585083e-01 -3.8653001189231873e-02 + <_> + + 0 -1 2577 -7.2917997837066650e-02 + + 7.3361498117446899e-01 5.7440001517534256e-02 + <_> + + 0 -1 2578 -1.3988999649882317e-02 + + 2.7892601490020752e-01 -2.6516300439834595e-01 + <_> + + 0 -1 2579 4.3242998421192169e-02 + + 4.7760000452399254e-03 3.5925900936126709e-01 + <_> + + 0 -1 2580 2.9533000662922859e-02 + + -2.0083999633789062e-01 5.1202899217605591e-01 + <_> + + 0 -1 2581 -3.1897000968456268e-02 + + 6.4721697568893433e-01 -1.3760000001639128e-03 + <_> + + 0 -1 2582 3.7868998944759369e-02 + + -1.8363800644874573e-01 6.1343097686767578e-01 + <_> + + 0 -1 2583 -2.2417999804019928e-02 + + -2.9187899827957153e-01 1.8194800615310669e-01 + <_> + + 0 -1 2584 5.8958999812602997e-02 + + -6.6451996564865112e-02 -1.9290030002593994e+00 + <_> + + 0 -1 2585 3.1222999095916748e-02 + + -1.2732000090181828e-02 6.1560797691345215e-01 + <_> + + 0 -1 2586 3.7484999746084213e-02 + + -2.0856900513172150e-01 4.4363999366760254e-01 + <_> + + 0 -1 2587 -2.0966000854969025e-02 + + -3.5712799429893494e-01 2.4252200126647949e-01 + <_> + + 0 -1 2588 -2.5477999821305275e-02 + + 1.0846560001373291e+00 -1.5054400265216827e-01 + <_> + + 0 -1 2589 -7.2570000775158405e-03 + + 2.1302600204944611e-01 -1.8308199942111969e-01 + <_> + + 0 -1 2590 -5.0983000546693802e-02 + + 5.1736801862716675e-01 -1.8833099305629730e-01 + <_> + + 0 -1 2591 -2.0640000700950623e-02 + + -4.4030201435089111e-01 2.2745999693870544e-01 + <_> + + 0 -1 2592 1.0672999545931816e-02 + + 3.5059999674558640e-02 -5.1665002107620239e-01 + <_> + + 0 -1 2593 3.1895998865365982e-02 + + 1.3228000141680241e-02 3.4915199875831604e-01 + <_> + + 0 -1 2594 -2.3824999108910561e-02 + + 3.4118801355361938e-01 -2.1510200202465057e-01 + <_> + + 0 -1 2595 -6.0680001042783260e-03 + + 3.2937398552894592e-01 -2.8523799777030945e-01 + <_> + + 0 -1 2596 2.3881999775767326e-02 + + -2.5333800911903381e-01 2.6296100020408630e-01 + <_> + + 0 -1 2597 2.7966000139713287e-02 + + 1.4049099385738373e-01 -4.9887099862098694e-01 + <_> + + 0 -1 2598 1.4603000134229660e-02 + + -1.5395999886095524e-02 -7.6958000659942627e-01 + <_> + + 0 -1 2599 1.0872399806976318e-01 + + 1.9069600105285645e-01 -3.2393100857734680e-01 + <_> + + 0 -1 2600 -1.4038000255823135e-02 + + 3.4924700856208801e-01 -2.2358700633049011e-01 + <_> + + 0 -1 2601 4.0440000593662262e-03 + + -3.8329001516103745e-02 5.1177299022674561e-01 + <_> + + 0 -1 2602 -4.9769999459385872e-03 + + -4.2888298630714417e-01 4.9173999577760696e-02 + <_> + + 0 -1 2603 -8.5183002054691315e-02 + + 6.6624599695205688e-01 7.8079998493194580e-03 + <_> + + 0 -1 2604 2.1559998858720064e-03 + + -4.9135199189186096e-01 6.9555997848510742e-02 + <_> + + 0 -1 2605 3.6384499073028564e-01 + + 1.2997099757194519e-01 -1.8949509859085083e+00 + <_> + + 0 -1 2606 2.2082500159740448e-01 + + -5.7211998850107193e-02 -1.4281120300292969e+00 + <_> + + 0 -1 2607 -1.6140000894665718e-02 + + -5.7589399814605713e-01 1.8062500655651093e-01 + <_> + + 0 -1 2608 -4.8330001533031464e-02 + + 9.7308498620986938e-01 -1.6513000428676605e-01 + <_> + + 0 -1 2609 1.7529999837279320e-02 + + 1.7932699620723724e-01 -2.7948901057243347e-01 + <_> + + 0 -1 2610 -3.4309998154640198e-02 + + -8.1072497367858887e-01 -1.6596000641584396e-02 + <_> + + 0 -1 2611 -4.5830002054572105e-03 + + 2.7908998727798462e-01 -7.4519999325275421e-03 + <_> + + 0 -1 2612 1.2896400690078735e-01 + + -1.3508500158786774e-01 2.5411539077758789e+00 + <_> + + 0 -1 2613 3.0361000448465347e-02 + + -6.8419001996517181e-02 2.8734099864959717e-01 + <_> + + 0 -1 2614 4.4086001813411713e-02 + + -1.8135899305343628e-01 6.5413200855255127e-01 + <_> + + 0 -1 2615 3.0159999150782824e-03 + + -1.5690499544143677e-01 2.6963800191879272e-01 + <_> + + 0 -1 2616 -2.6336999610066414e-02 + + 2.9175600409507751e-01 -2.5274100899696350e-01 + <_> + + 0 -1 2617 -2.7866000309586525e-02 + + 4.4387501478195190e-01 5.5038001388311386e-02 + <_> + + 0 -1 2618 1.1725000105798244e-02 + + -1.9346499443054199e-01 4.6656700968742371e-01 + <_> + + 0 -1 2619 1.5689999563619494e-03 + + -8.2360003143548965e-03 2.5700899958610535e-01 + <_> + + 0 -1 2620 -3.5550000611692667e-03 + + -4.2430898547172546e-01 7.1174003183841705e-02 + <_> + + 0 -1 2621 -3.1695000827312469e-02 + + -8.5393500328063965e-01 1.6916200518608093e-01 + <_> + + 0 -1 2622 -3.2097000628709793e-02 + + 8.3784902095794678e-01 -1.7597299814224243e-01 + <_> + + 0 -1 2623 1.5544199943542480e-01 + + 9.9550001323223114e-02 2.3873300552368164e+00 + <_> + + 0 -1 2624 8.8045999407768250e-02 + + -1.8725299835205078e-01 6.2384301424026489e-01 + <_> + + 0 -1 2625 -1.6720000421628356e-03 + + 2.5008699297904968e-01 -6.5118998289108276e-02 + <_> + + 0 -1 2626 9.3409996479749680e-03 + + -3.5378900170326233e-01 1.0715000331401825e-01 + <_> + + 0 -1 2627 3.7138000130653381e-02 + + 1.6387000679969788e-01 -9.1718399524688721e-01 + <_> + + 0 -1 2628 8.0183997750282288e-02 + + -1.4812999963760376e-01 1.4895190000534058e+00 + <_> + + 0 -1 2629 -7.9100002767518163e-04 + + -2.1326899528503418e-01 1.9676400721073151e-01 + <_> + + 0 -1 2630 -5.0400001928210258e-03 + + -7.1318697929382324e-01 1.8240000354126096e-03 + <_> + + 0 -1 2631 1.1962399631738663e-01 + + 3.3098999410867691e-02 1.0441709756851196e+00 + <_> + + 0 -1 2632 -4.5280000194907188e-03 + + -2.7308499813079834e-01 2.7229800820350647e-01 + <_> + + 0 -1 2633 -2.9639000073075294e-02 + + 3.6225798726081848e-01 5.6795001029968262e-02 + <_> + + 0 -1 2634 2.6650000363588333e-02 + + -4.8041000962257385e-02 -9.6723502874374390e-01 + <_> + + 0 -1 2635 4.4422000646591187e-02 + + 1.3052900135517120e-01 -3.5077300667762756e-01 + <_> + + 0 -1 2636 -2.4359999224543571e-02 + + -1.0766899585723877e+00 -5.1222998648881912e-02 + <_> + + 0 -1 2637 1.9734999164938927e-02 + + 2.6238000020384789e-02 2.8070500493049622e-01 + <_> + + 0 -1 2638 5.4930001497268677e-03 + + -2.6111298799514771e-01 2.1011400222778320e-01 + <_> + + 0 -1 2639 -2.3200300335884094e-01 + + -1.7748440504074097e+00 1.1482600122690201e-01 + <_> + + 0 -1 2640 -2.5614000856876373e-02 + + 2.9900801181793213e-01 -2.2502499818801880e-01 + <_> + + 0 -1 2641 -6.4949998632073402e-03 + + 1.9563800096511841e-01 -9.9762998521327972e-02 + <_> + + 0 -1 2642 3.9840000681579113e-03 + + -4.3021500110626221e-01 8.1261001527309418e-02 + <_> + + 0 -1 2643 -3.5813000053167343e-02 + + -5.0987398624420166e-01 1.6345900297164917e-01 + <_> + + 0 -1 2644 -1.4169000089168549e-02 + + 7.7978098392486572e-01 -1.7476299405097961e-01 + <_> + + 0 -1 2645 -1.2642100453376770e-01 + + -6.3047897815704346e-01 1.2728300690650940e-01 + <_> + + 0 -1 2646 6.8677999079227448e-02 + + -4.6447999775409698e-02 -1.1128979921340942e+00 + <_> + + 0 -1 2647 8.5864998400211334e-02 + + 1.1835400015115738e-01 -4.8235158920288086e+00 + <_> + + 0 -1 2648 1.5511999838054180e-02 + + -1.7467999830842018e-02 -6.3693398237228394e-01 + <_> + + 0 -1 2649 8.1091001629829407e-02 + + 8.6133003234863281e-02 2.4559431076049805e+00 + <_> + + 0 -1 2650 1.8495000898838043e-02 + + 4.0229000151157379e-02 -5.0858199596405029e-01 + <_> + + 0 -1 2651 -8.6320996284484863e-02 + + -1.9006760120391846e+00 1.1019100248813629e-01 + <_> + + 0 -1 2652 7.2355002164840698e-02 + + -6.2111999839544296e-02 -1.4165179729461670e+00 + <_> + + 0 -1 2653 -7.8179001808166504e-02 + + 8.8849300146102905e-01 4.2369998991489410e-02 + <_> + + 0 -1 2654 9.6681997179985046e-02 + + -2.2094200551509857e-01 3.3575099706649780e-01 + <_> + + 0 -1 2655 -3.9875999093055725e-02 + + 5.7804799079895020e-01 4.5347999781370163e-02 + <_> + + 0 -1 2656 -9.5349997282028198e-03 + + -5.4175698757171631e-01 3.2399999909102917e-03 + <_> + + 0 -1 2657 4.0600000647827983e-04 + + -8.1549003720283508e-02 3.5837900638580322e-01 + <_> + + 0 -1 2658 1.2107999995350838e-02 + + -2.0280399918556213e-01 4.3768000602722168e-01 + <_> + + 0 -1 2659 -2.0873999223113060e-02 + + 4.1469898819923401e-01 -4.5568000525236130e-02 + <_> + + 0 -1 2660 5.7888001203536987e-02 + + -2.9009999707341194e-02 -9.1822302341461182e-01 + <_> + + 0 -1 2661 1.3200000103097409e-04 + + -1.1772400140762329e-01 2.0000000298023224e-01 + <_> + + 0 -1 2662 -1.7137000337243080e-02 + + 3.3004799485206604e-01 -2.3055200278759003e-01 + <_> + + 0 -1 2663 3.0655000358819962e-02 + + -2.1545000374317169e-02 2.6878198981285095e-01 + <_> + + 0 -1 2664 -7.8699999721720815e-04 + + -4.4100698828697205e-01 4.9157999455928802e-02 + <_> + + 0 -1 2665 8.8036999106407166e-02 + + 1.1782000213861465e-01 -2.8293309211730957e+00 + <_> + + 0 -1 2666 -3.9028998464345932e-02 + + 9.1777199506759644e-01 -1.5827399492263794e-01 + <_> + + 0 -1 2667 8.0105997622013092e-02 + + 1.1289200186729431e-01 -1.9937280416488647e+00 + <_> + + 0 -1 2668 3.9538998156785965e-02 + + -1.4357399940490723e-01 1.3085240125656128e+00 + <_> + + 0 -1 2669 2.0684000104665756e-02 + + 2.0048099756240845e-01 -4.4186998158693314e-02 + <_> + + 0 -1 2670 -6.7037999629974365e-02 + + 3.2618600130081177e-01 -2.0550400018692017e-01 + <_> + + 0 -1 2671 4.6815000474452972e-02 + + 1.5825299918651581e-01 -9.5535099506378174e-01 + <_> + + 0 -1 2672 7.8443996608257294e-02 + + -7.4651002883911133e-02 -2.1161499023437500e+00 + <_> + + 0 -1 2673 6.6380001604557037e-02 + + 1.1641900241374969e-01 -1.6113519668579102e+00 + <_> + + 0 -1 2674 3.0053999274969101e-02 + + -1.6562600433826447e-01 7.0025402307510376e-01 + <_> + + 0 -1 2675 1.7119999974966049e-02 + + 2.2627699375152588e-01 -4.0114998817443848e-01 + <_> + + 0 -1 2676 2.0073000341653824e-02 + + -1.9389699399471283e-01 4.4420298933982849e-01 + <_> + + 0 -1 2677 3.3101998269557953e-02 + + 1.1637499928474426e-01 -1.5771679878234863e+00 + <_> + + 0 -1 2678 -1.4882000163197517e-02 + + -8.9680302143096924e-01 -4.2010001838207245e-02 + <_> + + 0 -1 2679 -1.0281000286340714e-02 + + 3.5602998733520508e-01 -1.3124000281095505e-02 + <_> + + 0 -1 2680 -2.8695000335574150e-02 + + -4.6039599180221558e-01 2.6801999658346176e-02 + <_> + + 0 -1 2681 -4.7189998440444469e-03 + + 2.3788799345493317e-01 -6.5518997609615326e-02 + <_> + + 0 -1 2682 3.2201600074768066e-01 + + -2.8489999473094940e-02 -8.4234601259231567e-01 + <_> + + 0 -1 2683 -1.7045000568032265e-02 + + -5.0938802957534790e-01 1.6057600080966949e-01 + <_> + + 0 -1 2684 -7.3469998314976692e-03 + + -5.4154998064041138e-01 4.7320001758635044e-03 + <_> + + 0 -1 2685 -3.0001999810338020e-02 + + -8.8785797357559204e-01 1.3621799647808075e-01 + <_> + + 0 -1 2686 -1.1292999610304832e-02 + + 8.0615198612213135e-01 -1.6159500181674957e-01 + <_> + + 0 -1 2687 4.7749998047947884e-03 + + 1.2968000024557114e-02 5.5079901218414307e-01 + <_> + + 0 -1 2688 5.0710001960396767e-03 + + -4.5728001743555069e-02 -1.0766259431838989e+00 + <_> + + 0 -1 2689 1.9344100356101990e-01 + + 7.1262001991271973e-02 1.1694519519805908e+00 + <_> + + 0 -1 2690 5.3750001825392246e-03 + + -1.9736200571060181e-01 3.8206899166107178e-01 + <_> + + 0 -1 2691 -6.8276003003120422e-02 + + -5.4372339248657227e+00 1.1151900142431259e-01 + <_> + + 0 -1 2692 -3.4933000802993774e-02 + + 4.4793400168418884e-01 -1.8657900393009186e-01 + <_> + + 0 -1 2693 5.1219998858869076e-03 + + -1.4871999621391296e-02 1.8413899838924408e-01 + <_> + + 0 -1 2694 9.5311999320983887e-02 + + -1.5117099881172180e-01 9.4991499185562134e-01 + <_> + + 0 -1 2695 -6.2849000096321106e-02 + + 4.6473601460456848e-01 3.8405001163482666e-02 + <_> + + 0 -1 2696 -1.7040699720382690e-01 + + -1.6499999761581421e+00 -6.3236996531486511e-02 + <_> + + 0 -1 2697 1.0583999566733837e-02 + + -3.8348998874425888e-02 4.1913801431655884e-01 + <_> + + 0 -1 2698 -4.1579000651836395e-02 + + 3.4461900591850281e-01 -2.1187700331211090e-01 + <_> + + 0 -1 2699 1.2718600034713745e-01 + + 1.2398199737071991e-01 -2.1254889965057373e+00 + <_> + + 0 -1 2700 8.2557000219821930e-02 + + -6.2024001032114029e-02 -1.4875819683074951e+00 + <_> + + 0 -1 2701 8.5293002426624298e-02 + + 1.7087999731302261e-02 3.2076600193977356e-01 + <_> + + 0 -1 2702 5.5544000118970871e-02 + + -2.7414000034332275e-01 1.8976399302482605e-01 + <_> + + 0 -1 2703 4.5650000683963299e-03 + + -1.7920200526714325e-01 2.7967301011085510e-01 + <_> + + 0 -1 2704 1.2997999787330627e-02 + + -3.2297500967979431e-01 2.6941800117492676e-01 + <_> + + 0 -1 2705 5.7891998440027237e-02 + + 1.2644399702548981e-01 -6.0713499784469604e-01 + <_> + + 0 -1 2706 -2.2824000567197800e-02 + + -4.9682098627090454e-01 2.2376999258995056e-02 + <_> + + 0 -1 2707 4.8312000930309296e-02 + + 4.3607000261545181e-02 4.8537799715995789e-01 + <_> + + 0 -1 2708 2.5714000687003136e-02 + + -4.2950998991727829e-02 -9.3023502826690674e-01 + <_> + + 0 -1 2709 6.9269998930394650e-03 + + -2.9680000152438879e-03 3.4296301007270813e-01 + <_> + + 0 -1 2710 -3.4446999430656433e-02 + + -1.5299769639968872e+00 -6.1014998704195023e-02 + <_> + + 0 -1 2711 2.9387999325990677e-02 + + 3.7595998495817184e-02 6.4172399044036865e-01 + <_> + + 0 -1 2712 -2.4319998919963837e-03 + + 9.9088996648788452e-02 -3.9688101410865784e-01 + <_> + 200 + -2.9928278923034668e+00 + + <_> + + 0 -1 2713 -9.5944002270698547e-02 + + 6.2419098615646362e-01 -4.5875200629234314e-01 + <_> + + 0 -1 2714 1.6834000125527382e-02 + + -9.3072801828384399e-01 2.1563600003719330e-01 + <_> + + 0 -1 2715 2.6049999520182610e-02 + + -4.0532299876213074e-01 4.2256599664688110e-01 + <_> + + 0 -1 2716 3.6500001442618668e-04 + + 9.5288001000881195e-02 -6.3298100233078003e-01 + <_> + + 0 -1 2717 -6.6940002143383026e-03 + + 3.7243801355361938e-01 -3.0332401394844055e-01 + <_> + + 0 -1 2718 1.8874000757932663e-02 + + -2.3357200622558594e-01 4.0330699086189270e-01 + <_> + + 0 -1 2719 -1.6300000424962491e-04 + + 4.2886998504400253e-02 -7.7796798944473267e-01 + <_> + + 0 -1 2720 -7.6259002089500427e-02 + + -4.9628499150276184e-01 1.6335399448871613e-01 + <_> + + 0 -1 2721 5.0149001181125641e-02 + + 3.2747000455856323e-02 -8.0047899484634399e-01 + <_> + + 0 -1 2722 -2.9239999130368233e-03 + + -5.0002801418304443e-01 2.5480601191520691e-01 + <_> + + 0 -1 2723 1.6243999823927879e-02 + + 3.8913000375032425e-02 -7.0724898576736450e-01 + <_> + + 0 -1 2724 3.7811998277902603e-02 + + -6.6267997026443481e-02 7.3868799209594727e-01 + <_> + + 0 -1 2725 -1.2319999746978283e-02 + + 4.8696398735046387e-01 -2.4485599994659424e-01 + <_> + + 0 -1 2726 5.8003999292850494e-02 + + 1.3459099829196930e-01 -1.3232100009918213e-01 + <_> + + 0 -1 2727 4.8630000092089176e-03 + + -4.4172900915145874e-01 1.4005599915981293e-01 + <_> + + 0 -1 2728 4.5690998435020447e-02 + + 3.1217999756336212e-02 8.9818298816680908e-01 + <_> + + 0 -1 2729 2.1321000531315804e-02 + + 1.2008000165224075e-02 -8.6066198348999023e-01 + <_> + + 0 -1 2730 1.5679100155830383e-01 + + 1.4055999927222729e-02 8.5332900285720825e-01 + <_> + + 0 -1 2731 -1.0328999720513821e-02 + + 2.9022800922393799e-01 -2.9478800296783447e-01 + <_> + + 0 -1 2732 2.4290001019835472e-03 + + -4.0439900755882263e-01 1.9400200247764587e-01 + <_> + + 0 -1 2733 -2.3338999599218369e-02 + + 3.2945200800895691e-01 -2.5712698698043823e-01 + <_> + + 0 -1 2734 -6.8970001302659512e-03 + + -5.3352999687194824e-01 2.1635200083255768e-01 + <_> + + 0 -1 2735 -3.4403000026941299e-02 + + -1.4425489902496338e+00 -4.4682998210191727e-02 + <_> + + 0 -1 2736 -2.1235000342130661e-02 + + -7.9017502069473267e-01 1.9084100425243378e-01 + <_> + + 0 -1 2737 2.0620001014322042e-03 + + -2.6931199431419373e-01 3.1488001346588135e-01 + <_> + + 0 -1 2738 -4.2190002277493477e-03 + + -5.4464399814605713e-01 1.6574600338935852e-01 + <_> + + 0 -1 2739 -1.4334999956190586e-02 + + 2.2105000913143158e-02 -6.2342500686645508e-01 + <_> + + 0 -1 2740 -8.2120001316070557e-03 + + -4.9884998798370361e-01 1.9237099587917328e-01 + <_> + + 0 -1 2741 -9.3350000679492950e-03 + + -7.9131197929382324e-01 -1.4143999665975571e-02 + <_> + + 0 -1 2742 -3.7937998771667480e-02 + + 7.9841297864913940e-01 -3.3799000084400177e-02 + <_> + + 0 -1 2743 4.7059999778866768e-03 + + -3.3163401484489441e-01 2.0726299285888672e-01 + <_> + + 0 -1 2744 -4.4499998912215233e-03 + + -2.7256301045417786e-01 1.8402199447154999e-01 + <_> + + 0 -1 2745 5.2189999260008335e-03 + + -5.3096002340316772e-01 5.2607998251914978e-02 + <_> + + 0 -1 2746 -9.5399999991059303e-03 + + -5.6485402584075928e-01 1.9269399344921112e-01 + <_> + + 0 -1 2747 4.4969998300075531e-02 + + -1.7411500215530396e-01 9.5382601022720337e-01 + <_> + + 0 -1 2748 1.4209000393748283e-02 + + -9.1949000954627991e-02 2.4836100637912750e-01 + <_> + + 0 -1 2749 1.6380199790000916e-01 + + -5.8497000485658646e-02 -1.6404409408569336e+00 + <_> + + 0 -1 2750 2.5579999200999737e-03 + + 2.3447999358177185e-01 -9.2734001576900482e-02 + <_> + + 0 -1 2751 -3.8499999791383743e-03 + + 1.7880700528621674e-01 -3.5844099521636963e-01 + <_> + + 0 -1 2752 -2.5221999734640121e-02 + + -4.2903000116348267e-01 2.0244500041007996e-01 + <_> + + 0 -1 2753 -1.9415000453591347e-02 + + 5.8016300201416016e-01 -1.8806399405002594e-01 + <_> + + 0 -1 2754 1.4419999904930592e-02 + + 3.2846998423337936e-02 8.1980502605438232e-01 + <_> + + 0 -1 2755 5.1582999527454376e-02 + + 6.9176003336906433e-02 -4.5866298675537109e-01 + <_> + + 0 -1 2756 -3.7960000336170197e-02 + + -1.2553000450134277e+00 1.4332899451255798e-01 + <_> + + 0 -1 2757 -2.9560999944806099e-02 + + 5.3151798248291016e-01 -2.0596499741077423e-01 + <_> + + 0 -1 2758 -3.9110999554395676e-02 + + 1.1658719778060913e+00 5.3897000849246979e-02 + <_> + + 0 -1 2759 -2.9159000143408775e-02 + + 3.9307600259780884e-01 -2.2184500098228455e-01 + <_> + + 0 -1 2760 -8.3617001771926880e-02 + + -7.3744499683380127e-01 1.4268200099468231e-01 + <_> + + 0 -1 2761 4.2004001140594482e-01 + + -1.4277400076389313e-01 1.7894840240478516e+00 + <_> + + 0 -1 2762 6.0005001723766327e-02 + + 1.1976700276136398e-01 -1.8886189460754395e+00 + <_> + + 0 -1 2763 -1.8981000408530235e-02 + + -1.4148449897766113e+00 -5.6522998958826065e-02 + <_> + + 0 -1 2764 -6.0049998573958874e-03 + + 4.4170799851417542e-01 -1.0200800001621246e-01 + <_> + + 0 -1 2765 -5.8214001357555389e-02 + + -1.3918470144271851e+00 -4.8268999904394150e-02 + <_> + + 0 -1 2766 -1.2271000072360039e-02 + + 5.1317697763442993e-01 -9.3696996569633484e-02 + <_> + + 0 -1 2767 4.6585999429225922e-02 + + -5.7484000921249390e-02 -1.4283169507980347e+00 + <_> + + 0 -1 2768 1.2110000243410468e-03 + + -8.0891996622085571e-02 3.2333201169967651e-01 + <_> + + 0 -1 2769 -8.8642001152038574e-02 + + -8.6449098587036133e-01 -3.3146999776363373e-02 + <_> + + 0 -1 2770 -2.3184999823570251e-02 + + 5.2162200212478638e-01 -1.6168000176548958e-02 + <_> + + 0 -1 2771 4.3090000748634338e-02 + + -1.6153800487518311e-01 1.0915000438690186e+00 + <_> + + 0 -1 2772 2.0599999697878957e-04 + + -1.7091499269008636e-01 3.1236699223518372e-01 + <_> + + 0 -1 2773 8.9159999042749405e-03 + + -6.7039998248219490e-03 -6.8810397386550903e-01 + <_> + + 0 -1 2774 -1.7752999439835548e-02 + + 6.3292801380157471e-01 -4.2360001243650913e-03 + <_> + + 0 -1 2775 6.2299999408423901e-03 + + -3.3637198805809021e-01 1.2790599465370178e-01 + <_> + + 0 -1 2776 2.2770000621676445e-02 + + -3.4703999757766724e-02 3.9141800999641418e-01 + <_> + + 0 -1 2777 -2.1534999832510948e-02 + + 6.4765101671218872e-01 -2.0097799599170685e-01 + <_> + + 0 -1 2778 6.1758998781442642e-02 + + 5.4297000169754028e-02 9.0700101852416992e-01 + <_> + + 0 -1 2779 -7.8069999814033508e-02 + + 6.5523397922515869e-01 -1.9754399359226227e-01 + <_> + + 0 -1 2780 1.1315000243484974e-02 + + 1.9385300576686859e-01 -5.1707297563552856e-01 + <_> + + 0 -1 2781 -2.5590000674128532e-02 + + -9.3096500635147095e-01 -3.1546998769044876e-02 + <_> + + 0 -1 2782 -3.8058999925851822e-02 + + -6.8326902389526367e-01 1.2709100544452667e-01 + <_> + + 0 -1 2783 9.7970003262162209e-03 + + 1.5523999929428101e-02 -6.3347899913787842e-01 + <_> + + 0 -1 2784 -1.3841999694705009e-02 + + 1.0060529708862305e+00 6.2812998890876770e-02 + <_> + + 0 -1 2785 8.3459997549653053e-03 + + -2.3383200168609619e-01 3.0982699990272522e-01 + <_> + + 0 -1 2786 -7.1439996361732483e-02 + + -7.2505402565002441e-01 1.7148299515247345e-01 + <_> + + 0 -1 2787 1.0006000287830830e-02 + + -2.2071999311447144e-01 3.5266199707984924e-01 + <_> + + 0 -1 2788 1.1005300283432007e-01 + + 1.6662000119686127e-01 -7.4318999052047729e-01 + <_> + + 0 -1 2789 3.5310998558998108e-02 + + -2.3982700705528259e-01 4.1435998678207397e-01 + <_> + + 0 -1 2790 -1.1174699664115906e-01 + + 5.1045399904251099e-01 2.2319999989122152e-03 + <_> + + 0 -1 2791 -1.1367800086736679e-01 + + 9.0475201606750488e-01 -1.6615299880504608e-01 + <_> + + 0 -1 2792 1.6667999327182770e-02 + + 1.4024500548839569e-01 -5.2178502082824707e-01 + <_> + + 0 -1 2793 -8.0340001732110977e-03 + + -6.6178399324417114e-01 3.7640000227838755e-03 + <_> + + 0 -1 2794 -3.3096998929977417e-02 + + 8.0185902118682861e-01 5.9385001659393311e-02 + <_> + + 0 -1 2795 1.2547999620437622e-02 + + -3.3545500040054321e-01 1.4578600227832794e-01 + <_> + + 0 -1 2796 -4.2073998600244522e-02 + + -5.5509102344512939e-01 1.3266600668430328e-01 + <_> + + 0 -1 2797 2.5221999734640121e-02 + + -6.1631999909877777e-02 -1.3678770065307617e+00 + <_> + + 0 -1 2798 -2.4268999695777893e-02 + + 3.4185099601745605e-01 -7.4160001240670681e-03 + <_> + + 0 -1 2799 -1.2280000373721123e-02 + + 2.7745801210403442e-01 -3.1033900380134583e-01 + <_> + + 0 -1 2800 -1.1377099901437759e-01 + + 1.1719540357589722e+00 8.3681002259254456e-02 + <_> + + 0 -1 2801 -8.4771998226642609e-02 + + 8.1694799661636353e-01 -1.7837500572204590e-01 + <_> + + 0 -1 2802 -2.4552000686526299e-02 + + -1.8627299368381500e-01 1.4340099692344666e-01 + <_> + + 0 -1 2803 -9.0269995853304863e-03 + + 3.2659199833869934e-01 -2.3541299998760223e-01 + <_> + + 0 -1 2804 1.1177999898791313e-02 + + 1.9761200249195099e-01 -2.1701000630855560e-02 + <_> + + 0 -1 2805 -2.9366999864578247e-02 + + -9.3414801359176636e-01 -2.1704999729990959e-02 + <_> + + 0 -1 2806 6.3640000298619270e-03 + + 2.5573000311851501e-02 4.6412798762321472e-01 + <_> + + 0 -1 2807 1.4026000164449215e-02 + + -2.1228599548339844e-01 4.0078800916671753e-01 + <_> + + 0 -1 2808 -1.3341999612748623e-02 + + 7.4202698469161987e-01 2.9001999646425247e-02 + <_> + + 0 -1 2809 2.8422799706459045e-01 + + -1.9243599474430084e-01 4.3631199002265930e-01 + <_> + + 0 -1 2810 -2.3724000155925751e-01 + + 6.9736397266387939e-01 6.9307997822761536e-02 + <_> + + 0 -1 2811 -1.1169700324535370e-01 + + 3.9147201180458069e-01 -2.0922000706195831e-01 + <_> + + 0 -1 2812 1.2787500023841858e-01 + + -7.2555996477603912e-02 3.6088201403617859e-01 + <_> + + 0 -1 2813 -6.2900997698307037e-02 + + 9.5424997806549072e-01 -1.5402799844741821e-01 + <_> + + 0 -1 2814 1.7439000308513641e-02 + + -5.1134999841451645e-02 2.7750301361083984e-01 + <_> + + 0 -1 2815 1.2319999514147639e-03 + + 7.5627997517585754e-02 -3.6456099152565002e-01 + <_> + + 0 -1 2816 2.7495000511407852e-02 + + 5.1844000816345215e-02 4.1562598943710327e-01 + <_> + + 0 -1 2817 -4.3543998152017593e-02 + + 7.1969997882843018e-01 -1.7132200300693512e-01 + <_> + + 0 -1 2818 1.1025999672710896e-02 + + 1.4354600012302399e-01 -6.5403002500534058e-01 + <_> + + 0 -1 2819 2.0865999162197113e-02 + + 4.0089000016450882e-02 -4.5743298530578613e-01 + <_> + + 0 -1 2820 -2.2304000332951546e-02 + + 5.3855001926422119e-01 7.1662999689579010e-02 + <_> + + 0 -1 2821 3.2492000609636307e-02 + + -4.5991998165845871e-02 -1.0047069787979126e+00 + <_> + + 0 -1 2822 1.2269999831914902e-02 + + 3.4334998577833176e-02 4.2431798577308655e-01 + <_> + + 0 -1 2823 8.3820000290870667e-03 + + -2.5850600004196167e-01 2.6263499259948730e-01 + <_> + + 0 -1 2824 3.7353999912738800e-02 + + 1.5692499279975891e-01 -1.0429090261459351e+00 + <_> + + 0 -1 2825 -1.4111000113189220e-02 + + -7.3177701234817505e-01 -2.0276999101042747e-02 + <_> + + 0 -1 2826 5.7066999375820160e-02 + + 8.3360001444816589e-02 1.5661499500274658e+00 + <_> + + 0 -1 2827 4.9680001102387905e-03 + + -3.5318198800086975e-01 1.4698399603366852e-01 + <_> + + 0 -1 2828 -2.4492999538779259e-02 + + 2.8325900435447693e-01 -3.4640000667423010e-03 + <_> + + 0 -1 2829 -1.1254999786615372e-02 + + -8.4017497301101685e-01 -3.6251999437808990e-02 + <_> + + 0 -1 2830 3.4533001482486725e-02 + + 1.4998500049114227e-01 -8.7367099523544312e-01 + <_> + + 0 -1 2831 2.4303000420331955e-02 + + -1.8787500262260437e-01 5.9483999013900757e-01 + <_> + + 0 -1 2832 -7.8790001571178436e-03 + + 4.4315698742866516e-01 -5.6570999324321747e-02 + <_> + + 0 -1 2833 3.5142000764608383e-02 + + -5.6494999676942825e-02 -1.3617190122604370e+00 + <_> + + 0 -1 2834 4.6259998343884945e-03 + + -3.1161698698997498e-01 2.5447699427604675e-01 + <_> + + 0 -1 2835 -8.3131000399589539e-02 + + 1.6424349546432495e+00 -1.4429399371147156e-01 + <_> + + 0 -1 2836 -1.4015999622642994e-02 + + -7.7819502353668213e-01 1.7173300683498383e-01 + <_> + + 0 -1 2837 1.2450000504031777e-03 + + -2.3191399872303009e-01 2.8527900576591492e-01 + <_> + + 0 -1 2838 -1.6803000122308731e-02 + + -3.5965099930763245e-01 2.0412999391555786e-01 + <_> + + 0 -1 2839 -7.6747998595237732e-02 + + 7.8050500154495239e-01 -1.5612800419330597e-01 + <_> + + 0 -1 2840 -2.3671999573707581e-01 + + 1.1813700199127197e+00 7.8111998736858368e-02 + <_> + + 0 -1 2841 -1.0057400166988373e-01 + + -4.7104099392890930e-01 7.9172998666763306e-02 + <_> + + 0 -1 2842 1.3239999534562230e-03 + + 2.2262699902057648e-01 -3.7099799513816833e-01 + <_> + + 0 -1 2843 2.2152999415993690e-02 + + -3.8649000227451324e-02 -9.2274999618530273e-01 + <_> + + 0 -1 2844 -1.1246199905872345e-01 + + 4.1899600625038147e-01 8.0411002039909363e-02 + <_> + + 0 -1 2845 1.6481000930070877e-02 + + -1.6756699979305267e-01 7.1842402219772339e-01 + <_> + + 0 -1 2846 6.8113997578620911e-02 + + 1.5719899535179138e-01 -8.7681102752685547e-01 + <_> + + 0 -1 2847 1.6011999920010567e-02 + + -4.1600000113248825e-03 -5.9327799081802368e-01 + <_> + + 0 -1 2848 4.6640001237392426e-03 + + -3.0153999105095863e-02 4.8345300555229187e-01 + <_> + + 0 -1 2849 6.7579997703433037e-03 + + -2.2667400538921356e-01 3.3662301301956177e-01 + <_> + + 0 -1 2850 4.7289999201893806e-03 + + -6.0373999178409576e-02 3.1458100676536560e-01 + <_> + + 0 -1 2851 2.5869999080896378e-03 + + -2.9872599244117737e-01 1.7787499725818634e-01 + <_> + + 0 -1 2852 2.8989999555051327e-03 + + 2.1890200674533844e-01 -2.9567098617553711e-01 + <_> + + 0 -1 2853 -3.0053999274969101e-02 + + 1.2150429487228394e+00 -1.4354999363422394e-01 + <_> + + 0 -1 2854 1.4181000180542469e-02 + + 1.2451999820768833e-02 5.5490100383758545e-01 + <_> + + 0 -1 2855 -6.0527000576257706e-02 + + -1.4933999776840210e+00 -6.5227001905441284e-02 + <_> + + 0 -1 2856 -1.9882999360561371e-02 + + -3.8526400923728943e-01 1.9761200249195099e-01 + <_> + + 0 -1 2857 3.1218999996781349e-02 + + -2.1281200647354126e-01 2.9446500539779663e-01 + <_> + + 0 -1 2858 1.8271999433636665e-02 + + 9.7200000891461968e-04 6.6814202070236206e-01 + <_> + + 0 -1 2859 1.1089999461546540e-03 + + -6.2467902898788452e-01 -1.6599999507889152e-03 + <_> + + 0 -1 2860 -3.6713998764753342e-02 + + -4.2333900928497314e-01 1.2084700167179108e-01 + <_> + + 0 -1 2861 1.2044000439345837e-02 + + 2.5882000103592873e-02 -5.0732398033142090e-01 + <_> + + 0 -1 2862 7.4749000370502472e-02 + + 1.3184699416160583e-01 -2.1739600598812103e-01 + <_> + + 0 -1 2863 -2.3473200201988220e-01 + + 1.1775610446929932e+00 -1.5114699304103851e-01 + <_> + + 0 -1 2864 1.4096499979496002e-01 + + 3.3991001546382904e-02 3.9923098683357239e-01 + <_> + + 0 -1 2865 6.1789997853338718e-03 + + -3.1806701421737671e-01 1.1681699752807617e-01 + <_> + + 0 -1 2866 -5.7216998189687729e-02 + + 8.4399098157882690e-01 8.3889000117778778e-02 + <_> + + 0 -1 2867 -5.5227000266313553e-02 + + 3.6888301372528076e-01 -1.8913400173187256e-01 + <_> + + 0 -1 2868 -2.1583000198006630e-02 + + -5.2161800861358643e-01 1.5772600471973419e-01 + <_> + + 0 -1 2869 2.5747999548912048e-02 + + -5.9921998530626297e-02 -1.0674990415573120e+00 + <_> + + 0 -1 2870 -1.3098999857902527e-02 + + 7.8958398103713989e-01 5.2099999040365219e-02 + <_> + + 0 -1 2871 2.2799998987466097e-03 + + -1.1704430580139160e+00 -5.9356998652219772e-02 + <_> + + 0 -1 2872 8.8060004636645317e-03 + + 4.1717998683452606e-02 6.6352599859237671e-01 + <_> + + 0 -1 2873 -8.9699998497962952e-03 + + -3.5862699151039124e-01 6.0458000749349594e-02 + <_> + + 0 -1 2874 4.0230001322925091e-03 + + 2.0979399979114532e-01 -2.4806000292301178e-01 + <_> + + 0 -1 2875 2.5017000734806061e-02 + + -1.8795900046825409e-01 3.9547100663185120e-01 + <_> + + 0 -1 2876 -5.9009999968111515e-03 + + 2.5663900375366211e-01 -9.4919003546237946e-02 + <_> + + 0 -1 2877 4.3850000947713852e-03 + + 3.3139001578092575e-02 -4.6075400710105896e-01 + <_> + + 0 -1 2878 -3.3771999180316925e-02 + + -9.8881602287292480e-01 1.4636899530887604e-01 + <_> + + 0 -1 2879 4.4523000717163086e-02 + + -1.3286699354648590e-01 1.5796790122985840e+00 + <_> + + 0 -1 2880 -4.0929000824689865e-02 + + 3.3877098560333252e-01 7.4970997869968414e-02 + <_> + + 0 -1 2881 3.9351999759674072e-02 + + -1.8327899277210236e-01 4.6980699896812439e-01 + <_> + + 0 -1 2882 -7.0322997868061066e-02 + + -9.8322701454162598e-01 1.1808100342750549e-01 + <_> + + 0 -1 2883 3.5743001848459244e-02 + + -3.3050999045372009e-02 -8.3610898256301880e-01 + <_> + + 0 -1 2884 -4.2961999773979187e-02 + + 1.1670809984207153e+00 8.0692000687122345e-02 + <_> + + 0 -1 2885 -2.1007999777793884e-02 + + 6.3869798183441162e-01 -1.7626300454139709e-01 + <_> + + 0 -1 2886 -1.5742200613021851e-01 + + -2.3302499949932098e-01 1.2517499923706055e-01 + <_> + + 0 -1 2887 7.8659998252987862e-03 + + -2.2037999331951141e-01 2.7196800708770752e-01 + <_> + + 0 -1 2888 2.3622000589966774e-02 + + 1.6127300262451172e-01 -4.3329000473022461e-01 + <_> + + 0 -1 2889 7.4692003428936005e-02 + + -1.6991999745368958e-01 5.8884900808334351e-01 + <_> + + 0 -1 2890 -6.4799998654052615e-04 + + 2.5842899084091187e-01 -3.5911999642848969e-02 + <_> + + 0 -1 2891 -1.6290999948978424e-02 + + -7.6764398813247681e-01 -2.0472999662160873e-02 + <_> + + 0 -1 2892 -3.3133998513221741e-02 + + -2.7180099487304688e-01 1.4325700700283051e-01 + <_> + + 0 -1 2893 4.8797998577356339e-02 + + 7.6408997178077698e-02 -4.1445198655128479e-01 + <_> + + 0 -1 2894 2.2869999520480633e-03 + + -3.8628999143838882e-02 2.0753799378871918e-01 + <_> + + 0 -1 2895 4.5304000377655029e-02 + + -1.7777900397777557e-01 6.3461399078369141e-01 + <_> + + 0 -1 2896 1.0705800354480743e-01 + + 1.8972299993038177e-01 -5.1236200332641602e-01 + <_> + + 0 -1 2897 -4.0525000542402267e-02 + + 7.0614999532699585e-01 -1.7803299427032471e-01 + <_> + + 0 -1 2898 3.1968999654054642e-02 + + 6.8149998784065247e-02 6.8733102083206177e-01 + <_> + + 0 -1 2899 -5.7617001235485077e-02 + + 7.5170499086380005e-01 -1.5764999389648438e-01 + <_> + + 0 -1 2900 1.3593999668955803e-02 + + 1.9411900639533997e-01 -2.4561899900436401e-01 + <_> + + 0 -1 2901 7.1396000683307648e-02 + + -4.6881001442670822e-02 -8.8198298215866089e-01 + <_> + + 0 -1 2902 -1.4895999804139137e-02 + + -4.4532400369644165e-01 1.7679899930953979e-01 + <_> + + 0 -1 2903 -1.0026000440120697e-02 + + 6.5122699737548828e-01 -1.6709999740123749e-01 + <_> + + 0 -1 2904 3.7589999847114086e-03 + + -5.8301001787185669e-02 3.4483298659324646e-01 + <_> + + 0 -1 2905 1.6263000667095184e-02 + + -1.5581500530242920e-01 8.6432701349258423e-01 + <_> + + 0 -1 2906 -4.0176000446081161e-02 + + -6.1028599739074707e-01 1.1796399950981140e-01 + <_> + + 0 -1 2907 2.7080999687314034e-02 + + -4.9601998180150986e-02 -8.9990001916885376e-01 + <_> + + 0 -1 2908 5.2420001477003098e-02 + + 1.1297199875116348e-01 -1.0833640098571777e+00 + <_> + + 0 -1 2909 -1.9160000607371330e-02 + + -7.9880100488662720e-01 -3.4079000353813171e-02 + <_> + + 0 -1 2910 -3.7730000913143158e-03 + + -1.9124099612236023e-01 2.1535199880599976e-01 + <_> + + 0 -1 2911 7.5762003660202026e-02 + + -1.3421699404716492e-01 1.6807060241699219e+00 + <_> + + 0 -1 2912 -2.2173000499606133e-02 + + 4.8600998520851135e-01 3.6160000599920750e-03 + + <_> + + <_> + 6 4 12 9 -1. + <_> + 6 7 12 3 3. + <_> + + <_> + 6 4 12 7 -1. + <_> + 10 4 4 7 3. + <_> + + <_> + 3 9 18 9 -1. + <_> + 3 12 18 3 3. + <_> + + <_> + 8 18 9 6 -1. + <_> + 8 20 9 2 3. + <_> + + <_> + 3 5 4 19 -1. + <_> + 5 5 2 19 2. + <_> + + <_> + 6 5 12 16 -1. + <_> + 6 13 12 8 2. + <_> + + <_> + 5 8 12 6 -1. + <_> + 5 11 12 3 2. + <_> + + <_> + 11 14 4 10 -1. + <_> + 11 19 4 5 2. + <_> + + <_> + 4 0 7 6 -1. + <_> + 4 3 7 3 2. + <_> + + <_> + 6 6 12 6 -1. + <_> + 6 8 12 2 3. + <_> + + <_> + 6 4 12 7 -1. + <_> + 10 4 4 7 3. + <_> + + <_> + 1 8 19 12 -1. + <_> + 1 12 19 4 3. + <_> + + <_> + 0 2 24 3 -1. + <_> + 8 2 8 3 3. + <_> + + <_> + 9 9 6 15 -1. + <_> + 9 14 6 5 3. + <_> + + <_> + 5 6 14 10 -1. + <_> + 5 11 14 5 2. + <_> + + <_> + 5 0 14 9 -1. + <_> + 5 3 14 3 3. + <_> + + <_> + 13 11 9 6 -1. + <_> + 16 11 3 6 3. + <_> + + <_> + 7 5 6 10 -1. + <_> + 9 5 2 10 3. + <_> + + <_> + 10 8 6 10 -1. + <_> + 12 8 2 10 3. + <_> + + <_> + 2 5 4 9 -1. + <_> + 4 5 2 9 2. + <_> + + <_> + 18 0 6 11 -1. + <_> + 20 0 2 11 3. + <_> + + <_> + 0 6 24 13 -1. + <_> + 8 6 8 13 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 7 18 10 6 -1. + <_> + 7 20 10 2 3. + <_> + + <_> + 5 7 14 12 -1. + <_> + 5 13 14 6 2. + <_> + + <_> + 0 3 24 3 -1. + <_> + 8 3 8 3 3. + <_> + + <_> + 5 8 15 6 -1. + <_> + 5 11 15 3 2. + <_> + + <_> + 9 6 5 14 -1. + <_> + 9 13 5 7 2. + <_> + + <_> + 9 5 6 10 -1. + <_> + 11 5 2 10 3. + <_> + + <_> + 6 6 3 12 -1. + <_> + 6 12 3 6 2. + <_> + + <_> + 3 21 18 3 -1. + <_> + 9 21 6 3 3. + <_> + + <_> + 5 6 13 6 -1. + <_> + 5 8 13 2 3. + <_> + + <_> + 18 1 6 15 -1. + <_> + 18 1 3 15 2. + <_> + + <_> + 1 1 6 15 -1. + <_> + 4 1 3 15 2. + <_> + + <_> + 0 8 24 15 -1. + <_> + 8 8 8 15 3. + <_> + + <_> + 5 6 14 12 -1. + <_> + 5 6 7 6 2. + <_> + 12 12 7 6 2. + <_> + + <_> + 2 12 21 12 -1. + <_> + 2 16 21 4 3. + <_> + + <_> + 8 1 4 10 -1. + <_> + 10 1 2 10 2. + <_> + + <_> + 2 13 20 10 -1. + <_> + 2 13 10 10 2. + <_> + + <_> + 0 1 6 13 -1. + <_> + 2 1 2 13 3. + <_> + + <_> + 20 2 4 13 -1. + <_> + 20 2 2 13 2. + <_> + + <_> + 0 5 22 19 -1. + <_> + 11 5 11 19 2. + <_> + + <_> + 18 4 6 9 -1. + <_> + 20 4 2 9 3. + <_> + + <_> + 0 3 6 11 -1. + <_> + 2 3 2 11 3. + <_> + + <_> + 12 1 4 9 -1. + <_> + 12 1 2 9 2. + <_> + + <_> + 0 6 19 3 -1. + <_> + 0 7 19 1 3. + <_> + + <_> + 12 1 4 9 -1. + <_> + 12 1 2 9 2. + <_> + + <_> + 8 1 4 9 -1. + <_> + 10 1 2 9 2. + <_> + + <_> + 5 5 14 14 -1. + <_> + 12 5 7 7 2. + <_> + 5 12 7 7 2. + <_> + + <_> + 1 10 18 2 -1. + <_> + 1 11 18 1 2. + <_> + + <_> + 17 13 4 11 -1. + <_> + 17 13 2 11 2. + <_> + + <_> + 0 4 6 9 -1. + <_> + 0 7 6 3 3. + <_> + + <_> + 6 4 12 9 -1. + <_> + 6 7 12 3 3. + <_> + + <_> + 6 5 12 6 -1. + <_> + 10 5 4 6 3. + <_> + + <_> + 0 1 24 5 -1. + <_> + 8 1 8 5 3. + <_> + + <_> + 4 10 18 6 -1. + <_> + 4 12 18 2 3. + <_> + + <_> + 2 17 12 6 -1. + <_> + 2 17 6 3 2. + <_> + 8 20 6 3 2. + <_> + + <_> + 19 3 4 13 -1. + <_> + 19 3 2 13 2. + <_> + + <_> + 1 3 4 13 -1. + <_> + 3 3 2 13 2. + <_> + + <_> + 0 1 24 23 -1. + <_> + 8 1 8 23 3. + <_> + + <_> + 1 7 8 12 -1. + <_> + 1 11 8 4 3. + <_> + + <_> + 14 7 3 14 -1. + <_> + 14 14 3 7 2. + <_> + + <_> + 3 12 16 6 -1. + <_> + 3 12 8 3 2. + <_> + 11 15 8 3 2. + <_> + + <_> + 6 6 12 6 -1. + <_> + 6 8 12 2 3. + <_> + + <_> + 8 7 6 12 -1. + <_> + 8 13 6 6 2. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 1 17 18 3 -1. + <_> + 1 18 18 1 3. + <_> + + <_> + 4 4 16 12 -1. + <_> + 4 10 16 6 2. + <_> + + <_> + 0 1 4 20 -1. + <_> + 2 1 2 20 2. + <_> + + <_> + 3 0 18 2 -1. + <_> + 3 1 18 1 2. + <_> + + <_> + 1 5 20 14 -1. + <_> + 1 5 10 7 2. + <_> + 11 12 10 7 2. + <_> + + <_> + 5 8 14 12 -1. + <_> + 5 12 14 4 3. + <_> + + <_> + 3 14 7 9 -1. + <_> + 3 17 7 3 3. + <_> + + <_> + 14 15 9 6 -1. + <_> + 14 17 9 2 3. + <_> + + <_> + 1 15 9 6 -1. + <_> + 1 17 9 2 3. + <_> + + <_> + 11 6 8 10 -1. + <_> + 15 6 4 5 2. + <_> + 11 11 4 5 2. + <_> + + <_> + 5 5 14 14 -1. + <_> + 5 5 7 7 2. + <_> + 12 12 7 7 2. + <_> + + <_> + 6 0 12 5 -1. + <_> + 10 0 4 5 3. + <_> + + <_> + 9 0 6 9 -1. + <_> + 9 3 6 3 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 3 8 18 4 -1. + <_> + 9 8 6 4 3. + <_> + + <_> + 6 0 12 9 -1. + <_> + 6 3 12 3 3. + <_> + + <_> + 0 0 24 6 -1. + <_> + 8 0 8 6 3. + <_> + + <_> + 4 7 16 12 -1. + <_> + 4 11 16 4 3. + <_> + + <_> + 11 6 6 6 -1. + <_> + 11 6 3 6 2. + <_> + + <_> + 0 20 24 3 -1. + <_> + 8 20 8 3 3. + <_> + + <_> + 11 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 4 13 15 4 -1. + <_> + 9 13 5 4 3. + <_> + + <_> + 11 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 9 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 9 12 6 12 -1. + <_> + 9 18 6 6 2. + <_> + + <_> + 1 22 18 2 -1. + <_> + 1 23 18 1 2. + <_> + + <_> + 10 7 4 10 -1. + <_> + 10 12 4 5 2. + <_> + + <_> + 6 7 8 10 -1. + <_> + 6 12 8 5 2. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 0 14 10 4 -1. + <_> + 0 16 10 2 2. + <_> + + <_> + 6 18 18 2 -1. + <_> + 6 19 18 1 2. + <_> + + <_> + 1 1 22 3 -1. + <_> + 1 2 22 1 3. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 2 4 6 15 -1. + <_> + 5 4 3 15 2. + <_> + + <_> + 20 4 4 10 -1. + <_> + 20 4 2 10 2. + <_> + + <_> + 0 4 4 10 -1. + <_> + 2 4 2 10 2. + <_> + + <_> + 2 16 20 6 -1. + <_> + 12 16 10 3 2. + <_> + 2 19 10 3 2. + <_> + + <_> + 0 12 8 9 -1. + <_> + 4 12 4 9 2. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 5 10 6 6 -1. + <_> + 8 10 3 6 2. + <_> + + <_> + 11 8 12 6 -1. + <_> + 17 8 6 3 2. + <_> + 11 11 6 3 2. + <_> + + <_> + 0 8 12 6 -1. + <_> + 0 8 6 3 2. + <_> + 6 11 6 3 2. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 8 14 9 6 -1. + <_> + 8 16 9 2 3. + <_> + + <_> + 0 16 9 6 -1. + <_> + 0 18 9 2 3. + <_> + + <_> + 10 8 6 10 -1. + <_> + 12 8 2 10 3. + <_> + + <_> + 3 19 12 3 -1. + <_> + 9 19 6 3 2. + <_> + + <_> + 2 10 20 2 -1. + <_> + 2 11 20 1 2. + <_> + + <_> + 2 9 18 12 -1. + <_> + 2 9 9 6 2. + <_> + 11 15 9 6 2. + <_> + + <_> + 3 0 18 24 -1. + <_> + 3 0 9 24 2. + <_> + + <_> + 5 6 14 10 -1. + <_> + 5 6 7 5 2. + <_> + 12 11 7 5 2. + <_> + + <_> + 9 5 10 12 -1. + <_> + 14 5 5 6 2. + <_> + 9 11 5 6 2. + <_> + + <_> + 4 5 12 12 -1. + <_> + 4 5 6 6 2. + <_> + 10 11 6 6 2. + <_> + + <_> + 4 14 18 3 -1. + <_> + 4 15 18 1 3. + <_> + + <_> + 6 13 8 8 -1. + <_> + 6 17 8 4 2. + <_> + + <_> + 3 16 18 6 -1. + <_> + 3 19 18 3 2. + <_> + + <_> + 0 0 6 6 -1. + <_> + 3 0 3 6 2. + <_> + + <_> + 6 6 12 18 -1. + <_> + 10 6 4 18 3. + <_> + + <_> + 6 1 4 14 -1. + <_> + 8 1 2 14 2. + <_> + + <_> + 3 2 19 2 -1. + <_> + 3 3 19 1 2. + <_> + + <_> + 1 8 22 13 -1. + <_> + 12 8 11 13 2. + <_> + + <_> + 8 9 11 4 -1. + <_> + 8 11 11 2 2. + <_> + + <_> + 0 12 15 10 -1. + <_> + 5 12 5 10 3. + <_> + + <_> + 12 16 12 6 -1. + <_> + 16 16 4 6 3. + <_> + + <_> + 0 16 12 6 -1. + <_> + 4 16 4 6 3. + <_> + + <_> + 19 1 5 12 -1. + <_> + 19 5 5 4 3. + <_> + + <_> + 0 2 24 4 -1. + <_> + 8 2 8 4 3. + <_> + + <_> + 6 8 12 4 -1. + <_> + 6 10 12 2 2. + <_> + + <_> + 7 5 9 6 -1. + <_> + 10 5 3 6 3. + <_> + + <_> + 9 17 6 6 -1. + <_> + 9 20 6 3 2. + <_> + + <_> + 0 7 22 15 -1. + <_> + 0 12 22 5 3. + <_> + + <_> + 4 1 17 9 -1. + <_> + 4 4 17 3 3. + <_> + + <_> + 7 5 6 10 -1. + <_> + 9 5 2 10 3. + <_> + + <_> + 18 1 6 8 -1. + <_> + 18 1 3 8 2. + <_> + + <_> + 0 1 6 7 -1. + <_> + 3 1 3 7 2. + <_> + + <_> + 18 0 6 22 -1. + <_> + 18 0 3 22 2. + <_> + + <_> + 0 0 6 22 -1. + <_> + 3 0 3 22 2. + <_> + + <_> + 16 7 8 16 -1. + <_> + 16 7 4 16 2. + <_> + + <_> + 2 10 19 6 -1. + <_> + 2 12 19 2 3. + <_> + + <_> + 9 9 6 12 -1. + <_> + 9 13 6 4 3. + <_> + + <_> + 2 15 17 6 -1. + <_> + 2 17 17 2 3. + <_> + + <_> + 14 7 3 14 -1. + <_> + 14 14 3 7 2. + <_> + + <_> + 5 6 8 10 -1. + <_> + 5 6 4 5 2. + <_> + 9 11 4 5 2. + <_> + + <_> + 15 8 9 11 -1. + <_> + 18 8 3 11 3. + <_> + + <_> + 0 8 9 11 -1. + <_> + 3 8 3 11 3. + <_> + + <_> + 8 6 10 18 -1. + <_> + 8 15 10 9 2. + <_> + + <_> + 7 7 3 14 -1. + <_> + 7 14 3 7 2. + <_> + + <_> + 0 14 24 8 -1. + <_> + 8 14 8 8 3. + <_> + + <_> + 1 10 18 14 -1. + <_> + 10 10 9 14 2. + <_> + + <_> + 14 12 6 6 -1. + <_> + 14 15 6 3 2. + <_> + + <_> + 7 0 10 16 -1. + <_> + 7 0 5 8 2. + <_> + 12 8 5 8 2. + <_> + + <_> + 10 0 9 6 -1. + <_> + 13 0 3 6 3. + <_> + + <_> + 4 3 16 4 -1. + <_> + 12 3 8 4 2. + <_> + + <_> + 10 0 9 6 -1. + <_> + 13 0 3 6 3. + <_> + + <_> + 1 1 20 4 -1. + <_> + 1 1 10 2 2. + <_> + 11 3 10 2 2. + <_> + + <_> + 10 0 9 6 -1. + <_> + 13 0 3 6 3. + <_> + + <_> + 5 0 9 6 -1. + <_> + 8 0 3 6 3. + <_> + + <_> + 8 18 10 6 -1. + <_> + 8 20 10 2 3. + <_> + + <_> + 6 3 6 9 -1. + <_> + 8 3 2 9 3. + <_> + + <_> + 7 3 12 6 -1. + <_> + 7 5 12 2 3. + <_> + + <_> + 0 10 18 3 -1. + <_> + 0 11 18 1 3. + <_> + + <_> + 1 10 22 3 -1. + <_> + 1 11 22 1 3. + <_> + + <_> + 5 11 8 8 -1. + <_> + 9 11 4 8 2. + <_> + + <_> + 12 11 6 6 -1. + <_> + 12 11 3 6 2. + <_> + + <_> + 6 11 6 6 -1. + <_> + 9 11 3 6 2. + <_> + + <_> + 7 10 11 6 -1. + <_> + 7 12 11 2 3. + <_> + + <_> + 0 13 24 4 -1. + <_> + 0 13 12 2 2. + <_> + 12 15 12 2 2. + <_> + + <_> + 2 4 22 12 -1. + <_> + 13 4 11 6 2. + <_> + 2 10 11 6 2. + <_> + + <_> + 2 0 20 17 -1. + <_> + 12 0 10 17 2. + <_> + + <_> + 14 0 2 24 -1. + <_> + 14 0 1 24 2. + <_> + + <_> + 8 0 2 24 -1. + <_> + 9 0 1 24 2. + <_> + + <_> + 14 1 2 22 -1. + <_> + 14 1 1 22 2. + <_> + + <_> + 8 1 2 22 -1. + <_> + 9 1 1 22 2. + <_> + + <_> + 17 6 3 18 -1. + <_> + 18 6 1 18 3. + <_> + + <_> + 6 14 9 6 -1. + <_> + 6 16 9 2 3. + <_> + + <_> + 13 14 9 4 -1. + <_> + 13 16 9 2 2. + <_> + + <_> + 3 18 18 3 -1. + <_> + 3 19 18 1 3. + <_> + + <_> + 9 4 8 18 -1. + <_> + 13 4 4 9 2. + <_> + 9 13 4 9 2. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 0 2 12 4 -1. + <_> + 6 2 6 4 2. + <_> + + <_> + 6 8 14 6 -1. + <_> + 6 11 14 3 2. + <_> + + <_> + 7 5 6 6 -1. + <_> + 10 5 3 6 2. + <_> + + <_> + 10 5 6 16 -1. + <_> + 10 13 6 8 2. + <_> + + <_> + 1 4 9 16 -1. + <_> + 4 4 3 16 3. + <_> + + <_> + 5 0 18 9 -1. + <_> + 5 3 18 3 3. + <_> + + <_> + 9 15 5 8 -1. + <_> + 9 19 5 4 2. + <_> + + <_> + 20 0 4 9 -1. + <_> + 20 0 2 9 2. + <_> + + <_> + 2 0 18 3 -1. + <_> + 2 1 18 1 3. + <_> + + <_> + 5 22 19 2 -1. + <_> + 5 23 19 1 2. + <_> + + <_> + 0 0 4 9 -1. + <_> + 2 0 2 9 2. + <_> + + <_> + 5 6 19 18 -1. + <_> + 5 12 19 6 3. + <_> + + <_> + 0 1 6 9 -1. + <_> + 2 1 2 9 3. + <_> + + <_> + 6 5 14 12 -1. + <_> + 13 5 7 6 2. + <_> + 6 11 7 6 2. + <_> + + <_> + 0 1 20 2 -1. + <_> + 0 2 20 1 2. + <_> + + <_> + 1 2 22 3 -1. + <_> + 1 3 22 1 3. + <_> + + <_> + 2 8 7 9 -1. + <_> + 2 11 7 3 3. + <_> + + <_> + 2 12 22 4 -1. + <_> + 13 12 11 2 2. + <_> + 2 14 11 2 2. + <_> + + <_> + 0 12 22 4 -1. + <_> + 0 12 11 2 2. + <_> + 11 14 11 2 2. + <_> + + <_> + 9 7 6 11 -1. + <_> + 11 7 2 11 3. + <_> + + <_> + 7 1 9 6 -1. + <_> + 10 1 3 6 3. + <_> + + <_> + 11 2 4 10 -1. + <_> + 11 7 4 5 2. + <_> + + <_> + 6 4 12 12 -1. + <_> + 6 10 12 6 2. + <_> + + <_> + 18 1 6 15 -1. + <_> + 18 6 6 5 3. + <_> + + <_> + 3 15 18 3 -1. + <_> + 3 16 18 1 3. + <_> + + <_> + 18 5 6 9 -1. + <_> + 18 8 6 3 3. + <_> + + <_> + 1 5 16 6 -1. + <_> + 1 5 8 3 2. + <_> + 9 8 8 3 2. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 0 4 24 14 -1. + <_> + 0 4 12 7 2. + <_> + 12 11 12 7 2. + <_> + + <_> + 13 0 4 13 -1. + <_> + 13 0 2 13 2. + <_> + + <_> + 7 0 4 13 -1. + <_> + 9 0 2 13 2. + <_> + + <_> + 11 6 6 9 -1. + <_> + 13 6 2 9 3. + <_> + + <_> + 8 7 6 9 -1. + <_> + 10 7 2 9 3. + <_> + + <_> + 13 17 9 6 -1. + <_> + 13 19 9 2 3. + <_> + + <_> + 2 18 14 6 -1. + <_> + 2 18 7 3 2. + <_> + 9 21 7 3 2. + <_> + + <_> + 3 18 18 4 -1. + <_> + 12 18 9 2 2. + <_> + 3 20 9 2 2. + <_> + + <_> + 0 20 15 4 -1. + <_> + 5 20 5 4 3. + <_> + + <_> + 9 15 15 9 -1. + <_> + 14 15 5 9 3. + <_> + + <_> + 4 4 16 4 -1. + <_> + 4 6 16 2 2. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 0 14 15 10 -1. + <_> + 5 14 5 10 3. + <_> + + <_> + 7 9 10 14 -1. + <_> + 12 9 5 7 2. + <_> + 7 16 5 7 2. + <_> + + <_> + 7 6 6 9 -1. + <_> + 9 6 2 9 3. + <_> + + <_> + 3 6 18 3 -1. + <_> + 3 7 18 1 3. + <_> + + <_> + 0 10 18 3 -1. + <_> + 0 11 18 1 3. + <_> + + <_> + 3 16 18 4 -1. + <_> + 12 16 9 2 2. + <_> + 3 18 9 2 2. + <_> + + <_> + 4 6 14 6 -1. + <_> + 4 6 7 3 2. + <_> + 11 9 7 3 2. + <_> + + <_> + 13 0 2 18 -1. + <_> + 13 0 1 18 2. + <_> + + <_> + 9 0 2 18 -1. + <_> + 10 0 1 18 2. + <_> + + <_> + 5 7 15 10 -1. + <_> + 10 7 5 10 3. + <_> + + <_> + 1 20 21 4 -1. + <_> + 8 20 7 4 3. + <_> + + <_> + 10 5 5 18 -1. + <_> + 10 14 5 9 2. + <_> + + <_> + 0 2 24 6 -1. + <_> + 0 2 12 3 2. + <_> + 12 5 12 3 2. + <_> + + <_> + 1 1 22 8 -1. + <_> + 12 1 11 4 2. + <_> + 1 5 11 4 2. + <_> + + <_> + 4 0 15 9 -1. + <_> + 4 3 15 3 3. + <_> + + <_> + 0 0 24 19 -1. + <_> + 8 0 8 19 3. + <_> + + <_> + 2 21 18 3 -1. + <_> + 11 21 9 3 2. + <_> + + <_> + 9 7 10 4 -1. + <_> + 9 7 5 4 2. + <_> + + <_> + 5 7 10 4 -1. + <_> + 10 7 5 4 2. + <_> + + <_> + 17 8 6 16 -1. + <_> + 20 8 3 8 2. + <_> + 17 16 3 8 2. + <_> + + <_> + 1 15 20 4 -1. + <_> + 1 15 10 2 2. + <_> + 11 17 10 2 2. + <_> + + <_> + 14 15 10 6 -1. + <_> + 14 17 10 2 3. + <_> + + <_> + 3 0 16 9 -1. + <_> + 3 3 16 3 3. + <_> + + <_> + 15 6 7 15 -1. + <_> + 15 11 7 5 3. + <_> + + <_> + 9 1 6 13 -1. + <_> + 11 1 2 13 3. + <_> + + <_> + 17 2 6 14 -1. + <_> + 17 2 3 14 2. + <_> + + <_> + 3 14 12 10 -1. + <_> + 3 14 6 5 2. + <_> + 9 19 6 5 2. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 1 2 6 14 -1. + <_> + 4 2 3 14 2. + <_> + + <_> + 10 4 5 12 -1. + <_> + 10 8 5 4 3. + <_> + + <_> + 0 17 24 5 -1. + <_> + 8 17 8 5 3. + <_> + + <_> + 15 7 5 12 -1. + <_> + 15 11 5 4 3. + <_> + + <_> + 3 1 6 12 -1. + <_> + 3 1 3 6 2. + <_> + 6 7 3 6 2. + <_> + + <_> + 12 13 6 6 -1. + <_> + 12 16 6 3 2. + <_> + + <_> + 6 13 6 6 -1. + <_> + 6 16 6 3 2. + <_> + + <_> + 14 6 3 16 -1. + <_> + 14 14 3 8 2. + <_> + + <_> + 1 12 13 6 -1. + <_> + 1 14 13 2 3. + <_> + + <_> + 13 1 4 9 -1. + <_> + 13 1 2 9 2. + <_> + + <_> + 7 0 9 6 -1. + <_> + 10 0 3 6 3. + <_> + + <_> + 12 2 6 9 -1. + <_> + 12 2 3 9 2. + <_> + + <_> + 6 2 6 9 -1. + <_> + 9 2 3 9 2. + <_> + + <_> + 6 18 12 6 -1. + <_> + 6 20 12 2 3. + <_> + + <_> + 7 6 6 9 -1. + <_> + 9 6 2 9 3. + <_> + + <_> + 7 7 12 3 -1. + <_> + 7 7 6 3 2. + <_> + + <_> + 8 3 8 21 -1. + <_> + 8 10 8 7 3. + <_> + + <_> + 7 4 10 12 -1. + <_> + 7 8 10 4 3. + <_> + + <_> + 0 1 6 9 -1. + <_> + 0 4 6 3 3. + <_> + + <_> + 15 2 2 20 -1. + <_> + 15 2 1 20 2. + <_> + + <_> + 0 3 6 9 -1. + <_> + 0 6 6 3 3. + <_> + + <_> + 15 3 2 21 -1. + <_> + 15 3 1 21 2. + <_> + + <_> + 7 0 2 23 -1. + <_> + 8 0 1 23 2. + <_> + + <_> + 15 8 9 4 -1. + <_> + 15 10 9 2 2. + <_> + + <_> + 0 8 9 4 -1. + <_> + 0 10 9 2 2. + <_> + + <_> + 8 14 9 6 -1. + <_> + 8 16 9 2 3. + <_> + + <_> + 0 14 9 6 -1. + <_> + 0 16 9 2 3. + <_> + + <_> + 3 10 18 4 -1. + <_> + 9 10 6 4 3. + <_> + + <_> + 0 0 24 19 -1. + <_> + 8 0 8 19 3. + <_> + + <_> + 9 1 8 12 -1. + <_> + 9 7 8 6 2. + <_> + + <_> + 10 6 4 10 -1. + <_> + 12 6 2 10 2. + <_> + + <_> + 7 9 10 12 -1. + <_> + 12 9 5 6 2. + <_> + 7 15 5 6 2. + <_> + + <_> + 5 0 3 19 -1. + <_> + 6 0 1 19 3. + <_> + + <_> + 14 0 6 10 -1. + <_> + 16 0 2 10 3. + <_> + + <_> + 2 0 6 12 -1. + <_> + 2 0 3 6 2. + <_> + 5 6 3 6 2. + <_> + + <_> + 0 11 24 2 -1. + <_> + 0 12 24 1 2. + <_> + + <_> + 4 9 13 4 -1. + <_> + 4 11 13 2 2. + <_> + + <_> + 9 8 6 9 -1. + <_> + 9 11 6 3 3. + <_> + + <_> + 0 12 16 4 -1. + <_> + 0 14 16 2 2. + <_> + + <_> + 18 12 6 9 -1. + <_> + 18 15 6 3 3. + <_> + + <_> + 0 12 6 9 -1. + <_> + 0 15 6 3 3. + <_> + + <_> + 8 7 10 4 -1. + <_> + 8 7 5 4 2. + <_> + + <_> + 8 7 6 9 -1. + <_> + 10 7 2 9 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 12 3 6 15 -1. + <_> + 14 3 2 15 3. + <_> + + <_> + 6 3 6 15 -1. + <_> + 8 3 2 15 3. + <_> + + <_> + 15 2 9 4 -1. + <_> + 15 4 9 2 2. + <_> + + <_> + 5 10 6 7 -1. + <_> + 8 10 3 7 2. + <_> + + <_> + 9 14 6 10 -1. + <_> + 9 19 6 5 2. + <_> + + <_> + 7 13 5 8 -1. + <_> + 7 17 5 4 2. + <_> + + <_> + 14 5 3 16 -1. + <_> + 14 13 3 8 2. + <_> + + <_> + 2 17 18 3 -1. + <_> + 2 18 18 1 3. + <_> + + <_> + 5 18 19 3 -1. + <_> + 5 19 19 1 3. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 12 4 3 18 -1. + <_> + 13 4 1 18 3. + <_> + + <_> + 9 4 3 18 -1. + <_> + 10 4 1 18 3. + <_> + + <_> + 3 3 18 9 -1. + <_> + 9 3 6 9 3. + <_> + + <_> + 6 1 6 14 -1. + <_> + 8 1 2 14 3. + <_> + + <_> + 12 16 9 6 -1. + <_> + 12 19 9 3 2. + <_> + + <_> + 1 3 20 16 -1. + <_> + 1 3 10 8 2. + <_> + 11 11 10 8 2. + <_> + + <_> + 12 5 6 12 -1. + <_> + 15 5 3 6 2. + <_> + 12 11 3 6 2. + <_> + + <_> + 1 2 22 16 -1. + <_> + 1 2 11 8 2. + <_> + 12 10 11 8 2. + <_> + + <_> + 10 14 5 10 -1. + <_> + 10 19 5 5 2. + <_> + + <_> + 3 21 18 3 -1. + <_> + 3 22 18 1 3. + <_> + + <_> + 10 14 6 10 -1. + <_> + 12 14 2 10 3. + <_> + + <_> + 0 2 24 4 -1. + <_> + 8 2 8 4 3. + <_> + + <_> + 6 4 12 9 -1. + <_> + 6 7 12 3 3. + <_> + + <_> + 6 6 12 5 -1. + <_> + 10 6 4 5 3. + <_> + + <_> + 5 8 14 12 -1. + <_> + 5 12 14 4 3. + <_> + + <_> + 4 14 8 10 -1. + <_> + 4 14 4 5 2. + <_> + 8 19 4 5 2. + <_> + + <_> + 11 6 5 14 -1. + <_> + 11 13 5 7 2. + <_> + + <_> + 7 6 3 16 -1. + <_> + 7 14 3 8 2. + <_> + + <_> + 3 7 18 8 -1. + <_> + 9 7 6 8 3. + <_> + + <_> + 2 3 20 2 -1. + <_> + 2 4 20 1 2. + <_> + + <_> + 3 12 19 6 -1. + <_> + 3 14 19 2 3. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 16 6 6 14 -1. + <_> + 16 6 3 14 2. + <_> + + <_> + 7 9 6 12 -1. + <_> + 9 9 2 12 3. + <_> + + <_> + 18 6 6 18 -1. + <_> + 21 6 3 9 2. + <_> + 18 15 3 9 2. + <_> + + <_> + 0 6 6 18 -1. + <_> + 0 6 3 9 2. + <_> + 3 15 3 9 2. + <_> + + <_> + 18 2 6 9 -1. + <_> + 18 5 6 3 3. + <_> + + <_> + 3 18 15 6 -1. + <_> + 3 20 15 2 3. + <_> + + <_> + 18 2 6 9 -1. + <_> + 18 5 6 3 3. + <_> + + <_> + 0 2 6 9 -1. + <_> + 0 5 6 3 3. + <_> + + <_> + 5 10 18 2 -1. + <_> + 5 11 18 1 2. + <_> + + <_> + 6 0 12 6 -1. + <_> + 6 2 12 2 3. + <_> + + <_> + 10 0 6 9 -1. + <_> + 12 0 2 9 3. + <_> + + <_> + 8 0 6 9 -1. + <_> + 10 0 2 9 3. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 3 6 13 6 -1. + <_> + 3 8 13 2 3. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 2 5 6 15 -1. + <_> + 5 5 3 15 2. + <_> + + <_> + 8 8 9 6 -1. + <_> + 11 8 3 6 3. + <_> + + <_> + 8 6 3 14 -1. + <_> + 8 13 3 7 2. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 4 12 10 4 -1. + <_> + 9 12 5 4 2. + <_> + + <_> + 13 1 4 19 -1. + <_> + 13 1 2 19 2. + <_> + + <_> + 7 1 4 19 -1. + <_> + 9 1 2 19 2. + <_> + + <_> + 18 9 6 9 -1. + <_> + 18 12 6 3 3. + <_> + + <_> + 1 21 18 3 -1. + <_> + 1 22 18 1 3. + <_> + + <_> + 14 13 10 9 -1. + <_> + 14 16 10 3 3. + <_> + + <_> + 1 13 22 4 -1. + <_> + 1 13 11 2 2. + <_> + 12 15 11 2 2. + <_> + + <_> + 4 6 16 6 -1. + <_> + 12 6 8 3 2. + <_> + 4 9 8 3 2. + <_> + + <_> + 1 0 18 22 -1. + <_> + 1 0 9 11 2. + <_> + 10 11 9 11 2. + <_> + + <_> + 10 7 8 14 -1. + <_> + 14 7 4 7 2. + <_> + 10 14 4 7 2. + <_> + + <_> + 0 4 6 20 -1. + <_> + 0 4 3 10 2. + <_> + 3 14 3 10 2. + <_> + + <_> + 15 0 6 9 -1. + <_> + 17 0 2 9 3. + <_> + + <_> + 3 0 6 9 -1. + <_> + 5 0 2 9 3. + <_> + + <_> + 15 12 6 12 -1. + <_> + 18 12 3 6 2. + <_> + 15 18 3 6 2. + <_> + + <_> + 3 12 6 12 -1. + <_> + 3 12 3 6 2. + <_> + 6 18 3 6 2. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 0 12 9 6 -1. + <_> + 0 14 9 2 3. + <_> + + <_> + 4 14 19 3 -1. + <_> + 4 15 19 1 3. + <_> + + <_> + 2 13 19 3 -1. + <_> + 2 14 19 1 3. + <_> + + <_> + 14 15 10 6 -1. + <_> + 14 17 10 2 3. + <_> + + <_> + 6 0 10 12 -1. + <_> + 6 0 5 6 2. + <_> + 11 6 5 6 2. + <_> + + <_> + 17 1 6 12 -1. + <_> + 20 1 3 6 2. + <_> + 17 7 3 6 2. + <_> + + <_> + 1 1 6 12 -1. + <_> + 1 1 3 6 2. + <_> + 4 7 3 6 2. + <_> + + <_> + 16 14 6 9 -1. + <_> + 16 17 6 3 3. + <_> + + <_> + 7 3 9 12 -1. + <_> + 7 9 9 6 2. + <_> + + <_> + 12 1 4 12 -1. + <_> + 12 7 4 6 2. + <_> + + <_> + 4 0 14 8 -1. + <_> + 4 4 14 4 2. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 2 10 18 3 -1. + <_> + 8 10 6 3 3. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 0 1 21 23 -1. + <_> + 7 1 7 23 3. + <_> + + <_> + 6 9 17 4 -1. + <_> + 6 11 17 2 2. + <_> + + <_> + 1 0 11 18 -1. + <_> + 1 6 11 6 3. + <_> + + <_> + 6 15 13 6 -1. + <_> + 6 17 13 2 3. + <_> + + <_> + 0 15 9 6 -1. + <_> + 0 17 9 2 3. + <_> + + <_> + 8 7 15 4 -1. + <_> + 13 7 5 4 3. + <_> + + <_> + 9 12 6 9 -1. + <_> + 9 15 6 3 3. + <_> + + <_> + 6 8 18 3 -1. + <_> + 12 8 6 3 3. + <_> + + <_> + 0 14 24 4 -1. + <_> + 8 14 8 4 3. + <_> + + <_> + 16 10 3 12 -1. + <_> + 16 16 3 6 2. + <_> + + <_> + 0 3 24 3 -1. + <_> + 0 4 24 1 3. + <_> + + <_> + 14 17 10 6 -1. + <_> + 14 19 10 2 3. + <_> + + <_> + 1 13 18 3 -1. + <_> + 7 13 6 3 3. + <_> + + <_> + 5 0 18 9 -1. + <_> + 5 3 18 3 3. + <_> + + <_> + 4 3 16 9 -1. + <_> + 4 6 16 3 3. + <_> + + <_> + 16 5 3 12 -1. + <_> + 16 11 3 6 2. + <_> + + <_> + 0 7 18 4 -1. + <_> + 6 7 6 4 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 9 8 6 10 -1. + <_> + 11 8 2 10 3. + <_> + + <_> + 9 15 6 9 -1. + <_> + 11 15 2 9 3. + <_> + + <_> + 3 1 18 21 -1. + <_> + 12 1 9 21 2. + <_> + + <_> + 6 8 12 7 -1. + <_> + 6 8 6 7 2. + <_> + + <_> + 8 5 6 9 -1. + <_> + 10 5 2 9 3. + <_> + + <_> + 0 2 24 4 -1. + <_> + 8 2 8 4 3. + <_> + + <_> + 14 7 5 12 -1. + <_> + 14 11 5 4 3. + <_> + + <_> + 5 7 5 12 -1. + <_> + 5 11 5 4 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 0 1 6 17 -1. + <_> + 3 1 3 17 2. + <_> + + <_> + 3 1 19 9 -1. + <_> + 3 4 19 3 3. + <_> + + <_> + 3 18 12 6 -1. + <_> + 3 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 20 4 4 19 -1. + <_> + 20 4 2 19 2. + <_> + + <_> + 0 16 10 7 -1. + <_> + 5 16 5 7 2. + <_> + + <_> + 8 7 10 12 -1. + <_> + 13 7 5 6 2. + <_> + 8 13 5 6 2. + <_> + + <_> + 6 7 10 12 -1. + <_> + 6 7 5 6 2. + <_> + 11 13 5 6 2. + <_> + + <_> + 9 2 9 6 -1. + <_> + 12 2 3 6 3. + <_> + + <_> + 1 20 21 4 -1. + <_> + 8 20 7 4 3. + <_> + + <_> + 9 12 9 6 -1. + <_> + 9 14 9 2 3. + <_> + + <_> + 7 2 9 6 -1. + <_> + 10 2 3 6 3. + <_> + + <_> + 13 0 4 14 -1. + <_> + 13 0 2 14 2. + <_> + + <_> + 7 0 4 14 -1. + <_> + 9 0 2 14 2. + <_> + + <_> + 14 15 9 6 -1. + <_> + 14 17 9 2 3. + <_> + + <_> + 2 8 18 5 -1. + <_> + 8 8 6 5 3. + <_> + + <_> + 18 3 6 11 -1. + <_> + 20 3 2 11 3. + <_> + + <_> + 6 5 11 14 -1. + <_> + 6 12 11 7 2. + <_> + + <_> + 18 4 6 9 -1. + <_> + 18 7 6 3 3. + <_> + + <_> + 7 6 9 6 -1. + <_> + 7 8 9 2 3. + <_> + + <_> + 18 4 6 9 -1. + <_> + 18 7 6 3 3. + <_> + + <_> + 0 4 6 9 -1. + <_> + 0 7 6 3 3. + <_> + + <_> + 9 4 9 4 -1. + <_> + 9 6 9 2 2. + <_> + + <_> + 0 22 19 2 -1. + <_> + 0 23 19 1 2. + <_> + + <_> + 17 14 6 9 -1. + <_> + 17 17 6 3 3. + <_> + + <_> + 1 14 6 9 -1. + <_> + 1 17 6 3 3. + <_> + + <_> + 14 11 4 9 -1. + <_> + 14 11 2 9 2. + <_> + + <_> + 6 11 4 9 -1. + <_> + 8 11 2 9 2. + <_> + + <_> + 3 9 18 7 -1. + <_> + 9 9 6 7 3. + <_> + + <_> + 9 12 6 10 -1. + <_> + 9 17 6 5 2. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 6 17 18 3 -1. + <_> + 6 18 18 1 3. + <_> + + <_> + 1 17 18 3 -1. + <_> + 1 18 18 1 3. + <_> + + <_> + 10 6 11 12 -1. + <_> + 10 12 11 6 2. + <_> + + <_> + 5 6 14 6 -1. + <_> + 5 6 7 3 2. + <_> + 12 9 7 3 2. + <_> + + <_> + 5 4 15 4 -1. + <_> + 5 6 15 2 2. + <_> + + <_> + 0 0 22 2 -1. + <_> + 0 1 22 1 2. + <_> + + <_> + 0 0 24 24 -1. + <_> + 8 0 8 24 3. + <_> + + <_> + 1 15 18 4 -1. + <_> + 10 15 9 4 2. + <_> + + <_> + 6 8 12 9 -1. + <_> + 6 11 12 3 3. + <_> + + <_> + 4 12 7 12 -1. + <_> + 4 16 7 4 3. + <_> + + <_> + 1 2 22 6 -1. + <_> + 12 2 11 3 2. + <_> + 1 5 11 3 2. + <_> + + <_> + 5 20 14 3 -1. + <_> + 12 20 7 3 2. + <_> + + <_> + 0 0 24 16 -1. + <_> + 12 0 12 8 2. + <_> + 0 8 12 8 2. + <_> + + <_> + 3 13 18 4 -1. + <_> + 3 13 9 2 2. + <_> + 12 15 9 2 2. + <_> + + <_> + 2 10 22 2 -1. + <_> + 2 11 22 1 2. + <_> + + <_> + 6 3 11 8 -1. + <_> + 6 7 11 4 2. + <_> + + <_> + 14 5 6 6 -1. + <_> + 14 8 6 3 2. + <_> + + <_> + 0 7 24 6 -1. + <_> + 0 9 24 2 3. + <_> + + <_> + 14 0 10 10 -1. + <_> + 19 0 5 5 2. + <_> + 14 5 5 5 2. + <_> + + <_> + 0 0 10 10 -1. + <_> + 0 0 5 5 2. + <_> + 5 5 5 5 2. + <_> + + <_> + 0 1 24 4 -1. + <_> + 12 1 12 2 2. + <_> + 0 3 12 2 2. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 5 15 16 6 -1. + <_> + 13 15 8 3 2. + <_> + 5 18 8 3 2. + <_> + + <_> + 3 15 16 6 -1. + <_> + 3 15 8 3 2. + <_> + 11 18 8 3 2. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 0 13 21 10 -1. + <_> + 0 18 21 5 2. + <_> + + <_> + 13 0 6 24 -1. + <_> + 15 0 2 24 3. + <_> + + <_> + 7 4 6 11 -1. + <_> + 9 4 2 11 3. + <_> + + <_> + 9 5 9 6 -1. + <_> + 12 5 3 6 3. + <_> + + <_> + 1 4 2 20 -1. + <_> + 1 14 2 10 2. + <_> + + <_> + 13 0 6 24 -1. + <_> + 15 0 2 24 3. + <_> + + <_> + 5 0 6 24 -1. + <_> + 7 0 2 24 3. + <_> + + <_> + 16 7 6 14 -1. + <_> + 19 7 3 7 2. + <_> + 16 14 3 7 2. + <_> + + <_> + 4 7 4 12 -1. + <_> + 6 7 2 12 2. + <_> + + <_> + 0 5 24 14 -1. + <_> + 8 5 8 14 3. + <_> + + <_> + 5 13 10 6 -1. + <_> + 5 15 10 2 3. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 2 7 6 14 -1. + <_> + 2 7 3 7 2. + <_> + 5 14 3 7 2. + <_> + + <_> + 15 2 9 15 -1. + <_> + 18 2 3 15 3. + <_> + + <_> + 0 2 6 9 -1. + <_> + 2 2 2 9 3. + <_> + + <_> + 12 2 10 14 -1. + <_> + 17 2 5 7 2. + <_> + 12 9 5 7 2. + <_> + + <_> + 11 6 2 18 -1. + <_> + 12 6 1 18 2. + <_> + + <_> + 9 5 15 6 -1. + <_> + 14 5 5 6 3. + <_> + + <_> + 8 6 6 10 -1. + <_> + 10 6 2 10 3. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 3 3 9 7 -1. + <_> + 6 3 3 7 3. + <_> + + <_> + 6 7 14 3 -1. + <_> + 6 7 7 3 2. + <_> + + <_> + 7 7 8 6 -1. + <_> + 11 7 4 6 2. + <_> + + <_> + 12 7 7 12 -1. + <_> + 12 13 7 6 2. + <_> + + <_> + 10 6 4 18 -1. + <_> + 10 6 2 9 2. + <_> + 12 15 2 9 2. + <_> + + <_> + 16 14 6 9 -1. + <_> + 16 17 6 3 3. + <_> + + <_> + 4 0 6 13 -1. + <_> + 6 0 2 13 3. + <_> + + <_> + 2 2 21 3 -1. + <_> + 9 2 7 3 3. + <_> + + <_> + 5 4 5 12 -1. + <_> + 5 8 5 4 3. + <_> + + <_> + 10 3 4 10 -1. + <_> + 10 8 4 5 2. + <_> + + <_> + 8 4 5 8 -1. + <_> + 8 8 5 4 2. + <_> + + <_> + 6 0 11 9 -1. + <_> + 6 3 11 3 3. + <_> + + <_> + 6 6 12 5 -1. + <_> + 10 6 4 5 3. + <_> + + <_> + 0 0 24 5 -1. + <_> + 8 0 8 5 3. + <_> + + <_> + 1 10 23 6 -1. + <_> + 1 12 23 2 3. + <_> + + <_> + 3 21 18 3 -1. + <_> + 9 21 6 3 3. + <_> + + <_> + 3 6 21 6 -1. + <_> + 3 8 21 2 3. + <_> + + <_> + 0 5 6 12 -1. + <_> + 2 5 2 12 3. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 8 7 8 10 -1. + <_> + 8 12 8 5 2. + <_> + + <_> + 5 7 15 12 -1. + <_> + 10 7 5 12 3. + <_> + + <_> + 0 17 10 6 -1. + <_> + 0 19 10 2 3. + <_> + + <_> + 14 18 9 6 -1. + <_> + 14 20 9 2 3. + <_> + + <_> + 9 6 6 16 -1. + <_> + 9 14 6 8 2. + <_> + + <_> + 14 18 9 6 -1. + <_> + 14 20 9 2 3. + <_> + + <_> + 1 18 9 6 -1. + <_> + 1 20 9 2 3. + <_> + + <_> + 15 9 9 6 -1. + <_> + 15 11 9 2 3. + <_> + + <_> + 0 9 9 6 -1. + <_> + 0 11 9 2 3. + <_> + + <_> + 17 3 6 9 -1. + <_> + 19 3 2 9 3. + <_> + + <_> + 2 17 18 3 -1. + <_> + 2 18 18 1 3. + <_> + + <_> + 3 15 21 6 -1. + <_> + 3 17 21 2 3. + <_> + + <_> + 9 17 6 6 -1. + <_> + 9 20 6 3 2. + <_> + + <_> + 18 3 6 9 -1. + <_> + 18 6 6 3 3. + <_> + + <_> + 0 3 6 9 -1. + <_> + 0 6 6 3 3. + <_> + + <_> + 4 0 16 10 -1. + <_> + 12 0 8 5 2. + <_> + 4 5 8 5 2. + <_> + + <_> + 2 0 10 16 -1. + <_> + 2 0 5 8 2. + <_> + 7 8 5 8 2. + <_> + + <_> + 14 0 10 5 -1. + <_> + 14 0 5 5 2. + <_> + + <_> + 0 0 10 5 -1. + <_> + 5 0 5 5 2. + <_> + + <_> + 18 3 6 10 -1. + <_> + 18 3 3 10 2. + <_> + + <_> + 5 11 12 6 -1. + <_> + 5 11 6 3 2. + <_> + 11 14 6 3 2. + <_> + + <_> + 21 0 3 18 -1. + <_> + 22 0 1 18 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 8 8 9 7 -1. + <_> + 11 8 3 7 3. + <_> + + <_> + 7 12 8 10 -1. + <_> + 7 12 4 5 2. + <_> + 11 17 4 5 2. + <_> + + <_> + 21 0 3 18 -1. + <_> + 22 0 1 18 3. + <_> + + <_> + 10 6 4 9 -1. + <_> + 12 6 2 9 2. + <_> + + <_> + 15 0 9 6 -1. + <_> + 15 2 9 2 3. + <_> + + <_> + 0 2 24 3 -1. + <_> + 0 3 24 1 3. + <_> + + <_> + 11 7 6 9 -1. + <_> + 13 7 2 9 3. + <_> + + <_> + 7 6 6 10 -1. + <_> + 9 6 2 10 3. + <_> + + <_> + 12 1 6 12 -1. + <_> + 14 1 2 12 3. + <_> + + <_> + 6 4 12 12 -1. + <_> + 6 10 12 6 2. + <_> + + <_> + 14 3 2 21 -1. + <_> + 14 3 1 21 2. + <_> + + <_> + 6 1 12 8 -1. + <_> + 6 5 12 4 2. + <_> + + <_> + 3 0 18 8 -1. + <_> + 3 4 18 4 2. + <_> + + <_> + 3 0 18 3 -1. + <_> + 3 1 18 1 3. + <_> + + <_> + 0 13 24 4 -1. + <_> + 12 13 12 2 2. + <_> + 0 15 12 2 2. + <_> + + <_> + 10 5 4 9 -1. + <_> + 12 5 2 9 2. + <_> + + <_> + 11 1 6 9 -1. + <_> + 13 1 2 9 3. + <_> + + <_> + 6 2 6 22 -1. + <_> + 8 2 2 22 3. + <_> + + <_> + 16 10 8 14 -1. + <_> + 20 10 4 7 2. + <_> + 16 17 4 7 2. + <_> + + <_> + 3 4 16 15 -1. + <_> + 3 9 16 5 3. + <_> + + <_> + 16 10 8 14 -1. + <_> + 20 10 4 7 2. + <_> + 16 17 4 7 2. + <_> + + <_> + 0 10 8 14 -1. + <_> + 0 10 4 7 2. + <_> + 4 17 4 7 2. + <_> + + <_> + 10 14 11 6 -1. + <_> + 10 17 11 3 2. + <_> + + <_> + 0 7 24 9 -1. + <_> + 8 7 8 9 3. + <_> + + <_> + 13 1 4 16 -1. + <_> + 13 1 2 16 2. + <_> + + <_> + 7 1 4 16 -1. + <_> + 9 1 2 16 2. + <_> + + <_> + 5 5 16 8 -1. + <_> + 13 5 8 4 2. + <_> + 5 9 8 4 2. + <_> + + <_> + 0 9 6 9 -1. + <_> + 0 12 6 3 3. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 3 12 6 9 -1. + <_> + 3 15 6 3 3. + <_> + + <_> + 8 14 9 6 -1. + <_> + 8 16 9 2 3. + <_> + + <_> + 2 13 8 10 -1. + <_> + 2 13 4 5 2. + <_> + 6 18 4 5 2. + <_> + + <_> + 15 5 3 18 -1. + <_> + 15 11 3 6 3. + <_> + + <_> + 3 5 18 3 -1. + <_> + 3 6 18 1 3. + <_> + + <_> + 17 5 6 11 -1. + <_> + 19 5 2 11 3. + <_> + + <_> + 1 5 6 11 -1. + <_> + 3 5 2 11 3. + <_> + + <_> + 19 1 4 9 -1. + <_> + 19 1 2 9 2. + <_> + + <_> + 1 1 4 9 -1. + <_> + 3 1 2 9 2. + <_> + + <_> + 4 15 18 9 -1. + <_> + 4 15 9 9 2. + <_> + + <_> + 6 9 12 4 -1. + <_> + 6 11 12 2 2. + <_> + + <_> + 15 2 9 6 -1. + <_> + 15 4 9 2 3. + <_> + + <_> + 0 2 9 6 -1. + <_> + 0 4 9 2 3. + <_> + + <_> + 15 0 6 17 -1. + <_> + 17 0 2 17 3. + <_> + + <_> + 3 0 6 17 -1. + <_> + 5 0 2 17 3. + <_> + + <_> + 8 17 9 4 -1. + <_> + 8 19 9 2 2. + <_> + + <_> + 6 5 3 18 -1. + <_> + 6 11 3 6 3. + <_> + + <_> + 5 2 14 12 -1. + <_> + 5 8 14 6 2. + <_> + + <_> + 10 2 3 12 -1. + <_> + 10 8 3 6 2. + <_> + + <_> + 10 7 14 15 -1. + <_> + 10 12 14 5 3. + <_> + + <_> + 0 7 14 15 -1. + <_> + 0 12 14 5 3. + <_> + + <_> + 15 0 9 6 -1. + <_> + 15 2 9 2 3. + <_> + + <_> + 0 0 9 6 -1. + <_> + 0 2 9 2 3. + <_> + + <_> + 12 6 6 14 -1. + <_> + 14 6 2 14 3. + <_> + + <_> + 9 7 6 9 -1. + <_> + 11 7 2 9 3. + <_> + + <_> + 12 6 6 15 -1. + <_> + 14 6 2 15 3. + <_> + + <_> + 6 6 6 15 -1. + <_> + 8 6 2 15 3. + <_> + + <_> + 15 3 8 9 -1. + <_> + 15 3 4 9 2. + <_> + + <_> + 0 0 9 21 -1. + <_> + 3 0 3 21 3. + <_> + + <_> + 11 9 8 12 -1. + <_> + 11 13 8 4 3. + <_> + + <_> + 6 7 10 12 -1. + <_> + 6 7 5 6 2. + <_> + 11 13 5 6 2. + <_> + + <_> + 10 6 4 18 -1. + <_> + 12 6 2 9 2. + <_> + 10 15 2 9 2. + <_> + + <_> + 0 0 6 9 -1. + <_> + 0 3 6 3 3. + <_> + + <_> + 3 14 18 3 -1. + <_> + 3 15 18 1 3. + <_> + + <_> + 3 14 8 10 -1. + <_> + 3 14 4 5 2. + <_> + 7 19 4 5 2. + <_> + + <_> + 0 12 24 4 -1. + <_> + 12 12 12 2 2. + <_> + 0 14 12 2 2. + <_> + + <_> + 0 2 3 20 -1. + <_> + 1 2 1 20 3. + <_> + + <_> + 12 16 10 8 -1. + <_> + 17 16 5 4 2. + <_> + 12 20 5 4 2. + <_> + + <_> + 2 16 10 8 -1. + <_> + 2 16 5 4 2. + <_> + 7 20 5 4 2. + <_> + + <_> + 7 0 10 9 -1. + <_> + 7 3 10 3 3. + <_> + + <_> + 0 0 24 3 -1. + <_> + 8 0 8 3 3. + <_> + + <_> + 3 8 15 4 -1. + <_> + 3 10 15 2 2. + <_> + + <_> + 6 5 12 6 -1. + <_> + 10 5 4 6 3. + <_> + + <_> + 5 13 14 6 -1. + <_> + 5 16 14 3 2. + <_> + + <_> + 11 14 4 10 -1. + <_> + 11 19 4 5 2. + <_> + + <_> + 0 6 6 7 -1. + <_> + 3 6 3 7 2. + <_> + + <_> + 18 0 6 6 -1. + <_> + 18 0 3 6 2. + <_> + + <_> + 3 1 18 3 -1. + <_> + 3 2 18 1 3. + <_> + + <_> + 9 6 14 18 -1. + <_> + 9 12 14 6 3. + <_> + + <_> + 0 0 6 6 -1. + <_> + 3 0 3 6 2. + <_> + + <_> + 13 11 6 6 -1. + <_> + 13 11 3 6 2. + <_> + + <_> + 0 20 24 3 -1. + <_> + 8 20 8 3 3. + <_> + + <_> + 13 11 6 7 -1. + <_> + 13 11 3 7 2. + <_> + + <_> + 4 12 10 6 -1. + <_> + 4 14 10 2 3. + <_> + + <_> + 13 11 6 6 -1. + <_> + 13 11 3 6 2. + <_> + + <_> + 5 11 6 7 -1. + <_> + 8 11 3 7 2. + <_> + + <_> + 7 4 11 12 -1. + <_> + 7 8 11 4 3. + <_> + + <_> + 6 15 10 4 -1. + <_> + 6 17 10 2 2. + <_> + + <_> + 14 0 6 9 -1. + <_> + 16 0 2 9 3. + <_> + + <_> + 4 0 6 9 -1. + <_> + 6 0 2 9 3. + <_> + + <_> + 11 2 4 15 -1. + <_> + 11 7 4 5 3. + <_> + + <_> + 0 0 20 3 -1. + <_> + 0 1 20 1 3. + <_> + + <_> + 13 18 10 6 -1. + <_> + 13 20 10 2 3. + <_> + + <_> + 2 7 6 11 -1. + <_> + 5 7 3 11 2. + <_> + + <_> + 10 14 10 9 -1. + <_> + 10 17 10 3 3. + <_> + + <_> + 8 2 4 9 -1. + <_> + 10 2 2 9 2. + <_> + + <_> + 14 3 10 4 -1. + <_> + 14 3 5 4 2. + <_> + + <_> + 6 6 12 6 -1. + <_> + 6 6 6 3 2. + <_> + 12 9 6 3 2. + <_> + + <_> + 8 8 8 10 -1. + <_> + 12 8 4 5 2. + <_> + 8 13 4 5 2. + <_> + + <_> + 7 4 4 16 -1. + <_> + 7 12 4 8 2. + <_> + + <_> + 8 8 9 4 -1. + <_> + 8 10 9 2 2. + <_> + + <_> + 5 2 14 9 -1. + <_> + 5 5 14 3 3. + <_> + + <_> + 3 16 19 8 -1. + <_> + 3 20 19 4 2. + <_> + + <_> + 0 0 10 8 -1. + <_> + 5 0 5 8 2. + <_> + + <_> + 5 2 16 18 -1. + <_> + 5 2 8 18 2. + <_> + + <_> + 0 11 24 11 -1. + <_> + 8 11 8 11 3. + <_> + + <_> + 3 3 18 5 -1. + <_> + 3 3 9 5 2. + <_> + + <_> + 1 16 18 3 -1. + <_> + 1 17 18 1 3. + <_> + + <_> + 5 17 18 3 -1. + <_> + 5 18 18 1 3. + <_> + + <_> + 1 13 9 6 -1. + <_> + 1 15 9 2 3. + <_> + + <_> + 1 9 23 10 -1. + <_> + 1 14 23 5 2. + <_> + + <_> + 3 7 18 3 -1. + <_> + 3 8 18 1 3. + <_> + + <_> + 6 8 12 3 -1. + <_> + 6 8 6 3 2. + <_> + + <_> + 6 2 3 22 -1. + <_> + 7 2 1 22 3. + <_> + + <_> + 14 17 10 6 -1. + <_> + 14 19 10 2 3. + <_> + + <_> + 1 18 10 6 -1. + <_> + 1 20 10 2 3. + <_> + + <_> + 11 3 6 12 -1. + <_> + 13 3 2 12 3. + <_> + + <_> + 10 6 4 9 -1. + <_> + 12 6 2 9 2. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 12 10 9 6 -1. + <_> + 15 10 3 6 3. + <_> + + <_> + 2 11 6 9 -1. + <_> + 5 11 3 9 2. + <_> + + <_> + 14 5 3 19 -1. + <_> + 15 5 1 19 3. + <_> + + <_> + 6 6 9 6 -1. + <_> + 6 8 9 2 3. + <_> + + <_> + 14 5 3 19 -1. + <_> + 15 5 1 19 3. + <_> + + <_> + 0 3 6 9 -1. + <_> + 0 6 6 3 3. + <_> + + <_> + 5 21 18 3 -1. + <_> + 5 22 18 1 3. + <_> + + <_> + 1 10 18 4 -1. + <_> + 7 10 6 4 3. + <_> + + <_> + 13 4 8 10 -1. + <_> + 17 4 4 5 2. + <_> + 13 9 4 5 2. + <_> + + <_> + 7 8 9 6 -1. + <_> + 10 8 3 6 3. + <_> + + <_> + 12 9 9 8 -1. + <_> + 15 9 3 8 3. + <_> + + <_> + 0 6 5 12 -1. + <_> + 0 10 5 4 3. + <_> + + <_> + 7 6 14 6 -1. + <_> + 14 6 7 3 2. + <_> + 7 9 7 3 2. + <_> + + <_> + 7 5 3 19 -1. + <_> + 8 5 1 19 3. + <_> + + <_> + 8 4 15 20 -1. + <_> + 13 4 5 20 3. + <_> + + <_> + 1 4 15 20 -1. + <_> + 6 4 5 20 3. + <_> + + <_> + 13 10 6 6 -1. + <_> + 13 10 3 6 2. + <_> + + <_> + 5 10 6 6 -1. + <_> + 8 10 3 6 2. + <_> + + <_> + 14 2 6 14 -1. + <_> + 17 2 3 7 2. + <_> + 14 9 3 7 2. + <_> + + <_> + 4 2 6 14 -1. + <_> + 4 2 3 7 2. + <_> + 7 9 3 7 2. + <_> + + <_> + 12 4 6 7 -1. + <_> + 12 4 3 7 2. + <_> + + <_> + 9 4 6 9 -1. + <_> + 11 4 2 9 3. + <_> + + <_> + 11 4 8 10 -1. + <_> + 11 4 4 10 2. + <_> + + <_> + 5 4 8 10 -1. + <_> + 9 4 4 10 2. + <_> + + <_> + 8 18 10 6 -1. + <_> + 8 20 10 2 3. + <_> + + <_> + 1 18 21 6 -1. + <_> + 1 20 21 2 3. + <_> + + <_> + 9 2 12 6 -1. + <_> + 9 2 6 6 2. + <_> + + <_> + 3 2 12 6 -1. + <_> + 9 2 6 6 2. + <_> + + <_> + 12 5 12 6 -1. + <_> + 18 5 6 3 2. + <_> + 12 8 6 3 2. + <_> + + <_> + 8 8 6 9 -1. + <_> + 8 11 6 3 3. + <_> + + <_> + 2 7 20 6 -1. + <_> + 2 9 20 2 3. + <_> + + <_> + 0 5 12 6 -1. + <_> + 0 5 6 3 2. + <_> + 6 8 6 3 2. + <_> + + <_> + 14 14 8 10 -1. + <_> + 18 14 4 5 2. + <_> + 14 19 4 5 2. + <_> + + <_> + 2 14 8 10 -1. + <_> + 2 14 4 5 2. + <_> + 6 19 4 5 2. + <_> + + <_> + 2 11 20 13 -1. + <_> + 2 11 10 13 2. + <_> + + <_> + 6 9 12 5 -1. + <_> + 12 9 6 5 2. + <_> + + <_> + 5 6 16 6 -1. + <_> + 13 6 8 3 2. + <_> + 5 9 8 3 2. + <_> + + <_> + 1 19 9 4 -1. + <_> + 1 21 9 2 2. + <_> + + <_> + 7 5 12 5 -1. + <_> + 11 5 4 5 3. + <_> + + <_> + 3 5 14 12 -1. + <_> + 3 5 7 6 2. + <_> + 10 11 7 6 2. + <_> + + <_> + 9 4 9 6 -1. + <_> + 12 4 3 6 3. + <_> + + <_> + 2 6 19 3 -1. + <_> + 2 7 19 1 3. + <_> + + <_> + 18 10 6 9 -1. + <_> + 18 13 6 3 3. + <_> + + <_> + 3 7 18 2 -1. + <_> + 3 8 18 1 2. + <_> + + <_> + 20 2 4 18 -1. + <_> + 22 2 2 9 2. + <_> + 20 11 2 9 2. + <_> + + <_> + 2 18 20 3 -1. + <_> + 2 19 20 1 3. + <_> + + <_> + 1 9 22 3 -1. + <_> + 1 10 22 1 3. + <_> + + <_> + 0 2 4 18 -1. + <_> + 0 2 2 9 2. + <_> + 2 11 2 9 2. + <_> + + <_> + 19 0 4 23 -1. + <_> + 19 0 2 23 2. + <_> + + <_> + 0 3 6 19 -1. + <_> + 3 3 3 19 2. + <_> + + <_> + 18 2 6 9 -1. + <_> + 20 2 2 9 3. + <_> + + <_> + 0 5 10 6 -1. + <_> + 0 7 10 2 3. + <_> + + <_> + 7 0 12 12 -1. + <_> + 13 0 6 6 2. + <_> + 7 6 6 6 2. + <_> + + <_> + 0 3 24 6 -1. + <_> + 0 3 12 3 2. + <_> + 12 6 12 3 2. + <_> + + <_> + 10 14 4 10 -1. + <_> + 10 19 4 5 2. + <_> + + <_> + 8 9 4 15 -1. + <_> + 8 14 4 5 3. + <_> + + <_> + 4 11 17 6 -1. + <_> + 4 14 17 3 2. + <_> + + <_> + 2 5 18 8 -1. + <_> + 2 5 9 4 2. + <_> + 11 9 9 4 2. + <_> + + <_> + 7 6 14 6 -1. + <_> + 14 6 7 3 2. + <_> + 7 9 7 3 2. + <_> + + <_> + 3 6 14 6 -1. + <_> + 3 6 7 3 2. + <_> + 10 9 7 3 2. + <_> + + <_> + 16 5 3 18 -1. + <_> + 17 5 1 18 3. + <_> + + <_> + 5 5 3 18 -1. + <_> + 6 5 1 18 3. + <_> + + <_> + 10 10 14 4 -1. + <_> + 10 12 14 2 2. + <_> + + <_> + 4 10 9 4 -1. + <_> + 4 12 9 2 2. + <_> + + <_> + 2 0 18 9 -1. + <_> + 2 3 18 3 3. + <_> + + <_> + 6 3 12 8 -1. + <_> + 10 3 4 8 3. + <_> + + <_> + 1 1 8 5 -1. + <_> + 5 1 4 5 2. + <_> + + <_> + 12 7 7 8 -1. + <_> + 12 11 7 4 2. + <_> + + <_> + 0 12 22 4 -1. + <_> + 0 14 22 2 2. + <_> + + <_> + 15 6 4 15 -1. + <_> + 15 11 4 5 3. + <_> + + <_> + 5 7 7 8 -1. + <_> + 5 11 7 4 2. + <_> + + <_> + 8 18 9 4 -1. + <_> + 8 20 9 2 2. + <_> + + <_> + 1 2 22 4 -1. + <_> + 1 4 22 2 2. + <_> + + <_> + 17 3 6 17 -1. + <_> + 19 3 2 17 3. + <_> + + <_> + 8 2 8 18 -1. + <_> + 8 11 8 9 2. + <_> + + <_> + 17 0 6 12 -1. + <_> + 20 0 3 6 2. + <_> + 17 6 3 6 2. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 15 5 9 12 -1. + <_> + 15 11 9 6 2. + <_> + + <_> + 2 22 18 2 -1. + <_> + 2 23 18 1 2. + <_> + + <_> + 10 10 12 6 -1. + <_> + 16 10 6 3 2. + <_> + 10 13 6 3 2. + <_> + + <_> + 0 1 4 11 -1. + <_> + 2 1 2 11 2. + <_> + + <_> + 20 0 4 10 -1. + <_> + 20 0 2 10 2. + <_> + + <_> + 1 3 6 17 -1. + <_> + 3 3 2 17 3. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 0 13 8 9 -1. + <_> + 0 16 8 3 3. + <_> + + <_> + 16 8 6 12 -1. + <_> + 16 12 6 4 3. + <_> + + <_> + 2 8 6 12 -1. + <_> + 2 12 6 4 3. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 1 5 19 3 -1. + <_> + 1 6 19 1 3. + <_> + + <_> + 11 8 9 7 -1. + <_> + 14 8 3 7 3. + <_> + + <_> + 3 8 12 9 -1. + <_> + 3 11 12 3 3. + <_> + + <_> + 3 6 18 3 -1. + <_> + 3 7 18 1 3. + <_> + + <_> + 10 0 4 12 -1. + <_> + 10 6 4 6 2. + <_> + + <_> + 3 9 18 14 -1. + <_> + 3 9 9 14 2. + <_> + + <_> + 0 0 4 9 -1. + <_> + 2 0 2 9 2. + <_> + + <_> + 12 5 4 18 -1. + <_> + 12 5 2 18 2. + <_> + + <_> + 8 5 4 18 -1. + <_> + 10 5 2 18 2. + <_> + + <_> + 10 5 6 10 -1. + <_> + 12 5 2 10 3. + <_> + + <_> + 9 4 4 11 -1. + <_> + 11 4 2 11 2. + <_> + + <_> + 4 16 18 3 -1. + <_> + 4 17 18 1 3. + <_> + + <_> + 0 16 20 3 -1. + <_> + 0 17 20 1 3. + <_> + + <_> + 9 9 6 12 -1. + <_> + 9 13 6 4 3. + <_> + + <_> + 8 13 8 8 -1. + <_> + 8 17 8 4 2. + <_> + + <_> + 13 10 3 12 -1. + <_> + 13 16 3 6 2. + <_> + + <_> + 5 9 14 14 -1. + <_> + 5 9 7 7 2. + <_> + 12 16 7 7 2. + <_> + + <_> + 0 0 24 10 -1. + <_> + 12 0 12 5 2. + <_> + 0 5 12 5 2. + <_> + + <_> + 1 11 18 2 -1. + <_> + 1 12 18 1 2. + <_> + + <_> + 19 5 5 12 -1. + <_> + 19 9 5 4 3. + <_> + + <_> + 0 5 5 12 -1. + <_> + 0 9 5 4 3. + <_> + + <_> + 16 6 8 18 -1. + <_> + 20 6 4 9 2. + <_> + 16 15 4 9 2. + <_> + + <_> + 0 6 8 18 -1. + <_> + 0 6 4 9 2. + <_> + 4 15 4 9 2. + <_> + + <_> + 12 5 12 12 -1. + <_> + 18 5 6 6 2. + <_> + 12 11 6 6 2. + <_> + + <_> + 7 6 6 9 -1. + <_> + 9 6 2 9 3. + <_> + + <_> + 9 13 6 11 -1. + <_> + 11 13 2 11 3. + <_> + + <_> + 0 5 12 12 -1. + <_> + 0 5 6 6 2. + <_> + 6 11 6 6 2. + <_> + + <_> + 1 2 23 3 -1. + <_> + 1 3 23 1 3. + <_> + + <_> + 1 15 19 3 -1. + <_> + 1 16 19 1 3. + <_> + + <_> + 13 17 11 4 -1. + <_> + 13 19 11 2 2. + <_> + + <_> + 0 13 8 5 -1. + <_> + 4 13 4 5 2. + <_> + + <_> + 12 10 10 4 -1. + <_> + 12 10 5 4 2. + <_> + + <_> + 4 6 9 9 -1. + <_> + 4 9 9 3 3. + <_> + + <_> + 15 14 9 6 -1. + <_> + 15 16 9 2 3. + <_> + + <_> + 1 12 9 6 -1. + <_> + 1 14 9 2 3. + <_> + + <_> + 3 10 20 8 -1. + <_> + 13 10 10 4 2. + <_> + 3 14 10 4 2. + <_> + + <_> + 2 0 9 18 -1. + <_> + 5 0 3 18 3. + <_> + + <_> + 13 11 9 10 -1. + <_> + 16 11 3 10 3. + <_> + + <_> + 1 2 8 5 -1. + <_> + 5 2 4 5 2. + <_> + + <_> + 3 4 21 6 -1. + <_> + 10 4 7 6 3. + <_> + + <_> + 7 0 10 14 -1. + <_> + 7 0 5 7 2. + <_> + 12 7 5 7 2. + <_> + + <_> + 12 17 12 4 -1. + <_> + 12 19 12 2 2. + <_> + + <_> + 0 6 23 4 -1. + <_> + 0 8 23 2 2. + <_> + + <_> + 13 10 8 10 -1. + <_> + 17 10 4 5 2. + <_> + 13 15 4 5 2. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 15 16 9 4 -1. + <_> + 15 18 9 2 2. + <_> + + <_> + 0 16 9 4 -1. + <_> + 0 18 9 2 2. + <_> + + <_> + 13 11 6 6 -1. + <_> + 13 11 3 6 2. + <_> + + <_> + 5 11 6 6 -1. + <_> + 8 11 3 6 2. + <_> + + <_> + 0 3 24 6 -1. + <_> + 12 3 12 3 2. + <_> + 0 6 12 3 2. + <_> + + <_> + 2 4 18 3 -1. + <_> + 2 5 18 1 3. + <_> + + <_> + 0 0 24 4 -1. + <_> + 12 0 12 2 2. + <_> + 0 2 12 2 2. + <_> + + <_> + 1 16 18 3 -1. + <_> + 1 17 18 1 3. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 0 15 9 6 -1. + <_> + 0 17 9 2 3. + <_> + + <_> + 6 17 18 3 -1. + <_> + 6 18 18 1 3. + <_> + + <_> + 8 8 6 10 -1. + <_> + 10 8 2 10 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 8 8 5 8 -1. + <_> + 8 12 5 4 2. + <_> + + <_> + 12 8 6 8 -1. + <_> + 12 12 6 4 2. + <_> + + <_> + 6 5 6 11 -1. + <_> + 8 5 2 11 3. + <_> + + <_> + 13 6 8 9 -1. + <_> + 13 9 8 3 3. + <_> + + <_> + 1 7 21 6 -1. + <_> + 1 9 21 2 3. + <_> + + <_> + 15 5 3 12 -1. + <_> + 15 11 3 6 2. + <_> + + <_> + 6 9 11 12 -1. + <_> + 6 13 11 4 3. + <_> + + <_> + 13 8 10 8 -1. + <_> + 18 8 5 4 2. + <_> + 13 12 5 4 2. + <_> + + <_> + 5 8 12 3 -1. + <_> + 11 8 6 3 2. + <_> + + <_> + 6 11 18 4 -1. + <_> + 12 11 6 4 3. + <_> + + <_> + 0 0 22 22 -1. + <_> + 0 11 22 11 2. + <_> + + <_> + 11 2 6 8 -1. + <_> + 11 6 6 4 2. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 10 0 6 9 -1. + <_> + 12 0 2 9 3. + <_> + + <_> + 8 3 6 14 -1. + <_> + 8 3 3 7 2. + <_> + 11 10 3 7 2. + <_> + + <_> + 3 10 18 8 -1. + <_> + 9 10 6 8 3. + <_> + + <_> + 10 0 3 14 -1. + <_> + 10 7 3 7 2. + <_> + + <_> + 4 3 16 20 -1. + <_> + 4 13 16 10 2. + <_> + + <_> + 9 4 6 10 -1. + <_> + 11 4 2 10 3. + <_> + + <_> + 5 0 16 4 -1. + <_> + 5 2 16 2 2. + <_> + + <_> + 2 5 18 4 -1. + <_> + 8 5 6 4 3. + <_> + + <_> + 13 0 6 9 -1. + <_> + 15 0 2 9 3. + <_> + + <_> + 8 4 8 5 -1. + <_> + 12 4 4 5 2. + <_> + + <_> + 12 10 10 4 -1. + <_> + 12 10 5 4 2. + <_> + + <_> + 2 10 10 4 -1. + <_> + 7 10 5 4 2. + <_> + + <_> + 7 11 12 5 -1. + <_> + 11 11 4 5 3. + <_> + + <_> + 3 10 8 10 -1. + <_> + 3 10 4 5 2. + <_> + 7 15 4 5 2. + <_> + + <_> + 11 12 9 8 -1. + <_> + 14 12 3 8 3. + <_> + + <_> + 0 21 24 3 -1. + <_> + 8 21 8 3 3. + <_> + + <_> + 3 20 18 4 -1. + <_> + 9 20 6 4 3. + <_> + + <_> + 1 15 9 6 -1. + <_> + 1 17 9 2 3. + <_> + + <_> + 11 17 10 4 -1. + <_> + 11 19 10 2 2. + <_> + + <_> + 9 12 4 12 -1. + <_> + 9 18 4 6 2. + <_> + + <_> + 9 6 9 6 -1. + <_> + 12 6 3 6 3. + <_> + + <_> + 1 13 6 9 -1. + <_> + 1 16 6 3 3. + <_> + + <_> + 6 16 12 4 -1. + <_> + 6 18 12 2 2. + <_> + + <_> + 1 5 20 3 -1. + <_> + 1 6 20 1 3. + <_> + + <_> + 8 1 9 9 -1. + <_> + 8 4 9 3 3. + <_> + + <_> + 2 19 9 4 -1. + <_> + 2 21 9 2 2. + <_> + + <_> + 11 1 4 18 -1. + <_> + 11 7 4 6 3. + <_> + + <_> + 7 2 8 12 -1. + <_> + 7 2 4 6 2. + <_> + 11 8 4 6 2. + <_> + + <_> + 11 10 9 8 -1. + <_> + 14 10 3 8 3. + <_> + + <_> + 5 11 12 5 -1. + <_> + 9 11 4 5 3. + <_> + + <_> + 11 9 9 6 -1. + <_> + 14 9 3 6 3. + <_> + + <_> + 5 10 6 9 -1. + <_> + 7 10 2 9 3. + <_> + + <_> + 4 7 5 12 -1. + <_> + 4 11 5 4 3. + <_> + + <_> + 2 0 21 6 -1. + <_> + 9 0 7 6 3. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 9 0 6 15 -1. + <_> + 11 0 2 15 3. + <_> + + <_> + 2 2 18 2 -1. + <_> + 2 3 18 1 2. + <_> + + <_> + 8 17 8 6 -1. + <_> + 8 20 8 3 2. + <_> + + <_> + 3 0 18 2 -1. + <_> + 3 1 18 1 2. + <_> + + <_> + 8 0 9 6 -1. + <_> + 11 0 3 6 3. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 6 7 12 5 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 0 3 6 9 -1. + <_> + 2 3 2 9 3. + <_> + + <_> + 20 2 4 9 -1. + <_> + 20 2 2 9 2. + <_> + + <_> + 0 2 4 9 -1. + <_> + 2 2 2 9 2. + <_> + + <_> + 0 1 24 4 -1. + <_> + 12 1 12 2 2. + <_> + 0 3 12 2 2. + <_> + + <_> + 0 16 9 6 -1. + <_> + 0 18 9 2 3. + <_> + + <_> + 14 13 9 6 -1. + <_> + 14 15 9 2 3. + <_> + + <_> + 0 15 19 3 -1. + <_> + 0 16 19 1 3. + <_> + + <_> + 1 5 22 12 -1. + <_> + 12 5 11 6 2. + <_> + 1 11 11 6 2. + <_> + + <_> + 5 13 6 6 -1. + <_> + 8 13 3 6 2. + <_> + + <_> + 4 2 20 3 -1. + <_> + 4 3 20 1 3. + <_> + + <_> + 8 14 6 10 -1. + <_> + 10 14 2 10 3. + <_> + + <_> + 6 12 16 6 -1. + <_> + 14 12 8 3 2. + <_> + 6 15 8 3 2. + <_> + + <_> + 2 13 8 9 -1. + <_> + 2 16 8 3 3. + <_> + + <_> + 11 8 6 14 -1. + <_> + 14 8 3 7 2. + <_> + 11 15 3 7 2. + <_> + + <_> + 2 12 16 6 -1. + <_> + 2 12 8 3 2. + <_> + 10 15 8 3 2. + <_> + + <_> + 5 16 16 8 -1. + <_> + 5 20 16 4 2. + <_> + + <_> + 9 1 4 12 -1. + <_> + 9 7 4 6 2. + <_> + + <_> + 8 2 8 10 -1. + <_> + 12 2 4 5 2. + <_> + 8 7 4 5 2. + <_> + + <_> + 6 6 12 6 -1. + <_> + 6 6 6 3 2. + <_> + 12 9 6 3 2. + <_> + + <_> + 10 7 6 9 -1. + <_> + 12 7 2 9 3. + <_> + + <_> + 0 0 8 12 -1. + <_> + 0 0 4 6 2. + <_> + 4 6 4 6 2. + <_> + + <_> + 18 8 6 9 -1. + <_> + 18 11 6 3 3. + <_> + + <_> + 2 12 6 6 -1. + <_> + 5 12 3 6 2. + <_> + + <_> + 3 21 21 3 -1. + <_> + 10 21 7 3 3. + <_> + + <_> + 2 0 16 6 -1. + <_> + 2 3 16 3 2. + <_> + + <_> + 13 6 7 6 -1. + <_> + 13 9 7 3 2. + <_> + + <_> + 6 4 4 14 -1. + <_> + 6 11 4 7 2. + <_> + + <_> + 9 7 6 9 -1. + <_> + 11 7 2 9 3. + <_> + + <_> + 7 8 6 14 -1. + <_> + 7 8 3 7 2. + <_> + 10 15 3 7 2. + <_> + + <_> + 18 8 4 16 -1. + <_> + 18 16 4 8 2. + <_> + + <_> + 9 14 6 10 -1. + <_> + 11 14 2 10 3. + <_> + + <_> + 6 11 12 5 -1. + <_> + 10 11 4 5 3. + <_> + + <_> + 0 12 23 3 -1. + <_> + 0 13 23 1 3. + <_> + + <_> + 13 0 6 12 -1. + <_> + 15 0 2 12 3. + <_> + + <_> + 0 10 12 5 -1. + <_> + 4 10 4 5 3. + <_> + + <_> + 13 2 10 4 -1. + <_> + 13 4 10 2 2. + <_> + + <_> + 5 0 6 12 -1. + <_> + 7 0 2 12 3. + <_> + + <_> + 11 6 9 6 -1. + <_> + 14 6 3 6 3. + <_> + + <_> + 4 6 9 6 -1. + <_> + 7 6 3 6 3. + <_> + + <_> + 6 11 18 13 -1. + <_> + 12 11 6 13 3. + <_> + + <_> + 0 11 18 13 -1. + <_> + 6 11 6 13 3. + <_> + + <_> + 12 16 12 6 -1. + <_> + 16 16 4 6 3. + <_> + + <_> + 0 6 21 3 -1. + <_> + 0 7 21 1 3. + <_> + + <_> + 12 16 12 6 -1. + <_> + 16 16 4 6 3. + <_> + + <_> + 5 7 6 14 -1. + <_> + 5 14 6 7 2. + <_> + + <_> + 5 10 19 2 -1. + <_> + 5 11 19 1 2. + <_> + + <_> + 5 4 14 4 -1. + <_> + 5 6 14 2 2. + <_> + + <_> + 3 18 18 4 -1. + <_> + 9 18 6 4 3. + <_> + + <_> + 7 0 4 9 -1. + <_> + 9 0 2 9 2. + <_> + + <_> + 13 3 11 4 -1. + <_> + 13 5 11 2 2. + <_> + + <_> + 2 0 9 6 -1. + <_> + 5 0 3 6 3. + <_> + + <_> + 19 1 4 23 -1. + <_> + 19 1 2 23 2. + <_> + + <_> + 1 1 4 23 -1. + <_> + 3 1 2 23 2. + <_> + + <_> + 5 16 18 3 -1. + <_> + 5 17 18 1 3. + <_> + + <_> + 0 3 11 4 -1. + <_> + 0 5 11 2 2. + <_> + + <_> + 2 16 20 3 -1. + <_> + 2 17 20 1 3. + <_> + + <_> + 5 3 13 4 -1. + <_> + 5 5 13 2 2. + <_> + + <_> + 1 9 22 15 -1. + <_> + 1 9 11 15 2. + <_> + + <_> + 3 4 14 3 -1. + <_> + 10 4 7 3 2. + <_> + + <_> + 8 7 10 4 -1. + <_> + 8 7 5 4 2. + <_> + + <_> + 6 7 10 4 -1. + <_> + 11 7 5 4 2. + <_> + + <_> + 10 4 6 9 -1. + <_> + 12 4 2 9 3. + <_> + + <_> + 1 12 9 6 -1. + <_> + 4 12 3 6 3. + <_> + + <_> + 8 3 8 10 -1. + <_> + 12 3 4 5 2. + <_> + 8 8 4 5 2. + <_> + + <_> + 3 6 16 6 -1. + <_> + 3 6 8 3 2. + <_> + 11 9 8 3 2. + <_> + + <_> + 5 6 14 6 -1. + <_> + 5 9 14 3 2. + <_> + + <_> + 4 3 9 6 -1. + <_> + 4 5 9 2 3. + <_> + + <_> + 6 3 18 2 -1. + <_> + 6 4 18 1 2. + <_> + + <_> + 7 6 9 6 -1. + <_> + 10 6 3 6 3. + <_> + + <_> + 0 1 24 3 -1. + <_> + 0 2 24 1 3. + <_> + + <_> + 0 17 10 6 -1. + <_> + 0 19 10 2 3. + <_> + + <_> + 3 18 18 3 -1. + <_> + 3 19 18 1 3. + <_> + + <_> + 2 5 6 16 -1. + <_> + 2 5 3 8 2. + <_> + 5 13 3 8 2. + <_> + + <_> + 7 6 11 6 -1. + <_> + 7 8 11 2 3. + <_> + + <_> + 5 2 12 22 -1. + <_> + 5 13 12 11 2. + <_> + + <_> + 10 7 4 10 -1. + <_> + 10 12 4 5 2. + <_> + + <_> + 9 0 4 18 -1. + <_> + 9 6 4 6 3. + <_> + + <_> + 18 8 6 9 -1. + <_> + 18 11 6 3 3. + <_> + + <_> + 4 7 15 10 -1. + <_> + 9 7 5 10 3. + <_> + + <_> + 10 5 6 9 -1. + <_> + 12 5 2 9 3. + <_> + + <_> + 9 9 6 10 -1. + <_> + 11 9 2 10 3. + <_> + + <_> + 11 14 6 10 -1. + <_> + 13 14 2 10 3. + <_> + + <_> + 7 14 6 10 -1. + <_> + 9 14 2 10 3. + <_> + + <_> + 4 8 16 9 -1. + <_> + 4 11 16 3 3. + <_> + + <_> + 2 11 20 3 -1. + <_> + 2 12 20 1 3. + <_> + + <_> + 13 0 4 13 -1. + <_> + 13 0 2 13 2. + <_> + + <_> + 7 0 4 13 -1. + <_> + 9 0 2 13 2. + <_> + + <_> + 3 1 18 7 -1. + <_> + 9 1 6 7 3. + <_> + + <_> + 1 11 6 9 -1. + <_> + 1 14 6 3 3. + <_> + + <_> + 8 18 9 6 -1. + <_> + 8 20 9 2 3. + <_> + + <_> + 3 9 15 6 -1. + <_> + 3 11 15 2 3. + <_> + + <_> + 5 10 19 2 -1. + <_> + 5 11 19 1 2. + <_> + + <_> + 8 6 7 16 -1. + <_> + 8 14 7 8 2. + <_> + + <_> + 9 14 9 6 -1. + <_> + 9 16 9 2 3. + <_> + + <_> + 0 7 8 12 -1. + <_> + 0 11 8 4 3. + <_> + + <_> + 6 4 18 3 -1. + <_> + 6 5 18 1 3. + <_> + + <_> + 0 16 12 6 -1. + <_> + 4 16 4 6 3. + <_> + + <_> + 13 13 9 4 -1. + <_> + 13 15 9 2 2. + <_> + + <_> + 5 8 14 14 -1. + <_> + 5 8 7 7 2. + <_> + 12 15 7 7 2. + <_> + + <_> + 1 16 22 6 -1. + <_> + 12 16 11 3 2. + <_> + 1 19 11 3 2. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 9 5 10 10 -1. + <_> + 14 5 5 5 2. + <_> + 9 10 5 5 2. + <_> + + <_> + 5 5 10 10 -1. + <_> + 5 5 5 5 2. + <_> + 10 10 5 5 2. + <_> + + <_> + 4 6 16 6 -1. + <_> + 12 6 8 3 2. + <_> + 4 9 8 3 2. + <_> + + <_> + 0 7 6 9 -1. + <_> + 0 10 6 3 3. + <_> + + <_> + 16 10 8 14 -1. + <_> + 20 10 4 7 2. + <_> + 16 17 4 7 2. + <_> + + <_> + 9 12 6 12 -1. + <_> + 9 18 6 6 2. + <_> + + <_> + 8 10 8 12 -1. + <_> + 12 10 4 6 2. + <_> + 8 16 4 6 2. + <_> + + <_> + 8 0 4 9 -1. + <_> + 10 0 2 9 2. + <_> + + <_> + 10 4 8 16 -1. + <_> + 14 4 4 8 2. + <_> + 10 12 4 8 2. + <_> + + <_> + 7 10 10 6 -1. + <_> + 7 12 10 2 3. + <_> + + <_> + 5 6 14 14 -1. + <_> + 12 6 7 7 2. + <_> + 5 13 7 7 2. + <_> + + <_> + 2 11 20 2 -1. + <_> + 2 12 20 1 2. + <_> + + <_> + 18 8 4 16 -1. + <_> + 18 16 4 8 2. + <_> + + <_> + 1 11 12 10 -1. + <_> + 1 11 6 5 2. + <_> + 7 16 6 5 2. + <_> + + <_> + 6 9 12 4 -1. + <_> + 6 11 12 2 2. + <_> + + <_> + 9 12 6 7 -1. + <_> + 12 12 3 7 2. + <_> + + <_> + 10 4 8 16 -1. + <_> + 14 4 4 8 2. + <_> + 10 12 4 8 2. + <_> + + <_> + 6 4 8 16 -1. + <_> + 6 4 4 8 2. + <_> + 10 12 4 8 2. + <_> + + <_> + 8 9 9 6 -1. + <_> + 11 9 3 6 3. + <_> + + <_> + 1 5 16 12 -1. + <_> + 1 5 8 6 2. + <_> + 9 11 8 6 2. + <_> + + <_> + 9 9 6 8 -1. + <_> + 9 9 3 8 2. + <_> + + <_> + 6 0 3 18 -1. + <_> + 7 0 1 18 3. + <_> + + <_> + 17 9 5 14 -1. + <_> + 17 16 5 7 2. + <_> + + <_> + 2 9 5 14 -1. + <_> + 2 16 5 7 2. + <_> + + <_> + 7 4 10 6 -1. + <_> + 7 7 10 3 2. + <_> + + <_> + 1 3 23 18 -1. + <_> + 1 9 23 6 3. + <_> + + <_> + 1 1 21 3 -1. + <_> + 8 1 7 3 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 3 18 12 6 -1. + <_> + 3 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 16 8 8 16 -1. + <_> + 20 8 4 8 2. + <_> + 16 16 4 8 2. + <_> + + <_> + 0 19 24 4 -1. + <_> + 8 19 8 4 3. + <_> + + <_> + 16 8 8 16 -1. + <_> + 20 8 4 8 2. + <_> + 16 16 4 8 2. + <_> + + <_> + 0 8 8 16 -1. + <_> + 0 8 4 8 2. + <_> + 4 16 4 8 2. + <_> + + <_> + 8 12 8 10 -1. + <_> + 8 17 8 5 2. + <_> + + <_> + 5 7 5 8 -1. + <_> + 5 11 5 4 2. + <_> + + <_> + 4 1 19 2 -1. + <_> + 4 2 19 1 2. + <_> + + <_> + 0 12 24 9 -1. + <_> + 8 12 8 9 3. + <_> + + <_> + 6 0 13 8 -1. + <_> + 6 4 13 4 2. + <_> + + <_> + 0 0 24 3 -1. + <_> + 0 1 24 1 3. + <_> + + <_> + 20 3 4 11 -1. + <_> + 20 3 2 11 2. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 6 11 12 8 -1. + <_> + 12 11 6 4 2. + <_> + 6 15 6 4 2. + <_> + + <_> + 0 8 12 6 -1. + <_> + 0 8 6 3 2. + <_> + 6 11 6 3 2. + <_> + + <_> + 6 17 18 3 -1. + <_> + 6 18 18 1 3. + <_> + + <_> + 0 14 9 6 -1. + <_> + 0 16 9 2 3. + <_> + + <_> + 20 3 4 9 -1. + <_> + 20 3 2 9 2. + <_> + + <_> + 0 3 4 9 -1. + <_> + 2 3 2 9 2. + <_> + + <_> + 15 0 9 19 -1. + <_> + 18 0 3 19 3. + <_> + + <_> + 0 0 9 19 -1. + <_> + 3 0 3 19 3. + <_> + + <_> + 13 11 6 8 -1. + <_> + 13 11 3 8 2. + <_> + + <_> + 5 11 6 8 -1. + <_> + 8 11 3 8 2. + <_> + + <_> + 5 11 19 3 -1. + <_> + 5 12 19 1 3. + <_> + + <_> + 3 20 18 4 -1. + <_> + 9 20 6 4 3. + <_> + + <_> + 6 6 16 6 -1. + <_> + 6 8 16 2 3. + <_> + + <_> + 6 0 9 6 -1. + <_> + 9 0 3 6 3. + <_> + + <_> + 10 3 4 14 -1. + <_> + 10 10 4 7 2. + <_> + + <_> + 1 5 15 12 -1. + <_> + 1 11 15 6 2. + <_> + + <_> + 11 12 8 5 -1. + <_> + 11 12 4 5 2. + <_> + + <_> + 5 0 6 9 -1. + <_> + 7 0 2 9 3. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 5 5 12 8 -1. + <_> + 5 5 6 4 2. + <_> + 11 9 6 4 2. + <_> + + <_> + 13 12 11 6 -1. + <_> + 13 14 11 2 3. + <_> + + <_> + 0 13 21 3 -1. + <_> + 0 14 21 1 3. + <_> + + <_> + 8 1 8 12 -1. + <_> + 12 1 4 6 2. + <_> + 8 7 4 6 2. + <_> + + <_> + 1 0 6 12 -1. + <_> + 1 0 3 6 2. + <_> + 4 6 3 6 2. + <_> + + <_> + 2 2 21 2 -1. + <_> + 2 3 21 1 2. + <_> + + <_> + 2 2 19 3 -1. + <_> + 2 3 19 1 3. + <_> + + <_> + 17 10 6 14 -1. + <_> + 20 10 3 7 2. + <_> + 17 17 3 7 2. + <_> + + <_> + 1 10 6 14 -1. + <_> + 1 10 3 7 2. + <_> + 4 17 3 7 2. + <_> + + <_> + 7 6 14 14 -1. + <_> + 14 6 7 7 2. + <_> + 7 13 7 7 2. + <_> + + <_> + 0 12 9 6 -1. + <_> + 0 14 9 2 3. + <_> + + <_> + 15 14 8 9 -1. + <_> + 15 17 8 3 3. + <_> + + <_> + 1 1 22 4 -1. + <_> + 1 1 11 2 2. + <_> + 12 3 11 2 2. + <_> + + <_> + 9 11 9 6 -1. + <_> + 9 13 9 2 3. + <_> + + <_> + 0 15 18 3 -1. + <_> + 0 16 18 1 3. + <_> + + <_> + 16 14 7 9 -1. + <_> + 16 17 7 3 3. + <_> + + <_> + 4 3 16 4 -1. + <_> + 12 3 8 4 2. + <_> + + <_> + 7 6 12 5 -1. + <_> + 7 6 6 5 2. + <_> + + <_> + 9 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 12 1 4 10 -1. + <_> + 12 1 2 10 2. + <_> + + <_> + 8 1 4 10 -1. + <_> + 10 1 2 10 2. + <_> + + <_> + 15 15 6 9 -1. + <_> + 15 18 6 3 3. + <_> + + <_> + 3 15 6 9 -1. + <_> + 3 18 6 3 3. + <_> + + <_> + 15 1 3 19 -1. + <_> + 16 1 1 19 3. + <_> + + <_> + 1 3 6 9 -1. + <_> + 3 3 2 9 3. + <_> + + <_> + 15 0 3 19 -1. + <_> + 16 0 1 19 3. + <_> + + <_> + 6 3 12 4 -1. + <_> + 12 3 6 4 2. + <_> + + <_> + 10 5 4 9 -1. + <_> + 10 5 2 9 2. + <_> + + <_> + 6 0 3 19 -1. + <_> + 7 0 1 19 3. + <_> + + <_> + 11 1 3 12 -1. + <_> + 11 7 3 6 2. + <_> + + <_> + 6 7 10 5 -1. + <_> + 11 7 5 5 2. + <_> + + <_> + 11 3 3 18 -1. + <_> + 12 3 1 18 3. + <_> + + <_> + 9 3 6 12 -1. + <_> + 11 3 2 12 3. + <_> + + <_> + 3 7 19 3 -1. + <_> + 3 8 19 1 3. + <_> + + <_> + 2 7 18 3 -1. + <_> + 2 8 18 1 3. + <_> + + <_> + 3 13 18 4 -1. + <_> + 12 13 9 2 2. + <_> + 3 15 9 2 2. + <_> + + <_> + 3 5 6 9 -1. + <_> + 5 5 2 9 3. + <_> + + <_> + 4 1 20 4 -1. + <_> + 14 1 10 2 2. + <_> + 4 3 10 2 2. + <_> + + <_> + 0 1 20 4 -1. + <_> + 0 1 10 2 2. + <_> + 10 3 10 2 2. + <_> + + <_> + 10 15 6 6 -1. + <_> + 10 15 3 6 2. + <_> + + <_> + 0 2 24 8 -1. + <_> + 8 2 8 8 3. + <_> + + <_> + 5 5 18 3 -1. + <_> + 5 6 18 1 3. + <_> + + <_> + 8 15 6 6 -1. + <_> + 11 15 3 6 2. + <_> + + <_> + 11 12 8 5 -1. + <_> + 11 12 4 5 2. + <_> + + <_> + 5 12 8 5 -1. + <_> + 9 12 4 5 2. + <_> + + <_> + 5 0 14 6 -1. + <_> + 5 2 14 2 3. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 10 7 5 12 -1. + <_> + 10 11 5 4 3. + <_> + + <_> + 7 9 8 14 -1. + <_> + 7 9 4 7 2. + <_> + 11 16 4 7 2. + <_> + + <_> + 1 5 22 6 -1. + <_> + 12 5 11 3 2. + <_> + 1 8 11 3 2. + <_> + + <_> + 0 5 6 6 -1. + <_> + 0 8 6 3 2. + <_> + + <_> + 12 17 9 4 -1. + <_> + 12 19 9 2 2. + <_> + + <_> + 2 18 19 3 -1. + <_> + 2 19 19 1 3. + <_> + + <_> + 12 17 9 4 -1. + <_> + 12 19 9 2 2. + <_> + + <_> + 1 17 18 3 -1. + <_> + 1 18 18 1 3. + <_> + + <_> + 12 17 9 4 -1. + <_> + 12 19 9 2 2. + <_> + + <_> + 0 0 24 3 -1. + <_> + 0 1 24 1 3. + <_> + + <_> + 5 0 14 4 -1. + <_> + 5 2 14 2 2. + <_> + + <_> + 6 14 9 6 -1. + <_> + 6 16 9 2 3. + <_> + + <_> + 14 13 6 9 -1. + <_> + 14 16 6 3 3. + <_> + + <_> + 5 20 13 4 -1. + <_> + 5 22 13 2 2. + <_> + + <_> + 9 9 6 12 -1. + <_> + 9 13 6 4 3. + <_> + + <_> + 1 10 21 3 -1. + <_> + 8 10 7 3 3. + <_> + + <_> + 8 8 9 6 -1. + <_> + 11 8 3 6 3. + <_> + + <_> + 3 10 9 7 -1. + <_> + 6 10 3 7 3. + <_> + + <_> + 12 10 10 8 -1. + <_> + 17 10 5 4 2. + <_> + 12 14 5 4 2. + <_> + + <_> + 0 15 24 3 -1. + <_> + 8 15 8 3 3. + <_> + + <_> + 8 5 9 6 -1. + <_> + 8 7 9 2 3. + <_> + + <_> + 4 13 6 9 -1. + <_> + 4 16 6 3 3. + <_> + + <_> + 12 17 9 4 -1. + <_> + 12 19 9 2 2. + <_> + + <_> + 9 12 6 6 -1. + <_> + 9 15 6 3 2. + <_> + + <_> + 9 9 14 10 -1. + <_> + 16 9 7 5 2. + <_> + 9 14 7 5 2. + <_> + + <_> + 1 9 14 10 -1. + <_> + 1 9 7 5 2. + <_> + 8 14 7 5 2. + <_> + + <_> + 8 7 9 17 -1. + <_> + 11 7 3 17 3. + <_> + + <_> + 3 4 6 20 -1. + <_> + 3 4 3 10 2. + <_> + 6 14 3 10 2. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 8 5 4 2. + <_> + + <_> + 10 7 4 9 -1. + <_> + 12 7 2 9 2. + <_> + + <_> + 10 15 6 9 -1. + <_> + 12 15 2 9 3. + <_> + + <_> + 3 8 6 16 -1. + <_> + 3 8 3 8 2. + <_> + 6 16 3 8 2. + <_> + + <_> + 12 17 9 4 -1. + <_> + 12 19 9 2 2. + <_> + + <_> + 3 17 9 4 -1. + <_> + 3 19 9 2 2. + <_> + + <_> + 10 1 9 6 -1. + <_> + 13 1 3 6 3. + <_> + + <_> + 5 7 4 10 -1. + <_> + 5 12 4 5 2. + <_> + + <_> + 7 5 12 6 -1. + <_> + 11 5 4 6 3. + <_> + + <_> + 6 4 9 8 -1. + <_> + 9 4 3 8 3. + <_> + + <_> + 12 16 10 8 -1. + <_> + 17 16 5 4 2. + <_> + 12 20 5 4 2. + <_> + + <_> + 2 16 10 8 -1. + <_> + 2 16 5 4 2. + <_> + 7 20 5 4 2. + <_> + + <_> + 0 0 24 4 -1. + <_> + 12 0 12 2 2. + <_> + 0 2 12 2 2. + <_> + + <_> + 0 6 9 6 -1. + <_> + 0 8 9 2 3. + <_> + + <_> + 0 4 24 6 -1. + <_> + 12 4 12 3 2. + <_> + 0 7 12 3 2. + <_> + + <_> + 5 0 11 4 -1. + <_> + 5 2 11 2 2. + <_> + + <_> + 1 1 22 4 -1. + <_> + 12 1 11 2 2. + <_> + 1 3 11 2 2. + <_> + + <_> + 9 6 6 18 -1. + <_> + 9 15 6 9 2. + <_> + + <_> + 2 9 20 4 -1. + <_> + 2 11 20 2 2. + <_> + + <_> + 5 2 14 14 -1. + <_> + 5 9 14 7 2. + <_> + + <_> + 4 2 16 6 -1. + <_> + 4 5 16 3 2. + <_> + + <_> + 2 3 19 3 -1. + <_> + 2 4 19 1 3. + <_> + + <_> + 7 1 10 4 -1. + <_> + 7 3 10 2 2. + <_> + + <_> + 0 9 4 15 -1. + <_> + 0 14 4 5 3. + <_> + + <_> + 2 10 21 3 -1. + <_> + 2 11 21 1 3. + <_> + + <_> + 3 0 6 6 -1. + <_> + 6 0 3 6 2. + <_> + + <_> + 6 4 14 9 -1. + <_> + 6 7 14 3 3. + <_> + + <_> + 9 1 6 9 -1. + <_> + 11 1 2 9 3. + <_> + + <_> + 15 8 9 9 -1. + <_> + 15 11 9 3 3. + <_> + + <_> + 8 0 4 21 -1. + <_> + 8 7 4 7 3. + <_> + + <_> + 3 22 19 2 -1. + <_> + 3 23 19 1 2. + <_> + + <_> + 2 15 20 3 -1. + <_> + 2 16 20 1 3. + <_> + + <_> + 19 0 4 13 -1. + <_> + 19 0 2 13 2. + <_> + + <_> + 1 7 8 8 -1. + <_> + 1 11 8 4 2. + <_> + + <_> + 14 14 6 9 -1. + <_> + 14 17 6 3 3. + <_> + + <_> + 4 14 6 9 -1. + <_> + 4 17 6 3 3. + <_> + + <_> + 14 5 4 10 -1. + <_> + 14 5 2 10 2. + <_> + + <_> + 6 5 4 10 -1. + <_> + 8 5 2 10 2. + <_> + + <_> + 14 5 6 6 -1. + <_> + 14 8 6 3 2. + <_> + + <_> + 4 5 6 6 -1. + <_> + 4 8 6 3 2. + <_> + + <_> + 0 2 24 21 -1. + <_> + 8 2 8 21 3. + <_> + + <_> + 1 2 6 13 -1. + <_> + 3 2 2 13 3. + <_> + + <_> + 20 0 4 21 -1. + <_> + 20 0 2 21 2. + <_> + + <_> + 0 4 4 20 -1. + <_> + 2 4 2 20 2. + <_> + + <_> + 8 16 9 6 -1. + <_> + 8 18 9 2 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 16 12 7 9 -1. + <_> + 16 15 7 3 3. + <_> + + <_> + 5 21 14 3 -1. + <_> + 12 21 7 3 2. + <_> + + <_> + 11 5 6 9 -1. + <_> + 11 5 3 9 2. + <_> + + <_> + 10 5 4 10 -1. + <_> + 12 5 2 10 2. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 7 5 6 9 -1. + <_> + 10 5 3 9 2. + <_> + + <_> + 14 14 10 4 -1. + <_> + 14 16 10 2 2. + <_> + + <_> + 5 5 14 14 -1. + <_> + 5 5 7 7 2. + <_> + 12 12 7 7 2. + <_> + + <_> + 12 8 12 6 -1. + <_> + 18 8 6 3 2. + <_> + 12 11 6 3 2. + <_> + + <_> + 6 6 12 12 -1. + <_> + 6 6 6 6 2. + <_> + 12 12 6 6 2. + <_> + + <_> + 11 13 6 10 -1. + <_> + 13 13 2 10 3. + <_> + + <_> + 1 10 20 8 -1. + <_> + 1 10 10 4 2. + <_> + 11 14 10 4 2. + <_> + + <_> + 15 13 9 6 -1. + <_> + 15 15 9 2 3. + <_> + + <_> + 9 0 6 9 -1. + <_> + 9 3 6 3 3. + <_> + + <_> + 10 1 5 14 -1. + <_> + 10 8 5 7 2. + <_> + + <_> + 3 4 16 6 -1. + <_> + 3 6 16 2 3. + <_> + + <_> + 16 3 8 9 -1. + <_> + 16 6 8 3 3. + <_> + + <_> + 7 13 6 10 -1. + <_> + 9 13 2 10 3. + <_> + + <_> + 15 13 9 6 -1. + <_> + 15 15 9 2 3. + <_> + + <_> + 0 13 9 6 -1. + <_> + 0 15 9 2 3. + <_> + + <_> + 13 16 9 6 -1. + <_> + 13 18 9 2 3. + <_> + + <_> + 2 16 9 6 -1. + <_> + 2 18 9 2 3. + <_> + + <_> + 5 16 18 3 -1. + <_> + 5 17 18 1 3. + <_> + + <_> + 1 16 18 3 -1. + <_> + 1 17 18 1 3. + <_> + + <_> + 5 0 18 3 -1. + <_> + 5 1 18 1 3. + <_> + + <_> + 1 1 19 2 -1. + <_> + 1 2 19 1 2. + <_> + + <_> + 14 2 6 11 -1. + <_> + 16 2 2 11 3. + <_> + + <_> + 4 15 15 6 -1. + <_> + 9 15 5 6 3. + <_> + + <_> + 14 2 6 11 -1. + <_> + 16 2 2 11 3. + <_> + + <_> + 4 2 6 11 -1. + <_> + 6 2 2 11 3. + <_> + + <_> + 18 2 6 9 -1. + <_> + 18 5 6 3 3. + <_> + + <_> + 1 2 22 4 -1. + <_> + 1 2 11 2 2. + <_> + 12 4 11 2 2. + <_> + + <_> + 2 0 21 12 -1. + <_> + 9 0 7 12 3. + <_> + + <_> + 0 12 18 3 -1. + <_> + 0 13 18 1 3. + <_> + + <_> + 12 2 6 9 -1. + <_> + 14 2 2 9 3. + <_> + + <_> + 3 10 18 3 -1. + <_> + 3 11 18 1 3. + <_> + + <_> + 16 3 8 9 -1. + <_> + 16 6 8 3 3. + <_> + + <_> + 3 7 18 3 -1. + <_> + 3 8 18 1 3. + <_> + + <_> + 9 11 6 9 -1. + <_> + 11 11 2 9 3. + <_> + + <_> + 9 8 6 9 -1. + <_> + 11 8 2 9 3. + <_> + + <_> + 15 0 2 18 -1. + <_> + 15 0 1 18 2. + <_> + + <_> + 7 0 2 18 -1. + <_> + 8 0 1 18 2. + <_> + + <_> + 17 3 7 9 -1. + <_> + 17 6 7 3 3. + <_> + + <_> + 3 18 9 6 -1. + <_> + 3 20 9 2 3. + <_> + + <_> + 3 18 21 3 -1. + <_> + 3 19 21 1 3. + <_> + + <_> + 0 3 7 9 -1. + <_> + 0 6 7 3 3. + <_> + + <_> + 2 7 22 3 -1. + <_> + 2 8 22 1 3. + <_> + + <_> + 0 3 24 16 -1. + <_> + 0 3 12 8 2. + <_> + 12 11 12 8 2. + <_> + + <_> + 13 17 9 4 -1. + <_> + 13 19 9 2 2. + <_> + + <_> + 5 5 12 8 -1. + <_> + 5 5 6 4 2. + <_> + 11 9 6 4 2. + <_> + + <_> + 5 6 14 6 -1. + <_> + 12 6 7 3 2. + <_> + 5 9 7 3 2. + <_> + + <_> + 5 16 14 6 -1. + <_> + 5 16 7 3 2. + <_> + 12 19 7 3 2. + <_> + + <_> + 18 2 6 9 -1. + <_> + 18 5 6 3 3. + <_> + + <_> + 0 2 6 9 -1. + <_> + 0 5 6 3 3. + <_> + + <_> + 3 4 20 10 -1. + <_> + 13 4 10 5 2. + <_> + 3 9 10 5 2. + <_> + + <_> + 2 13 9 8 -1. + <_> + 5 13 3 8 3. + <_> + + <_> + 2 1 21 15 -1. + <_> + 9 1 7 15 3. + <_> + + <_> + 5 12 14 8 -1. + <_> + 12 12 7 8 2. + <_> + + <_> + 6 7 12 4 -1. + <_> + 6 7 6 4 2. + <_> + + <_> + 6 5 9 6 -1. + <_> + 9 5 3 6 3. + <_> + + <_> + 13 11 6 6 -1. + <_> + 13 11 3 6 2. + <_> + + <_> + 5 11 6 6 -1. + <_> + 8 11 3 6 2. + <_> + + <_> + 6 4 18 2 -1. + <_> + 6 5 18 1 2. + <_> + + <_> + 0 2 6 11 -1. + <_> + 2 2 2 11 3. + <_> + + <_> + 18 0 6 15 -1. + <_> + 20 0 2 15 3. + <_> + + <_> + 0 0 6 13 -1. + <_> + 2 0 2 13 3. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 0 2 24 4 -1. + <_> + 8 2 8 4 3. + <_> + + <_> + 3 13 18 4 -1. + <_> + 12 13 9 4 2. + <_> + + <_> + 9 7 10 4 -1. + <_> + 9 7 5 4 2. + <_> + + <_> + 5 8 12 3 -1. + <_> + 11 8 6 3 2. + <_> + + <_> + 4 14 19 3 -1. + <_> + 4 15 19 1 3. + <_> + + <_> + 10 0 4 20 -1. + <_> + 10 10 4 10 2. + <_> + + <_> + 8 15 9 6 -1. + <_> + 8 17 9 2 3. + <_> + + <_> + 2 9 15 4 -1. + <_> + 7 9 5 4 3. + <_> + + <_> + 8 4 12 7 -1. + <_> + 12 4 4 7 3. + <_> + + <_> + 0 10 6 9 -1. + <_> + 0 13 6 3 3. + <_> + + <_> + 18 5 6 9 -1. + <_> + 18 8 6 3 3. + <_> + + <_> + 0 18 16 6 -1. + <_> + 0 18 8 3 2. + <_> + 8 21 8 3 2. + <_> + + <_> + 9 18 14 6 -1. + <_> + 16 18 7 3 2. + <_> + 9 21 7 3 2. + <_> + + <_> + 1 20 20 4 -1. + <_> + 1 20 10 2 2. + <_> + 11 22 10 2 2. + <_> + + <_> + 2 8 20 6 -1. + <_> + 12 8 10 3 2. + <_> + 2 11 10 3 2. + <_> + + <_> + 7 8 6 9 -1. + <_> + 9 8 2 9 3. + <_> + + <_> + 8 5 12 8 -1. + <_> + 12 5 4 8 3. + <_> + + <_> + 4 5 12 8 -1. + <_> + 8 5 4 8 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 2 0 6 16 -1. + <_> + 4 0 2 16 3. + <_> + + <_> + 15 4 6 12 -1. + <_> + 15 8 6 4 3. + <_> + + <_> + 3 4 6 12 -1. + <_> + 3 8 6 4 3. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 4 0 15 22 -1. + <_> + 4 11 15 11 2. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 0 12 9 6 -1. + <_> + 0 14 9 2 3. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 0 15 9 6 -1. + <_> + 0 17 9 2 3. + <_> + + <_> + 10 0 8 10 -1. + <_> + 14 0 4 5 2. + <_> + 10 5 4 5 2. + <_> + + <_> + 1 0 4 16 -1. + <_> + 3 0 2 16 2. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 10 12 4 10 -1. + <_> + 10 17 4 5 2. + <_> + + <_> + 8 4 10 6 -1. + <_> + 8 6 10 2 3. + <_> + + <_> + 3 22 18 2 -1. + <_> + 12 22 9 2 2. + <_> + + <_> + 7 7 11 6 -1. + <_> + 7 9 11 2 3. + <_> + + <_> + 0 0 12 10 -1. + <_> + 0 0 6 5 2. + <_> + 6 5 6 5 2. + <_> + + <_> + 10 1 12 6 -1. + <_> + 16 1 6 3 2. + <_> + 10 4 6 3 2. + <_> + + <_> + 7 16 9 4 -1. + <_> + 7 18 9 2 2. + <_> + + <_> + 5 7 15 16 -1. + <_> + 10 7 5 16 3. + <_> + + <_> + 5 10 12 13 -1. + <_> + 11 10 6 13 2. + <_> + + <_> + 6 2 12 6 -1. + <_> + 12 2 6 3 2. + <_> + 6 5 6 3 2. + <_> + + <_> + 3 9 12 9 -1. + <_> + 3 12 12 3 3. + <_> + + <_> + 16 2 8 6 -1. + <_> + 16 5 8 3 2. + <_> + + <_> + 0 2 8 6 -1. + <_> + 0 5 8 3 2. + <_> + + <_> + 0 3 24 11 -1. + <_> + 0 3 12 11 2. + <_> + + <_> + 0 13 8 10 -1. + <_> + 0 13 4 5 2. + <_> + 4 18 4 5 2. + <_> + + <_> + 10 14 4 10 -1. + <_> + 10 19 4 5 2. + <_> + + <_> + 10 2 4 21 -1. + <_> + 10 9 4 7 3. + <_> + + <_> + 4 4 15 9 -1. + <_> + 4 7 15 3 3. + <_> + + <_> + 0 1 24 6 -1. + <_> + 8 1 8 6 3. + <_> + + <_> + 9 6 5 16 -1. + <_> + 9 14 5 8 2. + <_> + + <_> + 3 21 18 3 -1. + <_> + 9 21 6 3 3. + <_> + + <_> + 6 5 3 12 -1. + <_> + 6 11 3 6 2. + <_> + + <_> + 11 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 5 6 9 8 -1. + <_> + 8 6 3 8 3. + <_> + + <_> + 4 3 20 2 -1. + <_> + 4 4 20 1 2. + <_> + + <_> + 2 10 18 3 -1. + <_> + 8 10 6 3 3. + <_> + + <_> + 7 15 10 6 -1. + <_> + 7 17 10 2 3. + <_> + + <_> + 1 4 4 18 -1. + <_> + 1 4 2 9 2. + <_> + 3 13 2 9 2. + <_> + + <_> + 13 0 6 9 -1. + <_> + 15 0 2 9 3. + <_> + + <_> + 5 0 6 9 -1. + <_> + 7 0 2 9 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 6 7 9 6 -1. + <_> + 9 7 3 6 3. + <_> + + <_> + 3 0 18 2 -1. + <_> + 3 1 18 1 2. + <_> + + <_> + 0 10 20 4 -1. + <_> + 0 10 10 2 2. + <_> + 10 12 10 2 2. + <_> + + <_> + 10 2 4 12 -1. + <_> + 10 8 4 6 2. + <_> + + <_> + 6 5 6 12 -1. + <_> + 6 5 3 6 2. + <_> + 9 11 3 6 2. + <_> + + <_> + 6 0 18 22 -1. + <_> + 15 0 9 11 2. + <_> + 6 11 9 11 2. + <_> + + <_> + 0 0 18 22 -1. + <_> + 0 0 9 11 2. + <_> + 9 11 9 11 2. + <_> + + <_> + 18 2 6 11 -1. + <_> + 20 2 2 11 3. + <_> + + <_> + 0 2 6 11 -1. + <_> + 2 2 2 11 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 0 0 20 3 -1. + <_> + 0 1 20 1 3. + <_> + + <_> + 2 2 20 2 -1. + <_> + 2 3 20 1 2. + <_> + + <_> + 1 10 18 2 -1. + <_> + 1 11 18 1 2. + <_> + + <_> + 18 7 6 9 -1. + <_> + 18 10 6 3 3. + <_> + + <_> + 0 0 22 9 -1. + <_> + 0 3 22 3 3. + <_> + + <_> + 17 3 6 9 -1. + <_> + 17 6 6 3 3. + <_> + + <_> + 0 7 6 9 -1. + <_> + 0 10 6 3 3. + <_> + + <_> + 0 6 24 6 -1. + <_> + 0 8 24 2 3. + <_> + + <_> + 0 2 6 10 -1. + <_> + 2 2 2 10 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 15 0 6 9 -1. + <_> + 17 0 2 9 3. + <_> + + <_> + 3 0 6 9 -1. + <_> + 5 0 2 9 3. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 15 14 9 6 -1. + <_> + 15 16 9 2 3. + <_> + + <_> + 0 15 23 6 -1. + <_> + 0 17 23 2 3. + <_> + + <_> + 5 15 18 3 -1. + <_> + 5 16 18 1 3. + <_> + + <_> + 0 14 9 6 -1. + <_> + 0 16 9 2 3. + <_> + + <_> + 9 8 8 10 -1. + <_> + 13 8 4 5 2. + <_> + 9 13 4 5 2. + <_> + + <_> + 3 7 15 6 -1. + <_> + 8 7 5 6 3. + <_> + + <_> + 9 8 8 10 -1. + <_> + 13 8 4 5 2. + <_> + 9 13 4 5 2. + <_> + + <_> + 5 0 6 12 -1. + <_> + 8 0 3 12 2. + <_> + + <_> + 9 8 8 10 -1. + <_> + 13 8 4 5 2. + <_> + 9 13 4 5 2. + <_> + + <_> + 8 5 6 9 -1. + <_> + 10 5 2 9 3. + <_> + + <_> + 10 6 4 18 -1. + <_> + 12 6 2 9 2. + <_> + 10 15 2 9 2. + <_> + + <_> + 5 7 12 4 -1. + <_> + 11 7 6 4 2. + <_> + + <_> + 9 8 8 10 -1. + <_> + 13 8 4 5 2. + <_> + 9 13 4 5 2. + <_> + + <_> + 7 8 8 10 -1. + <_> + 7 8 4 5 2. + <_> + 11 13 4 5 2. + <_> + + <_> + 11 10 6 14 -1. + <_> + 14 10 3 7 2. + <_> + 11 17 3 7 2. + <_> + + <_> + 9 5 6 19 -1. + <_> + 12 5 3 19 2. + <_> + + <_> + 6 12 12 6 -1. + <_> + 12 12 6 3 2. + <_> + 6 15 6 3 2. + <_> + + <_> + 1 9 18 6 -1. + <_> + 1 9 9 3 2. + <_> + 10 12 9 3 2. + <_> + + <_> + 16 14 8 10 -1. + <_> + 20 14 4 5 2. + <_> + 16 19 4 5 2. + <_> + + <_> + 0 9 22 8 -1. + <_> + 0 9 11 4 2. + <_> + 11 13 11 4 2. + <_> + + <_> + 8 18 12 6 -1. + <_> + 14 18 6 3 2. + <_> + 8 21 6 3 2. + <_> + + <_> + 0 6 20 18 -1. + <_> + 0 6 10 9 2. + <_> + 10 15 10 9 2. + <_> + + <_> + 3 6 20 12 -1. + <_> + 13 6 10 6 2. + <_> + 3 12 10 6 2. + <_> + + <_> + 0 16 10 8 -1. + <_> + 0 16 5 4 2. + <_> + 5 20 5 4 2. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 0 11 19 3 -1. + <_> + 0 12 19 1 3. + <_> + + <_> + 14 6 6 9 -1. + <_> + 14 9 6 3 3. + <_> + + <_> + 1 7 22 4 -1. + <_> + 1 7 11 2 2. + <_> + 12 9 11 2 2. + <_> + + <_> + 13 6 7 12 -1. + <_> + 13 10 7 4 3. + <_> + + <_> + 4 7 11 9 -1. + <_> + 4 10 11 3 3. + <_> + + <_> + 12 10 10 8 -1. + <_> + 17 10 5 4 2. + <_> + 12 14 5 4 2. + <_> + + <_> + 2 12 9 7 -1. + <_> + 5 12 3 7 3. + <_> + + <_> + 16 14 6 9 -1. + <_> + 16 17 6 3 3. + <_> + + <_> + 3 12 6 12 -1. + <_> + 3 16 6 4 3. + <_> + + <_> + 14 13 6 6 -1. + <_> + 14 16 6 3 2. + <_> + + <_> + 8 0 6 9 -1. + <_> + 10 0 2 9 3. + <_> + + <_> + 9 1 6 23 -1. + <_> + 11 1 2 23 3. + <_> + + <_> + 0 16 9 6 -1. + <_> + 0 18 9 2 3. + <_> + + <_> + 4 17 18 3 -1. + <_> + 4 18 18 1 3. + <_> + + <_> + 5 2 13 14 -1. + <_> + 5 9 13 7 2. + <_> + + <_> + 15 0 8 12 -1. + <_> + 19 0 4 6 2. + <_> + 15 6 4 6 2. + <_> + + <_> + 0 0 8 12 -1. + <_> + 0 0 4 6 2. + <_> + 4 6 4 6 2. + <_> + + <_> + 8 2 8 7 -1. + <_> + 8 2 4 7 2. + <_> + + <_> + 1 1 6 9 -1. + <_> + 3 1 2 9 3. + <_> + + <_> + 14 8 6 12 -1. + <_> + 17 8 3 6 2. + <_> + 14 14 3 6 2. + <_> + + <_> + 4 8 6 12 -1. + <_> + 4 8 3 6 2. + <_> + 7 14 3 6 2. + <_> + + <_> + 16 5 5 15 -1. + <_> + 16 10 5 5 3. + <_> + + <_> + 3 5 5 15 -1. + <_> + 3 10 5 5 3. + <_> + + <_> + 18 4 6 9 -1. + <_> + 18 7 6 3 3. + <_> + + <_> + 1 7 6 15 -1. + <_> + 1 12 6 5 3. + <_> + + <_> + 11 15 12 8 -1. + <_> + 17 15 6 4 2. + <_> + 11 19 6 4 2. + <_> + + <_> + 0 2 24 4 -1. + <_> + 0 2 12 2 2. + <_> + 12 4 12 2 2. + <_> + + <_> + 15 1 2 19 -1. + <_> + 15 1 1 19 2. + <_> + + <_> + 7 1 2 19 -1. + <_> + 8 1 1 19 2. + <_> + + <_> + 22 1 2 20 -1. + <_> + 22 1 1 20 2. + <_> + + <_> + 0 1 2 20 -1. + <_> + 1 1 1 20 2. + <_> + + <_> + 18 11 6 12 -1. + <_> + 20 11 2 12 3. + <_> + + <_> + 0 11 6 12 -1. + <_> + 2 11 2 12 3. + <_> + + <_> + 3 6 18 14 -1. + <_> + 3 13 18 7 2. + <_> + + <_> + 6 10 7 8 -1. + <_> + 6 14 7 4 2. + <_> + + <_> + 7 9 12 12 -1. + <_> + 7 13 12 4 3. + <_> + + <_> + 2 18 18 5 -1. + <_> + 11 18 9 5 2. + <_> + + <_> + 4 21 20 3 -1. + <_> + 4 22 20 1 3. + <_> + + <_> + 9 12 6 12 -1. + <_> + 9 12 3 6 2. + <_> + 12 18 3 6 2. + <_> + + <_> + 4 6 18 3 -1. + <_> + 4 7 18 1 3. + <_> + + <_> + 3 6 18 3 -1. + <_> + 3 7 18 1 3. + <_> + + <_> + 18 4 6 9 -1. + <_> + 18 7 6 3 3. + <_> + + <_> + 2 12 9 6 -1. + <_> + 2 14 9 2 3. + <_> + + <_> + 4 14 18 4 -1. + <_> + 13 14 9 2 2. + <_> + 4 16 9 2 2. + <_> + + <_> + 7 7 6 14 -1. + <_> + 7 7 3 7 2. + <_> + 10 14 3 7 2. + <_> + + <_> + 7 13 12 6 -1. + <_> + 13 13 6 3 2. + <_> + 7 16 6 3 2. + <_> + + <_> + 6 7 12 9 -1. + <_> + 10 7 4 9 3. + <_> + + <_> + 12 12 6 6 -1. + <_> + 12 12 3 6 2. + <_> + + <_> + 0 2 4 10 -1. + <_> + 0 7 4 5 2. + <_> + + <_> + 8 0 9 6 -1. + <_> + 11 0 3 6 3. + <_> + + <_> + 2 9 12 6 -1. + <_> + 2 12 12 3 2. + <_> + + <_> + 13 10 6 9 -1. + <_> + 13 13 6 3 3. + <_> + + <_> + 5 10 6 9 -1. + <_> + 5 13 6 3 3. + <_> + + <_> + 9 15 9 6 -1. + <_> + 9 17 9 2 3. + <_> + + <_> + 5 16 12 6 -1. + <_> + 5 19 12 3 2. + <_> + + <_> + 3 2 20 3 -1. + <_> + 3 3 20 1 3. + <_> + + <_> + 2 5 12 6 -1. + <_> + 6 5 4 6 3. + <_> + + <_> + 11 0 3 24 -1. + <_> + 12 0 1 24 3. + <_> + + <_> + 3 16 15 4 -1. + <_> + 8 16 5 4 3. + <_> + + <_> + 9 12 6 12 -1. + <_> + 9 18 6 6 2. + <_> + + <_> + 1 15 12 8 -1. + <_> + 1 15 6 4 2. + <_> + 7 19 6 4 2. + <_> + + <_> + 15 10 8 14 -1. + <_> + 19 10 4 7 2. + <_> + 15 17 4 7 2. + <_> + + <_> + 1 9 8 14 -1. + <_> + 1 9 4 7 2. + <_> + 5 16 4 7 2. + <_> + + <_> + 9 11 9 10 -1. + <_> + 9 16 9 5 2. + <_> + + <_> + 6 7 12 6 -1. + <_> + 6 9 12 2 3. + <_> + + <_> + 10 15 6 9 -1. + <_> + 12 15 2 9 3. + <_> + + <_> + 7 8 9 7 -1. + <_> + 10 8 3 7 3. + <_> + + <_> + 10 4 8 10 -1. + <_> + 14 4 4 5 2. + <_> + 10 9 4 5 2. + <_> + + <_> + 4 6 6 9 -1. + <_> + 4 9 6 3 3. + <_> + + <_> + 0 6 24 12 -1. + <_> + 8 6 8 12 3. + <_> + + <_> + 3 7 6 14 -1. + <_> + 6 7 3 14 2. + <_> + + <_> + 19 8 5 8 -1. + <_> + 19 12 5 4 2. + <_> + + <_> + 0 8 5 8 -1. + <_> + 0 12 5 4 2. + <_> + + <_> + 17 3 6 6 -1. + <_> + 17 6 6 3 2. + <_> + + <_> + 1 3 6 6 -1. + <_> + 1 6 6 3 2. + <_> + + <_> + 18 2 6 9 -1. + <_> + 18 5 6 3 3. + <_> + + <_> + 0 2 6 9 -1. + <_> + 0 5 6 3 3. + <_> + + <_> + 3 3 18 6 -1. + <_> + 3 5 18 2 3. + <_> + + <_> + 2 3 9 6 -1. + <_> + 2 5 9 2 3. + <_> + + <_> + 9 3 10 8 -1. + <_> + 14 3 5 4 2. + <_> + 9 7 5 4 2. + <_> + + <_> + 5 3 10 8 -1. + <_> + 5 3 5 4 2. + <_> + 10 7 5 4 2. + <_> + + <_> + 10 11 6 12 -1. + <_> + 10 11 3 12 2. + <_> + + <_> + 8 11 6 11 -1. + <_> + 11 11 3 11 2. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 8 5 4 2. + <_> + + <_> + 9 6 6 7 -1. + <_> + 12 6 3 7 2. + <_> + + <_> + 5 18 18 3 -1. + <_> + 5 19 18 1 3. + <_> + + <_> + 8 4 6 9 -1. + <_> + 10 4 2 9 3. + <_> + + <_> + 8 1 9 7 -1. + <_> + 11 1 3 7 3. + <_> + + <_> + 6 11 6 6 -1. + <_> + 9 11 3 6 2. + <_> + + <_> + 14 12 4 11 -1. + <_> + 14 12 2 11 2. + <_> + + <_> + 6 12 4 11 -1. + <_> + 8 12 2 11 2. + <_> + + <_> + 8 0 12 18 -1. + <_> + 12 0 4 18 3. + <_> + + <_> + 2 12 10 5 -1. + <_> + 7 12 5 5 2. + <_> + + <_> + 2 20 22 3 -1. + <_> + 2 21 22 1 3. + <_> + + <_> + 0 4 2 20 -1. + <_> + 1 4 1 20 2. + <_> + + <_> + 0 2 24 4 -1. + <_> + 8 2 8 4 3. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 10 10 2 2. + <_> + + <_> + 6 7 8 10 -1. + <_> + 6 7 4 5 2. + <_> + 10 12 4 5 2. + <_> + + <_> + 14 0 6 14 -1. + <_> + 17 0 3 7 2. + <_> + 14 7 3 7 2. + <_> + + <_> + 4 11 5 8 -1. + <_> + 4 15 5 4 2. + <_> + + <_> + 2 0 20 9 -1. + <_> + 2 3 20 3 3. + <_> + + <_> + 6 7 12 8 -1. + <_> + 6 7 6 4 2. + <_> + 12 11 6 4 2. + <_> + + <_> + 9 17 6 6 -1. + <_> + 9 20 6 3 2. + <_> + + <_> + 7 10 10 4 -1. + <_> + 7 12 10 2 2. + <_> + + <_> + 6 5 12 9 -1. + <_> + 10 5 4 9 3. + <_> + + <_> + 5 11 6 8 -1. + <_> + 8 11 3 8 2. + <_> + + <_> + 18 4 4 17 -1. + <_> + 18 4 2 17 2. + <_> + + <_> + 0 0 6 6 -1. + <_> + 3 0 3 6 2. + <_> + + <_> + 18 4 4 17 -1. + <_> + 18 4 2 17 2. + <_> + + <_> + 2 4 4 17 -1. + <_> + 4 4 2 17 2. + <_> + + <_> + 5 18 19 3 -1. + <_> + 5 19 19 1 3. + <_> + + <_> + 11 0 2 18 -1. + <_> + 11 9 2 9 2. + <_> + + <_> + 15 4 2 18 -1. + <_> + 15 13 2 9 2. + <_> + + <_> + 7 4 2 18 -1. + <_> + 7 13 2 9 2. + <_> + + <_> + 7 11 10 8 -1. + <_> + 12 11 5 4 2. + <_> + 7 15 5 4 2. + <_> + + <_> + 10 6 4 9 -1. + <_> + 12 6 2 9 2. + <_> + + <_> + 10 0 6 9 -1. + <_> + 12 0 2 9 3. + <_> + + <_> + 2 9 16 8 -1. + <_> + 2 9 8 4 2. + <_> + 10 13 8 4 2. + <_> + + <_> + 14 15 6 9 -1. + <_> + 14 18 6 3 3. + <_> + + <_> + 8 7 6 9 -1. + <_> + 10 7 2 9 3. + <_> + + <_> + 14 15 6 9 -1. + <_> + 14 18 6 3 3. + <_> + + <_> + 3 12 12 6 -1. + <_> + 3 14 12 2 3. + <_> + + <_> + 14 12 9 6 -1. + <_> + 14 14 9 2 3. + <_> + + <_> + 1 12 9 6 -1. + <_> + 1 14 9 2 3. + <_> + + <_> + 3 7 18 3 -1. + <_> + 3 8 18 1 3. + <_> + + <_> + 1 7 22 6 -1. + <_> + 1 9 22 2 3. + <_> + + <_> + 18 4 6 6 -1. + <_> + 18 7 6 3 2. + <_> + + <_> + 0 4 6 6 -1. + <_> + 0 7 6 3 2. + <_> + + <_> + 5 11 16 6 -1. + <_> + 5 14 16 3 2. + <_> + + <_> + 6 16 9 4 -1. + <_> + 6 18 9 2 2. + <_> + + <_> + 14 15 6 9 -1. + <_> + 14 18 6 3 3. + <_> + + <_> + 4 15 6 9 -1. + <_> + 4 18 6 3 3. + <_> + + <_> + 15 1 6 23 -1. + <_> + 17 1 2 23 3. + <_> + + <_> + 0 21 24 3 -1. + <_> + 8 21 8 3 3. + <_> + + <_> + 0 20 24 4 -1. + <_> + 8 20 8 4 3. + <_> + + <_> + 3 1 6 23 -1. + <_> + 5 1 2 23 3. + <_> + + <_> + 3 17 18 3 -1. + <_> + 3 18 18 1 3. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 1 16 22 4 -1. + <_> + 12 16 11 2 2. + <_> + 1 18 11 2 2. + <_> + + <_> + 0 16 9 6 -1. + <_> + 0 18 9 2 3. + <_> + + <_> + 2 10 21 3 -1. + <_> + 9 10 7 3 3. + <_> + + <_> + 2 18 12 6 -1. + <_> + 2 18 6 3 2. + <_> + 8 21 6 3 2. + <_> + + <_> + 0 5 24 4 -1. + <_> + 0 7 24 2 2. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 10 7 6 12 -1. + <_> + 10 13 6 6 2. + <_> + + <_> + 6 6 6 9 -1. + <_> + 8 6 2 9 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 9 7 6 9 -1. + <_> + 11 7 2 9 3. + <_> + + <_> + 2 1 20 3 -1. + <_> + 2 2 20 1 3. + <_> + + <_> + 1 18 12 6 -1. + <_> + 1 18 6 3 2. + <_> + 7 21 6 3 2. + <_> + + <_> + 13 2 4 13 -1. + <_> + 13 2 2 13 2. + <_> + + <_> + 6 7 12 4 -1. + <_> + 12 7 6 4 2. + <_> + + <_> + 10 1 4 13 -1. + <_> + 10 1 2 13 2. + <_> + + <_> + 6 0 3 18 -1. + <_> + 7 0 1 18 3. + <_> + + <_> + 14 3 10 5 -1. + <_> + 14 3 5 5 2. + <_> + + <_> + 6 15 12 8 -1. + <_> + 10 15 4 8 3. + <_> + + <_> + 9 10 6 9 -1. + <_> + 11 10 2 9 3. + <_> + + <_> + 8 3 4 9 -1. + <_> + 10 3 2 9 2. + <_> + + <_> + 17 0 6 14 -1. + <_> + 20 0 3 7 2. + <_> + 17 7 3 7 2. + <_> + + <_> + 1 0 6 14 -1. + <_> + 1 0 3 7 2. + <_> + 4 7 3 7 2. + <_> + + <_> + 14 0 6 16 -1. + <_> + 17 0 3 8 2. + <_> + 14 8 3 8 2. + <_> + + <_> + 7 4 4 10 -1. + <_> + 9 4 2 10 2. + <_> + + <_> + 3 17 18 6 -1. + <_> + 12 17 9 3 2. + <_> + 3 20 9 3 2. + <_> + + <_> + 1 20 22 4 -1. + <_> + 12 20 11 4 2. + <_> + + <_> + 14 3 10 5 -1. + <_> + 14 3 5 5 2. + <_> + + <_> + 0 3 10 5 -1. + <_> + 5 3 5 5 2. + <_> + + <_> + 12 6 12 16 -1. + <_> + 16 6 4 16 3. + <_> + + <_> + 0 6 12 16 -1. + <_> + 4 6 4 16 3. + <_> + + <_> + 10 9 5 15 -1. + <_> + 10 14 5 5 3. + <_> + + <_> + 1 18 21 2 -1. + <_> + 1 19 21 1 2. + <_> + + <_> + 15 0 9 6 -1. + <_> + 15 2 9 2 3. + <_> + + <_> + 6 1 12 4 -1. + <_> + 12 1 6 4 2. + <_> + + <_> + 6 0 12 12 -1. + <_> + 12 0 6 6 2. + <_> + 6 6 6 6 2. + <_> + + <_> + 8 10 8 12 -1. + <_> + 8 10 4 6 2. + <_> + 12 16 4 6 2. + <_> + + <_> + 14 16 10 8 -1. + <_> + 19 16 5 4 2. + <_> + 14 20 5 4 2. + <_> + + <_> + 0 16 10 8 -1. + <_> + 0 16 5 4 2. + <_> + 5 20 5 4 2. + <_> + + <_> + 10 12 12 5 -1. + <_> + 14 12 4 5 3. + <_> + + <_> + 6 16 10 8 -1. + <_> + 6 16 5 4 2. + <_> + 11 20 5 4 2. + <_> + + <_> + 7 6 12 6 -1. + <_> + 13 6 6 3 2. + <_> + 7 9 6 3 2. + <_> + + <_> + 9 6 4 18 -1. + <_> + 9 6 2 9 2. + <_> + 11 15 2 9 2. + <_> + + <_> + 10 9 6 14 -1. + <_> + 13 9 3 7 2. + <_> + 10 16 3 7 2. + <_> + + <_> + 8 9 6 14 -1. + <_> + 8 9 3 7 2. + <_> + 11 16 3 7 2. + <_> + + <_> + 7 4 11 12 -1. + <_> + 7 10 11 6 2. + <_> + + <_> + 4 8 6 16 -1. + <_> + 4 8 3 8 2. + <_> + 7 16 3 8 2. + <_> + + <_> + 17 3 4 21 -1. + <_> + 17 10 4 7 3. + <_> + + <_> + 3 3 4 21 -1. + <_> + 3 10 4 7 3. + <_> + + <_> + 10 1 8 18 -1. + <_> + 14 1 4 9 2. + <_> + 10 10 4 9 2. + <_> + + <_> + 2 5 16 8 -1. + <_> + 2 5 8 4 2. + <_> + 10 9 8 4 2. + <_> + + <_> + 3 6 18 12 -1. + <_> + 3 10 18 4 3. + <_> + + <_> + 4 10 16 12 -1. + <_> + 4 14 16 4 3. + <_> + + <_> + 15 4 8 20 -1. + <_> + 19 4 4 10 2. + <_> + 15 14 4 10 2. + <_> + + <_> + 7 2 9 6 -1. + <_> + 10 2 3 6 3. + <_> + + <_> + 15 4 8 20 -1. + <_> + 19 4 4 10 2. + <_> + 15 14 4 10 2. + <_> + + <_> + 1 4 8 20 -1. + <_> + 1 4 4 10 2. + <_> + 5 14 4 10 2. + <_> + + <_> + 11 8 8 14 -1. + <_> + 15 8 4 7 2. + <_> + 11 15 4 7 2. + <_> + + <_> + 5 8 8 14 -1. + <_> + 5 8 4 7 2. + <_> + 9 15 4 7 2. + <_> + + <_> + 10 13 5 8 -1. + <_> + 10 17 5 4 2. + <_> + + <_> + 4 13 7 9 -1. + <_> + 4 16 7 3 3. + <_> + + <_> + 0 13 24 10 -1. + <_> + 0 18 24 5 2. + <_> + + <_> + 4 2 8 11 -1. + <_> + 8 2 4 11 2. + <_> + + <_> + 10 2 8 16 -1. + <_> + 14 2 4 8 2. + <_> + 10 10 4 8 2. + <_> + + <_> + 0 2 24 6 -1. + <_> + 0 2 12 3 2. + <_> + 12 5 12 3 2. + <_> + + <_> + 6 0 12 9 -1. + <_> + 6 3 12 3 3. + <_> + + <_> + 1 2 12 12 -1. + <_> + 1 2 6 6 2. + <_> + 7 8 6 6 2. + <_> + + <_> + 18 5 6 9 -1. + <_> + 18 8 6 3 3. + <_> + + <_> + 4 3 8 10 -1. + <_> + 4 3 4 5 2. + <_> + 8 8 4 5 2. + <_> + + <_> + 6 21 18 3 -1. + <_> + 6 22 18 1 3. + <_> + + <_> + 1 10 18 2 -1. + <_> + 1 11 18 1 2. + <_> + + <_> + 1 10 22 3 -1. + <_> + 1 11 22 1 3. + <_> + + <_> + 2 8 12 9 -1. + <_> + 2 11 12 3 3. + <_> + + <_> + 12 8 12 6 -1. + <_> + 18 8 6 3 2. + <_> + 12 11 6 3 2. + <_> + + <_> + 0 8 12 6 -1. + <_> + 0 8 6 3 2. + <_> + 6 11 6 3 2. + <_> + + <_> + 10 15 6 9 -1. + <_> + 12 15 2 9 3. + <_> + + <_> + 7 13 9 6 -1. + <_> + 7 15 9 2 3. + <_> + + <_> + 9 8 7 12 -1. + <_> + 9 14 7 6 2. + <_> + + <_> + 4 13 9 6 -1. + <_> + 7 13 3 6 3. + <_> + + <_> + 6 15 18 4 -1. + <_> + 12 15 6 4 3. + <_> + + <_> + 5 4 4 16 -1. + <_> + 7 4 2 16 2. + <_> + + <_> + 10 15 6 9 -1. + <_> + 12 15 2 9 3. + <_> + + <_> + 8 15 6 9 -1. + <_> + 10 15 2 9 3. + <_> + + <_> + 9 11 12 10 -1. + <_> + 15 11 6 5 2. + <_> + 9 16 6 5 2. + <_> + + <_> + 3 6 14 6 -1. + <_> + 3 8 14 2 3. + <_> + + <_> + 4 2 17 8 -1. + <_> + 4 6 17 4 2. + <_> + + <_> + 6 2 12 21 -1. + <_> + 6 9 12 7 3. + <_> + + <_> + 8 1 9 9 -1. + <_> + 8 4 9 3 3. + <_> + + <_> + 0 7 24 3 -1. + <_> + 12 7 12 3 2. + <_> + + <_> + 11 6 9 10 -1. + <_> + 11 11 9 5 2. + <_> + + <_> + 2 11 18 3 -1. + <_> + 2 12 18 1 3. + <_> + + <_> + 8 16 9 4 -1. + <_> + 8 18 9 2 2. + <_> + + <_> + 0 0 9 6 -1. + <_> + 0 2 9 2 3. + <_> + + <_> + 0 11 24 6 -1. + <_> + 0 13 24 2 3. + <_> + + <_> + 2 9 20 6 -1. + <_> + 2 12 20 3 2. + <_> + + <_> + 4 5 16 12 -1. + <_> + 12 5 8 6 2. + <_> + 4 11 8 6 2. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 7 3 10 4 -1. + <_> + 7 5 10 2 2. + <_> + + <_> + 9 15 6 8 -1. + <_> + 9 19 6 4 2. + <_> + + <_> + 17 0 7 10 -1. + <_> + 17 5 7 5 2. + <_> + + <_> + 0 0 7 10 -1. + <_> + 0 5 7 5 2. + <_> + + <_> + 16 1 6 12 -1. + <_> + 19 1 3 6 2. + <_> + 16 7 3 6 2. + <_> + + <_> + 1 0 19 8 -1. + <_> + 1 4 19 4 2. + <_> + + <_> + 12 2 9 4 -1. + <_> + 12 4 9 2 2. + <_> + + <_> + 3 2 9 4 -1. + <_> + 3 4 9 2 2. + <_> + + <_> + 12 2 10 6 -1. + <_> + 12 4 10 2 3. + <_> + + <_> + 3 4 18 2 -1. + <_> + 12 4 9 2 2. + <_> + + <_> + 12 1 4 9 -1. + <_> + 12 1 2 9 2. + <_> + + <_> + 8 1 4 9 -1. + <_> + 10 1 2 9 2. + <_> + + <_> + 10 5 8 10 -1. + <_> + 14 5 4 5 2. + <_> + 10 10 4 5 2. + <_> + + <_> + 6 4 12 13 -1. + <_> + 10 4 4 13 3. + <_> + + <_> + 13 5 6 6 -1. + <_> + 13 5 3 6 2. + <_> + + <_> + 1 5 12 3 -1. + <_> + 7 5 6 3 2. + <_> + + <_> + 7 5 10 6 -1. + <_> + 7 7 10 2 3. + <_> + + <_> + 2 0 21 5 -1. + <_> + 9 0 7 5 3. + <_> + + <_> + 0 8 9 9 -1. + <_> + 0 11 9 3 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 0 3 6 7 -1. + <_> + 3 3 3 7 2. + <_> + + <_> + 9 18 12 6 -1. + <_> + 15 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 2 8 20 6 -1. + <_> + 2 8 10 3 2. + <_> + 12 11 10 3 2. + <_> + + <_> + 13 2 10 4 -1. + <_> + 13 4 10 2 2. + <_> + + <_> + 4 5 5 18 -1. + <_> + 4 11 5 6 3. + <_> + + <_> + 20 4 4 9 -1. + <_> + 20 4 2 9 2. + <_> + + <_> + 8 6 8 14 -1. + <_> + 8 13 8 7 2. + <_> + + <_> + 0 1 24 6 -1. + <_> + 12 1 12 3 2. + <_> + 0 4 12 3 2. + <_> + + <_> + 0 4 4 9 -1. + <_> + 2 4 2 9 2. + <_> + + <_> + 3 6 18 3 -1. + <_> + 3 7 18 1 3. + <_> + + <_> + 3 17 16 6 -1. + <_> + 3 19 16 2 3. + <_> + + <_> + 13 6 6 9 -1. + <_> + 13 9 6 3 3. + <_> + + <_> + 5 6 14 6 -1. + <_> + 5 6 7 3 2. + <_> + 12 9 7 3 2. + <_> + + <_> + 13 5 8 10 -1. + <_> + 17 5 4 5 2. + <_> + 13 10 4 5 2. + <_> + + <_> + 2 2 20 3 -1. + <_> + 2 3 20 1 3. + <_> + + <_> + 9 2 9 6 -1. + <_> + 12 2 3 6 3. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 12 3 4 11 -1. + <_> + 12 3 2 11 2. + <_> + + <_> + 8 3 4 11 -1. + <_> + 10 3 2 11 2. + <_> + + <_> + 8 3 8 10 -1. + <_> + 12 3 4 5 2. + <_> + 8 8 4 5 2. + <_> + + <_> + 11 1 2 18 -1. + <_> + 12 1 1 18 2. + <_> + + <_> + 9 2 9 6 -1. + <_> + 12 2 3 6 3. + <_> + + <_> + 0 2 19 3 -1. + <_> + 0 3 19 1 3. + <_> + + <_> + 9 14 9 6 -1. + <_> + 9 16 9 2 3. + <_> + + <_> + 1 8 18 5 -1. + <_> + 7 8 6 5 3. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 13 6 4 15 -1. + <_> + 13 11 4 5 3. + <_> + + <_> + 1 5 18 3 -1. + <_> + 1 6 18 1 3. + <_> + + <_> + 9 7 14 6 -1. + <_> + 9 9 14 2 3. + <_> + + <_> + 2 16 18 3 -1. + <_> + 2 17 18 1 3. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 0 8 12 6 -1. + <_> + 0 8 6 3 2. + <_> + 6 11 6 3 2. + <_> + + <_> + 9 13 7 8 -1. + <_> + 9 17 7 4 2. + <_> + + <_> + 2 17 20 3 -1. + <_> + 2 18 20 1 3. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 4 0 15 4 -1. + <_> + 4 2 15 2 2. + <_> + + <_> + 17 2 6 6 -1. + <_> + 17 5 6 3 2. + <_> + + <_> + 0 3 6 9 -1. + <_> + 0 6 6 3 3. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 0 17 9 6 -1. + <_> + 0 19 9 2 3. + <_> + + <_> + 9 18 12 6 -1. + <_> + 15 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 3 15 6 9 -1. + <_> + 3 18 6 3 3. + <_> + + <_> + 16 13 8 10 -1. + <_> + 20 13 4 5 2. + <_> + 16 18 4 5 2. + <_> + + <_> + 0 14 24 4 -1. + <_> + 8 14 8 4 3. + <_> + + <_> + 13 18 6 6 -1. + <_> + 13 18 3 6 2. + <_> + + <_> + 0 13 8 10 -1. + <_> + 0 13 4 5 2. + <_> + 4 18 4 5 2. + <_> + + <_> + 0 14 24 6 -1. + <_> + 0 17 24 3 2. + <_> + + <_> + 5 2 12 8 -1. + <_> + 5 2 6 4 2. + <_> + 11 6 6 4 2. + <_> + + <_> + 8 9 9 6 -1. + <_> + 11 9 3 6 3. + <_> + + <_> + 4 3 16 4 -1. + <_> + 4 5 16 2 2. + <_> + + <_> + 10 2 4 10 -1. + <_> + 10 7 4 5 2. + <_> + + <_> + 8 4 5 8 -1. + <_> + 8 8 5 4 2. + <_> + + <_> + 11 5 9 12 -1. + <_> + 11 9 9 4 3. + <_> + + <_> + 4 5 9 12 -1. + <_> + 4 9 9 4 3. + <_> + + <_> + 14 6 6 9 -1. + <_> + 14 9 6 3 3. + <_> + + <_> + 2 4 20 12 -1. + <_> + 2 8 20 4 3. + <_> + + <_> + 4 4 17 16 -1. + <_> + 4 12 17 8 2. + <_> + + <_> + 8 7 7 6 -1. + <_> + 8 10 7 3 2. + <_> + + <_> + 1 9 23 2 -1. + <_> + 1 10 23 1 2. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 13 3 4 9 -1. + <_> + 13 3 2 9 2. + <_> + + <_> + 8 1 6 13 -1. + <_> + 10 1 2 13 3. + <_> + + <_> + 4 22 18 2 -1. + <_> + 4 23 18 1 2. + <_> + + <_> + 3 10 9 6 -1. + <_> + 6 10 3 6 3. + <_> + + <_> + 14 0 2 24 -1. + <_> + 14 0 1 24 2. + <_> + + <_> + 8 0 2 24 -1. + <_> + 9 0 1 24 2. + <_> + + <_> + 3 2 18 10 -1. + <_> + 9 2 6 10 3. + <_> + + <_> + 4 13 15 6 -1. + <_> + 9 13 5 6 3. + <_> + + <_> + 3 21 18 3 -1. + <_> + 9 21 6 3 3. + <_> + + <_> + 9 1 4 11 -1. + <_> + 11 1 2 11 2. + <_> + + <_> + 9 7 10 4 -1. + <_> + 9 7 5 4 2. + <_> + + <_> + 7 0 10 18 -1. + <_> + 12 0 5 18 2. + <_> + + <_> + 12 1 6 16 -1. + <_> + 14 1 2 16 3. + <_> + + <_> + 6 1 6 16 -1. + <_> + 8 1 2 16 3. + <_> + + <_> + 18 2 6 6 -1. + <_> + 18 5 6 3 2. + <_> + + <_> + 3 5 18 2 -1. + <_> + 3 6 18 1 2. + <_> + + <_> + 18 2 6 6 -1. + <_> + 18 5 6 3 2. + <_> + + <_> + 0 2 6 6 -1. + <_> + 0 5 6 3 2. + <_> + + <_> + 13 11 11 6 -1. + <_> + 13 13 11 2 3. + <_> + + <_> + 5 7 10 4 -1. + <_> + 10 7 5 4 2. + <_> + + <_> + 11 9 10 7 -1. + <_> + 11 9 5 7 2. + <_> + + <_> + 3 9 10 7 -1. + <_> + 8 9 5 7 2. + <_> + + <_> + 16 4 6 6 -1. + <_> + 16 4 3 6 2. + <_> + + <_> + 5 6 10 8 -1. + <_> + 5 6 5 4 2. + <_> + 10 10 5 4 2. + <_> + + <_> + 7 21 16 3 -1. + <_> + 7 21 8 3 2. + <_> + + <_> + 1 21 16 3 -1. + <_> + 9 21 8 3 2. + <_> + + <_> + 2 5 22 14 -1. + <_> + 13 5 11 7 2. + <_> + 2 12 11 7 2. + <_> + + <_> + 3 10 8 10 -1. + <_> + 3 10 4 5 2. + <_> + 7 15 4 5 2. + <_> + + <_> + 17 0 6 12 -1. + <_> + 20 0 3 6 2. + <_> + 17 6 3 6 2. + <_> + + <_> + 5 2 6 18 -1. + <_> + 7 2 2 18 3. + <_> + + <_> + 13 0 6 9 -1. + <_> + 15 0 2 9 3. + <_> + + <_> + 0 12 7 9 -1. + <_> + 0 15 7 3 3. + <_> + + <_> + 15 13 8 10 -1. + <_> + 19 13 4 5 2. + <_> + 15 18 4 5 2. + <_> + + <_> + 1 0 6 12 -1. + <_> + 1 0 3 6 2. + <_> + 4 6 3 6 2. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 1 13 8 10 -1. + <_> + 1 13 4 5 2. + <_> + 5 18 4 5 2. + <_> + + <_> + 3 21 19 2 -1. + <_> + 3 22 19 1 2. + <_> + + <_> + 6 3 4 13 -1. + <_> + 8 3 2 13 2. + <_> + + <_> + 5 10 18 3 -1. + <_> + 5 11 18 1 3. + <_> + + <_> + 9 3 5 12 -1. + <_> + 9 7 5 4 3. + <_> + + <_> + 11 2 4 15 -1. + <_> + 11 7 4 5 3. + <_> + + <_> + 4 1 16 4 -1. + <_> + 4 3 16 2 2. + <_> + + <_> + 6 0 18 3 -1. + <_> + 6 1 18 1 3. + <_> + + <_> + 5 1 10 8 -1. + <_> + 5 1 5 4 2. + <_> + 10 5 5 4 2. + <_> + + <_> + 11 18 12 6 -1. + <_> + 17 18 6 3 2. + <_> + 11 21 6 3 2. + <_> + + <_> + 5 15 12 3 -1. + <_> + 11 15 6 3 2. + <_> + + <_> + 1 10 22 4 -1. + <_> + 1 10 11 4 2. + <_> + + <_> + 7 9 9 6 -1. + <_> + 10 9 3 6 3. + <_> + + <_> + 6 11 12 5 -1. + <_> + 10 11 4 5 3. + <_> + + <_> + 6 7 10 7 -1. + <_> + 11 7 5 7 2. + <_> + + <_> + 11 2 8 10 -1. + <_> + 11 2 4 10 2. + <_> + + <_> + 5 2 8 10 -1. + <_> + 9 2 4 10 2. + <_> + + <_> + 6 4 18 6 -1. + <_> + 15 4 9 3 2. + <_> + 6 7 9 3 2. + <_> + + <_> + 0 5 10 9 -1. + <_> + 0 8 10 3 3. + <_> + + <_> + 2 7 21 6 -1. + <_> + 2 9 21 2 3. + <_> + + <_> + 0 4 22 16 -1. + <_> + 0 4 11 8 2. + <_> + 11 12 11 8 2. + <_> + + <_> + 9 0 6 22 -1. + <_> + 9 11 6 11 2. + <_> + + <_> + 9 1 3 12 -1. + <_> + 9 7 3 6 2. + <_> + + <_> + 12 0 12 18 -1. + <_> + 18 0 6 9 2. + <_> + 12 9 6 9 2. + <_> + + <_> + 0 0 12 18 -1. + <_> + 0 0 6 9 2. + <_> + 6 9 6 9 2. + <_> + + <_> + 1 1 22 4 -1. + <_> + 12 1 11 2 2. + <_> + 1 3 11 2 2. + <_> + + <_> + 3 0 18 4 -1. + <_> + 3 2 18 2 2. + <_> + + <_> + 2 5 22 6 -1. + <_> + 2 7 22 2 3. + <_> + + <_> + 5 0 6 9 -1. + <_> + 5 3 6 3 3. + <_> + + <_> + 10 14 6 9 -1. + <_> + 12 14 2 9 3. + <_> + + <_> + 8 14 6 9 -1. + <_> + 10 14 2 9 3. + <_> + + <_> + 5 18 18 3 -1. + <_> + 5 19 18 1 3. + <_> + + <_> + 6 0 6 13 -1. + <_> + 9 0 3 13 2. + <_> + + <_> + 7 4 12 4 -1. + <_> + 7 4 6 4 2. + <_> + + <_> + 5 2 12 6 -1. + <_> + 9 2 4 6 3. + <_> + + <_> + 4 1 18 3 -1. + <_> + 4 2 18 1 3. + <_> + + <_> + 0 8 6 12 -1. + <_> + 0 12 6 4 3. + <_> + + <_> + 9 15 6 9 -1. + <_> + 11 15 2 9 3. + <_> + + <_> + 9 10 6 13 -1. + <_> + 11 10 2 13 3. + <_> + + <_> + 6 17 18 2 -1. + <_> + 6 18 18 1 2. + <_> + + <_> + 9 4 6 9 -1. + <_> + 11 4 2 9 3. + <_> + + <_> + 10 0 6 9 -1. + <_> + 12 0 2 9 3. + <_> + + <_> + 5 6 10 8 -1. + <_> + 5 6 5 4 2. + <_> + 10 10 5 4 2. + <_> + + <_> + 14 9 5 8 -1. + <_> + 14 13 5 4 2. + <_> + + <_> + 5 9 5 8 -1. + <_> + 5 13 5 4 2. + <_> + + <_> + 14 11 9 6 -1. + <_> + 14 13 9 2 3. + <_> + + <_> + 0 2 23 15 -1. + <_> + 0 7 23 5 3. + <_> + + <_> + 16 0 8 12 -1. + <_> + 16 6 8 6 2. + <_> + + <_> + 4 15 6 9 -1. + <_> + 4 18 6 3 3. + <_> + + <_> + 8 18 9 4 -1. + <_> + 8 20 9 2 2. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 13 11 11 6 -1. + <_> + 13 13 11 2 3. + <_> + + <_> + 0 11 11 6 -1. + <_> + 0 13 11 2 3. + <_> + + <_> + 0 9 24 6 -1. + <_> + 12 9 12 3 2. + <_> + 0 12 12 3 2. + <_> + + <_> + 6 16 8 8 -1. + <_> + 6 20 8 4 2. + <_> + + <_> + 10 16 14 6 -1. + <_> + 10 18 14 2 3. + <_> + + <_> + 1 1 21 3 -1. + <_> + 1 2 21 1 3. + <_> + + <_> + 0 2 24 3 -1. + <_> + 0 2 12 3 2. + <_> + + <_> + 2 15 8 5 -1. + <_> + 6 15 4 5 2. + <_> + + <_> + 2 11 21 3 -1. + <_> + 9 11 7 3 3. + <_> + + <_> + 1 18 12 6 -1. + <_> + 1 18 6 3 2. + <_> + 7 21 6 3 2. + <_> + + <_> + 10 14 4 10 -1. + <_> + 10 19 4 5 2. + <_> + + <_> + 7 7 4 10 -1. + <_> + 7 12 4 5 2. + <_> + + <_> + 9 8 6 12 -1. + <_> + 9 12 6 4 3. + <_> + + <_> + 7 1 9 6 -1. + <_> + 10 1 3 6 3. + <_> + + <_> + 3 14 19 2 -1. + <_> + 3 15 19 1 2. + <_> + + <_> + 7 7 10 10 -1. + <_> + 7 7 5 5 2. + <_> + 12 12 5 5 2. + <_> + + <_> + 3 12 18 12 -1. + <_> + 3 12 9 12 2. + <_> + + <_> + 8 0 6 12 -1. + <_> + 10 0 2 12 3. + <_> + + <_> + 3 0 17 9 -1. + <_> + 3 3 17 3 3. + <_> + + <_> + 6 0 12 11 -1. + <_> + 10 0 4 11 3. + <_> + + <_> + 1 0 6 13 -1. + <_> + 4 0 3 13 2. + <_> + + <_> + 5 8 16 6 -1. + <_> + 5 11 16 3 2. + <_> + + <_> + 8 8 5 12 -1. + <_> + 8 14 5 6 2. + <_> + + <_> + 3 21 18 3 -1. + <_> + 9 21 6 3 3. + <_> + + <_> + 0 0 6 6 -1. + <_> + 3 0 3 6 2. + <_> + + <_> + 2 0 20 3 -1. + <_> + 2 1 20 1 3. + <_> + + <_> + 4 6 15 10 -1. + <_> + 9 6 5 10 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 14 0 6 9 -1. + <_> + 16 0 2 9 3. + <_> + + <_> + 7 16 9 6 -1. + <_> + 7 18 9 2 3. + <_> + + <_> + 14 0 6 9 -1. + <_> + 16 0 2 9 3. + <_> + + <_> + 4 0 6 9 -1. + <_> + 6 0 2 9 3. + <_> + + <_> + 17 1 6 16 -1. + <_> + 19 1 2 16 3. + <_> + + <_> + 1 1 6 16 -1. + <_> + 3 1 2 16 3. + <_> + + <_> + 14 13 6 9 -1. + <_> + 14 16 6 3 3. + <_> + + <_> + 0 0 6 9 -1. + <_> + 0 3 6 3 3. + <_> + + <_> + 9 5 6 6 -1. + <_> + 9 5 3 6 2. + <_> + + <_> + 3 10 9 6 -1. + <_> + 6 10 3 6 3. + <_> + + <_> + 14 7 3 16 -1. + <_> + 14 15 3 8 2. + <_> + + <_> + 4 10 14 12 -1. + <_> + 4 10 7 6 2. + <_> + 11 16 7 6 2. + <_> + + <_> + 7 6 12 6 -1. + <_> + 7 8 12 2 3. + <_> + + <_> + 7 2 4 20 -1. + <_> + 9 2 2 20 2. + <_> + + <_> + 14 13 6 9 -1. + <_> + 14 16 6 3 3. + <_> + + <_> + 10 6 4 9 -1. + <_> + 12 6 2 9 2. + <_> + + <_> + 14 13 6 9 -1. + <_> + 14 16 6 3 3. + <_> + + <_> + 5 20 14 4 -1. + <_> + 5 22 14 2 2. + <_> + + <_> + 4 4 16 12 -1. + <_> + 4 10 16 6 2. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 3 0 21 4 -1. + <_> + 3 2 21 2 2. + <_> + + <_> + 4 13 6 9 -1. + <_> + 4 16 6 3 3. + <_> + + <_> + 16 16 5 8 -1. + <_> + 16 20 5 4 2. + <_> + + <_> + 4 0 16 16 -1. + <_> + 4 0 8 8 2. + <_> + 12 8 8 8 2. + <_> + + <_> + 6 6 14 6 -1. + <_> + 13 6 7 3 2. + <_> + 6 9 7 3 2. + <_> + + <_> + 10 5 4 15 -1. + <_> + 10 10 4 5 3. + <_> + + <_> + 9 15 12 8 -1. + <_> + 15 15 6 4 2. + <_> + 9 19 6 4 2. + <_> + + <_> + 6 7 12 4 -1. + <_> + 12 7 6 4 2. + <_> + + <_> + 5 6 14 6 -1. + <_> + 12 6 7 3 2. + <_> + 5 9 7 3 2. + <_> + + <_> + 3 6 18 10 -1. + <_> + 3 6 9 5 2. + <_> + 12 11 9 5 2. + <_> + + <_> + 6 0 18 21 -1. + <_> + 12 0 6 21 3. + <_> + + <_> + 0 0 24 21 -1. + <_> + 8 0 8 21 3. + <_> + + <_> + 6 18 18 3 -1. + <_> + 6 19 18 1 3. + <_> + + <_> + 0 15 9 6 -1. + <_> + 0 17 9 2 3. + <_> + + <_> + 4 3 19 2 -1. + <_> + 4 4 19 1 2. + <_> + + <_> + 0 3 24 2 -1. + <_> + 0 4 24 1 2. + <_> + + <_> + 15 14 9 4 -1. + <_> + 15 16 9 2 2. + <_> + + <_> + 0 14 9 4 -1. + <_> + 0 16 9 2 2. + <_> + + <_> + 6 15 18 2 -1. + <_> + 6 16 18 1 2. + <_> + + <_> + 3 17 18 3 -1. + <_> + 3 18 18 1 3. + <_> + + <_> + 12 0 3 23 -1. + <_> + 13 0 1 23 3. + <_> + + <_> + 6 0 8 6 -1. + <_> + 6 3 8 3 2. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 9 0 3 23 -1. + <_> + 10 0 1 23 3. + <_> + + <_> + 10 7 4 10 -1. + <_> + 10 12 4 5 2. + <_> + + <_> + 7 8 10 12 -1. + <_> + 7 12 10 4 3. + <_> + + <_> + 14 9 6 14 -1. + <_> + 17 9 3 7 2. + <_> + 14 16 3 7 2. + <_> + + <_> + 2 0 10 9 -1. + <_> + 2 3 10 3 3. + <_> + + <_> + 11 1 5 12 -1. + <_> + 11 7 5 6 2. + <_> + + <_> + 1 4 12 10 -1. + <_> + 1 4 6 5 2. + <_> + 7 9 6 5 2. + <_> + + <_> + 15 1 9 4 -1. + <_> + 15 3 9 2 2. + <_> + + <_> + 1 2 8 10 -1. + <_> + 1 2 4 5 2. + <_> + 5 7 4 5 2. + <_> + + <_> + 10 1 5 12 -1. + <_> + 10 5 5 4 3. + <_> + + <_> + 4 0 14 24 -1. + <_> + 11 0 7 24 2. + <_> + + <_> + 7 17 10 4 -1. + <_> + 7 19 10 2 2. + <_> + + <_> + 10 14 4 10 -1. + <_> + 10 19 4 5 2. + <_> + + <_> + 13 15 6 9 -1. + <_> + 15 15 2 9 3. + <_> + + <_> + 3 21 18 3 -1. + <_> + 3 22 18 1 3. + <_> + + <_> + 13 15 6 9 -1. + <_> + 15 15 2 9 3. + <_> + + <_> + 5 15 6 9 -1. + <_> + 7 15 2 9 3. + <_> + + <_> + 10 6 4 18 -1. + <_> + 12 6 2 9 2. + <_> + 10 15 2 9 2. + <_> + + <_> + 7 3 6 11 -1. + <_> + 9 3 2 11 3. + <_> + + <_> + 15 1 9 4 -1. + <_> + 15 3 9 2 2. + <_> + + <_> + 5 4 14 8 -1. + <_> + 5 8 14 4 2. + <_> + + <_> + 8 1 15 9 -1. + <_> + 8 4 15 3 3. + <_> + + <_> + 7 2 8 10 -1. + <_> + 7 2 4 5 2. + <_> + 11 7 4 5 2. + <_> + + <_> + 12 2 6 12 -1. + <_> + 12 2 3 12 2. + <_> + + <_> + 6 2 6 12 -1. + <_> + 9 2 3 12 2. + <_> + + <_> + 7 7 12 4 -1. + <_> + 7 7 6 4 2. + <_> + + <_> + 6 3 12 10 -1. + <_> + 10 3 4 10 3. + <_> + + <_> + 5 6 16 6 -1. + <_> + 13 6 8 3 2. + <_> + 5 9 8 3 2. + <_> + + <_> + 3 1 18 9 -1. + <_> + 9 1 6 9 3. + <_> + + <_> + 3 8 18 5 -1. + <_> + 9 8 6 5 3. + <_> + + <_> + 0 0 24 22 -1. + <_> + 0 0 12 11 2. + <_> + 12 11 12 11 2. + <_> + + <_> + 14 16 9 6 -1. + <_> + 14 18 9 2 3. + <_> + + <_> + 0 16 24 8 -1. + <_> + 0 20 24 4 2. + <_> + + <_> + 1 19 22 4 -1. + <_> + 12 19 11 2 2. + <_> + 1 21 11 2 2. + <_> + + <_> + 1 16 9 6 -1. + <_> + 1 18 9 2 3. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 8 5 4 2. + <_> + + <_> + 9 15 6 9 -1. + <_> + 11 15 2 9 3. + <_> + + <_> + 10 18 12 6 -1. + <_> + 16 18 6 3 2. + <_> + 10 21 6 3 2. + <_> + + <_> + 2 18 12 6 -1. + <_> + 2 18 6 3 2. + <_> + 8 21 6 3 2. + <_> + + <_> + 8 3 16 9 -1. + <_> + 8 6 16 3 3. + <_> + + <_> + 0 5 10 6 -1. + <_> + 0 7 10 2 3. + <_> + + <_> + 5 5 18 3 -1. + <_> + 5 6 18 1 3. + <_> + + <_> + 2 6 9 6 -1. + <_> + 2 9 9 3 2. + <_> + + <_> + 14 2 10 9 -1. + <_> + 14 5 10 3 3. + <_> + + <_> + 3 6 18 3 -1. + <_> + 3 7 18 1 3. + <_> + + <_> + 9 2 15 6 -1. + <_> + 9 4 15 2 3. + <_> + + <_> + 4 8 15 6 -1. + <_> + 4 10 15 2 3. + <_> + + <_> + 0 5 24 4 -1. + <_> + 12 5 12 2 2. + <_> + 0 7 12 2 2. + <_> + + <_> + 7 8 6 12 -1. + <_> + 9 8 2 12 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 0 12 6 12 -1. + <_> + 0 12 3 6 2. + <_> + 3 18 3 6 2. + <_> + + <_> + 14 12 10 6 -1. + <_> + 14 14 10 2 3. + <_> + + <_> + 2 7 18 9 -1. + <_> + 2 10 18 3 3. + <_> + + <_> + 11 14 10 9 -1. + <_> + 11 17 10 3 3. + <_> + + <_> + 7 6 10 8 -1. + <_> + 7 6 5 4 2. + <_> + 12 10 5 4 2. + <_> + + <_> + 6 6 14 6 -1. + <_> + 13 6 7 3 2. + <_> + 6 9 7 3 2. + <_> + + <_> + 4 13 9 7 -1. + <_> + 7 13 3 7 3. + <_> + + <_> + 14 10 6 12 -1. + <_> + 17 10 3 6 2. + <_> + 14 16 3 6 2. + <_> + + <_> + 4 10 6 12 -1. + <_> + 4 10 3 6 2. + <_> + 7 16 3 6 2. + <_> + + <_> + 13 9 8 6 -1. + <_> + 13 9 4 6 2. + <_> + + <_> + 8 3 4 14 -1. + <_> + 10 3 2 14 2. + <_> + + <_> + 17 0 3 18 -1. + <_> + 18 0 1 18 3. + <_> + + <_> + 4 12 16 12 -1. + <_> + 12 12 8 12 2. + <_> + + <_> + 15 0 6 14 -1. + <_> + 17 0 2 14 3. + <_> + + <_> + 3 0 6 14 -1. + <_> + 5 0 2 14 3. + <_> + + <_> + 12 2 12 20 -1. + <_> + 16 2 4 20 3. + <_> + + <_> + 0 2 12 20 -1. + <_> + 4 2 4 20 3. + <_> + + <_> + 16 0 6 17 -1. + <_> + 18 0 2 17 3. + <_> + + <_> + 2 0 6 17 -1. + <_> + 4 0 2 17 3. + <_> + + <_> + 15 6 9 6 -1. + <_> + 15 8 9 2 3. + <_> + + <_> + 0 6 9 6 -1. + <_> + 0 8 9 2 3. + <_> + + <_> + 18 1 6 13 -1. + <_> + 20 1 2 13 3. + <_> + + <_> + 0 1 6 13 -1. + <_> + 2 1 2 13 3. + <_> + + <_> + 16 0 4 9 -1. + <_> + 16 0 2 9 2. + <_> + + <_> + 5 10 12 7 -1. + <_> + 9 10 4 7 3. + <_> + + <_> + 12 9 12 6 -1. + <_> + 12 11 12 2 3. + <_> + + <_> + 0 9 12 6 -1. + <_> + 0 11 12 2 3. + <_> + + <_> + 5 7 14 9 -1. + <_> + 5 10 14 3 3. + <_> + + <_> + 0 15 20 3 -1. + <_> + 0 16 20 1 3. + <_> + + <_> + 8 10 8 10 -1. + <_> + 12 10 4 5 2. + <_> + 8 15 4 5 2. + <_> + + <_> + 5 4 13 9 -1. + <_> + 5 7 13 3 3. + <_> + + <_> + 10 2 6 18 -1. + <_> + 10 8 6 6 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 6 9 12 4 -1. + <_> + 6 11 12 2 2. + <_> + + <_> + 3 2 15 12 -1. + <_> + 3 6 15 4 3. + <_> + + <_> + 12 0 12 5 -1. + <_> + 16 0 4 5 3. + <_> + + <_> + 0 15 18 3 -1. + <_> + 6 15 6 3 3. + <_> + + <_> + 0 14 24 5 -1. + <_> + 8 14 8 5 3. + <_> + + <_> + 5 1 3 18 -1. + <_> + 6 1 1 18 3. + <_> + + <_> + 10 0 4 14 -1. + <_> + 10 0 2 14 2. + <_> + + <_> + 9 3 4 9 -1. + <_> + 11 3 2 9 2. + <_> + + <_> + 8 2 12 6 -1. + <_> + 14 2 6 3 2. + <_> + 8 5 6 3 2. + <_> + + <_> + 0 4 17 4 -1. + <_> + 0 6 17 2 2. + <_> + + <_> + 16 16 5 8 -1. + <_> + 16 20 5 4 2. + <_> + + <_> + 3 16 5 8 -1. + <_> + 3 20 5 4 2. + <_> + + <_> + 6 18 18 2 -1. + <_> + 6 19 18 1 2. + <_> + + <_> + 0 0 12 5 -1. + <_> + 4 0 4 5 3. + <_> + + <_> + 14 3 6 12 -1. + <_> + 17 3 3 6 2. + <_> + 14 9 3 6 2. + <_> + + <_> + 0 12 6 12 -1. + <_> + 2 12 2 12 3. + <_> + + <_> + 2 3 21 3 -1. + <_> + 2 4 21 1 3. + <_> + + <_> + 4 3 6 12 -1. + <_> + 4 3 3 6 2. + <_> + 7 9 3 6 2. + <_> + + <_> + 12 8 12 6 -1. + <_> + 18 8 6 3 2. + <_> + 12 11 6 3 2. + <_> + + <_> + 0 15 16 9 -1. + <_> + 8 15 8 9 2. + <_> + + <_> + 6 13 18 5 -1. + <_> + 6 13 9 5 2. + <_> + + <_> + 1 6 15 6 -1. + <_> + 6 6 5 6 3. + <_> + + <_> + 11 9 9 6 -1. + <_> + 14 9 3 6 3. + <_> + + <_> + 3 0 15 11 -1. + <_> + 8 0 5 11 3. + <_> + + <_> + 15 3 3 18 -1. + <_> + 15 9 3 6 3. + <_> + + <_> + 6 3 3 18 -1. + <_> + 6 9 3 6 3. + <_> + + <_> + 9 5 10 8 -1. + <_> + 14 5 5 4 2. + <_> + 9 9 5 4 2. + <_> + + <_> + 4 4 16 8 -1. + <_> + 4 4 8 4 2. + <_> + 12 8 8 4 2. + <_> + + <_> + 7 7 12 3 -1. + <_> + 7 7 6 3 2. + <_> + + <_> + 5 0 9 13 -1. + <_> + 8 0 3 13 3. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 8 1 10 9 -1. + <_> + 8 4 10 3 3. + <_> + + <_> + 0 2 18 2 -1. + <_> + 0 3 18 1 2. + <_> + + <_> + 10 13 14 6 -1. + <_> + 17 13 7 3 2. + <_> + 10 16 7 3 2. + <_> + + <_> + 0 13 14 6 -1. + <_> + 0 13 7 3 2. + <_> + 7 16 7 3 2. + <_> + + <_> + 20 2 3 21 -1. + <_> + 21 2 1 21 3. + <_> + + <_> + 0 9 5 12 -1. + <_> + 0 13 5 4 3. + <_> + + <_> + 12 6 12 6 -1. + <_> + 12 8 12 2 3. + <_> + + <_> + 1 8 20 3 -1. + <_> + 1 9 20 1 3. + <_> + + <_> + 5 7 19 3 -1. + <_> + 5 8 19 1 3. + <_> + + <_> + 1 12 9 6 -1. + <_> + 1 14 9 2 3. + <_> + + <_> + 6 10 14 12 -1. + <_> + 6 14 14 4 3. + <_> + + <_> + 5 6 14 18 -1. + <_> + 5 12 14 6 3. + <_> + + <_> + 11 12 9 7 -1. + <_> + 14 12 3 7 3. + <_> + + <_> + 1 15 18 4 -1. + <_> + 1 17 18 2 2. + <_> + + <_> + 11 14 6 9 -1. + <_> + 11 17 6 3 3. + <_> + + <_> + 0 8 18 4 -1. + <_> + 0 8 9 2 2. + <_> + 9 10 9 2 2. + <_> + + <_> + 3 10 20 6 -1. + <_> + 13 10 10 3 2. + <_> + 3 13 10 3 2. + <_> + + <_> + 1 10 20 6 -1. + <_> + 1 10 10 3 2. + <_> + 11 13 10 3 2. + <_> + + <_> + 0 9 24 2 -1. + <_> + 0 9 12 2 2. + <_> + + <_> + 1 12 20 8 -1. + <_> + 1 12 10 4 2. + <_> + 11 16 10 4 2. + <_> + + <_> + 11 12 9 7 -1. + <_> + 14 12 3 7 3. + <_> + + <_> + 4 12 9 7 -1. + <_> + 7 12 3 7 3. + <_> + + <_> + 12 12 8 5 -1. + <_> + 12 12 4 5 2. + <_> + + <_> + 4 12 8 5 -1. + <_> + 8 12 4 5 2. + <_> + + <_> + 13 10 4 10 -1. + <_> + 13 10 2 10 2. + <_> + + <_> + 1 15 20 2 -1. + <_> + 11 15 10 2 2. + <_> + + <_> + 9 10 6 6 -1. + <_> + 9 10 3 6 2. + <_> + + <_> + 0 1 21 3 -1. + <_> + 7 1 7 3 3. + <_> + + <_> + 6 4 13 9 -1. + <_> + 6 7 13 3 3. + <_> + + <_> + 6 5 12 5 -1. + <_> + 10 5 4 5 3. + <_> + + <_> + 10 10 10 6 -1. + <_> + 10 12 10 2 3. + <_> + + <_> + 6 12 5 8 -1. + <_> + 6 16 5 4 2. + <_> + + <_> + 13 0 6 9 -1. + <_> + 15 0 2 9 3. + <_> + + <_> + 2 10 18 6 -1. + <_> + 8 10 6 6 3. + <_> + + <_> + 11 2 9 4 -1. + <_> + 11 4 9 2 2. + <_> + + <_> + 1 20 21 3 -1. + <_> + 8 20 7 3 3. + <_> + + <_> + 1 10 22 2 -1. + <_> + 1 11 22 1 2. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 13 0 6 9 -1. + <_> + 15 0 2 9 3. + <_> + + <_> + 5 0 6 9 -1. + <_> + 7 0 2 9 3. + <_> + + <_> + 18 2 6 20 -1. + <_> + 20 2 2 20 3. + <_> + + <_> + 0 2 6 20 -1. + <_> + 2 2 2 20 3. + <_> + + <_> + 11 7 6 14 -1. + <_> + 14 7 3 7 2. + <_> + 11 14 3 7 2. + <_> + + <_> + 0 1 4 9 -1. + <_> + 2 1 2 9 2. + <_> + + <_> + 12 14 9 4 -1. + <_> + 12 16 9 2 2. + <_> + + <_> + 1 13 9 4 -1. + <_> + 1 15 9 2 2. + <_> + + <_> + 7 6 15 6 -1. + <_> + 7 8 15 2 3. + <_> + + <_> + 8 2 3 18 -1. + <_> + 8 8 3 6 3. + <_> + + <_> + 6 6 12 6 -1. + <_> + 12 6 6 3 2. + <_> + 6 9 6 3 2. + <_> + + <_> + 2 19 20 4 -1. + <_> + 2 19 10 2 2. + <_> + 12 21 10 2 2. + <_> + + <_> + 14 15 6 9 -1. + <_> + 14 18 6 3 3. + <_> + + <_> + 3 5 18 14 -1. + <_> + 3 5 9 7 2. + <_> + 12 12 9 7 2. + <_> + + <_> + 15 6 4 18 -1. + <_> + 17 6 2 9 2. + <_> + 15 15 2 9 2. + <_> + + <_> + 5 6 4 18 -1. + <_> + 5 6 2 9 2. + <_> + 7 15 2 9 2. + <_> + + <_> + 11 0 6 9 -1. + <_> + 13 0 2 9 3. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 11 5 6 9 -1. + <_> + 13 5 2 9 3. + <_> + + <_> + 9 5 6 6 -1. + <_> + 12 5 3 6 2. + <_> + + <_> + 4 1 16 6 -1. + <_> + 12 1 8 3 2. + <_> + 4 4 8 3 2. + <_> + + <_> + 9 13 6 11 -1. + <_> + 11 13 2 11 3. + <_> + + <_> + 17 1 6 12 -1. + <_> + 20 1 3 6 2. + <_> + 17 7 3 6 2. + <_> + + <_> + 1 17 18 3 -1. + <_> + 1 18 18 1 3. + <_> + + <_> + 7 13 10 8 -1. + <_> + 7 17 10 4 2. + <_> + + <_> + 6 18 10 6 -1. + <_> + 6 20 10 2 3. + <_> + + <_> + 9 14 9 4 -1. + <_> + 9 16 9 2 2. + <_> + + <_> + 1 1 6 12 -1. + <_> + 1 1 3 6 2. + <_> + 4 7 3 6 2. + <_> + + <_> + 19 4 5 12 -1. + <_> + 19 8 5 4 3. + <_> + + <_> + 0 0 8 8 -1. + <_> + 4 0 4 8 2. + <_> + + <_> + 3 5 19 3 -1. + <_> + 3 6 19 1 3. + <_> + + <_> + 1 5 12 6 -1. + <_> + 1 5 6 3 2. + <_> + 7 8 6 3 2. + <_> + + <_> + 2 1 21 8 -1. + <_> + 9 1 7 8 3. + <_> + + <_> + 4 1 16 8 -1. + <_> + 4 5 16 4 2. + <_> + + <_> + 6 0 18 3 -1. + <_> + 6 1 18 1 3. + <_> + + <_> + 4 4 10 14 -1. + <_> + 4 11 10 7 2. + <_> + + <_> + 15 6 4 10 -1. + <_> + 15 11 4 5 2. + <_> + + <_> + 3 18 18 3 -1. + <_> + 9 18 6 3 3. + <_> + + <_> + 8 18 12 6 -1. + <_> + 12 18 4 6 3. + <_> + + <_> + 3 15 6 9 -1. + <_> + 6 15 3 9 2. + <_> + + <_> + 15 7 6 8 -1. + <_> + 15 11 6 4 2. + <_> + + <_> + 3 7 6 8 -1. + <_> + 3 11 6 4 2. + <_> + + <_> + 5 9 18 6 -1. + <_> + 14 9 9 3 2. + <_> + 5 12 9 3 2. + <_> + + <_> + 1 13 12 6 -1. + <_> + 1 15 12 2 3. + <_> + + <_> + 14 15 10 6 -1. + <_> + 14 17 10 2 3. + <_> + + <_> + 0 15 10 6 -1. + <_> + 0 17 10 2 3. + <_> + + <_> + 15 13 6 9 -1. + <_> + 15 16 6 3 3. + <_> + + <_> + 3 13 6 9 -1. + <_> + 3 16 6 3 3. + <_> + + <_> + 9 5 8 8 -1. + <_> + 9 5 4 8 2. + <_> + + <_> + 1 18 12 6 -1. + <_> + 1 18 6 3 2. + <_> + 7 21 6 3 2. + <_> + + <_> + 13 19 10 4 -1. + <_> + 13 21 10 2 2. + <_> + + <_> + 1 19 10 4 -1. + <_> + 1 21 10 2 2. + <_> + + <_> + 6 19 18 3 -1. + <_> + 6 20 18 1 3. + <_> + + <_> + 8 14 4 10 -1. + <_> + 8 19 4 5 2. + <_> + + <_> + 0 0 24 6 -1. + <_> + 0 2 24 2 3. + <_> + + <_> + 0 1 6 9 -1. + <_> + 0 4 6 3 3. + <_> + + <_> + 4 9 20 6 -1. + <_> + 14 9 10 3 2. + <_> + 4 12 10 3 2. + <_> + + <_> + 1 15 19 8 -1. + <_> + 1 19 19 4 2. + <_> + + <_> + 14 0 10 6 -1. + <_> + 14 2 10 2 3. + <_> + + <_> + 1 10 21 14 -1. + <_> + 8 10 7 14 3. + <_> + + <_> + 10 10 8 8 -1. + <_> + 10 10 4 8 2. + <_> + + <_> + 6 8 10 4 -1. + <_> + 11 8 5 4 2. + <_> + + <_> + 10 5 4 9 -1. + <_> + 10 5 2 9 2. + <_> + + <_> + 7 5 6 10 -1. + <_> + 9 5 2 10 3. + <_> + + <_> + 14 4 4 13 -1. + <_> + 14 4 2 13 2. + <_> + + <_> + 6 4 4 13 -1. + <_> + 8 4 2 13 2. + <_> + + <_> + 8 7 9 6 -1. + <_> + 11 7 3 6 3. + <_> + + <_> + 3 6 16 6 -1. + <_> + 3 6 8 3 2. + <_> + 11 9 8 3 2. + <_> + + <_> + 5 4 16 14 -1. + <_> + 13 4 8 7 2. + <_> + 5 11 8 7 2. + <_> + + <_> + 0 0 24 4 -1. + <_> + 0 0 12 2 2. + <_> + 12 2 12 2 2. + <_> + + <_> + 9 1 9 6 -1. + <_> + 12 1 3 6 3. + <_> + + <_> + 4 1 14 4 -1. + <_> + 11 1 7 4 2. + <_> + + <_> + 10 14 7 9 -1. + <_> + 10 17 7 3 3. + <_> + + <_> + 8 3 8 10 -1. + <_> + 8 3 4 5 2. + <_> + 12 8 4 5 2. + <_> + + <_> + 7 3 12 5 -1. + <_> + 11 3 4 5 3. + <_> + + <_> + 8 2 4 13 -1. + <_> + 10 2 2 13 2. + <_> + + <_> + 11 2 3 19 -1. + <_> + 12 2 1 19 3. + <_> + + <_> + 7 7 9 6 -1. + <_> + 10 7 3 6 3. + <_> + + <_> + 4 22 20 2 -1. + <_> + 4 22 10 2 2. + <_> + + <_> + 0 16 24 4 -1. + <_> + 0 16 12 2 2. + <_> + 12 18 12 2 2. + <_> + + <_> + 7 3 12 5 -1. + <_> + 11 3 4 5 3. + <_> + + <_> + 1 10 8 14 -1. + <_> + 1 10 4 7 2. + <_> + 5 17 4 7 2. + <_> + + <_> + 11 16 6 6 -1. + <_> + 11 19 6 3 2. + <_> + + <_> + 6 0 10 24 -1. + <_> + 6 0 5 12 2. + <_> + 11 12 5 12 2. + <_> + + <_> + 7 5 14 14 -1. + <_> + 14 5 7 7 2. + <_> + 7 12 7 7 2. + <_> + + <_> + 7 8 10 8 -1. + <_> + 7 8 5 4 2. + <_> + 12 12 5 4 2. + <_> + + <_> + 9 1 9 6 -1. + <_> + 12 1 3 6 3. + <_> + + <_> + 0 6 24 3 -1. + <_> + 12 6 12 3 2. + <_> + + <_> + 7 3 12 5 -1. + <_> + 11 3 4 5 3. + <_> + + <_> + 1 13 22 4 -1. + <_> + 1 13 11 2 2. + <_> + 12 15 11 2 2. + <_> + + <_> + 9 12 12 6 -1. + <_> + 9 14 12 2 3. + <_> + + <_> + 0 5 9 6 -1. + <_> + 0 7 9 2 3. + <_> + + <_> + 1 5 23 6 -1. + <_> + 1 7 23 2 3. + <_> + + <_> + 1 6 19 12 -1. + <_> + 1 10 19 4 3. + <_> + + <_> + 9 1 6 21 -1. + <_> + 9 8 6 7 3. + <_> + + <_> + 3 19 18 3 -1. + <_> + 9 19 6 3 3. + <_> + + <_> + 9 14 6 9 -1. + <_> + 11 14 2 9 3. + <_> + + <_> + 9 6 4 12 -1. + <_> + 11 6 2 12 2. + <_> + + <_> + 16 0 6 9 -1. + <_> + 18 0 2 9 3. + <_> + + <_> + 2 0 6 9 -1. + <_> + 4 0 2 9 3. + <_> + + <_> + 13 1 4 22 -1. + <_> + 15 1 2 11 2. + <_> + 13 12 2 11 2. + <_> + + <_> + 1 8 8 12 -1. + <_> + 1 14 8 6 2. + <_> + + <_> + 14 7 7 9 -1. + <_> + 14 10 7 3 3. + <_> + + <_> + 3 12 18 4 -1. + <_> + 3 12 9 2 2. + <_> + 12 14 9 2 2. + <_> + + <_> + 13 1 4 22 -1. + <_> + 15 1 2 11 2. + <_> + 13 12 2 11 2. + <_> + + <_> + 7 1 4 22 -1. + <_> + 7 1 2 11 2. + <_> + 9 12 2 11 2. + <_> + + <_> + 4 7 20 4 -1. + <_> + 14 7 10 2 2. + <_> + 4 9 10 2 2. + <_> + + <_> + 9 10 6 7 -1. + <_> + 12 10 3 7 2. + <_> + + <_> + 7 7 10 4 -1. + <_> + 7 7 5 4 2. + <_> + + <_> + 0 3 4 15 -1. + <_> + 0 8 4 5 3. + <_> + + <_> + 15 0 8 12 -1. + <_> + 19 0 4 6 2. + <_> + 15 6 4 6 2. + <_> + + <_> + 1 0 8 12 -1. + <_> + 1 0 4 6 2. + <_> + 5 6 4 6 2. + <_> + + <_> + 14 5 6 16 -1. + <_> + 16 5 2 16 3. + <_> + + <_> + 4 5 6 16 -1. + <_> + 6 5 2 16 3. + <_> + + <_> + 15 0 6 16 -1. + <_> + 17 0 2 16 3. + <_> + + <_> + 3 0 6 16 -1. + <_> + 5 0 2 16 3. + <_> + + <_> + 0 2 24 3 -1. + <_> + 0 3 24 1 3. + <_> + + <_> + 7 1 10 4 -1. + <_> + 7 3 10 2 2. + <_> + + <_> + 1 0 23 8 -1. + <_> + 1 4 23 4 2. + <_> + + <_> + 1 17 19 3 -1. + <_> + 1 18 19 1 3. + <_> + + <_> + 6 18 18 2 -1. + <_> + 6 19 18 1 2. + <_> + + <_> + 1 17 9 6 -1. + <_> + 1 19 9 2 3. + <_> + + <_> + 15 15 6 9 -1. + <_> + 15 18 6 3 3. + <_> + + <_> + 3 15 6 9 -1. + <_> + 3 18 6 3 3. + <_> + + <_> + 4 14 20 6 -1. + <_> + 4 17 20 3 2. + <_> + + <_> + 0 10 6 14 -1. + <_> + 0 10 3 7 2. + <_> + 3 17 3 7 2. + <_> + + <_> + 6 18 18 3 -1. + <_> + 6 19 18 1 3. + <_> + + <_> + 4 12 9 7 -1. + <_> + 7 12 3 7 3. + <_> + + <_> + 6 10 18 5 -1. + <_> + 12 10 6 5 3. + <_> + + <_> + 0 10 18 5 -1. + <_> + 6 10 6 5 3. + <_> + + <_> + 3 2 18 9 -1. + <_> + 9 2 6 9 3. + <_> + + <_> + 4 6 10 10 -1. + <_> + 4 6 5 5 2. + <_> + 9 11 5 5 2. + <_> + + <_> + 20 14 4 9 -1. + <_> + 20 14 2 9 2. + <_> + + <_> + 0 14 4 9 -1. + <_> + 2 14 2 9 2. + <_> + + <_> + 11 1 4 20 -1. + <_> + 13 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 6 21 12 3 -1. + <_> + 12 21 6 3 2. + <_> + + <_> + 11 1 4 20 -1. + <_> + 13 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 1 16 10 8 -1. + <_> + 1 16 5 4 2. + <_> + 6 20 5 4 2. + <_> + + <_> + 11 1 4 20 -1. + <_> + 13 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 1 0 3 19 -1. + <_> + 2 0 1 19 3. + <_> + + <_> + 11 1 4 20 -1. + <_> + 13 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 0 1 6 9 -1. + <_> + 2 1 2 9 3. + <_> + + <_> + 3 7 19 4 -1. + <_> + 3 9 19 2 2. + <_> + + <_> + 7 14 9 6 -1. + <_> + 7 16 9 2 3. + <_> + + <_> + 17 1 7 6 -1. + <_> + 17 4 7 3 2. + <_> + + <_> + 5 0 14 8 -1. + <_> + 5 4 14 4 2. + <_> + + <_> + 16 1 8 6 -1. + <_> + 16 4 8 3 2. + <_> + + <_> + 0 1 8 6 -1. + <_> + 0 4 8 3 2. + <_> + + <_> + 6 0 18 4 -1. + <_> + 15 0 9 2 2. + <_> + 6 2 9 2 2. + <_> + + <_> + 0 14 9 6 -1. + <_> + 0 16 9 2 3. + <_> + + <_> + 3 7 18 8 -1. + <_> + 9 7 6 8 3. + <_> + + <_> + 2 11 6 9 -1. + <_> + 4 11 2 9 3. + <_> + + <_> + 10 5 6 9 -1. + <_> + 12 5 2 9 3. + <_> + + <_> + 10 6 4 18 -1. + <_> + 10 6 2 9 2. + <_> + 12 15 2 9 2. + <_> + + <_> + 11 1 4 20 -1. + <_> + 13 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 9 1 4 20 -1. + <_> + 9 1 2 10 2. + <_> + 11 11 2 10 2. + <_> + + <_> + 5 9 18 6 -1. + <_> + 14 9 9 3 2. + <_> + 5 12 9 3 2. + <_> + + <_> + 6 4 6 9 -1. + <_> + 8 4 2 9 3. + <_> + + <_> + 10 16 8 6 -1. + <_> + 10 16 4 6 2. + <_> + + <_> + 0 0 18 8 -1. + <_> + 0 0 9 4 2. + <_> + 9 4 9 4 2. + <_> + + <_> + 6 5 14 12 -1. + <_> + 13 5 7 6 2. + <_> + 6 11 7 6 2. + <_> + + <_> + 4 3 15 7 -1. + <_> + 9 3 5 7 3. + <_> + + <_> + 14 12 10 6 -1. + <_> + 14 14 10 2 3. + <_> + + <_> + 0 11 4 10 -1. + <_> + 0 16 4 5 2. + <_> + + <_> + 1 10 22 3 -1. + <_> + 1 11 22 1 3. + <_> + + <_> + 8 9 6 10 -1. + <_> + 10 9 2 10 3. + <_> + + <_> + 13 2 6 12 -1. + <_> + 16 2 3 6 2. + <_> + 13 8 3 6 2. + <_> + + <_> + 10 6 4 18 -1. + <_> + 10 6 2 9 2. + <_> + 12 15 2 9 2. + <_> + + <_> + 7 8 10 16 -1. + <_> + 12 8 5 8 2. + <_> + 7 16 5 8 2. + <_> + + <_> + 8 1 8 12 -1. + <_> + 8 1 4 6 2. + <_> + 12 7 4 6 2. + <_> + + <_> + 7 1 12 14 -1. + <_> + 13 1 6 7 2. + <_> + 7 8 6 7 2. + <_> + + <_> + 2 14 12 6 -1. + <_> + 2 16 12 2 3. + <_> + + <_> + 11 16 6 6 -1. + <_> + 11 19 6 3 2. + <_> + + <_> + 7 16 6 6 -1. + <_> + 7 19 6 3 2. + <_> + + <_> + 13 4 4 10 -1. + <_> + 13 4 2 10 2. + <_> + + <_> + 0 19 19 3 -1. + <_> + 0 20 19 1 3. + <_> + + <_> + 12 8 6 8 -1. + <_> + 12 12 6 4 2. + <_> + + <_> + 8 1 8 22 -1. + <_> + 8 12 8 11 2. + <_> + + <_> + 12 8 6 8 -1. + <_> + 12 12 6 4 2. + <_> + + <_> + 6 8 6 8 -1. + <_> + 6 12 6 4 2. + <_> + + <_> + 14 5 6 9 -1. + <_> + 14 8 6 3 3. + <_> + + <_> + 0 6 24 4 -1. + <_> + 0 8 24 2 2. + <_> + + <_> + 14 12 10 6 -1. + <_> + 14 14 10 2 3. + <_> + + <_> + 0 12 10 6 -1. + <_> + 0 14 10 2 3. + <_> + + <_> + 4 6 19 3 -1. + <_> + 4 7 19 1 3. + <_> + + <_> + 1 6 19 3 -1. + <_> + 1 7 19 1 3. + <_> + + <_> + 4 0 16 9 -1. + <_> + 4 3 16 3 3. + <_> + + <_> + 0 1 24 5 -1. + <_> + 8 1 8 5 3. + <_> + + <_> + 3 6 6 15 -1. + <_> + 3 11 6 5 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 6 22 18 2 -1. + <_> + 6 23 18 1 2. + <_> + + <_> + 2 12 6 9 -1. + <_> + 2 15 6 3 3. + <_> + + <_> + 18 12 6 9 -1. + <_> + 18 15 6 3 3. + <_> + + <_> + 0 12 6 9 -1. + <_> + 0 15 6 3 3. + <_> + + <_> + 11 14 4 10 -1. + <_> + 11 19 4 5 2. + <_> + + <_> + 9 6 6 16 -1. + <_> + 9 14 6 8 2. + <_> + + <_> + 7 7 10 10 -1. + <_> + 7 12 10 5 2. + <_> + + <_> + 1 3 6 13 -1. + <_> + 3 3 2 13 3. + <_> + + <_> + 18 1 6 13 -1. + <_> + 18 1 3 13 2. + <_> + + <_> + 5 1 6 9 -1. + <_> + 7 1 2 9 3. + <_> + + <_> + 18 2 6 11 -1. + <_> + 18 2 3 11 2. + <_> + + <_> + 0 2 6 11 -1. + <_> + 3 2 3 11 2. + <_> + + <_> + 9 12 15 6 -1. + <_> + 9 14 15 2 3. + <_> + + <_> + 2 2 20 3 -1. + <_> + 2 3 20 1 3. + <_> + + <_> + 10 6 4 9 -1. + <_> + 10 6 2 9 2. + <_> + + <_> + 5 6 12 14 -1. + <_> + 5 6 6 7 2. + <_> + 11 13 6 7 2. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 7 0 9 6 -1. + <_> + 10 0 3 6 3. + <_> + + <_> + 10 6 6 9 -1. + <_> + 12 6 2 9 3. + <_> + + <_> + 4 1 12 20 -1. + <_> + 4 1 6 10 2. + <_> + 10 11 6 10 2. + <_> + + <_> + 6 7 18 3 -1. + <_> + 6 7 9 3 2. + <_> + + <_> + 0 7 18 3 -1. + <_> + 9 7 9 3 2. + <_> + + <_> + 3 20 18 3 -1. + <_> + 9 20 6 3 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 6 2 12 15 -1. + <_> + 10 2 4 15 3. + <_> + + <_> + 2 3 18 3 -1. + <_> + 2 4 18 1 3. + <_> + + <_> + 19 4 4 18 -1. + <_> + 21 4 2 9 2. + <_> + 19 13 2 9 2. + <_> + + <_> + 0 1 19 3 -1. + <_> + 0 2 19 1 3. + <_> + + <_> + 5 0 15 4 -1. + <_> + 5 2 15 2 2. + <_> + + <_> + 5 2 14 5 -1. + <_> + 12 2 7 5 2. + <_> + + <_> + 1 2 22 14 -1. + <_> + 1 2 11 14 2. + <_> + + <_> + 8 15 6 9 -1. + <_> + 10 15 2 9 3. + <_> + + <_> + 6 17 18 3 -1. + <_> + 6 18 18 1 3. + <_> + + <_> + 9 6 3 18 -1. + <_> + 9 12 3 6 3. + <_> + + <_> + 2 0 20 3 -1. + <_> + 2 1 20 1 3. + <_> + + <_> + 5 4 5 12 -1. + <_> + 5 8 5 4 3. + <_> + + <_> + 8 6 12 5 -1. + <_> + 12 6 4 5 3. + <_> + + <_> + 9 12 6 12 -1. + <_> + 9 12 3 6 2. + <_> + 12 18 3 6 2. + <_> + + <_> + 14 14 8 10 -1. + <_> + 18 14 4 5 2. + <_> + 14 19 4 5 2. + <_> + + <_> + 2 14 8 10 -1. + <_> + 2 14 4 5 2. + <_> + 6 19 4 5 2. + <_> + + <_> + 10 18 12 6 -1. + <_> + 16 18 6 3 2. + <_> + 10 21 6 3 2. + <_> + + <_> + 1 3 6 9 -1. + <_> + 1 6 6 3 3. + <_> + + <_> + 11 3 3 20 -1. + <_> + 12 3 1 20 3. + <_> + + <_> + 4 6 14 6 -1. + <_> + 4 6 7 3 2. + <_> + 11 9 7 3 2. + <_> + + <_> + 6 5 12 13 -1. + <_> + 10 5 4 13 3. + <_> + + <_> + 5 4 4 15 -1. + <_> + 5 9 4 5 3. + <_> + + <_> + 9 16 15 4 -1. + <_> + 14 16 5 4 3. + <_> + + <_> + 7 8 6 14 -1. + <_> + 7 8 3 7 2. + <_> + 10 15 3 7 2. + <_> + + <_> + 7 6 10 6 -1. + <_> + 7 8 10 2 3. + <_> + + <_> + 2 5 18 3 -1. + <_> + 2 6 18 1 3. + <_> + + <_> + 5 1 15 8 -1. + <_> + 5 5 15 4 2. + <_> + + <_> + 7 1 8 18 -1. + <_> + 7 10 8 9 2. + <_> + + <_> + 0 10 24 3 -1. + <_> + 0 11 24 1 3. + <_> + + <_> + 0 2 6 13 -1. + <_> + 2 2 2 13 3. + <_> + + <_> + 16 0 8 10 -1. + <_> + 20 0 4 5 2. + <_> + 16 5 4 5 2. + <_> + + <_> + 5 1 10 9 -1. + <_> + 5 4 10 3 3. + <_> + + <_> + 5 6 18 3 -1. + <_> + 5 7 18 1 3. + <_> + + <_> + 0 1 24 3 -1. + <_> + 0 2 24 1 3. + <_> + + <_> + 11 4 6 11 -1. + <_> + 13 4 2 11 3. + <_> + + <_> + 0 0 8 10 -1. + <_> + 0 0 4 5 2. + <_> + 4 5 4 5 2. + <_> + + <_> + 4 16 18 3 -1. + <_> + 4 17 18 1 3. + <_> + + <_> + 2 16 18 3 -1. + <_> + 2 17 18 1 3. + <_> + + <_> + 3 0 18 10 -1. + <_> + 12 0 9 5 2. + <_> + 3 5 9 5 2. + <_> + + <_> + 2 3 20 21 -1. + <_> + 12 3 10 21 2. + <_> + + <_> + 6 7 14 3 -1. + <_> + 6 7 7 3 2. + <_> + + <_> + 0 9 12 6 -1. + <_> + 0 9 6 3 2. + <_> + 6 12 6 3 2. + <_> + + <_> + 3 14 21 4 -1. + <_> + 10 14 7 4 3. + <_> + + <_> + 0 14 21 4 -1. + <_> + 7 14 7 4 3. + <_> + + <_> + 5 21 18 3 -1. + <_> + 11 21 6 3 3. + <_> + + <_> + 1 21 18 3 -1. + <_> + 7 21 6 3 3. + <_> + + <_> + 19 4 4 18 -1. + <_> + 21 4 2 9 2. + <_> + 19 13 2 9 2. + <_> + + <_> + 3 7 18 3 -1. + <_> + 3 8 18 1 3. + <_> + + <_> + 19 4 4 18 -1. + <_> + 21 4 2 9 2. + <_> + 19 13 2 9 2. + <_> + + <_> + 7 15 10 6 -1. + <_> + 7 17 10 2 3. + <_> + + <_> + 9 13 11 9 -1. + <_> + 9 16 11 3 3. + <_> + + <_> + 0 6 4 10 -1. + <_> + 0 11 4 5 2. + <_> + + <_> + 15 16 9 6 -1. + <_> + 15 18 9 2 3. + <_> + + <_> + 1 5 4 18 -1. + <_> + 1 5 2 9 2. + <_> + 3 14 2 9 2. + <_> + + <_> + 9 8 8 10 -1. + <_> + 13 8 4 5 2. + <_> + 9 13 4 5 2. + <_> + + <_> + 7 8 8 10 -1. + <_> + 7 8 4 5 2. + <_> + 11 13 4 5 2. + <_> + + <_> + 9 8 12 5 -1. + <_> + 13 8 4 5 3. + <_> + + <_> + 7 8 9 7 -1. + <_> + 10 8 3 7 3. + <_> + + <_> + 9 8 12 5 -1. + <_> + 13 8 4 5 3. + <_> + + <_> + 7 6 9 7 -1. + <_> + 10 6 3 7 3. + <_> + + <_> + 9 8 12 5 -1. + <_> + 13 8 4 5 3. + <_> + + <_> + 10 5 4 18 -1. + <_> + 10 11 4 6 3. + <_> + + <_> + 5 5 14 12 -1. + <_> + 5 11 14 6 2. + <_> + + <_> + 0 1 11 4 -1. + <_> + 0 3 11 2 2. + <_> + + <_> + 9 10 6 10 -1. + <_> + 11 10 2 10 3. + <_> + + <_> + 2 17 11 6 -1. + <_> + 2 19 11 2 3. + <_> + + <_> + 15 16 9 6 -1. + <_> + 15 18 9 2 3. + <_> + + <_> + 1 10 18 2 -1. + <_> + 1 11 18 1 2. + <_> + + <_> + 6 4 12 13 -1. + <_> + 10 4 4 13 3. + <_> + + <_> + 0 18 18 3 -1. + <_> + 0 19 18 1 3. + <_> + + <_> + 6 18 18 3 -1. + <_> + 6 19 18 1 3. + <_> + + <_> + 0 16 9 6 -1. + <_> + 0 18 9 2 3. + <_> + + <_> + 13 15 9 6 -1. + <_> + 13 17 9 2 3. + <_> + + <_> + 2 15 9 6 -1. + <_> + 2 17 9 2 3. + <_> + + <_> + 13 1 6 16 -1. + <_> + 13 1 3 16 2. + <_> + + <_> + 5 1 6 16 -1. + <_> + 8 1 3 16 2. + <_> + + <_> + 11 5 6 10 -1. + <_> + 13 5 2 10 3. + <_> + + <_> + 7 5 6 10 -1. + <_> + 9 5 2 10 3. + <_> + + <_> + 10 0 6 24 -1. + <_> + 12 0 2 24 3. + <_> + + <_> + 3 4 4 20 -1. + <_> + 3 4 2 10 2. + <_> + 5 14 2 10 2. + <_> + + <_> + 14 0 6 9 -1. + <_> + 16 0 2 9 3. + <_> + + <_> + 4 0 6 9 -1. + <_> + 6 0 2 9 3. + <_> + + <_> + 4 5 18 5 -1. + <_> + 10 5 6 5 3. + <_> + + <_> + 5 6 6 9 -1. + <_> + 7 6 2 9 3. + <_> + + <_> + 7 2 15 8 -1. + <_> + 12 2 5 8 3. + <_> + + <_> + 2 2 15 8 -1. + <_> + 7 2 5 8 3. + <_> + + <_> + 10 0 4 9 -1. + <_> + 10 0 2 9 2. + <_> + + <_> + 3 4 6 12 -1. + <_> + 3 4 3 6 2. + <_> + 6 10 3 6 2. + <_> + + <_> + 16 0 8 18 -1. + <_> + 16 0 4 18 2. + <_> + + <_> + 0 0 8 18 -1. + <_> + 4 0 4 18 2. + <_> + + <_> + 0 7 24 6 -1. + <_> + 0 9 24 2 3. + <_> + + <_> + 4 7 14 3 -1. + <_> + 11 7 7 3 2. + <_> + + <_> + 10 8 8 15 -1. + <_> + 10 8 4 15 2. + <_> + + <_> + 7 0 10 14 -1. + <_> + 12 0 5 14 2. + <_> + + <_> + 13 10 8 10 -1. + <_> + 17 10 4 5 2. + <_> + 13 15 4 5 2. + <_> + + <_> + 3 0 4 9 -1. + <_> + 5 0 2 9 2. + <_> + + <_> + 16 1 6 8 -1. + <_> + 16 1 3 8 2. + <_> + + <_> + 2 1 6 8 -1. + <_> + 5 1 3 8 2. + <_> + + <_> + 3 6 18 12 -1. + <_> + 3 10 18 4 3. + <_> + + <_> + 4 12 16 4 -1. + <_> + 4 14 16 2 2. + <_> + + <_> + 4 9 16 15 -1. + <_> + 4 14 16 5 3. + <_> + + <_> + 3 10 8 10 -1. + <_> + 3 10 4 5 2. + <_> + 7 15 4 5 2. + <_> + + <_> + 8 18 16 6 -1. + <_> + 16 18 8 3 2. + <_> + 8 21 8 3 2. + <_> + + <_> + 2 16 12 5 -1. + <_> + 6 16 4 5 3. + <_> + + <_> + 14 14 9 4 -1. + <_> + 14 16 9 2 2. + <_> + + <_> + 7 14 9 6 -1. + <_> + 7 16 9 2 3. + <_> + + <_> + 4 10 16 12 -1. + <_> + 4 14 16 4 3. + <_> + + <_> + 0 13 19 6 -1. + <_> + 0 15 19 2 3. + <_> + + <_> + 10 13 9 6 -1. + <_> + 10 15 9 2 3. + <_> + + <_> + 5 0 3 23 -1. + <_> + 6 0 1 23 3. + <_> + + <_> + 0 8 24 6 -1. + <_> + 0 10 24 2 3. + <_> + + <_> + 0 5 5 12 -1. + <_> + 0 9 5 4 3. + <_> + + <_> + 3 0 19 18 -1. + <_> + 3 9 19 9 2. + <_> + + <_> + 9 11 6 12 -1. + <_> + 9 11 3 6 2. + <_> + 12 17 3 6 2. + <_> + + <_> + 0 5 24 8 -1. + <_> + 12 5 12 4 2. + <_> + 0 9 12 4 2. + <_> + + <_> + 6 18 9 4 -1. + <_> + 6 20 9 2 2. + <_> + + <_> + 8 8 10 6 -1. + <_> + 8 10 10 2 3. + <_> + + <_> + 2 7 20 3 -1. + <_> + 2 8 20 1 3. + <_> + + <_> + 12 0 7 20 -1. + <_> + 12 10 7 10 2. + <_> + + <_> + 5 0 7 20 -1. + <_> + 5 10 7 10 2. + <_> + + <_> + 14 2 2 18 -1. + <_> + 14 11 2 9 2. + <_> + + <_> + 5 8 10 12 -1. + <_> + 10 8 5 12 2. + <_> + + <_> + 6 9 12 8 -1. + <_> + 12 9 6 4 2. + <_> + 6 13 6 4 2. + <_> + + <_> + 7 7 3 14 -1. + <_> + 7 14 3 7 2. + <_> + + <_> + 11 2 12 16 -1. + <_> + 17 2 6 8 2. + <_> + 11 10 6 8 2. + <_> + + <_> + 7 0 6 9 -1. + <_> + 9 0 2 9 3. + <_> + + <_> + 13 14 9 4 -1. + <_> + 13 16 9 2 2. + <_> + + <_> + 0 12 22 4 -1. + <_> + 0 12 11 2 2. + <_> + 11 14 11 2 2. + <_> + + <_> + 1 12 22 6 -1. + <_> + 12 12 11 3 2. + <_> + 1 15 11 3 2. + <_> + + <_> + 6 6 9 6 -1. + <_> + 9 6 3 6 3. + <_> + + <_> + 10 0 4 9 -1. + <_> + 10 0 2 9 2. + <_> + + <_> + 3 8 18 7 -1. + <_> + 9 8 6 7 3. + <_> + + <_> + 0 6 24 6 -1. + <_> + 0 8 24 2 3. + <_> + + <_> + 0 11 24 10 -1. + <_> + 8 11 8 10 3. + <_> + + <_> + 3 3 18 21 -1. + <_> + 9 3 6 21 3. + <_> + + <_> + 7 12 4 10 -1. + <_> + 9 12 2 10 2. + <_> + + <_> + 10 16 10 8 -1. + <_> + 15 16 5 4 2. + <_> + 10 20 5 4 2. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 12 10 6 12 -1. + <_> + 15 10 3 6 2. + <_> + 12 16 3 6 2. + <_> + + <_> + 6 10 6 12 -1. + <_> + 6 10 3 6 2. + <_> + 9 16 3 6 2. + <_> + + <_> + 16 12 6 12 -1. + <_> + 19 12 3 6 2. + <_> + 16 18 3 6 2. + <_> + + <_> + 2 12 6 12 -1. + <_> + 2 12 3 6 2. + <_> + 5 18 3 6 2. + <_> + + <_> + 10 15 6 9 -1. + <_> + 12 15 2 9 3. + <_> + + <_> + 8 15 6 9 -1. + <_> + 10 15 2 9 3. + <_> + + <_> + 14 20 10 4 -1. + <_> + 14 20 5 4 2. + <_> + + <_> + 0 20 10 4 -1. + <_> + 5 20 5 4 2. + <_> + + <_> + 11 17 9 6 -1. + <_> + 11 19 9 2 3. + <_> + + <_> + 3 2 14 4 -1. + <_> + 3 4 14 2 2. + <_> + + <_> + 10 1 10 4 -1. + <_> + 10 3 10 2 2. + <_> + + <_> + 0 15 10 4 -1. + <_> + 5 15 5 4 2. + <_> + + <_> + 19 2 3 19 -1. + <_> + 20 2 1 19 3. + <_> + + <_> + 4 12 9 8 -1. + <_> + 7 12 3 8 3. + <_> + + <_> + 4 7 5 12 -1. + <_> + 4 11 5 4 3. + <_> + + <_> + 0 1 24 3 -1. + <_> + 8 1 8 3 3. + <_> + + <_> + 6 8 12 4 -1. + <_> + 6 10 12 2 2. + <_> + + <_> + 19 3 4 10 -1. + <_> + 19 3 2 10 2. + <_> + + <_> + 0 6 9 6 -1. + <_> + 3 6 3 6 3. + <_> + + <_> + 18 0 6 22 -1. + <_> + 20 0 2 22 3. + <_> + + <_> + 0 0 6 22 -1. + <_> + 2 0 2 22 3. + <_> + + <_> + 5 15 19 3 -1. + <_> + 5 16 19 1 3. + <_> + + <_> + 10 7 4 15 -1. + <_> + 10 12 4 5 3. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 0 21 18 3 -1. + <_> + 0 22 18 1 3. + <_> + + <_> + 7 3 10 15 -1. + <_> + 7 8 10 5 3. + <_> + + <_> + 1 7 18 3 -1. + <_> + 1 8 18 1 3. + <_> + + <_> + 8 2 9 6 -1. + <_> + 11 2 3 6 3. + <_> + + <_> + 0 10 24 14 -1. + <_> + 0 17 24 7 2. + <_> + + <_> + 13 9 8 10 -1. + <_> + 17 9 4 5 2. + <_> + 13 14 4 5 2. + <_> + + <_> + 10 5 4 9 -1. + <_> + 12 5 2 9 2. + <_> + + <_> + 13 9 8 10 -1. + <_> + 17 9 4 5 2. + <_> + 13 14 4 5 2. + <_> + + <_> + 7 11 10 10 -1. + <_> + 7 11 5 5 2. + <_> + 12 16 5 5 2. + <_> + + <_> + 4 13 18 4 -1. + <_> + 13 13 9 2 2. + <_> + 4 15 9 2 2. + <_> + + <_> + 0 0 19 2 -1. + <_> + 0 1 19 1 2. + <_> + + <_> + 0 18 24 6 -1. + <_> + 8 18 8 6 3. + <_> + + <_> + 6 4 8 16 -1. + <_> + 6 12 8 8 2. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 10 10 2 2. + <_> + + <_> + 0 3 6 9 -1. + <_> + 0 6 6 3 3. + <_> + + <_> + 13 15 7 9 -1. + <_> + 13 18 7 3 3. + <_> + + <_> + 3 18 12 6 -1. + <_> + 3 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 12 14 6 9 -1. + <_> + 12 17 6 3 3. + <_> + + <_> + 2 15 15 8 -1. + <_> + 2 19 15 4 2. + <_> + + <_> + 9 6 6 16 -1. + <_> + 9 14 6 8 2. + <_> + + <_> + 6 6 7 12 -1. + <_> + 6 10 7 4 3. + <_> + + <_> + 14 6 6 9 -1. + <_> + 14 9 6 3 3. + <_> + + <_> + 5 14 6 9 -1. + <_> + 5 17 6 3 3. + <_> + + <_> + 10 8 6 9 -1. + <_> + 12 8 2 9 3. + <_> + + <_> + 6 6 4 18 -1. + <_> + 6 6 2 9 2. + <_> + 8 15 2 9 2. + <_> + + <_> + 14 9 6 12 -1. + <_> + 17 9 3 6 2. + <_> + 14 15 3 6 2. + <_> + + <_> + 4 9 6 12 -1. + <_> + 4 9 3 6 2. + <_> + 7 15 3 6 2. + <_> + + <_> + 14 15 9 6 -1. + <_> + 14 17 9 2 3. + <_> + + <_> + 0 20 18 4 -1. + <_> + 0 20 9 2 2. + <_> + 9 22 9 2 2. + <_> + + <_> + 13 18 9 6 -1. + <_> + 13 20 9 2 3. + <_> + + <_> + 2 18 9 6 -1. + <_> + 2 20 9 2 3. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 19 2 4 22 -1. + <_> + 21 2 2 11 2. + <_> + 19 13 2 11 2. + <_> + + <_> + 1 2 4 22 -1. + <_> + 1 2 2 11 2. + <_> + 3 13 2 11 2. + <_> + + <_> + 15 0 2 24 -1. + <_> + 15 0 1 24 2. + <_> + + <_> + 3 20 16 4 -1. + <_> + 11 20 8 4 2. + <_> + + <_> + 11 6 4 18 -1. + <_> + 13 6 2 9 2. + <_> + 11 15 2 9 2. + <_> + + <_> + 7 9 10 14 -1. + <_> + 7 9 5 7 2. + <_> + 12 16 5 7 2. + <_> + + <_> + 14 6 6 9 -1. + <_> + 14 9 6 3 3. + <_> + + <_> + 3 6 7 9 -1. + <_> + 3 9 7 3 3. + <_> + + <_> + 20 4 4 20 -1. + <_> + 22 4 2 10 2. + <_> + 20 14 2 10 2. + <_> + + <_> + 7 6 6 9 -1. + <_> + 7 9 6 3 3. + <_> + + <_> + 7 0 10 14 -1. + <_> + 12 0 5 7 2. + <_> + 7 7 5 7 2. + <_> + + <_> + 2 1 18 6 -1. + <_> + 11 1 9 6 2. + <_> + + <_> + 15 0 2 24 -1. + <_> + 15 0 1 24 2. + <_> + + <_> + 7 0 2 24 -1. + <_> + 8 0 1 24 2. + <_> + + <_> + 13 12 6 7 -1. + <_> + 13 12 3 7 2. + <_> + + <_> + 5 12 6 7 -1. + <_> + 8 12 3 7 2. + <_> + + <_> + 3 5 18 19 -1. + <_> + 9 5 6 19 3. + <_> + + <_> + 5 6 9 6 -1. + <_> + 8 6 3 6 3. + <_> + + <_> + 9 5 9 6 -1. + <_> + 12 5 3 6 3. + <_> + + <_> + 3 16 10 8 -1. + <_> + 3 16 5 4 2. + <_> + 8 20 5 4 2. + <_> + + <_> + 19 8 5 15 -1. + <_> + 19 13 5 5 3. + <_> + + <_> + 0 8 5 15 -1. + <_> + 0 13 5 5 3. + <_> + + <_> + 20 4 4 20 -1. + <_> + 22 4 2 10 2. + <_> + 20 14 2 10 2. + <_> + + <_> + 0 4 4 20 -1. + <_> + 0 4 2 10 2. + <_> + 2 14 2 10 2. + <_> + + <_> + 7 7 10 4 -1. + <_> + 7 7 5 4 2. + <_> + + <_> + 4 19 14 4 -1. + <_> + 11 19 7 4 2. + <_> + + <_> + 10 11 12 3 -1. + <_> + 10 11 6 3 2. + <_> + + <_> + 0 1 24 3 -1. + <_> + 0 2 24 1 3. + <_> + + <_> + 7 2 14 20 -1. + <_> + 14 2 7 10 2. + <_> + 7 12 7 10 2. + <_> + + <_> + 0 13 6 9 -1. + <_> + 2 13 2 9 3. + <_> + + <_> + 13 0 4 19 -1. + <_> + 13 0 2 19 2. + <_> + + <_> + 1 11 14 3 -1. + <_> + 8 11 7 3 2. + <_> + + <_> + 7 1 16 20 -1. + <_> + 15 1 8 10 2. + <_> + 7 11 8 10 2. + <_> + + <_> + 0 10 21 9 -1. + <_> + 7 10 7 9 3. + <_> + + <_> + 6 19 15 5 -1. + <_> + 11 19 5 5 3. + <_> + + <_> + 8 10 6 6 -1. + <_> + 11 10 3 6 2. + <_> + + <_> + 7 1 16 20 -1. + <_> + 15 1 8 10 2. + <_> + 7 11 8 10 2. + <_> + + <_> + 1 1 16 20 -1. + <_> + 1 1 8 10 2. + <_> + 9 11 8 10 2. + <_> + + <_> + 16 4 3 12 -1. + <_> + 16 10 3 6 2. + <_> + + <_> + 5 4 3 12 -1. + <_> + 5 10 3 6 2. + <_> + + <_> + 7 6 10 8 -1. + <_> + 12 6 5 4 2. + <_> + 7 10 5 4 2. + <_> + + <_> + 4 9 6 6 -1. + <_> + 4 12 6 3 2. + <_> + + <_> + 6 5 12 4 -1. + <_> + 6 7 12 2 2. + <_> + + <_> + 9 2 5 15 -1. + <_> + 9 7 5 5 3. + <_> + + <_> + 15 0 9 6 -1. + <_> + 15 2 9 2 3. + <_> + + <_> + 6 0 11 10 -1. + <_> + 6 5 11 5 2. + <_> + + <_> + 12 7 4 12 -1. + <_> + 12 13 4 6 2. + <_> + + <_> + 7 2 9 4 -1. + <_> + 7 4 9 2 2. + <_> + + <_> + 6 0 13 6 -1. + <_> + 6 2 13 2 3. + <_> + + <_> + 10 6 4 18 -1. + <_> + 10 6 2 9 2. + <_> + 12 15 2 9 2. + <_> + + <_> + 10 8 6 9 -1. + <_> + 12 8 2 9 3. + <_> + + <_> + 3 18 10 6 -1. + <_> + 3 20 10 2 3. + <_> + + <_> + 4 14 20 3 -1. + <_> + 4 15 20 1 3. + <_> + + <_> + 2 15 9 6 -1. + <_> + 2 17 9 2 3. + <_> + + <_> + 13 0 4 19 -1. + <_> + 13 0 2 19 2. + <_> + + <_> + 7 0 4 19 -1. + <_> + 9 0 2 19 2. + <_> + + <_> + 1 4 22 2 -1. + <_> + 1 5 22 1 2. + <_> + + <_> + 0 0 9 6 -1. + <_> + 0 2 9 2 3. + <_> + + <_> + 0 0 24 18 -1. + <_> + 0 9 24 9 2. + <_> + + <_> + 3 2 16 8 -1. + <_> + 3 6 16 4 2. + <_> + + <_> + 3 6 18 6 -1. + <_> + 3 8 18 2 3. + <_> + + <_> + 3 1 6 10 -1. + <_> + 5 1 2 10 3. + <_> + + <_> + 13 0 9 6 -1. + <_> + 16 0 3 6 3. + <_> + + <_> + 2 0 9 6 -1. + <_> + 5 0 3 6 3. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 6 0 7 10 -1. + <_> + 6 5 7 5 2. + <_> + + <_> + 2 2 20 4 -1. + <_> + 12 2 10 2 2. + <_> + 2 4 10 2 2. + <_> + + <_> + 2 11 19 3 -1. + <_> + 2 12 19 1 3. + <_> + + <_> + 10 8 6 9 -1. + <_> + 12 8 2 9 3. + <_> + + <_> + 8 8 6 9 -1. + <_> + 10 8 2 9 3. + <_> + + <_> + 13 8 4 9 -1. + <_> + 13 8 2 9 2. + <_> + + <_> + 3 11 9 9 -1. + <_> + 6 11 3 9 3. + <_> + + <_> + 3 9 18 5 -1. + <_> + 9 9 6 5 3. + <_> + + <_> + 2 4 2 20 -1. + <_> + 2 14 2 10 2. + <_> + + <_> + 14 17 8 6 -1. + <_> + 14 20 8 3 2. + <_> + + <_> + 3 21 18 2 -1. + <_> + 3 22 18 1 2. + <_> + + <_> + 5 4 15 6 -1. + <_> + 10 4 5 6 3. + <_> + + <_> + 2 15 12 6 -1. + <_> + 2 17 12 2 3. + <_> + + <_> + 17 8 6 9 -1. + <_> + 17 11 6 3 3. + <_> + + <_> + 2 12 20 4 -1. + <_> + 2 12 10 2 2. + <_> + 12 14 10 2 2. + <_> + + <_> + 0 17 24 6 -1. + <_> + 0 19 24 2 3. + <_> + + <_> + 7 16 9 4 -1. + <_> + 7 18 9 2 2. + <_> + + <_> + 15 1 4 22 -1. + <_> + 17 1 2 11 2. + <_> + 15 12 2 11 2. + <_> + + <_> + 5 1 4 22 -1. + <_> + 5 1 2 11 2. + <_> + 7 12 2 11 2. + <_> + + <_> + 11 13 8 9 -1. + <_> + 11 16 8 3 3. + <_> + + <_> + 6 1 6 9 -1. + <_> + 8 1 2 9 3. + <_> + + <_> + 11 4 3 18 -1. + <_> + 11 10 3 6 3. + <_> + + <_> + 5 8 12 6 -1. + <_> + 5 8 6 3 2. + <_> + 11 11 6 3 2. + <_> + + <_> + 15 7 5 8 -1. + <_> + 15 11 5 4 2. + <_> + + <_> + 4 7 5 8 -1. + <_> + 4 11 5 4 2. + <_> + + <_> + 12 6 6 12 -1. + <_> + 15 6 3 6 2. + <_> + 12 12 3 6 2. + <_> + + <_> + 6 6 6 12 -1. + <_> + 6 6 3 6 2. + <_> + 9 12 3 6 2. + <_> + + <_> + 5 9 14 8 -1. + <_> + 12 9 7 4 2. + <_> + 5 13 7 4 2. + <_> + + <_> + 9 1 3 14 -1. + <_> + 9 8 3 7 2. + <_> + + <_> + 12 6 6 12 -1. + <_> + 12 10 6 4 3. + <_> + + <_> + 4 5 4 18 -1. + <_> + 4 5 2 9 2. + <_> + 6 14 2 9 2. + <_> + + <_> + 4 6 16 18 -1. + <_> + 4 12 16 6 3. + <_> + + <_> + 5 4 7 20 -1. + <_> + 5 14 7 10 2. + <_> + + <_> + 14 8 8 12 -1. + <_> + 14 14 8 6 2. + <_> + + <_> + 9 10 6 14 -1. + <_> + 9 10 3 7 2. + <_> + 12 17 3 7 2. + <_> + + <_> + 9 5 9 6 -1. + <_> + 12 5 3 6 3. + <_> + + <_> + 9 4 3 18 -1. + <_> + 10 4 1 18 3. + <_> + + <_> + 1 4 22 14 -1. + <_> + 12 4 11 7 2. + <_> + 1 11 11 7 2. + <_> + + <_> + 2 7 18 2 -1. + <_> + 2 8 18 1 2. + <_> + + <_> + 12 6 6 12 -1. + <_> + 12 10 6 4 3. + <_> + + <_> + 6 5 9 7 -1. + <_> + 9 5 3 7 3. + <_> + + <_> + 12 7 4 12 -1. + <_> + 12 13 4 6 2. + <_> + + <_> + 8 7 4 12 -1. + <_> + 8 13 4 6 2. + <_> + + <_> + 7 2 10 22 -1. + <_> + 7 13 10 11 2. + <_> + + <_> + 0 1 3 20 -1. + <_> + 1 1 1 20 3. + <_> + + <_> + 4 13 18 4 -1. + <_> + 13 13 9 2 2. + <_> + 4 15 9 2 2. + <_> + + <_> + 2 13 18 4 -1. + <_> + 2 13 9 2 2. + <_> + 11 15 9 2 2. + <_> + + <_> + 15 15 9 6 -1. + <_> + 15 17 9 2 3. + <_> + + <_> + 0 15 9 6 -1. + <_> + 0 17 9 2 3. + <_> + + <_> + 6 0 18 24 -1. + <_> + 15 0 9 12 2. + <_> + 6 12 9 12 2. + <_> + + <_> + 6 6 6 12 -1. + <_> + 6 10 6 4 3. + <_> + + <_> + 8 7 10 4 -1. + <_> + 8 9 10 2 2. + <_> + + <_> + 1 9 18 6 -1. + <_> + 1 9 9 3 2. + <_> + 10 12 9 3 2. + <_> + + <_> + 6 6 18 3 -1. + <_> + 6 7 18 1 3. + <_> + + <_> + 7 7 9 8 -1. + <_> + 10 7 3 8 3. + <_> + + <_> + 10 12 6 12 -1. + <_> + 12 12 2 12 3. + <_> + + <_> + 3 14 18 3 -1. + <_> + 3 15 18 1 3. + <_> + + <_> + 15 17 9 7 -1. + <_> + 18 17 3 7 3. + <_> + + <_> + 1 12 10 6 -1. + <_> + 1 14 10 2 3. + <_> + + <_> + 15 17 9 7 -1. + <_> + 18 17 3 7 3. + <_> + + <_> + 10 3 3 19 -1. + <_> + 11 3 1 19 3. + <_> + + <_> + 15 17 9 7 -1. + <_> + 18 17 3 7 3. + <_> + + <_> + 6 1 11 9 -1. + <_> + 6 4 11 3 3. + <_> + + <_> + 15 17 9 7 -1. + <_> + 18 17 3 7 3. + <_> + + <_> + 6 5 11 6 -1. + <_> + 6 8 11 3 2. + <_> + + <_> + 16 7 8 5 -1. + <_> + 16 7 4 5 2. + <_> + + <_> + 2 4 20 19 -1. + <_> + 12 4 10 19 2. + <_> + + <_> + 2 1 21 6 -1. + <_> + 9 1 7 6 3. + <_> + + <_> + 6 5 12 14 -1. + <_> + 6 5 6 7 2. + <_> + 12 12 6 7 2. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 2 11 8 5 -1. + <_> + 6 11 4 5 2. + <_> + + <_> + 16 7 8 5 -1. + <_> + 16 7 4 5 2. + <_> + + <_> + 0 7 8 5 -1. + <_> + 4 7 4 5 2. + <_> + + <_> + 15 17 9 7 -1. + <_> + 18 17 3 7 3. + <_> + + <_> + 8 6 8 10 -1. + <_> + 8 6 4 5 2. + <_> + 12 11 4 5 2. + <_> + + <_> + 15 15 9 9 -1. + <_> + 18 15 3 9 3. + <_> + + <_> + 0 15 9 9 -1. + <_> + 3 15 3 9 3. + <_> + + <_> + 12 10 9 7 -1. + <_> + 15 10 3 7 3. + <_> + + <_> + 3 10 9 7 -1. + <_> + 6 10 3 7 3. + <_> + + <_> + 13 15 10 8 -1. + <_> + 18 15 5 4 2. + <_> + 13 19 5 4 2. + <_> + + <_> + 0 1 6 12 -1. + <_> + 0 1 3 6 2. + <_> + 3 7 3 6 2. + <_> + + <_> + 10 0 6 12 -1. + <_> + 13 0 3 6 2. + <_> + 10 6 3 6 2. + <_> + + <_> + 7 0 10 12 -1. + <_> + 7 0 5 6 2. + <_> + 12 6 5 6 2. + <_> + + <_> + 4 1 16 8 -1. + <_> + 4 1 8 8 2. + <_> + + <_> + 0 21 19 3 -1. + <_> + 0 22 19 1 3. + <_> + + <_> + 6 9 18 4 -1. + <_> + 15 9 9 2 2. + <_> + 6 11 9 2 2. + <_> + + <_> + 3 4 9 6 -1. + <_> + 3 6 9 2 3. + <_> + + <_> + 9 1 6 15 -1. + <_> + 9 6 6 5 3. + <_> + + <_> + 5 9 6 6 -1. + <_> + 8 9 3 6 2. + <_> + + <_> + 5 1 14 9 -1. + <_> + 5 4 14 3 3. + <_> + + <_> + 3 0 8 20 -1. + <_> + 3 0 4 10 2. + <_> + 7 10 4 10 2. + <_> + + <_> + 5 0 7 9 -1. + <_> + 5 3 7 3 3. + <_> + + <_> + 6 6 12 5 -1. + <_> + 10 6 4 5 3. + <_> + + <_> + 0 1 8 14 -1. + <_> + 4 1 4 14 2. + <_> + + <_> + 2 12 22 4 -1. + <_> + 2 14 22 2 2. + <_> + + <_> + 8 17 6 6 -1. + <_> + 8 20 6 3 2. + <_> + + <_> + 18 1 6 7 -1. + <_> + 18 1 3 7 2. + <_> + + <_> + 0 0 6 6 -1. + <_> + 3 0 3 6 2. + <_> + + <_> + 4 6 17 18 -1. + <_> + 4 12 17 6 3. + <_> + + <_> + 6 0 12 6 -1. + <_> + 6 0 6 3 2. + <_> + 12 3 6 3 2. + <_> + + <_> + 4 7 18 4 -1. + <_> + 13 7 9 2 2. + <_> + 4 9 9 2 2. + <_> + + <_> + 4 12 10 6 -1. + <_> + 4 14 10 2 3. + <_> + + <_> + 7 9 10 12 -1. + <_> + 12 9 5 6 2. + <_> + 7 15 5 6 2. + <_> + + <_> + 0 1 24 3 -1. + <_> + 8 1 8 3 3. + <_> + + <_> + 13 11 6 6 -1. + <_> + 13 11 3 6 2. + <_> + + <_> + 5 11 6 6 -1. + <_> + 8 11 3 6 2. + <_> + + <_> + 3 10 19 3 -1. + <_> + 3 11 19 1 3. + <_> + + <_> + 0 2 6 9 -1. + <_> + 0 5 6 3 3. + <_> + + <_> + 14 16 10 6 -1. + <_> + 14 18 10 2 3. + <_> + + <_> + 0 16 10 6 -1. + <_> + 0 18 10 2 3. + <_> + + <_> + 14 13 9 6 -1. + <_> + 14 15 9 2 3. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 0 18 9 6 -1. + <_> + 0 20 9 2 3. + <_> + + <_> + 14 13 9 6 -1. + <_> + 14 15 9 2 3. + <_> + + <_> + 6 2 6 9 -1. + <_> + 8 2 2 9 3. + <_> + + <_> + 15 8 4 12 -1. + <_> + 15 8 2 12 2. + <_> + + <_> + 8 13 8 8 -1. + <_> + 8 17 8 4 2. + <_> + + <_> + 4 20 18 3 -1. + <_> + 10 20 6 3 3. + <_> + + <_> + 5 8 4 12 -1. + <_> + 7 8 2 12 2. + <_> + + <_> + 7 7 12 3 -1. + <_> + 7 7 6 3 2. + <_> + + <_> + 10 6 4 9 -1. + <_> + 12 6 2 9 2. + <_> + + <_> + 5 20 18 3 -1. + <_> + 11 20 6 3 3. + <_> + + <_> + 1 20 18 3 -1. + <_> + 7 20 6 3 3. + <_> + + <_> + 18 1 6 20 -1. + <_> + 21 1 3 10 2. + <_> + 18 11 3 10 2. + <_> + + <_> + 0 1 6 20 -1. + <_> + 0 1 3 10 2. + <_> + 3 11 3 10 2. + <_> + + <_> + 13 3 4 18 -1. + <_> + 15 3 2 9 2. + <_> + 13 12 2 9 2. + <_> + + <_> + 0 2 6 12 -1. + <_> + 0 6 6 4 3. + <_> + + <_> + 12 9 12 6 -1. + <_> + 18 9 6 3 2. + <_> + 12 12 6 3 2. + <_> + + <_> + 7 3 4 18 -1. + <_> + 7 3 2 9 2. + <_> + 9 12 2 9 2. + <_> + + <_> + 14 0 6 9 -1. + <_> + 16 0 2 9 3. + <_> + + <_> + 0 9 12 6 -1. + <_> + 0 9 6 3 2. + <_> + 6 12 6 3 2. + <_> + + <_> + 14 4 8 20 -1. + <_> + 18 4 4 10 2. + <_> + 14 14 4 10 2. + <_> + + <_> + 2 4 8 20 -1. + <_> + 2 4 4 10 2. + <_> + 6 14 4 10 2. + <_> + + <_> + 14 13 9 6 -1. + <_> + 14 15 9 2 3. + <_> + + <_> + 1 13 9 6 -1. + <_> + 1 15 9 2 3. + <_> + + <_> + 3 15 18 3 -1. + <_> + 9 15 6 3 3. + <_> + + <_> + 5 13 9 6 -1. + <_> + 5 15 9 2 3. + <_> + + <_> + 5 0 18 3 -1. + <_> + 5 1 18 1 3. + <_> + + <_> + 8 2 6 7 -1. + <_> + 11 2 3 7 2. + <_> + + <_> + 9 1 9 6 -1. + <_> + 12 1 3 6 3. + <_> + + <_> + 6 1 9 6 -1. + <_> + 9 1 3 6 3. + <_> + + <_> + 5 6 14 6 -1. + <_> + 12 6 7 3 2. + <_> + 5 9 7 3 2. + <_> + + <_> + 8 2 6 13 -1. + <_> + 10 2 2 13 3. + <_> + + <_> + 6 11 12 6 -1. + <_> + 12 11 6 3 2. + <_> + 6 14 6 3 2. + <_> + + <_> + 3 1 18 15 -1. + <_> + 9 1 6 15 3. + <_> + + <_> + 13 0 6 7 -1. + <_> + 13 0 3 7 2. + <_> + + <_> + 3 3 16 6 -1. + <_> + 3 6 16 3 2. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 7 7 6 9 -1. + <_> + 9 7 2 9 3. + <_> + + <_> + 13 0 4 24 -1. + <_> + 13 0 2 24 2. + <_> + + <_> + 7 0 4 24 -1. + <_> + 9 0 2 24 2. + <_> + + <_> + 11 9 5 12 -1. + <_> + 11 13 5 4 3. + <_> + + <_> + 7 15 9 6 -1. + <_> + 7 17 9 2 3. + <_> + + <_> + 5 7 18 6 -1. + <_> + 5 9 18 2 3. + <_> + + <_> + 8 9 5 12 -1. + <_> + 8 13 5 4 3. + <_> + + <_> + 4 17 17 6 -1. + <_> + 4 19 17 2 3. + <_> + + <_> + 0 3 18 14 -1. + <_> + 0 3 9 7 2. + <_> + 9 10 9 7 2. + <_> + + <_> + 0 1 24 2 -1. + <_> + 0 2 24 1 2. + <_> + + <_> + 0 15 18 3 -1. + <_> + 0 16 18 1 3. + <_> + + <_> + 9 0 6 9 -1. + <_> + 11 0 2 9 3. + <_> + + <_> + 3 3 14 12 -1. + <_> + 3 9 14 6 2. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 8 0 6 9 -1. + <_> + 10 0 2 9 3. + <_> + + <_> + 10 6 6 10 -1. + <_> + 12 6 2 10 3. + <_> + + <_> + 5 0 6 9 -1. + <_> + 7 0 2 9 3. + <_> + + <_> + 2 0 21 7 -1. + <_> + 9 0 7 7 3. + <_> + + <_> + 6 11 12 5 -1. + <_> + 10 11 4 5 3. + <_> + + <_> + 8 7 9 8 -1. + <_> + 11 7 3 8 3. + <_> + + <_> + 9 6 6 18 -1. + <_> + 9 6 3 9 2. + <_> + 12 15 3 9 2. + <_> + + <_> + 15 14 8 10 -1. + <_> + 19 14 4 5 2. + <_> + 15 19 4 5 2. + <_> + + <_> + 1 14 8 10 -1. + <_> + 1 14 4 5 2. + <_> + 5 19 4 5 2. + <_> + + <_> + 11 0 8 10 -1. + <_> + 15 0 4 5 2. + <_> + 11 5 4 5 2. + <_> + + <_> + 5 0 8 10 -1. + <_> + 5 0 4 5 2. + <_> + 9 5 4 5 2. + <_> + + <_> + 6 1 12 5 -1. + <_> + 6 1 6 5 2. + <_> + + <_> + 1 12 18 2 -1. + <_> + 10 12 9 2 2. + <_> + + <_> + 2 8 20 6 -1. + <_> + 12 8 10 3 2. + <_> + 2 11 10 3 2. + <_> + + <_> + 7 6 9 7 -1. + <_> + 10 6 3 7 3. + <_> + + <_> + 10 5 8 16 -1. + <_> + 14 5 4 8 2. + <_> + 10 13 4 8 2. + <_> + + <_> + 3 9 16 8 -1. + <_> + 3 9 8 4 2. + <_> + 11 13 8 4 2. + <_> + + <_> + 7 8 10 4 -1. + <_> + 7 8 5 4 2. + <_> + + <_> + 7 12 10 8 -1. + <_> + 7 12 5 4 2. + <_> + 12 16 5 4 2. + <_> + + <_> + 9 19 15 4 -1. + <_> + 14 19 5 4 3. + <_> + + <_> + 1 0 18 9 -1. + <_> + 7 0 6 9 3. + <_> + + <_> + 13 4 10 8 -1. + <_> + 18 4 5 4 2. + <_> + 13 8 5 4 2. + <_> + + <_> + 3 16 18 4 -1. + <_> + 9 16 6 4 3. + <_> + + <_> + 8 7 10 12 -1. + <_> + 13 7 5 6 2. + <_> + 8 13 5 6 2. + <_> + + <_> + 6 7 10 12 -1. + <_> + 6 7 5 6 2. + <_> + 11 13 5 6 2. + <_> + + <_> + 4 6 18 7 -1. + <_> + 10 6 6 7 3. + <_> + + <_> + 0 17 18 3 -1. + <_> + 0 18 18 1 3. + <_> + + <_> + 3 17 18 3 -1. + <_> + 3 18 18 1 3. + <_> + + <_> + 2 4 6 10 -1. + <_> + 4 4 2 10 3. + <_> + + <_> + 16 0 8 24 -1. + <_> + 16 0 4 24 2. + <_> + + <_> + 4 0 8 15 -1. + <_> + 8 0 4 15 2. + <_> + + <_> + 16 0 8 24 -1. + <_> + 16 0 4 24 2. + <_> + + <_> + 1 4 18 9 -1. + <_> + 7 4 6 9 3. + <_> + + <_> + 15 12 9 6 -1. + <_> + 15 14 9 2 3. + <_> + + <_> + 3 9 18 6 -1. + <_> + 3 9 9 3 2. + <_> + 12 12 9 3 2. + <_> + + <_> + 18 5 6 9 -1. + <_> + 18 8 6 3 3. + <_> + + <_> + 0 5 6 9 -1. + <_> + 0 8 6 3 3. + <_> + + <_> + 4 7 18 4 -1. + <_> + 13 7 9 2 2. + <_> + 4 9 9 2 2. + <_> + + <_> + 2 1 12 20 -1. + <_> + 2 1 6 10 2. + <_> + 8 11 6 10 2. + <_> + + <_> + 17 0 6 23 -1. + <_> + 17 0 3 23 2. + <_> + + <_> + 1 6 2 18 -1. + <_> + 1 15 2 9 2. + <_> + + <_> + 8 8 10 6 -1. + <_> + 8 10 10 2 3. + <_> + + <_> + 0 6 20 6 -1. + <_> + 0 6 10 3 2. + <_> + 10 9 10 3 2. + <_> + + <_> + 11 12 12 5 -1. + <_> + 15 12 4 5 3. + <_> + + <_> + 0 4 3 19 -1. + <_> + 1 4 1 19 3. + <_> + + <_> + 19 1 3 18 -1. + <_> + 20 1 1 18 3. + <_> + + <_> + 2 1 3 18 -1. + <_> + 3 1 1 18 3. + <_> + + <_> + 3 10 18 3 -1. + <_> + 9 10 6 3 3. + <_> + + <_> + 4 4 10 9 -1. + <_> + 9 4 5 9 2. + <_> + + <_> + 7 13 14 7 -1. + <_> + 7 13 7 7 2. + <_> + + <_> + 3 13 14 7 -1. + <_> + 10 13 7 7 2. + <_> + + <_> + 8 15 9 6 -1. + <_> + 11 15 3 6 3. + <_> + + <_> + 4 14 8 10 -1. + <_> + 4 14 4 5 2. + <_> + 8 19 4 5 2. + <_> + + <_> + 10 14 4 10 -1. + <_> + 10 19 4 5 2. + <_> + + <_> + 3 8 5 16 -1. + <_> + 3 16 5 8 2. + <_> + + <_> + 15 10 9 6 -1. + <_> + 15 12 9 2 3. + <_> + + <_> + 0 10 9 6 -1. + <_> + 0 12 9 2 3. + <_> + + <_> + 6 7 12 9 -1. + <_> + 6 10 12 3 3. + <_> + + <_> + 9 10 5 8 -1. + <_> + 9 14 5 4 2. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 8 15 6 9 -1. + <_> + 10 15 2 9 3. + <_> + + <_> + 16 6 7 6 -1. + <_> + 16 9 7 3 2. + <_> + + <_> + 8 1 4 22 -1. + <_> + 10 1 2 22 2. + <_> + + <_> + 6 6 14 3 -1. + <_> + 6 6 7 3 2. + <_> + + <_> + 0 18 19 3 -1. + <_> + 0 19 19 1 3. + <_> + + <_> + 17 0 6 24 -1. + <_> + 17 0 3 24 2. + <_> + + <_> + 0 13 15 6 -1. + <_> + 5 13 5 6 3. + <_> + + <_> + 9 6 10 14 -1. + <_> + 14 6 5 7 2. + <_> + 9 13 5 7 2. + <_> + + <_> + 1 6 8 10 -1. + <_> + 1 6 4 5 2. + <_> + 5 11 4 5 2. + <_> + + <_> + 7 6 12 5 -1. + <_> + 7 6 6 5 2. + <_> + + <_> + 7 7 9 6 -1. + <_> + 10 7 3 6 3. + <_> + + <_> + 7 8 14 14 -1. + <_> + 14 8 7 7 2. + <_> + 7 15 7 7 2. + <_> + + <_> + 3 8 14 14 -1. + <_> + 3 8 7 7 2. + <_> + 10 15 7 7 2. + <_> + + <_> + 9 8 13 4 -1. + <_> + 9 10 13 2 2. + <_> + + <_> + 3 2 6 12 -1. + <_> + 3 2 3 6 2. + <_> + 6 8 3 6 2. + <_> + + <_> + 6 10 17 6 -1. + <_> + 6 13 17 3 2. + <_> + + <_> + 1 10 17 6 -1. + <_> + 1 13 17 3 2. + <_> + + <_> + 16 7 8 9 -1. + <_> + 16 10 8 3 3. + <_> + + <_> + 0 7 8 9 -1. + <_> + 0 10 8 3 3. + <_> + + <_> + 0 9 24 10 -1. + <_> + 12 9 12 5 2. + <_> + 0 14 12 5 2. + <_> + + <_> + 3 2 15 8 -1. + <_> + 8 2 5 8 3. + <_> + + <_> + 4 2 18 8 -1. + <_> + 10 2 6 8 3. + <_> + + <_> + 0 1 18 4 -1. + <_> + 0 1 9 2 2. + <_> + 9 3 9 2 2. + <_> + + <_> + 20 2 3 18 -1. + <_> + 21 2 1 18 3. + <_> + + <_> + 1 3 3 19 -1. + <_> + 2 3 1 19 3. + <_> + + <_> + 18 8 6 16 -1. + <_> + 20 8 2 16 3. + <_> + + <_> + 0 8 6 16 -1. + <_> + 2 8 2 16 3. + <_> + + <_> + 8 18 11 6 -1. + <_> + 8 20 11 2 3. + <_> + + <_> + 4 6 12 5 -1. + <_> + 8 6 4 5 3. + <_> + + <_> + 7 6 12 5 -1. + <_> + 11 6 4 5 3. + <_> + + <_> + 6 3 9 6 -1. + <_> + 9 3 3 6 3. + <_> + + <_> + 7 6 12 5 -1. + <_> + 7 6 6 5 2. + <_> + + <_> + 9 8 6 7 -1. + <_> + 12 8 3 7 2. + <_> + + <_> + 8 2 9 6 -1. + <_> + 11 2 3 6 3. + <_> + + <_> + 8 14 6 9 -1. + <_> + 8 17 6 3 3. + <_> + + <_> + 8 2 9 6 -1. + <_> + 11 2 3 6 3. + <_> + + <_> + 4 3 16 20 -1. + <_> + 4 3 8 10 2. + <_> + 12 13 8 10 2. + <_> + + <_> + 7 6 10 12 -1. + <_> + 12 6 5 6 2. + <_> + 7 12 5 6 2. + <_> + + <_> + 0 2 7 12 -1. + <_> + 0 6 7 4 3. + <_> + + <_> + 12 17 11 6 -1. + <_> + 12 19 11 2 3. + <_> + + <_> + 4 7 12 8 -1. + <_> + 4 7 6 4 2. + <_> + 10 11 6 4 2. + <_> + + <_> + 8 11 8 10 -1. + <_> + 12 11 4 5 2. + <_> + 8 16 4 5 2. + <_> + + <_> + 9 1 4 9 -1. + <_> + 11 1 2 9 2. + <_> + + <_> + 14 0 3 22 -1. + <_> + 15 0 1 22 3. + <_> + + <_> + 7 0 3 22 -1. + <_> + 8 0 1 22 3. + <_> + + <_> + 4 7 18 4 -1. + <_> + 13 7 9 2 2. + <_> + 4 9 9 2 2. + <_> + + <_> + 10 2 4 15 -1. + <_> + 10 7 4 5 3. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 0 0 18 13 -1. + <_> + 9 0 9 13 2. + <_> + + <_> + 16 0 3 24 -1. + <_> + 17 0 1 24 3. + <_> + + <_> + 5 0 3 24 -1. + <_> + 6 0 1 24 3. + <_> + + <_> + 10 15 5 8 -1. + <_> + 10 19 5 4 2. + <_> + + <_> + 2 18 18 2 -1. + <_> + 2 19 18 1 2. + <_> + + <_> + 2 8 20 3 -1. + <_> + 2 9 20 1 3. + <_> + + <_> + 7 6 9 6 -1. + <_> + 7 8 9 2 3. + <_> + + <_> + 3 2 19 10 -1. + <_> + 3 7 19 5 2. + <_> + + <_> + 2 7 19 3 -1. + <_> + 2 8 19 1 3. + <_> + + <_> + 15 6 9 4 -1. + <_> + 15 8 9 2 2. + <_> + + <_> + 2 2 18 8 -1. + <_> + 8 2 6 8 3. + <_> + + <_> + 10 9 14 4 -1. + <_> + 10 9 7 4 2. + <_> + + <_> + 4 4 6 16 -1. + <_> + 7 4 3 16 2. + <_> + + <_> + 15 8 9 16 -1. + <_> + 18 8 3 16 3. + <_> + + <_> + 0 8 9 16 -1. + <_> + 3 8 3 16 3. + <_> + + <_> + 18 0 6 14 -1. + <_> + 20 0 2 14 3. + <_> + + <_> + 0 0 6 14 -1. + <_> + 2 0 2 14 3. + <_> + + <_> + 15 0 6 22 -1. + <_> + 17 0 2 22 3. + <_> + + <_> + 3 0 6 22 -1. + <_> + 5 0 2 22 3. + <_> + + <_> + 12 2 12 20 -1. + <_> + 16 2 4 20 3. + <_> + + <_> + 0 2 12 20 -1. + <_> + 4 2 4 20 3. + <_> + + <_> + 11 6 4 9 -1. + <_> + 11 6 2 9 2. + <_> + + <_> + 9 0 6 16 -1. + <_> + 12 0 3 16 2. + <_> + + <_> + 12 1 3 12 -1. + <_> + 12 7 3 6 2. + <_> + + <_> + 3 4 18 6 -1. + <_> + 3 4 9 3 2. + <_> + 12 7 9 3 2. + <_> + + <_> + 5 5 16 8 -1. + <_> + 13 5 8 4 2. + <_> + 5 9 8 4 2. + <_> + + <_> + 0 13 10 6 -1. + <_> + 0 15 10 2 3. + <_> + + <_> + 8 14 9 6 -1. + <_> + 8 16 9 2 3. + <_> + + <_> + 6 2 9 6 -1. + <_> + 9 2 3 6 3. + <_> + + <_> + 14 1 10 8 -1. + <_> + 19 1 5 4 2. + <_> + 14 5 5 4 2. + <_> + + <_> + 9 1 3 12 -1. + <_> + 9 7 3 6 2. + <_> + + <_> + 6 4 12 9 -1. + <_> + 6 7 12 3 3. + <_> + + <_> + 6 5 12 6 -1. + <_> + 10 5 4 6 3. + <_> + + <_> + 1 1 8 5 -1. + <_> + 5 1 4 5 2. + <_> + + <_> + 12 12 6 8 -1. + <_> + 12 16 6 4 2. + <_> + + <_> + 3 12 12 6 -1. + <_> + 3 14 12 2 3. + <_> + + <_> + 9 18 12 6 -1. + <_> + 15 18 6 3 2. + <_> + 9 21 6 3 2. + <_> + + <_> + 4 13 6 6 -1. + <_> + 4 16 6 3 2. + <_> + + <_> + 11 3 7 18 -1. + <_> + 11 12 7 9 2. + <_> + + <_> + 3 9 18 3 -1. + <_> + 9 9 6 3 3. + <_> + + <_> + 5 3 19 2 -1. + <_> + 5 4 19 1 2. + <_> + + <_> + 4 2 12 6 -1. + <_> + 4 2 6 3 2. + <_> + 10 5 6 3 2. + <_> + + <_> + 9 6 6 9 -1. + <_> + 11 6 2 9 3. + <_> + + <_> + 8 6 6 9 -1. + <_> + 10 6 2 9 3. + <_> + + <_> + 16 9 5 15 -1. + <_> + 16 14 5 5 3. + <_> + + <_> + 3 9 5 15 -1. + <_> + 3 14 5 5 3. + <_> + + <_> + 6 6 14 6 -1. + <_> + 13 6 7 3 2. + <_> + 6 9 7 3 2. + <_> + + <_> + 8 6 3 14 -1. + <_> + 8 13 3 7 2. + <_> + + <_> + 0 16 24 5 -1. + <_> + 8 16 8 5 3. + <_> + + <_> + 0 20 20 3 -1. + <_> + 10 20 10 3 2. + <_> + + <_> + 5 10 18 2 -1. + <_> + 5 11 18 1 2. + <_> + + <_> + 0 6 6 10 -1. + <_> + 2 6 2 10 3. + <_> + + <_> + 2 1 20 3 -1. + <_> + 2 2 20 1 3. + <_> + + <_> + 9 13 6 11 -1. + <_> + 11 13 2 11 3. + <_> + + <_> + 9 15 6 8 -1. + <_> + 9 19 6 4 2. + <_> + + <_> + 9 12 6 9 -1. + <_> + 9 15 6 3 3. + <_> + + <_> + 5 11 18 2 -1. + <_> + 5 12 18 1 2. + <_> + + <_> + 2 6 15 6 -1. + <_> + 2 8 15 2 3. + <_> + + <_> + 6 0 18 3 -1. + <_> + 6 1 18 1 3. + <_> + + <_> + 5 0 3 18 -1. + <_> + 6 0 1 18 3. + <_> + + <_> + 18 3 6 10 -1. + <_> + 20 3 2 10 3. + <_> + + <_> + 0 3 6 10 -1. + <_> + 2 3 2 10 3. + <_> + + <_> + 10 5 8 9 -1. + <_> + 10 5 4 9 2. + <_> + + <_> + 6 5 8 9 -1. + <_> + 10 5 4 9 2. + <_> + + <_> + 3 2 20 3 -1. + <_> + 3 3 20 1 3. + <_> + + <_> + 5 2 13 4 -1. + <_> + 5 4 13 2 2. + <_> + + <_> + 17 0 7 14 -1. + <_> + 17 7 7 7 2. + <_> + + <_> + 0 0 7 14 -1. + <_> + 0 7 7 7 2. + <_> + + <_> + 9 11 10 6 -1. + <_> + 9 11 5 6 2. + <_> + + <_> + 5 11 10 6 -1. + <_> + 10 11 5 6 2. + <_> + + <_> + 11 6 3 18 -1. + <_> + 11 12 3 6 3. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 6 16 18 3 -1. + <_> + 6 17 18 1 3. + <_> + + <_> + 4 6 9 10 -1. + <_> + 4 11 9 5 2. + <_> + + <_> + 9 7 15 4 -1. + <_> + 9 9 15 2 2. + <_> + + <_> + 5 6 12 6 -1. + <_> + 5 6 6 3 2. + <_> + 11 9 6 3 2. + <_> + + <_> + 6 1 12 9 -1. + <_> + 6 4 12 3 3. + <_> + + <_> + 7 9 6 12 -1. + <_> + 7 9 3 6 2. + <_> + 10 15 3 6 2. + <_> + + <_> + 11 5 13 6 -1. + <_> + 11 7 13 2 3. + <_> + + <_> + 1 11 22 13 -1. + <_> + 12 11 11 13 2. + <_> + + <_> + 18 8 6 6 -1. + <_> + 18 11 6 3 2. + <_> + + <_> + 0 8 6 6 -1. + <_> + 0 11 6 3 2. + <_> + + <_> + 0 6 24 3 -1. + <_> + 0 7 24 1 3. + <_> + + <_> + 0 5 10 6 -1. + <_> + 0 7 10 2 3. + <_> + + <_> + 6 7 18 3 -1. + <_> + 6 8 18 1 3. + <_> + + <_> + 0 0 10 6 -1. + <_> + 0 2 10 2 3. + <_> + + <_> + 19 0 3 19 -1. + <_> + 20 0 1 19 3. + <_> + + <_> + 4 6 12 16 -1. + <_> + 4 6 6 8 2. + <_> + 10 14 6 8 2. + <_> + + <_> + 19 6 4 18 -1. + <_> + 21 6 2 9 2. + <_> + 19 15 2 9 2. + <_> + + <_> + 1 6 4 18 -1. + <_> + 1 6 2 9 2. + <_> + 3 15 2 9 2. + <_> + + <_> + 3 21 18 3 -1. + <_> + 3 22 18 1 3. + <_> + + <_> + 0 19 9 4 -1. + <_> + 0 21 9 2 2. + <_> + + <_> + 12 18 12 6 -1. + <_> + 18 18 6 3 2. + <_> + 12 21 6 3 2. + <_> + + <_> + 7 18 9 4 -1. + <_> + 7 20 9 2 2. + <_> + + <_> + 12 16 10 8 -1. + <_> + 17 16 5 4 2. + <_> + 12 20 5 4 2. + <_> + + <_> + 2 16 10 8 -1. + <_> + 2 16 5 4 2. + <_> + 7 20 5 4 2. + <_> + + <_> + 14 0 10 12 -1. + <_> + 19 0 5 6 2. + <_> + 14 6 5 6 2. + <_> + + <_> + 0 0 10 12 -1. + <_> + 0 0 5 6 2. + <_> + 5 6 5 6 2. + <_> + + <_> + 15 14 9 6 -1. + <_> + 15 16 9 2 3. + <_> + + <_> + 0 14 9 6 -1. + <_> + 0 16 9 2 3. + <_> + + <_> + 14 14 10 6 -1. + <_> + 14 16 10 2 3. + <_> + + <_> + 0 14 10 6 -1. + <_> + 0 16 10 2 3. + <_> + + <_> + 5 18 18 2 -1. + <_> + 5 19 18 1 2. + <_> + + <_> + 0 18 18 3 -1. + <_> + 0 19 18 1 3. + <_> + + <_> + 3 5 18 12 -1. + <_> + 12 5 9 6 2. + <_> + 3 11 9 6 2. + <_> + + <_> + 5 3 7 9 -1. + <_> + 5 6 7 3 3. + <_> + + <_> + 4 0 19 15 -1. + <_> + 4 5 19 5 3. + <_> + + <_> + 3 0 16 4 -1. + <_> + 3 2 16 2 2. + <_> + + <_> + 4 12 16 12 -1. + <_> + 4 12 8 12 2. + <_> + + <_> + 4 3 12 15 -1. + <_> + 10 3 6 15 2. + <_> + + <_> + 16 4 2 19 -1. + <_> + 16 4 1 19 2. + <_> + + <_> + 6 4 2 19 -1. + <_> + 7 4 1 19 2. + <_> + + <_> + 13 14 8 10 -1. + <_> + 17 14 4 5 2. + <_> + 13 19 4 5 2. + <_> + + <_> + 3 14 8 10 -1. + <_> + 3 14 4 5 2. + <_> + 7 19 4 5 2. + <_> + + <_> + 12 6 3 18 -1. + <_> + 12 12 3 6 3. + <_> + + <_> + 5 11 12 6 -1. + <_> + 5 11 6 3 2. + <_> + 11 14 6 3 2. + <_> + + <_> + 10 5 8 10 -1. + <_> + 14 5 4 5 2. + <_> + 10 10 4 5 2. + <_> + + <_> + 6 4 12 10 -1. + <_> + 6 4 6 5 2. + <_> + 12 9 6 5 2. + <_> + + <_> + 6 8 18 10 -1. + <_> + 15 8 9 5 2. + <_> + 6 13 9 5 2. + <_> + + <_> + 0 8 18 10 -1. + <_> + 0 8 9 5 2. + <_> + 9 13 9 5 2. + <_> + + <_> + 12 6 3 18 -1. + <_> + 12 12 3 6 3. + <_> + + <_> + 0 14 18 3 -1. + <_> + 0 15 18 1 3. + <_> + + <_> + 12 6 3 18 -1. + <_> + 12 12 3 6 3. + <_> + + <_> + 9 6 3 18 -1. + <_> + 9 12 3 6 3. + <_> + + <_> + 6 14 18 3 -1. + <_> + 6 15 18 1 3. + <_> + + <_> + 0 5 18 3 -1. + <_> + 0 6 18 1 3. + <_> + + <_> + 2 5 22 3 -1. + <_> + 2 6 22 1 3. + <_> + + <_> + 0 0 21 10 -1. + <_> + 7 0 7 10 3. + <_> + + <_> + 6 3 18 17 -1. + <_> + 12 3 6 17 3. + <_> + + <_> + 0 3 18 17 -1. + <_> + 6 3 6 17 3. + <_> + + <_> + 0 12 24 11 -1. + <_> + 8 12 8 11 3. + <_> + + <_> + 4 10 16 6 -1. + <_> + 4 13 16 3 2. + <_> + + <_> + 12 8 6 8 -1. + <_> + 12 12 6 4 2. + <_> + + <_> + 6 14 8 7 -1. + <_> + 10 14 4 7 2. + <_> + + <_> + 15 10 6 14 -1. + <_> + 18 10 3 7 2. + <_> + 15 17 3 7 2. + <_> + + <_> + 3 10 6 14 -1. + <_> + 3 10 3 7 2. + <_> + 6 17 3 7 2. + <_> + + <_> + 6 12 18 2 -1. + <_> + 6 13 18 1 2. + <_> + + <_> + 5 8 10 6 -1. + <_> + 5 10 10 2 3. + <_> + + <_> + 12 11 9 4 -1. + <_> + 12 13 9 2 2. + <_> + + <_> + 0 11 9 6 -1. + <_> + 0 13 9 2 3. + <_> + + <_> + 11 2 3 18 -1. + <_> + 12 2 1 18 3. + <_> + + <_> + 10 2 3 18 -1. + <_> + 11 2 1 18 3. + <_> + + <_> + 9 12 6 10 -1. + <_> + 11 12 2 10 3. + <_> + + <_> + 1 10 6 9 -1. + <_> + 1 13 6 3 3. + <_> + + <_> + 6 9 16 6 -1. + <_> + 14 9 8 3 2. + <_> + 6 12 8 3 2. + <_> + + <_> + 1 8 9 6 -1. + <_> + 1 10 9 2 3. + <_> + + <_> + 7 7 16 6 -1. + <_> + 7 9 16 2 3. + <_> + + <_> + 0 0 18 3 -1. + <_> + 0 1 18 1 3. + <_> + + <_> + 10 0 6 9 -1. + <_> + 12 0 2 9 3. + <_> + + <_> + 9 5 6 6 -1. + <_> + 12 5 3 6 2. + <_> + + <_> + 10 6 4 18 -1. + <_> + 12 6 2 9 2. + <_> + 10 15 2 9 2. + <_> + + <_> + 8 0 6 9 -1. + <_> + 10 0 2 9 3. + <_> + + <_> + 9 1 6 9 -1. + <_> + 9 4 6 3 3. + <_> + + <_> + 1 0 18 9 -1. + <_> + 1 3 18 3 3. + <_> + + <_> + 0 3 24 3 -1. + <_> + 0 4 24 1 3. + <_> + + <_> + 6 14 9 4 -1. + <_> + 6 16 9 2 2. + <_> + + <_> + 8 9 8 10 -1. + <_> + 12 9 4 5 2. + <_> + 8 14 4 5 2. + <_> + + <_> + 5 2 13 9 -1. + <_> + 5 5 13 3 3. + <_> + + <_> + 4 4 16 9 -1. + <_> + 4 7 16 3 3. + <_> + + <_> + 4 4 14 9 -1. + <_> + 4 7 14 3 3. + <_> + + <_> + 8 5 9 6 -1. + <_> + 8 7 9 2 3. + <_> + + <_> + 1 7 16 6 -1. + <_> + 1 9 16 2 3. + <_> + + <_> + 10 5 13 9 -1. + <_> + 10 8 13 3 3. + <_> + + <_> + 1 5 13 9 -1. + <_> + 1 8 13 3 3. + <_> + + <_> + 0 4 24 6 -1. + <_> + 12 4 12 3 2. + <_> + 0 7 12 3 2. + <_> + + <_> + 1 14 10 9 -1. + <_> + 1 17 10 3 3. + <_> + + <_> + 5 17 18 3 -1. + <_> + 5 18 18 1 3. + <_> + + <_> + 0 16 18 3 -1. + <_> + 0 17 18 1 3. + <_> + + <_> + 9 17 9 6 -1. + <_> + 9 19 9 2 3. + <_> + + <_> + 1 20 22 4 -1. + <_> + 1 20 11 2 2. + <_> + 12 22 11 2 2. + <_> + + <_> + 8 14 8 6 -1. + <_> + 8 17 8 3 2. + <_> + + <_> + 8 6 8 15 -1. + <_> + 8 11 8 5 3. + <_> + + <_> + 5 4 18 3 -1. + <_> + 5 5 18 1 3. + <_> + + <_> + 9 3 5 10 -1. + <_> + 9 8 5 5 2. + <_> + + <_> + 6 8 12 3 -1. + <_> + 6 8 6 3 2. + <_> + + <_> + 2 6 18 6 -1. + <_> + 2 6 9 3 2. + <_> + 11 9 9 3 2. + <_> + + <_> + 10 6 4 18 -1. + <_> + 12 6 2 9 2. + <_> + 10 15 2 9 2. + <_> + + <_> + 7 5 6 6 -1. + <_> + 10 5 3 6 2. + <_> + + <_> + 14 5 2 18 -1. + <_> + 14 14 2 9 2. + <_> + + <_> + 8 5 2 18 -1. + <_> + 8 14 2 9 2. + <_> + + <_> + 9 2 10 6 -1. + <_> + 9 2 5 6 2. + <_> + + <_> + 3 1 18 12 -1. + <_> + 12 1 9 12 2. + <_> + + <_> + 5 2 17 22 -1. + <_> + 5 13 17 11 2. + <_> + + <_> + 4 0 12 6 -1. + <_> + 4 2 12 2 3. + <_> + + <_> + 6 9 16 6 -1. + <_> + 14 9 8 3 2. + <_> + 6 12 8 3 2. + <_> + + <_> + 9 0 5 18 -1. + <_> + 9 9 5 9 2. + <_> + + <_> + 12 0 6 9 -1. + <_> + 14 0 2 9 3. + <_> + + <_> + 6 0 6 9 -1. + <_> + 8 0 2 9 3. + <_> + + <_> + 9 1 6 12 -1. + <_> + 11 1 2 12 3. + <_> + + <_> + 5 9 13 4 -1. + <_> + 5 11 13 2 2. + <_> + + <_> + 5 8 19 3 -1. + <_> + 5 9 19 1 3. + <_> + + <_> + 9 9 6 8 -1. + <_> + 9 13 6 4 2. + <_> + + <_> + 11 9 4 15 -1. + <_> + 11 14 4 5 3. + <_> + + <_> + 2 0 6 14 -1. + <_> + 2 0 3 7 2. + <_> + 5 7 3 7 2. + <_> + + <_> + 15 1 6 14 -1. + <_> + 18 1 3 7 2. + <_> + 15 8 3 7 2. + <_> + + <_> + 3 1 6 14 -1. + <_> + 3 1 3 7 2. + <_> + 6 8 3 7 2. + <_> + + <_> + 3 20 18 4 -1. + <_> + 12 20 9 2 2. + <_> + 3 22 9 2 2. + <_> + + <_> + 5 0 4 20 -1. + <_> + 5 0 2 10 2. + <_> + 7 10 2 10 2. + <_> + + <_> + 16 8 8 12 -1. + <_> + 20 8 4 6 2. + <_> + 16 14 4 6 2. + <_> + + <_> + 0 8 8 12 -1. + <_> + 0 8 4 6 2. + <_> + 4 14 4 6 2. + <_> + + <_> + 13 13 10 8 -1. + <_> + 18 13 5 4 2. + <_> + 13 17 5 4 2. + <_> + + <_> + 1 13 10 8 -1. + <_> + 1 13 5 4 2. + <_> + 6 17 5 4 2. + <_> + + <_> + 15 8 4 15 -1. + <_> + 15 13 4 5 3. + <_> + + <_> + 5 8 4 15 -1. + <_> + 5 13 4 5 3. + <_> + + <_> + 6 11 16 12 -1. + <_> + 6 15 16 4 3. + <_> + + <_> + 2 11 16 12 -1. + <_> + 2 15 16 4 3. + <_> + + <_> + 14 12 7 9 -1. + <_> + 14 15 7 3 3. + <_> + + <_> + 10 1 3 21 -1. + <_> + 10 8 3 7 3. + <_> + + <_> + 13 11 9 4 -1. + <_> + 13 13 9 2 2. + <_> + + <_> + 3 10 17 9 -1. + <_> + 3 13 17 3 3. + <_> + + <_> + 13 8 8 15 -1. + <_> + 13 13 8 5 3. + <_> + + <_> + 3 8 8 15 -1. + <_> + 3 13 8 5 3. + <_> + + <_> + 11 14 10 8 -1. + <_> + 16 14 5 4 2. + <_> + 11 18 5 4 2. + <_> + + <_> + 0 18 22 6 -1. + <_> + 0 18 11 3 2. + <_> + 11 21 11 3 2. + <_> + + <_> + 0 16 24 4 -1. + <_> + 0 16 12 4 2. + <_> + + <_> + 6 20 12 3 -1. + <_> + 12 20 6 3 2. + <_> + + <_> + 18 12 6 12 -1. + <_> + 21 12 3 6 2. + <_> + 18 18 3 6 2. + <_> + + <_> + 0 12 6 12 -1. + <_> + 0 12 3 6 2. + <_> + 3 18 3 6 2. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 1 6 22 10 -1. + <_> + 1 6 11 5 2. + <_> + 12 11 11 5 2. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 0 18 18 2 -1. + <_> + 0 19 18 1 2. + <_> + + <_> + 3 15 19 3 -1. + <_> + 3 16 19 1 3. + <_> + + <_> + 0 13 18 3 -1. + <_> + 0 14 18 1 3. + <_> + + <_> + 15 17 9 6 -1. + <_> + 15 19 9 2 3. + <_> + + <_> + 0 17 9 6 -1. + <_> + 0 19 9 2 3. + <_> + + <_> + 12 17 9 6 -1. + <_> + 12 19 9 2 3. + <_> + + <_> + 3 17 9 6 -1. + <_> + 3 19 9 2 3. + <_> + + <_> + 16 2 3 20 -1. + <_> + 17 2 1 20 3. + <_> + + <_> + 0 13 24 8 -1. + <_> + 0 17 24 4 2. + <_> + + <_> + 9 1 6 22 -1. + <_> + 12 1 3 11 2. + <_> + 9 12 3 11 2. + diff --git a/beauty/src/main/assets/model/ti_face_tracker.model b/beauty/src/main/assets/model/ti_face_tracker.model new file mode 100644 index 000000000..df5ee9d10 Binary files /dev/null and b/beauty/src/main/assets/model/ti_face_tracker.model differ diff --git a/beauty/src/main/assets/sticker/stickers.json b/beauty/src/main/assets/sticker/stickers.json new file mode 100644 index 000000000..5b12d58c9 --- /dev/null +++ b/beauty/src/main/assets/sticker/stickers.json @@ -0,0 +1,188 @@ +{ + "stickers": [ + { + "name": "maoer", + "dir": "maoer", + "category": "default", + "thumb": "maoerduo_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "cloud", + "dir": "cloud", + "category": "default", + "thumb": "cloud_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "glass", + "dir": "glass", + "category": "default", + "thumb": "glass_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "stars_twinkle", + "dir": "stars_twinkle", + "category": "default", + "thumb": "stars_twinkle_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "wife", + "dir": "wife", + "category": "default", + "thumb": "wife_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "cat", + "dir": "cat", + "category": "default", + "thumb": "cat_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "halloweeneve", + "dir": "halloweeneve", + "category": "default", + "thumb": "halloweeneve_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "black_cat", + "dir": "black_cat", + "category": "default", + "thumb": "black_cat_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "black_cloud", + "dir": "black_cloud", + "category": "default", + "thumb": "black_cloud_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "eyemask", + "dir": "eyemask", + "category": "default", + "thumb": "eyemask_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "tears", + "dir": "tears", + "category": "default", + "thumb": "tears_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "moustache", + "dir": "moustache", + "category": "default", + "thumb": "moustache_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "bride", + "dir": "bride", + "category": "default", + "thumb": "bride_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "flowerrabbit", + "dir": "flowerrabbit", + "category": "default", + "thumb": "flowerrabbit_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "cigar", + "dir": "cigar", + "category": "default", + "thumb": "cigar_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "devil", + "dir": "devil", + "category": "default", + "thumb": "devil_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "doggy", + "dir": "doggy", + "category": "default", + "thumb": "doggy_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "dog", + "dir": "dog", + "category": "default", + "thumb": "dog_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "winterhat", + "dir": "winterhat", + "category": "default", + "thumb": "winterhat_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "wangguan", + "dir": "wangguan", + "category": "default", + "thumb": "wangguan_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "wuyun", + "dir": "wuyun", + "category": "default", + "thumb": "wuyun_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "eyestar", + "dir": "eyestar", + "category": "default", + "thumb": "star_icon.png", + "voiced": false, + "downloaded": false + }, + { + "name": "kisses", + "dir": "kisses", + "category": "default", + "thumb": "kiss_icon.png", + "voiced": false, + "downloaded": false + } + ] +} diff --git a/beauty/src/main/assets/watermark/watermark.png b/beauty/src/main/assets/watermark/watermark.png new file mode 100644 index 000000000..0f2360a0d Binary files /dev/null and b/beauty/src/main/assets/watermark/watermark.png differ diff --git a/beauty/src/main/assets/watermark/watermark1.png b/beauty/src/main/assets/watermark/watermark1.png new file mode 100644 index 000000000..b588b2ff1 Binary files /dev/null and b/beauty/src/main/assets/watermark/watermark1.png differ diff --git a/beauty/src/main/assets/watermark/watermark2.png b/beauty/src/main/assets/watermark/watermark2.png new file mode 100644 index 000000000..a524d2479 Binary files /dev/null and b/beauty/src/main/assets/watermark/watermark2.png differ diff --git a/beauty/src/main/assets/watermark/watermark3.png b/beauty/src/main/assets/watermark/watermark3.png new file mode 100644 index 000000000..03b290814 Binary files /dev/null and b/beauty/src/main/assets/watermark/watermark3.png differ diff --git a/beauty/src/main/assets/watermark/watermarks.json b/beauty/src/main/assets/watermark/watermarks.json new file mode 100644 index 000000000..2f20d99d6 --- /dev/null +++ b/beauty/src/main/assets/watermark/watermarks.json @@ -0,0 +1,36 @@ +{ + "watermarks": [ + { + "x": 0, + "y": 0, + "ratio": 20, + "name": "watermark.png", + "thumb": "watermark.png", + "downloaded": true + }, + { + "x": 80, + "y": 0, + "ratio": 20, + "name": "watermark1.png", + "thumb": "watermark1_icon.png", + "downloaded": true + }, + { + "x": 0, + "y": 80, + "ratio": 20, + "name": "watermark2.png", + "thumb": "watermark2_icon.png", + "downloaded": true + }, + { + "x": 80, + "y": 80, + "ratio": 20, + "name": "watermark3.png", + "thumb": "watermark3_icon.png", + "downloaded": true + } + ] +} diff --git a/beauty/src/main/java/com/yunbao/beauty/adapter/FilterAdapter.java b/beauty/src/main/java/com/yunbao/beauty/adapter/FilterAdapter.java new file mode 100644 index 000000000..5971182c3 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/adapter/FilterAdapter.java @@ -0,0 +1,123 @@ +package com.yunbao.beauty.adapter; + +import android.content.Context; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.yunbao.beauty.bean.FilterBean; +import com.yunbao.common.Constants; +import com.yunbao.beauty.R; +import com.yunbao.common.interfaces.OnItemClickListener; + +import java.util.ArrayList; +import java.util.List; + +import cn.tillusory.sdk.bean.TiFilterEnum; + +/** + * Created by cxf on 2018/6/22. + */ + +public class FilterAdapter extends RecyclerView.Adapter { + + private List mList; + private LayoutInflater mInflater; + private View.OnClickListener mOnClickListener; + private OnItemClickListener mOnItemClickListener; + private int mCheckedPosition; + + public FilterAdapter(Context context) { + mList = new ArrayList<>(); + mList.add(new FilterBean(R.mipmap.icon_filter_orginal, 0, TiFilterEnum.NO_FILTER, 0, true)); + mList.add(new FilterBean(R.mipmap.icon_filter_langman, R.mipmap.filter_langman, TiFilterEnum.CHOCOLATE_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_qingxin, R.mipmap.filter_qingxin, TiFilterEnum.COCO_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_weimei, R.mipmap.filter_weimei, TiFilterEnum.COFFEE_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_fennen, R.mipmap.filter_fennen, TiFilterEnum.DELICIOUS_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_huaijiu, R.mipmap.filter_huaijiu, TiFilterEnum.FIRSTLOVE_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_qingliang, R.mipmap.filter_qingliang, TiFilterEnum.FOREST_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_landiao, R.mipmap.filter_landiao, TiFilterEnum.GLOSSY_FILTER)); + mList.add(new FilterBean(R.mipmap.icon_filter_rixi, R.mipmap.filter_rixi, TiFilterEnum.GRASS_FILTER)); + mInflater = LayoutInflater.from(context); + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag != null) { + int position = (int) tag; + if (mCheckedPosition == position) { + return; + } + if (mCheckedPosition >= 0 && mCheckedPosition < mList.size()) { + mList.get(mCheckedPosition).setChecked(false); + notifyItemChanged(mCheckedPosition, Constants.PAYLOAD); + } + mList.get(position).setChecked(true); + notifyItemChanged(position, Constants.PAYLOAD); + mCheckedPosition = position; + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(mList.get(position), position); + } + } + } + }; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } + + + @Override + public Vh onCreateViewHolder(ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.item_list_filter, parent, false)); + } + + @Override + public void onBindViewHolder(Vh holder, int position) { + + } + + @Override + public void onBindViewHolder(Vh vh, int position, List payloads) { + Object payload = payloads.size() > 0 ? payloads.get(0) : null; + vh.setData(mList.get(position), position, payload); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + + class Vh extends RecyclerView.ViewHolder { + + ImageView mImg; + ImageView mCheckImg; + + public Vh(View itemView) { + super(itemView); + mImg = (ImageView) itemView.findViewById(R.id.img); + mCheckImg = (ImageView) itemView.findViewById(R.id.check_img); + itemView.setOnClickListener(mOnClickListener); + } + + void setData(FilterBean bean, int position, Object payload) { + itemView.setTag(position); + if (payload == null) { + mImg.setImageResource(bean.getImgSrc()); + } + if (bean.isChecked()) { + if (mCheckImg.getVisibility() != View.VISIBLE) { + mCheckImg.setVisibility(View.VISIBLE); + } + } else { + if (mCheckImg.getVisibility() == View.VISIBLE) { + mCheckImg.setVisibility(View.INVISIBLE); + } + } + } + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/adapter/RockAdapter.java b/beauty/src/main/java/com/yunbao/beauty/adapter/RockAdapter.java new file mode 100644 index 000000000..eabf76bc5 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/adapter/RockAdapter.java @@ -0,0 +1,120 @@ +package com.yunbao.beauty.adapter; + +import android.content.Context; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.yunbao.beauty.bean.RockBean; +import com.yunbao.common.Constants; +import com.yunbao.beauty.R; + +import java.util.ArrayList; +import java.util.List; + +import cn.tillusory.sdk.bean.TiRockEnum; + +/** + * Created by cxf on 2018/8/3. + */ + +public class RockAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mList; + private LayoutInflater mInflater; + private ActionListener mActionListener; + private int mCheckedPosition; + private int mCheckedColor; + private int mUnCheckedColor; + private View.OnClickListener mOnClickListener; + + public RockAdapter(Context context) { + mContext = context; + mInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + TiRockEnum[] values = TiRockEnum.values(); + for (int i = 0, size = values.length; i < size; i++) { + RockBean bean = new RockBean(values[i]); + if (i == 0) { + bean.setChecked(true); + } + mList.add(bean); + } + mCheckedColor = ContextCompat.getColor(context, R.color.global); + mUnCheckedColor = 0xffffffff; + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag != null) { + int position = (int) tag; + if (mCheckedPosition != position) { + mList.get(mCheckedPosition).setChecked(false); + mList.get(position).setChecked(true); + notifyItemChanged(mCheckedPosition, Constants.PAYLOAD); + notifyItemChanged(position, Constants.PAYLOAD); + mCheckedPosition = position; + if (mActionListener != null) { + mActionListener.onItemClick(mList.get(position).getTiRockEnum()); + } + } + } + } + }; + } + + public void setActionListener(ActionListener listener) { + mActionListener = listener; + } + + @Override + public Vh onCreateViewHolder(ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.view_item_list_beauty_filter, parent, false)); + } + + @Override + public void onBindViewHolder(Vh vh, int position) { + + } + + @Override + public void onBindViewHolder(Vh vh, int position, List payloads) { + Object payload = payloads.size() > 0 ? payloads.get(0) : null; + vh.setData(mList.get(position), position, payload); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + TextView mTextView; + + public Vh(View itemView) { + super(itemView); + mTextView = (TextView) itemView; + itemView.setOnClickListener(mOnClickListener); + } + + void setData(RockBean bean, int position, Object payload) { + itemView.setTag(position); + if (payload == null) { + mTextView.setText(bean.getTiRockEnum().getString(mContext)); + } + if (mCheckedPosition == position) { + mTextView.setTextColor(mCheckedColor); + } else { + mTextView.setTextColor(mUnCheckedColor); + } + } + } + + public interface ActionListener { + void onItemClick(TiRockEnum tiRockEnum); + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/adapter/TieZhiAdapter.java b/beauty/src/main/java/com/yunbao/beauty/adapter/TieZhiAdapter.java new file mode 100644 index 000000000..e9420fe72 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/adapter/TieZhiAdapter.java @@ -0,0 +1,215 @@ +package com.yunbao.beauty.adapter; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.yunbao.beauty.bean.TieZhiBean; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.Constants; +import com.yunbao.beauty.R; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.utils.DownloadUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; + +import java.io.File; +import java.util.List; + +import cn.tillusory.sdk.TiSDK; +import cn.tillusory.sdk.common.TiUtils; + + +/** + * Created by cxf on 2018/6/23. + * 萌颜 贴纸 + */ + +public class TieZhiAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mList; + private LayoutInflater mInflater; + private Drawable mCheckDrawable; + private int mCheckedPosition; + private OnItemClickListener mOnItemClickListener; + private static final int MAX_DOWNLOAD_TASK = 3; + private SparseArray mLoadingTaskMap; + private DownloadUtil mDownloadUtil; + private View.OnClickListener mOnClickListener; + + + public TieZhiAdapter(Context context) { + mContext = context; + mList = TieZhiBean.getTieZhiList(context); + mInflater = LayoutInflater.from(context); + mCheckDrawable = ContextCompat.getDrawable(context, R.drawable.bg_item_tiezhi); + mLoadingTaskMap = new SparseArray<>(); + mDownloadUtil = new DownloadUtil(); + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag == null) { + return; + } + final int position = (int) tag; + if (position < 0 || position >= mList.size()) { + return; + } + final TieZhiBean bean = mList.get(position); + if (bean == null) { + return; + } + if (!bean.isDownloaded()) { + if (mDownloadUtil != null && mLoadingTaskMap.size() < MAX_DOWNLOAD_TASK && + mLoadingTaskMap.indexOfKey(position) < 0) {//不存在这个key + String name = bean.getName(); + mLoadingTaskMap.put(position, name); + bean.setDownloading(true); + notifyItemChanged(position, Constants.PAYLOAD); + mDownloadUtil.download(name, CommonAppConfig.VIDEO_TIE_ZHI_PATH, name, bean.getUrl(), new DownloadUtil.Callback() { + @Override + public void onSuccess(File file) { + if (file != null) { + File targetDir = new File(TiSDK.getStickerPath(mContext)); + try { + //解压到贴纸目录 + TiUtils.unzip(file, targetDir); + bean.setDownloadSuccess(mContext); + } catch (Exception e) { + ToastUtil.show(WordUtil.getString(R.string.tiezhi_download_failed)); + bean.setDownloading(false); + } finally { + file.delete(); + notifyItemChanged(position, Constants.PAYLOAD); + mLoadingTaskMap.remove(position); + } + } + } + + @Override + public void onProgress(int progress) { + + } + + @Override + public void onError(Throwable e) { + ToastUtil.show(WordUtil.getString(R.string.tiezhi_download_failed)); + bean.setDownloading(false); + notifyItemChanged(position, Constants.PAYLOAD); + mLoadingTaskMap.remove(position); + } + }); + } + } else { + if (mCheckedPosition != position) { + if (mCheckedPosition >= 0 && mCheckedPosition < mList.size()) { + mList.get(mCheckedPosition).setChecked(false); + } + mList.get(position).setChecked(true); + notifyItemChanged(mCheckedPosition, Constants.PAYLOAD); + notifyItemChanged(position, Constants.PAYLOAD); + mCheckedPosition = position; + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(bean, position); + } + } + } + } + }; + } + + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } + + @Override + public Vh onCreateViewHolder(ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.item_list_tiezhi, parent, false)); + } + + @Override + public void onBindViewHolder(Vh holder, int position) { + + } + + @Override + public void onBindViewHolder(Vh vh, int position, List payloads) { + Object payload = payloads.size() > 0 ? payloads.get(0) : null; + vh.setData(mList.get(position), position, payload); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + + ImageView mImg; + View mLoading; + View mDownLoad; + + public Vh(View itemView) { + super(itemView); + mImg = (ImageView) itemView.findViewById(R.id.img); + mLoading = itemView.findViewById(R.id.loading); + mDownLoad = itemView.findViewById(R.id.download); + itemView.setOnClickListener(mOnClickListener); + } + + void setData(TieZhiBean bean, int position, Object payload) { + itemView.setTag(position); + if (payload == null) { + if (position == 0) { + mImg.setImageResource(R.mipmap.icon_tiezhi_none); + } else { + ImgLoader.display(mContext,bean.getThumb(), mImg); + } + } + if (bean.isDownloading()) { + if (mLoading.getVisibility() != View.VISIBLE) { + mLoading.setVisibility(View.VISIBLE); + } + } else { + if (mLoading.getVisibility() == View.VISIBLE) { + mLoading.setVisibility(View.INVISIBLE); + } + } + if (bean.isDownloaded()) { + if (mDownLoad.getVisibility() == View.VISIBLE) { + mDownLoad.setVisibility(View.INVISIBLE); + } + } else { + if (mDownLoad.getVisibility() != View.VISIBLE) { + mDownLoad.setVisibility(View.VISIBLE); + } + } + if (bean.isChecked()) { + itemView.setBackground(mCheckDrawable); + } else { + itemView.setBackground(null); + } + } + } + + + public void clear() { + if (mLoadingTaskMap != null) { + for (int i = 0, size = mLoadingTaskMap.size(); i < size; i++) { + String tag = mLoadingTaskMap.valueAt(i); + CommonHttpUtil.cancel(tag); + } + } + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/bean/FilterBean.java b/beauty/src/main/java/com/yunbao/beauty/bean/FilterBean.java new file mode 100644 index 000000000..3fdff3085 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/bean/FilterBean.java @@ -0,0 +1,77 @@ +package com.yunbao.beauty.bean; + +import cn.tillusory.sdk.bean.TiFilterEnum; + +/** + * Created by cxf on 2018/8/4. + */ + +public class FilterBean { + + private int mImgSrc; + private int mFilterSrc; + private TiFilterEnum mTiFilterEnum; + private boolean mChecked; + private int mKsyFilterType;//金山自带滤镜类型 + + public FilterBean() { + } + + public FilterBean(TiFilterEnum tiFilterEnum) { + mTiFilterEnum = tiFilterEnum; + } + + + public FilterBean(int imgSrc, int filterSrc, TiFilterEnum tiFilterEnum) { + mImgSrc = imgSrc; + mFilterSrc = filterSrc; + mTiFilterEnum = tiFilterEnum; + } + + + public FilterBean(int imgSrc, int filterSrc, TiFilterEnum tiFilterEnum, int ksyFilterType) { + this(imgSrc, filterSrc, tiFilterEnum); + mKsyFilterType = ksyFilterType; + } + + public FilterBean(int imgSrc, int filterSrc, TiFilterEnum tiFilterEnum, int ksyFilterType, boolean checked) { + this(imgSrc, filterSrc, tiFilterEnum, ksyFilterType); + mChecked = checked; + } + + public int getImgSrc() { + return mImgSrc; + } + + public void setImgSrc(int imgSrc) { + this.mImgSrc = imgSrc; + } + + public int getFilterSrc() { + return mFilterSrc; + } + + public void setFilterSrc(int filterSrc) { + mFilterSrc = filterSrc; + } + + public TiFilterEnum getTiFilterEnum() { + return mTiFilterEnum; + } + + public boolean isChecked() { + return mChecked; + } + + public void setChecked(boolean checked) { + mChecked = checked; + } + + public int getKsyFilterType() { + return mKsyFilterType; + } + + public void setKsyFilterType(int ksyFilterType) { + mKsyFilterType = ksyFilterType; + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/bean/RockBean.java b/beauty/src/main/java/com/yunbao/beauty/bean/RockBean.java new file mode 100644 index 000000000..b31e31443 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/bean/RockBean.java @@ -0,0 +1,29 @@ +package com.yunbao.beauty.bean; + +import cn.tillusory.sdk.bean.TiRockEnum; + +/** + * Created by cxf on 2018/8/4. + */ + +public class RockBean { + private TiRockEnum mTiRockEnum; + private boolean mChecked; + + public RockBean(TiRockEnum tiRockEnum) { + mTiRockEnum = tiRockEnum; + } + + public boolean isChecked() { + return mChecked; + } + + public void setChecked(boolean checked) { + mChecked = checked; + } + + + public TiRockEnum getTiRockEnum() { + return mTiRockEnum; + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/bean/TieZhiBean.java b/beauty/src/main/java/com/yunbao/beauty/bean/TieZhiBean.java new file mode 100644 index 000000000..57116291a --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/bean/TieZhiBean.java @@ -0,0 +1,94 @@ +package com.yunbao.beauty.bean; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.List; + +import cn.tillusory.sdk.bean.TiSticker; + +/** + * Created by cxf on 2018/6/23. + */ + +public class TieZhiBean { + + private TiSticker tiSticker; + private boolean checked; + private boolean downloading; + + + public TieZhiBean(TiSticker tiSticker) { + this.tiSticker = tiSticker; + } + + public TieZhiBean(TiSticker tiSticker, boolean checked) { + this.tiSticker = tiSticker; + this.checked = checked; + } + + public String getUrl() { + if (this.tiSticker != null) { + return this.tiSticker.getUrl(); + } + return null; + } + + public String getName() { + if (this.tiSticker != null) { + return this.tiSticker.getName(); + } + return null; + } + + public String getThumb() { + if (this.tiSticker != null) { + return this.tiSticker.getThumb(); + } + return null; + } + + public boolean isDownloaded() { + if (this.tiSticker != null) { + return this.tiSticker.isDownloaded(); + } + return false; + } + + public void setDownloadSuccess(Context context) { + if (this.tiSticker != null) { + this.tiSticker.setDownloaded(true); + this.tiSticker.stickerDownload(context); + } + downloading=false; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + public boolean isDownloading() { + return downloading; + } + + public void setDownloading(boolean downloading) { + this.downloading = downloading; + } + + /** + * 获取贴纸列表 + */ + public static List getTieZhiList(Context context) { + List result = new ArrayList<>(); + result.add(new TieZhiBean(TiSticker.NO_STICKER, true)); + List list = TiSticker.getAllStickers(context); + for (TiSticker tiSticker : list) { + result.add(new TieZhiBean(tiSticker)); + } + return result; + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/custom/ItemDecoration2.java b/beauty/src/main/java/com/yunbao/beauty/custom/ItemDecoration2.java new file mode 100644 index 000000000..e36cad156 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/custom/ItemDecoration2.java @@ -0,0 +1,596 @@ +package com.yunbao.beauty.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import androidx.annotation.ColorInt; +import androidx.annotation.Dimension; +import androidx.annotation.DrawableRes; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import android.util.TypedValue; +import android.view.View; + +/** + * RecyclerView分割线 + * 来自github https://github.com/binbinqq86/DividerItemDecoration + */ + +public class ItemDecoration2 extends RecyclerView.ItemDecoration { + private static final String TAG = "ItemDecoration"; + private Drawable mDivider; + private int dividerHeight; + private int dividerWidth; + private int dividerColor; + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + private static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; + private static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + /** + * 设置是否显示左右边界线 + */ + private boolean drawBorderLeftAndRight = false; + /** + * 设置是否显示上下边界线 + */ + private boolean drawBorderTopAndBottom = false; + + /** + * 是否只留空白,不画分割线 + */ + private boolean onlySetItemOffsetsButNoDraw=false; + + /** + * 是否是线性布局 + */ + private boolean isLinearLayoutManager=true; + /** + * 布局方向 + */ + private int orientation=VERTICAL_LIST; + + public ItemDecoration2(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + this.dividerHeight=mDivider.getIntrinsicHeight(); + this.dividerWidth=mDivider.getIntrinsicWidth(); + } + + /** + * 自定义分割线 + * + * @param context + * @param drawableId 分割线图片 + */ + public ItemDecoration2(Context context, @DrawableRes int drawableId) { + mDivider = ContextCompat.getDrawable(context, drawableId); + this.dividerHeight=mDivider.getIntrinsicHeight(); + this.dividerWidth=mDivider.getIntrinsicWidth(); + } + + /** + * 自定义分割线 + * 也可以使用{@link Canvas#drawRect(float, float, float, float, Paint)}或者{@link Canvas#drawText(String, float, float, Paint)}等等 + * 结合{@link Paint}去绘制各式各样的分割线 + * @param context + * @param color 整型颜色值,非资源id + * @param dividerWidth 单位为dp + * @param dividerHeight 单位为dp + */ + public ItemDecoration2(Context context, @ColorInt int color, @Dimension float dividerWidth, @Dimension float dividerHeight) { + mDivider = new ColorDrawable(color); + this.dividerWidth= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dividerWidth,context.getResources().getDisplayMetrics()); + this.dividerHeight= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dividerHeight,context.getResources().getDisplayMetrics()); + } + + + /** + * 垂直滚动,item宽度充满,高度自适应 + * 水平滚动,item高度充满,宽度自适应 + * 在itemView绘制完成之前调用,也就是说此方法draw出来的效果将会在itemView的下面 + * onDrawOver方法draw出来的效果将叠加在itemView的上面 + * @param c + * @param parent + * @param state + */ + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + if(onlySetItemOffsetsButNoDraw){ + return; + } + if(isLinearLayoutManager){ + drawLinearItemDivider(c,parent); + }else{ + drawHorizontalLine(c, parent); + drawVerticalLine(c, parent); + } + + } + + private void drawLinearItemDivider(Canvas c, RecyclerView parent){ + int spanCount = getSpanCount(parent); + int allChildCount = parent.getAdapter().getItemCount(); + int top=0,bottom=0,left=0,right=0; + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + if(orientation==VERTICAL_LIST){//画横线 + left = child.getLeft() - params.leftMargin; + right = child.getRight() + params.rightMargin; + if(drawBorderTopAndBottom){ + //加上第一条 + if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount)){ + top=child.getTop()-params.topMargin-dividerHeight; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + if(isLastRaw(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + top = child.getBottom() + params.bottomMargin; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + }else{//画竖线 + top=child.getTop()-params.topMargin; + bottom=child.getBottom()+params.bottomMargin; + if(drawBorderLeftAndRight){ + //加上第一条 + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount)){ + left=child.getLeft()-params.leftMargin-dividerWidth; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + if(isLastColum(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + left = child.getRight() + params.rightMargin; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + if(orientation==VERTICAL_LIST){ + if(drawBorderLeftAndRight){ + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + left=parent.getPaddingLeft(); + right=left+dividerWidth; + //画左边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + left=parent.getWidth()-parent.getPaddingRight()-dividerWidth; + right=left+dividerWidth; +// Log.e(TAG, "drawLinearItemDivider: "+parent.getWidth()+"#"+parent.getPaddingLeft()+"#"+mDivider.getIntrinsicWidth() ); + //画右边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + } + }else if(orientation==HORIZONTAL_LIST){ + if(drawBorderTopAndBottom){ + left=parent.getPaddingLeft(); + right=parent.getWidth()-parent.getPaddingRight(); + top=parent.getPaddingTop(); + bottom=top+dividerHeight; + //画上边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + top=parent.getHeight()-parent.getPaddingBottom()-dividerHeight; + bottom=top+dividerHeight; + //画下边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + } + } + } + + /** + * 画水平分割线 + * @param c + * @param parent + */ + private void drawHorizontalLine(Canvas c, RecyclerView parent) { + int spanCount = getSpanCount(parent); + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + int top=0,bottom=0,left=0,right=0; + left = child.getLeft() - params.leftMargin; + //因为getItemOffsets中为竖线留了空隙,所以要加上分割线的宽度(在此处处理,下面不用处理) + right = child.getRight() + params.rightMargin+ dividerWidth; + if(i==parent.getChildCount()-1 && !drawBorderLeftAndRight){ + right-=dividerWidth;//防止最后一个越界 + } + + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount) && drawBorderLeftAndRight){ + left-=dividerWidth;//下面不用处理 + } + if(drawBorderTopAndBottom){ + //加上第一条 + if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount)){ + top=child.getTop()-params.topMargin-dividerHeight; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + int allChildCount = parent.getAdapter().getItemCount(); + if(isLastRaw(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } +// Log.e(TAG, "drawVertical: "+params.getViewLayoutPosition()+"@@"+mDivider.getIntrinsicWidth()+"#"+parent.getLayoutManager().getLeftDecorationWidth(child) ); + top = child.getBottom() + params.bottomMargin; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + /** + * 画垂直分割线 + * @param c + * @param parent + */ + private void drawVerticalLine(Canvas c, RecyclerView parent) { + int spanCount = getSpanCount(parent); + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); + int left=0,right=0,top=0,bottom=0; + top=child.getTop()-params.topMargin; + //因为getItemOffsets中为横线留了空隙,所以要加上分割线的高度(上下加一处即可) + bottom=child.getBottom()+params.bottomMargin/**+mDivider.getIntrinsicHeight()*/; +// if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount) && drawBorderTopAndBottom){ +// top-=mDivider.getIntrinsicHeight(); +// } + if(drawBorderLeftAndRight){ + //加上第一条 + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount)){ + left=child.getLeft()-params.leftMargin-dividerWidth; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + int allChildCount = parent.getAdapter().getItemCount(); + if(isLastColum(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + + left = child.getRight() + params.rightMargin; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + /** + * item的偏移,如果不设置,也能画线,但是画在了item后面(被item挡住了,可以通过设置item背景透明度证实) + * @param outRect + * @param view + * @param parent + * @param state + */ + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if(!(layoutManager instanceof LinearLayoutManager)){ + throw new IllegalStateException("The LayoutManager must be LinearLayoutManager or it's subclass!!!"); + } + isLinearLayoutManager=(layoutManager instanceof LinearLayoutManager) && !(layoutManager instanceof GridLayoutManager); + if(isLinearLayoutManager){ + orientation=((LinearLayoutManager) layoutManager).getOrientation(); + }else{ + orientation=(layoutManager instanceof GridLayoutManager)?((GridLayoutManager) layoutManager).getOrientation():((StaggeredGridLayoutManager)layoutManager).getOrientation(); + } + int spanCount = getSpanCount(parent); + int childCount = parent.getAdapter().getItemCount(); + int itemPosition=((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); +// Log.e(TAG, "getItemOffsets: "+childCount+"$"+spanCount+"$"+itemPosition ); + boolean isLastRaw=isLastRaw(parent, itemPosition, spanCount, childCount); + boolean isLastColum=isLastColum(parent, itemPosition, spanCount, childCount); + boolean isFirstRaw=isFirstRaw(parent,itemPosition,spanCount); + boolean isFirstColumn=isFirstColumn(parent,itemPosition,spanCount); + int left=0,top=0,right=0,bottom=0; + if(isLinearLayoutManager){ + if(orientation==VERTICAL_LIST){ + //垂直滚动线性布局 + bottom=dividerHeight; + if(isLastRaw && !drawBorderTopAndBottom){ + bottom=0; + } + if(isFirstRaw && drawBorderTopAndBottom){ + top=dividerHeight; + } + if(drawBorderLeftAndRight){ + left=dividerWidth; + right=dividerWidth; + } + }else if(orientation==HORIZONTAL_LIST){ + right=dividerWidth; + if(isLastColum && !drawBorderLeftAndRight){ + right=0; + } + if(isFirstColumn && drawBorderLeftAndRight){ + left=dividerWidth; + } + if(drawBorderTopAndBottom){ + top=dividerHeight; + bottom=dividerHeight; + } + } + }else{ + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)layoutManager).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(itemPosition, spanCount);//左边的跨度索引值[0,spanCount)之间 + int spanIndexRight = spanIndexLeft - 1 + spanSizeLookup.getSpanSize(itemPosition);//右边的跨度索引值[0,spanCount)之间 +// Log.e(TAG, "getItemOffsets: "+spanIndexLeft +"#"+spanIndexRight+"#"+itemPosition+"$$$"+spanSizeLookup.getSpanGroupIndex(itemPosition, spanCount)); + if(orientation==VERTICAL_LIST){ + if(drawBorderLeftAndRight){ + //注:如果此处不能整除,会造成divider的宽或高不统一的bug(下同),因为Rect不支持float,所以暂无法解决 + left=dividerWidth * (spanCount - spanIndexLeft) / spanCount; + right=dividerWidth * (spanIndexRight + 1) / spanCount; + }else{ + left = dividerWidth * spanIndexLeft / spanCount; + right = dividerWidth * (spanCount - spanIndexRight - 1) / spanCount; + } + if(drawBorderTopAndBottom){ + if (spanSizeLookup.getSpanGroupIndex(itemPosition, spanCount) == 0) { + top = dividerHeight; + } else { + top = 0; + } + bottom = dividerHeight; + }else{ + if (isLastRaw) { + bottom=0; + } else { + bottom = dividerHeight; + } + top=0; + } + }else if(orientation==HORIZONTAL_LIST){ + if(drawBorderTopAndBottom){ + top=dividerHeight * (spanCount - spanIndexLeft) / spanCount; + bottom=dividerHeight * (spanIndexRight + 1) / spanCount; + }else{ + top = dividerHeight * spanIndexLeft / spanCount; + bottom = dividerHeight * (spanCount - spanIndexRight - 1) / spanCount; + } + if(drawBorderLeftAndRight){ + if(isFirstColumn){ + left=dividerWidth; + }else{ + left=0; + } + right=dividerWidth; + }else{ + if(isLastColum){ + right=0; + }else{ + right=dividerWidth; + } + left=0; + } + } + } + //Log.e(TAG, "getItemOffsets: "+left+"@"+top+"#"+right+"$"+bottom+"%"+itemPosition ); + outRect.set(left,top,right,bottom); + } + + private boolean isFirstRaw(RecyclerView parent, int pos, int spanCount){ + if (!isLinearLayoutManager) { + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)parent.getLayoutManager()).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(pos, spanCount); + if (orientation == GridLayoutManager.VERTICAL) { +// if(pos=childCount-spanCount && childCount%spanCount==0){ +// //整除的情况判断最后一整列 +// return true; +// }else if(childCount%spanCount!=0 && pos>=spanCount*(childCount/spanCount)){ +// //不能整除的情况只判断最后几个 +// return true; +// } + //=========================另一种方案============================== +// if(pos>=childCount-spanCount){ +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + int lastItemSpanGroupIndex=spanSizeLookup.getSpanGroupIndex(childCount-1,spanCount); + if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex){ + return true;//如果与最后一个元素同组则判定为最后一行 + } + } + }else{ + if (orientation == LinearLayoutManager.VERTICAL) { + //每一个都是第一列,也是最后一列 + return true; + }else{ + if(pos==childCount-1){ + return true; + } + } + } + return false; + } + + private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { + if (!isLinearLayoutManager) { + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)parent.getLayoutManager()).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(pos, spanCount); + if (orientation == GridLayoutManager.VERTICAL) { +// if(pos>=childCount-spanCount && childCount%spanCount==0){ +// //整除的情况判断最后一整行 +// return true; +// }else if(childCount%spanCount!=0 && pos>=spanCount*(childCount/spanCount)){ +// //不能整除的情况只判断最后几个 +// return true; +// } + //=======================另一种方案=============================== +// if(pos>=childCount-spanCount){ +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + //判断最后一行是否充满整行 + boolean flag=spanSizeLookup.getSpanIndex(childCount-1, spanCount)==spanCount-1 || spanCount==spanSizeLookup.getSpanSize(childCount-1); + int lastItemSpanGroupIndex=spanSizeLookup.getSpanGroupIndex(childCount-1,spanCount); + if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex){ + return true;//如果与最后一个元素同组则判定为最后一行 + } +// if(flag){ +// }else{ +// //没有充满则前一行跟最后一行都判定为最后一行 +// if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex || spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex-1){ +// return true; +// } +// } + }else{ + //最后一行或者不能整除的情况下最后一个 +// if ((pos + 1) % spanCount == 0 /**|| pos==childCount-1*/){// 如果是最后一行 +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + if(spanIndexLeft==spanCount-1 || spanCount==spanSizeLookup.getSpanSize(pos) || pos==childCount-1){ + return true; + } + } + }else{ + if (orientation == LinearLayoutManager.VERTICAL) { + if(pos==childCount-1){ + return true; + } + }else{ + //每一个都是第一行,也是最后一行 + return true; + } + } + return false; + } + + + private int getSpanCount(RecyclerView parent) { + // 列数 + int spanCount = -1; + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount(); + } + return spanCount; + } + + public boolean isDrawBorderTopAndBottom() { + return drawBorderTopAndBottom; + } + + public void setDrawBorderTopAndBottom(boolean drawBorderTopAndBottom) { + this.drawBorderTopAndBottom = drawBorderTopAndBottom; + } + + public boolean isDrawBorderLeftAndRight() { + return drawBorderLeftAndRight; + } + + public void setDrawBorderLeftAndRight(boolean drawBorderLeftAndRight) { + this.drawBorderLeftAndRight = drawBorderLeftAndRight; + } + + public boolean isOnlySetItemOffsetsButNoDraw() { + return onlySetItemOffsetsButNoDraw; + } + + public void setOnlySetItemOffsetsButNoDraw(boolean onlySetItemOffsetsButNoDraw) { + this.onlySetItemOffsetsButNoDraw = onlySetItemOffsetsButNoDraw; + } +} \ No newline at end of file diff --git a/beauty/src/main/java/com/yunbao/beauty/custom/MyRadioButton.java b/beauty/src/main/java/com/yunbao/beauty/custom/MyRadioButton.java new file mode 100644 index 000000000..52efc6a6d --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/custom/MyRadioButton.java @@ -0,0 +1,100 @@ +package com.yunbao.beauty.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.widget.RadioButton; + +import com.yunbao.beauty.R; + + +/** + * Created by cxf on 2017/7/19. + * 可以调节drawable大小的RadioButton + */ + +public class MyRadioButton extends RadioButton { + + private int mDrawableSize; + private int mTopDrawableSize; + private int mLeftDrawableSize; + private int mRightDrawableSize; + private int mBottomDrawableSize; + private Drawable mTopDrawable; + private Drawable mLeftDrawable; + private Drawable mRightDrawable; + private Drawable mBottomDrawable; + private float mScale; + + public MyRadioButton(Context context) { + this(context, null); + } + + public MyRadioButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mScale = context.getResources().getDisplayMetrics().density; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyRadioButton); + mDrawableSize = (int) ta.getDimension(R.styleable.MyRadioButton_mr_drawableSize1, dp2px(20)); + mTopDrawableSize = (int) ta.getDimension(R.styleable.MyRadioButton_mr_top_drawableSize1, mDrawableSize); + mLeftDrawableSize = (int) ta.getDimension(R.styleable.MyRadioButton_mr_left_drawableSize1, mDrawableSize); + mRightDrawableSize = (int) ta.getDimension(R.styleable.MyRadioButton_mr_right_drawableSize1, mDrawableSize); + mBottomDrawableSize = (int) ta.getDimension(R.styleable.MyRadioButton_mr_bottom_drawableSize1, mDrawableSize); + mTopDrawable = ta.getDrawable(R.styleable.MyRadioButton_mr_top_drawable1); + mLeftDrawable = ta.getDrawable(R.styleable.MyRadioButton_mr_left_drawable1); + mRightDrawable = ta.getDrawable(R.styleable.MyRadioButton_mr_right_drawable1); + mBottomDrawable = ta.getDrawable(R.styleable.MyRadioButton_mr_bottom_drawable1); + ta.recycle(); + + } + + public void setTopDrawable(Drawable topDrawable) { + mTopDrawable = topDrawable; + } + + public void setBottomDrawable(Drawable bottomDrawable) { + mBottomDrawable = bottomDrawable; + } + + public void setLeftDrawable(Drawable leftDrawable) { + mLeftDrawable = leftDrawable; + } + + public void setRightDrawable(Drawable rightDrawable) { + mRightDrawable = rightDrawable; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + setCompoundDrawablesWithIntrinsicBounds(mLeftDrawable, mTopDrawable, mRightDrawable, mBottomDrawable); + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + if (left != null) { + left.setBounds(0, 0, mLeftDrawableSize, mLeftDrawableSize); + } + if (top != null) { + top.setBounds(0, 0, mTopDrawableSize, mTopDrawableSize); + } + if (right != null) { + right.setBounds(0, 0, mRightDrawableSize, mRightDrawableSize); + } + if (bottom != null) { + bottom.setBounds(0, 0, mBottomDrawableSize, mBottomDrawableSize); + } + setCompoundDrawables(left, top, right, bottom); + } + + + private int dp2px(int dpVal) { + return (int) (dpVal * mScale + 0.5f); + } + +} diff --git a/beauty/src/main/java/com/yunbao/beauty/custom/SquareImageView2.java b/beauty/src/main/java/com/yunbao/beauty/custom/SquareImageView2.java new file mode 100644 index 000000000..b176822db --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/custom/SquareImageView2.java @@ -0,0 +1,31 @@ +package com.yunbao.beauty.custom; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * Created by cxf on 2018/6/7. + */ + +public class SquareImageView2 extends ImageView { + public SquareImageView2(Context context) { + super(context); + } + + public SquareImageView2(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareImageView2(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/custom/TextSeekBar.java b/beauty/src/main/java/com/yunbao/beauty/custom/TextSeekBar.java new file mode 100644 index 000000000..a939f6739 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/custom/TextSeekBar.java @@ -0,0 +1,113 @@ +package com.yunbao.beauty.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.yunbao.beauty.R; + +/** + * Created by cxf on 2018/6/22. + */ + +public class TextSeekBar extends FrameLayout implements SeekBar.OnSeekBarChangeListener { + + private SeekBar mSeekBar; + private TextView mTextView; + private TextView mProgressVal; + private Context mContext; + private String mText; + private int mProgress; + private OnSeekChangeListener mOnSeekChangeListener; + + public TextSeekBar(Context context) { + this(context, null); + } + + public TextSeekBar(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TextSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + TypedArray ta = context.getResources().obtainAttributes(attrs, R.styleable.TextSeekBar); + mText = ta.getString(R.styleable.TextSeekBar_text2); + mProgress = ta.getInteger(R.styleable.TextSeekBar_progressVal, 0); + ta.recycle(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + View v = LayoutInflater.from(mContext).inflate(R.layout.view_seek_group, this, false); + mSeekBar = (SeekBar) v.findViewById(R.id.seekBar); + mTextView = (TextView) v.findViewById(R.id.text); + mProgressVal = (TextView) v.findViewById(R.id.progressVal); + mSeekBar.setProgress(mProgress); + mSeekBar.setOnSeekBarChangeListener(this); + mTextView.setText(mText); + mProgressVal.setText(String.valueOf(mProgress)); + addView(v); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + mProgress = progress; + mProgressVal.setText(String.valueOf(progress)); + if (mOnSeekChangeListener != null) { + mOnSeekChangeListener.onProgressChanged(TextSeekBar.this, progress); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + public int getProgress() { + return mProgress; + } + + public void setProgress(int progress) { + mProgress = progress; + if (mSeekBar != null) { + mSeekBar.setProgress(progress); + } + } + + public float getFloatProgress() { + return mProgress / 100f; + } + + public void setOnSeekChangeListener(OnSeekChangeListener listener) { + mOnSeekChangeListener = listener; + } + + + public interface OnSeekChangeListener { + void onProgressChanged(View view, int progress); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (mSeekBar != null) { + mSeekBar.setEnabled(enabled); + } + if (enabled) { + setAlpha(1f); + } else { + setAlpha(0.5f); + } + } + +} diff --git a/beauty/src/main/java/com/yunbao/beauty/interfaces/Beauty360EffectListener.java b/beauty/src/main/java/com/yunbao/beauty/interfaces/Beauty360EffectListener.java new file mode 100644 index 000000000..ef85870d2 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/interfaces/Beauty360EffectListener.java @@ -0,0 +1,43 @@ +package com.yunbao.beauty.interfaces; + +import cn.tillusory.sdk.bean.TiDistortionEnum; +import cn.tillusory.sdk.bean.TiFilterEnum; +import cn.tillusory.sdk.bean.TiRockEnum; + +/** + * Created by cxf on 2018/10/8. + * 360美颜回调 + */ + +public interface Beauty360EffectListener extends BeautyEffectListener { + + //滤镜类型 + void onFilterChanged(String filtertype); + + //滤镜强度 + void onFilterStrength(int filterValue); + + //白皙 + void onMeiBaiChanged(int progress); + + //美颜强度 + void onSkinsoftStrengthChanged(int progress); + + //红润 + void onHongRunChanged(int progress); + + //粉嫩 + void onFengNenChanged(int progress); + + void onBigEyeChanged(int progress); + + void onFaceChanged(int progress); + + void onTieZhiChanged(String tieZhiName); + + void onHaHaChanged(TiDistortionEnum tiDistortionEnum); + + void onRockChanged(TiRockEnum tiRockEnum); + + void onFaceNarrowing(int progress); +} diff --git a/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyEffectListener.java b/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyEffectListener.java new file mode 100644 index 000000000..ffa9c0a2b --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyEffectListener.java @@ -0,0 +1,8 @@ +package com.yunbao.beauty.interfaces; + +/** + * Created by cxf on 2018/12/13. + */ + +public interface BeautyEffectListener { +} diff --git a/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyViewHolder.java b/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyViewHolder.java new file mode 100644 index 000000000..15802aa6b --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/interfaces/BeautyViewHolder.java @@ -0,0 +1,24 @@ +package com.yunbao.beauty.interfaces; + +/** + * Created by cxf on 2018/12/13. + */ + +public interface BeautyViewHolder { + + void setEffectListener(BeautyEffectListener effectListener); + + void show(); + + void hide(); + + boolean isShowed(); + + void release(); + + void setVisibleListener(VisibleListener visibleListener); + + interface VisibleListener { + void onVisibleChanged(boolean visible); + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/interfaces/DefaultBeautyEffectListener.java b/beauty/src/main/java/com/yunbao/beauty/interfaces/DefaultBeautyEffectListener.java new file mode 100644 index 000000000..9a2167e21 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/interfaces/DefaultBeautyEffectListener.java @@ -0,0 +1,20 @@ +package com.yunbao.beauty.interfaces; + +import com.yunbao.beauty.bean.FilterBean; + +/** + * Created by cxf on 2018/10/8. + * 基础美颜回调 + */ + +public interface DefaultBeautyEffectListener extends BeautyEffectListener { + + void onFilterChanged(FilterBean filterBean); + + void onMeiBaiChanged(int progress); + + void onMoPiChanged(int progress); + + void onHongRunChanged(int progress); + +} diff --git a/beauty/src/main/java/com/yunbao/beauty/interfaces/TiBeautyEffectListener.java b/beauty/src/main/java/com/yunbao/beauty/interfaces/TiBeautyEffectListener.java new file mode 100644 index 000000000..f0b3e6e29 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/interfaces/TiBeautyEffectListener.java @@ -0,0 +1,35 @@ +package com.yunbao.beauty.interfaces; + +import cn.tillusory.sdk.bean.TiDistortionEnum; +import cn.tillusory.sdk.bean.TiFilterEnum; +import cn.tillusory.sdk.bean.TiRockEnum; + +/** + * Created by cxf on 2018/10/8. + * 萌颜美颜回调 + */ + +public interface TiBeautyEffectListener extends BeautyEffectListener { + + void onFilterChanged(TiFilterEnum tiFilterEnum); + + void onMeiBaiChanged(int progress); + + void onMoPiChanged(int progress); + + void onBaoHeChanged(int progress); + + void onFengNenChanged(int progress); + + void onBigEyeChanged(int progress); + + void onFaceChanged(int progress); + + void onTieZhiChanged(String tieZhiName); + + void onHaHaChanged(TiDistortionEnum tiDistortionEnum); + + void onRockChanged(TiRockEnum tiRockEnum); + + void onFaceNarrowing(int progress); +} diff --git a/beauty/src/main/java/com/yunbao/beauty/views/Beauty360ViewHolder.java b/beauty/src/main/java/com/yunbao/beauty/views/Beauty360ViewHolder.java new file mode 100644 index 000000000..ab0e2dcb9 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/views/Beauty360ViewHolder.java @@ -0,0 +1,440 @@ +package com.yunbao.beauty.views; + +import android.app.Activity; +import android.content.Context; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import com.by.lib_beauty360.AppConfig; +import com.by.lib_beauty360.ItemData4LvJing; +import com.by.lib_beauty360.ItemData4TieZhi; +import com.by.lib_beauty360.RecycleView.HomeItemCell4LvJing; +import com.by.lib_beauty360.RecycleView.HomeItemCell4Tiezhi; +import com.by.lib_beauty360.RecycleView.IRecycleCell; +import com.by.lib_beauty360.RecycleView.MyItemClickListener; +import com.by.lib_beauty360.RecycleView.MyItemClickListener4Tiezhi; +import com.by.lib_beauty360.RecycleView.MyRecycleAdapter4LvJing; +import com.by.lib_beauty360.RecycleView.MyRecycleAdapter4Tiezhi; +import com.yunbao.beauty.R; +import com.yunbao.beauty.adapter.RockAdapter; +import com.yunbao.beauty.custom.ItemDecoration2; +import com.yunbao.beauty.custom.TextSeekBar; +import com.yunbao.beauty.interfaces.Beauty360EffectListener; +import com.yunbao.beauty.interfaces.BeautyEffectListener; +import com.yunbao.beauty.interfaces.BeautyViewHolder; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.bean.ConfigBean; +import com.yunbao.common.views.AbsViewHolder; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import cn.tillusory.sdk.bean.TiDistortionEnum; +import cn.tillusory.sdk.bean.TiRockEnum; + + +/** + * Created by cxf on 2018/6/22. + * Camera360美颜UI相关 + */ + +public class Beauty360ViewHolder extends AbsViewHolder implements + View.OnClickListener, BeautyViewHolder, MyItemClickListener , MyItemClickListener4Tiezhi { + + private SparseArray mSparseArray; + private int mCurKey; +// private TieZhiAdapter mTieZhiAdapter; + private Beauty360EffectListener mEffectListener; + private VisibleListener mVisibleListener; + private boolean mShowed; + private List mListData4LvJing; + private List mListData4TieZhi; + private String mCurFilterStrength; + private String mCurTiezhiName; + private int mFilterValue = 100; + private MyRecycleAdapter4LvJing mAdapter4LvJing; + private MyRecycleAdapter4Tiezhi mAdapter4Tiezhi; + Activity mActivity; + + public Beauty360ViewHolder(Context context, ViewGroup parentView) { + super(context, parentView); + } + public Beauty360ViewHolder(Activity activity, ViewGroup parentView) { + super(activity, parentView); + mActivity= activity; + } + @Override + protected int getLayoutId() { + return R.layout.view_beauty360; + } + + @Override + public void init() { + findViewById(R.id.btn_beauty).setOnClickListener(this); + findViewById(R.id.btn_beauty_shape).setOnClickListener(this); + findViewById(R.id.btn_meng).setOnClickListener(this); + findViewById(R.id.btn_filter).setOnClickListener(this); + findViewById(R.id.btn_hide).setOnClickListener(this); + findViewById(R.id.btn_rock).setOnClickListener(this); + findViewById(R.id.btn_haha).setOnClickListener(this); + findViewById(R.id.btn_haha_0).setOnClickListener(this); + findViewById(R.id.btn_haha_1).setOnClickListener(this); + findViewById(R.id.btn_haha_2).setOnClickListener(this); + findViewById(R.id.btn_haha_3).setOnClickListener(this); + findViewById(R.id.btn_haha_4).setOnClickListener(this); + mSparseArray = new SparseArray<>(); + mSparseArray.put(R.id.btn_beauty, findViewById(R.id.group_beauty)); + mSparseArray.put(R.id.btn_beauty_shape, findViewById(R.id.group_beauty_shape)); + mSparseArray.put(R.id.btn_meng, findViewById(R.id.group_meng)); + mSparseArray.put(R.id.btn_filter, findViewById(R.id.group_filter)); + mSparseArray.put(R.id.btn_rock, findViewById(R.id.group_rock)); + mSparseArray.put(R.id.btn_haha, findViewById(R.id.group_haha)); + mCurKey = R.id.btn_beauty; + TextSeekBar.OnSeekChangeListener onSeekChangeListener = new TextSeekBar.OnSeekChangeListener() { + @Override + public void onProgressChanged(View view, int progress) { + if (mEffectListener != null) { + int i = view.getId(); + if (i == R.id.seek_baixi) { + mEffectListener.onMeiBaiChanged(progress); + + } else if (i == R.id.seek_skin_strength) { + mEffectListener.onSkinsoftStrengthChanged(progress); + + } else if (i == R.id.seek_hongrun) { + mEffectListener.onHongRunChanged(progress); + + } else if (i == R.id.seek_fengnen) { + mEffectListener.onFengNenChanged(progress); + + } else if (i == R.id.seek_big_eye) { + mEffectListener.onBigEyeChanged(progress); + + } + else if (i == R.id.seek_filter_strength) { + //滤镜强度 + mEffectListener.onFilterStrength(progress); + + }else if (i == R.id.seek_face) { + mEffectListener.onFaceChanged(progress); + } + else if (i == R.id.seek_face_strength) { + mEffectListener.onFaceNarrowing(progress); + } + } + } + }; + + TextSeekBar seekMeiBai = ((TextSeekBar) findViewById(R.id.seek_baixi)); + TextSeekBar seekMoPi = ((TextSeekBar) findViewById(R.id.seek_skin_strength)); + TextSeekBar seekBaoHe = ((TextSeekBar) findViewById(R.id.seek_hongrun)); + TextSeekBar seekFenNen = ((TextSeekBar) findViewById(R.id.seek_fengnen)); + TextSeekBar seekBigEye = ((TextSeekBar) findViewById(R.id.seek_big_eye)); + + TextSeekBar seekFilterStrength = ((TextSeekBar) findViewById(R.id.seek_filter_strength)); + TextSeekBar seekFace = ((TextSeekBar) findViewById(R.id.seek_face)); + TextSeekBar seekFaceNarrowing = ((TextSeekBar) findViewById(R.id.seek_face_strength)); + seekMeiBai.setOnSeekChangeListener(onSeekChangeListener); + seekMoPi.setOnSeekChangeListener(onSeekChangeListener); + seekBaoHe.setOnSeekChangeListener(onSeekChangeListener); + seekFenNen.setOnSeekChangeListener(onSeekChangeListener); + seekBigEye.setOnSeekChangeListener(onSeekChangeListener); + + seekFilterStrength.setOnSeekChangeListener(onSeekChangeListener); + seekFace.setOnSeekChangeListener(onSeekChangeListener); + seekFaceNarrowing.setOnSeekChangeListener(onSeekChangeListener); + ConfigBean configBean = CommonAppConfig.getInstance().getConfig(); + if (configBean != null) { + seekMeiBai.setProgress(configBean.getBeautyMeiBai()); + seekMoPi.setProgress(configBean.getBeautyMoPi()); + seekBaoHe.setProgress(configBean.getBeautyBaoHe()); + seekFenNen.setProgress(configBean.getBeautyFenNen()); + seekBigEye.setProgress(configBean.getBeautyBigEye()); + seekFilterStrength.setProgress(50); + seekFace.setProgress(configBean.getBeautyFace()); + //seekFaceNarrowing.setProgress(configBean.seekFaceNarrowing()); + } + //贴纸 +// RecyclerView tieZhiRecyclerView = (RecyclerView) findViewById(R.id.tiezhi_recyclerView); +// tieZhiRecyclerView.setHasFixedSize(true); +// tieZhiRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 6, GridLayoutManager.VERTICAL, false)); +// ItemDecoration2 decoration1 = new ItemDecoration2(mContext, 0x00000000, 8, 8); +// decoration1.setOnlySetItemOffsetsButNoDraw(true); +// tieZhiRecyclerView.addItemDecoration(decoration1); +// mTieZhiAdapter = new TieZhiAdapter(mContext); +// mTieZhiAdapter.setOnItemClickListener(new OnItemClickListener() { +// @Override +// public void onItemClick(TieZhiBean bean, int position) { +// if (mEffectListener != null) { +// mEffectListener.onTieZhiChanged(bean.getName()); +// } +// } +// }); +// tieZhiRecyclerView.setAdapter(mTieZhiAdapter); + + RecyclerView tieZhiRecyclerView = (RecyclerView) findViewById(R.id.tiezhi_recyclerView); + tieZhiRecyclerView.setHasFixedSize(true); + tieZhiRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 6, GridLayoutManager.VERTICAL, false)); + ItemDecoration2 decoration1 = new ItemDecoration2(mContext, 0x00000000, 8, 8); + decoration1.setOnlySetItemOffsetsButNoDraw(true); + tieZhiRecyclerView.addItemDecoration(decoration1); + + ConstructList4TieZhi(); + + mAdapter4Tiezhi = new MyRecycleAdapter4Tiezhi(mActivity, mListData4TieZhi); + tieZhiRecyclerView.setAdapter(mAdapter4Tiezhi); + tieZhiRecyclerView.setItemAnimator(new DefaultItemAnimator()); + + + //滤镜 +// RecyclerView filterRecyclerView = (RecyclerView) findViewById(R.id.filter_recyclerView); +// filterRecyclerView.setHasFixedSize(true); +// filterRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); +// FilterAdapter filterAdapter = new FilterAdapter(mContext); +// filterAdapter.setOnItemClickListener(new OnItemClickListener() { +// @Override +// public void onItemClick(FilterBean bean, int position) { +// if (mEffectListener != null) { +// mEffectListener.onFilterChanged(bean.getTiFilterEnum()); +// } +// } +// }); +// filterRecyclerView.setAdapter(filterAdapter); + + + //滤镜 + RecyclerView mFilterRecycleView = (RecyclerView) findViewById(R.id.filter_recyclerView); + LinearLayoutManager mLayoutManager = new LinearLayoutManager(mFilterRecycleView.getContext(), LinearLayoutManager.HORIZONTAL, false); + mFilterRecycleView.setLayoutManager(mLayoutManager); + ConstructList4LvJing(); + + mAdapter4LvJing = new MyRecycleAdapter4LvJing(mActivity, mListData4LvJing); + mFilterRecycleView.setAdapter(mAdapter4LvJing); + mFilterRecycleView.setItemAnimator(new DefaultItemAnimator()); + + //抖动 + RecyclerView rockRecyclerView = (RecyclerView) findViewById(R.id.rock_recyclerView); + rockRecyclerView.setHasFixedSize(true); + rockRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); + RockAdapter rockAdapter = new RockAdapter(mContext); + rockAdapter.setActionListener(new RockAdapter.ActionListener() { + @Override + public void onItemClick(TiRockEnum tiRockEnum) { + if (mEffectListener != null) { + mEffectListener.onRockChanged(tiRockEnum); + } + } + }); + rockRecyclerView.setAdapter(rockAdapter); + + + + } + + + + private void ConstructList4LvJing() { + mListData4LvJing = new ArrayList<>(); + for (int i = 0; i < AppConfig.mFilterName.length; ++i) { + ItemData4LvJing itemData = new ItemData4LvJing(); + itemData.filterName = AppConfig.mFilterNameAll[i]; + itemData.filterType = AppConfig.mFilterTypeAll[i]; + itemData.filterPictrue=AppConfig.mFilterPictrueAll[i]; + mListData4LvJing.add(new HomeItemCell4LvJing(mActivity, itemData, this)); + } + } + private void ConstructList4TieZhi() { + mListData4TieZhi = new ArrayList<>(); + + //遍历解压缩后的文件夹,获取所有贴纸列表 + String path= CommonAppConfig.VIDEO_TIE_ZHI_PATH+CommonAppConfig.TIEZHI_360_NAME + + File.separator + "StickerResource_20170502"; + + File file=new File(path); + if (file.exists()){ + File[] fileList= file.listFiles(); + int len=fileList.length; + String [] tiezhiArray=new String[len]; + for (int i=0;i mSparseArray; + private int mCurKey; + private FilterAdapter mFilterAdapter; + private DefaultBeautyEffectListener mEffectListener; + private VisibleListener mVisibleListener; + private boolean mShowed; + + public DefaultBeautyViewHolder(Context context, ViewGroup parentView) { + super(context, parentView); + } + + @Override + protected int getLayoutId() { + return R.layout.view_beauty_default; + } + + @Override + public void init() { + findViewById(R.id.btn_beauty).setOnClickListener(this); + findViewById(R.id.btn_filter).setOnClickListener(this); + findViewById(R.id.btn_hide).setOnClickListener(this); + mSparseArray = new SparseArray<>(); + mSparseArray.put(R.id.btn_beauty, findViewById(R.id.group_beauty)); + mSparseArray.put(R.id.btn_filter, findViewById(R.id.group_filter)); + mCurKey = R.id.btn_beauty; + TextSeekBar.OnSeekChangeListener onSeekChangeListener = new TextSeekBar.OnSeekChangeListener() { + @Override + public void onProgressChanged(View view, int progress) { + if (mEffectListener != null) { + int i = view.getId(); + if (i == R.id.seek_baixi) { + mEffectListener.onMeiBaiChanged(progress); + } else if (i == R.id.seek_skin_strength) { + mEffectListener.onMoPiChanged(progress); + } else if (i == R.id.seek_hongrun) { + mEffectListener.onHongRunChanged(progress); + } + } + } + }; + + TextSeekBar seekMeiBai = ((TextSeekBar) findViewById(R.id.seek_baixi)); + TextSeekBar seekMoPi = ((TextSeekBar) findViewById(R.id.seek_skin_strength)); + TextSeekBar seekHongRun = ((TextSeekBar) findViewById(R.id.seek_hongrun)); + seekMeiBai.setOnSeekChangeListener(onSeekChangeListener); + seekMoPi.setOnSeekChangeListener(onSeekChangeListener); + seekHongRun.setOnSeekChangeListener(onSeekChangeListener); + + //滤镜 + RecyclerView filterRecyclerView = (RecyclerView) findViewById(R.id.filter_recyclerView); + filterRecyclerView.setHasFixedSize(true); + filterRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); + mFilterAdapter = new FilterAdapter(mContext); + mFilterAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(FilterBean bean, int position) { + if (mEffectListener != null) { + mEffectListener.onFilterChanged(bean); + } + } + }); + filterRecyclerView.setAdapter(mFilterAdapter); + } + + + @Override + public void setEffectListener(BeautyEffectListener effectListener) { + if (effectListener != null && effectListener instanceof DefaultBeautyEffectListener) { + mEffectListener = (DefaultBeautyEffectListener) effectListener; + } + } + + @Override + public void show() { + if (mVisibleListener != null) { + mVisibleListener.onVisibleChanged(true); + } + if (mParentView != null && mContentView != null) { + ViewParent parent = mContentView.getParent(); + if (parent != null) { + ((ViewGroup) parent).removeView(mContentView); + } + mParentView.addView(mContentView); + } + mShowed = true; + } + + @Override + public void hide() { + removeFromParent(); + if (mVisibleListener != null) { + mVisibleListener.onVisibleChanged(false); + } + mShowed = false; + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.btn_beauty || id == R.id.btn_filter) { + toggle(id); + } else if (id == R.id.btn_hide) { + hide(); + } + } + + private void toggle(int key) { + if (mCurKey == key) { + return; + } + mCurKey = key; + for (int i = 0, size = mSparseArray.size(); i < size; i++) { + View v = mSparseArray.valueAt(i); + if (mSparseArray.keyAt(i) == key) { + if (v.getVisibility() != View.VISIBLE) { + v.setVisibility(View.VISIBLE); + } + } else { + if (v.getVisibility() == View.VISIBLE) { + v.setVisibility(View.INVISIBLE); + } + } + } + } + + @Override + public boolean isShowed() { + return mShowed; + } + + @Override + public void release() { + mVisibleListener = null; + mEffectListener = null; + } + + @Override + public void setVisibleListener(VisibleListener visibleListener) { + mVisibleListener = visibleListener; + } +} diff --git a/beauty/src/main/java/com/yunbao/beauty/views/TiBeautyViewHolder.java b/beauty/src/main/java/com/yunbao/beauty/views/TiBeautyViewHolder.java new file mode 100644 index 000000000..e4888d5f3 --- /dev/null +++ b/beauty/src/main/java/com/yunbao/beauty/views/TiBeautyViewHolder.java @@ -0,0 +1,284 @@ +package com.yunbao.beauty.views; + +import android.content.Context; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import com.yunbao.beauty.adapter.FilterAdapter; +import com.yunbao.beauty.adapter.RockAdapter; +import com.yunbao.beauty.adapter.TieZhiAdapter; +import com.yunbao.beauty.bean.FilterBean; +import com.yunbao.beauty.bean.TieZhiBean; +import com.yunbao.beauty.custom.ItemDecoration2; +import com.yunbao.beauty.custom.TextSeekBar; +import com.yunbao.beauty.interfaces.BeautyViewHolder; +import com.yunbao.beauty.interfaces.BeautyEffectListener; +import com.yunbao.beauty.interfaces.TiBeautyEffectListener; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.beauty.R; +import com.yunbao.common.bean.ConfigBean; +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.views.AbsViewHolder; + +import cn.tillusory.sdk.bean.TiDistortionEnum; +import cn.tillusory.sdk.bean.TiRockEnum; + + +/** + * Created by cxf on 2018/6/22. + * 萌颜UI相关 + */ + +public class TiBeautyViewHolder extends AbsViewHolder implements View.OnClickListener, BeautyViewHolder { + + private SparseArray mSparseArray; + private int mCurKey; + private TieZhiAdapter mTieZhiAdapter; + private TiBeautyEffectListener mEffectListener; + private VisibleListener mVisibleListener; + private boolean mShowed; + + public TiBeautyViewHolder(Context context, ViewGroup parentView) { + super(context, parentView); + } + + @Override + protected int getLayoutId() { + return R.layout.view_beauty; + } + + @Override + public void init() { + findViewById(R.id.btn_beauty).setOnClickListener(this); + findViewById(R.id.btn_beauty_shape).setOnClickListener(this); + findViewById(R.id.btn_meng).setOnClickListener(this); + findViewById(R.id.btn_filter).setOnClickListener(this); + findViewById(R.id.btn_hide).setOnClickListener(this); + findViewById(R.id.btn_rock).setOnClickListener(this); + findViewById(R.id.btn_haha).setOnClickListener(this); + findViewById(R.id.btn_haha_0).setOnClickListener(this); + findViewById(R.id.btn_haha_1).setOnClickListener(this); + findViewById(R.id.btn_haha_2).setOnClickListener(this); + findViewById(R.id.btn_haha_3).setOnClickListener(this); + findViewById(R.id.btn_haha_4).setOnClickListener(this); + mSparseArray = new SparseArray<>(); + mSparseArray.put(R.id.btn_beauty, findViewById(R.id.group_beauty)); + mSparseArray.put(R.id.btn_beauty_shape, findViewById(R.id.group_beauty_shape)); + mSparseArray.put(R.id.btn_meng, findViewById(R.id.group_meng)); + mSparseArray.put(R.id.btn_filter, findViewById(R.id.group_filter)); + mSparseArray.put(R.id.btn_rock, findViewById(R.id.group_rock)); + mSparseArray.put(R.id.btn_haha, findViewById(R.id.group_haha)); + mCurKey = R.id.btn_beauty; + TextSeekBar.OnSeekChangeListener onSeekChangeListener = new TextSeekBar.OnSeekChangeListener() { + @Override + public void onProgressChanged(View view, int progress) { + if (mEffectListener != null) { + int i = view.getId(); + if (i == R.id.seek_baixi) { + mEffectListener.onMeiBaiChanged(progress); + + } else if (i == R.id.seek_skin_strength) { + mEffectListener.onMoPiChanged(progress); + + } else if (i == R.id.seek_hongrun) { + mEffectListener.onBaoHeChanged(progress); + + } else if (i == R.id.seek_fengnen) { + mEffectListener.onFengNenChanged(progress); + + } else if (i == R.id.seek_big_eye) { + mEffectListener.onBigEyeChanged(progress); + + } else if (i == R.id.seek_face) { + mEffectListener.onFaceChanged(progress); + } + else if (i == R.id.seek_face_strength) { + mEffectListener.onFaceNarrowing(progress); + } + } + } + }; + + TextSeekBar seekMeiBai = ((TextSeekBar) findViewById(R.id.seek_baixi)); + TextSeekBar seekMoPi = ((TextSeekBar) findViewById(R.id.seek_skin_strength)); + TextSeekBar seekBaoHe = ((TextSeekBar) findViewById(R.id.seek_hongrun)); + TextSeekBar seekFenNen = ((TextSeekBar) findViewById(R.id.seek_fengnen)); + TextSeekBar seekBigEye = ((TextSeekBar) findViewById(R.id.seek_big_eye)); + TextSeekBar seekFace = ((TextSeekBar) findViewById(R.id.seek_face)); + TextSeekBar seekFaceNarrowing = ((TextSeekBar) findViewById(R.id.seek_face_strength)); + seekMeiBai.setOnSeekChangeListener(onSeekChangeListener); + seekMoPi.setOnSeekChangeListener(onSeekChangeListener); + seekBaoHe.setOnSeekChangeListener(onSeekChangeListener); + seekFenNen.setOnSeekChangeListener(onSeekChangeListener); + seekBigEye.setOnSeekChangeListener(onSeekChangeListener); + seekFace.setOnSeekChangeListener(onSeekChangeListener); + seekFaceNarrowing.setOnSeekChangeListener(onSeekChangeListener); + ConfigBean configBean = CommonAppConfig.getInstance().getConfig(); + if (configBean != null) { + seekMeiBai.setProgress(configBean.getBeautyMeiBai()); + seekMoPi.setProgress(configBean.getBeautyMoPi()); + seekBaoHe.setProgress(configBean.getBeautyBaoHe()); + seekFenNen.setProgress(configBean.getBeautyFenNen()); + seekBigEye.setProgress(configBean.getBeautyBigEye()); + seekFace.setProgress(configBean.getBeautyFace()); + //seekFaceNarrowing.setProgress(configBean.seekFaceNarrowing()); + } + //贴纸 + RecyclerView tieZhiRecyclerView = (RecyclerView) findViewById(R.id.tiezhi_recyclerView); + tieZhiRecyclerView.setHasFixedSize(true); + tieZhiRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 6, GridLayoutManager.VERTICAL, false)); + ItemDecoration2 decoration1 = new ItemDecoration2(mContext, 0x00000000, 8, 8); + decoration1.setOnlySetItemOffsetsButNoDraw(true); + tieZhiRecyclerView.addItemDecoration(decoration1); + mTieZhiAdapter = new TieZhiAdapter(mContext); + mTieZhiAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(TieZhiBean bean, int position) { + if (mEffectListener != null) { + mEffectListener.onTieZhiChanged(bean.getName()); + } + } + }); + tieZhiRecyclerView.setAdapter(mTieZhiAdapter); + //滤镜 + RecyclerView filterRecyclerView = (RecyclerView) findViewById(R.id.filter_recyclerView); + filterRecyclerView.setHasFixedSize(true); + filterRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); + FilterAdapter filterAdapter = new FilterAdapter(mContext); + filterAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(FilterBean bean, int position) { + if (mEffectListener != null) { + mEffectListener.onFilterChanged(bean.getTiFilterEnum()); + } + } + }); + filterRecyclerView.setAdapter(filterAdapter); + //抖动 + RecyclerView rockRecyclerView = (RecyclerView) findViewById(R.id.rock_recyclerView); + rockRecyclerView.setHasFixedSize(true); + rockRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); + RockAdapter rockAdapter = new RockAdapter(mContext); + rockAdapter.setActionListener(new RockAdapter.ActionListener() { + @Override + public void onItemClick(TiRockEnum tiRockEnum) { + if (mEffectListener != null) { + mEffectListener.onRockChanged(tiRockEnum); + } + } + }); + rockRecyclerView.setAdapter(rockAdapter); + } + + + @Override + public void setEffectListener(BeautyEffectListener effectListener) { + if (effectListener != null && effectListener instanceof TiBeautyEffectListener) { + mEffectListener = (TiBeautyEffectListener) effectListener; + } + } + + @Override + public void show() { + if (mVisibleListener != null) { + mVisibleListener.onVisibleChanged(true); + } + if (mParentView != null && mContentView != null) { + ViewParent parent = mContentView.getParent(); + if (parent != null) { + ((ViewGroup) parent).removeView(mContentView); + } + mParentView.addView(mContentView); + } + mShowed = true; + } + + @Override + public void hide() { + removeFromParent(); + if (mVisibleListener != null) { + mVisibleListener.onVisibleChanged(false); + } + mShowed = false; + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.btn_beauty || id == R.id.btn_beauty_shape || id == R.id.btn_meng || id == R.id.btn_filter || id == R.id.btn_rock || id == R.id.btn_haha) { + toggle(id); + + } else if (id == R.id.btn_hide) { + hide(); + + } else if (id == R.id.btn_haha_0) { + if (mEffectListener != null) { + mEffectListener.onHaHaChanged(TiDistortionEnum.NO_DISTORTION); + } + + } else if (id == R.id.btn_haha_1) { + if (mEffectListener != null) { + mEffectListener.onHaHaChanged(TiDistortionEnum.ET_DISTORTION); + } + + } else if (id == R.id.btn_haha_2) { + if (mEffectListener != null) { + mEffectListener.onHaHaChanged(TiDistortionEnum.PEAR_FACE_DISTORTION); + } + + } else if (id == R.id.btn_haha_3) { + if (mEffectListener != null) { + mEffectListener.onHaHaChanged(TiDistortionEnum.SLIM_FACE_DISTORTION); + } + + } else if (id == R.id.btn_haha_4) { + if (mEffectListener != null) { + mEffectListener.onHaHaChanged(TiDistortionEnum.SQUARE_FACE_DISTORTION); + } + + } + } + + private void toggle(int key) { + if (mCurKey == key) { + return; + } + mCurKey = key; + for (int i = 0, size = mSparseArray.size(); i < size; i++) { + View v = mSparseArray.valueAt(i); + if (mSparseArray.keyAt(i) == key) { + if (v.getVisibility() != View.VISIBLE) { + v.setVisibility(View.VISIBLE); + } + } else { + if (v.getVisibility() == View.VISIBLE) { + v.setVisibility(View.INVISIBLE); + } + } + } + } + + @Override + public boolean isShowed() { + return mShowed; + } + + @Override + public void release() { + mVisibleListener = null; + mEffectListener = null; + if (mTieZhiAdapter != null) { + mTieZhiAdapter.clear(); + } + } + + @Override + public void setVisibleListener(VisibleListener visibleListener) { + mVisibleListener = visibleListener; + } +} diff --git a/beauty/src/main/jniLibs/arm64-v8a/libTiSDK.so b/beauty/src/main/jniLibs/arm64-v8a/libTiSDK.so new file mode 100644 index 000000000..d591e2bbf Binary files /dev/null and b/beauty/src/main/jniLibs/arm64-v8a/libTiSDK.so differ diff --git a/beauty/src/main/jniLibs/armeabi-v7a/libTiSDK.so b/beauty/src/main/jniLibs/armeabi-v7a/libTiSDK.so new file mode 100644 index 000000000..24620baea Binary files /dev/null and b/beauty/src/main/jniLibs/armeabi-v7a/libTiSDK.so differ diff --git a/beauty/src/main/res/color/fg_btn_beauty.xml b/beauty/src/main/res/color/fg_btn_beauty.xml new file mode 100644 index 000000000..a7dcd6a66 --- /dev/null +++ b/beauty/src/main/res/color/fg_btn_beauty.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/drawable/bg_btn_beauty.xml b/beauty/src/main/res/drawable/bg_btn_beauty.xml new file mode 100644 index 000000000..67a8b1cea --- /dev/null +++ b/beauty/src/main/res/drawable/bg_btn_beauty.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/drawable/bg_haha.xml b/beauty/src/main/res/drawable/bg_haha.xml new file mode 100644 index 000000000..c17a57a7c --- /dev/null +++ b/beauty/src/main/res/drawable/bg_haha.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/drawable/bg_item_tiezhi.xml b/beauty/src/main/res/drawable/bg_item_tiezhi.xml new file mode 100644 index 000000000..85aff1ed8 --- /dev/null +++ b/beauty/src/main/res/drawable/bg_item_tiezhi.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/item_list_filter.xml b/beauty/src/main/res/layout/item_list_filter.xml new file mode 100644 index 000000000..5d804d33e --- /dev/null +++ b/beauty/src/main/res/layout/item_list_filter.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/item_list_tiezhi.xml b/beauty/src/main/res/layout/item_list_tiezhi.xml new file mode 100644 index 000000000..f6d06ab7f --- /dev/null +++ b/beauty/src/main/res/layout/item_list_tiezhi.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/view_beauty.xml b/beauty/src/main/res/layout/view_beauty.xml new file mode 100644 index 000000000..58cdb8458 --- /dev/null +++ b/beauty/src/main/res/layout/view_beauty.xml @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/view_beauty360.xml b/beauty/src/main/res/layout/view_beauty360.xml new file mode 100644 index 000000000..85ef56be2 --- /dev/null +++ b/beauty/src/main/res/layout/view_beauty360.xml @@ -0,0 +1,413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/view_beauty_default.xml b/beauty/src/main/res/layout/view_beauty_default.xml new file mode 100644 index 000000000..132161161 --- /dev/null +++ b/beauty/src/main/res/layout/view_beauty_default.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/layout/view_item_list_beauty_filter.xml b/beauty/src/main/res/layout/view_item_list_beauty_filter.xml new file mode 100644 index 000000000..00aa94489 --- /dev/null +++ b/beauty/src/main/res/layout/view_item_list_beauty_filter.xml @@ -0,0 +1,11 @@ + + diff --git a/beauty/src/main/res/layout/view_seek_group.xml b/beauty/src/main/res/layout/view_seek_group.xml new file mode 100644 index 000000000..7ad244d8e --- /dev/null +++ b/beauty/src/main/res/layout/view_seek_group.xml @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_fennen.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_fennen.png new file mode 100644 index 000000000..e87ca17ff Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_fennen.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_huaijiu.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_huaijiu.png new file mode 100644 index 000000000..68e2e0aca Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_huaijiu.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_landiao.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_landiao.png new file mode 100644 index 000000000..037e5f295 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_landiao.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_langman.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_langman.png new file mode 100644 index 000000000..174746dfe Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_langman.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_orginal.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_orginal.png new file mode 100644 index 000000000..d1bfd2ab6 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_orginal.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_qingliang.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_qingliang.png new file mode 100644 index 000000000..4ad4e0f78 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_qingliang.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_qingxin.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_qingxin.png new file mode 100644 index 000000000..7d65752e1 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_qingxin.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_rixi.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_rixi.png new file mode 100644 index 000000000..8bb69287f Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_rixi.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_selected.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_selected.png new file mode 100644 index 000000000..83dc0fe3c Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_selected.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_filter_weimei.png b/beauty/src/main/res/mipmap-mdpi/icon_filter_weimei.png new file mode 100644 index 000000000..01f196d68 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_filter_weimei.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_none.png b/beauty/src/main/res/mipmap-mdpi/icon_none.png new file mode 100644 index 000000000..5dc2dbba5 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_none.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_record_haha_1.png b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_1.png new file mode 100644 index 000000000..601e88326 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_1.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_record_haha_2.png b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_2.png new file mode 100644 index 000000000..aea363b13 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_2.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_record_haha_3.png b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_3.png new file mode 100644 index 000000000..8f8c8f687 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_3.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_record_haha_4.png b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_4.png new file mode 100644 index 000000000..ba92e9c9b Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_record_haha_4.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_download.png b/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_download.png new file mode 100644 index 000000000..9db5a9904 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_download.png differ diff --git a/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_none.png b/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_none.png new file mode 100644 index 000000000..2dd47ab08 Binary files /dev/null and b/beauty/src/main/res/mipmap-mdpi/icon_tiezhi_none.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_fennen.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_fennen.png new file mode 100644 index 000000000..ab32a4360 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_fennen.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_huaijiu.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_huaijiu.png new file mode 100644 index 000000000..00a709532 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_huaijiu.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_landiao.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_landiao.png new file mode 100644 index 000000000..0e290d4c3 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_landiao.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_langman.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_langman.png new file mode 100644 index 000000000..7a894d94f Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_langman.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_qingliang.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_qingliang.png new file mode 100644 index 000000000..33b219938 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_qingliang.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_qingxin.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_qingxin.png new file mode 100644 index 000000000..fef5dc571 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_qingxin.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_rixi.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_rixi.png new file mode 100644 index 000000000..cee52a6a8 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_rixi.png differ diff --git a/beauty/src/main/res/mipmap-xxxhdpi/filter_weimei.png b/beauty/src/main/res/mipmap-xxxhdpi/filter_weimei.png new file mode 100644 index 000000000..0861f5764 Binary files /dev/null and b/beauty/src/main/res/mipmap-xxxhdpi/filter_weimei.png differ diff --git a/beauty/src/main/res/values/attrs.xml b/beauty/src/main/res/values/attrs.xml new file mode 100644 index 000000000..346898a36 --- /dev/null +++ b/beauty/src/main/res/values/attrs.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beauty/src/main/res/values/colors.xml b/beauty/src/main/res/values/colors.xml new file mode 100644 index 000000000..8c8cecada --- /dev/null +++ b/beauty/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #e6323232 + \ No newline at end of file diff --git a/beauty/src/main/res/values/strings.xml b/beauty/src/main/res/values/strings.xml new file mode 100644 index 000000000..96659bdea --- /dev/null +++ b/beauty/src/main/res/values/strings.xml @@ -0,0 +1,28 @@ + + + 美颜 + 美型 + 萌颜 + 贴纸 + 滤镜 + 抖动 + 哈哈镜 + 外星人 + 方方脸 + 瘦瘦脸 + 梨梨脸 + 美白 + 白皙 + 磨皮 + 美肤 + 强度 + 饱和 + 粉嫩 + 红润 + 大眼 + 瘦脸 + 窄脸 + 强度 + 贴纸下载失败 + 贴纸解压失败 + \ No newline at end of file diff --git a/billing/proguard-rules.pro b/billing/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/billing/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/billing/src/androidTest/java/com/tjbaobao/gitee/billing/ExampleInstrumentedTest.java b/billing/src/androidTest/java/com/tjbaobao/gitee/billing/ExampleInstrumentedTest.java new file mode 100644 index 000000000..e3dfe22ee --- /dev/null +++ b/billing/src/androidTest/java/com/tjbaobao/gitee/billing/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.tjbaobao.gitee.billing; + +import android.content.Context; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.tjbaobao.gitee.billing.test", appContext.getPackageName()); + } +} diff --git a/billing/src/main/AndroidManifest.xml b/billing/src/main/AndroidManifest.xml new file mode 100644 index 000000000..d5729cf11 --- /dev/null +++ b/billing/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/billing/src/main/java/com/tjbaobao/gitee/billing/GoogleBillingUtil.java b/billing/src/main/java/com/tjbaobao/gitee/billing/GoogleBillingUtil.java new file mode 100644 index 000000000..e719e1f38 --- /dev/null +++ b/billing/src/main/java/com/tjbaobao/gitee/billing/GoogleBillingUtil.java @@ -0,0 +1,907 @@ +package com.tjbaobao.gitee.billing; + +import android.app.Activity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.Log; +import com.android.billingclient.api.*; + +import java.util.*; + +/** + * 作者:天镜baobao + * 时间:2019/1/5 15:16 + * 说明:允许使用,但请遵循Apache License 2.0 + * 使用: + * Copyright 2019 天镜baobao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@SuppressWarnings({"WeakerAccess", "unused", "UnusedReturnValue"}) +public class GoogleBillingUtil { + + private static final String TAG = "GoogleBillingUtil"; + private static boolean IS_DEBUG = false; + private static String[] inAppSKUS = new String[]{};//内购ID,必填,注意!如果用不着的请去掉多余的"" + private static String[] subsSKUS = new String[]{};//订阅ID,必填,注意!如果用不着的请去掉多余的"" + + public static final String BILLING_TYPE_INAPP = BillingClient.SkuType.INAPP;//内购 + public static final String BILLING_TYPE_SUBS = BillingClient.SkuType.SUBS;//订阅 + + private static BillingClient mBillingClient; + private static BillingClient.Builder builder ; + private static List onGoogleBillingListenerList = new ArrayList<>(); + private static Map onGoogleBillingListenerMap = new HashMap<>(); + private MyPurchasesUpdatedListener purchasesUpdatedListener = new MyPurchasesUpdatedListener(); + + private static boolean isAutoAcknowledgePurchase = true; + + private static final GoogleBillingUtil mGoogleBillingUtil = new GoogleBillingUtil() ; + + private GoogleBillingUtil() + { + + } + + //region===================================初始化google应用内购买服务================================= + + /** + * 设置skus + * @param inAppSKUS 内购id + * @param subsSKUS 订阅id + */ + public static void setSkus(@Nullable String[] inAppSKUS,@Nullable String[] subsSKUS){ + if(inAppSKUS!=null){ + GoogleBillingUtil.inAppSKUS = Arrays.copyOf(inAppSKUS,inAppSKUS.length); + } + if(subsSKUS!=null){ + GoogleBillingUtil.subsSKUS = Arrays.copyOf(subsSKUS,subsSKUS.length); + } + } + + private static void copyToArray(T[] base,T[] target){ + System.arraycopy(base, 0, target, 0, base.length); + } + + public static GoogleBillingUtil getInstance() + { + return mGoogleBillingUtil; + } + + /** + * 开始建立内购连接 + * @param activity activity + */ + public GoogleBillingUtil build(Activity activity) + { + purchasesUpdatedListener.tag = getTag(activity); + if(mBillingClient==null) + { + synchronized (mGoogleBillingUtil) + { + if(mBillingClient==null) + { + builder = BillingClient.newBuilder(activity); + mBillingClient = builder.setListener(purchasesUpdatedListener) + .enablePendingPurchases() + .build(); + } + else + { + builder.setListener(purchasesUpdatedListener); + } + } + } + else + { + builder.setListener(purchasesUpdatedListener); + } + synchronized (mGoogleBillingUtil) + { + if(mGoogleBillingUtil.startConnection(activity)) + { + mGoogleBillingUtil.queryInventoryInApp(getTag(activity)); + mGoogleBillingUtil.queryInventorySubs(getTag(activity)); + mGoogleBillingUtil.queryPurchasesInApp(getTag(activity)); + } + } + return mGoogleBillingUtil; + } + + public boolean startConnection(Activity activity){ + return startConnection(getTag(activity)); + } + + private boolean startConnection(String tag) + { + if(mBillingClient==null) + { + log("初始化失败:mBillingClient==null"); + return false; + } + if(!mBillingClient.isReady()) + { + mBillingClient.startConnection(new BillingClientStateListener() { + @Override + public void onBillingSetupFinished(BillingResult billingResult) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onSetupSuccess(listener.tag.equals(tag)); + } + queryInventoryInApp(tag); + queryInventorySubs(tag); + queryPurchasesInApp(tag); + } + else + { + log("初始化失败:onSetupFail:code="+billingResult.getResponseCode()); + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onFail(GoogleBillingListenerTag.SETUP,billingResult.getResponseCode(), listener.tag.equals(tag)); + } + } + } + + @Override + public void onBillingServiceDisconnected() { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onBillingServiceDisconnected(); + } + log("初始化失败:onBillingServiceDisconnected"); + } + }); + return false; + } + else + { + return true; + } + } + + //endregion + + //region===================================查询商品================================= + + /** + * 查询内购商品信息 + */ + public void queryInventoryInApp(Activity activity) + { + queryInventoryInApp(getTag(activity)); + } + + private void queryInventoryInApp(String tag) + { + queryInventory(tag,BillingClient.SkuType.INAPP); + } + + /** + * 查询订阅商品信息 + */ + public void queryInventorySubs(Activity activity) + { + queryInventory(getTag(activity),BillingClient.SkuType.SUBS); + } + + public void queryInventorySubs(String tag) + { + queryInventory(tag,BillingClient.SkuType.SUBS); + } + + private void queryInventory(String tag,final String skuType) { + Runnable runnable=new Runnable() { + @Override + public void run() { + + if (mBillingClient == null) + { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onError(GoogleBillingListenerTag.QUERY, listener.tag.equals(tag)); + } + return ; + } + ArrayList skuList = new ArrayList<>(); + if(skuType.equals(BillingClient.SkuType.INAPP)) + { + Collections.addAll(skuList, inAppSKUS); + } + else if(skuType.equals(BillingClient.SkuType.SUBS)) + { + Collections.addAll(skuList, subsSKUS); + } + if(!skuList.isEmpty()){ + SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); + params.setSkusList(skuList).setType(skuType); + mBillingClient.querySkuDetailsAsync(params.build(),new MySkuDetailsResponseListener(skuType,tag)); + } + } + }; + + executeServiceRequest(tag,runnable); + } + + //endregion + + //region===================================购买商品================================= + /** + * 发起内购 + * @param skuId 内购商品id + */ + public void purchaseInApp(Activity activity, String skuId) + { + purchase(activity,skuId, BillingClient.SkuType.INAPP); + } + + /** + * 发起订阅 + * @param skuId 订阅商品id + */ + public void purchaseSubs(Activity activity,String skuId) + { + purchase(activity,skuId, BillingClient.SkuType.SUBS); + } + + private void purchase(Activity activity,final String skuId,final String skuType) + { + String tag = getTag(activity); + if(mBillingClient==null) + { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onError(GoogleBillingListenerTag.PURCHASE, listener.tag.equals(tag)); + } + return ; + } + if(startConnection(tag)) + { + purchasesUpdatedListener.tag = tag; + builder.setListener(purchasesUpdatedListener); + List skuList = new ArrayList<>(); + skuList.add(skuId); + SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder() + .setSkusList(skuList) + .setType(skuType) + .build(); + mBillingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() { + @Override + public void onSkuDetailsResponse(BillingResult billingResult, List skuDetailsList) { + + } + }); + + mBillingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() { + @Override + public void onSkuDetailsResponse(BillingResult billingResult, List skuDetailsList) { + if(skuDetailsList!=null&&!skuDetailsList.isEmpty()){ + BillingFlowParams flowParams = BillingFlowParams.newBuilder() + .setSkuDetails(skuDetailsList.get(0)) + .build(); + mBillingClient.launchBillingFlow(activity,flowParams); + } + } + }); + + } + else + { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onError(GoogleBillingListenerTag.PURCHASE,listener.tag.equals(tag)); + } + } + } + + + //endregion + + //region===================================消耗商品================================= + + /** + * 消耗商品 + * @param purchaseToken {@link Purchase#getPurchaseToken()} + */ + public void consumeAsync(Activity activity,String purchaseToken) + { + consumeAsync(getTag(activity),purchaseToken,null); + } + + + public void consumeAsync(Activity activity,String purchaseToken,@Nullable String developerPayload) + { + consumeAsync(getTag(activity),purchaseToken,developerPayload); + } + + /** + * 消耗商品 + * @param purchaseToken {@link Purchase#getPurchaseToken()} + */ + private void consumeAsync(String tag,String purchaseToken){ + consumeAsync(tag,purchaseToken,null); + } + + + private void consumeAsync(String tag,String purchaseToken,@Nullable String developerPayload) + { + if(mBillingClient==null) + { + return ; + } + ConsumeParams consumeParams = ConsumeParams.newBuilder() + .setPurchaseToken(purchaseToken) + .build(); + mBillingClient.consumeAsync(consumeParams,new MyConsumeResponseListener(tag)); + } + + /** + * 消耗内购商品-通过sku数组 + * @param sku sku + */ + public void consumeAsyncInApp(Activity activity,@NonNull String... sku) + { + if(mBillingClient==null) { + return ; + } + List skuList = Arrays.asList(sku); + consumeAsyncInApp(activity,skuList,null); + } + + /** + * 消耗内购商品-通过sku数组 + * @param skuList sku数组 + */ + public void consumeAsyncInApp(Activity activity,@NonNull List skuList,@Nullable List developerPayloadList) + { + if(mBillingClient==null) { + return ; + } + List purchaseList = queryPurchasesInApp(activity); + if(purchaseList!=null){ + for(Purchase purchase : purchaseList){ + int index = skuList.indexOf(purchase.getSku()); + if(index!=-1){ + if(developerPayloadList!=null&&index queryPurchasesInApp(Activity activity) + { + return queryPurchases(getTag(activity),BillingClient.SkuType.INAPP); + } + + private List queryPurchasesInApp(String tag) + { + return queryPurchases(tag,BillingClient.SkuType.INAPP); + } + + /** + * 获取已经订阅的商品 + * @return 商品列表 + */ + public List queryPurchasesSubs(Activity activity) + { + return queryPurchases(getTag(activity),BillingClient.SkuType.SUBS); + } + + private List queryPurchases(String tag,String skuType) + { + if(mBillingClient==null) + { + return null; + } + if(!mBillingClient.isReady()) + { + startConnection(tag); + } + else + { + Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(skuType); + if(purchasesResult!=null) + { + if(purchasesResult.getResponseCode()== BillingClient.BillingResponseCode.OK) + { + List purchaseList = purchasesResult.getPurchasesList(); + if(purchaseList!=null&&!purchaseList.isEmpty()) + { + for(Purchase purchase:purchaseList) + { + for(OnGoogleBillingListener listener : onGoogleBillingListenerList) { + boolean isSelf = listener.tag.equals(tag);//是否是当前页面 + boolean isSuccess = listener.onRecheck(skuType, purchase, isSelf);//是否消耗或者确认 + if(isSelf){ + if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { + if(skuType.equals(BillingClient.SkuType.INAPP)) { + if(isSuccess){ + consumeAsync(tag,purchase.getPurchaseToken()); + }else if(isAutoAcknowledgePurchase){ + if(!purchase.isAcknowledged()){ + acknowledgePurchase(tag,purchase.getPurchaseToken()); + } + } + }else if(skuType.equals(BillingClient.SkuType.SUBS)){ + if(isAutoAcknowledgePurchase){ + if(!purchase.isAcknowledged()){ + acknowledgePurchase(tag,purchase.getPurchaseToken()); + } + } + } + }else{ + log("未支付的订单:"+purchase.getSku()); + } + } + } + } + } + return purchaseList; + } + } + } + return null; + } + //endregion + + //region===================================在线订单查询================================= + + /** + * 异步联网查询所有的内购历史-无论是过期的、取消、等等的订单 + * @param listener 监听器 + * @return 返回false的时候说明网络出错 + */ + public boolean queryPurchaseHistoryAsyncInApp(PurchaseHistoryResponseListener listener){ + if(isReady()) { + mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,listener); + return true; + } + return false; + } + + /** + * 异步联网查询所有的订阅历史-无论是过期的、取消、等等的订单 + * @param listener 监听器 + * @return 返回false的时候说明网络出错 + */ + public boolean queryPurchaseHistoryAsyncSubs(PurchaseHistoryResponseListener listener){ + if(isReady()) { + mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS,listener); + return true; + }else{ + return false; + } + } + + //endregion + + //region===================================工具集合================================= + /** + * 获取有效订阅的数量 + * @return -1查询失败,0没有有效订阅,>0具有有效的订阅 + */ + public int getPurchasesSizeSubs(Activity activity) + { + List list = queryPurchasesSubs(activity); + if(list!=null) + { + return list.size(); + } + return -1; + } + + /** + * 通过sku获取订阅商品序号 + * @param sku sku + * @return 序号 + */ + public int getSubsPositionBySku(String sku) + { + return getPositionBySku(sku, BillingClient.SkuType.SUBS); + } + + /** + * 通过sku获取内购商品序号 + * @param sku sku + * @return 成功返回需要 失败返回-1 + */ + public int getInAppPositionBySku(String sku) + { + return getPositionBySku(sku, BillingClient.SkuType.INAPP); + } + + private int getPositionBySku(String sku,String skuType) + { + + if(skuType.equals(BillingClient.SkuType.INAPP)) + { + int i = 0; + for(String s:inAppSKUS) + { + if(s.equals(sku)) + { + return i; + } + i++; + } + } + else if(skuType.equals(BillingClient.SkuType.SUBS)) + { + int i = 0; + for(String s:subsSKUS) + { + if(s.equals(sku)) + { + return i; + } + i++; + } + } + return -1; + } + + /** + * 通过序号获取订阅sku + * @param position 序号 + * @return sku + */ + public String getSubsSkuByPosition(int position) + { + if(position>=0&&position=0&&position=0;i--){ + OnGoogleBillingListener listener = onGoogleBillingListenerList.get(i); + if(listener.tag.equals(tag)){ + onGoogleBillingListenerList.remove(listener); + } + } + onGoogleBillingListenerList.add(onGoogleBillingListener); + return this; + } + + public void removeOnGoogleBillingListener(OnGoogleBillingListener onGoogleBillingListener){ + onGoogleBillingListenerList.remove(onGoogleBillingListener); + } + + public void removeOnGoogleBillingListener(Activity activity){ + String tag = getTag(activity); + for(int i=onGoogleBillingListenerList.size()-1;i>=0;i--){ + OnGoogleBillingListener listener = onGoogleBillingListenerList.get(i); + if(listener.tag.equals(tag)){ + removeOnGoogleBillingListener(listener); + onGoogleBillingListenerMap.remove(tag); + } + } + } + + + /** + * 清除内购监听器,防止内存泄漏-在Activity-onDestroy里面调用。 + * 需要确保onDestroy和build方法在同一个线程。 + */ + public void onDestroy(Activity activity){ + if(builder!=null) { + builder.setListener(null); + } + if (activity != null) + removeOnGoogleBillingListener(activity); + } + + /** + * Google购买商品回调接口(订阅和内购都走这个接口) + */ + private class MyPurchasesUpdatedListener implements PurchasesUpdatedListener + { + + public String tag ; + + @Override + public void onPurchasesUpdated(BillingResult billingResult, @Nullable List list) { + if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&list!=null) + { + for(Purchase purchase:list) { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + boolean isSelf = listener.tag.equals(tag);//是否是当前页面 + boolean isSuccess = listener.onPurchaseSuccess(purchase,isSelf);//是否自动消耗 + if(isSelf&&purchase.getPurchaseState()== Purchase.PurchaseState.PURCHASED){ + //是当前页面,并且商品状态为支付成功,才会进行消耗与确认的操作 + String skuType = getSkuType(purchase.getSku()); + if(BillingClient.SkuType.INAPP.equals(skuType)){ + if(isSuccess){ + //进行消耗 + consumeAsync(tag,purchase.getPurchaseToken()); + }else if(isAutoAcknowledgePurchase){ + //进行确认购买 + if(!purchase.isAcknowledged()){ + acknowledgePurchase(tag,purchase.getPurchaseToken()); + } + } + }else if(BillingClient.SkuType.SUBS.equals(skuType)){ + //进行确认购买 + if(isAutoAcknowledgePurchase){ + if(!purchase.isAcknowledged()){ + acknowledgePurchase(tag,purchase.getPurchaseToken()); + } + } + } + }else if(purchase.getPurchaseState()== Purchase.PurchaseState.PENDING){ + log("待处理的订单:"+purchase.getSku()); + } + } + } + } + else + { + if(IS_DEBUG){ + log("购买失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage()); + } + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onFail(GoogleBillingListenerTag.PURCHASE,billingResult.getResponseCode(),listener.tag.equals(tag)); + } + } + } + + } + + /** + * Google查询商品信息回调接口 + */ + private class MySkuDetailsResponseListener implements SkuDetailsResponseListener + { + private String skuType ; + private String tag; + + public MySkuDetailsResponseListener(String skuType,String tag) { + this.skuType = skuType; + this.tag = tag; + } + + @Override + public void onSkuDetailsResponse(BillingResult billingResult, List list) { + if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&list!=null) + { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onQuerySuccess(skuType,list,listener.tag.equals(tag)); + } + } + else + { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onFail(GoogleBillingListenerTag.QUERY,billingResult.getResponseCode(),listener.tag.equals(tag)); + } + if(IS_DEBUG){ + log("查询失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage()); + } + } + } + + } + + /** + * Googlg消耗商品回调 + */ + private class MyConsumeResponseListener implements ConsumeResponseListener + { + private String tag ; + + public MyConsumeResponseListener(String tag) { + this.tag = tag; + } + + @Override + public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onConsumeSuccess(purchaseToken,listener.tag.equals(tag)); + } + }else{ + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onFail(GoogleBillingListenerTag.COMSUME,billingResult.getResponseCode(),listener.tag.equals(tag)); + } + if(IS_DEBUG){ + log("消耗失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage()); + } + } + } + } + + /** + * Googlg消耗商品回调 + */ + private class MyAcknowledgePurchaseResponseListener implements AcknowledgePurchaseResponseListener{ + + private String tag ; + + public MyAcknowledgePurchaseResponseListener(String tag) { + this.tag = tag; + } + + @Override + public void onAcknowledgePurchaseResponse(BillingResult billingResult) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onAcknowledgePurchaseSuccess(listener.tag.equals(tag)); + } + }else{ + for(OnGoogleBillingListener listener:onGoogleBillingListenerList){ + listener.onFail(GoogleBillingListenerTag.AcKnowledgePurchase,billingResult.getResponseCode(),listener.tag.equals(tag)); + } + if(IS_DEBUG){ + log("确认购买失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage()); + } + } + } + } + + public enum GoogleBillingListenerTag{ + + QUERY("query"), + PURCHASE("purchase"), + SETUP("setup"), + COMSUME("comsume"), + AcKnowledgePurchase("AcKnowledgePurchase"), + ; + public String tag ; + GoogleBillingListenerTag(String tag){ + this.tag = tag; + } + } + + private static void log(String msg) + { + if(IS_DEBUG) + { + Log.e(TAG,msg); + } + } + + public static void isDebug(boolean isDebug){ + GoogleBillingUtil.IS_DEBUG = isDebug; + } +} diff --git a/billing/src/main/java/com/tjbaobao/gitee/billing/OnGoogleBillingListener.java b/billing/src/main/java/com/tjbaobao/gitee/billing/OnGoogleBillingListener.java new file mode 100644 index 000000000..197662a58 --- /dev/null +++ b/billing/src/main/java/com/tjbaobao/gitee/billing/OnGoogleBillingListener.java @@ -0,0 +1,105 @@ +package com.tjbaobao.gitee.billing; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.SkuDetails; + +import java.util.List; + +/** + * 作者:天镜baobao + * 时间:2019/6/2 13:51 + * 说明:允许使用,但请遵循Apache License 2.0 + * 使用: + * Copyright 2019 天镜baobao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class OnGoogleBillingListener { + + @SuppressWarnings("WeakerAccess") + public String tag = null; + + /** + * 查询成功 + * @param skuType 内购或者订阅 + * @param list 商品列表 + * @param isSelf 是否是当前页面的结果 + */ + public void onQuerySuccess(@NonNull String skuType, @NonNull List list, boolean isSelf){} + + /** + * 购买成功 + * @param purchase 商品 + * @param isSelf 是否是当前页面的结果 + * + * @return 是否消耗,只有当isSelf为true,并且支付状态为{@link com.android.billingclient.api.Purchase.PurchaseState.PURCHASED}时,该值才会生效。 + */ + public boolean onPurchaseSuccess(@NonNull Purchase purchase, boolean isSelf){return true;} + + /** + * 初始化成功 + * @param isSelf 是否是当前页面的结果 + */ + public void onSetupSuccess(boolean isSelf){} + + /** + * 每次启动重新检查订单,返回有效的订单 + * + * @param skuType 内购或者订阅 + * @param purchase 商品 + * @param isSelf 是否是当前页面的结果 + * + * @return 是否自动消耗,只有当isSelf为true,并且支付状态为{@link com.android.billingclient.api.Purchase.PurchaseState.PURCHASED}时,该值才会生效。 + */ + public boolean onRecheck(@NonNull String skuType, @NonNull Purchase purchase, boolean isSelf) { + return false; + } + + /** + * 链接断开 + */ + @SuppressWarnings("WeakerAccess") + public void onBillingServiceDisconnected(){ } + + /** + * 消耗成功 + * @param purchaseToken token + * @param isSelf 是否是当前页面的结果 + */ + public void onConsumeSuccess(@NonNull String purchaseToken,boolean isSelf){} + + + /** + * 确认购买成功 + * @param isSelf 是否是当前页面的结果 + */ + public void onAcknowledgePurchaseSuccess(boolean isSelf){} + + /** + * 失败回调 + * @param tag {@link GoogleBillingUtil.GoogleBillingListenerTag} + * @param responseCode 返回码{https://developer.android.com/google/play/billing/billing_reference} + * @param isSelf 是否是当前页面的结果 + */ + public void onFail(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, int responseCode, boolean isSelf){} + + /** + * google组件初始化失败等等。 + * @param tag {@link GoogleBillingUtil.GoogleBillingListenerTag} + * @param isSelf 是否是当前页面的结果 + */ + public void onError(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, boolean isSelf){} + +} diff --git a/billing/src/main/java/com/tjbaobao/gitee/billing/PackInfo.java b/billing/src/main/java/com/tjbaobao/gitee/billing/PackInfo.java new file mode 100644 index 000000000..5f6bda11f --- /dev/null +++ b/billing/src/main/java/com/tjbaobao/gitee/billing/PackInfo.java @@ -0,0 +1,10 @@ +package com.tjbaobao.gitee.billing; + +/** + * 作者:TJbaobao + * 时间:2019/1/5 14:41 + * 说明: + * 使用: + */ +public class PackInfo { +} diff --git a/billing/src/main/res/values/strings.xml b/billing/src/main/res/values/strings.xml new file mode 100644 index 000000000..67943bc68 --- /dev/null +++ b/billing/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + GoogleBilling + diff --git a/billing/src/test/java/com/tjbaobao/gitee/billing/ExampleUnitTest.java b/billing/src/test/java/com/tjbaobao/gitee/billing/ExampleUnitTest.java new file mode 100644 index 000000000..cc1135713 --- /dev/null +++ b/billing/src/test/java/com/tjbaobao/gitee/billing/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.tjbaobao.gitee.billing; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..8597944f4 --- /dev/null +++ b/build.gradle @@ -0,0 +1,45 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply from: "config.gradle" +apply from: "dependencies.gradle" + + +buildscript { + ext.kotlin_version = '1.4.32' + repositories { + maven { url "https://mvn.mob.com/android" } + maven { url 'https://maven.aliyun.com/repository/public' } + maven { url 'https://maven.aliyun.com/repository/google' } + maven { url 'https://maven.fabric.io/public' } + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.4' + //一键压缩png工具 + classpath 'com.chenenyu:img-optimizer:1.1.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32" + classpath 'com.google.gms:google-services:4.3.3' + } + + +} + + +allprojects { + repositories { + maven { url "https://maven.rongcloud.cn/repository/maven-releases/" } + mavenCentral()//由于jcenter问题导致https://dl.bintray.com无法访问改成这个,以后都可以使用这个库 + maven { url "https://mvn.mob.com/android" } + maven { url 'https://maven.aliyun.com/repository/public' } + maven { url 'https://maven.aliyun.com/repository/google' } + maven { url 'http://developer.huawei.com/repo'}//华为库 + maven { url 'https://maven.fabric.io/public' } + maven { url "https://jitpack.io" } + google() // Google's Maven repository + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 000000000..e20e62ad7 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,167 @@ +apply plugin: 'com.android.library' +apply plugin: 'img-optimizer' + + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + ndk { + abiFilters "armeabi-v7a", "arm64-v8a" + } + } + + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + } + + aaptOptions { + cruncherEnabled = false + useNewCruncher = false + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} +repositories { + flatDir { + dirs 'libs', '../libs' + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + api rootProject.ext.dependencies["appcompat-androidx"] + api rootProject.ext.dependencies["recyclerview-androidx"] + api rootProject.ext.dependencies["cardview-androidx"] + api rootProject.ext.dependencies["design"] + api rootProject.ext.dependencies["multidex"] + api "androidx.constraintlayout:constraintlayout:2.1.4" + // To use constraintlayout in compose + api "androidx.constraintlayout:constraintlayout-compose:1.0.1" + api files('../libs/commons-io-1.4.jar') + //okHttp网络请求 + api rootProject.ext.dependencies["okhttp"] + + //OkGo 是对okHttp的封装 + api rootProject.ext.dependencies["okgo"] + + //OkGo上传下载扩展库 + api rootProject.ext.dependencies["okserver"] + + //fastJson解析json + api rootProject.ext.dependencies["fastjson"] + + //eventbus事件总线 + api rootProject.ext.dependencies["eventbus"] + + //使用Glide加载图片 + api rootProject.ext.dependencies["glide"] + + //一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果 + api rootProject.ext.dependencies["glide-transformations"] + + //带圆角,边框的的ImageView + api rootProject.ext.dependencies["roundedimageview"] + + //gif库,播放礼物gif用 + api rootProject.ext.dependencies["gif-drawable"] + + //svga播放器 + api rootProject.ext.dependencies["SVGAPlayer"] + + //七牛云存储 + api rootProject.ext.dependencies["qiniu-sdk"] + + //图片裁剪 + api rootProject.ext.dependencies["ucrop"] + + //腾讯定位,地图sdk + api files('libs/TencentLocationSdk_v6.2.5.3.jar') + api files('libs/TencentMapSDK_1.2.8.1.jar') + + //下拉刷新上拉加载 + api rootProject.ext.dependencies["smartRefreshLayout"] + + //ViewPager指示器 + api rootProject.ext.dependencies["magicIndicator"] + //阿里 ARouter + api rootProject.ext.dependencies["arouter"] + + //轮播图 + api rootProject.ext.dependencies["banner"] + + //鲁班 + api rootProject.ext.dependencies["Luban"] + + //一个Picker控件,选择日期,城市用 + api files('libs/AndroidPicker-1.5.6.jar') + + //播放动画 + api 'com.airbnb.android:lottie:2.7.0' + //引导页 + api 'com.binioter:guideview:1.0.0' + + //桌面app小红点 + api "me.leolin:ShortcutBadger:1.1.22@aar" + + //谷歌支付 + api project(':billing') + implementation 'com.teprinciple:updateapputils:2.3.0' + api 'com.squareup.picasso:picasso:2.5.2' + api "com.immomo.cosmos.mediax:beautyutils:2.2.1_01071700" + api files('libs/liteavsdk.jar') + api 'com.xw.repo:bubbleseekbar:3.20-lite' + //腾讯im + api 'com.tencent.imsdk:imsdk-plus:5.4.666' + api 'com.google.code.gson:gson:2.8.8' + api 'cn.rongcloud.sdk:rtc_lib:5.2.0' // 音视频通话基础能力库 + //此处以集成 5.1.2 版本为例 + api 'cn.rongcloud.sdk:im_lib:5.2.0.2' + + api 'com.facebook.android:facebook-login:6.5.0' + api 'com.facebook.android:facebook-android-sdk:[5,6)' + + api('com.twitter.sdk.android:twitter-core:3.1.1@aar') { + transitive = true + } + api 'com.linecorp:linesdk:5.0.1' + api 'com.adjust.sdk:adjust-android:4.30.1' + api 'com.android.installreferrer:installreferrer:2.2' + api 'com.google.firebase:firebase-analytics:15.0.0' + +} diff --git a/common/google-services.json b/common/google-services.json new file mode 100644 index 000000000..1ae46934f --- /dev/null +++ b/common/google-services.json @@ -0,0 +1,62 @@ +{ + "project_info": { + "project_number": "292494634914", + "project_id": "pdlive-1631521064967", + "storage_bucket": "pdlive-1631521064967.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:292494634914:android:d8db197d7e7a6c3a3a4cfb", + "android_client_info": { + "package_name": "com.pdlive.shayu" + } + }, + "oauth_client": [ + { + "client_id": "292494634914-ctr3fptp5mkv2qqr4gkgjo9uluq2joqb.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pdlive.shayu", + "certificate_hash": "15fc5e70cf238323bf7111c8c627803985478e87" + } + }, + { + "client_id": "292494634914-ejtqvaj86a2lldv0di2pr3d5gngprahd.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pdlive.shayu", + "certificate_hash": "b66dc8d21cfcf6c729577ddcf0c312b2a31ed872" + } + }, + { + "client_id": "292494634914-ha2kbgtclkv20hl3a1l8r7861a1a0m5i.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDVnuGnQzjI_vDrxh20Hv_S1OMUD7Vp3zU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "292494634914-ha2kbgtclkv20hl3a1l8r7861a1a0m5i.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "292494634914-v9j4rei86q2pfh9as4seotb23vr2744a.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.live.pd" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/common/img_optimizer.log b/common/img_optimizer.log new file mode 100644 index 000000000..617058ff0 --- /dev/null +++ b/common/img_optimizer.log @@ -0,0 +1,320 @@ +2019-11-01 13:59:42 info: Task optimizeCommonRelease begin: +---------------------------------------- +2019-11-01 13:59:42 info: 156 images need to be optimized. +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 792B-->776B, 2.020202% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_user_dialog_home.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 2053B-->1428B, 30.443254% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_pyq_4.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 1300B-->1021B, 21.461538% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_fb_4.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 528B-->292B, 44.696968% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_down_arrow.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 372B-->366B, 1.6129032% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_user_home_follow_1.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 307B-->222B, 27.687296% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_user_home_follow_0.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 4915B-->2967B, 39.633774% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_avatar_placeholder.png +---------------------------------------- +2019-11-01 13:59:42 info: Succeed! 873B-->600B, 31.271477% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_sex_male_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 1343B-->1058B, 21.221148% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_fb_3.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 724B-->518B, 28.45304% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_back.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_pyq_2.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 2733B-->1926B, 29.52799% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_pyq_3.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 420B-->395B, 5.952381% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_fb_2.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 10738B-->5574B, 48.090893% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/bg_load_failure.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_pyq_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 422B-->395B, 6.398104% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_fb_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 1105B-->743B, 32.76018% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_checked_none.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 1771B-->1523B, 14.003387% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qq_3.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qzone_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 877B-->674B, 23.147093% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_sex_female_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 2270B-->1737B, 23.480177% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_chat_face.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qq_2.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qzone_2.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 2061B-->1577B, 23.483746% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qzone_3.png +---------------------------------------- +2019-11-01 13:59:43 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qq_1.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 1793B-->1326B, 26.045732% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_chat_keyboard.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 5647B-->3110B, 44.92651% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_login_qq.png +---------------------------------------- +2019-11-01 13:59:43 info: Succeed! 1562B-->1218B, 22.023046% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qq_4.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 1756B-->1269B, 27.733484% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_qzone_4.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 2174B-->2029B, 6.669733% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_live_gift_zs.png +---------------------------------------- +2019-11-01 13:59:44 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_wx_2.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 2381B-->1805B, 24.191517% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_wx_3.png +---------------------------------------- +2019-11-01 13:59:44 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_wx_1.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 1145B-->858B, 25.065502% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_face_delete.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 5113B-->2801B, 45.21807% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_login_fb.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 4702B-->3142B, 33.177372% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_data_empty.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 1873B-->1328B, 29.097704% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_wx_4.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 784B-->684B, 12.755102% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_cash_radio_0.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 1053B-->876B, 16.809116% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_cash_radio_1.png +---------------------------------------- +2019-11-01 13:59:44 info: Succeed! 1316B-->1020B, 22.492401% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_coin_wrap_1.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_avatar_test.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_tt_1.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 1249B-->999B, 20.016012% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_coin_wrap.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_tt_2.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 1465B-->1237B, 15.56314% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_checked.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 2019B-->1621B, 19.712729% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_tt_3.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 748B-->707B, 5.481283% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_user_home_msg.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_chat_charge_pay_1.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 6476B-->3425B, 47.112415% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_login_wx.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 5688B-->3215B, 43.477497% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_login_tt.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 1679B-->1263B, 24.776653% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_share_tt_4.png +---------------------------------------- +2019-11-01 13:59:45 info: Succeed! 464B-->378B, 18.534483% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-mdpi/icon_dialog_charge_close.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_014.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_028.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_029.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_015.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_001.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_017.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_003.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_002.png +---------------------------------------- +2019-11-01 13:59:45 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_016.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_012.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_006.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_007.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_013.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_039.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_005.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_011.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_010.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_004.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_038.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_088.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_063.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_077.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_103.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_102.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_076.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_062.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_089.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_074.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_060.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_048.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_100.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_101.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_049.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_061.png +---------------------------------------- +2019-11-01 13:59:46 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_075.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_059.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_071.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_065.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_064.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_070.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_058.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_099.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_066.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_072.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_073.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_067.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_098.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_081.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_095.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_042.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_056.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_057.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_043.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_094.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_080.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_096.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_082.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_055.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_041.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_069.png +---------------------------------------- +2019-11-01 13:59:47 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_068.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_040.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_054.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_083.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_097.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_093.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_087.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_078.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_050.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_044.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_045.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_051.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_079.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_086.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_092.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_084.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_090.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_047.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_053.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_052.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_046.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_091.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_085.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_021.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_035.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_009.png +---------------------------------------- +2019-11-01 13:59:48 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_008.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_034.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_020.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_036.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_022.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_023.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_037.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_033.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_027.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_026.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_032.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_018.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_024.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_030.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_031.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_025.png +---------------------------------------- +2019-11-01 13:59:49 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-hdpi/face_019.png +---------------------------------------- +2019-11-01 13:59:49 info: Succeed! 3193B-->2560B, 19.824615% saved! /Users/yaling/Documents/bayue/denglong_release4/common/src/main/res/mipmap-xxhdpi/loading.png +---------------------------------------- +2019-11-01 13:59:49 info: Total: 156, Succeed: 41, Skipped: 115, Failed: 0, Saved: 28.5361328125KB +---------------------------------------- +2019-11-01 13:59:49 info: Task optimizeCommonRelease executed successfully. +---------------------------------------- diff --git a/common/libs/AndroidPicker-1.5.6.jar b/common/libs/AndroidPicker-1.5.6.jar new file mode 100644 index 000000000..05074d07f Binary files /dev/null and b/common/libs/AndroidPicker-1.5.6.jar differ diff --git a/common/libs/PayssionSDK.jar b/common/libs/PayssionSDK.jar new file mode 100644 index 000000000..775839d81 Binary files /dev/null and b/common/libs/PayssionSDK.jar differ diff --git a/common/libs/TencentLocationSdk_v6.2.5.3.jar b/common/libs/TencentLocationSdk_v6.2.5.3.jar new file mode 100644 index 000000000..45341f9ab Binary files /dev/null and b/common/libs/TencentLocationSdk_v6.2.5.3.jar differ diff --git a/common/libs/TencentMapSDK_1.2.8.1.jar b/common/libs/TencentMapSDK_1.2.8.1.jar new file mode 100644 index 000000000..11b4d7b3b Binary files /dev/null and b/common/libs/TencentMapSDK_1.2.8.1.jar differ diff --git a/common/libs/alipaySdk-20180601.jar b/common/libs/alipaySdk-20180601.jar new file mode 100644 index 000000000..8af9c905e Binary files /dev/null and b/common/libs/alipaySdk-20180601.jar differ diff --git a/common/libs/arm64-v8a/libliteavsdk.so b/common/libs/arm64-v8a/libliteavsdk.so new file mode 100644 index 000000000..215e1e3f0 Binary files /dev/null and b/common/libs/arm64-v8a/libliteavsdk.so differ diff --git a/common/libs/arm64-v8a/libsoundtouch.so b/common/libs/arm64-v8a/libsoundtouch.so new file mode 100644 index 000000000..4e53fb587 Binary files /dev/null and b/common/libs/arm64-v8a/libsoundtouch.so differ diff --git a/common/libs/arm64-v8a/libtraeimp-rtmp.so b/common/libs/arm64-v8a/libtraeimp-rtmp.so new file mode 100644 index 000000000..d26bcb846 Binary files /dev/null and b/common/libs/arm64-v8a/libtraeimp-rtmp.so differ diff --git a/common/libs/arm64-v8a/libtxffmpeg.so b/common/libs/arm64-v8a/libtxffmpeg.so new file mode 100644 index 000000000..d21c9276d Binary files /dev/null and b/common/libs/arm64-v8a/libtxffmpeg.so differ diff --git a/common/libs/arm64-v8a/libtxplayer.so b/common/libs/arm64-v8a/libtxplayer.so new file mode 100644 index 000000000..48711e569 Binary files /dev/null and b/common/libs/arm64-v8a/libtxplayer.so differ diff --git a/common/libs/arm64-v8a/libtxsdl.so b/common/libs/arm64-v8a/libtxsdl.so new file mode 100644 index 000000000..f2c36c4b7 Binary files /dev/null and b/common/libs/arm64-v8a/libtxsdl.so differ diff --git a/common/libs/armeabi-v7a/libliteavsdk.so b/common/libs/armeabi-v7a/libliteavsdk.so new file mode 100644 index 000000000..b12afa6dc Binary files /dev/null and b/common/libs/armeabi-v7a/libliteavsdk.so differ diff --git a/common/libs/armeabi-v7a/libsoundtouch.so b/common/libs/armeabi-v7a/libsoundtouch.so new file mode 100644 index 000000000..d50530130 Binary files /dev/null and b/common/libs/armeabi-v7a/libsoundtouch.so differ diff --git a/common/libs/armeabi-v7a/libtraeimp-rtmp.so b/common/libs/armeabi-v7a/libtraeimp-rtmp.so new file mode 100644 index 000000000..1bd292586 Binary files /dev/null and b/common/libs/armeabi-v7a/libtraeimp-rtmp.so differ diff --git a/common/libs/armeabi-v7a/libtxffmpeg.so b/common/libs/armeabi-v7a/libtxffmpeg.so new file mode 100644 index 000000000..7c0cf5603 Binary files /dev/null and b/common/libs/armeabi-v7a/libtxffmpeg.so differ diff --git a/common/libs/armeabi-v7a/libtxplayer.so b/common/libs/armeabi-v7a/libtxplayer.so new file mode 100644 index 000000000..0b1737d8f Binary files /dev/null and b/common/libs/armeabi-v7a/libtxplayer.so differ diff --git a/common/libs/armeabi-v7a/libtxsdl.so b/common/libs/armeabi-v7a/libtxsdl.so new file mode 100644 index 000000000..6963f65f1 Binary files /dev/null and b/common/libs/armeabi-v7a/libtxsdl.so differ diff --git a/common/libs/armeabi/libliteavsdk.so b/common/libs/armeabi/libliteavsdk.so new file mode 100644 index 000000000..b12afa6dc Binary files /dev/null and b/common/libs/armeabi/libliteavsdk.so differ diff --git a/common/libs/armeabi/libsoundtouch.so b/common/libs/armeabi/libsoundtouch.so new file mode 100644 index 000000000..d50530130 Binary files /dev/null and b/common/libs/armeabi/libsoundtouch.so differ diff --git a/common/libs/armeabi/libtraeimp-rtmp.so b/common/libs/armeabi/libtraeimp-rtmp.so new file mode 100644 index 000000000..1bd292586 Binary files /dev/null and b/common/libs/armeabi/libtraeimp-rtmp.so differ diff --git a/common/libs/armeabi/libtxffmpeg.so b/common/libs/armeabi/libtxffmpeg.so new file mode 100644 index 000000000..7c0cf5603 Binary files /dev/null and b/common/libs/armeabi/libtxffmpeg.so differ diff --git a/common/libs/armeabi/libtxplayer.so b/common/libs/armeabi/libtxplayer.so new file mode 100644 index 000000000..0b1737d8f Binary files /dev/null and b/common/libs/armeabi/libtxplayer.so differ diff --git a/common/libs/armeabi/libtxsdl.so b/common/libs/armeabi/libtxsdl.so new file mode 100644 index 000000000..6963f65f1 Binary files /dev/null and b/common/libs/armeabi/libtxsdl.so differ diff --git a/common/libs/bdasr_3.0.8.2.jar b/common/libs/bdasr_3.0.8.2.jar new file mode 100644 index 000000000..cc0dc5014 Binary files /dev/null and b/common/libs/bdasr_3.0.8.2.jar differ diff --git a/common/libs/liteavsdk.jar b/common/libs/liteavsdk.jar new file mode 100644 index 000000000..0953f982f Binary files /dev/null and b/common/libs/liteavsdk.jar differ diff --git a/common/proguard-rules.pro b/common/proguard-rules.pro new file mode 100644 index 000000000..adcfd4222 --- /dev/null +++ b/common/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/macpro/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml new file mode 100644 index 000000000..780df206f --- /dev/null +++ b/common/src/main/AndroidManifest.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/src/main/assets/city.json b/common/src/main/assets/city.json new file mode 100644 index 000000000..d3a8c9895 --- /dev/null +++ b/common/src/main/assets/city.json @@ -0,0 +1,14250 @@ +[ + { + "areaId": "110000", + "areaName": "北京市", + "cities": [ + { + "areaId": "110000", + "areaName": "北京市", + "counties": [ + { + "areaId": "110101", + "areaName": "东城区" + }, + { + "areaId": "110102", + "areaName": "西城区" + }, + { + "areaId": "110105", + "areaName": "朝阳区" + }, + { + "areaId": "110106", + "areaName": "丰台区" + }, + { + "areaId": "110107", + "areaName": "石景山区" + }, + { + "areaId": "110108", + "areaName": "海淀区" + }, + { + "areaId": "110109", + "areaName": "门头沟区" + }, + { + "areaId": "110111", + "areaName": "房山区" + }, + { + "areaId": "110112", + "areaName": "通州区" + }, + { + "areaId": "110113", + "areaName": "顺义区" + }, + { + "areaId": "110114", + "areaName": "昌平区" + }, + { + "areaId": "110115", + "areaName": "大兴区" + }, + { + "areaId": "110116", + "areaName": "怀柔区" + }, + { + "areaId": "110117", + "areaName": "平谷区" + }, + { + "areaId": "110228", + "areaName": "密云县" + }, + { + "areaId": "110229", + "areaName": "延庆县" + } + ] + } + ] + }, + { + "areaId": "120000", + "areaName": "天津市", + "cities": [ + { + "areaId": "120000", + "areaName": "天津市", + "counties": [ + { + "areaId": "120101", + "areaName": "和平区" + }, + { + "areaId": "120102", + "areaName": "河东区" + }, + { + "areaId": "120103", + "areaName": "河西区" + }, + { + "areaId": "120104", + "areaName": "南开区" + }, + { + "areaId": "120105", + "areaName": "河北区" + }, + { + "areaId": "120106", + "areaName": "红桥区" + }, + { + "areaId": "120110", + "areaName": "东丽区" + }, + { + "areaId": "120111", + "areaName": "西青区" + }, + { + "areaId": "120112", + "areaName": "津南区" + }, + { + "areaId": "120113", + "areaName": "北辰区" + }, + { + "areaId": "120114", + "areaName": "武清区" + }, + { + "areaId": "120115", + "areaName": "宝坻区" + }, + { + "areaId": "120116", + "areaName": "滨海新区" + }, + { + "areaId": "120221", + "areaName": "宁河县" + }, + { + "areaId": "120223", + "areaName": "静海县" + }, + { + "areaId": "120225", + "areaName": "蓟县" + } + ] + } + ] + }, + { + "areaId": "130000", + "areaName": "河北省", + "cities": [ + { + "areaId": "130100", + "areaName": "石家庄市", + "counties": [ + { + "areaId": "130102", + "areaName": "长安区" + }, + { + "areaId": "130103", + "areaName": "桥东区" + }, + { + "areaId": "130104", + "areaName": "桥西区" + }, + { + "areaId": "130105", + "areaName": "新华区" + }, + { + "areaId": "130107", + "areaName": "井陉矿区" + }, + { + "areaId": "130108", + "areaName": "裕华区" + }, + { + "areaId": "130121", + "areaName": "井陉县" + }, + { + "areaId": "130123", + "areaName": "正定县" + }, + { + "areaId": "130124", + "areaName": "栾城县" + }, + { + "areaId": "130125", + "areaName": "行唐县" + }, + { + "areaId": "130126", + "areaName": "灵寿县" + }, + { + "areaId": "130127", + "areaName": "高邑县" + }, + { + "areaId": "130128", + "areaName": "深泽县" + }, + { + "areaId": "130129", + "areaName": "赞皇县" + }, + { + "areaId": "130130", + "areaName": "无极县" + }, + { + "areaId": "130131", + "areaName": "平山县" + }, + { + "areaId": "130132", + "areaName": "元氏县" + }, + { + "areaId": "130133", + "areaName": "赵县" + }, + { + "areaId": "130181", + "areaName": "辛集市" + }, + { + "areaId": "130182", + "areaName": "藁城市" + }, + { + "areaId": "130183", + "areaName": "晋州市" + }, + { + "areaId": "130184", + "areaName": "新乐市" + }, + { + "areaId": "130185", + "areaName": "鹿泉市" + } + ] + }, + { + "areaId": "130200", + "areaName": "唐山市", + "counties": [ + { + "areaId": "130202", + "areaName": "路南区" + }, + { + "areaId": "130203", + "areaName": "路北区" + }, + { + "areaId": "130204", + "areaName": "古冶区" + }, + { + "areaId": "130205", + "areaName": "开平区" + }, + { + "areaId": "130207", + "areaName": "丰南区" + }, + { + "areaId": "130208", + "areaName": "丰润区" + }, + { + "areaId": "130209", + "areaName": "曹妃甸区" + }, + { + "areaId": "130223", + "areaName": "滦县" + }, + { + "areaId": "130224", + "areaName": "滦南县" + }, + { + "areaId": "130225", + "areaName": "乐亭县" + }, + { + "areaId": "130227", + "areaName": "迁西县" + }, + { + "areaId": "130229", + "areaName": "玉田县" + }, + { + "areaId": "130281", + "areaName": "遵化市" + }, + { + "areaId": "130283", + "areaName": "迁安市" + } + ] + }, + { + "areaId": "130300", + "areaName": "秦皇岛市", + "counties": [ + { + "areaId": "130302", + "areaName": "海港区" + }, + { + "areaId": "130303", + "areaName": "山海关区" + }, + { + "areaId": "130304", + "areaName": "北戴河区" + }, + { + "areaId": "130321", + "areaName": "青龙满族自治县" + }, + { + "areaId": "130322", + "areaName": "昌黎县" + }, + { + "areaId": "130323", + "areaName": "抚宁县" + }, + { + "areaId": "130324", + "areaName": "卢龙县" + } + ] + }, + { + "areaId": "130400", + "areaName": "邯郸市", + "counties": [ + { + "areaId": "130402", + "areaName": "邯山区" + }, + { + "areaId": "130403", + "areaName": "丛台区" + }, + { + "areaId": "130404", + "areaName": "复兴区" + }, + { + "areaId": "130406", + "areaName": "峰峰矿区" + }, + { + "areaId": "130421", + "areaName": "邯郸县" + }, + { + "areaId": "130423", + "areaName": "临漳县" + }, + { + "areaId": "130424", + "areaName": "成安县" + }, + { + "areaId": "130425", + "areaName": "大名县" + }, + { + "areaId": "130426", + "areaName": "涉县" + }, + { + "areaId": "130427", + "areaName": "磁县" + }, + { + "areaId": "130428", + "areaName": "肥乡县" + }, + { + "areaId": "130429", + "areaName": "永年县" + }, + { + "areaId": "130430", + "areaName": "邱县" + }, + { + "areaId": "130431", + "areaName": "鸡泽县" + }, + { + "areaId": "130432", + "areaName": "广平县" + }, + { + "areaId": "130433", + "areaName": "馆陶县" + }, + { + "areaId": "130434", + "areaName": "魏县" + }, + { + "areaId": "130435", + "areaName": "曲周县" + }, + { + "areaId": "130481", + "areaName": "武安市" + } + ] + }, + { + "areaId": "130500", + "areaName": "邢台市", + "counties": [ + { + "areaId": "130502", + "areaName": "桥东区" + }, + { + "areaId": "130503", + "areaName": "桥西区" + }, + { + "areaId": "130521", + "areaName": "邢台县" + }, + { + "areaId": "130522", + "areaName": "临城县" + }, + { + "areaId": "130523", + "areaName": "内丘县" + }, + { + "areaId": "130524", + "areaName": "柏乡县" + }, + { + "areaId": "130525", + "areaName": "隆尧县" + }, + { + "areaId": "130526", + "areaName": "任县" + }, + { + "areaId": "130527", + "areaName": "南和县" + }, + { + "areaId": "130528", + "areaName": "宁晋县" + }, + { + "areaId": "130529", + "areaName": "巨鹿县" + }, + { + "areaId": "130530", + "areaName": "新河县" + }, + { + "areaId": "130531", + "areaName": "广宗县" + }, + { + "areaId": "130532", + "areaName": "平乡县" + }, + { + "areaId": "130533", + "areaName": "威县" + }, + { + "areaId": "130534", + "areaName": "清河县" + }, + { + "areaId": "130535", + "areaName": "临西县" + }, + { + "areaId": "130581", + "areaName": "南宫市" + }, + { + "areaId": "130582", + "areaName": "沙河市" + } + ] + }, + { + "areaId": "130600", + "areaName": "保定市", + "counties": [ + { + "areaId": "130602", + "areaName": "新市区" + }, + { + "areaId": "130603", + "areaName": "北市区" + }, + { + "areaId": "130604", + "areaName": "南市区" + }, + { + "areaId": "130621", + "areaName": "满城县" + }, + { + "areaId": "130622", + "areaName": "清苑县" + }, + { + "areaId": "130623", + "areaName": "涞水县" + }, + { + "areaId": "130624", + "areaName": "阜平县" + }, + { + "areaId": "130625", + "areaName": "徐水县" + }, + { + "areaId": "130626", + "areaName": "定兴县" + }, + { + "areaId": "130627", + "areaName": "唐县" + }, + { + "areaId": "130628", + "areaName": "高阳县" + }, + { + "areaId": "130629", + "areaName": "容城县" + }, + { + "areaId": "130630", + "areaName": "涞源县" + }, + { + "areaId": "130631", + "areaName": "望都县" + }, + { + "areaId": "130632", + "areaName": "安新县" + }, + { + "areaId": "130633", + "areaName": "易县" + }, + { + "areaId": "130634", + "areaName": "曲阳县" + }, + { + "areaId": "130635", + "areaName": "蠡县" + }, + { + "areaId": "130636", + "areaName": "顺平县" + }, + { + "areaId": "130637", + "areaName": "博野县" + }, + { + "areaId": "130638", + "areaName": "雄县" + }, + { + "areaId": "130681", + "areaName": "涿州市" + }, + { + "areaId": "130682", + "areaName": "定州市" + }, + { + "areaId": "130683", + "areaName": "安国市" + }, + { + "areaId": "130684", + "areaName": "高碑店市" + } + ] + }, + { + "areaId": "130700", + "areaName": "张家口市", + "counties": [ + { + "areaId": "130702", + "areaName": "桥东区" + }, + { + "areaId": "130703", + "areaName": "桥西区" + }, + { + "areaId": "130705", + "areaName": "宣化区" + }, + { + "areaId": "130706", + "areaName": "下花园区" + }, + { + "areaId": "130721", + "areaName": "宣化县" + }, + { + "areaId": "130722", + "areaName": "张北县" + }, + { + "areaId": "130723", + "areaName": "康保县" + }, + { + "areaId": "130724", + "areaName": "沽源县" + }, + { + "areaId": "130725", + "areaName": "尚义县" + }, + { + "areaId": "130726", + "areaName": "蔚县" + }, + { + "areaId": "130727", + "areaName": "阳原县" + }, + { + "areaId": "130728", + "areaName": "怀安县" + }, + { + "areaId": "130729", + "areaName": "万全县" + }, + { + "areaId": "130730", + "areaName": "怀来县" + }, + { + "areaId": "130731", + "areaName": "涿鹿县" + }, + { + "areaId": "130732", + "areaName": "赤城县" + }, + { + "areaId": "130733", + "areaName": "崇礼县" + } + ] + }, + { + "areaId": "130800", + "areaName": "承德市", + "counties": [ + { + "areaId": "130802", + "areaName": "双桥区" + }, + { + "areaId": "130803", + "areaName": "双滦区" + }, + { + "areaId": "130804", + "areaName": "鹰手营子矿区" + }, + { + "areaId": "130821", + "areaName": "承德县" + }, + { + "areaId": "130822", + "areaName": "兴隆县" + }, + { + "areaId": "130823", + "areaName": "平泉县" + }, + { + "areaId": "130824", + "areaName": "滦平县" + }, + { + "areaId": "130825", + "areaName": "隆化县" + }, + { + "areaId": "130826", + "areaName": "丰宁满族自治县" + }, + { + "areaId": "130827", + "areaName": "宽城满族自治县" + }, + { + "areaId": "130828", + "areaName": "围场满族蒙古族自治县" + } + ] + }, + { + "areaId": "130900", + "areaName": "沧州市", + "counties": [ + { + "areaId": "130902", + "areaName": "新华区" + }, + { + "areaId": "130903", + "areaName": "运河区" + }, + { + "areaId": "130921", + "areaName": "沧县" + }, + { + "areaId": "130922", + "areaName": "青县" + }, + { + "areaId": "130923", + "areaName": "东光县" + }, + { + "areaId": "130924", + "areaName": "海兴县" + }, + { + "areaId": "130925", + "areaName": "盐山县" + }, + { + "areaId": "130926", + "areaName": "肃宁县" + }, + { + "areaId": "130927", + "areaName": "南皮县" + }, + { + "areaId": "130928", + "areaName": "吴桥县" + }, + { + "areaId": "130929", + "areaName": "献县" + }, + { + "areaId": "130930", + "areaName": "孟村回族自治县" + }, + { + "areaId": "130981", + "areaName": "泊头市" + }, + { + "areaId": "130982", + "areaName": "任丘市" + }, + { + "areaId": "130983", + "areaName": "黄骅市" + }, + { + "areaId": "130984", + "areaName": "河间市" + } + ] + }, + { + "areaId": "131000", + "areaName": "廊坊市", + "counties": [ + { + "areaId": "131002", + "areaName": "安次区" + }, + { + "areaId": "131003", + "areaName": "广阳区" + }, + { + "areaId": "131022", + "areaName": "固安县" + }, + { + "areaId": "131023", + "areaName": "永清县" + }, + { + "areaId": "131024", + "areaName": "香河县" + }, + { + "areaId": "131025", + "areaName": "大城县" + }, + { + "areaId": "131026", + "areaName": "文安县" + }, + { + "areaId": "131028", + "areaName": "大厂回族自治县" + }, + { + "areaId": "131081", + "areaName": "霸州市" + }, + { + "areaId": "131082", + "areaName": "三河市" + } + ] + }, + { + "areaId": "131100", + "areaName": "衡水市", + "counties": [ + { + "areaId": "131102", + "areaName": "桃城区" + }, + { + "areaId": "131121", + "areaName": "枣强县" + }, + { + "areaId": "131122", + "areaName": "武邑县" + }, + { + "areaId": "131123", + "areaName": "武强县" + }, + { + "areaId": "131124", + "areaName": "饶阳县" + }, + { + "areaId": "131125", + "areaName": "安平县" + }, + { + "areaId": "131126", + "areaName": "故城县" + }, + { + "areaId": "131127", + "areaName": "景县" + }, + { + "areaId": "131128", + "areaName": "阜城县" + }, + { + "areaId": "131181", + "areaName": "冀州市" + }, + { + "areaId": "131182", + "areaName": "深州市" + } + ] + } + ] + }, + { + "areaId": "140000", + "areaName": "山西省", + "cities": [ + { + "areaId": "140100", + "areaName": "太原市", + "counties": [ + { + "areaId": "140105", + "areaName": "小店区" + }, + { + "areaId": "140106", + "areaName": "迎泽区" + }, + { + "areaId": "140107", + "areaName": "杏花岭区" + }, + { + "areaId": "140108", + "areaName": "尖草坪区" + }, + { + "areaId": "140109", + "areaName": "万柏林区" + }, + { + "areaId": "140110", + "areaName": "晋源区" + }, + { + "areaId": "140121", + "areaName": "清徐县" + }, + { + "areaId": "140122", + "areaName": "阳曲县" + }, + { + "areaId": "140123", + "areaName": "娄烦县" + }, + { + "areaId": "140181", + "areaName": "古交市" + } + ] + }, + { + "areaId": "140200", + "areaName": "大同市", + "counties": [ + { + "areaId": "140202", + "areaName": "城区" + }, + { + "areaId": "140203", + "areaName": "矿区" + }, + { + "areaId": "140211", + "areaName": "南郊区" + }, + { + "areaId": "140212", + "areaName": "新荣区" + }, + { + "areaId": "140221", + "areaName": "阳高县" + }, + { + "areaId": "140222", + "areaName": "天镇县" + }, + { + "areaId": "140223", + "areaName": "广灵县" + }, + { + "areaId": "140224", + "areaName": "灵丘县" + }, + { + "areaId": "140225", + "areaName": "浑源县" + }, + { + "areaId": "140226", + "areaName": "左云县" + }, + { + "areaId": "140227", + "areaName": "大同县" + } + ] + }, + { + "areaId": "140300", + "areaName": "阳泉市", + "counties": [ + { + "areaId": "140302", + "areaName": "城区" + }, + { + "areaId": "140303", + "areaName": "矿区" + }, + { + "areaId": "140311", + "areaName": "郊区" + }, + { + "areaId": "140321", + "areaName": "平定县" + }, + { + "areaId": "140322", + "areaName": "盂县" + } + ] + }, + { + "areaId": "140400", + "areaName": "长治市", + "counties": [ + { + "areaId": "140402", + "areaName": "城区" + }, + { + "areaId": "140411", + "areaName": "郊区" + }, + { + "areaId": "140421", + "areaName": "长治县" + }, + { + "areaId": "140423", + "areaName": "襄垣县" + }, + { + "areaId": "140424", + "areaName": "屯留县" + }, + { + "areaId": "140425", + "areaName": "平顺县" + }, + { + "areaId": "140426", + "areaName": "黎城县" + }, + { + "areaId": "140427", + "areaName": "壶关县" + }, + { + "areaId": "140428", + "areaName": "长子县" + }, + { + "areaId": "140429", + "areaName": "武乡县" + }, + { + "areaId": "140430", + "areaName": "沁县" + }, + { + "areaId": "140431", + "areaName": "沁源县" + }, + { + "areaId": "140481", + "areaName": "潞城市" + } + ] + }, + { + "areaId": "140500", + "areaName": "晋城市", + "counties": [ + { + "areaId": "140502", + "areaName": "城区" + }, + { + "areaId": "140521", + "areaName": "沁水县" + }, + { + "areaId": "140522", + "areaName": "阳城县" + }, + { + "areaId": "140524", + "areaName": "陵川县" + }, + { + "areaId": "140525", + "areaName": "泽州县" + }, + { + "areaId": "140581", + "areaName": "高平市" + } + ] + }, + { + "areaId": "140600", + "areaName": "朔州市", + "counties": [ + { + "areaId": "140602", + "areaName": "朔城区" + }, + { + "areaId": "140603", + "areaName": "平鲁区" + }, + { + "areaId": "140621", + "areaName": "山阴县" + }, + { + "areaId": "140622", + "areaName": "应县" + }, + { + "areaId": "140623", + "areaName": "右玉县" + }, + { + "areaId": "140624", + "areaName": "怀仁县" + } + ] + }, + { + "areaId": "140700", + "areaName": "晋中市", + "counties": [ + { + "areaId": "140702", + "areaName": "榆次区" + }, + { + "areaId": "140721", + "areaName": "榆社县" + }, + { + "areaId": "140722", + "areaName": "左权县" + }, + { + "areaId": "140723", + "areaName": "和顺县" + }, + { + "areaId": "140724", + "areaName": "昔阳县" + }, + { + "areaId": "140725", + "areaName": "寿阳县" + }, + { + "areaId": "140726", + "areaName": "太谷县" + }, + { + "areaId": "140727", + "areaName": "祁县" + }, + { + "areaId": "140728", + "areaName": "平遥县" + }, + { + "areaId": "140729", + "areaName": "灵石县" + }, + { + "areaId": "140781", + "areaName": "介休市" + } + ] + }, + { + "areaId": "140800", + "areaName": "运城市", + "counties": [ + { + "areaId": "140802", + "areaName": "盐湖区" + }, + { + "areaId": "140821", + "areaName": "临猗县" + }, + { + "areaId": "140822", + "areaName": "万荣县" + }, + { + "areaId": "140823", + "areaName": "闻喜县" + }, + { + "areaId": "140824", + "areaName": "稷山县" + }, + { + "areaId": "140825", + "areaName": "新绛县" + }, + { + "areaId": "140826", + "areaName": "绛县" + }, + { + "areaId": "140827", + "areaName": "垣曲县" + }, + { + "areaId": "140828", + "areaName": "夏县" + }, + { + "areaId": "140829", + "areaName": "平陆县" + }, + { + "areaId": "140830", + "areaName": "芮城县" + }, + { + "areaId": "140881", + "areaName": "永济市" + }, + { + "areaId": "140882", + "areaName": "河津市" + } + ] + }, + { + "areaId": "140900", + "areaName": "忻州市", + "counties": [ + { + "areaId": "140902", + "areaName": "忻府区" + }, + { + "areaId": "140921", + "areaName": "定襄县" + }, + { + "areaId": "140922", + "areaName": "五台县" + }, + { + "areaId": "140923", + "areaName": "代县" + }, + { + "areaId": "140924", + "areaName": "繁峙县" + }, + { + "areaId": "140925", + "areaName": "宁武县" + }, + { + "areaId": "140926", + "areaName": "静乐县" + }, + { + "areaId": "140927", + "areaName": "神池县" + }, + { + "areaId": "140928", + "areaName": "五寨县" + }, + { + "areaId": "140929", + "areaName": "岢岚县" + }, + { + "areaId": "140930", + "areaName": "河曲县" + }, + { + "areaId": "140931", + "areaName": "保德县" + }, + { + "areaId": "140932", + "areaName": "偏关县" + }, + { + "areaId": "140981", + "areaName": "原平市" + } + ] + }, + { + "areaId": "141000", + "areaName": "临汾市", + "counties": [ + { + "areaId": "141002", + "areaName": "尧都区" + }, + { + "areaId": "141021", + "areaName": "曲沃县" + }, + { + "areaId": "141022", + "areaName": "翼城县" + }, + { + "areaId": "141023", + "areaName": "襄汾县" + }, + { + "areaId": "141024", + "areaName": "洪洞县" + }, + { + "areaId": "141025", + "areaName": "古县" + }, + { + "areaId": "141026", + "areaName": "安泽县" + }, + { + "areaId": "141027", + "areaName": "浮山县" + }, + { + "areaId": "141028", + "areaName": "吉县" + }, + { + "areaId": "141029", + "areaName": "乡宁县" + }, + { + "areaId": "141030", + "areaName": "大宁县" + }, + { + "areaId": "141031", + "areaName": "隰县" + }, + { + "areaId": "141032", + "areaName": "永和县" + }, + { + "areaId": "141033", + "areaName": "蒲县" + }, + { + "areaId": "141034", + "areaName": "汾西县" + }, + { + "areaId": "141081", + "areaName": "侯马市" + }, + { + "areaId": "141082", + "areaName": "霍州市" + } + ] + }, + { + "areaId": "141100", + "areaName": "吕梁市", + "counties": [ + { + "areaId": "141102", + "areaName": "离石区" + }, + { + "areaId": "141121", + "areaName": "文水县" + }, + { + "areaId": "141122", + "areaName": "交城县" + }, + { + "areaId": "141123", + "areaName": "兴县" + }, + { + "areaId": "141124", + "areaName": "临县" + }, + { + "areaId": "141125", + "areaName": "柳林县" + }, + { + "areaId": "141126", + "areaName": "石楼县" + }, + { + "areaId": "141127", + "areaName": "岚县" + }, + { + "areaId": "141128", + "areaName": "方山县" + }, + { + "areaId": "141129", + "areaName": "中阳县" + }, + { + "areaId": "141130", + "areaName": "交口县" + }, + { + "areaId": "141181", + "areaName": "孝义市" + }, + { + "areaId": "141182", + "areaName": "汾阳市" + } + ] + } + ] + }, + { + "areaId": "150000", + "areaName": "内蒙古自治区", + "cities": [ + { + "areaId": "150100", + "areaName": "呼和浩特市", + "counties": [ + { + "areaId": "150102", + "areaName": "新城区" + }, + { + "areaId": "150103", + "areaName": "回民区" + }, + { + "areaId": "150104", + "areaName": "玉泉区" + }, + { + "areaId": "150105", + "areaName": "赛罕区" + }, + { + "areaId": "150121", + "areaName": "土默特左旗" + }, + { + "areaId": "150122", + "areaName": "托克托县" + }, + { + "areaId": "150123", + "areaName": "和林格尔县" + }, + { + "areaId": "150124", + "areaName": "清水河县" + }, + { + "areaId": "150125", + "areaName": "武川县" + } + ] + }, + { + "areaId": "150200", + "areaName": "包头市", + "counties": [ + { + "areaId": "150202", + "areaName": "东河区" + }, + { + "areaId": "150203", + "areaName": "昆都仑区" + }, + { + "areaId": "150204", + "areaName": "青山区" + }, + { + "areaId": "150205", + "areaName": "石拐区" + }, + { + "areaId": "150206", + "areaName": "白云鄂博矿区" + }, + { + "areaId": "150207", + "areaName": "九原区" + }, + { + "areaId": "150221", + "areaName": "土默特右旗" + }, + { + "areaId": "150222", + "areaName": "固阳县" + }, + { + "areaId": "150223", + "areaName": "达尔罕茂明安联合旗" + } + ] + }, + { + "areaId": "150300", + "areaName": "乌海市", + "counties": [ + { + "areaId": "150302", + "areaName": "海勃湾区" + }, + { + "areaId": "150303", + "areaName": "海南区" + }, + { + "areaId": "150304", + "areaName": "乌达区" + } + ] + }, + { + "areaId": "150400", + "areaName": "赤峰市", + "counties": [ + { + "areaId": "150402", + "areaName": "红山区" + }, + { + "areaId": "150403", + "areaName": "元宝山区" + }, + { + "areaId": "150404", + "areaName": "松山区" + }, + { + "areaId": "150421", + "areaName": "阿鲁科尔沁旗" + }, + { + "areaId": "150422", + "areaName": "巴林左旗" + }, + { + "areaId": "150423", + "areaName": "巴林右旗" + }, + { + "areaId": "150424", + "areaName": "林西县" + }, + { + "areaId": "150425", + "areaName": "克什克腾旗" + }, + { + "areaId": "150426", + "areaName": "翁牛特旗" + }, + { + "areaId": "150428", + "areaName": "喀喇沁旗" + }, + { + "areaId": "150429", + "areaName": "宁城县" + }, + { + "areaId": "150430", + "areaName": "敖汉旗" + } + ] + }, + { + "areaId": "150500", + "areaName": "通辽市", + "counties": [ + { + "areaId": "150502", + "areaName": "科尔沁区" + }, + { + "areaId": "150521", + "areaName": "科尔沁左翼中旗" + }, + { + "areaId": "150522", + "areaName": "科尔沁左翼后旗" + }, + { + "areaId": "150523", + "areaName": "开鲁县" + }, + { + "areaId": "150524", + "areaName": "库伦旗" + }, + { + "areaId": "150525", + "areaName": "奈曼旗" + }, + { + "areaId": "150526", + "areaName": "扎鲁特旗" + }, + { + "areaId": "150581", + "areaName": "霍林郭勒市" + } + ] + }, + { + "areaId": "150600", + "areaName": "鄂尔多斯市", + "counties": [ + { + "areaId": "150602", + "areaName": "东胜区" + }, + { + "areaId": "150621", + "areaName": "达拉特旗" + }, + { + "areaId": "150622", + "areaName": "准格尔旗" + }, + { + "areaId": "150623", + "areaName": "鄂托克前旗" + }, + { + "areaId": "150624", + "areaName": "鄂托克旗" + }, + { + "areaId": "150625", + "areaName": "杭锦旗" + }, + { + "areaId": "150626", + "areaName": "乌审旗" + }, + { + "areaId": "150627", + "areaName": "伊金霍洛旗" + } + ] + }, + { + "areaId": "150700", + "areaName": "呼伦贝尔市", + "counties": [ + { + "areaId": "150702", + "areaName": "海拉尔区" + }, + { + "areaId": "150703", + "areaName": "扎赉诺尔区" + }, + { + "areaId": "150721", + "areaName": "阿荣旗" + }, + { + "areaId": "150722", + "areaName": "莫力达瓦达斡尔族自治旗" + }, + { + "areaId": "150723", + "areaName": "鄂伦春自治旗" + }, + { + "areaId": "150724", + "areaName": "鄂温克族自治旗" + }, + { + "areaId": "150725", + "areaName": "陈巴尔虎旗" + }, + { + "areaId": "150726", + "areaName": "新巴尔虎左旗" + }, + { + "areaId": "150727", + "areaName": "新巴尔虎右旗" + }, + { + "areaId": "150781", + "areaName": "满洲里市" + }, + { + "areaId": "150782", + "areaName": "牙克石市" + }, + { + "areaId": "150783", + "areaName": "扎兰屯市" + }, + { + "areaId": "150784", + "areaName": "额尔古纳市" + }, + { + "areaId": "150785", + "areaName": "根河市" + } + ] + }, + { + "areaId": "150800", + "areaName": "巴彦淖尔市", + "counties": [ + { + "areaId": "150802", + "areaName": "临河区" + }, + { + "areaId": "150821", + "areaName": "五原县" + }, + { + "areaId": "150822", + "areaName": "磴口县" + }, + { + "areaId": "150823", + "areaName": "乌拉特前旗" + }, + { + "areaId": "150824", + "areaName": "乌拉特中旗" + }, + { + "areaId": "150825", + "areaName": "乌拉特后旗" + }, + { + "areaId": "150826", + "areaName": "杭锦后旗" + } + ] + }, + { + "areaId": "150900", + "areaName": "乌兰察布市", + "counties": [ + { + "areaId": "150902", + "areaName": "集宁区" + }, + { + "areaId": "150921", + "areaName": "卓资县" + }, + { + "areaId": "150922", + "areaName": "化德县" + }, + { + "areaId": "150923", + "areaName": "商都县" + }, + { + "areaId": "150924", + "areaName": "兴和县" + }, + { + "areaId": "150925", + "areaName": "凉城县" + }, + { + "areaId": "150926", + "areaName": "察哈尔右翼前旗" + }, + { + "areaId": "150927", + "areaName": "察哈尔右翼中旗" + }, + { + "areaId": "150928", + "areaName": "察哈尔右翼后旗" + }, + { + "areaId": "150929", + "areaName": "四子王旗" + }, + { + "areaId": "150981", + "areaName": "丰镇市" + } + ] + }, + { + "areaId": "152200", + "areaName": "兴安盟", + "counties": [ + { + "areaId": "152201", + "areaName": "乌兰浩特市" + }, + { + "areaId": "152202", + "areaName": "阿尔山市" + }, + { + "areaId": "152221", + "areaName": "科尔沁右翼前旗" + }, + { + "areaId": "152222", + "areaName": "科尔沁右翼中旗" + }, + { + "areaId": "152223", + "areaName": "扎赉特旗" + }, + { + "areaId": "152224", + "areaName": "突泉县" + } + ] + }, + { + "areaId": "152500", + "areaName": "锡林郭勒盟", + "counties": [ + { + "areaId": "152501", + "areaName": "二连浩特市" + }, + { + "areaId": "152502", + "areaName": "锡林浩特市" + }, + { + "areaId": "152522", + "areaName": "阿巴嘎旗" + }, + { + "areaId": "152523", + "areaName": "苏尼特左旗" + }, + { + "areaId": "152524", + "areaName": "苏尼特右旗" + }, + { + "areaId": "152525", + "areaName": "东乌珠穆沁旗" + }, + { + "areaId": "152526", + "areaName": "西乌珠穆沁旗" + }, + { + "areaId": "152527", + "areaName": "太仆寺旗" + }, + { + "areaId": "152528", + "areaName": "镶黄旗" + }, + { + "areaId": "152529", + "areaName": "正镶白旗" + }, + { + "areaId": "152530", + "areaName": "正蓝旗" + }, + { + "areaId": "152531", + "areaName": "多伦县" + } + ] + }, + { + "areaId": "152900", + "areaName": "阿拉善盟", + "counties": [ + { + "areaId": "152921", + "areaName": "阿拉善左旗" + }, + { + "areaId": "152922", + "areaName": "阿拉善右旗" + }, + { + "areaId": "152923", + "areaName": "额济纳旗" + } + ] + } + ] + }, + { + "areaId": "210000", + "areaName": "辽宁省", + "cities": [ + { + "areaId": "210100", + "areaName": "沈阳市", + "counties": [ + { + "areaId": "210102", + "areaName": "和平区" + }, + { + "areaId": "210103", + "areaName": "沈河区" + }, + { + "areaId": "210104", + "areaName": "大东区" + }, + { + "areaId": "210105", + "areaName": "皇姑区" + }, + { + "areaId": "210106", + "areaName": "铁西区" + }, + { + "areaId": "210111", + "areaName": "苏家屯区" + }, + { + "areaId": "210112", + "areaName": "东陵区" + }, + { + "areaId": "210113", + "areaName": "沈北新区" + }, + { + "areaId": "210114", + "areaName": "于洪区" + }, + { + "areaId": "210122", + "areaName": "辽中县" + }, + { + "areaId": "210123", + "areaName": "康平县" + }, + { + "areaId": "210124", + "areaName": "法库县" + }, + { + "areaId": "210181", + "areaName": "新民市" + }, + { + "areaId": "210184", + "areaName": "沈北区" + }, + { + "areaId": "210198", + "areaName": "新城子区(沈北新区)" + }, + { + "areaId": "210199", + "areaName": "浑南新区(东陵区)" + } + ] + }, + { + "areaId": "210200", + "areaName": "大连市", + "counties": [ + { + "areaId": "210202", + "areaName": "中山区" + }, + { + "areaId": "210203", + "areaName": "西岗区" + }, + { + "areaId": "210204", + "areaName": "沙河口区" + }, + { + "areaId": "210211", + "areaName": "甘井子区" + }, + { + "areaId": "210212", + "areaName": "旅顺口区" + }, + { + "areaId": "210213", + "areaName": "金州区" + }, + { + "areaId": "210224", + "areaName": "长海县" + }, + { + "areaId": "210281", + "areaName": "瓦房店市" + }, + { + "areaId": "210282", + "areaName": "普兰店市" + }, + { + "areaId": "210283", + "areaName": "庄河市" + } + ] + }, + { + "areaId": "210300", + "areaName": "鞍山市", + "counties": [ + { + "areaId": "210302", + "areaName": "铁东区" + }, + { + "areaId": "210303", + "areaName": "铁西区" + }, + { + "areaId": "210304", + "areaName": "立山区" + }, + { + "areaId": "210311", + "areaName": "千山区" + }, + { + "areaId": "210321", + "areaName": "台安县" + }, + { + "areaId": "210323", + "areaName": "岫岩满族自治县" + }, + { + "areaId": "210381", + "areaName": "海城市" + } + ] + }, + { + "areaId": "210400", + "areaName": "抚顺市", + "counties": [ + { + "areaId": "210402", + "areaName": "新抚区" + }, + { + "areaId": "210403", + "areaName": "东洲区" + }, + { + "areaId": "210404", + "areaName": "望花区" + }, + { + "areaId": "210411", + "areaName": "顺城区" + }, + { + "areaId": "210421", + "areaName": "抚顺县" + }, + { + "areaId": "210422", + "areaName": "新宾满族自治县" + }, + { + "areaId": "210423", + "areaName": "清原满族自治县" + } + ] + }, + { + "areaId": "210500", + "areaName": "本溪市", + "counties": [ + { + "areaId": "210502", + "areaName": "平山区" + }, + { + "areaId": "210503", + "areaName": "溪湖区" + }, + { + "areaId": "210504", + "areaName": "明山区" + }, + { + "areaId": "210505", + "areaName": "南芬区" + }, + { + "areaId": "210521", + "areaName": "本溪满族自治县" + }, + { + "areaId": "210522", + "areaName": "桓仁满族自治县" + } + ] + }, + { + "areaId": "210600", + "areaName": "丹东市", + "counties": [ + { + "areaId": "210602", + "areaName": "元宝区" + }, + { + "areaId": "210603", + "areaName": "振兴区" + }, + { + "areaId": "210604", + "areaName": "振安区" + }, + { + "areaId": "210624", + "areaName": "宽甸满族自治县" + }, + { + "areaId": "210681", + "areaName": "东港市" + }, + { + "areaId": "210682", + "areaName": "凤城市" + } + ] + }, + { + "areaId": "210700", + "areaName": "锦州市", + "counties": [ + { + "areaId": "210702", + "areaName": "古塔区" + }, + { + "areaId": "210703", + "areaName": "凌河区" + }, + { + "areaId": "210711", + "areaName": "太和区" + }, + { + "areaId": "210726", + "areaName": "黑山县" + }, + { + "areaId": "210727", + "areaName": "义县" + }, + { + "areaId": "210781", + "areaName": "凌海市" + }, + { + "areaId": "210782", + "areaName": "北镇市" + } + ] + }, + { + "areaId": "210800", + "areaName": "营口市", + "counties": [ + { + "areaId": "210802", + "areaName": "站前区" + }, + { + "areaId": "210803", + "areaName": "西市区" + }, + { + "areaId": "210804", + "areaName": "鲅鱼圈区" + }, + { + "areaId": "210811", + "areaName": "老边区" + }, + { + "areaId": "210881", + "areaName": "盖州市" + }, + { + "areaId": "210882", + "areaName": "大石桥市" + } + ] + }, + { + "areaId": "210900", + "areaName": "阜新市", + "counties": [ + { + "areaId": "210902", + "areaName": "海州区" + }, + { + "areaId": "210903", + "areaName": "新邱区" + }, + { + "areaId": "210904", + "areaName": "太平区" + }, + { + "areaId": "210905", + "areaName": "清河门区" + }, + { + "areaId": "210911", + "areaName": "细河区" + }, + { + "areaId": "210921", + "areaName": "阜新蒙古族自治县" + }, + { + "areaId": "210922", + "areaName": "彰武县" + } + ] + }, + { + "areaId": "211000", + "areaName": "辽阳市", + "counties": [ + { + "areaId": "211002", + "areaName": "白塔区" + }, + { + "areaId": "211003", + "areaName": "文圣区" + }, + { + "areaId": "211004", + "areaName": "宏伟区" + }, + { + "areaId": "211005", + "areaName": "弓长岭区" + }, + { + "areaId": "211011", + "areaName": "太子河区" + }, + { + "areaId": "211021", + "areaName": "辽阳县" + }, + { + "areaId": "211081", + "areaName": "灯塔市" + } + ] + }, + { + "areaId": "211100", + "areaName": "盘锦市", + "counties": [ + { + "areaId": "211102", + "areaName": "双台子区" + }, + { + "areaId": "211103", + "areaName": "兴隆台区" + }, + { + "areaId": "211121", + "areaName": "大洼县" + }, + { + "areaId": "211122", + "areaName": "盘山县" + } + ] + }, + { + "areaId": "211200", + "areaName": "铁岭市", + "counties": [ + { + "areaId": "211202", + "areaName": "银州区" + }, + { + "areaId": "211204", + "areaName": "清河区" + }, + { + "areaId": "211221", + "areaName": "铁岭县" + }, + { + "areaId": "211223", + "areaName": "西丰县" + }, + { + "areaId": "211224", + "areaName": "昌图县" + }, + { + "areaId": "211281", + "areaName": "调兵山市" + }, + { + "areaId": "211282", + "areaName": "开原市" + } + ] + }, + { + "areaId": "211300", + "areaName": "朝阳市", + "counties": [ + { + "areaId": "211302", + "areaName": "双塔区" + }, + { + "areaId": "211303", + "areaName": "龙城区" + }, + { + "areaId": "211321", + "areaName": "朝阳县" + }, + { + "areaId": "211322", + "areaName": "建平县" + }, + { + "areaId": "211324", + "areaName": "喀喇沁左翼蒙古族自治县" + }, + { + "areaId": "211381", + "areaName": "北票市" + }, + { + "areaId": "211382", + "areaName": "凌源市" + } + ] + }, + { + "areaId": "211400", + "areaName": "葫芦岛市", + "counties": [ + { + "areaId": "211402", + "areaName": "连山区" + }, + { + "areaId": "211403", + "areaName": "龙港区" + }, + { + "areaId": "211404", + "areaName": "南票区" + }, + { + "areaId": "211421", + "areaName": "绥中县" + }, + { + "areaId": "211422", + "areaName": "建昌县" + }, + { + "areaId": "211481", + "areaName": "兴城市" + } + ] + } + ] + }, + { + "areaId": "220000", + "areaName": "吉林省", + "cities": [ + { + "areaId": "220100", + "areaName": "长春市", + "counties": [ + { + "areaId": "220102", + "areaName": "南关区" + }, + { + "areaId": "220103", + "areaName": "宽城区" + }, + { + "areaId": "220104", + "areaName": "朝阳区" + }, + { + "areaId": "220105", + "areaName": "二道区" + }, + { + "areaId": "220106", + "areaName": "绿园区" + }, + { + "areaId": "220112", + "areaName": "双阳区" + }, + { + "areaId": "220122", + "areaName": "农安县" + }, + { + "areaId": "220181", + "areaName": "九台市" + }, + { + "areaId": "220182", + "areaName": "榆树市" + }, + { + "areaId": "220183", + "areaName": "德惠市" + } + ] + }, + { + "areaId": "220200", + "areaName": "吉林市", + "counties": [ + { + "areaId": "220202", + "areaName": "昌邑区" + }, + { + "areaId": "220203", + "areaName": "龙潭区" + }, + { + "areaId": "220204", + "areaName": "船营区" + }, + { + "areaId": "220211", + "areaName": "丰满区" + }, + { + "areaId": "220221", + "areaName": "永吉县" + }, + { + "areaId": "220281", + "areaName": "蛟河市" + }, + { + "areaId": "220282", + "areaName": "桦甸市" + }, + { + "areaId": "220283", + "areaName": "舒兰市" + }, + { + "areaId": "220284", + "areaName": "磐石市" + } + ] + }, + { + "areaId": "220300", + "areaName": "四平市", + "counties": [ + { + "areaId": "220302", + "areaName": "铁西区" + }, + { + "areaId": "220303", + "areaName": "铁东区" + }, + { + "areaId": "220322", + "areaName": "梨树县" + }, + { + "areaId": "220323", + "areaName": "伊通满族自治县" + }, + { + "areaId": "220381", + "areaName": "公主岭市" + }, + { + "areaId": "220382", + "areaName": "双辽市" + } + ] + }, + { + "areaId": "220400", + "areaName": "辽源市", + "counties": [ + { + "areaId": "220402", + "areaName": "龙山区" + }, + { + "areaId": "220403", + "areaName": "西安区" + }, + { + "areaId": "220421", + "areaName": "东丰县" + }, + { + "areaId": "220422", + "areaName": "东辽县" + } + ] + }, + { + "areaId": "220500", + "areaName": "通化市", + "counties": [ + { + "areaId": "220502", + "areaName": "东昌区" + }, + { + "areaId": "220503", + "areaName": "二道江区" + }, + { + "areaId": "220521", + "areaName": "通化县" + }, + { + "areaId": "220523", + "areaName": "辉南县" + }, + { + "areaId": "220524", + "areaName": "柳河县" + }, + { + "areaId": "220581", + "areaName": "梅河口市" + }, + { + "areaId": "220582", + "areaName": "集安市" + } + ] + }, + { + "areaId": "220600", + "areaName": "白山市", + "counties": [ + { + "areaId": "220602", + "areaName": "浑江区" + }, + { + "areaId": "220605", + "areaName": "江源区" + }, + { + "areaId": "220621", + "areaName": "抚松县" + }, + { + "areaId": "220622", + "areaName": "靖宇县" + }, + { + "areaId": "220623", + "areaName": "长白朝鲜族自治县" + }, + { + "areaId": "220681", + "areaName": "临江市" + } + ] + }, + { + "areaId": "220700", + "areaName": "松原市", + "counties": [ + { + "areaId": "220702", + "areaName": "宁江区" + }, + { + "areaId": "220721", + "areaName": "前郭尔罗斯蒙古族自治县" + }, + { + "areaId": "220722", + "areaName": "长岭县" + }, + { + "areaId": "220723", + "areaName": "乾安县" + }, + { + "areaId": "220781", + "areaName": "扶余市" + } + ] + }, + { + "areaId": "220800", + "areaName": "白城市", + "counties": [ + { + "areaId": "220802", + "areaName": "洮北区" + }, + { + "areaId": "220821", + "areaName": "镇赉县" + }, + { + "areaId": "220822", + "areaName": "通榆县" + }, + { + "areaId": "220881", + "areaName": "洮南市" + }, + { + "areaId": "220882", + "areaName": "大安市" + } + ] + }, + { + "areaId": "222400", + "areaName": "延边朝鲜族自治州", + "counties": [ + { + "areaId": "222401", + "areaName": "延吉市" + }, + { + "areaId": "222402", + "areaName": "图们市" + }, + { + "areaId": "222403", + "areaName": "敦化市" + }, + { + "areaId": "222404", + "areaName": "珲春市" + }, + { + "areaId": "222405", + "areaName": "龙井市" + }, + { + "areaId": "222406", + "areaName": "和龙市" + }, + { + "areaId": "222424", + "areaName": "汪清县" + }, + { + "areaId": "222426", + "areaName": "安图县" + } + ] + } + ] + }, + { + "areaId": "230000", + "areaName": "黑龙江省", + "cities": [ + { + "areaId": "230100", + "areaName": "哈尔滨市", + "counties": [ + { + "areaId": "230102", + "areaName": "道里区" + }, + { + "areaId": "230103", + "areaName": "南岗区" + }, + { + "areaId": "230104", + "areaName": "道外区" + }, + { + "areaId": "230108", + "areaName": "平房区" + }, + { + "areaId": "230109", + "areaName": "松北区" + }, + { + "areaId": "230110", + "areaName": "香坊区" + }, + { + "areaId": "230111", + "areaName": "呼兰区" + }, + { + "areaId": "230112", + "areaName": "阿城区" + }, + { + "areaId": "230123", + "areaName": "依兰县" + }, + { + "areaId": "230124", + "areaName": "方正县" + }, + { + "areaId": "230125", + "areaName": "宾县" + }, + { + "areaId": "230126", + "areaName": "巴彦县" + }, + { + "areaId": "230127", + "areaName": "木兰县" + }, + { + "areaId": "230128", + "areaName": "通河县" + }, + { + "areaId": "230129", + "areaName": "延寿县" + }, + { + "areaId": "230182", + "areaName": "双城市" + }, + { + "areaId": "230183", + "areaName": "尚志市" + }, + { + "areaId": "230184", + "areaName": "五常市" + } + ] + }, + { + "areaId": "230200", + "areaName": "齐齐哈尔市", + "counties": [ + { + "areaId": "230202", + "areaName": "龙沙区" + }, + { + "areaId": "230203", + "areaName": "建华区" + }, + { + "areaId": "230204", + "areaName": "铁锋区" + }, + { + "areaId": "230205", + "areaName": "昂昂溪区" + }, + { + "areaId": "230206", + "areaName": "富拉尔基区" + }, + { + "areaId": "230207", + "areaName": "碾子山区" + }, + { + "areaId": "230208", + "areaName": "梅里斯达斡尔族区" + }, + { + "areaId": "230221", + "areaName": "龙江县" + }, + { + "areaId": "230223", + "areaName": "依安县" + }, + { + "areaId": "230224", + "areaName": "泰来县" + }, + { + "areaId": "230225", + "areaName": "甘南县" + }, + { + "areaId": "230227", + "areaName": "富裕县" + }, + { + "areaId": "230229", + "areaName": "克山县" + }, + { + "areaId": "230230", + "areaName": "克东县" + }, + { + "areaId": "230231", + "areaName": "拜泉县" + }, + { + "areaId": "230281", + "areaName": "讷河市" + } + ] + }, + { + "areaId": "230300", + "areaName": "鸡西市", + "counties": [ + { + "areaId": "230302", + "areaName": "鸡冠区" + }, + { + "areaId": "230303", + "areaName": "恒山区" + }, + { + "areaId": "230304", + "areaName": "滴道区" + }, + { + "areaId": "230305", + "areaName": "梨树区" + }, + { + "areaId": "230306", + "areaName": "城子河区" + }, + { + "areaId": "230307", + "areaName": "麻山区" + }, + { + "areaId": "230321", + "areaName": "鸡东县" + }, + { + "areaId": "230381", + "areaName": "虎林市" + }, + { + "areaId": "230382", + "areaName": "密山市" + } + ] + }, + { + "areaId": "230400", + "areaName": "鹤岗市", + "counties": [ + { + "areaId": "230402", + "areaName": "向阳区" + }, + { + "areaId": "230403", + "areaName": "工农区" + }, + { + "areaId": "230404", + "areaName": "南山区" + }, + { + "areaId": "230405", + "areaName": "兴安区" + }, + { + "areaId": "230406", + "areaName": "东山区" + }, + { + "areaId": "230407", + "areaName": "兴山区" + }, + { + "areaId": "230421", + "areaName": "萝北县" + }, + { + "areaId": "230422", + "areaName": "绥滨县" + } + ] + }, + { + "areaId": "230500", + "areaName": "双鸭山市", + "counties": [ + { + "areaId": "230502", + "areaName": "尖山区" + }, + { + "areaId": "230503", + "areaName": "岭东区" + }, + { + "areaId": "230505", + "areaName": "四方台区" + }, + { + "areaId": "230506", + "areaName": "宝山区" + }, + { + "areaId": "230521", + "areaName": "集贤县" + }, + { + "areaId": "230522", + "areaName": "友谊县" + }, + { + "areaId": "230523", + "areaName": "宝清县" + }, + { + "areaId": "230524", + "areaName": "饶河县" + } + ] + }, + { + "areaId": "230600", + "areaName": "大庆市", + "counties": [ + { + "areaId": "230602", + "areaName": "萨尔图区" + }, + { + "areaId": "230603", + "areaName": "龙凤区" + }, + { + "areaId": "230604", + "areaName": "让胡路区" + }, + { + "areaId": "230605", + "areaName": "红岗区" + }, + { + "areaId": "230606", + "areaName": "大同区" + }, + { + "areaId": "230621", + "areaName": "肇州县" + }, + { + "areaId": "230622", + "areaName": "肇源县" + }, + { + "areaId": "230623", + "areaName": "林甸县" + }, + { + "areaId": "230624", + "areaName": "杜尔伯特蒙古族自治县" + } + ] + }, + { + "areaId": "230700", + "areaName": "伊春市", + "counties": [ + { + "areaId": "230702", + "areaName": "伊春区" + }, + { + "areaId": "230703", + "areaName": "南岔区" + }, + { + "areaId": "230704", + "areaName": "友好区" + }, + { + "areaId": "230705", + "areaName": "西林区" + }, + { + "areaId": "230706", + "areaName": "翠峦区" + }, + { + "areaId": "230707", + "areaName": "新青区" + }, + { + "areaId": "230708", + "areaName": "美溪区" + }, + { + "areaId": "230709", + "areaName": "金山屯区" + }, + { + "areaId": "230710", + "areaName": "五营区" + }, + { + "areaId": "230711", + "areaName": "乌马河区" + }, + { + "areaId": "230712", + "areaName": "汤旺河区" + }, + { + "areaId": "230713", + "areaName": "带岭区" + }, + { + "areaId": "230714", + "areaName": "乌伊岭区" + }, + { + "areaId": "230715", + "areaName": "红星区" + }, + { + "areaId": "230716", + "areaName": "上甘岭区" + }, + { + "areaId": "230722", + "areaName": "嘉荫县" + }, + { + "areaId": "230781", + "areaName": "铁力市" + } + ] + }, + { + "areaId": "230800", + "areaName": "佳木斯市", + "counties": [ + { + "areaId": "230803", + "areaName": "向阳区" + }, + { + "areaId": "230804", + "areaName": "前进区" + }, + { + "areaId": "230805", + "areaName": "东风区" + }, + { + "areaId": "230811", + "areaName": "郊区" + }, + { + "areaId": "230822", + "areaName": "桦南县" + }, + { + "areaId": "230826", + "areaName": "桦川县" + }, + { + "areaId": "230828", + "areaName": "汤原县" + }, + { + "areaId": "230833", + "areaName": "抚远县" + }, + { + "areaId": "230881", + "areaName": "同江市" + }, + { + "areaId": "230882", + "areaName": "富锦市" + } + ] + }, + { + "areaId": "230900", + "areaName": "七台河市", + "counties": [ + { + "areaId": "230902", + "areaName": "新兴区" + }, + { + "areaId": "230903", + "areaName": "桃山区" + }, + { + "areaId": "230904", + "areaName": "茄子河区" + }, + { + "areaId": "230921", + "areaName": "勃利县" + } + ] + }, + { + "areaId": "231000", + "areaName": "牡丹江市", + "counties": [ + { + "areaId": "231002", + "areaName": "东安区" + }, + { + "areaId": "231003", + "areaName": "阳明区" + }, + { + "areaId": "231004", + "areaName": "爱民区" + }, + { + "areaId": "231005", + "areaName": "西安区" + }, + { + "areaId": "231024", + "areaName": "东宁县" + }, + { + "areaId": "231025", + "areaName": "林口县" + }, + { + "areaId": "231081", + "areaName": "绥芬河市" + }, + { + "areaId": "231083", + "areaName": "海林市" + }, + { + "areaId": "231084", + "areaName": "宁安市" + }, + { + "areaId": "231085", + "areaName": "穆棱市" + } + ] + }, + { + "areaId": "231100", + "areaName": "黑河市", + "counties": [ + { + "areaId": "231102", + "areaName": "爱辉区" + }, + { + "areaId": "231121", + "areaName": "嫩江县" + }, + { + "areaId": "231123", + "areaName": "逊克县" + }, + { + "areaId": "231124", + "areaName": "孙吴县" + }, + { + "areaId": "231181", + "areaName": "北安市" + }, + { + "areaId": "231182", + "areaName": "五大连池市" + } + ] + }, + { + "areaId": "231200", + "areaName": "绥化市", + "counties": [ + { + "areaId": "231202", + "areaName": "北林区" + }, + { + "areaId": "231221", + "areaName": "望奎县" + }, + { + "areaId": "231222", + "areaName": "兰西县" + }, + { + "areaId": "231223", + "areaName": "青冈县" + }, + { + "areaId": "231224", + "areaName": "庆安县" + }, + { + "areaId": "231225", + "areaName": "明水县" + }, + { + "areaId": "231226", + "areaName": "绥棱县" + }, + { + "areaId": "231281", + "areaName": "安达市" + }, + { + "areaId": "231282", + "areaName": "肇东市" + }, + { + "areaId": "231283", + "areaName": "海伦市" + } + ] + }, + { + "areaId": "232700", + "areaName": "大兴安岭地区", + "counties": [ + { + "areaId": "232721", + "areaName": "呼玛县" + }, + { + "areaId": "232722", + "areaName": "塔河县" + }, + { + "areaId": "232723", + "areaName": "漠河县" + } + ] + } + ] + }, + { + "areaId": "310000", + "areaName": "上海市", + "cities": [ + { + "areaId": "310000", + "areaName": "上海市", + "counties": [ + { + "areaId": "310101", + "areaName": "黄浦区" + }, + { + "areaId": "310104", + "areaName": "徐汇区" + }, + { + "areaId": "310105", + "areaName": "长宁区" + }, + { + "areaId": "310106", + "areaName": "静安区" + }, + { + "areaId": "310107", + "areaName": "普陀区" + }, + { + "areaId": "310108", + "areaName": "闸北区" + }, + { + "areaId": "310109", + "areaName": "虹口区" + }, + { + "areaId": "310110", + "areaName": "杨浦区" + }, + { + "areaId": "310112", + "areaName": "闵行区" + }, + { + "areaId": "310113", + "areaName": "宝山区" + }, + { + "areaId": "310114", + "areaName": "嘉定区" + }, + { + "areaId": "310115", + "areaName": "浦东新区" + }, + { + "areaId": "310116", + "areaName": "金山区" + }, + { + "areaId": "310117", + "areaName": "松江区" + }, + { + "areaId": "310118", + "areaName": "青浦区" + }, + { + "areaId": "310120", + "areaName": "奉贤区" + }, + { + "areaId": "310199", + "areaName": "卢湾区(黄浦区)" + }, + { + "areaId": "310230", + "areaName": "崇明县" + } + ] + } + ] + }, + { + "areaId": "320000", + "areaName": "江苏省", + "cities": [ + { + "areaId": "320100", + "areaName": "南京市", + "counties": [ + { + "areaId": "320102", + "areaName": "玄武区" + }, + { + "areaId": "320104", + "areaName": "秦淮区" + }, + { + "areaId": "320105", + "areaName": "建邺区" + }, + { + "areaId": "320106", + "areaName": "鼓楼区" + }, + { + "areaId": "320111", + "areaName": "浦口区" + }, + { + "areaId": "320113", + "areaName": "栖霞区" + }, + { + "areaId": "320114", + "areaName": "雨花台区" + }, + { + "areaId": "320115", + "areaName": "江宁区" + }, + { + "areaId": "320116", + "areaName": "六合区" + }, + { + "areaId": "320117", + "areaName": "溧水区" + }, + { + "areaId": "320118", + "areaName": "高淳区" + } + ] + }, + { + "areaId": "320200", + "areaName": "无锡市", + "counties": [ + { + "areaId": "320202", + "areaName": "崇安区" + }, + { + "areaId": "320203", + "areaName": "南长区" + }, + { + "areaId": "320204", + "areaName": "北塘区" + }, + { + "areaId": "320205", + "areaName": "锡山区" + }, + { + "areaId": "320206", + "areaName": "惠山区" + }, + { + "areaId": "320211", + "areaName": "滨湖区" + }, + { + "areaId": "320281", + "areaName": "江阴市" + }, + { + "areaId": "320282", + "areaName": "宜兴市" + } + ] + }, + { + "areaId": "320300", + "areaName": "徐州市", + "counties": [ + { + "areaId": "320302", + "areaName": "鼓楼区" + }, + { + "areaId": "320303", + "areaName": "云龙区" + }, + { + "areaId": "320305", + "areaName": "贾汪区" + }, + { + "areaId": "320311", + "areaName": "泉山区" + }, + { + "areaId": "320312", + "areaName": "铜山区" + }, + { + "areaId": "320321", + "areaName": "丰县" + }, + { + "areaId": "320322", + "areaName": "沛县" + }, + { + "areaId": "320324", + "areaName": "睢宁县" + }, + { + "areaId": "320381", + "areaName": "新沂市" + }, + { + "areaId": "320382", + "areaName": "邳州市" + } + ] + }, + { + "areaId": "320400", + "areaName": "常州市", + "counties": [ + { + "areaId": "320402", + "areaName": "天宁区" + }, + { + "areaId": "320404", + "areaName": "钟楼区" + }, + { + "areaId": "320405", + "areaName": "戚墅堰区" + }, + { + "areaId": "320411", + "areaName": "新北区" + }, + { + "areaId": "320412", + "areaName": "武进区" + }, + { + "areaId": "320481", + "areaName": "溧阳市" + }, + { + "areaId": "320482", + "areaName": "金坛市" + } + ] + }, + { + "areaId": "320500", + "areaName": "苏州市", + "counties": [ + { + "areaId": "320505", + "areaName": "虎丘区" + }, + { + "areaId": "320506", + "areaName": "吴中区" + }, + { + "areaId": "320507", + "areaName": "相城区" + }, + { + "areaId": "320508", + "areaName": "姑苏区" + }, + { + "areaId": "320509", + "areaName": "吴江区" + }, + { + "areaId": "320581", + "areaName": "常熟市" + }, + { + "areaId": "320582", + "areaName": "张家港市" + }, + { + "areaId": "320583", + "areaName": "昆山市" + }, + { + "areaId": "320585", + "areaName": "太仓市" + } + ] + }, + { + "areaId": "320600", + "areaName": "南通市", + "counties": [ + { + "areaId": "320602", + "areaName": "崇川区" + }, + { + "areaId": "320611", + "areaName": "港闸区" + }, + { + "areaId": "320612", + "areaName": "通州区" + }, + { + "areaId": "320621", + "areaName": "海安县" + }, + { + "areaId": "320623", + "areaName": "如东县" + }, + { + "areaId": "320681", + "areaName": "启东市" + }, + { + "areaId": "320682", + "areaName": "如皋市" + }, + { + "areaId": "320684", + "areaName": "海门市" + } + ] + }, + { + "areaId": "320700", + "areaName": "连云港市", + "counties": [ + { + "areaId": "320703", + "areaName": "连云区" + }, + { + "areaId": "320705", + "areaName": "新浦区" + }, + { + "areaId": "320706", + "areaName": "海州区" + }, + { + "areaId": "320721", + "areaName": "赣榆县" + }, + { + "areaId": "320722", + "areaName": "东海县" + }, + { + "areaId": "320723", + "areaName": "灌云县" + }, + { + "areaId": "320724", + "areaName": "灌南县" + } + ] + }, + { + "areaId": "320800", + "areaName": "淮安市", + "counties": [ + { + "areaId": "320802", + "areaName": "清河区" + }, + { + "areaId": "320803", + "areaName": "淮安区" + }, + { + "areaId": "320804", + "areaName": "淮阴区" + }, + { + "areaId": "320811", + "areaName": "清浦区" + }, + { + "areaId": "320826", + "areaName": "涟水县" + }, + { + "areaId": "320829", + "areaName": "洪泽县" + }, + { + "areaId": "320830", + "areaName": "盱眙县" + }, + { + "areaId": "320831", + "areaName": "金湖县" + } + ] + }, + { + "areaId": "320900", + "areaName": "盐城市", + "counties": [ + { + "areaId": "320902", + "areaName": "亭湖区" + }, + { + "areaId": "320903", + "areaName": "盐都区" + }, + { + "areaId": "320921", + "areaName": "响水县" + }, + { + "areaId": "320922", + "areaName": "滨海县" + }, + { + "areaId": "320923", + "areaName": "阜宁县" + }, + { + "areaId": "320924", + "areaName": "射阳县" + }, + { + "areaId": "320925", + "areaName": "建湖县" + }, + { + "areaId": "320981", + "areaName": "东台市" + }, + { + "areaId": "320982", + "areaName": "大丰市" + } + ] + }, + { + "areaId": "321000", + "areaName": "扬州市", + "counties": [ + { + "areaId": "321002", + "areaName": "广陵区" + }, + { + "areaId": "321003", + "areaName": "邗江区" + }, + { + "areaId": "321012", + "areaName": "江都区" + }, + { + "areaId": "321023", + "areaName": "宝应县" + }, + { + "areaId": "321081", + "areaName": "仪征市" + }, + { + "areaId": "321084", + "areaName": "高邮市" + } + ] + }, + { + "areaId": "321100", + "areaName": "镇江市", + "counties": [ + { + "areaId": "321102", + "areaName": "京口区" + }, + { + "areaId": "321111", + "areaName": "润州区" + }, + { + "areaId": "321112", + "areaName": "丹徒区" + }, + { + "areaId": "321181", + "areaName": "丹阳市" + }, + { + "areaId": "321182", + "areaName": "扬中市" + }, + { + "areaId": "321183", + "areaName": "句容市" + } + ] + }, + { + "areaId": "321200", + "areaName": "泰州市", + "counties": [ + { + "areaId": "321202", + "areaName": "海陵区" + }, + { + "areaId": "321203", + "areaName": "高港区" + }, + { + "areaId": "321204", + "areaName": "姜堰区" + }, + { + "areaId": "321281", + "areaName": "兴化市" + }, + { + "areaId": "321282", + "areaName": "靖江市" + }, + { + "areaId": "321283", + "areaName": "泰兴市" + } + ] + }, + { + "areaId": "321300", + "areaName": "宿迁市", + "counties": [ + { + "areaId": "321302", + "areaName": "宿城区" + }, + { + "areaId": "321311", + "areaName": "宿豫区" + }, + { + "areaId": "321322", + "areaName": "沭阳县" + }, + { + "areaId": "321323", + "areaName": "泗阳县" + }, + { + "areaId": "321324", + "areaName": "泗洪县" + } + ] + } + ] + }, + { + "areaId": "330000", + "areaName": "浙江省", + "cities": [ + { + "areaId": "330100", + "areaName": "杭州市", + "counties": [ + { + "areaId": "330102", + "areaName": "上城区" + }, + { + "areaId": "330103", + "areaName": "下城区" + }, + { + "areaId": "330104", + "areaName": "江干区" + }, + { + "areaId": "330105", + "areaName": "拱墅区" + }, + { + "areaId": "330106", + "areaName": "西湖区" + }, + { + "areaId": "330108", + "areaName": "滨江区" + }, + { + "areaId": "330109", + "areaName": "萧山区" + }, + { + "areaId": "330110", + "areaName": "余杭区" + }, + { + "areaId": "330122", + "areaName": "桐庐县" + }, + { + "areaId": "330127", + "areaName": "淳安县" + }, + { + "areaId": "330182", + "areaName": "建德市" + }, + { + "areaId": "330183", + "areaName": "富阳市" + }, + { + "areaId": "330185", + "areaName": "临安市" + } + ] + }, + { + "areaId": "330200", + "areaName": "宁波市", + "counties": [ + { + "areaId": "330203", + "areaName": "海曙区" + }, + { + "areaId": "330204", + "areaName": "江东区" + }, + { + "areaId": "330205", + "areaName": "江北区" + }, + { + "areaId": "330206", + "areaName": "北仑区" + }, + { + "areaId": "330211", + "areaName": "镇海区" + }, + { + "areaId": "330212", + "areaName": "鄞州区" + }, + { + "areaId": "330225", + "areaName": "象山县" + }, + { + "areaId": "330226", + "areaName": "宁海县" + }, + { + "areaId": "330281", + "areaName": "余姚市" + }, + { + "areaId": "330282", + "areaName": "慈溪市" + }, + { + "areaId": "330283", + "areaName": "奉化市" + } + ] + }, + { + "areaId": "330300", + "areaName": "温州市", + "counties": [ + { + "areaId": "330302", + "areaName": "鹿城区" + }, + { + "areaId": "330303", + "areaName": "龙湾区" + }, + { + "areaId": "330304", + "areaName": "瓯海区" + }, + { + "areaId": "330322", + "areaName": "洞头县" + }, + { + "areaId": "330324", + "areaName": "永嘉县" + }, + { + "areaId": "330326", + "areaName": "平阳县" + }, + { + "areaId": "330327", + "areaName": "苍南县" + }, + { + "areaId": "330328", + "areaName": "文成县" + }, + { + "areaId": "330329", + "areaName": "泰顺县" + }, + { + "areaId": "330381", + "areaName": "瑞安市" + }, + { + "areaId": "330382", + "areaName": "乐清市" + } + ] + }, + { + "areaId": "330400", + "areaName": "嘉兴市", + "counties": [ + { + "areaId": "330402", + "areaName": "南湖区" + }, + { + "areaId": "330411", + "areaName": "秀洲区" + }, + { + "areaId": "330421", + "areaName": "嘉善县" + }, + { + "areaId": "330424", + "areaName": "海盐县" + }, + { + "areaId": "330481", + "areaName": "海宁市" + }, + { + "areaId": "330482", + "areaName": "平湖市" + }, + { + "areaId": "330483", + "areaName": "桐乡市" + } + ] + }, + { + "areaId": "330500", + "areaName": "湖州市", + "counties": [ + { + "areaId": "330502", + "areaName": "吴兴区" + }, + { + "areaId": "330503", + "areaName": "南浔区" + }, + { + "areaId": "330521", + "areaName": "德清县" + }, + { + "areaId": "330522", + "areaName": "长兴县" + }, + { + "areaId": "330523", + "areaName": "安吉县" + } + ] + }, + { + "areaId": "330600", + "areaName": "绍兴市", + "counties": [ + { + "areaId": "330602", + "areaName": "越城区" + }, + { + "areaId": "330621", + "areaName": "绍兴县" + }, + { + "areaId": "330624", + "areaName": "新昌县" + }, + { + "areaId": "330681", + "areaName": "诸暨市" + }, + { + "areaId": "330682", + "areaName": "上虞市" + }, + { + "areaId": "330683", + "areaName": "嵊州市" + } + ] + }, + { + "areaId": "330700", + "areaName": "金华市", + "counties": [ + { + "areaId": "330702", + "areaName": "婺城区" + }, + { + "areaId": "330703", + "areaName": "金东区" + }, + { + "areaId": "330723", + "areaName": "武义县" + }, + { + "areaId": "330726", + "areaName": "浦江县" + }, + { + "areaId": "330727", + "areaName": "磐安县" + }, + { + "areaId": "330781", + "areaName": "兰溪市" + }, + { + "areaId": "330782", + "areaName": "义乌市" + }, + { + "areaId": "330783", + "areaName": "东阳市" + }, + { + "areaId": "330784", + "areaName": "永康市" + } + ] + }, + { + "areaId": "330800", + "areaName": "衢州市", + "counties": [ + { + "areaId": "330802", + "areaName": "柯城区" + }, + { + "areaId": "330803", + "areaName": "衢江区" + }, + { + "areaId": "330822", + "areaName": "常山县" + }, + { + "areaId": "330824", + "areaName": "开化县" + }, + { + "areaId": "330825", + "areaName": "龙游县" + }, + { + "areaId": "330881", + "areaName": "江山市" + } + ] + }, + { + "areaId": "330900", + "areaName": "舟山市", + "counties": [ + { + "areaId": "330902", + "areaName": "定海区" + }, + { + "areaId": "330903", + "areaName": "普陀区" + }, + { + "areaId": "330921", + "areaName": "岱山县" + }, + { + "areaId": "330922", + "areaName": "嵊泗县" + } + ] + }, + { + "areaId": "331000", + "areaName": "台州市", + "counties": [ + { + "areaId": "331002", + "areaName": "椒江区" + }, + { + "areaId": "331003", + "areaName": "黄岩区" + }, + { + "areaId": "331004", + "areaName": "路桥区" + }, + { + "areaId": "331021", + "areaName": "玉环县" + }, + { + "areaId": "331022", + "areaName": "三门县" + }, + { + "areaId": "331023", + "areaName": "天台县" + }, + { + "areaId": "331024", + "areaName": "仙居县" + }, + { + "areaId": "331081", + "areaName": "温岭市" + }, + { + "areaId": "331082", + "areaName": "临海市" + } + ] + }, + { + "areaId": "331100", + "areaName": "丽水市", + "counties": [ + { + "areaId": "331102", + "areaName": "莲都区" + }, + { + "areaId": "331121", + "areaName": "青田县" + }, + { + "areaId": "331122", + "areaName": "缙云县" + }, + { + "areaId": "331123", + "areaName": "遂昌县" + }, + { + "areaId": "331124", + "areaName": "松阳县" + }, + { + "areaId": "331125", + "areaName": "云和县" + }, + { + "areaId": "331126", + "areaName": "庆元县" + }, + { + "areaId": "331127", + "areaName": "景宁畲族自治县" + }, + { + "areaId": "331181", + "areaName": "龙泉市" + } + ] + } + ] + }, + { + "areaId": "340000", + "areaName": "安徽省", + "cities": [ + { + "areaId": "340100", + "areaName": "合肥市", + "counties": [ + { + "areaId": "340102", + "areaName": "瑶海区" + }, + { + "areaId": "340103", + "areaName": "庐阳区" + }, + { + "areaId": "340104", + "areaName": "蜀山区" + }, + { + "areaId": "340111", + "areaName": "包河区" + }, + { + "areaId": "340121", + "areaName": "长丰县" + }, + { + "areaId": "340122", + "areaName": "肥东县" + }, + { + "areaId": "340123", + "areaName": "肥西县" + }, + { + "areaId": "340124", + "areaName": "庐江县" + }, + { + "areaId": "340181", + "areaName": "巢湖市" + } + ] + }, + { + "areaId": "340200", + "areaName": "芜湖市", + "counties": [ + { + "areaId": "340202", + "areaName": "镜湖区" + }, + { + "areaId": "340203", + "areaName": "弋江区" + }, + { + "areaId": "340207", + "areaName": "鸠江区" + }, + { + "areaId": "340208", + "areaName": "三山区" + }, + { + "areaId": "340221", + "areaName": "芜湖县" + }, + { + "areaId": "340222", + "areaName": "繁昌县" + }, + { + "areaId": "340223", + "areaName": "南陵县" + }, + { + "areaId": "340225", + "areaName": "无为县" + } + ] + }, + { + "areaId": "340300", + "areaName": "蚌埠市", + "counties": [ + { + "areaId": "340302", + "areaName": "龙子湖区" + }, + { + "areaId": "340303", + "areaName": "蚌山区" + }, + { + "areaId": "340304", + "areaName": "禹会区" + }, + { + "areaId": "340311", + "areaName": "淮上区" + }, + { + "areaId": "340321", + "areaName": "怀远县" + }, + { + "areaId": "340322", + "areaName": "五河县" + }, + { + "areaId": "340323", + "areaName": "固镇县" + } + ] + }, + { + "areaId": "340400", + "areaName": "淮南市", + "counties": [ + { + "areaId": "340402", + "areaName": "大通区" + }, + { + "areaId": "340403", + "areaName": "田家庵区" + }, + { + "areaId": "340404", + "areaName": "谢家集区" + }, + { + "areaId": "340405", + "areaName": "八公山区" + }, + { + "areaId": "340406", + "areaName": "潘集区" + }, + { + "areaId": "340421", + "areaName": "凤台县" + } + ] + }, + { + "areaId": "340500", + "areaName": "马鞍山市", + "counties": [ + { + "areaId": "340503", + "areaName": "花山区" + }, + { + "areaId": "340504", + "areaName": "雨山区" + }, + { + "areaId": "340506", + "areaName": "博望区" + }, + { + "areaId": "340521", + "areaName": "当涂县" + }, + { + "areaId": "340522", + "areaName": "含山县" + }, + { + "areaId": "340523", + "areaName": "和县" + } + ] + }, + { + "areaId": "340600", + "areaName": "淮北市", + "counties": [ + { + "areaId": "340602", + "areaName": "杜集区" + }, + { + "areaId": "340603", + "areaName": "相山区" + }, + { + "areaId": "340604", + "areaName": "烈山区" + }, + { + "areaId": "340621", + "areaName": "濉溪县" + } + ] + }, + { + "areaId": "340700", + "areaName": "铜陵市", + "counties": [ + { + "areaId": "340702", + "areaName": "铜官山区" + }, + { + "areaId": "340703", + "areaName": "狮子山区" + }, + { + "areaId": "340711", + "areaName": "郊区" + }, + { + "areaId": "340721", + "areaName": "铜陵县" + } + ] + }, + { + "areaId": "340800", + "areaName": "安庆市", + "counties": [ + { + "areaId": "340802", + "areaName": "迎江区" + }, + { + "areaId": "340803", + "areaName": "大观区" + }, + { + "areaId": "340811", + "areaName": "宜秀区" + }, + { + "areaId": "340822", + "areaName": "怀宁县" + }, + { + "areaId": "340823", + "areaName": "枞阳县" + }, + { + "areaId": "340824", + "areaName": "潜山县" + }, + { + "areaId": "340825", + "areaName": "太湖县" + }, + { + "areaId": "340826", + "areaName": "宿松县" + }, + { + "areaId": "340827", + "areaName": "望江县" + }, + { + "areaId": "340828", + "areaName": "岳西县" + }, + { + "areaId": "340881", + "areaName": "桐城市" + } + ] + }, + { + "areaId": "341000", + "areaName": "黄山市", + "counties": [ + { + "areaId": "341002", + "areaName": "屯溪区" + }, + { + "areaId": "341003", + "areaName": "黄山区" + }, + { + "areaId": "341004", + "areaName": "徽州区" + }, + { + "areaId": "341021", + "areaName": "歙县" + }, + { + "areaId": "341022", + "areaName": "休宁县" + }, + { + "areaId": "341023", + "areaName": "黟县" + }, + { + "areaId": "341024", + "areaName": "祁门县" + } + ] + }, + { + "areaId": "341100", + "areaName": "滁州市", + "counties": [ + { + "areaId": "341102", + "areaName": "琅琊区" + }, + { + "areaId": "341103", + "areaName": "南谯区" + }, + { + "areaId": "341122", + "areaName": "来安县" + }, + { + "areaId": "341124", + "areaName": "全椒县" + }, + { + "areaId": "341125", + "areaName": "定远县" + }, + { + "areaId": "341126", + "areaName": "凤阳县" + }, + { + "areaId": "341181", + "areaName": "天长市" + }, + { + "areaId": "341182", + "areaName": "明光市" + } + ] + }, + { + "areaId": "341200", + "areaName": "阜阳市", + "counties": [ + { + "areaId": "341202", + "areaName": "颍州区" + }, + { + "areaId": "341203", + "areaName": "颍东区" + }, + { + "areaId": "341204", + "areaName": "颍泉区" + }, + { + "areaId": "341221", + "areaName": "临泉县" + }, + { + "areaId": "341222", + "areaName": "太和县" + }, + { + "areaId": "341225", + "areaName": "阜南县" + }, + { + "areaId": "341226", + "areaName": "颍上县" + }, + { + "areaId": "341282", + "areaName": "界首市" + } + ] + }, + { + "areaId": "341300", + "areaName": "宿州市", + "counties": [ + { + "areaId": "341302", + "areaName": "埇桥区" + }, + { + "areaId": "341321", + "areaName": "砀山县" + }, + { + "areaId": "341322", + "areaName": "萧县" + }, + { + "areaId": "341323", + "areaName": "灵璧县" + }, + { + "areaId": "341324", + "areaName": "泗县" + } + ] + }, + { + "areaId": "341500", + "areaName": "六安市", + "counties": [ + { + "areaId": "341502", + "areaName": "金安区" + }, + { + "areaId": "341503", + "areaName": "裕安区" + }, + { + "areaId": "341521", + "areaName": "寿县" + }, + { + "areaId": "341522", + "areaName": "霍邱县" + }, + { + "areaId": "341523", + "areaName": "舒城县" + }, + { + "areaId": "341524", + "areaName": "金寨县" + }, + { + "areaId": "341525", + "areaName": "霍山县" + } + ] + }, + { + "areaId": "341600", + "areaName": "亳州市", + "counties": [ + { + "areaId": "341602", + "areaName": "谯城区" + }, + { + "areaId": "341621", + "areaName": "涡阳县" + }, + { + "areaId": "341622", + "areaName": "蒙城县" + }, + { + "areaId": "341623", + "areaName": "利辛县" + } + ] + }, + { + "areaId": "341700", + "areaName": "池州市", + "counties": [ + { + "areaId": "341702", + "areaName": "贵池区" + }, + { + "areaId": "341721", + "areaName": "东至县" + }, + { + "areaId": "341722", + "areaName": "石台县" + }, + { + "areaId": "341723", + "areaName": "青阳县" + } + ] + }, + { + "areaId": "341800", + "areaName": "宣城市", + "counties": [ + { + "areaId": "341802", + "areaName": "宣州区" + }, + { + "areaId": "341821", + "areaName": "郎溪县" + }, + { + "areaId": "341822", + "areaName": "广德县" + }, + { + "areaId": "341823", + "areaName": "泾县" + }, + { + "areaId": "341824", + "areaName": "绩溪县" + }, + { + "areaId": "341825", + "areaName": "旌德县" + }, + { + "areaId": "341881", + "areaName": "宁国市" + } + ] + } + ] + }, + { + "areaId": "350000", + "areaName": "福建省", + "cities": [ + { + "areaId": "350100", + "areaName": "福州市", + "counties": [ + { + "areaId": "350102", + "areaName": "鼓楼区" + }, + { + "areaId": "350103", + "areaName": "台江区" + }, + { + "areaId": "350104", + "areaName": "仓山区" + }, + { + "areaId": "350105", + "areaName": "马尾区" + }, + { + "areaId": "350111", + "areaName": "晋安区" + }, + { + "areaId": "350121", + "areaName": "闽侯县" + }, + { + "areaId": "350122", + "areaName": "连江县" + }, + { + "areaId": "350123", + "areaName": "罗源县" + }, + { + "areaId": "350124", + "areaName": "闽清县" + }, + { + "areaId": "350125", + "areaName": "永泰县" + }, + { + "areaId": "350128", + "areaName": "平潭县" + }, + { + "areaId": "350181", + "areaName": "福清市" + }, + { + "areaId": "350182", + "areaName": "长乐市" + } + ] + }, + { + "areaId": "350200", + "areaName": "厦门市", + "counties": [ + { + "areaId": "350203", + "areaName": "思明区" + }, + { + "areaId": "350205", + "areaName": "海沧区" + }, + { + "areaId": "350206", + "areaName": "湖里区" + }, + { + "areaId": "350211", + "areaName": "集美区" + }, + { + "areaId": "350212", + "areaName": "同安区" + }, + { + "areaId": "350213", + "areaName": "翔安区" + } + ] + }, + { + "areaId": "350300", + "areaName": "莆田市", + "counties": [ + { + "areaId": "350302", + "areaName": "城厢区" + }, + { + "areaId": "350303", + "areaName": "涵江区" + }, + { + "areaId": "350304", + "areaName": "荔城区" + }, + { + "areaId": "350305", + "areaName": "秀屿区" + }, + { + "areaId": "350322", + "areaName": "仙游县" + } + ] + }, + { + "areaId": "350400", + "areaName": "三明市", + "counties": [ + { + "areaId": "350402", + "areaName": "梅列区" + }, + { + "areaId": "350403", + "areaName": "三元区" + }, + { + "areaId": "350421", + "areaName": "明溪县" + }, + { + "areaId": "350423", + "areaName": "清流县" + }, + { + "areaId": "350424", + "areaName": "宁化县" + }, + { + "areaId": "350425", + "areaName": "大田县" + }, + { + "areaId": "350426", + "areaName": "尤溪县" + }, + { + "areaId": "350427", + "areaName": "沙县" + }, + { + "areaId": "350428", + "areaName": "将乐县" + }, + { + "areaId": "350429", + "areaName": "泰宁县" + }, + { + "areaId": "350430", + "areaName": "建宁县" + }, + { + "areaId": "350481", + "areaName": "永安市" + } + ] + }, + { + "areaId": "350500", + "areaName": "泉州市", + "counties": [ + { + "areaId": "350502", + "areaName": "鲤城区" + }, + { + "areaId": "350503", + "areaName": "丰泽区" + }, + { + "areaId": "350504", + "areaName": "洛江区" + }, + { + "areaId": "350505", + "areaName": "泉港区" + }, + { + "areaId": "350521", + "areaName": "惠安县" + }, + { + "areaId": "350524", + "areaName": "安溪县" + }, + { + "areaId": "350525", + "areaName": "永春县" + }, + { + "areaId": "350526", + "areaName": "德化县" + }, + { + "areaId": "350527", + "areaName": "金门县" + }, + { + "areaId": "350581", + "areaName": "石狮市" + }, + { + "areaId": "350582", + "areaName": "晋江市" + }, + { + "areaId": "350583", + "areaName": "南安市" + } + ] + }, + { + "areaId": "350600", + "areaName": "漳州市", + "counties": [ + { + "areaId": "350602", + "areaName": "芗城区" + }, + { + "areaId": "350603", + "areaName": "龙文区" + }, + { + "areaId": "350622", + "areaName": "云霄县" + }, + { + "areaId": "350623", + "areaName": "漳浦县" + }, + { + "areaId": "350624", + "areaName": "诏安县" + }, + { + "areaId": "350625", + "areaName": "长泰县" + }, + { + "areaId": "350626", + "areaName": "东山县" + }, + { + "areaId": "350627", + "areaName": "南靖县" + }, + { + "areaId": "350628", + "areaName": "平和县" + }, + { + "areaId": "350629", + "areaName": "华安县" + }, + { + "areaId": "350681", + "areaName": "龙海市" + } + ] + }, + { + "areaId": "350700", + "areaName": "南平市", + "counties": [ + { + "areaId": "350702", + "areaName": "延平区" + }, + { + "areaId": "350721", + "areaName": "顺昌县" + }, + { + "areaId": "350722", + "areaName": "浦城县" + }, + { + "areaId": "350723", + "areaName": "光泽县" + }, + { + "areaId": "350724", + "areaName": "松溪县" + }, + { + "areaId": "350725", + "areaName": "政和县" + }, + { + "areaId": "350781", + "areaName": "邵武市" + }, + { + "areaId": "350782", + "areaName": "武夷山市" + }, + { + "areaId": "350783", + "areaName": "建瓯市" + }, + { + "areaId": "350784", + "areaName": "建阳市" + } + ] + }, + { + "areaId": "350800", + "areaName": "龙岩市", + "counties": [ + { + "areaId": "350802", + "areaName": "新罗区" + }, + { + "areaId": "350821", + "areaName": "长汀县" + }, + { + "areaId": "350822", + "areaName": "永定县" + }, + { + "areaId": "350823", + "areaName": "上杭县" + }, + { + "areaId": "350824", + "areaName": "武平县" + }, + { + "areaId": "350825", + "areaName": "连城县" + }, + { + "areaId": "350881", + "areaName": "漳平市" + } + ] + }, + { + "areaId": "350900", + "areaName": "宁德市", + "counties": [ + { + "areaId": "350902", + "areaName": "蕉城区" + }, + { + "areaId": "350921", + "areaName": "霞浦县" + }, + { + "areaId": "350922", + "areaName": "古田县" + }, + { + "areaId": "350923", + "areaName": "屏南县" + }, + { + "areaId": "350924", + "areaName": "寿宁县" + }, + { + "areaId": "350925", + "areaName": "周宁县" + }, + { + "areaId": "350926", + "areaName": "柘荣县" + }, + { + "areaId": "350981", + "areaName": "福安市" + }, + { + "areaId": "350982", + "areaName": "福鼎市" + } + ] + } + ] + }, + { + "areaId": "360000", + "areaName": "江西省", + "cities": [ + { + "areaId": "360100", + "areaName": "南昌市", + "counties": [ + { + "areaId": "360102", + "areaName": "东湖区" + }, + { + "areaId": "360103", + "areaName": "西湖区" + }, + { + "areaId": "360104", + "areaName": "青云谱区" + }, + { + "areaId": "360105", + "areaName": "湾里区" + }, + { + "areaId": "360111", + "areaName": "青山湖区" + }, + { + "areaId": "360121", + "areaName": "南昌县" + }, + { + "areaId": "360122", + "areaName": "新建县" + }, + { + "areaId": "360123", + "areaName": "安义县" + }, + { + "areaId": "360124", + "areaName": "进贤县" + } + ] + }, + { + "areaId": "360200", + "areaName": "景德镇市", + "counties": [ + { + "areaId": "360202", + "areaName": "昌江区" + }, + { + "areaId": "360203", + "areaName": "珠山区" + }, + { + "areaId": "360222", + "areaName": "浮梁县" + }, + { + "areaId": "360281", + "areaName": "乐平市" + } + ] + }, + { + "areaId": "360300", + "areaName": "萍乡市", + "counties": [ + { + "areaId": "360302", + "areaName": "安源区" + }, + { + "areaId": "360313", + "areaName": "湘东区" + }, + { + "areaId": "360321", + "areaName": "莲花县" + }, + { + "areaId": "360322", + "areaName": "上栗县" + }, + { + "areaId": "360323", + "areaName": "芦溪县" + } + ] + }, + { + "areaId": "360400", + "areaName": "九江市", + "counties": [ + { + "areaId": "360402", + "areaName": "庐山区" + }, + { + "areaId": "360403", + "areaName": "浔阳区" + }, + { + "areaId": "360421", + "areaName": "九江县" + }, + { + "areaId": "360423", + "areaName": "武宁县" + }, + { + "areaId": "360424", + "areaName": "修水县" + }, + { + "areaId": "360425", + "areaName": "永修县" + }, + { + "areaId": "360426", + "areaName": "德安县" + }, + { + "areaId": "360427", + "areaName": "星子县" + }, + { + "areaId": "360428", + "areaName": "都昌县" + }, + { + "areaId": "360429", + "areaName": "湖口县" + }, + { + "areaId": "360430", + "areaName": "彭泽县" + }, + { + "areaId": "360481", + "areaName": "瑞昌市" + }, + { + "areaId": "360482", + "areaName": "共青城市" + } + ] + }, + { + "areaId": "360500", + "areaName": "新余市", + "counties": [ + { + "areaId": "360502", + "areaName": "渝水区" + }, + { + "areaId": "360521", + "areaName": "分宜县" + } + ] + }, + { + "areaId": "360600", + "areaName": "鹰潭市", + "counties": [ + { + "areaId": "360602", + "areaName": "月湖区" + }, + { + "areaId": "360622", + "areaName": "余江县" + }, + { + "areaId": "360681", + "areaName": "贵溪市" + } + ] + }, + { + "areaId": "360700", + "areaName": "赣州市", + "counties": [ + { + "areaId": "360702", + "areaName": "章贡区" + }, + { + "areaId": "360721", + "areaName": "赣县" + }, + { + "areaId": "360722", + "areaName": "信丰县" + }, + { + "areaId": "360723", + "areaName": "大余县" + }, + { + "areaId": "360724", + "areaName": "上犹县" + }, + { + "areaId": "360725", + "areaName": "崇义县" + }, + { + "areaId": "360726", + "areaName": "安远县" + }, + { + "areaId": "360727", + "areaName": "龙南县" + }, + { + "areaId": "360728", + "areaName": "定南县" + }, + { + "areaId": "360729", + "areaName": "全南县" + }, + { + "areaId": "360730", + "areaName": "宁都县" + }, + { + "areaId": "360731", + "areaName": "于都县" + }, + { + "areaId": "360732", + "areaName": "兴国县" + }, + { + "areaId": "360733", + "areaName": "会昌县" + }, + { + "areaId": "360734", + "areaName": "寻乌县" + }, + { + "areaId": "360735", + "areaName": "石城县" + }, + { + "areaId": "360781", + "areaName": "瑞金市" + }, + { + "areaId": "360782", + "areaName": "南康市" + } + ] + }, + { + "areaId": "360800", + "areaName": "吉安市", + "counties": [ + { + "areaId": "360802", + "areaName": "吉州区" + }, + { + "areaId": "360803", + "areaName": "青原区" + }, + { + "areaId": "360821", + "areaName": "吉安县" + }, + { + "areaId": "360822", + "areaName": "吉水县" + }, + { + "areaId": "360823", + "areaName": "峡江县" + }, + { + "areaId": "360824", + "areaName": "新干县" + }, + { + "areaId": "360825", + "areaName": "永丰县" + }, + { + "areaId": "360826", + "areaName": "泰和县" + }, + { + "areaId": "360827", + "areaName": "遂川县" + }, + { + "areaId": "360828", + "areaName": "万安县" + }, + { + "areaId": "360829", + "areaName": "安福县" + }, + { + "areaId": "360830", + "areaName": "永新县" + }, + { + "areaId": "360881", + "areaName": "井冈山市" + } + ] + }, + { + "areaId": "360900", + "areaName": "宜春市", + "counties": [ + { + "areaId": "360902", + "areaName": "袁州区" + }, + { + "areaId": "360921", + "areaName": "奉新县" + }, + { + "areaId": "360922", + "areaName": "万载县" + }, + { + "areaId": "360923", + "areaName": "上高县" + }, + { + "areaId": "360924", + "areaName": "宜丰县" + }, + { + "areaId": "360925", + "areaName": "靖安县" + }, + { + "areaId": "360926", + "areaName": "铜鼓县" + }, + { + "areaId": "360981", + "areaName": "丰城市" + }, + { + "areaId": "360982", + "areaName": "樟树市" + }, + { + "areaId": "360983", + "areaName": "高安市" + } + ] + }, + { + "areaId": "361000", + "areaName": "抚州市", + "counties": [ + { + "areaId": "361002", + "areaName": "临川区" + }, + { + "areaId": "361021", + "areaName": "南城县" + }, + { + "areaId": "361022", + "areaName": "黎川县" + }, + { + "areaId": "361023", + "areaName": "南丰县" + }, + { + "areaId": "361024", + "areaName": "崇仁县" + }, + { + "areaId": "361025", + "areaName": "乐安县" + }, + { + "areaId": "361026", + "areaName": "宜黄县" + }, + { + "areaId": "361027", + "areaName": "金溪县" + }, + { + "areaId": "361028", + "areaName": "资溪县" + }, + { + "areaId": "361029", + "areaName": "东乡县" + }, + { + "areaId": "361030", + "areaName": "广昌县" + } + ] + }, + { + "areaId": "361100", + "areaName": "上饶市", + "counties": [ + { + "areaId": "361102", + "areaName": "信州区" + }, + { + "areaId": "361121", + "areaName": "上饶县" + }, + { + "areaId": "361122", + "areaName": "广丰县" + }, + { + "areaId": "361123", + "areaName": "玉山县" + }, + { + "areaId": "361124", + "areaName": "铅山县" + }, + { + "areaId": "361125", + "areaName": "横峰县" + }, + { + "areaId": "361126", + "areaName": "弋阳县" + }, + { + "areaId": "361127", + "areaName": "余干县" + }, + { + "areaId": "361128", + "areaName": "鄱阳县" + }, + { + "areaId": "361129", + "areaName": "万年县" + }, + { + "areaId": "361130", + "areaName": "婺源县" + }, + { + "areaId": "361181", + "areaName": "德兴市" + } + ] + } + ] + }, + { + "areaId": "370000", + "areaName": "山东省", + "cities": [ + { + "areaId": "370100", + "areaName": "济南市", + "counties": [ + { + "areaId": "370102", + "areaName": "历下区" + }, + { + "areaId": "370103", + "areaName": "市中区" + }, + { + "areaId": "370104", + "areaName": "槐荫区" + }, + { + "areaId": "370105", + "areaName": "天桥区" + }, + { + "areaId": "370112", + "areaName": "历城区" + }, + { + "areaId": "370113", + "areaName": "长清区" + }, + { + "areaId": "370124", + "areaName": "平阴县" + }, + { + "areaId": "370125", + "areaName": "济阳县" + }, + { + "areaId": "370126", + "areaName": "商河县" + }, + { + "areaId": "370181", + "areaName": "章丘市" + }, + { + "areaId": "370198", + "areaName": "高新区(历下区)" + }, + { + "areaId": "370199", + "areaName": "高新区(历城区)" + } + ] + }, + { + "areaId": "370200", + "areaName": "青岛市", + "counties": [ + { + "areaId": "370202", + "areaName": "市南区" + }, + { + "areaId": "370203", + "areaName": "市北区" + }, + { + "areaId": "370211", + "areaName": "黄岛区" + }, + { + "areaId": "370212", + "areaName": "崂山区" + }, + { + "areaId": "370213", + "areaName": "李沧区" + }, + { + "areaId": "370214", + "areaName": "城阳区" + }, + { + "areaId": "370281", + "areaName": "胶州市" + }, + { + "areaId": "370282", + "areaName": "即墨市" + }, + { + "areaId": "370283", + "areaName": "平度市" + }, + { + "areaId": "370285", + "areaName": "莱西市" + } + ] + }, + { + "areaId": "370300", + "areaName": "淄博市", + "counties": [ + { + "areaId": "370302", + "areaName": "淄川区" + }, + { + "areaId": "370303", + "areaName": "张店区" + }, + { + "areaId": "370304", + "areaName": "博山区" + }, + { + "areaId": "370305", + "areaName": "临淄区" + }, + { + "areaId": "370306", + "areaName": "周村区" + }, + { + "areaId": "370321", + "areaName": "桓台县" + }, + { + "areaId": "370322", + "areaName": "高青县" + }, + { + "areaId": "370323", + "areaName": "沂源县" + } + ] + }, + { + "areaId": "370400", + "areaName": "枣庄市", + "counties": [ + { + "areaId": "370402", + "areaName": "市中区" + }, + { + "areaId": "370403", + "areaName": "薛城区" + }, + { + "areaId": "370404", + "areaName": "峄城区" + }, + { + "areaId": "370405", + "areaName": "台儿庄区" + }, + { + "areaId": "370406", + "areaName": "山亭区" + }, + { + "areaId": "370481", + "areaName": "滕州市" + } + ] + }, + { + "areaId": "370500", + "areaName": "东营市", + "counties": [ + { + "areaId": "370502", + "areaName": "东营区" + }, + { + "areaId": "370503", + "areaName": "河口区" + }, + { + "areaId": "370521", + "areaName": "垦利县" + }, + { + "areaId": "370522", + "areaName": "利津县" + }, + { + "areaId": "370523", + "areaName": "广饶县" + } + ] + }, + { + "areaId": "370600", + "areaName": "烟台市", + "counties": [ + { + "areaId": "370602", + "areaName": "芝罘区" + }, + { + "areaId": "370611", + "areaName": "福山区" + }, + { + "areaId": "370612", + "areaName": "牟平区" + }, + { + "areaId": "370613", + "areaName": "莱山区" + }, + { + "areaId": "370634", + "areaName": "长岛县" + }, + { + "areaId": "370681", + "areaName": "龙口市" + }, + { + "areaId": "370682", + "areaName": "莱阳市" + }, + { + "areaId": "370683", + "areaName": "莱州市" + }, + { + "areaId": "370684", + "areaName": "蓬莱市" + }, + { + "areaId": "370685", + "areaName": "招远市" + }, + { + "areaId": "370686", + "areaName": "栖霞市" + }, + { + "areaId": "370687", + "areaName": "海阳市" + } + ] + }, + { + "areaId": "370700", + "areaName": "潍坊市", + "counties": [ + { + "areaId": "370702", + "areaName": "潍城区" + }, + { + "areaId": "370703", + "areaName": "寒亭区" + }, + { + "areaId": "370704", + "areaName": "坊子区" + }, + { + "areaId": "370705", + "areaName": "奎文区" + }, + { + "areaId": "370724", + "areaName": "临朐县" + }, + { + "areaId": "370725", + "areaName": "昌乐县" + }, + { + "areaId": "370781", + "areaName": "青州市" + }, + { + "areaId": "370782", + "areaName": "诸城市" + }, + { + "areaId": "370783", + "areaName": "寿光市" + }, + { + "areaId": "370784", + "areaName": "安丘市" + }, + { + "areaId": "370785", + "areaName": "高密市" + }, + { + "areaId": "370786", + "areaName": "昌邑市" + } + ] + }, + { + "areaId": "370800", + "areaName": "济宁市", + "counties": [ + { + "areaId": "370802", + "areaName": "市中区" + }, + { + "areaId": "370811", + "areaName": "任城区" + }, + { + "areaId": "370826", + "areaName": "微山县" + }, + { + "areaId": "370827", + "areaName": "鱼台县" + }, + { + "areaId": "370828", + "areaName": "金乡县" + }, + { + "areaId": "370829", + "areaName": "嘉祥县" + }, + { + "areaId": "370830", + "areaName": "汶上县" + }, + { + "areaId": "370831", + "areaName": "泗水县" + }, + { + "areaId": "370832", + "areaName": "梁山县" + }, + { + "areaId": "370881", + "areaName": "曲阜市" + }, + { + "areaId": "370882", + "areaName": "兖州市" + }, + { + "areaId": "370883", + "areaName": "邹城市" + } + ] + }, + { + "areaId": "370900", + "areaName": "泰安市", + "counties": [ + { + "areaId": "370902", + "areaName": "泰山区" + }, + { + "areaId": "370911", + "areaName": "岱岳区" + }, + { + "areaId": "370921", + "areaName": "宁阳县" + }, + { + "areaId": "370923", + "areaName": "东平县" + }, + { + "areaId": "370982", + "areaName": "新泰市" + }, + { + "areaId": "370983", + "areaName": "肥城市" + } + ] + }, + { + "areaId": "371000", + "areaName": "威海市", + "counties": [ + { + "areaId": "371002", + "areaName": "环翠区" + }, + { + "areaId": "371081", + "areaName": "文登市" + }, + { + "areaId": "371082", + "areaName": "荣成市" + }, + { + "areaId": "371083", + "areaName": "乳山市" + } + ] + }, + { + "areaId": "371100", + "areaName": "日照市", + "counties": [ + { + "areaId": "371102", + "areaName": "东港区" + }, + { + "areaId": "371103", + "areaName": "岚山区" + }, + { + "areaId": "371121", + "areaName": "五莲县" + }, + { + "areaId": "371122", + "areaName": "莒县" + } + ] + }, + { + "areaId": "371200", + "areaName": "莱芜市", + "counties": [ + { + "areaId": "371202", + "areaName": "莱城区" + }, + { + "areaId": "371203", + "areaName": "钢城区" + } + ] + }, + { + "areaId": "371300", + "areaName": "临沂市", + "counties": [ + { + "areaId": "371302", + "areaName": "兰山区" + }, + { + "areaId": "371311", + "areaName": "罗庄区" + }, + { + "areaId": "371312", + "areaName": "河东区" + }, + { + "areaId": "371321", + "areaName": "沂南县" + }, + { + "areaId": "371322", + "areaName": "郯城县" + }, + { + "areaId": "371323", + "areaName": "沂水县" + }, + { + "areaId": "371324", + "areaName": "苍山县" + }, + { + "areaId": "371325", + "areaName": "费县" + }, + { + "areaId": "371326", + "areaName": "平邑县" + }, + { + "areaId": "371327", + "areaName": "莒南县" + }, + { + "areaId": "371328", + "areaName": "蒙阴县" + }, + { + "areaId": "371329", + "areaName": "临沭县" + } + ] + }, + { + "areaId": "371400", + "areaName": "德州市", + "counties": [ + { + "areaId": "371402", + "areaName": "德城区" + }, + { + "areaId": "371421", + "areaName": "陵县" + }, + { + "areaId": "371422", + "areaName": "宁津县" + }, + { + "areaId": "371423", + "areaName": "庆云县" + }, + { + "areaId": "371424", + "areaName": "临邑县" + }, + { + "areaId": "371425", + "areaName": "齐河县" + }, + { + "areaId": "371426", + "areaName": "平原县" + }, + { + "areaId": "371427", + "areaName": "夏津县" + }, + { + "areaId": "371428", + "areaName": "武城县" + }, + { + "areaId": "371481", + "areaName": "乐陵市" + }, + { + "areaId": "371482", + "areaName": "禹城市" + } + ] + }, + { + "areaId": "371500", + "areaName": "聊城市", + "counties": [ + { + "areaId": "371502", + "areaName": "东昌府区" + }, + { + "areaId": "371521", + "areaName": "阳谷县" + }, + { + "areaId": "371522", + "areaName": "莘县" + }, + { + "areaId": "371523", + "areaName": "茌平县" + }, + { + "areaId": "371524", + "areaName": "东阿县" + }, + { + "areaId": "371525", + "areaName": "冠县" + }, + { + "areaId": "371526", + "areaName": "高唐县" + }, + { + "areaId": "371581", + "areaName": "临清市" + } + ] + }, + { + "areaId": "371600", + "areaName": "滨州市", + "counties": [ + { + "areaId": "371602", + "areaName": "滨城区" + }, + { + "areaId": "371621", + "areaName": "惠民县" + }, + { + "areaId": "371622", + "areaName": "阳信县" + }, + { + "areaId": "371623", + "areaName": "无棣县" + }, + { + "areaId": "371624", + "areaName": "沾化县" + }, + { + "areaId": "371625", + "areaName": "博兴县" + }, + { + "areaId": "371626", + "areaName": "邹平县" + } + ] + }, + { + "areaId": "371700", + "areaName": "菏泽市", + "counties": [ + { + "areaId": "371702", + "areaName": "牡丹区" + }, + { + "areaId": "371721", + "areaName": "曹县" + }, + { + "areaId": "371722", + "areaName": "单县" + }, + { + "areaId": "371723", + "areaName": "成武县" + }, + { + "areaId": "371724", + "areaName": "巨野县" + }, + { + "areaId": "371725", + "areaName": "郓城县" + }, + { + "areaId": "371726", + "areaName": "鄄城县" + }, + { + "areaId": "371727", + "areaName": "定陶县" + }, + { + "areaId": "371728", + "areaName": "东明县" + } + ] + } + ] + }, + { + "areaId": "410000", + "areaName": "河南省", + "cities": [ + { + "areaId": "410100", + "areaName": "郑州市", + "counties": [ + { + "areaId": "410102", + "areaName": "中原区" + }, + { + "areaId": "410103", + "areaName": "二七区" + }, + { + "areaId": "410104", + "areaName": "管城回族区" + }, + { + "areaId": "410105", + "areaName": "金水区" + }, + { + "areaId": "410106", + "areaName": "上街区" + }, + { + "areaId": "410108", + "areaName": "惠济区" + }, + { + "areaId": "410122", + "areaName": "中牟县" + }, + { + "areaId": "410181", + "areaName": "巩义市" + }, + { + "areaId": "410182", + "areaName": "荥阳市" + }, + { + "areaId": "410183", + "areaName": "新密市" + }, + { + "areaId": "410184", + "areaName": "新郑市" + }, + { + "areaId": "410185", + "areaName": "登封市" + } + ] + }, + { + "areaId": "410200", + "areaName": "开封市", + "counties": [ + { + "areaId": "410202", + "areaName": "龙亭区" + }, + { + "areaId": "410203", + "areaName": "顺河回族区" + }, + { + "areaId": "410204", + "areaName": "鼓楼区" + }, + { + "areaId": "410205", + "areaName": "禹王台区" + }, + { + "areaId": "410211", + "areaName": "金明区" + }, + { + "areaId": "410221", + "areaName": "杞县" + }, + { + "areaId": "410222", + "areaName": "通许县" + }, + { + "areaId": "410223", + "areaName": "尉氏县" + }, + { + "areaId": "410224", + "areaName": "开封县" + }, + { + "areaId": "410225", + "areaName": "兰考县" + } + ] + }, + { + "areaId": "410300", + "areaName": "洛阳市", + "counties": [ + { + "areaId": "410302", + "areaName": "老城区" + }, + { + "areaId": "410303", + "areaName": "西工区" + }, + { + "areaId": "410304", + "areaName": "瀍河回族区" + }, + { + "areaId": "410305", + "areaName": "涧西区" + }, + { + "areaId": "410306", + "areaName": "吉利区" + }, + { + "areaId": "410311", + "areaName": "洛龙区" + }, + { + "areaId": "410322", + "areaName": "孟津县" + }, + { + "areaId": "410323", + "areaName": "新安县" + }, + { + "areaId": "410324", + "areaName": "栾川县" + }, + { + "areaId": "410325", + "areaName": "嵩县" + }, + { + "areaId": "410326", + "areaName": "汝阳县" + }, + { + "areaId": "410327", + "areaName": "宜阳县" + }, + { + "areaId": "410328", + "areaName": "洛宁县" + }, + { + "areaId": "410329", + "areaName": "伊川县" + }, + { + "areaId": "410381", + "areaName": "偃师市" + } + ] + }, + { + "areaId": "410400", + "areaName": "平顶山市", + "counties": [ + { + "areaId": "410402", + "areaName": "新华区" + }, + { + "areaId": "410403", + "areaName": "卫东区" + }, + { + "areaId": "410404", + "areaName": "石龙区" + }, + { + "areaId": "410411", + "areaName": "湛河区" + }, + { + "areaId": "410421", + "areaName": "宝丰县" + }, + { + "areaId": "410422", + "areaName": "叶县" + }, + { + "areaId": "410423", + "areaName": "鲁山县" + }, + { + "areaId": "410425", + "areaName": "郏县" + }, + { + "areaId": "410481", + "areaName": "舞钢市" + }, + { + "areaId": "410482", + "areaName": "汝州市" + } + ] + }, + { + "areaId": "410500", + "areaName": "安阳市", + "counties": [ + { + "areaId": "410502", + "areaName": "文峰区" + }, + { + "areaId": "410503", + "areaName": "北关区" + }, + { + "areaId": "410505", + "areaName": "殷都区" + }, + { + "areaId": "410506", + "areaName": "龙安区" + }, + { + "areaId": "410522", + "areaName": "安阳县" + }, + { + "areaId": "410523", + "areaName": "汤阴县" + }, + { + "areaId": "410526", + "areaName": "滑县" + }, + { + "areaId": "410527", + "areaName": "内黄县" + }, + { + "areaId": "410581", + "areaName": "林州市" + } + ] + }, + { + "areaId": "410600", + "areaName": "鹤壁市", + "counties": [ + { + "areaId": "410602", + "areaName": "鹤山区" + }, + { + "areaId": "410603", + "areaName": "山城区" + }, + { + "areaId": "410611", + "areaName": "淇滨区" + }, + { + "areaId": "410621", + "areaName": "浚县" + }, + { + "areaId": "410622", + "areaName": "淇县" + } + ] + }, + { + "areaId": "410700", + "areaName": "新乡市", + "counties": [ + { + "areaId": "410702", + "areaName": "红旗区" + }, + { + "areaId": "410703", + "areaName": "卫滨区" + }, + { + "areaId": "410704", + "areaName": "凤泉区" + }, + { + "areaId": "410711", + "areaName": "牧野区" + }, + { + "areaId": "410721", + "areaName": "新乡县" + }, + { + "areaId": "410724", + "areaName": "获嘉县" + }, + { + "areaId": "410725", + "areaName": "原阳县" + }, + { + "areaId": "410726", + "areaName": "延津县" + }, + { + "areaId": "410727", + "areaName": "封丘县" + }, + { + "areaId": "410728", + "areaName": "长垣县" + }, + { + "areaId": "410781", + "areaName": "卫辉市" + }, + { + "areaId": "410782", + "areaName": "辉县市" + } + ] + }, + { + "areaId": "410800", + "areaName": "焦作市", + "counties": [ + { + "areaId": "410802", + "areaName": "解放区" + }, + { + "areaId": "410803", + "areaName": "中站区" + }, + { + "areaId": "410804", + "areaName": "马村区" + }, + { + "areaId": "410811", + "areaName": "山阳区" + }, + { + "areaId": "410821", + "areaName": "修武县" + }, + { + "areaId": "410822", + "areaName": "博爱县" + }, + { + "areaId": "410823", + "areaName": "武陟县" + }, + { + "areaId": "410825", + "areaName": "温县" + }, + { + "areaId": "410882", + "areaName": "沁阳市" + }, + { + "areaId": "410883", + "areaName": "孟州市" + } + ] + }, + { + "areaId": "410900", + "areaName": "濮阳市", + "counties": [ + { + "areaId": "410902", + "areaName": "华龙区" + }, + { + "areaId": "410922", + "areaName": "清丰县" + }, + { + "areaId": "410923", + "areaName": "南乐县" + }, + { + "areaId": "410926", + "areaName": "范县" + }, + { + "areaId": "410927", + "areaName": "台前县" + }, + { + "areaId": "410928", + "areaName": "濮阳县" + } + ] + }, + { + "areaId": "411000", + "areaName": "许昌市", + "counties": [ + { + "areaId": "411002", + "areaName": "魏都区" + }, + { + "areaId": "411023", + "areaName": "许昌县" + }, + { + "areaId": "411024", + "areaName": "鄢陵县" + }, + { + "areaId": "411025", + "areaName": "襄城县" + }, + { + "areaId": "411081", + "areaName": "禹州市" + }, + { + "areaId": "411082", + "areaName": "长葛市" + } + ] + }, + { + "areaId": "411100", + "areaName": "漯河市", + "counties": [ + { + "areaId": "411102", + "areaName": "源汇区" + }, + { + "areaId": "411103", + "areaName": "郾城区" + }, + { + "areaId": "411104", + "areaName": "召陵区" + }, + { + "areaId": "411121", + "areaName": "舞阳县" + }, + { + "areaId": "411122", + "areaName": "临颍县" + } + ] + }, + { + "areaId": "411200", + "areaName": "三门峡市", + "counties": [ + { + "areaId": "411202", + "areaName": "湖滨区" + }, + { + "areaId": "411221", + "areaName": "渑池县" + }, + { + "areaId": "411222", + "areaName": "陕县" + }, + { + "areaId": "411224", + "areaName": "卢氏县" + }, + { + "areaId": "411281", + "areaName": "义马市" + }, + { + "areaId": "411282", + "areaName": "灵宝市" + } + ] + }, + { + "areaId": "411300", + "areaName": "南阳市", + "counties": [ + { + "areaId": "411302", + "areaName": "宛城区" + }, + { + "areaId": "411303", + "areaName": "卧龙区" + }, + { + "areaId": "411321", + "areaName": "南召县" + }, + { + "areaId": "411322", + "areaName": "方城县" + }, + { + "areaId": "411323", + "areaName": "西峡县" + }, + { + "areaId": "411324", + "areaName": "镇平县" + }, + { + "areaId": "411325", + "areaName": "内乡县" + }, + { + "areaId": "411326", + "areaName": "淅川县" + }, + { + "areaId": "411327", + "areaName": "社旗县" + }, + { + "areaId": "411328", + "areaName": "唐河县" + }, + { + "areaId": "411329", + "areaName": "新野县" + }, + { + "areaId": "411330", + "areaName": "桐柏县" + }, + { + "areaId": "411381", + "areaName": "邓州市" + } + ] + }, + { + "areaId": "411400", + "areaName": "商丘市", + "counties": [ + { + "areaId": "411402", + "areaName": "梁园区" + }, + { + "areaId": "411403", + "areaName": "睢阳区" + }, + { + "areaId": "411421", + "areaName": "民权县" + }, + { + "areaId": "411422", + "areaName": "睢县" + }, + { + "areaId": "411423", + "areaName": "宁陵县" + }, + { + "areaId": "411424", + "areaName": "柘城县" + }, + { + "areaId": "411425", + "areaName": "虞城县" + }, + { + "areaId": "411426", + "areaName": "夏邑县" + }, + { + "areaId": "411481", + "areaName": "永城市" + } + ] + }, + { + "areaId": "411500", + "areaName": "信阳市", + "counties": [ + { + "areaId": "411502", + "areaName": "负忧" + }, + { + "areaId": "411503", + "areaName": "平桥区" + }, + { + "areaId": "411521", + "areaName": "罗山县" + }, + { + "areaId": "411522", + "areaName": "光山县" + }, + { + "areaId": "411523", + "areaName": "新县" + }, + { + "areaId": "411524", + "areaName": "商城县" + }, + { + "areaId": "411525", + "areaName": "固始县" + }, + { + "areaId": "411526", + "areaName": "潢川县" + }, + { + "areaId": "411527", + "areaName": "淮滨县" + }, + { + "areaId": "411528", + "areaName": "息县" + } + ] + }, + { + "areaId": "411600", + "areaName": "周口市", + "counties": [ + { + "areaId": "411602", + "areaName": "川汇区" + }, + { + "areaId": "411621", + "areaName": "扶沟县" + }, + { + "areaId": "411622", + "areaName": "西华县" + }, + { + "areaId": "411623", + "areaName": "商水县" + }, + { + "areaId": "411624", + "areaName": "沈丘县" + }, + { + "areaId": "411625", + "areaName": "郸城县" + }, + { + "areaId": "411626", + "areaName": "淮阳县" + }, + { + "areaId": "411627", + "areaName": "太康县" + }, + { + "areaId": "411628", + "areaName": "鹿邑县" + }, + { + "areaId": "411681", + "areaName": "项城市" + } + ] + }, + { + "areaId": "411700", + "areaName": "驻马店市", + "counties": [ + { + "areaId": "411702", + "areaName": "驿城区" + }, + { + "areaId": "411721", + "areaName": "西平县" + }, + { + "areaId": "411722", + "areaName": "上蔡县" + }, + { + "areaId": "411723", + "areaName": "平舆县" + }, + { + "areaId": "411724", + "areaName": "正阳县" + }, + { + "areaId": "411725", + "areaName": "确山县" + }, + { + "areaId": "411726", + "areaName": "泌阳县" + }, + { + "areaId": "411727", + "areaName": "汝南县" + }, + { + "areaId": "411728", + "areaName": "遂平县" + }, + { + "areaId": "411729", + "areaName": "新蔡县" + } + ] + }, + { + "areaId": "419000", + "areaName": "省直辖县级行政区划", + "counties": [ + { + "areaId": "419001", + "areaName": "济源市" + } + ] + } + ] + }, + { + "areaId": "420000", + "areaName": "湖北省", + "cities": [ + { + "areaId": "420100", + "areaName": "武汉市", + "counties": [ + { + "areaId": "420102", + "areaName": "江岸区" + }, + { + "areaId": "420103", + "areaName": "江汉区" + }, + { + "areaId": "420104", + "areaName": "硚口区" + }, + { + "areaId": "420105", + "areaName": "汉阳区" + }, + { + "areaId": "420106", + "areaName": "武昌区" + }, + { + "areaId": "420107", + "areaName": "青山区" + }, + { + "areaId": "420111", + "areaName": "洪山区" + }, + { + "areaId": "420112", + "areaName": "东西湖区" + }, + { + "areaId": "420113", + "areaName": "汉南区" + }, + { + "areaId": "420114", + "areaName": "蔡甸区" + }, + { + "areaId": "420115", + "areaName": "江夏区" + }, + { + "areaId": "420116", + "areaName": "黄陂区" + }, + { + "areaId": "420117", + "areaName": "新洲区" + }, + { + "areaId": "420196", + "areaName": "经济技术开发区(蔡甸区)" + }, + { + "areaId": "420197", + "areaName": "经济技术开发区(汉阳区)" + }, + { + "areaId": "420198", + "areaName": "东湖高新区(洪山区)" + }, + { + "areaId": "420199", + "areaName": "东湖高新区(江夏区)" + } + ] + }, + { + "areaId": "420200", + "areaName": "黄石市", + "counties": [ + { + "areaId": "420202", + "areaName": "黄石港区" + }, + { + "areaId": "420203", + "areaName": "西塞山区" + }, + { + "areaId": "420204", + "areaName": "下陆区" + }, + { + "areaId": "420205", + "areaName": "铁山区" + }, + { + "areaId": "420222", + "areaName": "阳新县" + }, + { + "areaId": "420281", + "areaName": "大冶市" + } + ] + }, + { + "areaId": "420300", + "areaName": "十堰市", + "counties": [ + { + "areaId": "420302", + "areaName": "茅箭区" + }, + { + "areaId": "420303", + "areaName": "张湾区" + }, + { + "areaId": "420321", + "areaName": "郧县" + }, + { + "areaId": "420322", + "areaName": "郧西县" + }, + { + "areaId": "420323", + "areaName": "竹山县" + }, + { + "areaId": "420324", + "areaName": "竹溪县" + }, + { + "areaId": "420325", + "areaName": "房县" + }, + { + "areaId": "420381", + "areaName": "丹江口市" + } + ] + }, + { + "areaId": "420500", + "areaName": "宜昌市", + "counties": [ + { + "areaId": "420502", + "areaName": "西陵区" + }, + { + "areaId": "420503", + "areaName": "伍家岗区" + }, + { + "areaId": "420504", + "areaName": "点军区" + }, + { + "areaId": "420505", + "areaName": "猇亭区" + }, + { + "areaId": "420506", + "areaName": "夷陵区" + }, + { + "areaId": "420525", + "areaName": "远安县" + }, + { + "areaId": "420526", + "areaName": "兴山县" + }, + { + "areaId": "420527", + "areaName": "秭归县" + }, + { + "areaId": "420528", + "areaName": "长阳土家族自治县" + }, + { + "areaId": "420529", + "areaName": "五峰土家族自治县" + }, + { + "areaId": "420581", + "areaName": "宜都市" + }, + { + "areaId": "420582", + "areaName": "当阳市" + }, + { + "areaId": "420583", + "areaName": "枝江市" + } + ] + }, + { + "areaId": "420600", + "areaName": "襄阳市", + "counties": [ + { + "areaId": "420602", + "areaName": "襄城区" + }, + { + "areaId": "420606", + "areaName": "樊城区" + }, + { + "areaId": "420607", + "areaName": "襄州区" + }, + { + "areaId": "420624", + "areaName": "南漳县" + }, + { + "areaId": "420625", + "areaName": "谷城县" + }, + { + "areaId": "420626", + "areaName": "保康县" + }, + { + "areaId": "420682", + "areaName": "老河口市" + }, + { + "areaId": "420683", + "areaName": "枣阳市" + }, + { + "areaId": "420684", + "areaName": "宜城市" + } + ] + }, + { + "areaId": "420700", + "areaName": "鄂州市", + "counties": [ + { + "areaId": "420702", + "areaName": "梁子湖区" + }, + { + "areaId": "420703", + "areaName": "华容区" + }, + { + "areaId": "420704", + "areaName": "鄂城区" + } + ] + }, + { + "areaId": "420800", + "areaName": "荆门市", + "counties": [ + { + "areaId": "420802", + "areaName": "东宝区" + }, + { + "areaId": "420804", + "areaName": "掇刀区" + }, + { + "areaId": "420821", + "areaName": "京山县" + }, + { + "areaId": "420822", + "areaName": "沙洋县" + }, + { + "areaId": "420881", + "areaName": "钟祥市" + } + ] + }, + { + "areaId": "420900", + "areaName": "孝感市", + "counties": [ + { + "areaId": "420902", + "areaName": "孝南区" + }, + { + "areaId": "420921", + "areaName": "孝昌县" + }, + { + "areaId": "420922", + "areaName": "大悟县" + }, + { + "areaId": "420923", + "areaName": "云梦县" + }, + { + "areaId": "420981", + "areaName": "应城市" + }, + { + "areaId": "420982", + "areaName": "安陆市" + }, + { + "areaId": "420984", + "areaName": "汉川市" + } + ] + }, + { + "areaId": "421000", + "areaName": "荆州市", + "counties": [ + { + "areaId": "421002", + "areaName": "沙市区" + }, + { + "areaId": "421003", + "areaName": "荆州区" + }, + { + "areaId": "421022", + "areaName": "公安县" + }, + { + "areaId": "421023", + "areaName": "监利县" + }, + { + "areaId": "421024", + "areaName": "江陵县" + }, + { + "areaId": "421081", + "areaName": "石首市" + }, + { + "areaId": "421083", + "areaName": "洪湖市" + }, + { + "areaId": "421087", + "areaName": "松滋市" + } + ] + }, + { + "areaId": "421100", + "areaName": "黄冈市", + "counties": [ + { + "areaId": "421102", + "areaName": "黄州区" + }, + { + "areaId": "421121", + "areaName": "团风县" + }, + { + "areaId": "421122", + "areaName": "红安县" + }, + { + "areaId": "421123", + "areaName": "罗田县" + }, + { + "areaId": "421124", + "areaName": "英山县" + }, + { + "areaId": "421125", + "areaName": "浠水县" + }, + { + "areaId": "421126", + "areaName": "蕲春县" + }, + { + "areaId": "421127", + "areaName": "黄梅县" + }, + { + "areaId": "421181", + "areaName": "麻城市" + }, + { + "areaId": "421182", + "areaName": "武穴市" + } + ] + }, + { + "areaId": "421200", + "areaName": "咸宁市", + "counties": [ + { + "areaId": "421202", + "areaName": "咸安区" + }, + { + "areaId": "421221", + "areaName": "嘉鱼县" + }, + { + "areaId": "421222", + "areaName": "通城县" + }, + { + "areaId": "421223", + "areaName": "崇阳县" + }, + { + "areaId": "421224", + "areaName": "通山县" + }, + { + "areaId": "421281", + "areaName": "赤壁市" + } + ] + }, + { + "areaId": "421300", + "areaName": "随州市", + "counties": [ + { + "areaId": "421303", + "areaName": "曾都区" + }, + { + "areaId": "421321", + "areaName": "随县" + }, + { + "areaId": "421381", + "areaName": "广水市" + } + ] + }, + { + "areaId": "422800", + "areaName": "恩施土家族苗族自治州", + "counties": [ + { + "areaId": "422801", + "areaName": "恩施市" + }, + { + "areaId": "422802", + "areaName": "利川市" + }, + { + "areaId": "422822", + "areaName": "建始县" + }, + { + "areaId": "422823", + "areaName": "巴东县" + }, + { + "areaId": "422825", + "areaName": "宣恩县" + }, + { + "areaId": "422826", + "areaName": "咸丰县" + }, + { + "areaId": "422827", + "areaName": "来凤县" + }, + { + "areaId": "422828", + "areaName": "鹤峰县" + } + ] + }, + { + "areaId": "429000", + "areaName": "省直辖县级行政区划", + "counties": [ + { + "areaId": "429004", + "areaName": "仙桃市" + }, + { + "areaId": "429005", + "areaName": "潜江市" + }, + { + "areaId": "429006", + "areaName": "天门市" + }, + { + "areaId": "429021", + "areaName": "神农架林区" + } + ] + } + ] + }, + { + "areaId": "430000", + "areaName": "湖南省", + "cities": [ + { + "areaId": "430100", + "areaName": "长沙市", + "counties": [ + { + "areaId": "430102", + "areaName": "芙蓉区" + }, + { + "areaId": "430103", + "areaName": "天心区" + }, + { + "areaId": "430104", + "areaName": "岳麓区" + }, + { + "areaId": "430105", + "areaName": "开福区" + }, + { + "areaId": "430111", + "areaName": "雨花区" + }, + { + "areaId": "430112", + "areaName": "望城区" + }, + { + "areaId": "430121", + "areaName": "长沙县" + }, + { + "areaId": "430124", + "areaName": "宁乡县" + }, + { + "areaId": "430181", + "areaName": "浏阳市" + } + ] + }, + { + "areaId": "430200", + "areaName": "株洲市", + "counties": [ + { + "areaId": "430202", + "areaName": "荷塘区" + }, + { + "areaId": "430203", + "areaName": "芦淞区" + }, + { + "areaId": "430204", + "areaName": "石峰区" + }, + { + "areaId": "430211", + "areaName": "天元区" + }, + { + "areaId": "430221", + "areaName": "株洲县" + }, + { + "areaId": "430223", + "areaName": "攸县" + }, + { + "areaId": "430224", + "areaName": "茶陵县" + }, + { + "areaId": "430225", + "areaName": "炎陵县" + }, + { + "areaId": "430281", + "areaName": "醴陵市" + } + ] + }, + { + "areaId": "430300", + "areaName": "湘潭市", + "counties": [ + { + "areaId": "430302", + "areaName": "雨湖区" + }, + { + "areaId": "430304", + "areaName": "岳塘区" + }, + { + "areaId": "430321", + "areaName": "湘潭县" + }, + { + "areaId": "430381", + "areaName": "湘乡市" + }, + { + "areaId": "430382", + "areaName": "韶山市" + } + ] + }, + { + "areaId": "430400", + "areaName": "衡阳市", + "counties": [ + { + "areaId": "430405", + "areaName": "珠晖区" + }, + { + "areaId": "430406", + "areaName": "雁峰区" + }, + { + "areaId": "430407", + "areaName": "石鼓区" + }, + { + "areaId": "430408", + "areaName": "蒸湘区" + }, + { + "areaId": "430412", + "areaName": "南岳区" + }, + { + "areaId": "430421", + "areaName": "衡阳县" + }, + { + "areaId": "430422", + "areaName": "衡南县" + }, + { + "areaId": "430423", + "areaName": "衡山县" + }, + { + "areaId": "430424", + "areaName": "衡东县" + }, + { + "areaId": "430426", + "areaName": "祁东县" + }, + { + "areaId": "430481", + "areaName": "耒阳市" + }, + { + "areaId": "430482", + "areaName": "常宁市" + } + ] + }, + { + "areaId": "430500", + "areaName": "邵阳市", + "counties": [ + { + "areaId": "430502", + "areaName": "双清区" + }, + { + "areaId": "430503", + "areaName": "大祥区" + }, + { + "areaId": "430511", + "areaName": "北塔区" + }, + { + "areaId": "430521", + "areaName": "邵东县" + }, + { + "areaId": "430522", + "areaName": "新邵县" + }, + { + "areaId": "430523", + "areaName": "邵阳县" + }, + { + "areaId": "430524", + "areaName": "隆回县" + }, + { + "areaId": "430525", + "areaName": "洞口县" + }, + { + "areaId": "430527", + "areaName": "绥宁县" + }, + { + "areaId": "430528", + "areaName": "新宁县" + }, + { + "areaId": "430529", + "areaName": "城步苗族自治县" + }, + { + "areaId": "430581", + "areaName": "武冈市" + } + ] + }, + { + "areaId": "430600", + "areaName": "岳阳市", + "counties": [ + { + "areaId": "430602", + "areaName": "岳阳楼区" + }, + { + "areaId": "430603", + "areaName": "云溪区" + }, + { + "areaId": "430611", + "areaName": "君山区" + }, + { + "areaId": "430621", + "areaName": "岳阳县" + }, + { + "areaId": "430623", + "areaName": "华容县" + }, + { + "areaId": "430624", + "areaName": "湘阴县" + }, + { + "areaId": "430626", + "areaName": "平江县" + }, + { + "areaId": "430681", + "areaName": "汨罗市" + }, + { + "areaId": "430682", + "areaName": "临湘市" + } + ] + }, + { + "areaId": "430700", + "areaName": "常德市", + "counties": [ + { + "areaId": "430702", + "areaName": "武陵区" + }, + { + "areaId": "430703", + "areaName": "鼎城区" + }, + { + "areaId": "430721", + "areaName": "安乡县" + }, + { + "areaId": "430722", + "areaName": "汉寿县" + }, + { + "areaId": "430723", + "areaName": "澧县" + }, + { + "areaId": "430724", + "areaName": "临澧县" + }, + { + "areaId": "430725", + "areaName": "桃源县" + }, + { + "areaId": "430726", + "areaName": "石门县" + }, + { + "areaId": "430781", + "areaName": "津市市" + } + ] + }, + { + "areaId": "430800", + "areaName": "张家界市", + "counties": [ + { + "areaId": "430802", + "areaName": "永定区" + }, + { + "areaId": "430811", + "areaName": "武陵源区" + }, + { + "areaId": "430821", + "areaName": "慈利县" + }, + { + "areaId": "430822", + "areaName": "桑植县" + } + ] + }, + { + "areaId": "430900", + "areaName": "益阳市", + "counties": [ + { + "areaId": "430902", + "areaName": "资阳区" + }, + { + "areaId": "430903", + "areaName": "赫山区" + }, + { + "areaId": "430921", + "areaName": "南县" + }, + { + "areaId": "430922", + "areaName": "桃江县" + }, + { + "areaId": "430923", + "areaName": "安化县" + }, + { + "areaId": "430981", + "areaName": "沅江市" + } + ] + }, + { + "areaId": "431000", + "areaName": "郴州市", + "counties": [ + { + "areaId": "431002", + "areaName": "北湖区" + }, + { + "areaId": "431003", + "areaName": "苏仙区" + }, + { + "areaId": "431021", + "areaName": "桂阳县" + }, + { + "areaId": "431022", + "areaName": "宜章县" + }, + { + "areaId": "431023", + "areaName": "永兴县" + }, + { + "areaId": "431024", + "areaName": "嘉禾县" + }, + { + "areaId": "431025", + "areaName": "临武县" + }, + { + "areaId": "431026", + "areaName": "汝城县" + }, + { + "areaId": "431027", + "areaName": "桂东县" + }, + { + "areaId": "431028", + "areaName": "安仁县" + }, + { + "areaId": "431081", + "areaName": "资兴市" + } + ] + }, + { + "areaId": "431100", + "areaName": "永州市", + "counties": [ + { + "areaId": "431102", + "areaName": "零陵区" + }, + { + "areaId": "431103", + "areaName": "冷水滩区" + }, + { + "areaId": "431121", + "areaName": "祁阳县" + }, + { + "areaId": "431122", + "areaName": "东安县" + }, + { + "areaId": "431123", + "areaName": "双牌县" + }, + { + "areaId": "431124", + "areaName": "道县" + }, + { + "areaId": "431125", + "areaName": "江永县" + }, + { + "areaId": "431126", + "areaName": "宁远县" + }, + { + "areaId": "431127", + "areaName": "蓝山县" + }, + { + "areaId": "431128", + "areaName": "新田县" + }, + { + "areaId": "431129", + "areaName": "江华瑶族自治县" + } + ] + }, + { + "areaId": "431200", + "areaName": "怀化市", + "counties": [ + { + "areaId": "431202", + "areaName": "鹤城区" + }, + { + "areaId": "431221", + "areaName": "中方县" + }, + { + "areaId": "431222", + "areaName": "沅陵县" + }, + { + "areaId": "431223", + "areaName": "辰溪县" + }, + { + "areaId": "431224", + "areaName": "溆浦县" + }, + { + "areaId": "431225", + "areaName": "会同县" + }, + { + "areaId": "431226", + "areaName": "麻阳苗族自治县" + }, + { + "areaId": "431227", + "areaName": "新晃侗族自治县" + }, + { + "areaId": "431228", + "areaName": "芷江侗族自治县" + }, + { + "areaId": "431229", + "areaName": "靖州苗族侗族自治县" + }, + { + "areaId": "431230", + "areaName": "通道侗族自治县" + }, + { + "areaId": "431281", + "areaName": "洪江市" + } + ] + }, + { + "areaId": "431300", + "areaName": "娄底市", + "counties": [ + { + "areaId": "431302", + "areaName": "娄星区" + }, + { + "areaId": "431321", + "areaName": "双峰县" + }, + { + "areaId": "431322", + "areaName": "新化县" + }, + { + "areaId": "431381", + "areaName": "冷水江市" + }, + { + "areaId": "431382", + "areaName": "涟源市" + } + ] + }, + { + "areaId": "433100", + "areaName": "湘西土家族苗族自治州", + "counties": [ + { + "areaId": "433101", + "areaName": "吉首市" + }, + { + "areaId": "433122", + "areaName": "泸溪县" + }, + { + "areaId": "433123", + "areaName": "凤凰县" + }, + { + "areaId": "433124", + "areaName": "花垣县" + }, + { + "areaId": "433125", + "areaName": "保靖县" + }, + { + "areaId": "433126", + "areaName": "古丈县" + }, + { + "areaId": "433127", + "areaName": "永顺县" + }, + { + "areaId": "433130", + "areaName": "龙山县" + } + ] + } + ] + }, + { + "areaId": "440000", + "areaName": "广东省", + "cities": [ + { + "areaId": "440100", + "areaName": "广州市", + "counties": [ + { + "areaId": "440103", + "areaName": "荔湾区" + }, + { + "areaId": "440104", + "areaName": "越秀区" + }, + { + "areaId": "440105", + "areaName": "海珠区" + }, + { + "areaId": "440106", + "areaName": "天河区" + }, + { + "areaId": "440111", + "areaName": "白云区" + }, + { + "areaId": "440112", + "areaName": "黄埔区" + }, + { + "areaId": "440113", + "areaName": "番禺区" + }, + { + "areaId": "440114", + "areaName": "花都区" + }, + { + "areaId": "440115", + "areaName": "南沙区" + }, + { + "areaId": "440116", + "areaName": "萝岗区" + }, + { + "areaId": "440183", + "areaName": "增城市" + }, + { + "areaId": "440184", + "areaName": "从化市" + } + ] + }, + { + "areaId": "440200", + "areaName": "韶关市", + "counties": [ + { + "areaId": "440203", + "areaName": "武江区" + }, + { + "areaId": "440204", + "areaName": "浈江区" + }, + { + "areaId": "440205", + "areaName": "曲江区" + }, + { + "areaId": "440222", + "areaName": "始兴县" + }, + { + "areaId": "440224", + "areaName": "仁化县" + }, + { + "areaId": "440229", + "areaName": "翁源县" + }, + { + "areaId": "440232", + "areaName": "乳源瑶族自治县" + }, + { + "areaId": "440233", + "areaName": "新丰县" + }, + { + "areaId": "440281", + "areaName": "乐昌市" + }, + { + "areaId": "440282", + "areaName": "南雄市" + } + ] + }, + { + "areaId": "440300", + "areaName": "深圳市", + "counties": [ + { + "areaId": "440303", + "areaName": "罗湖区" + }, + { + "areaId": "440304", + "areaName": "福田区" + }, + { + "areaId": "440305", + "areaName": "南山区" + }, + { + "areaId": "440306", + "areaName": "宝安区" + }, + { + "areaId": "440307", + "areaName": "龙岗区" + }, + { + "areaId": "440308", + "areaName": "盐田区" + }, + { + "areaId": "440396", + "areaName": "坪山新区(龙岗区)" + }, + { + "areaId": "440397", + "areaName": "大鹏新区(龙岗区)" + }, + { + "areaId": "440398", + "areaName": "光明新区(宝安区)" + }, + { + "areaId": "440399", + "areaName": "龙华新区(宝安区)" + } + ] + }, + { + "areaId": "440400", + "areaName": "珠海市", + "counties": [ + { + "areaId": "440402", + "areaName": "香洲区" + }, + { + "areaId": "440403", + "areaName": "斗门区" + }, + { + "areaId": "440404", + "areaName": "金湾区" + } + ] + }, + { + "areaId": "440500", + "areaName": "汕头市", + "counties": [ + { + "areaId": "440507", + "areaName": "龙湖区" + }, + { + "areaId": "440511", + "areaName": "金平区" + }, + { + "areaId": "440512", + "areaName": "濠江区" + }, + { + "areaId": "440513", + "areaName": "潮阳区" + }, + { + "areaId": "440514", + "areaName": "潮南区" + }, + { + "areaId": "440515", + "areaName": "澄海区" + }, + { + "areaId": "440523", + "areaName": "南澳县" + } + ] + }, + { + "areaId": "440600", + "areaName": "佛山市", + "counties": [ + { + "areaId": "440604", + "areaName": "禅城区" + }, + { + "areaId": "440605", + "areaName": "南海区" + }, + { + "areaId": "440606", + "areaName": "顺德区" + }, + { + "areaId": "440607", + "areaName": "三水区" + }, + { + "areaId": "440608", + "areaName": "高明区" + } + ] + }, + { + "areaId": "440700", + "areaName": "江门市", + "counties": [ + { + "areaId": "440703", + "areaName": "蓬江区" + }, + { + "areaId": "440704", + "areaName": "江海区" + }, + { + "areaId": "440705", + "areaName": "新会区" + }, + { + "areaId": "440781", + "areaName": "台山市" + }, + { + "areaId": "440783", + "areaName": "开平市" + }, + { + "areaId": "440784", + "areaName": "鹤山市" + }, + { + "areaId": "440785", + "areaName": "恩平市" + } + ] + }, + { + "areaId": "440800", + "areaName": "湛江市", + "counties": [ + { + "areaId": "440802", + "areaName": "赤坎区" + }, + { + "areaId": "440803", + "areaName": "霞山区" + }, + { + "areaId": "440804", + "areaName": "坡头区" + }, + { + "areaId": "440811", + "areaName": "麻章区" + }, + { + "areaId": "440823", + "areaName": "遂溪县" + }, + { + "areaId": "440825", + "areaName": "徐闻县" + }, + { + "areaId": "440881", + "areaName": "廉江市" + }, + { + "areaId": "440882", + "areaName": "雷州市" + }, + { + "areaId": "440883", + "areaName": "吴川市" + } + ] + }, + { + "areaId": "440900", + "areaName": "茂名市", + "counties": [ + { + "areaId": "440902", + "areaName": "茂南区" + }, + { + "areaId": "440903", + "areaName": "茂港区" + }, + { + "areaId": "440923", + "areaName": "电白县" + }, + { + "areaId": "440981", + "areaName": "高州市" + }, + { + "areaId": "440982", + "areaName": "化州市" + }, + { + "areaId": "440983", + "areaName": "信宜市" + } + ] + }, + { + "areaId": "441200", + "areaName": "肇庆市", + "counties": [ + { + "areaId": "441202", + "areaName": "端州区" + }, + { + "areaId": "441203", + "areaName": "鼎湖区" + }, + { + "areaId": "441223", + "areaName": "广宁县" + }, + { + "areaId": "441224", + "areaName": "怀集县" + }, + { + "areaId": "441225", + "areaName": "封开县" + }, + { + "areaId": "441226", + "areaName": "德庆县" + }, + { + "areaId": "441283", + "areaName": "高要市" + }, + { + "areaId": "441284", + "areaName": "四会市" + } + ] + }, + { + "areaId": "441300", + "areaName": "惠州市", + "counties": [ + { + "areaId": "441302", + "areaName": "惠城区" + }, + { + "areaId": "441303", + "areaName": "惠阳区" + }, + { + "areaId": "441322", + "areaName": "博罗县" + }, + { + "areaId": "441323", + "areaName": "惠东县" + }, + { + "areaId": "441324", + "areaName": "龙门县" + } + ] + }, + { + "areaId": "441400", + "areaName": "梅州市", + "counties": [ + { + "areaId": "441402", + "areaName": "梅江区" + }, + { + "areaId": "441421", + "areaName": "梅县" + }, + { + "areaId": "441422", + "areaName": "大埔县" + }, + { + "areaId": "441423", + "areaName": "丰顺县" + }, + { + "areaId": "441424", + "areaName": "五华县" + }, + { + "areaId": "441426", + "areaName": "平远县" + }, + { + "areaId": "441427", + "areaName": "蕉岭县" + }, + { + "areaId": "441481", + "areaName": "兴宁市" + } + ] + }, + { + "areaId": "441500", + "areaName": "汕尾市", + "counties": [ + { + "areaId": "441502", + "areaName": "城区" + }, + { + "areaId": "441521", + "areaName": "海丰县" + }, + { + "areaId": "441523", + "areaName": "陆河县" + }, + { + "areaId": "441581", + "areaName": "陆丰市" + } + ] + }, + { + "areaId": "441600", + "areaName": "河源市", + "counties": [ + { + "areaId": "441602", + "areaName": "源城区" + }, + { + "areaId": "441621", + "areaName": "紫金县" + }, + { + "areaId": "441622", + "areaName": "龙川县" + }, + { + "areaId": "441623", + "areaName": "连平县" + }, + { + "areaId": "441624", + "areaName": "和平县" + }, + { + "areaId": "441625", + "areaName": "东源县" + } + ] + }, + { + "areaId": "441700", + "areaName": "阳江市", + "counties": [ + { + "areaId": "441702", + "areaName": "江城区" + }, + { + "areaId": "441721", + "areaName": "阳西县" + }, + { + "areaId": "441723", + "areaName": "阳东县" + }, + { + "areaId": "441781", + "areaName": "阳春市" + } + ] + }, + { + "areaId": "441800", + "areaName": "清远市", + "counties": [ + { + "areaId": "441802", + "areaName": "清城区" + }, + { + "areaId": "441803", + "areaName": "清新区" + }, + { + "areaId": "441821", + "areaName": "佛冈县" + }, + { + "areaId": "441823", + "areaName": "阳山县" + }, + { + "areaId": "441825", + "areaName": "连山壮族瑶族自治县" + }, + { + "areaId": "441826", + "areaName": "连南瑶族自治县" + }, + { + "areaId": "441881", + "areaName": "英德市" + }, + { + "areaId": "441882", + "areaName": "连州市" + } + ] + }, + { + "areaId": "441900", + "areaName": "东莞市", + "counties": [ + { + "areaId": "441901003", + "areaName": "东城街道" + }, + { + "areaId": "441901004", + "areaName": "南城街道" + }, + { + "areaId": "441901005", + "areaName": "万江街道" + }, + { + "areaId": "441901006", + "areaName": "莞城街道" + }, + { + "areaId": "441901101", + "areaName": "石碣镇" + }, + { + "areaId": "441901102", + "areaName": "石龙镇" + }, + { + "areaId": "441901103", + "areaName": "茶山镇" + }, + { + "areaId": "441901104", + "areaName": "石排镇" + }, + { + "areaId": "441901105", + "areaName": "企石镇" + }, + { + "areaId": "441901106", + "areaName": "横沥镇" + }, + { + "areaId": "441901107", + "areaName": "桥头镇" + }, + { + "areaId": "441901108", + "areaName": "谢岗镇" + }, + { + "areaId": "441901109", + "areaName": "东坑镇" + }, + { + "areaId": "441901110", + "areaName": "常平镇" + }, + { + "areaId": "441901111", + "areaName": "寮步镇" + }, + { + "areaId": "441901112", + "areaName": "樟木头镇" + }, + { + "areaId": "441901113", + "areaName": "大朗镇" + }, + { + "areaId": "441901114", + "areaName": "黄江镇" + }, + { + "areaId": "441901115", + "areaName": "清溪镇" + }, + { + "areaId": "441901116", + "areaName": "塘厦镇" + }, + { + "areaId": "441901117", + "areaName": "凤岗镇" + }, + { + "areaId": "441901118", + "areaName": "大岭山镇" + }, + { + "areaId": "441901119", + "areaName": "长安镇" + }, + { + "areaId": "441901121", + "areaName": "虎门镇" + }, + { + "areaId": "441901122", + "areaName": "厚街镇" + }, + { + "areaId": "441901123", + "areaName": "沙田镇" + }, + { + "areaId": "441901124", + "areaName": "道滘镇" + }, + { + "areaId": "441901125", + "areaName": "洪梅镇" + }, + { + "areaId": "441901126", + "areaName": "麻涌镇" + }, + { + "areaId": "441901127", + "areaName": "望牛墩镇" + }, + { + "areaId": "441901128", + "areaName": "中堂镇" + }, + { + "areaId": "441901129", + "areaName": "高埗镇" + }, + { + "areaId": "441901401", + "areaName": "松山湖管委会" + }, + { + "areaId": "441901402", + "areaName": "虎门港管委会" + }, + { + "areaId": "441901403", + "areaName": "东莞生态园" + } + ] + }, + { + "areaId": "442000", + "areaName": "中山市", + "counties": [ + { + "areaId": "442001001", + "areaName": "石岐区街道" + }, + { + "areaId": "442001002", + "areaName": "东区街道" + }, + { + "areaId": "442001003", + "areaName": "火炬开发区街道" + }, + { + "areaId": "442001004", + "areaName": "西区街道" + }, + { + "areaId": "442001005", + "areaName": "南区街道" + }, + { + "areaId": "442001006", + "areaName": "五桂山街道" + }, + { + "areaId": "442001100", + "areaName": "小榄镇" + }, + { + "areaId": "442001101", + "areaName": "黄圃镇" + }, + { + "areaId": "442001102", + "areaName": "民众镇" + }, + { + "areaId": "442001103", + "areaName": "东凤镇" + }, + { + "areaId": "442001104", + "areaName": "东升镇" + }, + { + "areaId": "442001105", + "areaName": "古镇镇" + }, + { + "areaId": "442001106", + "areaName": "沙溪镇" + }, + { + "areaId": "442001107", + "areaName": "坦洲镇" + }, + { + "areaId": "442001108", + "areaName": "港口镇" + }, + { + "areaId": "442001109", + "areaName": "三角镇" + }, + { + "areaId": "442001110", + "areaName": "横栏镇" + }, + { + "areaId": "442001111", + "areaName": "南头镇" + }, + { + "areaId": "442001112", + "areaName": "阜沙镇" + }, + { + "areaId": "442001113", + "areaName": "南朗镇" + }, + { + "areaId": "442001114", + "areaName": "三乡镇" + }, + { + "areaId": "442001115", + "areaName": "板芙镇" + }, + { + "areaId": "442001116", + "areaName": "大涌镇" + }, + { + "areaId": "442001117", + "areaName": "神湾镇" + } + ] + }, + { + "areaId": "445100", + "areaName": "潮州市", + "counties": [ + { + "areaId": "445102", + "areaName": "湘桥区" + }, + { + "areaId": "445103", + "areaName": "潮安区" + }, + { + "areaId": "445122", + "areaName": "饶平县" + } + ] + }, + { + "areaId": "445200", + "areaName": "揭阳市", + "counties": [ + { + "areaId": "445202", + "areaName": "榕城区" + }, + { + "areaId": "445203", + "areaName": "揭东区" + }, + { + "areaId": "445222", + "areaName": "揭西县" + }, + { + "areaId": "445224", + "areaName": "惠来县" + }, + { + "areaId": "445281", + "areaName": "普宁市" + } + ] + }, + { + "areaId": "445300", + "areaName": "云浮市", + "counties": [ + { + "areaId": "445302", + "areaName": "云城区" + }, + { + "areaId": "445321", + "areaName": "新兴县" + }, + { + "areaId": "445322", + "areaName": "郁南县" + }, + { + "areaId": "445323", + "areaName": "云安县" + }, + { + "areaId": "445381", + "areaName": "罗定市" + } + ] + } + ] + }, + { + "areaId": "450000", + "areaName": "广西壮族自治区", + "cities": [ + { + "areaId": "450100", + "areaName": "南宁市", + "counties": [ + { + "areaId": "450102", + "areaName": "兴宁区" + }, + { + "areaId": "450103", + "areaName": "青秀区" + }, + { + "areaId": "450105", + "areaName": "江南区" + }, + { + "areaId": "450107", + "areaName": "西乡塘区" + }, + { + "areaId": "450108", + "areaName": "良庆区" + }, + { + "areaId": "450109", + "areaName": "邕宁区" + }, + { + "areaId": "450122", + "areaName": "武鸣县" + }, + { + "areaId": "450123", + "areaName": "隆安县" + }, + { + "areaId": "450124", + "areaName": "马山县" + }, + { + "areaId": "450125", + "areaName": "上林县" + }, + { + "areaId": "450126", + "areaName": "宾阳县" + }, + { + "areaId": "450127", + "areaName": "横县" + } + ] + }, + { + "areaId": "450200", + "areaName": "柳州市", + "counties": [ + { + "areaId": "450202", + "areaName": "城中区" + }, + { + "areaId": "450203", + "areaName": "鱼峰区" + }, + { + "areaId": "450204", + "areaName": "柳南区" + }, + { + "areaId": "450205", + "areaName": "柳北区" + }, + { + "areaId": "450221", + "areaName": "柳江县" + }, + { + "areaId": "450222", + "areaName": "柳城县" + }, + { + "areaId": "450223", + "areaName": "鹿寨县" + }, + { + "areaId": "450224", + "areaName": "融安县" + }, + { + "areaId": "450225", + "areaName": "融水苗族自治县" + }, + { + "areaId": "450226", + "areaName": "三江侗族自治县" + } + ] + }, + { + "areaId": "450300", + "areaName": "桂林市", + "counties": [ + { + "areaId": "450302", + "areaName": "秀峰区" + }, + { + "areaId": "450303", + "areaName": "叠彩区" + }, + { + "areaId": "450304", + "areaName": "象山区" + }, + { + "areaId": "450305", + "areaName": "七星区" + }, + { + "areaId": "450311", + "areaName": "雁山区" + }, + { + "areaId": "450312", + "areaName": "临桂区" + }, + { + "areaId": "450321", + "areaName": "阳朔县" + }, + { + "areaId": "450323", + "areaName": "灵川县" + }, + { + "areaId": "450324", + "areaName": "全州县" + }, + { + "areaId": "450325", + "areaName": "兴安县" + }, + { + "areaId": "450326", + "areaName": "永福县" + }, + { + "areaId": "450327", + "areaName": "灌阳县" + }, + { + "areaId": "450328", + "areaName": "龙胜各族自治县" + }, + { + "areaId": "450329", + "areaName": "资源县" + }, + { + "areaId": "450330", + "areaName": "平乐县" + }, + { + "areaId": "450331", + "areaName": "荔浦县" + }, + { + "areaId": "450332", + "areaName": "恭城瑶族自治县" + } + ] + }, + { + "areaId": "450400", + "areaName": "梧州市", + "counties": [ + { + "areaId": "450403", + "areaName": "万秀区" + }, + { + "areaId": "450405", + "areaName": "长洲区" + }, + { + "areaId": "450406", + "areaName": "龙圩区" + }, + { + "areaId": "450421", + "areaName": "苍梧县" + }, + { + "areaId": "450422", + "areaName": "藤县" + }, + { + "areaId": "450423", + "areaName": "蒙山县" + }, + { + "areaId": "450481", + "areaName": "岑溪市" + } + ] + }, + { + "areaId": "450500", + "areaName": "北海市", + "counties": [ + { + "areaId": "450502", + "areaName": "海城区" + }, + { + "areaId": "450503", + "areaName": "银海区" + }, + { + "areaId": "450512", + "areaName": "铁山港区" + }, + { + "areaId": "450521", + "areaName": "合浦县" + } + ] + }, + { + "areaId": "450600", + "areaName": "防城港市", + "counties": [ + { + "areaId": "450602", + "areaName": "港口区" + }, + { + "areaId": "450603", + "areaName": "防城区" + }, + { + "areaId": "450621", + "areaName": "上思县" + }, + { + "areaId": "450681", + "areaName": "东兴市" + } + ] + }, + { + "areaId": "450700", + "areaName": "钦州市", + "counties": [ + { + "areaId": "450702", + "areaName": "钦南区" + }, + { + "areaId": "450703", + "areaName": "钦北区" + }, + { + "areaId": "450721", + "areaName": "灵山县" + }, + { + "areaId": "450722", + "areaName": "浦北县" + } + ] + }, + { + "areaId": "450800", + "areaName": "贵港市", + "counties": [ + { + "areaId": "450802", + "areaName": "港北区" + }, + { + "areaId": "450803", + "areaName": "港南区" + }, + { + "areaId": "450804", + "areaName": "覃塘区" + }, + { + "areaId": "450821", + "areaName": "平南县" + }, + { + "areaId": "450881", + "areaName": "桂平市" + } + ] + }, + { + "areaId": "450900", + "areaName": "玉林市", + "counties": [ + { + "areaId": "450902", + "areaName": "玉州区" + }, + { + "areaId": "450903", + "areaName": "福绵区" + }, + { + "areaId": "450921", + "areaName": "容县" + }, + { + "areaId": "450922", + "areaName": "陆川县" + }, + { + "areaId": "450923", + "areaName": "博白县" + }, + { + "areaId": "450924", + "areaName": "兴业县" + }, + { + "areaId": "450981", + "areaName": "北流市" + } + ] + }, + { + "areaId": "451000", + "areaName": "百色市", + "counties": [ + { + "areaId": "451002", + "areaName": "右江区" + }, + { + "areaId": "451021", + "areaName": "田阳县" + }, + { + "areaId": "451022", + "areaName": "田东县" + }, + { + "areaId": "451023", + "areaName": "平果县" + }, + { + "areaId": "451024", + "areaName": "德保县" + }, + { + "areaId": "451025", + "areaName": "靖西县" + }, + { + "areaId": "451026", + "areaName": "那坡县" + }, + { + "areaId": "451027", + "areaName": "凌云县" + }, + { + "areaId": "451028", + "areaName": "乐业县" + }, + { + "areaId": "451029", + "areaName": "田林县" + }, + { + "areaId": "451030", + "areaName": "西林县" + }, + { + "areaId": "451031", + "areaName": "隆林各族自治县" + } + ] + }, + { + "areaId": "451100", + "areaName": "贺州市", + "counties": [ + { + "areaId": "451102", + "areaName": "八步区" + }, + { + "areaId": "451121", + "areaName": "昭平县" + }, + { + "areaId": "451122", + "areaName": "钟山县" + }, + { + "areaId": "451123", + "areaName": "富川瑶族自治县" + } + ] + }, + { + "areaId": "451200", + "areaName": "河池市", + "counties": [ + { + "areaId": "451202", + "areaName": "金城江区" + }, + { + "areaId": "451221", + "areaName": "南丹县" + }, + { + "areaId": "451222", + "areaName": "天峨县" + }, + { + "areaId": "451223", + "areaName": "凤山县" + }, + { + "areaId": "451224", + "areaName": "东兰县" + }, + { + "areaId": "451225", + "areaName": "罗城仫佬族自治县" + }, + { + "areaId": "451226", + "areaName": "环江毛南族自治县" + }, + { + "areaId": "451227", + "areaName": "巴马瑶族自治县" + }, + { + "areaId": "451228", + "areaName": "都安瑶族自治县" + }, + { + "areaId": "451229", + "areaName": "大化瑶族自治县" + }, + { + "areaId": "451281", + "areaName": "宜州市" + } + ] + }, + { + "areaId": "451300", + "areaName": "来宾市", + "counties": [ + { + "areaId": "451302", + "areaName": "兴宾区" + }, + { + "areaId": "451321", + "areaName": "忻城县" + }, + { + "areaId": "451322", + "areaName": "象州县" + }, + { + "areaId": "451323", + "areaName": "武宣县" + }, + { + "areaId": "451324", + "areaName": "金秀瑶族自治县" + }, + { + "areaId": "451381", + "areaName": "合山市" + } + ] + }, + { + "areaId": "451400", + "areaName": "崇左市", + "counties": [ + { + "areaId": "451402", + "areaName": "江州区" + }, + { + "areaId": "451421", + "areaName": "扶绥县" + }, + { + "areaId": "451422", + "areaName": "宁明县" + }, + { + "areaId": "451423", + "areaName": "龙州县" + }, + { + "areaId": "451424", + "areaName": "大新县" + }, + { + "areaId": "451425", + "areaName": "天等县" + }, + { + "areaId": "451481", + "areaName": "凭祥市" + } + ] + } + ] + }, + { + "areaId": "460000", + "areaName": "海南省", + "cities": [ + { + "areaId": "460100", + "areaName": "海口市", + "counties": [ + { + "areaId": "460105", + "areaName": "秀英区" + }, + { + "areaId": "460106", + "areaName": "龙华区" + }, + { + "areaId": "460107", + "areaName": "琼山区" + }, + { + "areaId": "460108", + "areaName": "美兰区" + } + ] + }, + { + "areaId": "460200", + "areaName": "三亚市", + "counties": [ + { + "areaId": "460201100", + "areaName": "海棠湾镇" + }, + { + "areaId": "460201101", + "areaName": "吉阳镇" + }, + { + "areaId": "460201102", + "areaName": "凤凰镇" + }, + { + "areaId": "460201103", + "areaName": "崖城镇" + }, + { + "areaId": "460201104", + "areaName": "天涯镇" + }, + { + "areaId": "460201105", + "areaName": "育才镇" + }, + { + "areaId": "460201400", + "areaName": "国营南田农场" + }, + { + "areaId": "460201401", + "areaName": "国营南新农场" + }, + { + "areaId": "460201403", + "areaName": "国营立才农场" + }, + { + "areaId": "460201404", + "areaName": "国营南滨农场" + }, + { + "areaId": "460201451", + "areaName": "河西区街道" + }, + { + "areaId": "460201452", + "areaName": "河东区街道" + } + ] + }, + { + "areaId": "460300", + "areaName": "三沙市", + "counties": [ + { + "areaId": "460321", + "areaName": "西沙群岛" + }, + { + "areaId": "460322", + "areaName": "南沙群岛" + }, + { + "areaId": "460323", + "areaName": "中沙群岛的岛礁及其海域" + } + ] + }, + { + "areaId": "469000", + "areaName": "省直辖县级行政区划", + "counties": [ + { + "areaId": "469001", + "areaName": "五指山市" + }, + { + "areaId": "469002", + "areaName": "琼海市" + }, + { + "areaId": "469003", + "areaName": "儋州市" + }, + { + "areaId": "469005", + "areaName": "文昌市" + }, + { + "areaId": "469006", + "areaName": "万宁市" + }, + { + "areaId": "469007", + "areaName": "东方市" + }, + { + "areaId": "469021", + "areaName": "定安县" + }, + { + "areaId": "469022", + "areaName": "屯昌县" + }, + { + "areaId": "469023", + "areaName": "澄迈县" + }, + { + "areaId": "469024", + "areaName": "临高县" + }, + { + "areaId": "469025", + "areaName": "白沙黎族自治县" + }, + { + "areaId": "469026", + "areaName": "昌江黎族自治县" + }, + { + "areaId": "469027", + "areaName": "乐东黎族自治县" + }, + { + "areaId": "469028", + "areaName": "陵水黎族自治县" + }, + { + "areaId": "469029", + "areaName": "保亭黎族苗族自治县" + }, + { + "areaId": "469030", + "areaName": "琼中黎族苗族自治县" + } + ] + } + ] + }, + { + "areaId": "500000", + "areaName": "重庆市", + "cities": [ + { + "areaId": "500000", + "areaName": "重庆市", + "counties": [ + { + "areaId": "500101", + "areaName": "万州区" + }, + { + "areaId": "500102", + "areaName": "涪陵区" + }, + { + "areaId": "500103", + "areaName": "渝中区" + }, + { + "areaId": "500104", + "areaName": "大渡口区" + }, + { + "areaId": "500105", + "areaName": "江北区" + }, + { + "areaId": "500106", + "areaName": "沙坪坝区" + }, + { + "areaId": "500107", + "areaName": "九龙坡区" + }, + { + "areaId": "500108", + "areaName": "南岸区" + }, + { + "areaId": "500109", + "areaName": "北碚区" + }, + { + "areaId": "500110", + "areaName": "綦江区" + }, + { + "areaId": "500111", + "areaName": "大足区" + }, + { + "areaId": "500112", + "areaName": "渝北区" + }, + { + "areaId": "500113", + "areaName": "巴南区" + }, + { + "areaId": "500114", + "areaName": "黔江区" + }, + { + "areaId": "500115", + "areaName": "长寿区" + }, + { + "areaId": "500116", + "areaName": "江津区" + }, + { + "areaId": "500117", + "areaName": "合川区" + }, + { + "areaId": "500118", + "areaName": "永川区" + }, + { + "areaId": "500119", + "areaName": "南川区" + }, + { + "areaId": "500223", + "areaName": "潼南县" + }, + { + "areaId": "500224", + "areaName": "铜梁县" + }, + { + "areaId": "500226", + "areaName": "荣昌县" + }, + { + "areaId": "500227", + "areaName": "璧山县" + }, + { + "areaId": "500228", + "areaName": "梁平县" + }, + { + "areaId": "500229", + "areaName": "城口县" + }, + { + "areaId": "500230", + "areaName": "丰都县" + }, + { + "areaId": "500231", + "areaName": "垫江县" + }, + { + "areaId": "500232", + "areaName": "武隆县" + }, + { + "areaId": "500233", + "areaName": "忠县" + }, + { + "areaId": "500234", + "areaName": "开县" + }, + { + "areaId": "500235", + "areaName": "云阳县" + }, + { + "areaId": "500236", + "areaName": "奉节县" + }, + { + "areaId": "500237", + "areaName": "巫山县" + }, + { + "areaId": "500238", + "areaName": "巫溪县" + }, + { + "areaId": "500240", + "areaName": "石柱土家族自治县" + }, + { + "areaId": "500241", + "areaName": "秀山土家族苗族自治县" + }, + { + "areaId": "500242", + "areaName": "酉阳土家族苗族自治县" + }, + { + "areaId": "500243", + "areaName": "彭水苗族土家族自治县" + } + ] + } + ] + }, + { + "areaId": "510000", + "areaName": "四川省", + "cities": [ + { + "areaId": "510100", + "areaName": "成都市", + "counties": [ + { + "areaId": "510104", + "areaName": "锦江区" + }, + { + "areaId": "510105", + "areaName": "青羊区" + }, + { + "areaId": "510106", + "areaName": "金牛区" + }, + { + "areaId": "510107", + "areaName": "武侯区" + }, + { + "areaId": "510108", + "areaName": "成华区" + }, + { + "areaId": "510112", + "areaName": "龙泉驿区" + }, + { + "areaId": "510113", + "areaName": "青白江区" + }, + { + "areaId": "510114", + "areaName": "新都区" + }, + { + "areaId": "510115", + "areaName": "温江区" + }, + { + "areaId": "510121", + "areaName": "金堂县" + }, + { + "areaId": "510122", + "areaName": "双流县" + }, + { + "areaId": "510124", + "areaName": "郫县" + }, + { + "areaId": "510129", + "areaName": "大邑县" + }, + { + "areaId": "510131", + "areaName": "蒲江县" + }, + { + "areaId": "510132", + "areaName": "新津县" + }, + { + "areaId": "510181", + "areaName": "都江堰市" + }, + { + "areaId": "510182", + "areaName": "彭州市" + }, + { + "areaId": "510183", + "areaName": "邛崃市" + }, + { + "areaId": "510184", + "areaName": "崇州市" + }, + { + "areaId": "510198", + "areaName": "高新区(武侯区)" + }, + { + "areaId": "510199", + "areaName": "高新西区(郫县)" + } + ] + }, + { + "areaId": "510300", + "areaName": "自贡市", + "counties": [ + { + "areaId": "510302", + "areaName": "自流井区" + }, + { + "areaId": "510303", + "areaName": "贡井区" + }, + { + "areaId": "510304", + "areaName": "大安区" + }, + { + "areaId": "510311", + "areaName": "沿滩区" + }, + { + "areaId": "510321", + "areaName": "荣县" + }, + { + "areaId": "510322", + "areaName": "富顺县" + } + ] + }, + { + "areaId": "510400", + "areaName": "攀枝花市", + "counties": [ + { + "areaId": "510402", + "areaName": "东区" + }, + { + "areaId": "510403", + "areaName": "西区" + }, + { + "areaId": "510411", + "areaName": "仁和区" + }, + { + "areaId": "510421", + "areaName": "米易县" + }, + { + "areaId": "510422", + "areaName": "盐边县" + } + ] + }, + { + "areaId": "510500", + "areaName": "泸州市", + "counties": [ + { + "areaId": "510502", + "areaName": "江阳区" + }, + { + "areaId": "510503", + "areaName": "纳溪区" + }, + { + "areaId": "510504", + "areaName": "龙马潭区" + }, + { + "areaId": "510521", + "areaName": "泸县" + }, + { + "areaId": "510522", + "areaName": "合江县" + }, + { + "areaId": "510524", + "areaName": "叙永县" + }, + { + "areaId": "510525", + "areaName": "古蔺县" + } + ] + }, + { + "areaId": "510600", + "areaName": "德阳市", + "counties": [ + { + "areaId": "510603", + "areaName": "旌阳区" + }, + { + "areaId": "510623", + "areaName": "中江县" + }, + { + "areaId": "510626", + "areaName": "罗江县" + }, + { + "areaId": "510681", + "areaName": "广汉市" + }, + { + "areaId": "510682", + "areaName": "什邡市" + }, + { + "areaId": "510683", + "areaName": "绵竹市" + } + ] + }, + { + "areaId": "510700", + "areaName": "绵阳市", + "counties": [ + { + "areaId": "510703", + "areaName": "涪城区" + }, + { + "areaId": "510704", + "areaName": "游仙区" + }, + { + "areaId": "510722", + "areaName": "三台县" + }, + { + "areaId": "510723", + "areaName": "盐亭县" + }, + { + "areaId": "510724", + "areaName": "安县" + }, + { + "areaId": "510725", + "areaName": "梓潼县" + }, + { + "areaId": "510726", + "areaName": "北川羌族自治县" + }, + { + "areaId": "510727", + "areaName": "平武县" + }, + { + "areaId": "510781", + "areaName": "江油市" + } + ] + }, + { + "areaId": "510800", + "areaName": "广元市", + "counties": [ + { + "areaId": "510802", + "areaName": "利州区" + }, + { + "areaId": "510811", + "areaName": "元坝区" + }, + { + "areaId": "510812", + "areaName": "朝天区" + }, + { + "areaId": "510821", + "areaName": "旺苍县" + }, + { + "areaId": "510822", + "areaName": "青川县" + }, + { + "areaId": "510823", + "areaName": "剑阁县" + }, + { + "areaId": "510824", + "areaName": "苍溪县" + } + ] + }, + { + "areaId": "510900", + "areaName": "遂宁市", + "counties": [ + { + "areaId": "510903", + "areaName": "船山区" + }, + { + "areaId": "510904", + "areaName": "安居区" + }, + { + "areaId": "510921", + "areaName": "蓬溪县" + }, + { + "areaId": "510922", + "areaName": "射洪县" + }, + { + "areaId": "510923", + "areaName": "大英县" + } + ] + }, + { + "areaId": "511000", + "areaName": "内江市", + "counties": [ + { + "areaId": "511002", + "areaName": "市中区" + }, + { + "areaId": "511011", + "areaName": "东兴区" + }, + { + "areaId": "511024", + "areaName": "威远县" + }, + { + "areaId": "511025", + "areaName": "资中县" + }, + { + "areaId": "511028", + "areaName": "隆昌县" + } + ] + }, + { + "areaId": "511100", + "areaName": "乐山市", + "counties": [ + { + "areaId": "511102", + "areaName": "市中区" + }, + { + "areaId": "511111", + "areaName": "沙湾区" + }, + { + "areaId": "511112", + "areaName": "五通桥区" + }, + { + "areaId": "511113", + "areaName": "金口河区" + }, + { + "areaId": "511123", + "areaName": "犍为县" + }, + { + "areaId": "511124", + "areaName": "井研县" + }, + { + "areaId": "511126", + "areaName": "夹江县" + }, + { + "areaId": "511129", + "areaName": "沐川县" + }, + { + "areaId": "511132", + "areaName": "峨边彝族自治县" + }, + { + "areaId": "511133", + "areaName": "马边彝族自治县" + }, + { + "areaId": "511181", + "areaName": "峨眉山市" + } + ] + }, + { + "areaId": "511300", + "areaName": "南充市", + "counties": [ + { + "areaId": "511302", + "areaName": "顺庆区" + }, + { + "areaId": "511303", + "areaName": "高坪区" + }, + { + "areaId": "511304", + "areaName": "嘉陵区" + }, + { + "areaId": "511321", + "areaName": "南部县" + }, + { + "areaId": "511322", + "areaName": "营山县" + }, + { + "areaId": "511323", + "areaName": "蓬安县" + }, + { + "areaId": "511324", + "areaName": "仪陇县" + }, + { + "areaId": "511325", + "areaName": "西充县" + }, + { + "areaId": "511381", + "areaName": "阆中市" + } + ] + }, + { + "areaId": "511400", + "areaName": "眉山市", + "counties": [ + { + "areaId": "511402", + "areaName": "东坡区" + }, + { + "areaId": "511421", + "areaName": "仁寿县" + }, + { + "areaId": "511422", + "areaName": "彭山县" + }, + { + "areaId": "511423", + "areaName": "洪雅县" + }, + { + "areaId": "511424", + "areaName": "丹棱县" + }, + { + "areaId": "511425", + "areaName": "青神县" + } + ] + }, + { + "areaId": "511500", + "areaName": "宜宾市", + "counties": [ + { + "areaId": "511502", + "areaName": "翠屏区" + }, + { + "areaId": "511503", + "areaName": "南溪区" + }, + { + "areaId": "511521", + "areaName": "宜宾县" + }, + { + "areaId": "511523", + "areaName": "江安县" + }, + { + "areaId": "511524", + "areaName": "长宁县" + }, + { + "areaId": "511525", + "areaName": "高县" + }, + { + "areaId": "511526", + "areaName": "珙县" + }, + { + "areaId": "511527", + "areaName": "筠连县" + }, + { + "areaId": "511528", + "areaName": "兴文县" + }, + { + "areaId": "511529", + "areaName": "屏山县" + } + ] + }, + { + "areaId": "511600", + "areaName": "广安市", + "counties": [ + { + "areaId": "511602", + "areaName": "广安区" + }, + { + "areaId": "511603", + "areaName": "前锋区" + }, + { + "areaId": "511621", + "areaName": "岳池县" + }, + { + "areaId": "511622", + "areaName": "武胜县" + }, + { + "areaId": "511623", + "areaName": "邻水县" + }, + { + "areaId": "511681", + "areaName": "华蓥市" + } + ] + }, + { + "areaId": "511700", + "areaName": "达州市", + "counties": [ + { + "areaId": "511702", + "areaName": "通川区" + }, + { + "areaId": "511703", + "areaName": "达川区" + }, + { + "areaId": "511722", + "areaName": "宣汉县" + }, + { + "areaId": "511723", + "areaName": "开江县" + }, + { + "areaId": "511724", + "areaName": "大竹县" + }, + { + "areaId": "511725", + "areaName": "渠县" + }, + { + "areaId": "511781", + "areaName": "万源市" + } + ] + }, + { + "areaId": "511800", + "areaName": "雅安市", + "counties": [ + { + "areaId": "511802", + "areaName": "雨城区" + }, + { + "areaId": "511803", + "areaName": "名山区" + }, + { + "areaId": "511822", + "areaName": "荥经县" + }, + { + "areaId": "511823", + "areaName": "汉源县" + }, + { + "areaId": "511824", + "areaName": "石棉县" + }, + { + "areaId": "511825", + "areaName": "天全县" + }, + { + "areaId": "511826", + "areaName": "芦山县" + }, + { + "areaId": "511827", + "areaName": "宝兴县" + } + ] + }, + { + "areaId": "511900", + "areaName": "巴中市", + "counties": [ + { + "areaId": "511902", + "areaName": "巴州区" + }, + { + "areaId": "511903", + "areaName": "恩阳区" + }, + { + "areaId": "511921", + "areaName": "通江县" + }, + { + "areaId": "511922", + "areaName": "南江县" + }, + { + "areaId": "511923", + "areaName": "平昌县" + } + ] + }, + { + "areaId": "512000", + "areaName": "资阳市", + "counties": [ + { + "areaId": "512002", + "areaName": "雁江区" + }, + { + "areaId": "512021", + "areaName": "安岳县" + }, + { + "areaId": "512022", + "areaName": "乐至县" + }, + { + "areaId": "512081", + "areaName": "简阳市" + } + ] + }, + { + "areaId": "513200", + "areaName": "阿坝藏族羌族自治州", + "counties": [ + { + "areaId": "513221", + "areaName": "汶川县" + }, + { + "areaId": "513222", + "areaName": "理县" + }, + { + "areaId": "513223", + "areaName": "茂县" + }, + { + "areaId": "513224", + "areaName": "松潘县" + }, + { + "areaId": "513225", + "areaName": "九寨沟县" + }, + { + "areaId": "513226", + "areaName": "金川县" + }, + { + "areaId": "513227", + "areaName": "小金县" + }, + { + "areaId": "513228", + "areaName": "黑水县" + }, + { + "areaId": "513229", + "areaName": "马尔康县" + }, + { + "areaId": "513230", + "areaName": "壤塘县" + }, + { + "areaId": "513231", + "areaName": "阿坝县" + }, + { + "areaId": "513232", + "areaName": "若尔盖县" + }, + { + "areaId": "513233", + "areaName": "红原县" + } + ] + }, + { + "areaId": "513300", + "areaName": "甘孜藏族自治州", + "counties": [ + { + "areaId": "513321", + "areaName": "康定县" + }, + { + "areaId": "513322", + "areaName": "泸定县" + }, + { + "areaId": "513323", + "areaName": "丹巴县" + }, + { + "areaId": "513324", + "areaName": "九龙县" + }, + { + "areaId": "513325", + "areaName": "雅江县" + }, + { + "areaId": "513326", + "areaName": "道孚县" + }, + { + "areaId": "513327", + "areaName": "炉霍县" + }, + { + "areaId": "513328", + "areaName": "甘孜县" + }, + { + "areaId": "513329", + "areaName": "新龙县" + }, + { + "areaId": "513330", + "areaName": "德格县" + }, + { + "areaId": "513331", + "areaName": "白玉县" + }, + { + "areaId": "513332", + "areaName": "石渠县" + }, + { + "areaId": "513333", + "areaName": "色达县" + }, + { + "areaId": "513334", + "areaName": "理塘县" + }, + { + "areaId": "513335", + "areaName": "巴塘县" + }, + { + "areaId": "513336", + "areaName": "乡城县" + }, + { + "areaId": "513337", + "areaName": "稻城县" + }, + { + "areaId": "513338", + "areaName": "得荣县" + } + ] + }, + { + "areaId": "513400", + "areaName": "凉山彝族自治州", + "counties": [ + { + "areaId": "513401", + "areaName": "西昌市" + }, + { + "areaId": "513422", + "areaName": "木里藏族自治县" + }, + { + "areaId": "513423", + "areaName": "盐源县" + }, + { + "areaId": "513424", + "areaName": "德昌县" + }, + { + "areaId": "513425", + "areaName": "会理县" + }, + { + "areaId": "513426", + "areaName": "会东县" + }, + { + "areaId": "513427", + "areaName": "宁南县" + }, + { + "areaId": "513428", + "areaName": "普格县" + }, + { + "areaId": "513429", + "areaName": "布拖县" + }, + { + "areaId": "513430", + "areaName": "金阳县" + }, + { + "areaId": "513431", + "areaName": "昭觉县" + }, + { + "areaId": "513432", + "areaName": "喜德县" + }, + { + "areaId": "513433", + "areaName": "冕宁县" + }, + { + "areaId": "513434", + "areaName": "越西县" + }, + { + "areaId": "513435", + "areaName": "甘洛县" + }, + { + "areaId": "513436", + "areaName": "美姑县" + }, + { + "areaId": "513437", + "areaName": "雷波县" + } + ] + } + ] + }, + { + "areaId": "520000", + "areaName": "贵州省", + "cities": [ + { + "areaId": "520100", + "areaName": "贵阳市", + "counties": [ + { + "areaId": "520102", + "areaName": "南明区" + }, + { + "areaId": "520103", + "areaName": "云岩区" + }, + { + "areaId": "520111", + "areaName": "花溪区" + }, + { + "areaId": "520112", + "areaName": "乌当区" + }, + { + "areaId": "520113", + "areaName": "白云区" + }, + { + "areaId": "520115", + "areaName": "观山湖区" + }, + { + "areaId": "520121", + "areaName": "开阳县" + }, + { + "areaId": "520122", + "areaName": "息烽县" + }, + { + "areaId": "520123", + "areaName": "修文县" + }, + { + "areaId": "520181", + "areaName": "清镇市" + } + ] + }, + { + "areaId": "520200", + "areaName": "六盘水市", + "counties": [ + { + "areaId": "520201", + "areaName": "钟山区" + }, + { + "areaId": "520203", + "areaName": "六枝特区" + }, + { + "areaId": "520221", + "areaName": "水城县" + }, + { + "areaId": "520222", + "areaName": "盘县" + } + ] + }, + { + "areaId": "520300", + "areaName": "遵义市", + "counties": [ + { + "areaId": "520302", + "areaName": "红花岗区" + }, + { + "areaId": "520303", + "areaName": "汇川区" + }, + { + "areaId": "520321", + "areaName": "遵义县" + }, + { + "areaId": "520322", + "areaName": "桐梓县" + }, + { + "areaId": "520323", + "areaName": "绥阳县" + }, + { + "areaId": "520324", + "areaName": "正安县" + }, + { + "areaId": "520325", + "areaName": "道真仡佬族苗族自治县" + }, + { + "areaId": "520326", + "areaName": "务川仡佬族苗族自治县" + }, + { + "areaId": "520327", + "areaName": "凤冈县" + }, + { + "areaId": "520328", + "areaName": "湄潭县" + }, + { + "areaId": "520329", + "areaName": "余庆县" + }, + { + "areaId": "520330", + "areaName": "习水县" + }, + { + "areaId": "520381", + "areaName": "赤水市" + }, + { + "areaId": "520382", + "areaName": "仁怀市" + } + ] + }, + { + "areaId": "520400", + "areaName": "安顺市", + "counties": [ + { + "areaId": "520402", + "areaName": "西秀区" + }, + { + "areaId": "520421", + "areaName": "平坝县" + }, + { + "areaId": "520422", + "areaName": "普定县" + }, + { + "areaId": "520423", + "areaName": "镇宁布依族苗族自治县" + }, + { + "areaId": "520424", + "areaName": "关岭布依族苗族自治县" + }, + { + "areaId": "520425", + "areaName": "紫云苗族布依族自治县" + } + ] + }, + { + "areaId": "520500", + "areaName": "毕节市", + "counties": [ + { + "areaId": "520502", + "areaName": "七星关区" + }, + { + "areaId": "520521", + "areaName": "大方县" + }, + { + "areaId": "520522", + "areaName": "黔西县" + }, + { + "areaId": "520523", + "areaName": "金沙县" + }, + { + "areaId": "520524", + "areaName": "织金县" + }, + { + "areaId": "520525", + "areaName": "纳雍县" + }, + { + "areaId": "520526", + "areaName": "威宁彝族回族苗族自治县" + }, + { + "areaId": "520527", + "areaName": "赫章县" + } + ] + }, + { + "areaId": "520600", + "areaName": "铜仁市", + "counties": [ + { + "areaId": "520602", + "areaName": "碧江区" + }, + { + "areaId": "520603", + "areaName": "万山区" + }, + { + "areaId": "520621", + "areaName": "江口县" + }, + { + "areaId": "520622", + "areaName": "玉屏侗族自治县" + }, + { + "areaId": "520623", + "areaName": "石阡县" + }, + { + "areaId": "520624", + "areaName": "思南县" + }, + { + "areaId": "520625", + "areaName": "印江土家族苗族自治县" + }, + { + "areaId": "520626", + "areaName": "德江县" + }, + { + "areaId": "520627", + "areaName": "沿河土家族自治县" + }, + { + "areaId": "520628", + "areaName": "松桃苗族自治县" + } + ] + }, + { + "areaId": "522300", + "areaName": "黔西南布依族苗族自治州", + "counties": [ + { + "areaId": "522301", + "areaName": "兴义市" + }, + { + "areaId": "522322", + "areaName": "兴仁县" + }, + { + "areaId": "522323", + "areaName": "普安县" + }, + { + "areaId": "522324", + "areaName": "晴隆县" + }, + { + "areaId": "522325", + "areaName": "贞丰县" + }, + { + "areaId": "522326", + "areaName": "望谟县" + }, + { + "areaId": "522327", + "areaName": "册亨县" + }, + { + "areaId": "522328", + "areaName": "安龙县" + } + ] + }, + { + "areaId": "522600", + "areaName": "黔东南苗族侗族自治州", + "counties": [ + { + "areaId": "522601", + "areaName": "凯里市" + }, + { + "areaId": "522622", + "areaName": "黄平县" + }, + { + "areaId": "522623", + "areaName": "施秉县" + }, + { + "areaId": "522624", + "areaName": "三穗县" + }, + { + "areaId": "522625", + "areaName": "镇远县" + }, + { + "areaId": "522626", + "areaName": "岑巩县" + }, + { + "areaId": "522627", + "areaName": "天柱县" + }, + { + "areaId": "522628", + "areaName": "锦屏县" + }, + { + "areaId": "522629", + "areaName": "剑河县" + }, + { + "areaId": "522630", + "areaName": "台江县" + }, + { + "areaId": "522631", + "areaName": "黎平县" + }, + { + "areaId": "522632", + "areaName": "榕江县" + }, + { + "areaId": "522633", + "areaName": "从江县" + }, + { + "areaId": "522634", + "areaName": "雷山县" + }, + { + "areaId": "522635", + "areaName": "麻江县" + }, + { + "areaId": "522636", + "areaName": "丹寨县" + } + ] + }, + { + "areaId": "522700", + "areaName": "黔南布依族苗族自治州", + "counties": [ + { + "areaId": "522701", + "areaName": "都匀市" + }, + { + "areaId": "522702", + "areaName": "福泉市" + }, + { + "areaId": "522722", + "areaName": "荔波县" + }, + { + "areaId": "522723", + "areaName": "贵定县" + }, + { + "areaId": "522725", + "areaName": "瓮安县" + }, + { + "areaId": "522726", + "areaName": "独山县" + }, + { + "areaId": "522727", + "areaName": "平塘县" + }, + { + "areaId": "522728", + "areaName": "罗甸县" + }, + { + "areaId": "522729", + "areaName": "长顺县" + }, + { + "areaId": "522730", + "areaName": "龙里县" + }, + { + "areaId": "522731", + "areaName": "惠水县" + }, + { + "areaId": "522732", + "areaName": "三都水族自治县" + } + ] + } + ] + }, + { + "areaId": "530000", + "areaName": "云南省", + "cities": [ + { + "areaId": "530100", + "areaName": "昆明市", + "counties": [ + { + "areaId": "530102", + "areaName": "五华区" + }, + { + "areaId": "530103", + "areaName": "盘龙区" + }, + { + "areaId": "530111", + "areaName": "官渡区" + }, + { + "areaId": "530112", + "areaName": "西山区" + }, + { + "areaId": "530113", + "areaName": "东川区" + }, + { + "areaId": "530114", + "areaName": "呈贡区" + }, + { + "areaId": "530122", + "areaName": "晋宁县" + }, + { + "areaId": "530124", + "areaName": "富民县" + }, + { + "areaId": "530125", + "areaName": "宜良县" + }, + { + "areaId": "530126", + "areaName": "石林彝族自治县" + }, + { + "areaId": "530127", + "areaName": "嵩明县" + }, + { + "areaId": "530128", + "areaName": "禄劝彝族苗族自治县" + }, + { + "areaId": "530129", + "areaName": "寻甸回族彝族自治县" + }, + { + "areaId": "530181", + "areaName": "安宁市" + } + ] + }, + { + "areaId": "530300", + "areaName": "曲靖市", + "counties": [ + { + "areaId": "530302", + "areaName": "麒麟区" + }, + { + "areaId": "530321", + "areaName": "马龙县" + }, + { + "areaId": "530322", + "areaName": "陆良县" + }, + { + "areaId": "530323", + "areaName": "师宗县" + }, + { + "areaId": "530324", + "areaName": "罗平县" + }, + { + "areaId": "530325", + "areaName": "富源县" + }, + { + "areaId": "530326", + "areaName": "会泽县" + }, + { + "areaId": "530328", + "areaName": "沾益县" + }, + { + "areaId": "530381", + "areaName": "宣威市" + } + ] + }, + { + "areaId": "530400", + "areaName": "玉溪市", + "counties": [ + { + "areaId": "530402", + "areaName": "红塔区" + }, + { + "areaId": "530421", + "areaName": "江川县" + }, + { + "areaId": "530422", + "areaName": "澄江县" + }, + { + "areaId": "530423", + "areaName": "通海县" + }, + { + "areaId": "530424", + "areaName": "华宁县" + }, + { + "areaId": "530425", + "areaName": "易门县" + }, + { + "areaId": "530426", + "areaName": "峨山彝族自治县" + }, + { + "areaId": "530427", + "areaName": "新平彝族傣族自治县" + }, + { + "areaId": "530428", + "areaName": "元江哈尼族彝族傣族自治县" + } + ] + }, + { + "areaId": "530500", + "areaName": "保山市", + "counties": [ + { + "areaId": "530502", + "areaName": "隆阳区" + }, + { + "areaId": "530521", + "areaName": "施甸县" + }, + { + "areaId": "530522", + "areaName": "腾冲县" + }, + { + "areaId": "530523", + "areaName": "龙陵县" + }, + { + "areaId": "530524", + "areaName": "昌宁县" + } + ] + }, + { + "areaId": "530600", + "areaName": "昭通市", + "counties": [ + { + "areaId": "530602", + "areaName": "昭阳区" + }, + { + "areaId": "530621", + "areaName": "鲁甸县" + }, + { + "areaId": "530622", + "areaName": "巧家县" + }, + { + "areaId": "530623", + "areaName": "盐津县" + }, + { + "areaId": "530624", + "areaName": "大关县" + }, + { + "areaId": "530625", + "areaName": "永善县" + }, + { + "areaId": "530626", + "areaName": "绥江县" + }, + { + "areaId": "530627", + "areaName": "镇雄县" + }, + { + "areaId": "530628", + "areaName": "彝良县" + }, + { + "areaId": "530629", + "areaName": "威信县" + }, + { + "areaId": "530630", + "areaName": "水富县" + } + ] + }, + { + "areaId": "530700", + "areaName": "丽江市", + "counties": [ + { + "areaId": "530702", + "areaName": "古城区" + }, + { + "areaId": "530721", + "areaName": "玉龙纳西族自治县" + }, + { + "areaId": "530722", + "areaName": "永胜县" + }, + { + "areaId": "530723", + "areaName": "华坪县" + }, + { + "areaId": "530724", + "areaName": "宁蒗彝族自治县" + } + ] + }, + { + "areaId": "530800", + "areaName": "普洱市", + "counties": [ + { + "areaId": "530802", + "areaName": "思茅区" + }, + { + "areaId": "530821", + "areaName": "宁洱哈尼族彝族自治县" + }, + { + "areaId": "530822", + "areaName": "墨江哈尼族自治县" + }, + { + "areaId": "530823", + "areaName": "景东彝族自治县" + }, + { + "areaId": "530824", + "areaName": "景谷傣族彝族自治县" + }, + { + "areaId": "530825", + "areaName": "镇沅彝族哈尼族拉祜族自治县" + }, + { + "areaId": "530826", + "areaName": "江城哈尼族彝族自治县" + }, + { + "areaId": "530827", + "areaName": "孟连傣族拉祜族佤族自治县" + }, + { + "areaId": "530828", + "areaName": "澜沧拉祜族自治县" + }, + { + "areaId": "530829", + "areaName": "西盟佤族自治县" + } + ] + }, + { + "areaId": "530900", + "areaName": "临沧市", + "counties": [ + { + "areaId": "530902", + "areaName": "临翔区" + }, + { + "areaId": "530921", + "areaName": "凤庆县" + }, + { + "areaId": "530922", + "areaName": "云县" + }, + { + "areaId": "530923", + "areaName": "永德县" + }, + { + "areaId": "530924", + "areaName": "镇康县" + }, + { + "areaId": "530925", + "areaName": "双江拉祜族佤族布朗族傣族自治县" + }, + { + "areaId": "530926", + "areaName": "耿马傣族佤族自治县" + }, + { + "areaId": "530927", + "areaName": "沧源佤族自治县" + } + ] + }, + { + "areaId": "532300", + "areaName": "楚雄彝族自治州", + "counties": [ + { + "areaId": "532301", + "areaName": "楚雄市" + }, + { + "areaId": "532322", + "areaName": "双柏县" + }, + { + "areaId": "532323", + "areaName": "牟定县" + }, + { + "areaId": "532324", + "areaName": "南华县" + }, + { + "areaId": "532325", + "areaName": "姚安县" + }, + { + "areaId": "532326", + "areaName": "大姚县" + }, + { + "areaId": "532327", + "areaName": "永仁县" + }, + { + "areaId": "532328", + "areaName": "元谋县" + }, + { + "areaId": "532329", + "areaName": "武定县" + }, + { + "areaId": "532331", + "areaName": "禄丰县" + } + ] + }, + { + "areaId": "532500", + "areaName": "红河哈尼族彝族自治州", + "counties": [ + { + "areaId": "532501", + "areaName": "个旧市" + }, + { + "areaId": "532502", + "areaName": "开远市" + }, + { + "areaId": "532503", + "areaName": "蒙自市" + }, + { + "areaId": "532504", + "areaName": "弥勒市" + }, + { + "areaId": "532523", + "areaName": "屏边苗族自治县" + }, + { + "areaId": "532524", + "areaName": "建水县" + }, + { + "areaId": "532525", + "areaName": "石屏县" + }, + { + "areaId": "532527", + "areaName": "泸西县" + }, + { + "areaId": "532528", + "areaName": "元阳县" + }, + { + "areaId": "532529", + "areaName": "红河县" + }, + { + "areaId": "532530", + "areaName": "金平苗族瑶族傣族自治县" + }, + { + "areaId": "532531", + "areaName": "绿春县" + }, + { + "areaId": "532532", + "areaName": "河口瑶族自治县" + } + ] + }, + { + "areaId": "532600", + "areaName": "文山壮族苗族自治州", + "counties": [ + { + "areaId": "532601", + "areaName": "文山市" + }, + { + "areaId": "532622", + "areaName": "砚山县" + }, + { + "areaId": "532623", + "areaName": "西畴县" + }, + { + "areaId": "532624", + "areaName": "麻栗坡县" + }, + { + "areaId": "532625", + "areaName": "马关县" + }, + { + "areaId": "532626", + "areaName": "丘北县" + }, + { + "areaId": "532627", + "areaName": "广南县" + }, + { + "areaId": "532628", + "areaName": "富宁县" + } + ] + }, + { + "areaId": "532800", + "areaName": "西双版纳傣族自治州", + "counties": [ + { + "areaId": "532801", + "areaName": "景洪市" + }, + { + "areaId": "532822", + "areaName": "勐海县" + }, + { + "areaId": "532823", + "areaName": "勐腊县" + } + ] + }, + { + "areaId": "532900", + "areaName": "大理白族自治州", + "counties": [ + { + "areaId": "532901", + "areaName": "大理市" + }, + { + "areaId": "532922", + "areaName": "漾濞彝族自治县" + }, + { + "areaId": "532923", + "areaName": "祥云县" + }, + { + "areaId": "532924", + "areaName": "宾川县" + }, + { + "areaId": "532925", + "areaName": "弥渡县" + }, + { + "areaId": "532926", + "areaName": "南涧彝族自治县" + }, + { + "areaId": "532927", + "areaName": "巍山彝族回族自治县" + }, + { + "areaId": "532928", + "areaName": "永平县" + }, + { + "areaId": "532929", + "areaName": "云龙县" + }, + { + "areaId": "532930", + "areaName": "洱源县" + }, + { + "areaId": "532931", + "areaName": "剑川县" + }, + { + "areaId": "532932", + "areaName": "鹤庆县" + } + ] + }, + { + "areaId": "533100", + "areaName": "德宏傣族景颇族自治州", + "counties": [ + { + "areaId": "533102", + "areaName": "瑞丽市" + }, + { + "areaId": "533103", + "areaName": "芒市" + }, + { + "areaId": "533122", + "areaName": "梁河县" + }, + { + "areaId": "533123", + "areaName": "盈江县" + }, + { + "areaId": "533124", + "areaName": "陇川县" + } + ] + }, + { + "areaId": "533300", + "areaName": "怒江傈僳族自治州", + "counties": [ + { + "areaId": "533321", + "areaName": "泸水县" + }, + { + "areaId": "533323", + "areaName": "福贡县" + }, + { + "areaId": "533324", + "areaName": "贡山独龙族怒族自治县" + }, + { + "areaId": "533325", + "areaName": "兰坪白族普米族自治县" + } + ] + }, + { + "areaId": "533400", + "areaName": "迪庆藏族自治州", + "counties": [ + { + "areaId": "533421", + "areaName": "香格里拉县" + }, + { + "areaId": "533422", + "areaName": "德钦县" + }, + { + "areaId": "533423", + "areaName": "维西傈僳族自治县" + } + ] + } + ] + }, + { + "areaId": "540000", + "areaName": "西藏自治区", + "cities": [ + { + "areaId": "540100", + "areaName": "拉萨市", + "counties": [ + { + "areaId": "540102", + "areaName": "城关区" + }, + { + "areaId": "540121", + "areaName": "林周县" + }, + { + "areaId": "540122", + "areaName": "当雄县" + }, + { + "areaId": "540123", + "areaName": "尼木县" + }, + { + "areaId": "540124", + "areaName": "曲水县" + }, + { + "areaId": "540125", + "areaName": "堆龙德庆县" + }, + { + "areaId": "540126", + "areaName": "达孜县" + }, + { + "areaId": "540127", + "areaName": "墨竹工卡县" + } + ] + }, + { + "areaId": "542100", + "areaName": "昌都地区", + "counties": [ + { + "areaId": "542121", + "areaName": "昌都县" + }, + { + "areaId": "542122", + "areaName": "江达县" + }, + { + "areaId": "542123", + "areaName": "贡觉县" + }, + { + "areaId": "542124", + "areaName": "类乌齐县" + }, + { + "areaId": "542125", + "areaName": "丁青县" + }, + { + "areaId": "542126", + "areaName": "察雅县" + }, + { + "areaId": "542127", + "areaName": "八宿县" + }, + { + "areaId": "542128", + "areaName": "左贡县" + }, + { + "areaId": "542129", + "areaName": "芒康县" + }, + { + "areaId": "542132", + "areaName": "洛隆县" + }, + { + "areaId": "542133", + "areaName": "边坝县" + } + ] + }, + { + "areaId": "542200", + "areaName": "山南地区", + "counties": [ + { + "areaId": "542221", + "areaName": "乃东县" + }, + { + "areaId": "542222", + "areaName": "扎囊县" + }, + { + "areaId": "542223", + "areaName": "贡嘎县" + }, + { + "areaId": "542224", + "areaName": "桑日县" + }, + { + "areaId": "542225", + "areaName": "琼结县" + }, + { + "areaId": "542226", + "areaName": "曲松县" + }, + { + "areaId": "542227", + "areaName": "措美县" + }, + { + "areaId": "542228", + "areaName": "洛扎县" + }, + { + "areaId": "542229", + "areaName": "加查县" + }, + { + "areaId": "542231", + "areaName": "隆子县" + }, + { + "areaId": "542232", + "areaName": "错那县" + }, + { + "areaId": "542233", + "areaName": "浪卡子县" + } + ] + }, + { + "areaId": "542300", + "areaName": "日喀则地区", + "counties": [ + { + "areaId": "542301", + "areaName": "日喀则市" + }, + { + "areaId": "542322", + "areaName": "南木林县" + }, + { + "areaId": "542323", + "areaName": "江孜县" + }, + { + "areaId": "542324", + "areaName": "定日县" + }, + { + "areaId": "542325", + "areaName": "萨迦县" + }, + { + "areaId": "542326", + "areaName": "拉孜县" + }, + { + "areaId": "542327", + "areaName": "昂仁县" + }, + { + "areaId": "542328", + "areaName": "谢通门县" + }, + { + "areaId": "542329", + "areaName": "白朗县" + }, + { + "areaId": "542330", + "areaName": "仁布县" + }, + { + "areaId": "542331", + "areaName": "康马县" + }, + { + "areaId": "542332", + "areaName": "定结县" + }, + { + "areaId": "542333", + "areaName": "仲巴县" + }, + { + "areaId": "542334", + "areaName": "亚东县" + }, + { + "areaId": "542335", + "areaName": "吉隆县" + }, + { + "areaId": "542336", + "areaName": "聂拉木县" + }, + { + "areaId": "542337", + "areaName": "萨嘎县" + }, + { + "areaId": "542338", + "areaName": "岗巴县" + } + ] + }, + { + "areaId": "542400", + "areaName": "那曲地区", + "counties": [ + { + "areaId": "542421", + "areaName": "那曲县" + }, + { + "areaId": "542422", + "areaName": "嘉黎县" + }, + { + "areaId": "542423", + "areaName": "比如县" + }, + { + "areaId": "542424", + "areaName": "聂荣县" + }, + { + "areaId": "542425", + "areaName": "安多县" + }, + { + "areaId": "542426", + "areaName": "申扎县" + }, + { + "areaId": "542427", + "areaName": "索县" + }, + { + "areaId": "542428", + "areaName": "班戈县" + }, + { + "areaId": "542429", + "areaName": "巴青县" + }, + { + "areaId": "542430", + "areaName": "尼玛县" + }, + { + "areaId": "542431", + "areaName": "双湖县" + } + ] + }, + { + "areaId": "542500", + "areaName": "阿里地区", + "counties": [ + { + "areaId": "542521", + "areaName": "普兰县" + }, + { + "areaId": "542522", + "areaName": "札达县" + }, + { + "areaId": "542523", + "areaName": "噶尔县" + }, + { + "areaId": "542524", + "areaName": "日土县" + }, + { + "areaId": "542525", + "areaName": "革吉县" + }, + { + "areaId": "542526", + "areaName": "改则县" + }, + { + "areaId": "542527", + "areaName": "措勤县" + } + ] + }, + { + "areaId": "542600", + "areaName": "林芝地区", + "counties": [ + { + "areaId": "542621", + "areaName": "林芝县" + }, + { + "areaId": "542622", + "areaName": "工布江达县" + }, + { + "areaId": "542623", + "areaName": "米林县" + }, + { + "areaId": "542624", + "areaName": "墨脱县" + }, + { + "areaId": "542625", + "areaName": "波密县" + }, + { + "areaId": "542626", + "areaName": "察隅县" + }, + { + "areaId": "542627", + "areaName": "朗县" + } + ] + } + ] + }, + { + "areaId": "610000", + "areaName": "陕西省", + "cities": [ + { + "areaId": "610100", + "areaName": "西安市", + "counties": [ + { + "areaId": "610102", + "areaName": "新城区" + }, + { + "areaId": "610103", + "areaName": "碑林区" + }, + { + "areaId": "610104", + "areaName": "莲湖区" + }, + { + "areaId": "610111", + "areaName": "灞桥区" + }, + { + "areaId": "610112", + "areaName": "未央区" + }, + { + "areaId": "610113", + "areaName": "雁塔区" + }, + { + "areaId": "610114", + "areaName": "阎良区" + }, + { + "areaId": "610115", + "areaName": "临潼区" + }, + { + "areaId": "610116", + "areaName": "长安区" + }, + { + "areaId": "610122", + "areaName": "蓝田县" + }, + { + "areaId": "610124", + "areaName": "周至县" + }, + { + "areaId": "610125", + "areaName": "户县" + }, + { + "areaId": "610126", + "areaName": "高陵县" + } + ] + }, + { + "areaId": "610200", + "areaName": "铜川市", + "counties": [ + { + "areaId": "610202", + "areaName": "王益区" + }, + { + "areaId": "610203", + "areaName": "印台区" + }, + { + "areaId": "610204", + "areaName": "耀州区" + }, + { + "areaId": "610222", + "areaName": "宜君县" + } + ] + }, + { + "areaId": "610300", + "areaName": "宝鸡市", + "counties": [ + { + "areaId": "610302", + "areaName": "渭滨区" + }, + { + "areaId": "610303", + "areaName": "金台区" + }, + { + "areaId": "610304", + "areaName": "陈仓区" + }, + { + "areaId": "610322", + "areaName": "凤翔县" + }, + { + "areaId": "610323", + "areaName": "岐山县" + }, + { + "areaId": "610324", + "areaName": "扶风县" + }, + { + "areaId": "610326", + "areaName": "眉县" + }, + { + "areaId": "610327", + "areaName": "陇县" + }, + { + "areaId": "610328", + "areaName": "千阳县" + }, + { + "areaId": "610329", + "areaName": "麟游县" + }, + { + "areaId": "610330", + "areaName": "凤县" + }, + { + "areaId": "610331", + "areaName": "太白县" + } + ] + }, + { + "areaId": "610400", + "areaName": "咸阳市", + "counties": [ + { + "areaId": "610402", + "areaName": "秦都区" + }, + { + "areaId": "610403", + "areaName": "杨陵区" + }, + { + "areaId": "610404", + "areaName": "渭城区" + }, + { + "areaId": "610422", + "areaName": "三原县" + }, + { + "areaId": "610423", + "areaName": "泾阳县" + }, + { + "areaId": "610424", + "areaName": "乾县" + }, + { + "areaId": "610425", + "areaName": "礼泉县" + }, + { + "areaId": "610426", + "areaName": "永寿县" + }, + { + "areaId": "610427", + "areaName": "彬县" + }, + { + "areaId": "610428", + "areaName": "长武县" + }, + { + "areaId": "610429", + "areaName": "旬邑县" + }, + { + "areaId": "610430", + "areaName": "淳化县" + }, + { + "areaId": "610431", + "areaName": "武功县" + }, + { + "areaId": "610481", + "areaName": "兴平市" + } + ] + }, + { + "areaId": "610500", + "areaName": "渭南市", + "counties": [ + { + "areaId": "610502", + "areaName": "临渭区" + }, + { + "areaId": "610521", + "areaName": "华县" + }, + { + "areaId": "610522", + "areaName": "潼关县" + }, + { + "areaId": "610523", + "areaName": "大荔县" + }, + { + "areaId": "610524", + "areaName": "合阳县" + }, + { + "areaId": "610525", + "areaName": "澄城县" + }, + { + "areaId": "610526", + "areaName": "蒲城县" + }, + { + "areaId": "610527", + "areaName": "白水县" + }, + { + "areaId": "610528", + "areaName": "富平县" + }, + { + "areaId": "610581", + "areaName": "韩城市" + }, + { + "areaId": "610582", + "areaName": "华阴市" + } + ] + }, + { + "areaId": "610600", + "areaName": "延安市", + "counties": [ + { + "areaId": "610602", + "areaName": "宝塔区" + }, + { + "areaId": "610621", + "areaName": "延长县" + }, + { + "areaId": "610622", + "areaName": "延川县" + }, + { + "areaId": "610623", + "areaName": "子长县" + }, + { + "areaId": "610624", + "areaName": "安塞县" + }, + { + "areaId": "610625", + "areaName": "志丹县" + }, + { + "areaId": "610626", + "areaName": "吴起县" + }, + { + "areaId": "610627", + "areaName": "甘泉县" + }, + { + "areaId": "610628", + "areaName": "富县" + }, + { + "areaId": "610629", + "areaName": "洛川县" + }, + { + "areaId": "610630", + "areaName": "宜川县" + }, + { + "areaId": "610631", + "areaName": "黄龙县" + }, + { + "areaId": "610632", + "areaName": "黄陵县" + } + ] + }, + { + "areaId": "610700", + "areaName": "汉中市", + "counties": [ + { + "areaId": "610702", + "areaName": "汉台区" + }, + { + "areaId": "610721", + "areaName": "南郑县" + }, + { + "areaId": "610722", + "areaName": "城固县" + }, + { + "areaId": "610723", + "areaName": "洋县" + }, + { + "areaId": "610724", + "areaName": "西乡县" + }, + { + "areaId": "610725", + "areaName": "勉县" + }, + { + "areaId": "610726", + "areaName": "宁强县" + }, + { + "areaId": "610727", + "areaName": "略阳县" + }, + { + "areaId": "610728", + "areaName": "镇巴县" + }, + { + "areaId": "610729", + "areaName": "留坝县" + }, + { + "areaId": "610730", + "areaName": "佛坪县" + } + ] + }, + { + "areaId": "610800", + "areaName": "榆林市", + "counties": [ + { + "areaId": "610802", + "areaName": "榆阳区" + }, + { + "areaId": "610821", + "areaName": "神木县" + }, + { + "areaId": "610822", + "areaName": "府谷县" + }, + { + "areaId": "610823", + "areaName": "横山县" + }, + { + "areaId": "610824", + "areaName": "靖边县" + }, + { + "areaId": "610825", + "areaName": "定边县" + }, + { + "areaId": "610826", + "areaName": "绥德县" + }, + { + "areaId": "610827", + "areaName": "米脂县" + }, + { + "areaId": "610828", + "areaName": "佳县" + }, + { + "areaId": "610829", + "areaName": "吴堡县" + }, + { + "areaId": "610830", + "areaName": "清涧县" + }, + { + "areaId": "610831", + "areaName": "子洲县" + } + ] + }, + { + "areaId": "610900", + "areaName": "安康市", + "counties": [ + { + "areaId": "610902", + "areaName": "汉滨区" + }, + { + "areaId": "610921", + "areaName": "汉阴县" + }, + { + "areaId": "610922", + "areaName": "石泉县" + }, + { + "areaId": "610923", + "areaName": "宁陕县" + }, + { + "areaId": "610924", + "areaName": "紫阳县" + }, + { + "areaId": "610925", + "areaName": "岚皋县" + }, + { + "areaId": "610926", + "areaName": "平利县" + }, + { + "areaId": "610927", + "areaName": "镇坪县" + }, + { + "areaId": "610928", + "areaName": "旬阳县" + }, + { + "areaId": "610929", + "areaName": "白河县" + } + ] + }, + { + "areaId": "611000", + "areaName": "商洛市", + "counties": [ + { + "areaId": "611002", + "areaName": "商州区" + }, + { + "areaId": "611021", + "areaName": "洛南县" + }, + { + "areaId": "611022", + "areaName": "丹凤县" + }, + { + "areaId": "611023", + "areaName": "商南县" + }, + { + "areaId": "611024", + "areaName": "山阳县" + }, + { + "areaId": "611025", + "areaName": "镇安县" + }, + { + "areaId": "611026", + "areaName": "柞水县" + } + ] + } + ] + }, + { + "areaId": "620000", + "areaName": "甘肃省", + "cities": [ + { + "areaId": "620100", + "areaName": "兰州市", + "counties": [ + { + "areaId": "620102", + "areaName": "城关区" + }, + { + "areaId": "620103", + "areaName": "七里河区" + }, + { + "areaId": "620104", + "areaName": "西固区" + }, + { + "areaId": "620105", + "areaName": "安宁区" + }, + { + "areaId": "620111", + "areaName": "红古区" + }, + { + "areaId": "620121", + "areaName": "永登县" + }, + { + "areaId": "620122", + "areaName": "皋兰县" + }, + { + "areaId": "620123", + "areaName": "榆中县" + } + ] + }, + { + "areaId": "620200", + "areaName": "嘉峪关市", + "counties": [ + { + "areaId": "620201100", + "areaName": "新城镇" + }, + { + "areaId": "620201101", + "areaName": "峪泉镇" + }, + { + "areaId": "620201102", + "areaName": "文殊镇" + }, + { + "areaId": "620201401", + "areaName": "雄关区" + }, + { + "areaId": "620201402", + "areaName": "镜铁区" + }, + { + "areaId": "620201403", + "areaName": "长城区" + } + ] + }, + { + "areaId": "620300", + "areaName": "金昌市", + "counties": [ + { + "areaId": "620302", + "areaName": "金川区" + }, + { + "areaId": "620321", + "areaName": "永昌县" + } + ] + }, + { + "areaId": "620400", + "areaName": "白银市", + "counties": [ + { + "areaId": "620402", + "areaName": "白银区" + }, + { + "areaId": "620403", + "areaName": "平川区" + }, + { + "areaId": "620421", + "areaName": "靖远县" + }, + { + "areaId": "620422", + "areaName": "会宁县" + }, + { + "areaId": "620423", + "areaName": "景泰县" + } + ] + }, + { + "areaId": "620500", + "areaName": "天水市", + "counties": [ + { + "areaId": "620502", + "areaName": "秦州区" + }, + { + "areaId": "620503", + "areaName": "麦积区" + }, + { + "areaId": "620521", + "areaName": "清水县" + }, + { + "areaId": "620522", + "areaName": "秦安县" + }, + { + "areaId": "620523", + "areaName": "甘谷县" + }, + { + "areaId": "620524", + "areaName": "武山县" + }, + { + "areaId": "620525", + "areaName": "张家川回族自治县" + } + ] + }, + { + "areaId": "620600", + "areaName": "武威市", + "counties": [ + { + "areaId": "620602", + "areaName": "凉州区" + }, + { + "areaId": "620621", + "areaName": "民勤县" + }, + { + "areaId": "620622", + "areaName": "古浪县" + }, + { + "areaId": "620623", + "areaName": "天祝藏族自治县" + } + ] + }, + { + "areaId": "620700", + "areaName": "张掖市", + "counties": [ + { + "areaId": "620702", + "areaName": "甘州区" + }, + { + "areaId": "620721", + "areaName": "肃南裕固族自治县" + }, + { + "areaId": "620722", + "areaName": "民乐县" + }, + { + "areaId": "620723", + "areaName": "临泽县" + }, + { + "areaId": "620724", + "areaName": "高台县" + }, + { + "areaId": "620725", + "areaName": "山丹县" + } + ] + }, + { + "areaId": "620800", + "areaName": "平凉市", + "counties": [ + { + "areaId": "620802", + "areaName": "崆峒区" + }, + { + "areaId": "620821", + "areaName": "泾川县" + }, + { + "areaId": "620822", + "areaName": "灵台县" + }, + { + "areaId": "620823", + "areaName": "崇信县" + }, + { + "areaId": "620824", + "areaName": "华亭县" + }, + { + "areaId": "620825", + "areaName": "庄浪县" + }, + { + "areaId": "620826", + "areaName": "静宁县" + } + ] + }, + { + "areaId": "620900", + "areaName": "酒泉市", + "counties": [ + { + "areaId": "620902", + "areaName": "肃州区" + }, + { + "areaId": "620921", + "areaName": "金塔县" + }, + { + "areaId": "620922", + "areaName": "瓜州县" + }, + { + "areaId": "620923", + "areaName": "肃北蒙古族自治县" + }, + { + "areaId": "620924", + "areaName": "阿克塞哈萨克族自治县" + }, + { + "areaId": "620981", + "areaName": "玉门市" + }, + { + "areaId": "620982", + "areaName": "敦煌市" + } + ] + }, + { + "areaId": "621000", + "areaName": "庆阳市", + "counties": [ + { + "areaId": "621002", + "areaName": "西峰区" + }, + { + "areaId": "621021", + "areaName": "庆城县" + }, + { + "areaId": "621022", + "areaName": "环县" + }, + { + "areaId": "621023", + "areaName": "华池县" + }, + { + "areaId": "621024", + "areaName": "合水县" + }, + { + "areaId": "621025", + "areaName": "正宁县" + }, + { + "areaId": "621026", + "areaName": "宁县" + }, + { + "areaId": "621027", + "areaName": "镇原县" + } + ] + }, + { + "areaId": "621100", + "areaName": "定西市", + "counties": [ + { + "areaId": "621102", + "areaName": "安定区" + }, + { + "areaId": "621121", + "areaName": "通渭县" + }, + { + "areaId": "621122", + "areaName": "陇西县" + }, + { + "areaId": "621123", + "areaName": "渭源县" + }, + { + "areaId": "621124", + "areaName": "临洮县" + }, + { + "areaId": "621125", + "areaName": "漳县" + }, + { + "areaId": "621126", + "areaName": "岷县" + } + ] + }, + { + "areaId": "621200", + "areaName": "陇南市", + "counties": [ + { + "areaId": "621202", + "areaName": "武都区" + }, + { + "areaId": "621221", + "areaName": "成县" + }, + { + "areaId": "621222", + "areaName": "文县" + }, + { + "areaId": "621223", + "areaName": "宕昌县" + }, + { + "areaId": "621224", + "areaName": "康县" + }, + { + "areaId": "621225", + "areaName": "西和县" + }, + { + "areaId": "621226", + "areaName": "礼县" + }, + { + "areaId": "621227", + "areaName": "徽县" + }, + { + "areaId": "621228", + "areaName": "两当县" + } + ] + }, + { + "areaId": "622900", + "areaName": "临夏回族自治州", + "counties": [ + { + "areaId": "622901", + "areaName": "临夏市" + }, + { + "areaId": "622921", + "areaName": "临夏县" + }, + { + "areaId": "622922", + "areaName": "康乐县" + }, + { + "areaId": "622923", + "areaName": "永靖县" + }, + { + "areaId": "622924", + "areaName": "广河县" + }, + { + "areaId": "622925", + "areaName": "和政县" + }, + { + "areaId": "622926", + "areaName": "东乡族自治县" + }, + { + "areaId": "622927", + "areaName": "积石山保安族东乡族撒拉族自治县" + } + ] + }, + { + "areaId": "623000", + "areaName": "甘南藏族自治州", + "counties": [ + { + "areaId": "623001", + "areaName": "合作市" + }, + { + "areaId": "623021", + "areaName": "临潭县" + }, + { + "areaId": "623022", + "areaName": "卓尼县" + }, + { + "areaId": "623023", + "areaName": "舟曲县" + }, + { + "areaId": "623024", + "areaName": "迭部县" + }, + { + "areaId": "623025", + "areaName": "玛曲县" + }, + { + "areaId": "623026", + "areaName": "碌曲县" + }, + { + "areaId": "623027", + "areaName": "夏河县" + } + ] + } + ] + }, + { + "areaId": "630000", + "areaName": "青海省", + "cities": [ + { + "areaId": "630100", + "areaName": "西宁市", + "counties": [ + { + "areaId": "630102", + "areaName": "城东区" + }, + { + "areaId": "630103", + "areaName": "城中区" + }, + { + "areaId": "630104", + "areaName": "城西区" + }, + { + "areaId": "630105", + "areaName": "城北区" + }, + { + "areaId": "630121", + "areaName": "大通回族土族自治县" + }, + { + "areaId": "630122", + "areaName": "湟中县" + }, + { + "areaId": "630123", + "areaName": "湟源县" + } + ] + }, + { + "areaId": "630200", + "areaName": "海东市", + "counties": [ + { + "areaId": "630202", + "areaName": "乐都区" + }, + { + "areaId": "630221", + "areaName": "平安县" + }, + { + "areaId": "630222", + "areaName": "民和回族土族自治县" + }, + { + "areaId": "630223", + "areaName": "互助土族自治县" + }, + { + "areaId": "630224", + "areaName": "化隆回族自治县" + }, + { + "areaId": "630225", + "areaName": "循化撒拉族自治县" + } + ] + }, + { + "areaId": "632200", + "areaName": "海北藏族自治州", + "counties": [ + { + "areaId": "632221", + "areaName": "门源回族自治县" + }, + { + "areaId": "632222", + "areaName": "祁连县" + }, + { + "areaId": "632223", + "areaName": "海晏县" + }, + { + "areaId": "632224", + "areaName": "刚察县" + } + ] + }, + { + "areaId": "632300", + "areaName": "黄南藏族自治州", + "counties": [ + { + "areaId": "632321", + "areaName": "同仁县" + }, + { + "areaId": "632322", + "areaName": "尖扎县" + }, + { + "areaId": "632323", + "areaName": "泽库县" + }, + { + "areaId": "632324", + "areaName": "河南蒙古族自治县" + } + ] + }, + { + "areaId": "632500", + "areaName": "海南藏族自治州", + "counties": [ + { + "areaId": "632521", + "areaName": "共和县" + }, + { + "areaId": "632522", + "areaName": "同德县" + }, + { + "areaId": "632523", + "areaName": "贵德县" + }, + { + "areaId": "632524", + "areaName": "兴海县" + }, + { + "areaId": "632525", + "areaName": "贵南县" + } + ] + }, + { + "areaId": "632600", + "areaName": "果洛藏族自治州", + "counties": [ + { + "areaId": "632621", + "areaName": "玛沁县" + }, + { + "areaId": "632622", + "areaName": "班玛县" + }, + { + "areaId": "632623", + "areaName": "甘德县" + }, + { + "areaId": "632624", + "areaName": "达日县" + }, + { + "areaId": "632625", + "areaName": "久治县" + }, + { + "areaId": "632626", + "areaName": "玛多县" + } + ] + }, + { + "areaId": "632700", + "areaName": "玉树藏族自治州", + "counties": [ + { + "areaId": "632701", + "areaName": "玉树市" + }, + { + "areaId": "632722", + "areaName": "杂多县" + }, + { + "areaId": "632723", + "areaName": "称多县" + }, + { + "areaId": "632724", + "areaName": "治多县" + }, + { + "areaId": "632725", + "areaName": "囊谦县" + }, + { + "areaId": "632726", + "areaName": "曲麻莱县" + } + ] + }, + { + "areaId": "632800", + "areaName": "海西蒙古族藏族自治州", + "counties": [ + { + "areaId": "632801", + "areaName": "格尔木市" + }, + { + "areaId": "632802", + "areaName": "德令哈市" + }, + { + "areaId": "632821", + "areaName": "乌兰县" + }, + { + "areaId": "632822", + "areaName": "都兰县" + }, + { + "areaId": "632823", + "areaName": "天峻县" + } + ] + } + ] + }, + { + "areaId": "640000", + "areaName": "宁夏回族自治区", + "cities": [ + { + "areaId": "640100", + "areaName": "银川市", + "counties": [ + { + "areaId": "640104", + "areaName": "兴庆区" + }, + { + "areaId": "640105", + "areaName": "西夏区" + }, + { + "areaId": "640106", + "areaName": "金凤区" + }, + { + "areaId": "640121", + "areaName": "永宁县" + }, + { + "areaId": "640122", + "areaName": "贺兰县" + }, + { + "areaId": "640181", + "areaName": "灵武市" + } + ] + }, + { + "areaId": "640200", + "areaName": "石嘴山市", + "counties": [ + { + "areaId": "640202", + "areaName": "大武口区" + }, + { + "areaId": "640205", + "areaName": "惠农区" + }, + { + "areaId": "640221", + "areaName": "平罗县" + } + ] + }, + { + "areaId": "640300", + "areaName": "吴忠市", + "counties": [ + { + "areaId": "640302", + "areaName": "利通区" + }, + { + "areaId": "640303", + "areaName": "红寺堡区" + }, + { + "areaId": "640323", + "areaName": "盐池县" + }, + { + "areaId": "640324", + "areaName": "同心县" + }, + { + "areaId": "640381", + "areaName": "青铜峡市" + } + ] + }, + { + "areaId": "640400", + "areaName": "固原市", + "counties": [ + { + "areaId": "640402", + "areaName": "原州区" + }, + { + "areaId": "640422", + "areaName": "西吉县" + }, + { + "areaId": "640423", + "areaName": "隆德县" + }, + { + "areaId": "640424", + "areaName": "泾源县" + }, + { + "areaId": "640425", + "areaName": "彭阳县" + } + ] + }, + { + "areaId": "640500", + "areaName": "中卫市", + "counties": [ + { + "areaId": "640502", + "areaName": "沙坡头区" + }, + { + "areaId": "640521", + "areaName": "中宁县" + }, + { + "areaId": "640522", + "areaName": "海原县" + } + ] + } + ] + }, + { + "areaId": "650000", + "areaName": "新疆维吾尔自治区", + "cities": [ + { + "areaId": "650100", + "areaName": "乌鲁木齐市", + "counties": [ + { + "areaId": "650102", + "areaName": "天山区" + }, + { + "areaId": "650103", + "areaName": "沙依巴克区" + }, + { + "areaId": "650104", + "areaName": "新市区" + }, + { + "areaId": "650105", + "areaName": "水磨沟区" + }, + { + "areaId": "650106", + "areaName": "头屯河区" + }, + { + "areaId": "650107", + "areaName": "达坂城区" + }, + { + "areaId": "650109", + "areaName": "米东区" + }, + { + "areaId": "650121", + "areaName": "乌鲁木齐县" + } + ] + }, + { + "areaId": "650200", + "areaName": "克拉玛依市", + "counties": [ + { + "areaId": "650202", + "areaName": "独山子区" + }, + { + "areaId": "650203", + "areaName": "克拉玛依区" + }, + { + "areaId": "650204", + "areaName": "白碱滩区" + }, + { + "areaId": "650205", + "areaName": "乌尔禾区" + } + ] + }, + { + "areaId": "652100", + "areaName": "吐鲁番地区", + "counties": [ + { + "areaId": "652101", + "areaName": "吐鲁番市" + }, + { + "areaId": "652122", + "areaName": "鄯善县" + }, + { + "areaId": "652123", + "areaName": "托克逊县" + } + ] + }, + { + "areaId": "652200", + "areaName": "哈密地区", + "counties": [ + { + "areaId": "652201", + "areaName": "哈密市" + }, + { + "areaId": "652222", + "areaName": "巴里坤哈萨克自治县" + }, + { + "areaId": "652223", + "areaName": "伊吾县" + } + ] + }, + { + "areaId": "652300", + "areaName": "昌吉回族自治州", + "counties": [ + { + "areaId": "652301", + "areaName": "昌吉市" + }, + { + "areaId": "652302", + "areaName": "阜康市" + }, + { + "areaId": "652323", + "areaName": "呼图壁县" + }, + { + "areaId": "652324", + "areaName": "玛纳斯县" + }, + { + "areaId": "652325", + "areaName": "奇台县" + }, + { + "areaId": "652327", + "areaName": "吉木萨尔县" + }, + { + "areaId": "652328", + "areaName": "木垒哈萨克自治县" + } + ] + }, + { + "areaId": "652700", + "areaName": "博尔塔拉蒙古自治州", + "counties": [ + { + "areaId": "652701", + "areaName": "博乐市" + }, + { + "areaId": "652702", + "areaName": "阿拉山口市" + }, + { + "areaId": "652722", + "areaName": "精河县" + }, + { + "areaId": "652723", + "areaName": "温泉县" + } + ] + }, + { + "areaId": "652800", + "areaName": "巴音郭楞蒙古自治州", + "counties": [ + { + "areaId": "652801", + "areaName": "库尔勒市" + }, + { + "areaId": "652822", + "areaName": "轮台县" + }, + { + "areaId": "652823", + "areaName": "尉犁县" + }, + { + "areaId": "652824", + "areaName": "若羌县" + }, + { + "areaId": "652825", + "areaName": "且末县" + }, + { + "areaId": "652826", + "areaName": "焉耆回族自治县" + }, + { + "areaId": "652827", + "areaName": "和静县" + }, + { + "areaId": "652828", + "areaName": "和硕县" + }, + { + "areaId": "652829", + "areaName": "博湖县" + } + ] + }, + { + "areaId": "652900", + "areaName": "阿克苏地区", + "counties": [ + { + "areaId": "652901", + "areaName": "阿克苏市" + }, + { + "areaId": "652922", + "areaName": "温宿县" + }, + { + "areaId": "652923", + "areaName": "库车县" + }, + { + "areaId": "652924", + "areaName": "沙雅县" + }, + { + "areaId": "652925", + "areaName": "新和县" + }, + { + "areaId": "652926", + "areaName": "拜城县" + }, + { + "areaId": "652927", + "areaName": "乌什县" + }, + { + "areaId": "652928", + "areaName": "阿瓦提县" + }, + { + "areaId": "652929", + "areaName": "柯坪县" + } + ] + }, + { + "areaId": "653000", + "areaName": "克孜勒苏柯尔克孜自治州", + "counties": [ + { + "areaId": "653001", + "areaName": "阿图什市" + }, + { + "areaId": "653022", + "areaName": "阿克陶县" + }, + { + "areaId": "653023", + "areaName": "阿合奇县" + }, + { + "areaId": "653024", + "areaName": "乌恰县" + } + ] + }, + { + "areaId": "653100", + "areaName": "喀什地区", + "counties": [ + { + "areaId": "653101", + "areaName": "喀什市" + }, + { + "areaId": "653121", + "areaName": "疏附县" + }, + { + "areaId": "653122", + "areaName": "疏勒县" + }, + { + "areaId": "653123", + "areaName": "英吉沙县" + }, + { + "areaId": "653124", + "areaName": "泽普县" + }, + { + "areaId": "653125", + "areaName": "莎车县" + }, + { + "areaId": "653126", + "areaName": "叶城县" + }, + { + "areaId": "653127", + "areaName": "麦盖提县" + }, + { + "areaId": "653128", + "areaName": "岳普湖县" + }, + { + "areaId": "653129", + "areaName": "伽师县" + }, + { + "areaId": "653130", + "areaName": "巴楚县" + }, + { + "areaId": "653131", + "areaName": "塔什库尔干塔吉克自治县" + } + ] + }, + { + "areaId": "653200", + "areaName": "和田地区", + "counties": [ + { + "areaId": "653201", + "areaName": "和田市" + }, + { + "areaId": "653221", + "areaName": "和田县" + }, + { + "areaId": "653222", + "areaName": "墨玉县" + }, + { + "areaId": "653223", + "areaName": "皮山县" + }, + { + "areaId": "653224", + "areaName": "洛浦县" + }, + { + "areaId": "653225", + "areaName": "策勒县" + }, + { + "areaId": "653226", + "areaName": "于田县" + }, + { + "areaId": "653227", + "areaName": "民丰县" + } + ] + }, + { + "areaId": "654000", + "areaName": "伊犁哈萨克自治州", + "counties": [ + { + "areaId": "654002", + "areaName": "伊宁市" + }, + { + "areaId": "654003", + "areaName": "奎屯市" + }, + { + "areaId": "654021", + "areaName": "伊宁县" + }, + { + "areaId": "654022", + "areaName": "察布查尔锡伯自治县" + }, + { + "areaId": "654023", + "areaName": "霍城县" + }, + { + "areaId": "654024", + "areaName": "巩留县" + }, + { + "areaId": "654025", + "areaName": "新源县" + }, + { + "areaId": "654026", + "areaName": "昭苏县" + }, + { + "areaId": "654027", + "areaName": "特克斯县" + }, + { + "areaId": "654028", + "areaName": "尼勒克县" + } + ] + }, + { + "areaId": "654200", + "areaName": "塔城地区", + "counties": [ + { + "areaId": "654201", + "areaName": "塔城市" + }, + { + "areaId": "654202", + "areaName": "乌苏市" + }, + { + "areaId": "654221", + "areaName": "额敏县" + }, + { + "areaId": "654223", + "areaName": "沙湾县" + }, + { + "areaId": "654224", + "areaName": "托里县" + }, + { + "areaId": "654225", + "areaName": "裕民县" + }, + { + "areaId": "654226", + "areaName": "和布克赛尔蒙古自治县" + } + ] + }, + { + "areaId": "654300", + "areaName": "阿勒泰地区", + "counties": [ + { + "areaId": "654301", + "areaName": "阿勒泰市" + }, + { + "areaId": "654321", + "areaName": "布尔津县" + }, + { + "areaId": "654322", + "areaName": "富蕴县" + }, + { + "areaId": "654323", + "areaName": "福海县" + }, + { + "areaId": "654324", + "areaName": "哈巴河县" + }, + { + "areaId": "654325", + "areaName": "青河县" + }, + { + "areaId": "654326", + "areaName": "吉木乃县" + } + ] + }, + { + "areaId": "659000", + "areaName": "自治区直辖县级行政区划", + "counties": [ + { + "areaId": "659001", + "areaName": "石河子市" + }, + { + "areaId": "659002", + "areaName": "阿拉尔市" + }, + { + "areaId": "659003", + "areaName": "图木舒克市" + }, + { + "areaId": "659004", + "areaName": "五家渠市" + } + ] + } + ] + }, + { + "areaId": "700000", + "areaName": "中国", + "cities": [ + { + "areaId": "800000", + "areaName": "台湾", + "counties": [ + { + "areaId": "800001", + "areaName": "台北市" + }, + { + "areaId": "800002", + "areaName": "高雄市" + }, + { + "areaId": "800003", + "areaName": "台北县" + }, + { + "areaId": "800004", + "areaName": "桃园县" + }, + { + "areaId": "800005", + "areaName": "新竹县" + }, + { + "areaId": "800006", + "areaName": "苗栗县" + }, + { + "areaId": "800007", + "areaName": "台中县" + }, + { + "areaId": "800008", + "areaName": "彰化县" + }, + { + "areaId": "800009", + "areaName": "南投县" + }, + { + "areaId": "800010", + "areaName": "云林县" + }, + { + "areaId": "800011", + "areaName": "嘉义县" + }, + { + "areaId": "800012", + "areaName": "台南县" + }, + { + "areaId": "800013", + "areaName": "高雄县" + }, + { + "areaId": "800014", + "areaName": "屏东县" + }, + { + "areaId": "800015", + "areaName": "宜兰县" + }, + { + "areaId": "800016", + "areaName": "花莲县" + }, + { + "areaId": "800017", + "areaName": "台东县" + }, + { + "areaId": "800018", + "areaName": "澎湖县" + }, + { + "areaId": "800019", + "areaName": "基隆市" + }, + { + "areaId": "800020", + "areaName": "新竹市" + }, + { + "areaId": "800021", + "areaName": "台中市" + }, + { + "areaId": "800022", + "areaName": "嘉义市" + }, + { + "areaId": "800023", + "areaName": "台南市" + }, + { + "areaId": "800024", + "areaName": "其他" + } + ] + }, + { + "areaId": "810000", + "areaName": "香港", + "counties": [ + { + "areaId": "810001", + "areaName": "中西区" + }, + { + "areaId": "810002", + "areaName": "湾仔区" + }, + { + "areaId": "810003", + "areaName": "东区" + }, + { + "areaId": "810004", + "areaName": "南区" + }, + { + "areaId": "810005", + "areaName": "油尖旺区" + }, + { + "areaId": "810006", + "areaName": "深水埗区" + }, + { + "areaId": "810007", + "areaName": "九龙城区" + }, + { + "areaId": "810008", + "areaName": "黄大仙区" + }, + { + "areaId": "810009", + "areaName": "观塘区" + }, + { + "areaId": "810010", + "areaName": "荃湾区" + }, + { + "areaId": "810011", + "areaName": "屯门区" + }, + { + "areaId": "810012", + "areaName": "元朗区" + }, + { + "areaId": "810013", + "areaName": "北区" + }, + { + "areaId": "810014", + "areaName": "大埔区" + }, + { + "areaId": "810015", + "areaName": "西贡区" + }, + { + "areaId": "810016", + "areaName": "沙田区" + }, + { + "areaId": "810017", + "areaName": "葵青区" + }, + { + "areaId": "810018", + "areaName": "离岛区" + } + ] + }, + { + "areaId": "820000", + "areaName": "澳门", + "counties": [ + { + "areaId": "820001", + "areaName": "花地玛堂区" + }, + { + "areaId": "820002", + "areaName": "花王堂区" + }, + { + "areaId": "820003", + "areaName": "望德堂区" + }, + { + "areaId": "820004", + "areaName": "大堂区" + }, + { + "areaId": "820005", + "areaName": "风顺堂区" + }, + { + "areaId": "820006", + "areaName": "嘉模堂区" + }, + { + "areaId": "820007", + "areaName": "路凼填海区" + }, + { + "areaId": "820008", + "areaName": "圣方济各堂区" + } + ] + } + ] + } +] diff --git a/common/src/main/java/com/yunbao/common/CommonAppConfig.java b/common/src/main/java/com/yunbao/common/CommonAppConfig.java new file mode 100644 index 000000000..d21123f11 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/CommonAppConfig.java @@ -0,0 +1,703 @@ +package com.yunbao.common; + +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Environment; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.yunbao.common.bean.ConfigBean; +import com.yunbao.common.bean.FansMedalBean; +import com.yunbao.common.bean.LevelBean; +import com.yunbao.common.bean.UserBean; +import com.yunbao.common.bean.UserItemBean; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.interfaces.CommonCallback; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.SpUtil; +import com.yunbao.common.utils.WordUtil; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by cxf on 2017/8/4. + */ + +public class CommonAppConfig { + //域名 + public static final String HOST = getMetaDataString("SERVER_HOST"); + //是否使用谷歌支付 + public static final boolean IS_GOOGLE_PLAY = getMetaDataBoolean("IS_GOOGLE_PLAY"); + + //外部sd卡 + public static final String DCMI_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath(); + //内部存储 /data/data//files目录 + public static final String INNER_PATH = CommonAppContext.sInstance.getFilesDir().getAbsolutePath(); + //文件夹名字 + private static final String DIR_NAME = "yunbao"; + //保存视频的时候,在sd卡存储短视频的路径DCIM下 + public static final String VIDEO_PATH = DCMI_PATH + "/" + DIR_NAME + "/video/"; + public static final String VIDEO_RECORD_TEMP_PATH = VIDEO_PATH + "recordParts"; + //下载贴纸的时候保存的路径 /storage/emulated/0/DCIM/yunbao/tieZhi/ + public static final String VIDEO_TIE_ZHI_PATH = DCMI_PATH + "/" + DIR_NAME + "/tieZhi/"; + //解压的美颜模型地址 + public static String VIDEO_TIE_MODEl_PATH = ""; + //360贴纸名字 + public static final String TIEZHI_360_NAME = "sticker360"; + + //下载音乐的时候保存的路径 + public static final String MUSIC_PATH = DCMI_PATH + "/" + DIR_NAME + "/music/"; + //拍照时图片保存路径 + public static final String CAMERA_IMAGE_PATH = DCMI_PATH + "/" + DIR_NAME + "/camera/"; + //log保存路径 + public static final String LOG_PATH = DCMI_PATH + "/" + DIR_NAME + "/log/"; + public static final String GIF_PATH = INNER_PATH + "/gif/"; + //QQ登录是否与PC端互通 + public static final boolean QQ_LOGIN_WITH_PC = true; + //是否使用游戏 + public static final boolean GAME_ENABLE = true; + //是否上下滑动切换直播间 + public static final boolean LIVE_ROOM_SCROLL = false; + //直播sdk类型是否由后台控制的 + public static final boolean LIVE_SDK_CHANGED = true; + //使用指定的直播sdk类型 + public static final int LIVE_SDK_USED = Constants.LIVE_SDK_KSY; + private static CommonAppConfig sInstance; + + public static boolean isGetNewWrap = false;//是否获取到新的包裹礼物 + public static int alert_time = 1; + public static int alert_end_time = 1; + + + private CommonAppConfig() { + + } + + public static CommonAppConfig getInstance() { + if (sInstance == null) { + synchronized (CommonAppConfig.class) { + if (sInstance == null) { + sInstance = new CommonAppConfig(); + } + } + } + return sInstance; + } + + private String mUid; + private String mToken; + private ConfigBean mConfig; + private double mLng; + private double mLat; + private String mProvince;//省 + private String mCity;//市 + private String mDistrict;//区 + private UserBean mUserBean; + private String mVersion; + private boolean mLoginIM;//IM是否登录了 + private boolean mLaunched;//App是否启动了 + private String mJPushAppKey;//极光推送的AppKey + private List mUserItemList;//个人中心功能列表 + private SparseArray mLevelMap; + private SparseArray mAnchorLevelMap; + private SparseArray mAnchorFansMedalMap; + private String mGiftListJson; + private String mWrapListJson; + private String mTxMapAppKey;//腾讯定位,地图的AppKey + private String mTxMapAppSecret;//腾讯地图的AppSecret + private boolean mFrontGround; + private int mAppIconRes; + private String mAppName; + private Boolean mTiBeautyEnable;//是否使用萌颜 true使用萌颜 false 使用基础美颜 + + public String getUid() { + if (TextUtils.isEmpty(mUid)) { + String[] uidAndToken = SpUtil.getInstance() + .getMultiStringValue(new String[]{SpUtil.UID, SpUtil.TOKEN}); + if (uidAndToken != null) { + if (!TextUtils.isEmpty(uidAndToken[0]) && !TextUtils.isEmpty(uidAndToken[1])) { + mUid = uidAndToken[0]; + mToken = uidAndToken[1]; + } + } else { + return "-1"; + } + } + return mUid; + } + + public String getToken() { + return mToken; + } + + public String getCoinName() { + ConfigBean configBean = getConfig(); + if (configBean != null) { + return configBean.getCoinName(); + } + return Constants.DIAMONDS; + } + public String getGoldCoinName() { + ConfigBean configBean = getConfig(); + if (configBean != null) { + return configBean.getGoldCoinName(); + } + return Constants.GOLD_NAME; + } + + + public String getVotesName() { + ConfigBean configBean = getConfig(); + if (configBean != null) { + return configBean.getVotesName(); + } + return Constants.VOTES; + } + + public ConfigBean getConfig() { + if (mConfig == null) { + String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG); + if (!TextUtils.isEmpty(configString)) { + mConfig = JSON.parseObject(configString, ConfigBean.class); + } + } + return mConfig; + } + + public void getConfig(CommonCallback callback) { + if (callback == null) { + return; + } + ConfigBean configBean = getConfig(); + if (configBean != null) { + callback.callback(configBean); + } else { + CommonHttpUtil.getConfig(null,callback); + } + } + + public void setConfig(ConfigBean config) { + mConfig = config; + } + + /** + * 经度 + */ + public double getLng() { + if (mLng == 0) { + String lng = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_LNG); + if (!TextUtils.isEmpty(lng)) { + try { + mLng = Double.parseDouble(lng); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return mLng; + } + + /** + * 纬度 + */ + public double getLat() { + if (mLat == 0) { + String lat = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_LAT); + if (!TextUtils.isEmpty(lat)) { + try { + mLat = Double.parseDouble(lat); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return mLat; + } + + /** + * 省 + */ + public String getProvince() { + if (TextUtils.isEmpty(mProvince)) { + mProvince = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_PROVINCE); + } + return mProvince == null ? "" : mProvince; + } + + /** + * 市 + */ + public String getCity() { + if (TextUtils.isEmpty(mCity)) { + mCity = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_CITY); + } + return mCity == null ? "" : mCity; + } + + /** + * 区 + */ + public String getDistrict() { + if (TextUtils.isEmpty(mDistrict)) { + mDistrict = SpUtil.getInstance().getStringValue(SpUtil.LOCATION_DISTRICT); + } + return mDistrict == null ? "" : mDistrict; + } + + public void setUserBean(UserBean bean) { + mUserBean = bean; + } + + public UserBean getUserBean() { + if (mUserBean == null) { + String userBeanJson = SpUtil.getInstance().getStringValue(SpUtil.USER_INFO); + if (!TextUtils.isEmpty(userBeanJson)) { + mUserBean = JSON.parseObject(userBeanJson, UserBean.class); + } + } + return mUserBean; + } + + /** + * 设置萌颜是否可用 + */ + public void setTiBeautyEnable(boolean tiBeautyEnable) { + mTiBeautyEnable = tiBeautyEnable; + SpUtil.getInstance().setBooleanValue(SpUtil.TI_BEAUTY_ENABLE, tiBeautyEnable); + } + + public boolean isTiBeautyEnable() { + if (mTiBeautyEnable == null) { + mTiBeautyEnable = SpUtil.getInstance().getBooleanValue(SpUtil.TI_BEAUTY_ENABLE); + } + return mTiBeautyEnable; + } + + /** + * 设置登录信息 + */ + public void setLoginInfo(String uid, String token, boolean save) { + L.e("登录成功", "uid------>" + uid); + L.e("登录成功", "token------>" + token); + mUid = uid; + mToken = token; + if (save) { + Map map = new HashMap<>(); + map.put(SpUtil.UID, uid); + map.put(SpUtil.TOKEN, token); + SpUtil.getInstance().setMultiStringValue(map); + } + } + + /** + * 清除登录信息 + */ + public void clearLoginInfo() { + mUid = null; + mToken = null; + mLoginIM = false; + SpUtil.getInstance().removeValue( + SpUtil.UID, SpUtil.TOKEN, SpUtil.USER_INFO, SpUtil.IM_LOGIN + ); + } + + + /** + * 设置位置信息 + * + * @param lng 经度 + * @param lat 纬度 + * @param province 省 + * @param city 市 + */ + public void setLocationInfo(double lng, double lat, String province, String city, String district) { + mLng = lng; + mLat = lat; + mProvince = province; + mCity = city; + mDistrict = district; + Map map = new HashMap<>(); + map.put(SpUtil.LOCATION_LNG, String.valueOf(lng)); + map.put(SpUtil.LOCATION_LAT, String.valueOf(lat)); + map.put(SpUtil.LOCATION_PROVINCE, province); + map.put(SpUtil.LOCATION_CITY, city); + map.put(SpUtil.LOCATION_DISTRICT, district); + SpUtil.getInstance().setMultiStringValue(map); + } + + /** + * 清除定位信息 + */ + public void clearLocationInfo() { + mLng = 0; + mLat = 0; + mProvince = null; + mCity = null; + mDistrict = null; + SpUtil.getInstance().removeValue( + SpUtil.LOCATION_LNG, + SpUtil.LOCATION_LAT, + SpUtil.LOCATION_PROVINCE, + SpUtil.LOCATION_CITY, + SpUtil.LOCATION_DISTRICT); + + } + + + public boolean isLoginIM() { + return mLoginIM; + } + + public void setLoginIM(boolean loginIM) { + mLoginIM = loginIM; + } + + /** + * 获取版本号 + */ + public String getVersion() { + if (TextUtils.isEmpty(mVersion)) { + try { + PackageManager manager = CommonAppContext.sInstance.getPackageManager(); + PackageInfo info = manager.getPackageInfo(CommonAppContext.sInstance.getPackageName(), 0); + mVersion = info.versionName; + } catch (Exception e) { + e.printStackTrace(); + } + } + return mVersion; + } + + /** + * 获取App名称 + */ + public String getAppName() { + if (TextUtils.isEmpty(mAppName)) { + int res = CommonAppContext.sInstance.getResources().getIdentifier("app_name", "string", "myname.pdlive.shayu"); + mAppName = WordUtil.getString(res); + } + return mAppName; + } + + + + /** + * 获取App图标的资源id + */ + public int getAppIconRes() { + if (mAppIconRes == 0) { + mAppIconRes = CommonAppContext.sInstance.getResources().getIdentifier("ic_launcher", "mipmap", CommonAppContext.sInstance.getPackageName()); + } + return mAppIconRes; + } + + /** + * 获取MetaData中的极光AppKey + */ + public String getJPushAppKey() { + if (mJPushAppKey == null) { + mJPushAppKey = getMetaDataString("JPUSH_APPKEY"); + } + return mJPushAppKey; + } + + + /** + * 获取MetaData中的腾讯定位,地图的AppKey + * + * @return + */ + public String getTxMapAppKey() { + if (mTxMapAppKey == null) { + mTxMapAppKey = getMetaDataString("TencentMapSDK"); + } + return mTxMapAppKey; + } + + + /** + * 获取MetaData中的腾讯定位,地图的AppSecret + * + * @return + */ + public String getTxMapAppSecret() { + if (mTxMapAppSecret == null) { + mTxMapAppSecret = getMetaDataString("TencentMapAppSecret"); + } + return mTxMapAppSecret; + } + + + private static String getMetaDataString(String key) { + String res = null; + try { + ApplicationInfo appInfo = CommonAppContext.sInstance.getPackageManager().getApplicationInfo(CommonAppContext.sInstance.getPackageName(), PackageManager.GET_META_DATA); + res = appInfo.metaData.getString(key); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + Log.i("tag","url:"+res); + return res; + } + private static boolean getMetaDataBoolean(String key) { + boolean res = false; + try { + ApplicationInfo appInfo = CommonAppContext.sInstance.getPackageManager().getApplicationInfo(CommonAppContext.sInstance.getPackageName(), PackageManager.GET_META_DATA); + res = appInfo.metaData.getBoolean(key); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return res; + } + + + /** + * 个人中心功能列表 + */ + public List getUserItemList() { + if (mUserItemList == null || mUserItemList.size() == 0) { + String userBeanJson = SpUtil.getInstance().getStringValue(SpUtil.USER_INFO); + if (!TextUtils.isEmpty(userBeanJson)) { + JSONObject obj = JSON.parseObject(userBeanJson); + if (obj != null) { + setUserItemList(obj.getString("list")); + } + } + } + return mUserItemList; + } + + + public void setUserItemList(String listString) { + UserItemBean[][] arr = JSON.parseObject(listString, UserItemBean[][].class); + if (arr != null && arr.length > 0) { + List newList = new ArrayList<>(); + for (int i = 0, length1 = arr.length; i < length1; i++) { + for (int j = 0, length2 = arr[i].length; j < length2; j++) { + UserItemBean bean = arr[i][j]; + if (j == length2 - 1) { + if (i < length1 - 1) { + bean.setGroupLast(true); + } else { + bean.setAllLast(true); + } + } + newList.add(bean); + } + } + mUserItemList = newList; + } + } + + + /** + * 保存用户等级信息 + */ + public void setLevel(String levelJson) { + if (TextUtils.isEmpty(levelJson)) { + return; + } + List list = JSON.parseArray(levelJson, LevelBean.class); + if (list == null || list.size() == 0) { + return; + } + if (mLevelMap == null) { + mLevelMap = new SparseArray<>(); + } + mLevelMap.clear(); + for (LevelBean bean : list) { + mLevelMap.put(bean.getLevel(), bean); + } + } + + /** + * 保存主播等级信息 + */ + public void setAnchorLevel(String anchorLevelJson) { + if (TextUtils.isEmpty(anchorLevelJson)) { + return; + } + List list = JSON.parseArray(anchorLevelJson, LevelBean.class); + if (list == null || list.size() == 0) { + return; + } + if (mAnchorLevelMap == null) { + mAnchorLevelMap = new SparseArray<>(); + } + mAnchorLevelMap.clear(); + for (LevelBean bean : list) { + mAnchorLevelMap.put(bean.getLevel(), bean); + } + } + + /** + * 保存主播粉丝徽章信息 + */ + public void setAnchorFansMedal(String anchorMedalJson) { + if (TextUtils.isEmpty(anchorMedalJson)) { + return; + } + List list = JSON.parseArray(anchorMedalJson, FansMedalBean.class); + if (list == null || list.size() == 0) { + return; + } + if (mAnchorFansMedalMap == null) { + mAnchorFansMedalMap = new SparseArray<>(); + } + mAnchorFansMedalMap.clear(); + for (FansMedalBean bean : list) { + mAnchorFansMedalMap.put(bean.getLevel(), bean); + } + } + + /** + * 获取主播粉丝徽章信息 + */ + public FansMedalBean getAnchorFansMedal(int level) { + if (mAnchorFansMedalMap == null) { + String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG); + if (!TextUtils.isEmpty(configString)) { + JSONObject obj = JSON.parseObject(configString); + setAnchorFansMedal(obj.getString("levelfans")); + } + } + if (mAnchorFansMedalMap == null || mAnchorFansMedalMap.size() == 0) { + return null; + } + return mAnchorFansMedalMap.get(level); + } + + + /** + * 获取用户等级 + */ + public LevelBean getLevel(int level) { + if (mLevelMap == null) { + String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG); + if (!TextUtils.isEmpty(configString)) { + JSONObject obj = JSON.parseObject(configString); + setLevel(obj.getString("level")); + } + } + if (mLevelMap == null || mLevelMap.size() == 0) { + return null; + } + return mLevelMap.get(level); + } + + /** + * 获取主播等级 + */ + public LevelBean getAnchorLevel(int level) { + if (mAnchorLevelMap == null) { + String configString = SpUtil.getInstance().getStringValue(SpUtil.CONFIG); + if (!TextUtils.isEmpty(configString)) { + JSONObject obj = JSON.parseObject(configString); + setAnchorLevel(obj.getString("levelanchor")); + } + } + if (mAnchorLevelMap == null || mAnchorLevelMap.size() == 0) { + return null; + } + return mAnchorLevelMap.get(level); + } + + public String getGiftListJson() { + return mGiftListJson; + } + + public void setGiftListJson(String getGiftListJson) { + mGiftListJson = getGiftListJson; + } + + + public String getWrapListJson() { + return mWrapListJson; + } + + public void setWrapListJson(String wrapListJson) { + mWrapListJson = wrapListJson; + } + + + /** + * 判断某APP是否安装 + */ + public static boolean isAppExist(String packageName) { + if (!TextUtils.isEmpty(packageName)) { + PackageManager manager = CommonAppContext.sInstance.getPackageManager(); + List list = manager.getInstalledPackages(0); + for (PackageInfo info : list) { + if (packageName.equalsIgnoreCase(info.packageName)) { + return true; + } + } + } + return false; + } + + + public boolean isLaunched() { + return mLaunched; + } + + public void setLaunched(boolean launched) { + mLaunched = launched; + } + + //app是否在前台 + public boolean isFrontGround() { + return mFrontGround; + } + + //app是否在前台 + public void setFrontGround(boolean frontGround) { + mFrontGround = frontGround; + } + + //设置美颜类型 + public void setBeautySdkType(String sproutType) { + SpUtil.getInstance().setStringValue(SpUtil.BEAUTY_SDK_TYPE, sproutType); + } + public String getBeautySdkType() { + return SpUtil.getInstance().getStringValue(SpUtil.BEAUTY_SDK_TYPE); + } + + //设置是否显示转盘功能 + public void setTurnTableEnable(String enable) { + SpUtil.getInstance().setStringValue(SpUtil.TURNTABLE_ENABLE, enable); + } + public String getTurnTableEnable() { + return SpUtil.getInstance().getStringValue(SpUtil.TURNTABLE_ENABLE); + } + + //设置360美颜贴纸下载地址 + public void setBeauty360TieZhiUrl(String tieZhiUrl) { + SpUtil.getInstance().setStringValue(SpUtil.BEAUTY_360_TIEZHI_URL, tieZhiUrl); + } + public String getBeauty360TieZhiUrl() { + return SpUtil.getInstance().getStringValue(SpUtil.BEAUTY_360_TIEZHI_URL); + } + + //360贴纸已经下载过 + public void setBeauty360TieZhiExist(boolean isExist) { + SpUtil.getInstance().setBooleanValue(SpUtil.BEAUTY_360_TIEZHI_EXIST, isExist); + } + public boolean getBeauty360TieZhiExist() { + return SpUtil.getInstance().getBooleanValue(SpUtil.BEAUTY_360_TIEZHI_EXIST); + } + + //设置主播pk时间 + public void setAnchorPkTime(String pkTime){ + SpUtil.getInstance().setStringValue(SpUtil.ANCHOR_PK_TIME, pkTime); + } + public String getAnchorPkTime(){ + return SpUtil.getInstance().getStringValue(SpUtil.ANCHOR_PK_TIME); + } + +} diff --git a/common/src/main/java/com/yunbao/common/CommonAppContext.java b/common/src/main/java/com/yunbao/common/CommonAppContext.java new file mode 100644 index 000000000..8ea1fc54f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/CommonAppContext.java @@ -0,0 +1,132 @@ +package com.yunbao.common; + +import android.app.Activity; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import androidx.multidex.MultiDex; +import androidx.multidex.MultiDexApplication; +import android.util.Log; + +import com.facebook.FacebookSdk; +import com.facebook.appevents.AppEventsLogger; +import com.google.firebase.analytics.FirebaseAnalytics; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.utils.L; + +import java.util.Locale; + +import me.leolin.shortcutbadger.ShortcutBadger; + +import static com.facebook.FacebookSdk.setAdvertiserIDCollectionEnabled; +import static com.facebook.FacebookSdk.setAutoLogAppEventsEnabled; + + +/** + * Created by cxf on 2017/8/3. + */ + +public class CommonAppContext extends MultiDexApplication { + + public static CommonAppContext sInstance; + private int mCount; + private boolean mFront;//是否前台 + public static int jpushMsgNum; + public static int Ingroup = 0; + public static String lang = "chinese"; + public static FirebaseAnalytics mFirebaseAnalytics; + public static AppEventsLogger logger; + + @Override + public void onCreate() { + super.onCreate(); + sInstance = this; + //初始化Http + CommonHttpUtil.init(); + //初始化友盟统计 +// UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, null); + FacebookSdk.sdkInitialize(getApplicationContext()); + mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); + mFirebaseAnalytics.setAnalyticsCollectionEnabled(true); + mFirebaseAnalytics.setUserProperty("ALLOW_AD_PERSONALIZATION_SIGNALS", "true" ); + + + logger = AppEventsLogger.newLogger(this); + setAutoLogAppEventsEnabled(true); + FacebookSdk.fullyInitialize(); + setAdvertiserIDCollectionEnabled(true); + registerActivityLifecycleCallbacks(); + + Locale locale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + locale = getResources().getConfiguration().getLocales().get(0); + } else { + locale = getResources().getConfiguration().locale; + } + if(locale.getLanguage().equals("en")){ + lang = "english"; + }else{ + lang = "chinese"; + } + Log.i("lang",lang); + + } + + @Override + protected void attachBaseContext(Context base) { + MultiDex.install(this); + super.attachBaseContext(base); + } + + private void registerActivityLifecycleCallbacks() { + registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + + } + + @Override + public void onActivityStarted(Activity activity) { + mCount++; + if (!mFront) { + mFront = true; + L.e("AppContext------->处于前台"); + ShortcutBadger.applyCount(activity,0); + jpushMsgNum=0; + CommonAppConfig.getInstance().setFrontGround(true); + } + } + + @Override + public void onActivityResumed(Activity activity) { + + } + + @Override + public void onActivityPaused(Activity activity) { + + } + + @Override + public void onActivityStopped(Activity activity) { + mCount--; + if (mCount == 0) { + mFront = false; + L.e("AppContext------->处于后台"); + CommonAppConfig.getInstance().setFrontGround(false); + } + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + + } + + @Override + public void onActivityDestroyed(Activity activity) { + + } + }); + } + +} diff --git a/common/src/main/java/com/yunbao/common/Constants.java b/common/src/main/java/com/yunbao/common/Constants.java new file mode 100644 index 000000000..a4f2dfaaf --- /dev/null +++ b/common/src/main/java/com/yunbao/common/Constants.java @@ -0,0 +1,276 @@ +package com.yunbao.common; + +import com.yunbao.common.bean.ChatRemarksBean; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2018/6/7. + */ + +public class Constants { + public static final String URL = "url"; + public static final String PAYLOAD = "payload"; + public static final String SEX = "sex"; + public static final String NICK_NAME = "nickname"; + public static final String REMARKS = "remarks"; + public static final String AVATAR = "avatar"; + public static final String SIGN = "sign"; + public static final String TO_UID = "toUid"; + public static final String INTOINDEX = "intoIndex"; + public static final String FROM_LIVE_ROOM = "fromLiveRoom"; + public static final String TO_NAME = "toName"; + public static final String STREAM = "stream"; + public static final String LIMIT = "limit"; + public static final String UID = "uid"; + public static final String TIP = "tip"; + public static final String SHOW_INVITE = "showInvite"; + public static final String USER_BEAN = "userBean"; + public static final String CLASS_ID = "classID"; + public static final String CLASS_NAME = "className"; + public static final String CHECKED_ID = "checkedId"; + public static final String CHECKED_COIN = "checkedCoin"; + public static final String LIVE_DANMU_PRICE = "danmuPrice"; + public static final String COIN_NAME = "coinName"; + public static final String LIVE_BEAN = "liveBean"; + public static final String LIVE_TYPE = "liveType"; + public static final String LIVE_KEY = "liveKey"; + public static final String LIVE_POSITION = "livePosition"; + public static final String LIVE_TYPE_VAL = "liveTypeVal"; + public static final String LIVE_UID = "liveUid"; + public static final String LIVE_STREAM = "liveStream"; + public static final String LIVE_WISH_GIFTID = "wishGiftId"; + public static final String LIVE_HOME = "liveHome"; + public static final String LIVE_FOLLOW = "liveFollow"; + public static final String LIVE_NEAR = "liveNear"; + public static final String LIVE_CLASS_PREFIX = "liveClass_"; + public static final String LIVE_ADMIN_ROOM = "liveAdminRoom"; + public static final String HAS_GAME = "hasGame"; + public static final String OPEN_FLASH = "openFlash"; + public static final String SHARE_QR_CODE_FILE = "shareQrCodeFile.png"; + public static final String ANCHOR = "anchor"; + public static final String FOLLOW = "follow"; + public static final String DIAMONDS = "钻石"; + public static final String GOLD_NAME = "金币"; + public static final String VOTES = "映票"; + public static final String PAY_ALI_NOT_ENABLE = "支付宝未接入"; + public static final String PAY_WX_NOT_ENABLE = "微信支付未接入"; + public static final String PAY_ALL_NOT_ENABLE = "未开启支付"; + public static final String PAY_TYPE_ALI = "ali"; + public static final String PAY_TYPE_WX = "wx"; + public static final String PAY_TYPE_HW = "hw"; + public static final String PAY_TYPE_HFB = "hfb"; + public static final String PAY_TYPE_YUNQU = "yunqu";//海外直播支付yunqu + public static final String PAY_TYPE_PAYSSION = "payssion";//payssion支付 + public static final String PAY_TYPE_PAYPAL = "paypal";//paypal支付 + public static final String PAY_TYPE_GOOGLE = "google";//google支付 + + public static final String PAY_BUY_COIN_ALI = "Charge.getAliOrder"; + public static final String PAY_BUY_COIN_WX = "Charge.getWxOrder"; + + public static final String PACKAGE_NAME_ALI = "com.eg.android.AlipayGphone";//支付宝的包名 + public static final String PACKAGE_NAME_WX = "com.tencent.mm";//微信的包名 + public static final String PACKAGE_NAME_QQ = "com.tencent.mobileqq";//QQ的包名 + public static final String LAT = "lat"; + public static final String LNG = "lng"; + public static final String ADDRESS = "address"; + public static final String SCALE = "scale"; + public static final String SELECT_IMAGE_PATH = "selectedImagePath"; + public static final String COPY_PREFIX = "copy://"; + public static final int GUARD_TYPE_NONE = 0; + public static final int GUARD_TYPE_DAY = 1; + public static final int GUARD_TYPE_MONTH = 2; + public static final int GUARD_TYPE_YEAR = 3; + + public static final String GIF_GIFT_PREFIX = "gif_gift_"; + public static final String GIF_CAR_PREFIX = "gif_car_"; + public static final String DOWNLOAD_MUSIC = "downloadMusic"; + public static final String LINK = "link"; + public static final String REPORT = "report"; + public static final String SAVE = "save"; + public static final String DELETE = "delete"; + public static final String SHARE_FROM = "shareFrom"; + public static final int SHARE_FROM_LIVE = 101; + public static final int SHARE_FROM_HOME = 102; + public static final int SETTING_MODIFY_PWD = 15; + public static final int SETTING_UPDATE_ID = 16; + public static final int SETTING_CLEAR_CACHE = 18; + public static final int SETTING_ISBLACK = 20; + public static final int SEX_MALE = 1; + public static final int SEX_FEMALE = 2; + public static final int FOLLOW_FROM_FOLLOW = 1002; + public static final int FOLLOW_FROM_FANS = 1003; + public static final int FOLLOW_FROM_SEARCH = 1004; + public static final String IM_FROM_HOME = "imFromHome"; + //直播房间类型 + public static final int LIVE_TYPE_NORMAL = 0;//普通房间 + public static final int LIVE_TYPE_PWD = 1;//密码房间 + public static final int LIVE_TYPE_PAY = 2;//收费房间 + public static final int LIVE_TYPE_TIME = 3;//计时房间 + public static final int LIVE_TYPE_RESTING = 4;//休息中 + //主播直播间功能 + public static final int LIVE_FUNC_BEAUTY = 2001;//美颜 + public static final int LIVE_FUNC_CAMERA = 2002;//切换摄像头 + public static final int LIVE_FUNC_FLASH = 2003;//闪光灯 + public static final int LIVE_FUNC_MUSIC = 2004;//伴奏 + public static final int LIVE_FUNC_SHARE = 2005;//分享 + public static final int LIVE_FUNC_GAME = 2006;//游戏 + public static final int LIVE_FUNC_RED_PACK = 2007;//红包 + public static final int LIVE_FUNC_LINK_MIC = 2008;//连麦 + public static final int LIVE_FUNC_WISHLIST = 2009;//心愿单 + public static final int LIVE_FUNC_MIRROR = 2010;//鏡像 + public static final int LIVE_FUNC_ZG = 2011;//鏡像 + public static final int LIVE_FUNC_DR = 2012;//多人 + public static final int LIVE_FUNC_MIC = 2013;//語音 + public static final int LIVE_FUNC_WKS = 2014;//語音 + public static final int LIVE_FUNC_ZSLK = 2015;//語音 + + //socket + public static final String SOCKET_CONN = "conn"; + public static final String SOCKET_BROADCAST = "broadcastingListen"; + public static final String SOCKET_SEND = "broadcast"; + public static final String SOCKET_STOP_PLAY = "stopplay";//超管关闭直播间 + public static final String SOCKET_STOP_LIVE = "stopLive";//超管关闭直播间 + public static final String SOCKET_SEND_MSG = "SendMsg";//发送文字消息,点亮,用户进房间 PS:这种混乱的设计是因为服务器端逻辑就是这样设计的,客户端无法自行修改 + public static final String SOCKET_LIGHT = "light";//飘心 + public static final String SOCKET_SEND_GIFT = "SendGift";//送礼物 + public static final String SOCKET_ALL_SERVER_NOTIFY = "AllServerNotify";//全服通知 + public static final String SOCKET_SEND_BARRAGE = "SendBarrage";//发弹幕 + public static final String SOCKET_LIVE_DRPK = "LiveDRPK";//多人PK + public static final String SOCKET_LEAVE_ROOM = "disconnect";//用户离开房间 + public static final String SOCKET_LIVE_END = "StartEndLive";//主播关闭直播 + public static final String SOCKET_SYSTEM = "SystemNot";//系统消息 + public static final String UP_USER_LIST = "upuserlist";//更新用戶列表 + public static final String LIAN_MAI = "LivePKDRLM";//用户连麦 + public static final String CARD = "card";//活动 + public static final String SOCKET_KICK = "KickUser";//踢人 + public static final String SOCKET_SHUT_UP = "ShutUpUser";//禁言 + public static final String SOCKET_SET_ADMIN = "setAdmin";//设置或取消管理员 + public static final String SOCKET_CHANGE_LIVE = "changeLive";//切换计时收费类型 + public static final String SOCKET_UPDATE_VOTES = "updateVotes";//门票或计时收费时候更新主播的映票数 + public static final String SOCKET_FAKE_FANS = "requestFans";//僵尸粉 + public static final String SOCKET_LINK_MIC = "ConnectVideo";//连麦 + public static final String SOCKET_LINK_MIC_ANCHOR = "LiveConnect";//主播连麦 + public static final String SOCKET_LINK_MIC_PK = "LivePK";//主播PK + public static final String SOCKET_BUY_GUARD = "BuyGuard";//购买守护 + public static final String SOCKET_RED_PACK = "SendRed";//红包 + public static final String SOCKET_LUCK_WIN = "luckWin";//幸运礼物中奖 + public static final String SOCKET_PRIZE_POOL_WIN = "jackpotWin";//奖池中奖 + public static final String SOCKET_PRIZE_POOL_UP = "jackpotUp";//奖池升级 + //游戏socket + public static final String SOCKET_GAME_ZJH = "startGame";//炸金花 + public static final String SOCKET_GAME_HD = "startLodumaniGame";//海盗船长 + public static final String SOCKET_GAME_NZ = "startCattleGame";//开心牛仔 + public static final String SOCKET_GAME_ZP = "startRotationGame";//幸运转盘 + public static final String SOCKET_GAME_EBB = "startShellGame";//二八贝 + + public static final String SOCKET_SEND_ACTIVE_MSG = "SendActiveMsg";//活动,聊天显示 + public static final String SOCKET_PRANKTURNTABLE = "prankTurntable";//整蛊消息 + public static final String SOCKET_USEHOTCARD = "UseHotCard";//热度卡消息 + public static final String LOVE_CHECK = "LoveCheck";//热度卡消息 + + public static final int SOCKET_WHAT_CONN = 0; + public static final int SOCKET_WHAT_DISCONN = 2; + public static final int SOCKET_WHAT_BROADCAST = 1; + //socket 用户类型 + public static final int SOCKET_USER_TYPE_NORMAL = 30;//普通用户 + public static final int SOCKET_USER_TYPE_ADMIN = 40;//房间管理员 + public static final int SOCKET_USER_TYPE_ANCHOR = 50;//主播 + public static final int SOCKET_USER_TYPE_SUPER = 60;//超管 + + //提现账号类型,1表示支付宝,2表示微信,3表示银行卡 + public static final int CASH_ACCOUNT_ALI = 1; + public static final int CASH_ACCOUNT_WX = 2; + public static final int CASH_ACCOUNT_BANK = 3; + public static final String CASH_ACCOUNT_ID = "cashAccountID"; + public static final String CASH_ACCOUNT = "cashAccount"; + public static final String CASH_ACCOUNT_TYPE = "cashAccountType"; + + + public static final int RED_PACK_TYPE_AVERAGE = 0;//平均红包 + public static final int RED_PACK_TYPE_SHOU_QI = 1;//拼手气红包 + public static final int RED_PACK_SEND_TIME_NORMAL = 0;//立即发放 + public static final int RED_PACK_SEND_TIME_DELAY = 1;//延时发放 + + public static final int JPUSH_TYPE_NONE = 0; + public static final int JPUSH_TYPE_LIVE = 1;//直播 + public static final int JPUSH_TYPE_MESSAGE = 2;//消息 + + public static final String VIDEO_HOME = "videoHome"; + public static final String VIDEO_USER = "videoUser_"; + public static final String VIDEO_KEY = "videoKey"; + public static final String VIDEO_POSITION = "videoPosition"; + public static final String VIDEO_SINGLE = "videoSingle"; + public static final String VIDEO_COMMUNITY = "community"; + public static final String VIDEO_PAGE = "videoPage"; + public static final String VIDEO_BEAN = "videoBean"; + public static final String VIDEO_ID = "videoId"; + public static final String VIDEO_COMMENT_BEAN = "videoCommnetBean"; + public static final String VIDEO_FACE_OPEN = "videoOpenFace"; + public static final String VIDEO_FACE_HEIGHT = "videoFaceHeight"; + public static final String VIDEO_DURATION = "videoDuration"; + public static final String VIDEO_PATH = "videoPath"; + public static final String VIDEO_FROM_RECORD = "videoFromRecord"; + public static final String VIDEO_MUSIC_BEAN = "videoMusicBean"; + public static final String VIDEO_MUSIC_ID = "videoMusicId"; + public static final String VIDEO_HAS_BGM = "videoHasBgm"; + public static final String VIDEO_MUSIC_NAME_PREFIX = "videoMusicName_"; + public static final String VIDEO_SAVE_TYPE = "videoSaveType"; + public static final int VIDEO_SAVE_SAVE_AND_PUB = 1;//保存并发布 + public static final int VIDEO_SAVE_SAVE = 2;//仅保存 + public static final int VIDEO_SAVE_PUB = 3;//仅发布 + + public static final String MOB_QQ = "qq"; + public static final String MOB_QZONE = "qzone"; + public static final String MOB_WX = "wx"; + public static final String MOB_WX_PYQ = "wchat"; + public static final String MOB_FACEBOOK = "facebook"; + public static final String MOB_TWITTER = "twitter"; + public static final String MOB_PHONE = "phone"; + + public static final String LIVE_SDK = "liveSdk"; + public static final String LIVE_KSY_CONFIG = "liveKsyConfig"; + public static final int LIVE_SDK_KSY = 0;//金山推流 + public static final int LIVE_SDK_TX = 1;//腾讯推流 + + + public static final int LINK_MIC_TYPE_NORMAL = 0;//观众与主播连麦 + public static final int LINK_MIC_TYPE_ANCHOR = 1;//主播与主播连麦 + + //视频举报获取位置 + public static int xIndex = 0; + public static int yindex = 0; + public static String isBlack; + + public static String nowPostsId = ""; + + public static String myAvatar = ""; + public static String myUid = ""; + public static String myName = ""; + + public static int myIntoIndex = 0; + public static String chatActionUrl = ""; + + public static String myUrl = ""; + public static String mStream = ""; + public static String nowSendUid = "";//获取当前会话新信息用于会话列表显示 + public static boolean isAnchor = false; + public static String myPackageUrl = ""; + public static boolean isTitle = false; + public static int isShowPage = -1; + public static boolean LoginKefu = true;//是否是从客服进入 + public static String nowAnchorName = "";//当前主播昵称 + public static String isSend = "0";//是否能发言,enterroom接口返回,1 可发言 0 不可发言 + public static String nowId = "";//当前点击了某个单聊的id + public static String remarks = "";//当前点击了某个单聊的备注 + public static String isAdmin = "0";//当前点击了某个单聊是否是指导员 + public static List remarksListNow = new ArrayList<>();//存储的备注 + public static int getWeekIntIndex = 0;//是否刷新了周星列表 + public static boolean isInstructor = false;//是否是管理员 + public static String isSetRemark = "";//是否有修改备注 + public static String isSetRemarkText = "";//修改的备注信息 + public static boolean isShowLiveDialog = false;//是否在直播间打开单聊 + public static int firstInto = 0;// + +} diff --git a/common/src/main/java/com/yunbao/common/HtmlConfig.java b/common/src/main/java/com/yunbao/common/HtmlConfig.java new file mode 100644 index 000000000..70e7c8011 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/HtmlConfig.java @@ -0,0 +1,61 @@ +package com.yunbao.common; + +/** + * Created by cxf on 2018/10/15. + */ + +public class HtmlConfig { + + //登录即代表同意服务和隐私条款 + public static final String LOGIN_PRIVCAY = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=3"; + public static final String LOGIN_PRIVCAY1 = CommonAppConfig.HOST + "/portal/page/index/id/59"; + + //注册用户协议 + public static final String REG_PRIVCAY1 = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=2"; + public static final String REG_PRIVCAY2 = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=3"; + + //直播间贡献榜 + public static final String LIVE_LIST = CommonAppConfig.HOST + "/index.php?g=Appapi&m=contribute&a=index&uid="; + //直播间粉丝排行榜 + public static final String LIVE_FANS_MEDAL_RANKING = CommonAppConfig.HOST + "/index.php?g=Appapi&m=Fans&a=fansranking&uid="; + //个人主页分享链接 + public static final String SHARE_HOME_PAGE = CommonAppConfig.HOST + "/index.php?g=Appapi&m=home&a=index&touid="; + //提现记录 + public static final String CASH_RECORD = CommonAppConfig.HOST + "/index.php?g=Appapi&m=cash&a=index"; + //支付宝充值回调地址 + public static final String ALI_PAY_COIN_URL = CommonAppConfig.HOST + "/Appapi/Pay/notify_ali"; + //谷歌支付回调地址 + public static final String GOOGLE_PAY_COIN_URL = CommonAppConfig.HOST + "/Appapi/Pay/"; + + //视频分享地址 + public static final String SHARE_VIDEO = CommonAppConfig.HOST + "/index.php?g=appapi&m=video&a=index&videoid="; + //直播间幸运礼物说明 + public static final String LUCK_GIFT_TIP = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=26"; + + //直播间玩家看到的心愿单 + public static final String WISHLIST_URL = CommonAppConfig.HOST + "/index.php?g=Appapi&m=Wish&a=index"; + + //直播间玩家看到的转盘 + public static final String TURNTABLE_URL = CommonAppConfig.HOST + "/Appapi/Turntable/index"; + + //在线商城 + public static final String SHOP = CommonAppConfig.HOST + "/h5/shoppingMall.html"; + + //社区 + public static final String ENCOURAGE = CommonAppConfig.HOST + "/h5/shequ/index.html#/h5/shequ"; + + //个人信息 + public static final String PERSONAL = CommonAppConfig.HOST + "/h5/shequ/index.html#/h5/shequ/Personal"; + + //我的徽章 右上角问号 + public static final String MEDAL_QUESTION = CommonAppConfig.HOST + "/index.php?g=Appapi&m=Fans&a=rule&isfans=1"; + + //我的明细 + public static final String DETAIL = CommonAppConfig.HOST + "/index.php?g=Appapi&m=Detail&a=index"; + //充值协议 + public static final String CHARGE_PRIVCAY = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=6"; + + //充值说明 + public static final String CHARGE_EXPLAIN = CommonAppConfig.HOST + "/index.php?g=portal&m=page&a=index&id=41"; + +} diff --git a/common/src/main/java/com/yunbao/common/activity/AbsActivity.java b/common/src/main/java/com/yunbao/common/activity/AbsActivity.java new file mode 100644 index 000000000..2c0e076ab --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/AbsActivity.java @@ -0,0 +1,348 @@ +package com.yunbao.common.activity; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Rect; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.yunbao.common.R; +import com.yunbao.common.interfaces.LifeCycleListener; +import com.yunbao.common.utils.ClickUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2017/8/3. + */ + +public abstract class AbsActivity extends AppCompatActivity { + + protected String mTag; + protected Activity mContext; + protected List mLifeCycleListeners; + + @Override + public Resources getResources() { + Resources res = super.getResources(); + Configuration config = new Configuration(); + config.setToDefaults(); + res.updateConfiguration(config, res.getDisplayMetrics()); + return res; + } + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mTag = this.getClass().getSimpleName(); + setStatusBar(); + setContentView(getLayoutId()); + mContext = this; + mLifeCycleListeners = new ArrayList<>(); + main(savedInstanceState); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onCreate(); + } + } + + } + + protected abstract int getLayoutId(); + + protected void main(Bundle savedInstanceState) { + main(); + } + + protected void main() { + + } + + protected boolean isStatusBarWhite() { + return false; + } + + protected void setTitle(String title) { + TextView titleView = (TextView) findViewById(R.id.titleView); + if (titleView != null) { + titleView.setText(title); + } + } + + public void backClick(View v) { + if (v.getId() == R.id.btn_back) { + onBackPressed(); + } + } + + protected boolean canClick() { + return ClickUtil.canClick(); + } + + + /** + * 设置透明状态栏 + */ + private void setStatusBar() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + if (isStatusBarWhite()) { + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } else { + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(0); + } + } + + + @Override + protected void onDestroy() { + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onDestroy(); + } + mLifeCycleListeners.clear(); + mLifeCycleListeners = null; + } + super.onDestroy(); + } + + @Override + protected void onStart() { + super.onStart(); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onStart(); + } + } + } + + @Override + protected void onRestart() { + super.onRestart(); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onReStart(); + } + } + } + + @Override + protected void onResume() { + super.onResume(); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onResume(); + } + } + //友盟统计 +// MobclickAgent.onResume(this); + } + + @Override + protected void onPause() { + super.onPause(); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onPause(); + } + } + //友盟统计 +// MobclickAgent.onPause(this); + } + + @Override + protected void onStop() { + super.onStop(); + if (mLifeCycleListeners != null) { + for (LifeCycleListener listener : mLifeCycleListeners) { + listener.onStop(); + } + } + } + + public void addLifeCycleListener(LifeCycleListener listener) { + if (mLifeCycleListeners != null && listener != null) { + mLifeCycleListeners.add(listener); + } + } + + public void addAllLifeCycleListener(List listeners) { + if (mLifeCycleListeners != null && listeners != null) { + mLifeCycleListeners.addAll(listeners); + } + } + + public void removeLifeCycleListener(LifeCycleListener listener) { + if (mLifeCycleListeners != null) { + mLifeCycleListeners.remove(listener); + } + } + + //键盘遮挡问题 + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + + public void init() { + FrameLayout content = (FrameLayout) findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + possiblyResizeChildOfContent(); + } + }); + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent + .getLayoutParams(); + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != usableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView() + .getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard / 4)) { + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } else { + frameLayoutParams.height = usableHeightSansKeyboard - getNavigationBarHeightIfRoom(mContext); + ; + } + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } + + + public boolean checkDeviceHasNavigationBar2(Context context) { + //通过判断设备是否有返回键、菜单键(不是虚拟键,是手机屏幕外的按键)来确定是否有navigation bar + boolean hasMenuKey = ViewConfiguration.get(context) + .hasPermanentMenuKey(); + boolean hasBackKey = KeyCharacterMap + .deviceHasKey(KeyEvent.KEYCODE_BACK); + + if (!hasMenuKey && !hasBackKey) { + // 做任何你需要做的,这个设备有一个导航栏 + return true; + } + return false; + } + + public static int getNavigationBarHeightIfRoom(Context context) { + if (navigationGestureEnabled(context)) { + return 0; + } + return getCurrentNavigationBarHeight(((Activity) context)); + } + + /** + * 全面屏(是否开启全面屏开关 0 关闭 1 开启) + * + * @param context + * @return + */ + public static boolean navigationGestureEnabled(Context context) { + int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0); + return val != 0; + } + + /** + * 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo都可以) + * + * @return + */ + public static String getDeviceInfo() { + String brand = Build.BRAND; + if (TextUtils.isEmpty(brand)) + return "navigationbar_is_min"; + if (brand.equalsIgnoreCase("HUAWEI")) { + return "navigationbar_is_min"; + } else if (brand.equalsIgnoreCase("XIAOMI")) { + return "force_fsg_nav_bar"; + } else if (brand.equalsIgnoreCase("VIVO")) { + return "navigation_gesture_on"; + } else if (brand.equalsIgnoreCase("OPPO")) { + return "navigation_gesture_on"; + } else { + return "navigationbar_is_min"; + } + } + + /** + * 非全面屏下 虚拟键实际高度(隐藏后高度为0) + * + * @param activity + * @return + */ + public static int getCurrentNavigationBarHeight(Activity activity) { + if (isNavigationBarShown(activity)) { + return getNavigationBarHeight(activity); + } else { + return 0; + } + } + + /** + * 非全面屏下 虚拟按键是否打开 + * + * @param activity + * @return + */ + public static boolean isNavigationBarShown(Activity activity) { + //虚拟键的view,为空或者不可见时是隐藏状态 + View view = activity.findViewById(android.R.id.navigationBarBackground); + if (view == null) { + return false; + } + int visible = view.getVisibility(); + if (visible == View.GONE || visible == View.INVISIBLE) { + return false; + } else { + return true; + } + } + + /** + * 非全面屏下 虚拟键高度(无论是否隐藏) + * + * @param context + * @return + */ + public static int getNavigationBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + +} diff --git a/common/src/main/java/com/yunbao/common/activity/ErrorActivity.java b/common/src/main/java/com/yunbao/common/activity/ErrorActivity.java new file mode 100644 index 000000000..6cc2a39e8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/ErrorActivity.java @@ -0,0 +1,65 @@ +package com.yunbao.common.activity; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; +import android.widget.TextView; + +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.R; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; + +/** + * Created by cxf on 2018/8/29. + * 服务器Home.getConfig接口有时候返回的数据无法解析,导致崩溃, + * 这个类是用来收集服务器返回的错误的信息的 + */ + +public class ErrorActivity extends AbsActivity { + + public static void forward(String title, String errorInfo) { + Intent intent = new Intent(CommonAppContext.sInstance, ErrorActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("title", title); + intent.putExtra("error", errorInfo); + CommonAppContext.sInstance.startActivity(intent); + } + + private TextView mTextView; + private String mErrorInfo; + + @Override + protected int getLayoutId() { + return R.layout.activity_error; + } + + @Override + protected void main() { + Intent intent = getIntent(); + String title = intent.getStringExtra("title"); + mErrorInfo = intent.getStringExtra("error"); + setTitle(title); + mTextView = (TextView) findViewById(R.id.text); + mTextView.setText(mErrorInfo); + findViewById(R.id.btn_copy).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + copyError(); + } + }); + } + + private void copyError() { + if (TextUtils.isEmpty(mErrorInfo)) { + return; + } + ClipboardManager clipboardManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("text", mErrorInfo); + clipboardManager.setPrimaryClip(clipData); + ToastUtil.show(WordUtil.getString(R.string.copy_success)); + } +} diff --git a/common/src/main/java/com/yunbao/common/activity/PreviewImageActivity.java b/common/src/main/java/com/yunbao/common/activity/PreviewImageActivity.java new file mode 100644 index 000000000..f9ada1bd5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/PreviewImageActivity.java @@ -0,0 +1,102 @@ +package com.yunbao.common.activity; + +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.yunbao.common.R; +import com.yunbao.common.bean.ImageEntity; +import com.yunbao.common.utils.PreViewImageView; + +import java.util.List; + +/** + * Created by Haoxuan Chen on 2019/07/14. + * Description:查看图片 + */ +public class PreviewImageActivity extends AbsActivity implements ViewPager.OnPageChangeListener { + // @BindView(R.id.viewPager) + ViewPager mViewPager; + // @BindView(R.id.tv_count) + TextView mCount; + View v_back; + private List mSelectedImages; + + @Override + public void main(Bundle savedInstanceState) { + mViewPager = findViewById(R.id.viewPager); + mCount = findViewById(R.id.tv_count); + v_back = findViewById(R.id.v_back); + + mSelectedImages = getIntent().getParcelableArrayListExtra("preview_images"); + mViewPager.setAdapter(mViewPagerAdapter); + mViewPager.addOnPageChangeListener(this); + mCount.setText(String.format("%s/%s", 1, mSelectedImages.size())); + + v_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public int getLayoutId() { + return R.layout.activity_preview_image; + } + + + private PagerAdapter mViewPagerAdapter = new PagerAdapter() { + @Override + public int getCount() { + return mSelectedImages.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + PreViewImageView imageView = new PreViewImageView(container.getContext()); +// ImgLoader.display(imageView.getContext(), mSelectedImages.get(position).getPath(), imageView); + Glide.with(imageView.getContext()) + .load(mSelectedImages.get(position).getPath()) + .centerCrop() + .into(imageView); + container.addView(imageView); + return imageView; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + container.removeView((View) object); + } + }; + + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + mCount.setText(String.format("%s/%s", (position + 1), mSelectedImages.size())); + + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + +} diff --git a/common/src/main/java/com/yunbao/common/activity/PreviewVideoActivity.java b/common/src/main/java/com/yunbao/common/activity/PreviewVideoActivity.java new file mode 100644 index 000000000..d7f30783a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/PreviewVideoActivity.java @@ -0,0 +1,304 @@ +package com.yunbao.common.activity; + +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AccelerateInterpolator; +import android.widget.RelativeLayout; + +import com.tencent.rtmp.ITXVodPlayListener; +import com.tencent.rtmp.TXLiveConstants; +import com.tencent.rtmp.TXVodPlayConfig; +import com.tencent.rtmp.TXVodPlayer; +import com.tencent.rtmp.ui.TXCloudVideoView; +import com.yunbao.common.R; +import com.yunbao.common.bean.ImageEntity; + +import java.util.List; + +/** + * Created by Haoxuan Chen on 2022/05/4. + * Description:查看视频 + */ +public class PreviewVideoActivity extends AbsActivity implements ITXVodPlayListener, View.OnClickListener { + + View v_back; + private List mSelectedImages; + private TXCloudVideoView mTXCloudVideoView; + private TXVodPlayer mPlayer; + private TXVodPlayConfig mTXVodPlayConfig; + private boolean mStartPlay; + private String mCachePath; + private boolean mPaused;//生命周期暂停 + private boolean mClickPaused;//点击暂停 + private ObjectAnimator mPlayBtnAnimator;//暂停按钮的动画 + private View mPlayBtn; + private View mVideoCover; + private ActionListener mActionListener; + + @Override + public void main(Bundle savedInstanceState) { + mSelectedImages = getIntent().getParcelableArrayListExtra("preview_images"); + v_back = findViewById(R.id.v_back); + mTXCloudVideoView = (TXCloudVideoView) findViewById(R.id.video_view); + + v_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + playAdVideo(); + } + + @Override + public int getLayoutId() { + return R.layout.activity_preview_video; + } + + /** + * 播放视频 + */ + private void playAdVideo() { + mCachePath = mContext.getCacheDir().getAbsolutePath(); + mTXCloudVideoView = (TXCloudVideoView) findViewById(R.id.video_view); + mTXCloudVideoView.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN); + mPlayer = new TXVodPlayer(mContext); + mTXVodPlayConfig = new TXVodPlayConfig(); + mTXVodPlayConfig.setMaxCacheItems(15); + mTXVodPlayConfig.setProgressInterval(200); + mPlayer.setConfig(mTXVodPlayConfig); + mPlayer.setAutoPlay(true); + mPlayer.setVodListener(this); + mPlayer.setPlayerView(mTXCloudVideoView); + findViewById(R.id.root).setOnClickListener(this); + mVideoCover = findViewById(R.id.video_cover); + mPlayBtn = findViewById(R.id.btn_play); + //暂停按钮动画 + mPlayBtnAnimator = ObjectAnimator.ofPropertyValuesHolder(mPlayBtn, + PropertyValuesHolder.ofFloat("scaleX", 4f, 0.8f, 1f), + PropertyValuesHolder.ofFloat("scaleY", 4f, 0.8f, 1f), + PropertyValuesHolder.ofFloat("alpha", 0f, 1f)); + mPlayBtnAnimator.setDuration(150); + mPlayBtnAnimator.setInterpolator(new AccelerateInterpolator()); + + startPlay(); + } + + /** + * 开始播放 + */ + public void startPlay() { + mStartPlay = false; + mClickPaused = false; + if (mVideoCover != null && mVideoCover.getVisibility() != View.VISIBLE) { + mVideoCover.setVisibility(View.VISIBLE); + } + hidePlayBtn(); + + String url = mSelectedImages.get(0).getPath(); + if (TextUtils.isEmpty(url)) { + return; + } + if (mTXVodPlayConfig == null) { + mTXVodPlayConfig = new TXVodPlayConfig(); + mTXVodPlayConfig.setMaxCacheItems(15); + mTXVodPlayConfig.setProgressInterval(200); + } + if (url.endsWith(".m3u8")) { + mTXVodPlayConfig.setCacheFolderPath(null); + } else { + mTXVodPlayConfig.setCacheFolderPath(mCachePath); + } + mPlayer.setConfig(mTXVodPlayConfig); + if (mPlayer != null) { + mPlayer.startPlay(url); + } + } + + /** + * 获取到视频宽高回调 + */ + public void onVideoSizeChanged(float videoWidth, float videoHeight) { + if (mTXCloudVideoView != null && videoWidth > 0 && videoHeight > 0) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mTXCloudVideoView.getLayoutParams(); + int targetH = 0; + if (videoWidth / videoHeight > 0.5625f) {//横屏 9:16=0.5625 + targetH = (int) (mTXCloudVideoView.getWidth() / videoWidth * videoHeight); + } else { + targetH = ViewGroup.LayoutParams.MATCH_PARENT; + } + if (targetH != params.height) { + params.height = targetH; + mTXCloudVideoView.requestLayout(); + } + if (mVideoCover != null && mVideoCover.getVisibility() == View.VISIBLE) { + mVideoCover.setVisibility(View.INVISIBLE); + } + } + } + + /** + * 停止播放 + */ + public void stopPlay() { + if (mPlayer != null) { + mPlayer.stopPlay(false); + } + } + + /** + * 循环播放 + */ + private void replay() { + if (mPlayer != null) { + mPlayer.seek(0); + mPlayer.resume(); + } + } + + /** + * 显示开始播放按钮 + */ + private void showPlayBtn() { + if (mPlayBtn != null && mPlayBtn.getVisibility() != View.VISIBLE) { + mPlayBtn.setVisibility(View.VISIBLE); + } + } + + /** + * 隐藏开始播放按钮 + */ + private void hidePlayBtn() { + if (mPlayBtn != null && mPlayBtn.getVisibility() == View.VISIBLE) { + mPlayBtn.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onClick(View v) { + int i = v.getId(); + if (i == R.id.root) { + clickTogglePlay(); + } + } + + /** + * 点击切换播放和暂停 + */ + private void clickTogglePlay() { + if (!mStartPlay) { + return; + } + if (mPlayer != null) { + if (mClickPaused) { + mPlayer.resume(); + } else { + mPlayer.pause(); + } + } + mClickPaused = !mClickPaused; + if (mClickPaused) { + showPlayBtn(); + if (mPlayBtnAnimator != null) { + mPlayBtnAnimator.start(); + } + } else { + hidePlayBtn(); + } + } + + /** + * 播放器事件回调 + */ + @Override + public void onPlayEvent(TXVodPlayer txVodPlayer, int e, Bundle bundle) { + switch (e) { + case TXLiveConstants.PLAY_EVT_PLAY_BEGIN://加载完成,开始播放的回调 + mStartPlay = true; + if (mActionListener != null) { + mActionListener.onPlayBegin(); + } + + break; + case TXLiveConstants.PLAY_EVT_PLAY_LOADING: //开始加载的回调 + if (mActionListener != null) { + mActionListener.onPlayLoading(); + } + break; + case TXLiveConstants.PLAY_EVT_PLAY_END://获取到视频播放完毕的回调 + replay(); + break; + case TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME://获取到视频首帧回调 + if (mActionListener != null) { + mActionListener.onFirstFrame(); + } + if (mPaused && mPlayer != null) { + mPlayer.pause(); + } + break; + case TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION://获取到视频宽高回调 + onVideoSizeChanged(bundle.getInt("EVT_PARAM1", 0), bundle.getInt("EVT_PARAM2", 0)); + break; + } + } + + @Override + public void onNetStatus(TXVodPlayer txVodPlayer, Bundle bundle) { + + } + + public void release() { + if (mPlayer != null) { + mPlayer.stopPlay(false); + mPlayer.setPlayListener(null); + } + mPlayer = null; + mActionListener = null; + } + + public interface ActionListener { + void onPlayBegin(); + + void onPlayLoading(); + + void onFirstFrame(); + } + + + public void setActionListener(ActionListener actionListener) { + mActionListener = actionListener; + } + + /** + * 生命周期暂停 + */ + public void pausePlay() { + mPaused = true; + if (!mClickPaused && mPlayer != null) { + mPlayer.pause(); + } + } + + /** + * 生命周期恢复 + */ + public void resumePlay() { + if (mPaused) { + if (!mClickPaused && mPlayer != null) { + mPlayer.resume(); + } + } + mPaused = false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + release(); + } +} diff --git a/common/src/main/java/com/yunbao/common/activity/SelectImageActivity.java b/common/src/main/java/com/yunbao/common/activity/SelectImageActivity.java new file mode 100644 index 000000000..efa66a9b6 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/SelectImageActivity.java @@ -0,0 +1,510 @@ +package com.yunbao.common.activity; + + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Parcelable; +import android.provider.MediaStore; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.loader.app.LoaderManager; +import androidx.core.content.ContextCompat; +import androidx.loader.content.CursorLoader; +import androidx.core.content.FileProvider; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.ImageAdapter; +import com.yunbao.common.adapter.ImageFolderAdapter; +import com.yunbao.common.adapter.MultiTypeSupport; +import com.yunbao.common.adapter.SpaceGridItemDecoration; +import com.yunbao.common.bean.ImageEntity; +import com.yunbao.common.bean.ImageFolderEntity; +import com.yunbao.common.dialog.ImageFolderView; +import com.yunbao.common.utils.StatusBarUtil; +import com.yunbao.common.utils.TDevice; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + + +/** + * Created by Chen Haoxuan on 2022/4/30. + * Description:图片选择 + */ + +public class SelectImageActivity extends AbsActivity implements ImageFolderView.ImageFolderViewListener, ImageAdapter.onCameraClickListener, View.OnClickListener { + // 返回选择图片列表的EXTRA_KEY + public static final String EXTRA_RESULT = "EXTRA_RESULT"; + public static int MAX_SIZE = 5; + private static final int PERMISSION_REQUEST_CODE = 88; + private static final int TAKE_PHOTO = 99; + // @BindView(R.id.tv_back) + TextView mTvBack; + // @BindView(R.id.tv_ok) + TextView mTvSelectCount; + // @BindView(R.id.rv) + RecyclerView mRvImage; + // @BindView(R.id.tv_photo) + TextView mTvPhoto; + // @BindView(R.id.tv_preview) + TextView mTvPreview; + // @BindView(R.id.image_folder_view) + ImageFolderView mImageFolderView; + View v_back; + + private boolean mHasCamera = true; + //被选中图片的集合 + private List mSelectedImages = new ArrayList<>(); + private List mImages = new ArrayList<>(); + private List mImageFolders = new ArrayList<>(); + private ImageAdapter mImageAdapter; + private ImageFolderAdapter mImageFolderAdapter; + private Uri mImageUri; + private File takePhotoImageFile; + private int intoIndex = 0; + + @Override + public int getLayoutId() { + return R.layout.activity_select_image; + } + + @Override + public void main(Bundle savedInstanceState) { + mTvBack = findViewById(R.id.tv_back); + mTvSelectCount = findViewById(R.id.tv_ok); + mRvImage = findViewById(R.id.rv); + mTvPhoto = findViewById(R.id.tv_photo); + mTvPreview = findViewById(R.id.tv_preview); + mImageFolderView = findViewById(R.id.image_folder_view); + v_back = findViewById(R.id.v_back); + + //设置状态栏的颜色 + StatusBarUtil.statusBarTintColor(this, ContextCompat.getColor(this, R.color.black2)); + setupSelectedImages(); + mRvImage.setLayoutManager(new GridLayoutManager(this, 4, LinearLayoutManager.VERTICAL, false)); + mRvImage.addItemDecoration(new SpaceGridItemDecoration((int) TDevice.dipToPx(getResources(), 1))); + //异步加载图片 + getSupportLoaderManager().initLoader(0, null, mLoaderCallbacks); + mImageFolderView.setListener(this); + + if (intoIndex == 1) { + onCameraClick(); + } + + v_back.setOnClickListener(this); + mTvSelectCount.setOnClickListener(this); + mTvPhoto.setOnClickListener(this); + mTvPreview.setOnClickListener(this); + } + + private void setupSelectedImages() { + Intent intent = getIntent(); + ArrayList selectImages = intent.getParcelableArrayListExtra("selected_images"); + intoIndex = intent.getIntExtra("intoIndex", 0); + if (selectImages == null) { + selectImages = new ArrayList<>(); + } + mSelectedImages.addAll(selectImages); + String showLook = getResources().getString(R.string.preview) + "%d/"; + if (intoIndex == 3) { + showLook = showLook + "1"; + MAX_SIZE = 1; + mTvBack.setText(getResources().getString(R.string.video)); + mTvPhoto.setText(getResources().getString(R.string.video)); + } else { + showLook = showLook + "9"; + MAX_SIZE = 9; + mTvBack.setText(getResources().getString(R.string.im_input_img)); + mTvPhoto.setText(getResources().getString(R.string.im_input_img)); + } + if (mSelectedImages.size() > 0 && mSelectedImages.size() <= MAX_SIZE) { + mTvPreview.setClickable(true); + + mTvPreview.setText(String.format(showLook, mSelectedImages.size())); + mTvPreview.setTextColor(ContextCompat.getColor(SelectImageActivity.this, R.color.pk_red)); + } + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.v_back) { + finish(); + } else if (id == R.id.tv_ok) { + Intent intent = new Intent(); + intent.putParcelableArrayListExtra(EXTRA_RESULT, (ArrayList) mSelectedImages); + setResult(RESULT_OK, intent); + finish(); + } else if (id == R.id.tv_photo) { + if (mImageFolderView.isShowing()) { + mImageFolderView.hide(); + } else { + mImageFolderView.show(); + } + } else if (id == R.id.tv_preview) { + if (mSelectedImages.size() > 0) { + if (intoIndex != 3) { + Intent previewIntent = new Intent(this, PreviewImageActivity.class); + previewIntent.putParcelableArrayListExtra("preview_images", (ArrayList) mSelectedImages); + startActivity(previewIntent); + } else { + Intent previewIntent = new Intent(this, PreviewVideoActivity.class); + previewIntent.putParcelableArrayListExtra("preview_images", (ArrayList) mSelectedImages); + startActivity(previewIntent); + } + } + } + } + +// @OnClick({R.id.tv_back, R.id.tv_ok, R.id.tv_photo, R.id.tv_preview}) +// public void onViewClicked(View view) { +// switch (view.getId()) { +// case R.id.tv_back: +// finish(); +// break; +// case R.id.tv_ok: +// Intent intent = new Intent(); +// intent.putParcelableArrayListExtra(EXTRA_RESULT, (ArrayList) mSelectedImages); +// setResult(RESULT_OK, intent); +// finish(); +// break; +// case R.id.tv_photo: +// if (mImageFolderView.isShowing()) { +// mImageFolderView.hide(); +// } else { +// mImageFolderView.show(); +// } +// break; +// case R.id.tv_preview: +// Intent previewIntent = new Intent(this, PreviewImageActivity.class); +// previewIntent.putParcelableArrayListExtra("preview_images", (ArrayList) mSelectedImages); +// startActivity(previewIntent); +// break; +// } +// } + + private void addImageFoldersToAdapter() { + if (mImageFolderAdapter == null) { + mImageFolderAdapter = new ImageFolderAdapter(this, mImageFolders, R.layout.item_list_folder); + mImageFolderView.setAdapter(mImageFolderAdapter); + } else { + mImageFolderAdapter.notifyDataSetChanged(); + } + } + + private void addImagesToAdapter(ArrayList images) { + mImages.clear(); + mImages.addAll(images); + if (mImageAdapter == null) { + mImageAdapter = new ImageAdapter(this, mImages, mSelectedImages, mMultiTypeSupport); + mRvImage.setAdapter(mImageAdapter); + } else { + mImageAdapter.notifyDataSetChanged(); + } + mImageAdapter.setSelectImageCountListener(mOnSelectImageCountListener); + mImageAdapter.setOnCameraClickListener(this); + } + + private MultiTypeSupport mMultiTypeSupport = new MultiTypeSupport() { + @Override + public int getLayoutId(ImageEntity image) { + if (TextUtils.isEmpty(image.getPath())) { + return R.layout.item_list_camera; + } + return R.layout.item_list_image; + } + }; + /*************************************已选择的图片回调的方法************************************************/ + + private ImageAdapter.onSelectImageCountListener mOnSelectImageCountListener = new ImageAdapter.onSelectImageCountListener() { + @Override + public void onSelectImageCount(int count) { + String showLook = getResources().getString(R.string.preview); + if (intoIndex == 3) { + showLook = showLook + "%d/1"; + MAX_SIZE = 1; + } else { + showLook = showLook + "%d/9"; + MAX_SIZE = 9; + } + if (count == 0) { + showLook = getResources().getString(R.string.preview); + mTvPreview.setClickable(false); + mTvPreview.setText(showLook); + mTvPreview.setTextColor(ContextCompat.getColor(SelectImageActivity.this, R.color.color_b14066)); + } else if (count > 0 && count <= MAX_SIZE) { + mTvPreview.setClickable(true); + mTvPreview.setText(String.format(showLook, count)); + mTvPreview.setTextColor(ContextCompat.getColor(SelectImageActivity.this, R.color.pk_red)); + } + } + + @Override + public void onSelectImageList(List images) { + mSelectedImages = images; + } + }; + + /*************************************异步加载相册图片************************************************/ + + private LoaderManager.LoaderCallbacks mLoaderCallbacks = new LoaderManager.LoaderCallbacks() { + private final String[] IMAGE_PROJECTION = { + MediaStore.Images.Media.DATA, + MediaStore.Images.Media.DISPLAY_NAME, + MediaStore.Images.Media.DATE_ADDED, + MediaStore.Images.Media._ID, + MediaStore.Images.Media.MINI_THUMB_MAGIC, + MediaStore.Images.Media.BUCKET_DISPLAY_NAME}; + + //创建一个CursorLoader,去异步加载相册的图片 + @NonNull + @Override + public Loader onCreateLoader(int id, @Nullable Bundle args) { + if (intoIndex == 3) { + return new CursorLoader(SelectImageActivity.this, + MediaStore.Video.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, + null, null, IMAGE_PROJECTION[2] + " DESC"); + } else { + return new CursorLoader(SelectImageActivity.this, + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, + null, null, IMAGE_PROJECTION[2] + " DESC"); + } + } + + @Override + public void onLoadFinished(@NonNull Loader loader, Cursor data) { + if (data != null) { + ArrayList images = new ArrayList<>(); + //是否显示照相图片 + if (mHasCamera) { + //添加到第一个的位置(默认) + if (intoIndex != 3) { + images.add(new ImageEntity()); + } + } + ImageFolderEntity defaultFolder = new ImageFolderEntity(); + defaultFolder.setName("全部照片"); + defaultFolder.setPath(""); + mImageFolders.add(defaultFolder); + + int count = data.getCount(); + if (count > 0) { + data.moveToFirst(); + do { + String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0])); + String name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1])); + long dateTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2])); + int id = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECTION[3])); + String thumbPath = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[4])); + String bucket = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[5])); + + ImageEntity image = new ImageEntity(); + image.setPath(path); + image.setName(name); + image.setDate(dateTime); + image.setId(id); + image.setThumbPath(thumbPath); + image.setFolderName(bucket); + image.setFolderName(bucket); + images.add(image); + //如果是被选中的图片 + if (mSelectedImages.size() > 0) { + for (ImageEntity i : mSelectedImages) { + if (i.getPath().equals(image.getPath())) { + image.setSelect(true); + } + } + } + //设置图片分类的文件夹 + File imageFile = new File(path); + File folderFile = imageFile.getParentFile(); + ImageFolderEntity folder = new ImageFolderEntity(); + folder.setName(folderFile.getName()); + folder.setPath(folderFile.getAbsolutePath()); + //ImageFolder复写了equal方法,equal方法比较的是文件夹的路径 + if (!mImageFolders.contains(folder)) { + folder.getImages().add(image); + //默认相册封面 + folder.setAlbumPath(image.getPath()); + mImageFolders.add(folder); + } else { + ImageFolderEntity imageFolder = mImageFolders.get(mImageFolders.indexOf(folder)); + imageFolder.getImages().add(image); + } + } while (data.moveToNext()); + } + addImagesToAdapter(images); + //全部照片 + defaultFolder.getImages().addAll(images); + if (mHasCamera) { + defaultFolder.setAlbumPath(images.size() > 1 ? images.get(1).getPath() : null); + } else { + defaultFolder.setAlbumPath(images.size() > 0 ? images.get(0).getPath() : null); + } + //删除掉不存在的,在于用户选择了相片,又去相册删除 + if (mSelectedImages.size() > 0) { + List rs = new ArrayList<>(); + for (ImageEntity i : mSelectedImages) { + File f = new File(i.getPath()); + if (!f.exists()) { + rs.add(i); + } + } + mSelectedImages.removeAll(rs); + } + } + mImageFolderView.setImageFolders(mImageFolders); + addImageFoldersToAdapter(); + } + + @Override + public void onLoaderReset(@NonNull Loader loader) { + + } + }; + + + @Override + public void onSelectFolder(ImageFolderView imageFolderView, ImageFolderEntity imageFolder) { + addImagesToAdapter(imageFolder.getImages()); + mRvImage.scrollToPosition(0); + mTvPhoto.setText(imageFolder.getName()); + } + + @Override + public void onDismiss() { + + } + + @Override + public void onShow() { + + } + + /*************************************相机拍照************************************************/ + + @Override + public void onCameraClick() { + //首先申请下相机权限 + int isPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); + if (isPermission == PackageManager.PERMISSION_GRANTED) { + takePhoto(); + } else { + //申请权限 + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PERMISSION_REQUEST_CODE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + takePhoto(); + } else { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE); + Toast.makeText(this, "需要您的相机权限!", Toast.LENGTH_SHORT).show(); + } + } + } + + + private void takePhoto() { + //用来打开相机的Intent + Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + //这句作用是如果没有相机则该应用不会闪退,要是不加这句则当系统没有相机应用的时候该应用会闪退 + if (takePhotoIntent.resolveActivity(getPackageManager()) != null) { + takePhotoImageFile = createImageFile(); + if (takePhotoImageFile != null) { + Log.i("take photo", "ImageFilePath=" + takePhotoImageFile.getAbsolutePath()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ///7.0以上要通过FileProvider将File转化为Uri + mImageUri = FileProvider.getUriForFile(this, this.getPackageName() + ".fileprovider", takePhotoImageFile); + } else { + //7.0以下则直接使用Uri的fromFile方法将File转化为Uri + mImageUri = Uri.fromFile(takePhotoImageFile); + } + //将用于输出的文件Uri传递给相机 + takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + //启动相机 + startActivityForResult(takePhotoIntent, TAKE_PHOTO); + } + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK && requestCode == TAKE_PHOTO) { + //缩略图信息是储存在返回的intent中的Bundle中的,对应Bundle中的键为data,因此从Intent中取出 Bundle再根据data取出来Bitmap即可 + // Bundle extras = data.getExtras(); + // Bitmap bitmap = (Bitmap) extras.get("data"); +// BitmapFactory.decodeFile(this.getContentResolver().) +// galleryAddPictures(mImageUri); +// getSupportLoaderManager().restartLoader(0, null, mLoaderCallbacks); + galleryAddPictures(); + try { + Bitmap bitmap = BitmapFactory.decodeStream(this.getContentResolver().openInputStream(mImageUri)); + Log.i("take photo", bitmap + ""); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + + private File createImageFile() { + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); + String imageFileName = "BEMS_APP_IMG_" + timeStamp + "_"; + File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File imageFile = null; + try { + imageFile = File.createTempFile(imageFileName, ".jpg", storageDir); + } catch (IOException e) { + e.printStackTrace(); + } + return imageFile; + } + + /** + * 将拍的照片添加到相册 + */ + private void galleryAddPictures() { + //把文件插入到系统图库 + try { + MediaStore.Images.Media.insertImage(this.getContentResolver(), + takePhotoImageFile.getAbsolutePath(), takePhotoImageFile.getName(), null); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + //通知图库更新 + Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(takePhotoImageFile)); + sendBroadcast(mediaScanIntent); + } + +} diff --git a/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java b/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java new file mode 100644 index 000000000..eccbed765 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java @@ -0,0 +1,358 @@ +package com.yunbao.common.activity; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.MediaStore; +import androidx.annotation.RequiresApi; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.JavascriptInterface; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.Constants; +import com.yunbao.common.R; +import com.yunbao.common.utils.AndroidBug5497Workaround; +import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; + +/** + * Created by cxf on 2018/9/25. + */ + +public class WebViewActivity extends AbsActivity { + + private FrameLayout ft_title; + private ImageView btnEdit; + private ProgressBar mProgressBar; + private WebView mWebView; + private final int CHOOSE = 100;//Android 5.0以下的 + private final int CHOOSE_ANDROID_5 = 200;//Android 5.0以上的 + private ValueCallback mValueCallback; + private ValueCallback mValueCallback2; + private int indexInto = 0; + private View v_spacing; + + @Override + protected int getLayoutId() { + return R.layout.activity_webview; + } + + @Override + protected void main() { + String url = getIntent().getStringExtra(Constants.URL); + L.e("H5--->" + url); + LinearLayout rootView = (LinearLayout) findViewById(R.id.rootView); + mProgressBar = (ProgressBar) findViewById(R.id.progressbar); + btnEdit = (ImageView) findViewById(R.id.btn_edit); + ft_title = (FrameLayout) findViewById(R.id.ft_title); + v_spacing = (View) findViewById(R.id.v_spacing); + AndroidBug5497Workaround.assistActivity(this); + + mWebView = new WebView(mContext); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + params.topMargin = DpUtil.dp2px(1); + mWebView.setLayoutParams(params); + mWebView.setOverScrollMode(View.OVER_SCROLL_NEVER); + rootView.addView(mWebView); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + L.e("H5-------->" + url); + if (url.startsWith(Constants.COPY_PREFIX)) { + String content = url.substring(Constants.COPY_PREFIX.length()); + if (!TextUtils.isEmpty(content)) { + copy(content); + } + } else { + view.loadUrl(url); + } + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + setTitle(view.getTitle()); + if (url.contains("for")) { + mWebView.loadUrl("javascript:goAnchorTab()"); + } + + } + }); + mWebView.setWebChromeClient(new WebChromeClient() { + @Override + public void onProgressChanged(WebView view, int newProgress) { + if (newProgress == 100) { + mProgressBar.setVisibility(View.GONE); + } else { + mProgressBar.setProgress(newProgress); + } + } + + //以下是在各个Android版本中 WebView调用文件选择器的方法 + // For Android < 3.0 + public void openFileChooser(ValueCallback valueCallback) { + openImageChooserActivity(valueCallback); + } + + // For Android >= 3.0 + public void openFileChooser(ValueCallback valueCallback, String acceptType) { + openImageChooserActivity(valueCallback); + } + + //For Android >= 4.1 + public void openFileChooser(ValueCallback valueCallback, + String acceptType, String capture) { + openImageChooserActivity(valueCallback); + } + + // For Android >= 5.0 + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public boolean onShowFileChooser(WebView webView, + ValueCallback filePathCallback, + FileChooserParams fileChooserParams) { + mValueCallback2 = filePathCallback; + Intent intent = fileChooserParams.createIntent(); + startActivityForResult(intent, CHOOSE_ANDROID_5); + return true; + } + + }); + mWebView.addJavascriptInterface(new JsInteration(), "androidObject"); + mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // 是否允许JS打开新窗口 + mWebView.getSettings().setJavaScriptEnabled(true); + mWebView.getSettings().setDomStorageEnabled(true); + String appCachePath = mContext.getCacheDir().getAbsolutePath(); + mWebView.getSettings().setAppCachePath(appCachePath); + mWebView.getSettings().setAllowFileAccess(true); + mWebView.getSettings().setUseWideViewPort(true); // 关键点 + mWebView.getSettings().setAllowFileAccess(true); // 允许访问文件 + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } + mWebView.loadUrl(url); + + if (Constants.myIntoIndex == 2) { + ft_title.setVisibility(View.GONE); + btnEdit.setVisibility(View.GONE); + v_spacing.setVisibility(View.VISIBLE); + + } else if (Constants.myIntoIndex == 1) { + v_spacing.setVisibility(View.GONE); + } else { + btnEdit.setVisibility(View.GONE); + ft_title.setVisibility(View.VISIBLE); + v_spacing.setVisibility(View.GONE); + } + } + + //js调用原生 + public class JsInteration { + @JavascriptInterface + public void onBack() { + finish(); + } + + @JavascriptInterface + public void modifyMydata() { + indexInto = 1; + RouteUtil.forwardEditProfileActivity(); + } + + @JavascriptInterface + public void reportUser(String touid) { + RouteUtil.forwardLiveReportActivity(touid); + } + + @JavascriptInterface + public void gotoHomePage(String indexStr) { + Log.e("tgasss","indexStr4"+indexStr); + + if (!"".equals(indexStr) && indexStr != null) { + int index = -1; + if ("0".equals(indexStr)) { + index = 0; + } else if ("1".equals(indexStr)) { + index = 1; + } else if ("2".equals(indexStr)) { + index = 2; + } else if ("3".equals(indexStr)) { + index = 3; + } + if (index != -1) { + finish(); + Constants.isShowPage = index; + } + } + } + + @JavascriptInterface + public void openWebView(String url) { + Constants.isTitle = false; + RouteUtil.forwardZhuangBanActivity(url); + } + + @JavascriptInterface + public void openWebViewTitle(String url) { + Constants.isTitle = true; + RouteUtil.forwardZhuangBanActivity(url); + } + } + + private void openImageChooserActivity(ValueCallback valueCallback) { + mValueCallback = valueCallback; + Intent intent = new Intent(); + if (Build.VERSION.SDK_INT < 19) { + intent.setAction(Intent.ACTION_GET_CONTENT); + } else { + intent.setAction(Intent.ACTION_PICK); + intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + } + intent.setType("image/*"); + startActivityForResult(Intent.createChooser(intent, WordUtil.getString(R.string.choose_flie)), CHOOSE); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); + switch (requestCode) { + case CHOOSE://5.0以下选择图片后的回调 + processResult(resultCode, intent); + break; + case CHOOSE_ANDROID_5://5.0以上选择图片后的回调 + processResultAndroid5(resultCode, intent); + break; + } + } + + private void processResult(int resultCode, Intent intent) { + if (mValueCallback == null) { + return; + } + if (resultCode == RESULT_OK && intent != null) { + Uri result = intent.getData(); + mValueCallback.onReceiveValue(result); + } else { + mValueCallback.onReceiveValue(null); + } + mValueCallback = null; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private void processResultAndroid5(int resultCode, Intent intent) { + if (mValueCallback2 == null) { + return; + } + if (resultCode == RESULT_OK && intent != null) { + mValueCallback2.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); + } else { + mValueCallback2.onReceiveValue(null); + } + mValueCallback2 = null; + } + + public static void forward(Context context, String url, boolean addArgs) { + if (Constants.LoginKefu) { + if (addArgs) { + url += "&uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken(); + } + } + Intent intent = new Intent(context, WebViewActivity.class); + intent.putExtra(Constants.URL, url); + context.startActivity(intent); + } + + public static void forward(Context context, String url) { + forward(context, url, true); + } + + @Override + protected void onDestroy() { + if (mWebView != null) { + ViewGroup parent = (ViewGroup) mWebView.getParent(); + if (parent != null) { + parent.removeView(mWebView); + } + mWebView.destroy(); + } + Constants.myIntoIndex = 0; + indexInto = 0; + Constants.LoginKefu = true; + super.onDestroy(); + } + + /** + * 复制到剪贴板 + */ + private void copy(String content) { + ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("text", content); + cm.setPrimaryClip(clipData); + ToastUtil.show(getString(R.string.copy_success)); + } + + @Override + protected void onResume() { + super.onResume(); + if (Constants.myIntoIndex == 2 && mWebView != null && indexInto == 1) { + if (Build.VERSION.SDK_INT >= 21) { + mWebView.post(new Runnable() { + @Override + public void run() { + String method = "reload()";//拼接参数,就可以把数据传递给js + mWebView.evaluateJavascript(method, new ValueCallback() { + @Override + public void onReceiveValue(String value) { +// Log.i("qcl0228", "js返回的数据" + value); + } + }); + } + }); + } else { + mWebView.post(new Runnable() { + @Override + public void run() { + mWebView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + mWebView.loadUrl("javascript:reload()"); + } + }); + + } + }); + } + indexInto = 0; + } + if (Constants.isShowPage != -1) { + finish(); + } +// new Handler().postDelayed(new Runnable() { +// @Override +// public void run() { +// mWebView.reload(); +// } +// }, 100); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ChatChargeCoinAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ChatChargeCoinAdapter.java new file mode 100644 index 000000000..0534be3d8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ChatChargeCoinAdapter.java @@ -0,0 +1,136 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.Constants; +import com.yunbao.common.bean.CoinBean; +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.R; + +import java.util.List; + +/** + * Created by cxf on 2019/4/22. + */ + +public class ChatChargeCoinAdapter extends RecyclerView.Adapter { + + private List mList; + private LayoutInflater mInflater; + private String mCoinName; + private String mGoldCoinName; + private String mGiveString; + private Drawable mCheckedDrawable; + private Drawable mUnCheckedDrawable; + private int mCheckedPosition; + private View.OnClickListener mOnClickListener; + private OnItemClickListener mOnItemClickListener; + + public ChatChargeCoinAdapter(Context context, List list) { + mInflater = LayoutInflater.from(context); + mList = list; + mCoinName = CommonAppConfig.getInstance().getCoinName(); + mGoldCoinName = CommonAppConfig.getInstance().getGoldCoinName(); + mGiveString = WordUtil.getString(R.string.coin_give); + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag == null) { + return; + } + int positon = (int) tag; + CoinBean bean = mList.get(positon); + if (mCheckedPosition != positon) { + if (mCheckedPosition >= 0 && mCheckedPosition < mList.size()) { + mList.get(mCheckedPosition).setChecked(false); + notifyItemChanged(mCheckedPosition, Constants.PAYLOAD); + } + bean.setChecked(true); + notifyItemChanged(positon, Constants.PAYLOAD); + mCheckedPosition = positon; + } + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(bean, positon); + } + } + }; + mCheckedDrawable = ContextCompat.getDrawable(context, R.drawable.bg_coin_item_1); + mUnCheckedDrawable = ContextCompat.getDrawable(context, R.drawable.bg_coin_item_0); + } + + + @NonNull + @Override + public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.item_coin, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Vh holder, int position) { + + } + + @Override + public void onBindViewHolder(@NonNull Vh vh, int position, @NonNull List payloads) { + Object payload = payloads.size() > 0 ? payloads.get(0) : null; + vh.setData(mList.get(position), position, payload); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + + TextView mCoin; + TextView mMoney; + TextView mGive; + View mGiveGroup; + View mBg; + + public Vh(View itemView) { + super(itemView); + mCoin = itemView.findViewById(R.id.coin); + mMoney = itemView.findViewById(R.id.money); + mGive = itemView.findViewById(R.id.give); + mGiveGroup = itemView.findViewById(R.id.give_group); + mBg = itemView.findViewById(R.id.bg); + itemView.setOnClickListener(mOnClickListener); + } + + void setData(CoinBean bean, int position, Object payload) { + if (payload == null) { + itemView.setTag(position); + mCoin.setText(bean.getCoin()); + mMoney.setText("¥" + bean.getMoney()); + if (!"0".equals(bean.getGive())) { + if (mGiveGroup.getVisibility() != View.VISIBLE) { + mGiveGroup.setVisibility(View.VISIBLE); + } + mGive.setText(mGiveString + bean.getGive() + mGoldCoinName); + } else { + if (mGiveGroup.getVisibility() == View.VISIBLE) { + mGiveGroup.setVisibility(View.INVISIBLE); + } + } + } + mBg.setBackground(bean.isChecked() ? mCheckedDrawable : mUnCheckedDrawable); + } + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ChatChargePayAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ChatChargePayAdapter.java new file mode 100644 index 000000000..dbdae871c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ChatChargePayAdapter.java @@ -0,0 +1,156 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.yunbao.common.Constants; +import com.yunbao.common.bean.CoinPayBean; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.R; + +import java.util.List; + +/** + * Created by cxf on 2019/4/22. + */ + +public class ChatChargePayAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mList; + private LayoutInflater mInflater; + private Drawable mCheckedDrawable; + private int mCheckedPosition; + private View.OnClickListener mOnClickListener; + + public ChatChargePayAdapter(Context context, List list) { + mContext = context; + mInflater = LayoutInflater.from(context); + mList = list; + mCheckedPosition = 0; + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag == null) { + return; + } + int positon = (int) tag; + CoinPayBean bean = mList.get(positon); + if (mCheckedPosition != positon) { + if (mCheckedPosition >= 0 && mCheckedPosition < mList.size()) { + mList.get(mCheckedPosition).setChecked(false); + notifyItemChanged(mCheckedPosition, Constants.PAYLOAD); + } + bean.setChecked(true); + notifyItemChanged(positon, Constants.PAYLOAD); + mCheckedPosition = positon; + } + } + }; +// mCheckedDrawable = ContextCompat.getDrawable(context, R.drawable.icon_chat_charge_pay_1); + mCheckedDrawable = ContextCompat.getDrawable(context, R.mipmap.icon_coin_wrap); + } + + public CoinPayBean getCheckedPayBean() { + if (mList != null && mCheckedPosition >= 0 && mCheckedPosition < mList.size()) { + return mList.get(mCheckedPosition); + } + return null; + } + + @NonNull + @Override + public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.item_chat_charge_pay2, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Vh holder, int position) { + + } + + @Override + public void onBindViewHolder(@NonNull Vh vh, int position, @NonNull List payloads) { + Object payload = payloads.size() > 0 ? payloads.get(0) : null; + vh.setData(mList.get(position), position, payload); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + + ImageView mThumb; + TextView mName; + ImageView mImg; + TextView mGive; + View mGiveGroup; + ImageView mWrap; + View viewLine; + + public Vh(View itemView) { + super(itemView); + mThumb = itemView.findViewById(R.id.thumb); + mName = itemView.findViewById(R.id.name); + mImg = itemView.findViewById(R.id.img); + mGive = itemView.findViewById(R.id.give); + mGiveGroup = itemView.findViewById(R.id.give_group); + mWrap = itemView.findViewById(R.id.wrap); + viewLine = itemView.findViewById(R.id.viewLine); + itemView.setOnClickListener(mOnClickListener); + } + + void setData(CoinPayBean bean, int position, Object payload) { + if (payload == null) { + itemView.setTag(position); + ImgLoader.display(mContext, bean.getThumb(), mThumb); + + //大额 + if (bean.getPayDesc()!=null && !bean.getPayDesc().isEmpty()){ + mGiveGroup.setVisibility(View.VISIBLE); + mGive.setText(bean.getPayDesc()); + }else { + mGiveGroup.setVisibility(View.GONE); + mGive.setText(""); + } + + if (bean.getId().equals(Constants.PAY_TYPE_PAYSSION)){ + mName.setText(bean.getName()); + mName.setTextColor(Color.parseColor("#323232")); +// mName.setText(bean.getName()+" (推荐)"); +// mName.setTextColor(Color.parseColor("#ff6131")); + } + else { + mName.setText(bean.getName()); + mName.setTextColor(Color.parseColor("#323232")); + } + } + + if (bean.isChecked()) { + if (mWrap.getVisibility() != View.VISIBLE) { + mWrap.setVisibility(View.VISIBLE); + } + viewLine.setVisibility(View.GONE); + } else { + if (mWrap.getVisibility() == View.VISIBLE) { + mWrap.setVisibility(View.INVISIBLE); + } + viewLine.setVisibility(View.VISIBLE); + } +// mImg.setImageDrawable(bean.isChecked() ? mCheckedDrawable : null); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/adapter/CommonRecycleAdapter.java b/common/src/main/java/com/yunbao/common/adapter/CommonRecycleAdapter.java new file mode 100644 index 000000000..807fcee0c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/CommonRecycleAdapter.java @@ -0,0 +1,85 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by Chen Haoxuan on 2022/4/30. + */ + +public abstract class CommonRecycleAdapter extends RecyclerView.Adapter { + private int mLayoutId; + private List mData; + private LayoutInflater mInflater; + private OnItemClickListener mItemClickListener; + private MultiTypeSupport mTypeSupport; + + + public CommonRecycleAdapter(Context context, List mData, int layoutId) { + this.mData = mData; + this.mLayoutId = layoutId; + mInflater = LayoutInflater.from(context); + } + + public CommonRecycleAdapter(Context context, List mData, MultiTypeSupport typeSupport) { + this(context, mData, -1); + this.mTypeSupport = typeSupport; + } + + @NonNull + @Override + public CommonViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (mTypeSupport != null) { + //多布局 + mLayoutId = viewType; + } + View itemView = mInflater.inflate(mLayoutId, parent, false); + return new CommonViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull CommonViewHolder holder, final int position) { + convert(holder, mData.get(position), position); + if (mItemClickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mItemClickListener.onItemClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @Override + public int getItemViewType(int position) { + //多布局 + if (mTypeSupport != null) { + return mTypeSupport.getLayoutId(mData.get(position)); + } + return super.getItemViewType(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + //点击事件 + public void setItemClickListener(OnItemClickListener itemClickListener) { + this.mItemClickListener = itemClickListener; + } + + protected abstract void convert(CommonViewHolder holder, T t, int position); + +} diff --git a/common/src/main/java/com/yunbao/common/adapter/CommonViewHolder.java b/common/src/main/java/com/yunbao/common/adapter/CommonViewHolder.java new file mode 100644 index 000000000..2b44d5c07 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/CommonViewHolder.java @@ -0,0 +1,101 @@ +package com.yunbao.common.adapter; + +import androidx.recyclerview.widget.RecyclerView; +import android.util.SparseArray; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +/** + * Created by zhiwenyan on 5/25/17. + *

+ * 通用的ViewHolder + */ + +public class CommonViewHolder extends RecyclerView.ViewHolder { + //用于缓存View + private SparseArray mView; + + public CommonViewHolder(View itemView) { + super(itemView); + mView = new SparseArray<>(); + } + + + public T getView(int viewId) { + View view = mView.get(viewId); + if (view == null) { + view = itemView.findViewById(viewId); + mView.put(viewId, view); + } + return (T) view; + } + + + //通用的setText进行封装 + + /** + * @param viewId + * @param text + * @return + */ + public CommonViewHolder setText(int viewId, CharSequence text) { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + /** + * 本地图片 + * + * @param viewId + * @param resourceId + * @return + */ + public CommonViewHolder setImageResoucrce(int viewId, int resourceId) { + ImageView iv = getView(viewId); + iv.setImageResource(resourceId); + return this; + } + + + + + /** + * 网络图片处理 + * + * @param viewId + * @param imageLoader + * @return + */ + public CommonViewHolder setImagePath(int viewId, HolderImageLoader imageLoader) { + ImageView iv = getView(viewId); + imageLoader.loadImage(iv, imageLoader.getPath()); + return this; + } + + abstract static class HolderImageLoader { + private String path; + + public HolderImageLoader(String path) { + this.path = path; + } + + /** + * 加载图片 + * + * @param imageView + * @param path + */ + abstract void loadImage(ImageView imageView, String path); + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ImChatFaceAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ImChatFaceAdapter.java new file mode 100644 index 000000000..446c9e1d5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ImChatFaceAdapter.java @@ -0,0 +1,88 @@ +package com.yunbao.common.adapter; + +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.yunbao.common.utils.FaceUtil; +import com.yunbao.common.R; +import com.yunbao.common.interfaces.OnFaceClickListener; + +import java.util.List; + +/** + * Created by cxf on 2018/7/11. + * 聊天表情的RecyclerView Adapter + */ + +public class ImChatFaceAdapter extends RecyclerView.Adapter { + + private List mList; + private LayoutInflater mInflater; + private View.OnClickListener mOnClickListener; + + public ImChatFaceAdapter(List list, LayoutInflater inflater, final OnFaceClickListener onFaceClickListener) { + mList = list; + mInflater = inflater; + mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag != null && onFaceClickListener != null) { + String str = (String) v.getTag(); + if (!TextUtils.isEmpty(str)) { + if ("<".equals(str)) { + onFaceClickListener.onFaceDeleteClick(); + } else { + onFaceClickListener.onFaceClick(str, v.getId()); + } + } + } + } + }; + } + + @Override + public Vh onCreateViewHolder(ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.item_list_face, parent, false)); + } + + @Override + public void onBindViewHolder(Vh vh, int position) { + vh.setData(mList.get(position)); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + + ImageView mImageView; + + public Vh(View itemView) { + super(itemView); + mImageView = (ImageView) itemView; + mImageView.setOnClickListener(mOnClickListener); + } + + void setData(String str) { + mImageView.setTag(str); + if (!TextUtils.isEmpty(str)) { + if ("<".equals(str)) { + mImageView.setImageResource(R.mipmap.icon_face_delete); + } else { + int imgRes = FaceUtil.getFaceImageRes(str); + mImageView.setId(imgRes); + mImageView.setImageResource(imgRes); + } + }else{ + mImageView.setClickable(false); + } + } + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ImChatFacePagerAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ImChatFacePagerAdapter.java new file mode 100644 index 000000000..03ca93bfc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ImChatFacePagerAdapter.java @@ -0,0 +1,80 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import androidx.annotation.Nullable; +import androidx.viewpager.widget.PagerAdapter; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.yunbao.common.utils.FaceUtil; +import com.yunbao.common.R; +import com.yunbao.common.interfaces.OnFaceClickListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2018/7/11. + * 聊天表情的ViewPager Adapter + */ + +public class ImChatFacePagerAdapter extends PagerAdapter { + + private List mViewList; + private static final int FACE_COUNT = 20;//每页20个表情 + + public ImChatFacePagerAdapter(Context context, OnFaceClickListener onFaceClickListener) { + LayoutInflater inflater = LayoutInflater.from(context); + mViewList = new ArrayList<>(); + List faceList = FaceUtil.getFaceList(); + int fromIndex = 0; + int size = faceList.size(); + int pageCount = size / FACE_COUNT; + if (size % FACE_COUNT > 0) { + pageCount++; + for (int i = 0, count = pageCount * FACE_COUNT - size; i < count; i++) { + faceList.add(""); + } + } + for (int i = 0; i < pageCount; i++) { + RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.view_chat_face_page, null, false); + recyclerView.setHasFixedSize(true); + recyclerView.setLayoutManager(new GridLayoutManager(context, 7, GridLayoutManager.VERTICAL, false)); + int endIndex = fromIndex + FACE_COUNT; + List list = new ArrayList<>(); + for (int j = fromIndex; j < endIndex; j++) { + list.add(faceList.get(j)); + } + list.add("<"); + recyclerView.setAdapter(new ImChatFaceAdapter(list, inflater, onFaceClickListener)); + mViewList.add(recyclerView); + fromIndex = endIndex; + } + } + + @Override + public int getCount() { + return mViewList.size(); + } + + @Override + public boolean isViewFromObject(@Nullable View view, @Nullable Object object) { + return view == object; + } + + @Override + public Object instantiateItem(@Nullable ViewGroup container, int position) { + View view = mViewList.get(position); + container.addView(view); + return view; + } + + + @Override + public void destroyItem(@Nullable ViewGroup container, int position, @Nullable Object object) { + container.removeView(mViewList.get(position)); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ImageAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ImageAdapter.java new file mode 100644 index 000000000..31ee9ed04 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ImageAdapter.java @@ -0,0 +1,92 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; + +import com.yunbao.common.R; +import com.yunbao.common.activity.SelectImageActivity; +import com.yunbao.common.bean.ImageEntity; +import com.yunbao.common.glide.ImgLoader; + +import java.util.List; + +/** + * Created by Chen Haoxuan on 2022/4/30. + * Description: + */ +public class ImageAdapter extends CommonRecycleAdapter { + private Context mContext; + private onSelectImageCountListener mSelectImageCountListener; + private List mSelectImages; + + public ImageAdapter(Context context, List images, List selectedImages, MultiTypeSupport typeSupport) { + super(context, images, typeSupport); + this.mContext = context; + this.mSelectImages = selectedImages; + } + + @Override + protected void convert(CommonViewHolder holder, final ImageEntity image, int position) { + if (!TextUtils.isEmpty(image.getPath())) { + final ImageView chb_selected = holder.getView(R.id.iv_selected); + final View maskView = holder.getView(R.id.mask); + ImageView iv_image = holder.getView(R.id.iv_image); +// GlideApp.with(mContext).load(image.getPath()).into(iv_image); + ImgLoader.display(mContext, image.getPath(), iv_image); + + chb_selected.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (image.isSelect()) { + image.setSelect(false); + mSelectImages.remove(image); + chb_selected.setSelected(false); + } else if (mSelectImages.size() < SelectImageActivity.MAX_SIZE) { + image.setSelect(true); + mSelectImages.add(image); + chb_selected.setSelected(true); +// maskView.setVisibility(image.isSelect() ? View.VISIBLE : View.GONE); + } + if (mSelectImageCountListener != null) { + mSelectImageCountListener.onSelectImageCount(mSelectImages.size()); + mSelectImageCountListener.onSelectImageList(mSelectImages); + } + } + }); + chb_selected.setSelected(image.isSelect()); +// maskView.setVisibility(image.isSelect() ? View.VISIBLE : View.GONE); + } else { + holder.getView(R.id.iv_camera).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnCameraClickListener != null) { + mOnCameraClickListener.onCameraClick(); + } + } + }); + } + } + + + public void setSelectImageCountListener(onSelectImageCountListener selectImageCountListener) { + mSelectImageCountListener = selectImageCountListener; + } + + public interface onSelectImageCountListener { + void onSelectImageCount(int count); + + void onSelectImageList(List images); + } + + private onCameraClickListener mOnCameraClickListener; + + public void setOnCameraClickListener(onCameraClickListener onCameraClickListener) { + this.mOnCameraClickListener = onCameraClickListener; + } + + public interface onCameraClickListener { + void onCameraClick(); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ImageFolderAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ImageFolderAdapter.java new file mode 100644 index 000000000..6f7c9e4bf --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ImageFolderAdapter.java @@ -0,0 +1,34 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.widget.ImageView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.ImageFolderEntity; +import com.yunbao.common.glide.ImgLoader; + +import java.util.List; + +/** + * Created by Chen Haoxuan on 2022/4/30. + */ +public class ImageFolderAdapter extends CommonRecycleAdapter { + private Context mContext; + + public ImageFolderAdapter(Context context, List imageFolders, int layoutId) { + super(context, imageFolders, layoutId); + this.mContext = context; + } + + @Override + protected void convert(CommonViewHolder holder, ImageFolderEntity imageFolder, int potion) { + holder.setText(R.id.tv_folder_name, imageFolder.getName()) + .setText(R.id.tv_size, imageFolder.getImages().size() + "张"); + ImageView iv_folder = holder.getView(R.id.iv_folder); + ImgLoader.display(mContext, imageFolder.getAlbumPath(), iv_folder); +// GlideApp.with(mContext) +// .load(imageFolder.getAlbumPath()) +// .into(iv_folder); + + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/MultiTypeSupport.java b/common/src/main/java/com/yunbao/common/adapter/MultiTypeSupport.java new file mode 100644 index 000000000..351a95084 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/MultiTypeSupport.java @@ -0,0 +1,10 @@ +package com.yunbao.common.adapter; + +/** + * Created by Chen Haoxuan on 2022/4/30. + * 多布局的支持 + */ + +public interface MultiTypeSupport { + int getLayoutId(T item); +} diff --git a/common/src/main/java/com/yunbao/common/adapter/OnItemClickListener.java b/common/src/main/java/com/yunbao/common/adapter/OnItemClickListener.java new file mode 100644 index 000000000..f33dc47a4 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/OnItemClickListener.java @@ -0,0 +1,11 @@ +package com.yunbao.common.adapter; + +/** + * Created by zhiwenyan on 5/25/17. + *

+ * 条目的点击事件 + */ + +public interface OnItemClickListener { + void onItemClick(int position); +} diff --git a/common/src/main/java/com/yunbao/common/adapter/RefreshAdapter.java b/common/src/main/java/com/yunbao/common/adapter/RefreshAdapter.java new file mode 100644 index 000000000..f385d9648 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/RefreshAdapter.java @@ -0,0 +1,105 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; + +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.interfaces.OnItemLongClickListener; +import com.yunbao.common.utils.ClickUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2018/6/7. + */ + +public abstract class RefreshAdapter extends RecyclerView.Adapter { + + protected Context mContext; + protected List mList; + protected LayoutInflater mInflater; + protected RecyclerView mRecyclerView; + protected OnItemClickListener mOnItemClickListener; + protected OnItemLongClickListener mOnItemLongClickListener; + + public RefreshAdapter(Context context) { + this(context, new ArrayList()); + } + + public RefreshAdapter(Context context, List list) { + mList = list; + mContext = context; + mInflater = LayoutInflater.from(mContext); + setHasStableIds(true); + } + + @Override + public int getItemCount() { + if (mList != null) { + return mList.size(); + } + return 0; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } + + public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { + mOnItemLongClickListener = onItemLongClickListener; + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + mRecyclerView = recyclerView; + } + + public RecyclerView getRecyclerView() { + return mRecyclerView; + } + + public void setList(List list) { + if (mList != null) { + mList.clear(); + mList.addAll(list); + } + } + + public void refreshData(List list) { + if (mRecyclerView != null && list != null) { + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + } + + public void insertList(List list) { + if (mRecyclerView != null && mList != null && list != null && list.size() > 0) { + int p = mList.size(); + mList.addAll(list); + notifyItemRangeInserted(p, list.size()); + } + } + + public void clearData() { + if (mRecyclerView != null && mList != null) { + mList.clear(); + notifyDataSetChanged(); + } + } + + @Override + public long getItemId(int position) { + return position; + } + + protected boolean canClick() { + return ClickUtil.canClick(); + } + + public List getList() { + return mList; + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/SpaceGridItemDecoration.java b/common/src/main/java/com/yunbao/common/adapter/SpaceGridItemDecoration.java new file mode 100644 index 000000000..1f3fcfaae --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/SpaceGridItemDecoration.java @@ -0,0 +1,26 @@ +package com.yunbao.common.adapter; + +import android.graphics.Rect; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; + +/** + * Created by Chen Haoxuan on 2022/4/30 + * Description: + */ +public class SpaceGridItemDecoration extends RecyclerView.ItemDecoration { + private int space; + + public SpaceGridItemDecoration(int space) { + this.space = space; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + outRect.left = space; + outRect.top = space; + outRect.right = space; + outRect.bottom = space; + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/ViewPagerAdapter.java b/common/src/main/java/com/yunbao/common/adapter/ViewPagerAdapter.java new file mode 100644 index 000000000..217c2a592 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/ViewPagerAdapter.java @@ -0,0 +1,45 @@ +package com.yunbao.common.adapter; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by cxf on 2018/9/22. + */ + +public class ViewPagerAdapter extends PagerAdapter { + + private List mViewList; + + public ViewPagerAdapter(List list) { + mViewList = list; + } + + @Override + public int getCount() { + return mViewList.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + View view = mViewList.get(position); + container.addView(view); + return view; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + container.removeView(mViewList.get(position)); + } + +} diff --git a/common/src/main/java/com/yunbao/common/bean/AdBean.java b/common/src/main/java/com/yunbao/common/bean/AdBean.java new file mode 100644 index 000000000..04228b08c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/AdBean.java @@ -0,0 +1,29 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2019/4/28. + */ + +public class AdBean { + private String mUrl; + private String mLink; + + @JSONField(name = "thumb") + public String getUrl() { + return mUrl; + } + @JSONField(name = "thumb") + public void setUrl(String url) { + mUrl = url; + } + @JSONField(name = "href") + public String getLink() { + return mLink; + } + @JSONField(name = "href") + public void setLink(String link) { + mLink = link; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/BannerBean.java b/common/src/main/java/com/yunbao/common/bean/BannerBean.java new file mode 100644 index 000000000..c95b9a437 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/BannerBean.java @@ -0,0 +1,52 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2019/3/30. + */ + +public class BannerBean { + private String mImageUrl; + private String mLink; + private String show_type; + private String mIntoUrl; + + public String getShow_type() { + return show_type; + } + + public void setShow_type(String show_type) { + this.show_type = show_type; + } + + @JSONField(name = "slide_pic") + public String getImageUrl() { + return mImageUrl; + } + + @JSONField(name = "slide_pic") + public void setImageUrl(String imageUrl) { + mImageUrl = imageUrl; + } + + @JSONField(name = "slide_url") + public String getLink() { + return mLink; + } + + @JSONField(name = "slide_url") + public void setLink(String link) { + mLink = link; + } + + @JSONField(name = "href") + public String getmIntoUrl() { + return mIntoUrl; + } + + @JSONField(name = "href") + public void setmIntoUrl(String intoUrl) { + mIntoUrl = intoUrl; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/ChatRemarksBean.java b/common/src/main/java/com/yunbao/common/bean/ChatRemarksBean.java new file mode 100644 index 000000000..34de46868 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/ChatRemarksBean.java @@ -0,0 +1,30 @@ +package com.yunbao.common.bean; + +public class ChatRemarksBean { + String userId; + String remarks; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public ChatRemarksBean() { + } + + public ChatRemarksBean(String userId, String remarks) { + this.userId = userId; + this.remarks = remarks; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/CoinBean.java b/common/src/main/java/com/yunbao/common/bean/CoinBean.java new file mode 100644 index 000000000..a8d546c30 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/CoinBean.java @@ -0,0 +1,108 @@ +package com.yunbao.common.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by cxf on 2017/9/21. + */ + +public class CoinBean implements Parcelable{ + + private String id; + private String coin; + private String money; + private String give; + private String money_usd; + private boolean checked; + + public CoinBean(){ + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCoin() { + return coin; + } + + public void setCoin(String coin) { + this.coin = coin; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getGive() { + return give; + } + + public void setGive(String give) { + this.give = give; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + + public String getMoney_usd() { + return money_usd; + } + + public void setMoney_usd(String money_usd) { + this.money_usd = money_usd; + } + + @Override + public int describeContents() { + return 0; + } + + public CoinBean(Parcel in) { + id = in.readString(); + coin = in.readString(); + money = in.readString(); + give = in.readString(); + money_usd= in.readString(); + checked = in.readByte() != 0; + } + + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(id); + dest.writeString(coin); + dest.writeString(money); + dest.writeString(give); + dest.writeString(money_usd); + dest.writeByte((byte) (checked ? 1 : 0)); + } + + public static final Creator CREATOR = new Creator() { + @Override + public CoinBean createFromParcel(Parcel in) { + return new CoinBean(in); + } + + @Override + public CoinBean[] newArray(int size) { + return new CoinBean[size]; + } + }; +} diff --git a/common/src/main/java/com/yunbao/common/bean/CoinPayBean.java b/common/src/main/java/com/yunbao/common/bean/CoinPayBean.java new file mode 100644 index 000000000..2bc5d4435 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/CoinPayBean.java @@ -0,0 +1,92 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2019/4/11. + */ + +public class CoinPayBean { + private String mId; + private String mName; + private String mThumb; + private String mHref; + private boolean mChecked; + private String mPayDesc;//支付描述,如推荐大额 + private String mPriceNum;//显示价格的数量 + + @JSONField(name = "id") + public String getId() { + return mId; + } + + @JSONField(name = "id") + public void setId(String id) { + mId = id; + } + + @JSONField(name = "name") + public String getName() { + return mName; + } + + @JSONField(name = "name") + public void setName(String name) { + mName = name; + } + + + + @JSONField(name = "payDesc") + public String getPayDesc() { + return mPayDesc; + } + + @JSONField(name = "payDesc") + public void setPayDesc(String payDesc) { + mPayDesc = payDesc; + } + + + @JSONField(name = "priceNum") + public String getPriceNum() { + return mPriceNum; + } + + @JSONField(name = "priceNum") + public void setPriceNum(String priceNum) { + mPriceNum = priceNum; + } + + + + @JSONField(name = "thumb") + public String getThumb() { + return mThumb; + } + + @JSONField(name = "thumb") + public void setThumb(String thumb) { + mThumb = thumb; + } + + @JSONField(name = "href") + public String getHref() { + return mHref; + } + + @JSONField(name = "href") + public void setHref(String href) { + mHref = href; + } + + @JSONField(serialize = false) + public boolean isChecked() { + return mChecked; + } + + @JSONField(serialize = false) + public void setChecked(boolean checked) { + mChecked = checked; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/ConfigBean.java b/common/src/main/java/com/yunbao/common/bean/ConfigBean.java new file mode 100644 index 000000000..718c4e526 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/ConfigBean.java @@ -0,0 +1,566 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by cxf on 2017/8/5. + */ + +public class ConfigBean { + private String version;//Android apk安装包 版本号 + private String downloadApkUrl;//Android apk安装包 下载地址 + private String updateDes;//版本更新描述 + private String liveWxShareUrl;//直播间微信分享地址 + private String liveShareTitle;//直播间分享标题 + private String liveShareDes;//直播间分享描述 + private String videoShareTitle;//短视频分享标题 + private String videoShareDes;//短视频分享描述 + private int videoAuditSwitch;//短视频审核是否开启 + private int videoCloudType;//短视频云储存类型 1七牛云 2腾讯云 + private String videoQiNiuHost;//短视频七牛云域名 + private String txCosAppId;//腾讯云存储appId + private String txCosRegion;//腾讯云存储区域 + private String txCosBucketName;//腾讯云存储桶名字 + private String txCosVideoPath;//腾讯云存储视频文件夹 + private String txCosImagePath;//腾讯云存储图片文件夹 + private String coinName;//钻石名称 + private String goldCoinName;//金币名称 + private String votesName;//映票名称 + private String[] liveTimeCoin;//直播间计时收费规则 + private String[] loginType;//三方登录类型 + private String[][] liveType;//直播间开播类型 + private String[] shareType;//分享类型 + private List liveClass;//直播分类 + private int maintainSwitch;//维护开关 + private String maintainTips;//维护提示 + private String beautyKey;//萌颜鉴权码 + private int beautyMeiBai;//萌颜美白数值 + private int beautyMoPi;//萌颜磨皮数值 + private int beautyBaoHe;//萌颜饱和数值 + private int beautyFenNen;//萌颜粉嫩数值 + private int beautyBigEye;//萌颜大眼数值 + private int beautyFace;//萌颜瘦脸数值 + private int faceNarrowing;//窄脸 + private String mAdInfo;//引导页 广告信息 + private int priMsgSwitch;//私信开关 + private int forceUpdate;//强制更新 + private String sproutType;//美颜类型,1-基础美颜,2-萌颜,3-360美颜 + + private String paster360Url;//360贴纸下载地址 + private String pkTime;//主播pk时间 + private String serverUrl;//客服地址 + private String AllServerGiftIcon;//全服通知横幅icon + private String turntableEnable;//转盘使能 + private String txVideoUgcLicenceUrl;//腾讯直播视频鉴权 + private String txPlayUgcLicenceUrl;//腾讯短视频鉴权 + private String txVideoUgcKey; + + @JSONField(name = "tx_play_ugc_licence_url") + public String getTxPlayUgcLicenceUrl() { + return txPlayUgcLicenceUrl; + } + @JSONField(name = "tx_play_ugc_licence_url") + public void setTxPlayUgcLicenceUrl(String txPlayUgcLicenceUrl) { + this.txPlayUgcLicenceUrl = txPlayUgcLicenceUrl; + } + + @Override + public String toString() { + return "ConfigBean{" + + "version='" + version + '\'' + + ", downloadApkUrl='" + downloadApkUrl + '\'' + + ", updateDes='" + updateDes + '\'' + + ", liveWxShareUrl='" + liveWxShareUrl + '\'' + + ", liveShareTitle='" + liveShareTitle + '\'' + + ", liveShareDes='" + liveShareDes + '\'' + + ", videoShareTitle='" + videoShareTitle + '\'' + + ", videoShareDes='" + videoShareDes + '\'' + + ", videoAuditSwitch=" + videoAuditSwitch + + ", videoCloudType=" + videoCloudType + + ", videoQiNiuHost='" + videoQiNiuHost + '\'' + + ", txCosAppId='" + txCosAppId + '\'' + + ", txCosRegion='" + txCosRegion + '\'' + + ", txCosBucketName='" + txCosBucketName + '\'' + + ", txCosVideoPath='" + txCosVideoPath + '\'' + + ", txCosImagePath='" + txCosImagePath + '\'' + + ", coinName='" + coinName + '\'' + + ", goldCoinName='" + goldCoinName + '\'' + + ", votesName='" + votesName + '\'' + + ", liveTimeCoin=" + Arrays.toString(liveTimeCoin) + + ", loginType=" + Arrays.toString(loginType) + + ", liveType=" + Arrays.toString(liveType) + + ", shareType=" + Arrays.toString(shareType) + + ", liveClass=" + liveClass + + ", maintainSwitch=" + maintainSwitch + + ", maintainTips='" + maintainTips + '\'' + + ", beautyKey='" + beautyKey + '\'' + + ", beautyMeiBai=" + beautyMeiBai + + ", beautyMoPi=" + beautyMoPi + + ", beautyBaoHe=" + beautyBaoHe + + ", beautyFenNen=" + beautyFenNen + + ", beautyBigEye=" + beautyBigEye + + ", beautyFace=" + beautyFace + + ", faceNarrowing=" + faceNarrowing + + ", mAdInfo='" + mAdInfo + '\'' + + ", priMsgSwitch=" + priMsgSwitch + + ", forceUpdate=" + forceUpdate + + ", sproutType='" + sproutType + '\'' + + ", paster360Url='" + paster360Url + '\'' + + ", pkTime='" + pkTime + '\'' + + ", serverUrl='" + serverUrl + '\'' + + ", AllServerGiftIcon='" + AllServerGiftIcon + '\'' + + ", turntableEnable='" + turntableEnable + '\'' + + ", txVideoUgcLicenceUrl='" + txVideoUgcLicenceUrl + '\'' + + ", txVideoUgcKey='" + txVideoUgcKey + '\'' + + '}'; + } + + @JSONField(name = "apk_ver") + public String getVersion() { + return version; + } + + @JSONField(name = "apk_ver") + public void setVersion(String version) { + this.version = version; + } + + @JSONField(name = "apk_url") + public String getDownloadApkUrl() { + return downloadApkUrl; + } + + @JSONField(name = "apk_url") + public void setDownloadApkUrl(String downloadApkUrl) { + this.downloadApkUrl = downloadApkUrl; + } + + @JSONField(name = "apk_des") + public String getUpdateDes() { + return updateDes; + } + + @JSONField(name = "apk_des") + public void setUpdateDes(String updateDes) { + this.updateDes = updateDes; + } + + @JSONField(name = "wx_siteurl") + public void setLiveWxShareUrl(String liveWxShareUrl) { + this.liveWxShareUrl = liveWxShareUrl; + } + + @JSONField(name = "wx_siteurl") + public String getLiveWxShareUrl() { + return liveWxShareUrl; + } + + @JSONField(name = "share_title") + public String getLiveShareTitle() { + return liveShareTitle; + } + + @JSONField(name = "share_title") + public void setLiveShareTitle(String liveShareTitle) { + this.liveShareTitle = liveShareTitle; + } + + @JSONField(name = "share_des") + public String getLiveShareDes() { + return liveShareDes; + } + + @JSONField(name = "share_des") + public void setLiveShareDes(String liveShareDes) { + this.liveShareDes = liveShareDes; + } + + @JSONField(name = "name_coin") + public String getCoinName() { + return coinName; + } + + @JSONField(name = "name_coin") + public void setCoinName(String coinName) { + this.coinName = coinName; + } + + @JSONField(name = "name_votes") + public String getVotesName() { + return votesName; + } + + @JSONField(name = "name_votes") + public void setVotesName(String votesName) { + this.votesName = votesName; + } + + @JSONField(name = "live_time_coin") + public String[] getLiveTimeCoin() { + return liveTimeCoin; + } + + @JSONField(name = "live_time_coin") + public void setLiveTimeCoin(String[] liveTimeCoin) { + this.liveTimeCoin = liveTimeCoin; + } + + @JSONField(name = "login_type") + public String[] getLoginType() { + return loginType; + } + + + @JSONField(name = "login_type") + public void setLoginType(String[] loginType) { + this.loginType = loginType; + } + + @JSONField(name = "live_type") + public String[][] getLiveType() { + return liveType; + } + + @JSONField(name = "live_type") + public void setLiveType(String[][] liveType) { + this.liveType = liveType; + } + + @JSONField(name = "share_type") + public String[] getShareType() { + return shareType; + } + + @JSONField(name = "share_type") + public void setShareType(String[] shareType) { + this.shareType = shareType; + } + + @JSONField(name = "liveclass") + public List getLiveClass() { + return liveClass; + } + + @JSONField(name = "liveclass") + public void setLiveClass(List liveClass) { + this.liveClass = liveClass; + } + + @JSONField(name = "maintain_switch") + public int getMaintainSwitch() { + return maintainSwitch; + } + + @JSONField(name = "maintain_switch") + public void setMaintainSwitch(int maintainSwitch) { + this.maintainSwitch = maintainSwitch; + } + + @JSONField(name = "maintain_tips") + public String getMaintainTips() { + return maintainTips; + } + + @JSONField(name = "maintain_tips") + public void setMaintainTips(String maintainTips) { + this.maintainTips = maintainTips; + } + + @JSONField(name = "sprout_key") + public String getBeautyKey() { + return beautyKey; + } + + @JSONField(name = "sprout_key") + public void setBeautyKey(String beautyKey) { + this.beautyKey = beautyKey; + } + + @JSONField(name = "sprout_white") + public int getBeautyMeiBai() { + return beautyMeiBai; + } + + @JSONField(name = "sprout_white") + public void setBeautyMeiBai(int beautyMeiBai) { + this.beautyMeiBai = beautyMeiBai; + } + + @JSONField(name = "sprout_skin") + public int getBeautyMoPi() { + return beautyMoPi; + } + + @JSONField(name = "sprout_skin") + public void setBeautyMoPi(int beautyMoPi) { + this.beautyMoPi = beautyMoPi; + } + + @JSONField(name = "sprout_saturated") + public int getBeautyBaoHe() { + return beautyBaoHe; + } + + @JSONField(name = "sprout_saturated") + public void setBeautyBaoHe(int beautyBaoHe) { + this.beautyBaoHe = beautyBaoHe; + } + + @JSONField(name = "sprout_pink") + public int getBeautyFenNen() { + return beautyFenNen; + } + + @JSONField(name = "sprout_pink") + public void setBeautyFenNen(int beautyFenNen) { + this.beautyFenNen = beautyFenNen; + } + + @JSONField(name = "sprout_eye") + public int getBeautyBigEye() { + return beautyBigEye; + } + + @JSONField(name = "sprout_eye") + public void setBeautyBigEye(int beautyBigEye) { + this.beautyBigEye = beautyBigEye; + } + + @JSONField(name = "sprout_face") + public int getBeautyFace() { + return beautyFace; + } + + @JSONField(name = "sprout_face") + public void setBeautyFace(int beautyFace) { + this.beautyFace = beautyFace; + } + @JSONField(name = "sprout_face_narrowing") + public int getBeautyFaceNarrowing() { + return faceNarrowing; + } + + @JSONField(name = "sprout_face_narrowing") + public void setBeautyFaceNarrowing(int faceNarrowing) { + this.faceNarrowing = faceNarrowing; + } + + public String[] getVideoShareTypes() { + return shareType; + } + + @JSONField(name = "video_share_title") + public String getVideoShareTitle() { + return videoShareTitle; + } + + @JSONField(name = "video_share_title") + public void setVideoShareTitle(String videoShareTitle) { + this.videoShareTitle = videoShareTitle; + } + + @JSONField(name = "video_share_des") + public String getVideoShareDes() { + return videoShareDes; + } + + @JSONField(name = "video_share_des") + public void setVideoShareDes(String videoShareDes) { + this.videoShareDes = videoShareDes; + } + + @JSONField(name = "video_audit_switch") + public int getVideoAuditSwitch() { + return videoAuditSwitch; + } + + @JSONField(name = "video_audit_switch") + public void setVideoAuditSwitch(int videoAuditSwitch) { + this.videoAuditSwitch = videoAuditSwitch; + } + + @JSONField(name = "cloudtype") + public int getVideoCloudType() { + return videoCloudType; + } + + @JSONField(name = "cloudtype") + public void setVideoCloudType(int videoCloudType) { + this.videoCloudType = videoCloudType; + } + + @JSONField(name = "qiniu_domain") + public String getVideoQiNiuHost() { + return videoQiNiuHost; + } + + @JSONField(name = "qiniu_domain") + public void setVideoQiNiuHost(String videoQiNiuHost) { + this.videoQiNiuHost = videoQiNiuHost; + } + + @JSONField(name = "txcloud_appid") + public String getTxCosAppId() { + return txCosAppId; + } + + @JSONField(name = "txcloud_appid") + public void setTxCosAppId(String txCosAppId) { + this.txCosAppId = txCosAppId; + } + + @JSONField(name = "txcloud_region") + public String getTxCosRegion() { + return txCosRegion; + } + + @JSONField(name = "txcloud_region") + public void setTxCosRegion(String txCosRegion) { + this.txCosRegion = txCosRegion; + } + + @JSONField(name = "txcloud_bucket") + public String getTxCosBucketName() { + return txCosBucketName; + } + + @JSONField(name = "txcloud_bucket") + public void setTxCosBucketName(String txCosBucketName) { + this.txCosBucketName = txCosBucketName; + } + + @JSONField(name = "txvideofolder") + public String getTxCosVideoPath() { + return txCosVideoPath; + } + + @JSONField(name = "txvideofolder") + public void setTxCosVideoPath(String txCosVideoPath) { + this.txCosVideoPath = txCosVideoPath; + } + + @JSONField(name = "tximgfolder") + public String getTxCosImagePath() { + return txCosImagePath; + } + + @JSONField(name = "tximgfolder") + public void setTxCosImagePath(String txCosImagePath) { + this.txCosImagePath = txCosImagePath; + } + + @JSONField(name = "guide") + public String getAdInfo() { + return mAdInfo; + } + @JSONField(name = "guide") + public void setAdInfo(String adInfo) { + mAdInfo = adInfo; + } + @JSONField(name = "letter_switch") + public int getPriMsgSwitch() { + return priMsgSwitch; + } + @JSONField(name = "letter_switch") + public void setPriMsgSwitch(int priMsgSwitch) { + this.priMsgSwitch = priMsgSwitch; + } + @JSONField(name = "isup") + public int getForceUpdate() { + return forceUpdate; + } + @JSONField(name = "isup") + public void setForceUpdate(int forceUpdate) { + this.forceUpdate = forceUpdate; + } + + @JSONField(name = "sprout_type") + public String getSproutType() { + return sproutType; + } + @JSONField(name = "sprout_type") + public void setSproutType(String sprout_type) { + this.sproutType = sprout_type; + } + + @JSONField(name = "turntable_enable") + public String getTurntableEnable() { + return turntableEnable; + } + @JSONField(name = "turntable_enable") + public void setTurntableEnable(String turntable) { + this.turntableEnable = turntable; + } + + + @JSONField(name = "tx_video_ugc_licence_url") + public String getTxVideoUgcLicenceUrl() { + return txVideoUgcLicenceUrl; + } + + @JSONField(name = "tx_video_ugc_licence_url") + public void setTxVideoUgcLicenceUrl(String txVideoUgcLicenceUrl) { + this.txVideoUgcLicenceUrl = txVideoUgcLicenceUrl; + } + + @JSONField(name = "tx_video_ugc_key") + public String getTxVideoUgcKey() { + return txVideoUgcKey; + } + + @JSONField(name = "tx_video_ugc_key") + public void setTxVideoUgcKey(String txVideoUgcKey) { + this.txVideoUgcKey = txVideoUgcKey; + } + + @JSONField(name = "360_paster_url") + public String getPaster360Url() { + return paster360Url; + } + @JSONField(name = "360_paster_url") + public void setPaster360Url(String paster360Url) { + this.paster360Url = paster360Url; + } + + @JSONField(name = "live_pk_time") + public String getPkTime() { + return pkTime; + } + @JSONField(name = "live_pk_time") + public void setPkTime(String time) { + this.pkTime = time; + } + + + @JSONField(name = "service_url") + public String getCustomerServerUrl() { + return serverUrl; + } + @JSONField(name = "service_url") + public void setCustomerServerUrl(String serverUrl) { + this.serverUrl = serverUrl; + } + + @JSONField(name = "AllServerGiftIcon") + public String getAllServerGiftIcon() { + return AllServerGiftIcon; + } + + @JSONField(name = "AllServerGiftIcon") + public void setAllServerGiftIcon(String allServerGiftIcon) { + AllServerGiftIcon = allServerGiftIcon; + } + + @JSONField(name = "goldCoinName") + public String getGoldCoinName() { + return goldCoinName; + } + + @JSONField(name = "goldCoinName") + public void setGoldCoinName(String goldCoinName) { + this.goldCoinName = goldCoinName; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/FansMedalBean.java b/common/src/main/java/com/yunbao/common/bean/FansMedalBean.java new file mode 100644 index 000000000..1142f9a7e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/FansMedalBean.java @@ -0,0 +1,63 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2018/10/9. + */ + +public class FansMedalBean { + private int level; + private String thumb; + private String color; + private String thumbIcon; + private String bgIcon; + + @JSONField(name = "levelid") + public int getLevel() { + return level; + } + + @JSONField(name = "levelid") + public void setLevel(int level) { + this.level = level; + } + + @JSONField(name = "thumb") + public String getThumb() { + return thumb; + } + + @JSONField(name = "thumb") + public void setThumb(String thumb) { + this.thumb = thumb; + } + + @JSONField(name = "colour") + public String getColor() { + return color; + } + + @JSONField(name = "colour") + public void setColor(String color) { + this.color = color; + } + + @JSONField(name = "thumb_mark") + public String getThumbIcon() { + return thumbIcon; + } + + @JSONField(name = "thumb_mark") + public void setThumbIcon(String thumbIcon) { + this.thumbIcon = thumbIcon; + } + @JSONField(name = "bg") + public String getBgIcon() { + return bgIcon; + } + @JSONField(name = "bg") + public void setBgIcon(String bgIcon) { + this.bgIcon = bgIcon; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/GoogleBean.java b/common/src/main/java/com/yunbao/common/bean/GoogleBean.java new file mode 100644 index 000000000..87026f22b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/GoogleBean.java @@ -0,0 +1,42 @@ +package com.yunbao.common.bean; + +import java.util.List; + +public class GoogleBean { + private String id; + private String terminal; + private String charge_type; + private String is_hide; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTerminal() { + return terminal; + } + + public void setTerminal(String terminal) { + this.terminal = terminal; + } + + public String getCharge_type() { + return charge_type; + } + + public void setCharge_type(String charge_type) { + this.charge_type = charge_type; + } + + public String getIs_hide() { + return is_hide; + } + + public void setIs_hide(String is_hide) { + this.is_hide = is_hide; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/ImageEntity.java b/common/src/main/java/com/yunbao/common/bean/ImageEntity.java new file mode 100644 index 000000000..92e65d35b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/ImageEntity.java @@ -0,0 +1,125 @@ +package com.yunbao.common.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by Chen Haoxuan on 2022/4/30. + * Description: + */ +public class ImageEntity implements Parcelable { + + private int id; + private String path; + private String thumbPath; + private boolean isSelect; + private String folderName; + private String name; + private long date; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getThumbPath() { + return thumbPath; + } + + public void setThumbPath(String thumbPath) { + this.thumbPath = thumbPath; + } + + public boolean isSelect() { + return isSelect; + } + + public void setSelect(boolean select) { + isSelect = select; + } + + public String getFolderName() { + return folderName; + } + + public void setFolderName(String folderName) { + this.folderName = folderName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getDate() { + return date; + } + + public void setDate(long date) { + this.date = date; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ImageEntity) { + return this.path.equals(((ImageEntity) o).getPath()); + } + return false; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(this.id); + dest.writeString(this.path); + dest.writeString(this.thumbPath); + dest.writeByte(this.isSelect ? (byte) 1 : (byte) 0); + dest.writeString(this.folderName); + dest.writeString(this.name); + dest.writeLong(this.date); + } + + public ImageEntity() { + } + + protected ImageEntity(Parcel in) { + this.id = in.readInt(); + this.path = in.readString(); + this.thumbPath = in.readString(); + this.isSelect = in.readByte() != 0; + this.folderName = in.readString(); + this.name = in.readString(); + this.date = in.readLong(); + + } + + public static final Creator CREATOR = new Creator() { + @Override + public ImageEntity createFromParcel(Parcel source) { + return new ImageEntity(source); + } + + @Override + public ImageEntity[] newArray(int size) { + return new ImageEntity[size]; + } + }; +} diff --git a/common/src/main/java/com/yunbao/common/bean/ImageFolderEntity.java b/common/src/main/java/com/yunbao/common/bean/ImageFolderEntity.java new file mode 100644 index 000000000..1ede8031d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/ImageFolderEntity.java @@ -0,0 +1,54 @@ +package com.yunbao.common.bean; + + +import java.util.ArrayList; + +/** + * Created by Chen Haoxuan on 2022/4/30. + * + */ +public class ImageFolderEntity { + private String name; + private String path; + private String albumPath; + private ArrayList images = new ArrayList<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public ArrayList getImages() { + return images; + } + + public String getAlbumPath() { + return albumPath; + } + + public void setAlbumPath(String albumPath) { + this.albumPath = albumPath; + } + + @Override + public boolean equals(Object o) { + if (o != null && o instanceof ImageFolderEntity) { + if (((ImageFolderEntity) o).getPath() == null && path != null) + return false; + String oPath = ((ImageFolderEntity) o).getPath().toLowerCase(); + return oPath.equals(this.path.toLowerCase()); + } + return false; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean.java b/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean.java new file mode 100644 index 000000000..8680dba0b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean.java @@ -0,0 +1,17 @@ +package com.yunbao.common.bean; + +public class JsTurnTableBean { + String giftId; + + public JsTurnTableBean(String giftId) { + this.giftId = giftId; + } + + public String getGiftId() { + return giftId; + } + + public void setGiftId(String giftId) { + this.giftId = giftId; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean2.java b/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean2.java new file mode 100644 index 000000000..6e333cc17 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/JsTurnTableBean2.java @@ -0,0 +1,17 @@ +package com.yunbao.common.bean; + +public class JsTurnTableBean2 { + String giftId; + + public JsTurnTableBean2(String giftId) { + this.giftId = giftId; + } + + public String getGiftId() { + return giftId; + } + + public void setGiftId(String giftId) { + this.giftId = giftId; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/JsWishBean.java b/common/src/main/java/com/yunbao/common/bean/JsWishBean.java new file mode 100644 index 000000000..36b095e22 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/JsWishBean.java @@ -0,0 +1,17 @@ +package com.yunbao.common.bean; + +public class JsWishBean { + String giftId; + + public JsWishBean(String giftId) { + this.giftId = giftId; + } + + public String getGiftId() { + return giftId; + } + + public void setGiftId(String giftId) { + this.giftId = giftId; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LevelBean.java b/common/src/main/java/com/yunbao/common/bean/LevelBean.java new file mode 100644 index 000000000..027fe38ba --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LevelBean.java @@ -0,0 +1,61 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2018/10/9. + */ + +public class LevelBean { + private int level; + private String thumb; + private String color; + private String thumbIcon; + private String bgIcon; + + @JSONField(name = "levelid") + public int getLevel() { + return level; + } + + @JSONField(name = "levelid") + public void setLevel(int level) { + this.level = level; + } + + public String getThumb() { + return thumb; + } + + public void setThumb(String thumb) { + this.thumb = thumb; + } + + @JSONField(name = "colour") + public String getColor() { + return color; + } + + @JSONField(name = "colour") + public void setColor(String color) { + this.color = color; + } + + @JSONField(name = "thumb_mark") + public String getThumbIcon() { + return thumbIcon; + } + + @JSONField(name = "thumb_mark") + public void setThumbIcon(String thumbIcon) { + this.thumbIcon = thumbIcon; + } + @JSONField(name = "bg") + public String getBgIcon() { + return bgIcon; + } + @JSONField(name = "bg") + public void setBgIcon(String bgIcon) { + this.bgIcon = bgIcon; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveChatBean.java b/common/src/main/java/com/yunbao/common/bean/LiveChatBean.java new file mode 100644 index 000000000..dc4d124d4 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveChatBean.java @@ -0,0 +1,127 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2017/8/22. + */ + +public class LiveChatBean { + + public static final int NORMAL = 0; + public static final int SYSTEM = 1; + public static final int GIFT = 2; + public static final int ENTER_ROOM = 3; + public static final int LIGHT = 4; + public static final int RED_PACK = 5; + + private String id; + private String userNiceName; + private int level; + private String content; + private int heart; + private int type; //0是普通消息 1是系统消息 2是礼物消息 + private String liangName; + private int vipType; + private int guardType; + private boolean anchor; + private boolean manager; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @JSONField(name = "user_nicename") + public String getUserNiceName() { + return userNiceName; + } + + @JSONField(name = "user_nicename") + public void setUserNiceName(String userNiceName) { + this.userNiceName = userNiceName; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getHeart() { + return heart; + } + + public void setHeart(int heart) { + this.heart = heart; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + @JSONField(name = "liangname") + public String getLiangName() { + return liangName; + } + + @JSONField(name = "liangname") + public void setLiangName(String liangName) { + if(!"0".equals(liangName)){ + this.liangName = liangName; + } + } + + public boolean isAnchor() { + return anchor; + } + + public void setAnchor(boolean anchor) { + this.anchor = anchor; + } + + @JSONField(name = "vip_type") + public int getVipType() { + return vipType; + } + + @JSONField(name = "vip_type") + public void setVipType(int vipType) { + this.vipType = vipType; + } + + public boolean isManager() { + return manager; + } + + public void setManager(boolean manager) { + this.manager = manager; + } + + @JSONField(name = "guard_type") + public int getGuardType() { + return guardType; + } + + @JSONField(name = "guard_type") + public void setGuardType(int guardType) { + this.guardType = guardType; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveClassBean.java b/common/src/main/java/com/yunbao/common/bean/LiveClassBean.java new file mode 100644 index 000000000..2f7a593d3 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveClassBean.java @@ -0,0 +1,75 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2018/9/25. + */ + +public class LiveClassBean { + protected int id; + protected String name; + protected String thumb; + protected int orderNo; + private boolean isAll; + private String des; + private boolean checked; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getThumb() { + return thumb; + } + + public void setThumb(String thumb) { + this.thumb = thumb; + } + + @JSONField(name = "orderno") + public int getOrderNo() { + return orderNo; + } + + @JSONField(name = "orderno") + public void setOrderNo(int orderNo) { + this.orderNo = orderNo; + } + + public boolean isAll() { + return isAll; + } + + public void setAll(boolean all) { + isAll = all; + } + + public String getDes() { + return des; + } + + public void setDes(String des) { + this.des = des; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveGiftBean.java b/common/src/main/java/com/yunbao/common/bean/LiveGiftBean.java new file mode 100644 index 000000000..8fd8734ce --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveGiftBean.java @@ -0,0 +1,167 @@ +package com.yunbao.common.bean; + +import android.view.View; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2018/10/12. + */ + +public class LiveGiftBean { + +// public static final int TYPE_NORMAL = 0; +// public static final int TYPE_DELUXE = 1; +// public static final int MARK_NORMAL = 0; +// public static final int MARK_HOT = 1; +// public static final int MARK_GUARD = 2; +// public static final int MARK_LUCK = 3; + + private int id; + private int type;//0 普通礼物 1是豪华礼物 + private int mark;// 0 普通 1热门 2守护 3幸运 + private String name; + private String price; + private String icon; + private boolean checked; + private int page; + private View mView; + private String sendType;//支付是金币还是钻石 + private String mGiftNum; + + private String num;//心愿单添加礼物和数量 + private String swf; + private String isweek; + private String end_time; + + public String getEnd_time() { + return end_time; + } + + public void setEnd_time(String end_time) { + this.end_time = end_time; + } + + public String getIsweek() { + return isweek; + } + + public void setIsweek(String isweek) { + this.isweek = isweek; + } + + public String getSwf() { + return swf; + } + + public void setSwf(String swf) { + this.swf = swf; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getMark() { + return mark; + } + + public void setMark(int mark) { + this.mark = mark; + } + + @JSONField(name = "giftname") + public String getName() { + return name; + } + + @JSONField(name = "giftname") + public void setName(String name) { + this.name = name; + } + + @JSONField(name = "needcoin") + public String getPrice() { + return price; + } + + @JSONField(name = "needcoin") + public void setPrice(String price) { + this.price = price; + } + + @JSONField(name = "gifticon") + public String getIcon() { + return icon; + } + + @JSONField(name = "gifticon") + public void setIcon(String icon) { + this.icon = icon; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public View getView() { + return mView; + } + + public void setView(View view) { + mView = view; + } + + + public String getNum() { + return num; + } + + public void setNum(String num) { + this.num = num; + } + + @JSONField(name = "sendtype") + public String getSendType() { + return sendType; + } + + @JSONField(name = "sendtype") + public void setSendType(String sendType) { + this.sendType = sendType; + } + + @JSONField(name = "giftnum") + public String getGiftNum() { + return mGiftNum; + } + + @JSONField(name = "giftnum") + public void setGiftNum(String giftNum) { + this.mGiftNum = giftNum; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveGiftBean2.java b/common/src/main/java/com/yunbao/common/bean/LiveGiftBean2.java new file mode 100644 index 000000000..0e5da6c66 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveGiftBean2.java @@ -0,0 +1,142 @@ +package com.yunbao.common.bean; + +import android.view.View; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2018/10/12. + */ + +public class LiveGiftBean2 { + + public static final int TYPE_NORMAL = 0; + public static final int TYPE_DELUXE = 1; + public static final int MARK_NORMAL = 0; + public static final int MARK_HOT = 1; + public static final int MARK_GUARD = 2; + public static final int MARK_LUCK = 3; + + private int id; + private int type;//0 普通礼物 1是豪华礼物 + private int mark;// 0 普通 1热门 2守护 3幸运 + private String name; + private String price; + private String icon; + private boolean checked; + private int page; + private View mView; + private String sendType; + private String mGiftNum; + + private String num;//心愿单添加礼物和数量 + + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getMark() { + return mark; + } + + public void setMark(int mark) { + this.mark = mark; + } + + @JSONField(name = "giftname") + public String getName() { + return name; + } + + @JSONField(name = "giftname") + public void setName(String name) { + this.name = name; + } + + @JSONField(name = "needcoin") + public String getPrice() { + return price; + } + + @JSONField(name = "needcoin") + public void setPrice(String price) { + this.price = price; + } + + @JSONField(name = "gifticon") + public String getIcon() { + return icon; + } + + @JSONField(name = "gifticon") + public void setIcon(String icon) { + this.icon = icon; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public View getView() { + return mView; + } + + public void setView(View view) { + mView = view; + } + + + public String getNum() { + return num; + } + + public void setNum(String num) { + this.num = num; + } + + @JSONField(name = "sendtype") + public String getSendType() { + return sendType; + } + + @JSONField(name = "sendtype") + public void setSendType(String sendType) { + this.sendType = sendType; + } + + @JSONField(name = "giftnum") + public String getGiftNum() { + return mGiftNum; + } + + @JSONField(name = "giftnum") + public void setGiftNum(String giftNum) { + this.mGiftNum = giftNum; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveSvgGiftBean.java b/common/src/main/java/com/yunbao/common/bean/LiveSvgGiftBean.java new file mode 100644 index 000000000..e525bc1ab --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveSvgGiftBean.java @@ -0,0 +1,47 @@ +package com.yunbao.common.bean; + +public class LiveSvgGiftBean { + + /** + * id : 227 + * giftname : 愛心飛機 + * swf : https://qny.shayucm.com/svga/%E6%84%9B%E5%BF%83%E9%A3%9B%E6%A9%9F.svga + */ + + private String id; + private String giftname; + private String swf; + private String md5; + + public String getMd5() { + return md5; + } + + public void setMd5(String md5) { + this.md5 = md5; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getGiftname() { + return giftname; + } + + public void setGiftname(String giftname) { + this.giftname = giftname; + } + + public String getSwf() { + return swf; + } + + public void setSwf(String swf) { + this.swf = swf; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LoginData.java b/common/src/main/java/com/yunbao/common/bean/LoginData.java new file mode 100644 index 000000000..cea875aec --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LoginData.java @@ -0,0 +1,57 @@ +package com.yunbao.common.bean; + +/** + * Created by cxf on 2018/9/21. + */ + +public class LoginData { + + private String mType; + private String mOpenID; + private String mNickName; + private String mAvatar; + + public LoginData() { + + } + + public LoginData(String type, String openID, String nickName, String avatar) { + mType = type; + mOpenID = openID; + mNickName = nickName; + mAvatar = avatar; + } + + public String getType() { + return mType; + } + + public void setType(String type) { + mType = type; + } + + public String getOpenID() { + return mOpenID; + } + + public void setOpenID(String openID) { + mOpenID = openID; + } + + public String getNickName() { + return mNickName; + } + + public void setNickName(String nickName) { + mNickName = nickName; + } + + public String getAvatar() { + return mAvatar; + } + + public void setAvatar(String avatar) { + mAvatar = avatar; + } + +} diff --git a/common/src/main/java/com/yunbao/common/bean/TxLocationBean.java b/common/src/main/java/com/yunbao/common/bean/TxLocationBean.java new file mode 100644 index 000000000..403b6246e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/TxLocationBean.java @@ -0,0 +1,92 @@ +package com.yunbao.common.bean; + +import java.util.List; + +/** + * Created by cxf on 2018/7/18. + * 腾讯定位结果的实体类 + */ + +public class TxLocationBean { + private double lng;//经度 + private double lat;//纬度 + private String nation;//国家 + private String province;//省 + private String city;//市 + private String district;//区 + private String street;//街道 + private String address;//完整地址 + private List poiList;//周边 + + public double getLng() { + return lng; + } + + public void setLng(double lng) { + this.lng = lng; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getDistrict() { + return district; + } + + public void setDistrict(String district) { + this.district = district; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public List getPoiList() { + return poiList; + } + + public void setPoiList(List poiList) { + this.poiList = poiList; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/TxLocationPoiBean.java b/common/src/main/java/com/yunbao/common/bean/TxLocationPoiBean.java new file mode 100644 index 000000000..151af436b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/TxLocationPoiBean.java @@ -0,0 +1,103 @@ +package com.yunbao.common.bean; + +/** + * Created by cxf on 2018/7/18. + * 腾讯定位sdk 的poi 实体类 + */ + +public class TxLocationPoiBean { + + private String id; + private String title; + private String address; + private String category; + private Location location; + private double _distance; + private String _dir_desc; + private boolean checked; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public double get_distance() { + return _distance; + } + + public void set_distance(double _distance) { + this._distance = _distance; + } + + public String get_dir_desc() { + return _dir_desc; + } + + public void set_dir_desc(String _dir_desc) { + this._dir_desc = _dir_desc; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + public class Location { + private double lat; + private double lng; + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLng() { + return lng; + } + + public void setLng(double lng) { + this.lng = lng; + } + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/UpdataListBean.java b/common/src/main/java/com/yunbao/common/bean/UpdataListBean.java new file mode 100644 index 000000000..900cb1280 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/UpdataListBean.java @@ -0,0 +1,32 @@ +package com.yunbao.common.bean; + +/** + * Created by cxf on 2018/9/30. + * + */ + +public class UpdataListBean { + private int index; + private String name; + + public UpdataListBean(int index, String name) { + this.index = index; + this.name = name; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/UserBean.java b/common/src/main/java/com/yunbao/common/bean/UserBean.java new file mode 100644 index 000000000..869dd6d61 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/UserBean.java @@ -0,0 +1,796 @@ +package com.yunbao.common.bean; + +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Created by cxf on 2017/8/14. + */ + +public class UserBean implements Parcelable { + + protected String id; + protected String userNiceName; + protected String avatar; + protected String avatarThumb; + protected int sex; + protected String signature; + protected String coin; + protected String gold; + protected String votes; + protected String consumption; + protected String votestotal; + protected String province; + protected String city; + protected String location;//所在地 + protected String birthday; + protected int level; + protected int levelAnchor; + protected int lives; + protected int follows; + protected int fans; + protected Vip vip; + protected Liang liang; + protected Car car; + protected int medal_level; + protected String medal_name; + protected DressBean Dress; + protected String noble_id; + protected String yuanbao; + private String noble_name; + private String islive; + private String medal_no_display_src; + private String hot_num; + private String goodnum; + private String fans_pic; + private String gifticon; + private String department_name; + private String token_rong=""; + private String noble_end_time; + private String slide; + private String users_type; + private String is_bind; + private String mobile; + private String front_task; + private String is_admin; + + public String getIs_admin() { + return is_admin; + } + + public void setIs_admin(String is_admin) { + this.is_admin = is_admin; + } + + public String getFront_task() { + return front_task; + } + + public void setFront_task(String front_task) { + this.front_task = front_task; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getIs_bind() { + return is_bind; + } + + public void setIs_bind(String is_bind) { + this.is_bind = is_bind; + } + + public String getUsers_type() { + return users_type; + } + + public void setUsers_type(String users_type) { + this.users_type = users_type; + } + + public String getSlide() { + return slide; + } + + public void setSlide(String slide) { + this.slide = slide; + } + + public String getNoble_end_time() { + return noble_end_time; + } + + public void setNoble_end_time(String noble_end_time) { + this.noble_end_time = noble_end_time; + } + + public String getToken_rong() { + return token_rong; + } + + public void setToken_rong(String token_rong) { + this.token_rong = token_rong; + } + + public String getDepartment_name() { + return department_name; + } + + public void setDepartment_name(String department_name) { + this.department_name = department_name; + } + + public String getMedal_name() { + return medal_name; + } + + public void setMedal_name(String medal_name) { + this.medal_name = medal_name; + } + + public String getGifticon() { + return gifticon; + } + + public void setGifticon(String gifticon) { + this.gifticon = gifticon; + } + + public String getFans_pic() { + return fans_pic; + } + + public void setFans_pic(String fans_pic) { + this.fans_pic = fans_pic; + } + + public String getGoodnum() { + return goodnum; + } + + public void setGoodnum(String goodnum) { + this.goodnum = goodnum; + } + + public String getHot_num() { + return hot_num; + } + + public void setHot_num(String hot_num) { + this.hot_num = hot_num; + } + + public String getMedal_no_display_src() { + return medal_no_display_src; + } + + public void setMedal_no_display_src(String medal_no_display_src) { + this.medal_no_display_src = medal_no_display_src; + } + + public String getIslive() { + return islive; + } + + public void setIslive(String islive) { + this.islive = islive; + } + + public String getNoble_name() { + return noble_name; + } + + public void setNoble_name(String noble_name) { + this.noble_name = noble_name; + } + + public String getYuanbao() { + return yuanbao; + } + + public void setYuanbao(String yuanbao) { + this.yuanbao = yuanbao; + } + + public String getNoble_id() { + return noble_id; + } + + public void setNoble_id(String noble_id) { + this.noble_id = noble_id; + } + + public DressBean getDress() { + return Dress; + } + + public void setDress(DressBean dress) { + Dress = dress; + } + + @JSONField(name = "gold") + public String getGold() { + return gold; + } + + + @JSONField(name = "gold") + public void setGold(String gold) { + this.gold = gold; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @JSONField(name = "user_nicename") + public String getUserNiceName() { + return userNiceName; + } + + @JSONField(name = "user_nicename") + public void setUserNiceName(String userNiceName) { + this.userNiceName = userNiceName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + @JSONField(name = "avatar_thumb") + public String getAvatarThumb() { + return avatarThumb; + } + + @JSONField(name = "avatar_thumb") + public void setAvatarThumb(String avatarThumb) { + this.avatarThumb = avatarThumb; + } + + public int getSex() { + return sex; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getCoin() { + return coin; + } + + public void setCoin(String coin) { + this.coin = coin; + } + + public String getVotes() { + return votes; + } + + public void setVotes(String votes) { + this.votes = votes; + } + + public String getConsumption() { + return consumption; + } + + public void setConsumption(String consumption) { + this.consumption = consumption; + } + + public String getVotestotal() { + return votestotal; + } + + public void setVotestotal(String votestotal) { + this.votestotal = votestotal; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public int getLevel() { + if (level == 0) { + level = 1; + } + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + @JSONField(name = "medal_level'") + public int getMedalLevel() { + return medal_level; + } + + @JSONField(name = "medal_level'") + public void setMedalLevel(int level) { + this.medal_level = level; + } + + @JSONField(name = "medal_name'") + public String getMedalName() { + return medal_name; + } + + @JSONField(name = "medal_name'") + public void setMedalName(String name) { + this.medal_name = name; + } + + + @JSONField(name = "level_anchor") + public int getLevelAnchor() { + return levelAnchor; + } + + @JSONField(name = "level_anchor") + public void setLevelAnchor(int levelAnchor) { + this.levelAnchor = levelAnchor; + } + + + public int getLives() { + return lives; + } + + public void setLives(int lives) { + this.lives = lives; + } + + public int getFollows() { + return follows; + } + + public void setFollows(int follows) { + this.follows = follows; + } + + public int getFans() { + return fans; + } + + public void setFans(int fans) { + this.fans = fans; + } + + public Vip getVip() { + return vip; + } + + public void setVip(Vip vip) { + this.vip = vip; + } + + public Liang getLiang() { + return liang; + } + + public void setLiang(Liang liang) { + this.liang = liang; + } + + public Car getCar() { + return car; + } + + public void setCar(Car car) { + this.car = car; + } + + /** + * 显示靓号 + */ + public String getLiangNameTip() { + if (this.liang != null) { + String liangName = this.liang.getName(); + if (!TextUtils.isEmpty(liangName) && !"0".equals(liangName)) { +// return WordUtil.getString(R.string.live_liang) + ":" + liangName; + return liangName; + } + } + return "ID:" + this.id; + } + + /** + * 获取靓号 + */ + public String getGoodName() { + if (this.liang != null) { + return this.liang.getName(); + } + return "0"; + } + + public int getVipType() { + if (this.vip != null) { + return this.vip.getType(); + } + return 0; + } + + + public UserBean() { + } + + protected UserBean(Parcel in) { + this.id = in.readString(); + this.userNiceName = in.readString(); + this.avatar = in.readString(); + this.avatarThumb = in.readString(); + this.sex = in.readInt(); + this.signature = in.readString(); + this.coin = in.readString(); + this.votes = in.readString(); + this.consumption = in.readString(); + this.votestotal = in.readString(); + this.province = in.readString(); + this.city = in.readString(); + this.location = in.readString(); + this.birthday = in.readString(); + this.level = in.readInt(); + this.levelAnchor = in.readInt(); + this.lives = in.readInt(); + this.follows = in.readInt(); + this.fans = in.readInt(); + this.vip = in.readParcelable(Vip.class.getClassLoader()); + this.liang = in.readParcelable(Liang.class.getClassLoader()); + this.car = in.readParcelable(Car.class.getClassLoader()); + this.medal_name = in.readString(); + this.medal_level = in.readInt(); + + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.id); + dest.writeString(this.userNiceName); + dest.writeString(this.avatar); + dest.writeString(this.avatarThumb); + dest.writeInt(this.sex); + dest.writeString(this.signature); + dest.writeString(this.coin); + dest.writeString(this.votes); + dest.writeString(this.consumption); + dest.writeString(this.votestotal); + dest.writeString(this.province); + dest.writeString(this.city); + dest.writeString(this.location); + dest.writeString(this.birthday); + dest.writeInt(this.level); + dest.writeInt(this.levelAnchor); + dest.writeInt(this.lives); + dest.writeInt(this.follows); + dest.writeInt(this.fans); + dest.writeParcelable(this.vip, flags); + dest.writeParcelable(this.liang, flags); + dest.writeParcelable(this.car, flags); + dest.writeString(this.medal_name); + dest.writeInt(this.medal_level); + } + + public static final Creator CREATOR = new Creator() { + @Override + public UserBean[] newArray(int size) { + return new UserBean[size]; + } + + @Override + public UserBean createFromParcel(Parcel in) { + return new UserBean(in); + } + }; + + + public static class Vip implements Parcelable { + protected int type; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + @Override + public int describeContents() { + return 0; + } + + public Vip() { + + } + + public Vip(Parcel in) { + this.type = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(this.type); + } + + public static final Creator CREATOR = new Creator() { + @Override + public Vip[] newArray(int size) { + return new Vip[size]; + } + + @Override + public Vip createFromParcel(Parcel in) { + return new Vip(in); + } + }; + } + + public static class Liang implements Parcelable { + protected String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Liang() { + + } + + public Liang(Parcel in) { + this.name = in.readString(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + } + + public static final Creator CREATOR = new Creator() { + + @Override + public Liang createFromParcel(Parcel in) { + return new Liang(in); + } + + @Override + public Liang[] newArray(int size) { + return new Liang[size]; + } + }; + + } + + public static class Car implements Parcelable { + protected int id; + protected String swf; + protected float swftime; + protected String words; + protected String car_swf_type;//0=全屏坐骑 1=横幅坐骑 + protected String user_nicename; + protected String car_banner_img; + protected String car_colour; + + protected Car(Parcel in) { + id = in.readInt(); + swf = in.readString(); + swftime = in.readFloat(); + words = in.readString(); + car_swf_type = in.readString(); + user_nicename = in.readString(); + car_banner_img = in.readString(); + car_colour = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public Car createFromParcel(Parcel in) { + return new Car(in); + } + + @Override + public Car[] newArray(int size) { + return new Car[size]; + } + }; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getSwf() { + return swf; + } + + public void setSwf(String swf) { + this.swf = swf; + } + + public float getSwftime() { + return swftime; + } + + public void setSwftime(float swftime) { + this.swftime = swftime; + } + + public String getWords() { + return words; + } + + public void setWords(String words) { + this.words = words; + } + + public String getCar_swf_type() { + return car_swf_type; + } + + public void setCar_swf_type(String car_swf_type) { + this.car_swf_type = car_swf_type; + } + + public String getUser_nicename() { + return user_nicename; + } + + public void setUser_nicename(String user_nicename) { + this.user_nicename = user_nicename; + } + + public String getCar_banner_img() { + return car_banner_img; + } + + public void setCar_banner_img(String car_banner_img) { + this.car_banner_img = car_banner_img; + } + + public String getCar_colour() { + return car_colour; + } + + public void setCar_colour(String car_colour) { + this.car_colour = car_colour; + } + + public Car() { + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(id); + dest.writeString(swf); + dest.writeFloat(swftime); + dest.writeString(words); + dest.writeString(car_swf_type); + dest.writeString(user_nicename); + dest.writeString(car_banner_img); + dest.writeString(car_colour); + } + } + + public static class DressBean { + + private String avatar_frame; + private String medal; + private String bubble; + private String medal_new; + + public String getMedal_new() { + return medal_new; + } + + public void setMedal_new(String medal_new) { + this.medal_new = medal_new; + } + + public String getAvatar_frame() { + return avatar_frame; + } + + public void setAvatar_frame(String avatar_frame) { + this.avatar_frame = avatar_frame; + } + + public String getMedal() { + return medal; + } + + public void setMedal(String medal) { + this.medal = medal; + } + + public String getBubble() { + return bubble; + } + + public void setBubble(String bubble) { + this.bubble = bubble; + } + } +} + + + + diff --git a/common/src/main/java/com/yunbao/common/bean/UserItemBean.java b/common/src/main/java/com/yunbao/common/bean/UserItemBean.java new file mode 100644 index 000000000..dfd30b790 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/UserItemBean.java @@ -0,0 +1,87 @@ +package com.yunbao.common.bean; + +/** + * Created by cxf on 2018/9/28. + * 我的 页面的item + */ + +public class UserItemBean { + + private int id; + private String name; + private String thumb; + private String href; + private boolean mGroupLast; + private boolean mAllLast; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getThumb() { + return thumb; + } + + public void setThumb(String thumb) { + this.thumb = thumb; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public boolean isGroupLast() { + return mGroupLast; + } + + public void setGroupLast(boolean groupLast) { + mGroupLast = groupLast; + } + + public boolean isAllLast() { + return mAllLast; + } + + public void setAllLast(boolean allLast) { + mAllLast = allLast; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + UserItemBean bean = (UserItemBean) o; + + if (id != bean.id) return false; + if (name != null ? !name.equals(bean.name) : bean.name != null) return false; + if (thumb != null ? !thumb.equals(bean.thumb) : bean.thumb != null) return false; + return href != null ? href.equals(bean.href) : bean.href == null; + + } + + @Override + public int hashCode() { + int result = id; + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (thumb != null ? thumb.hashCode() : 0); + result = 31 * result + (href != null ? href.hashCode() : 0); + return result; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/VideoListBean.java b/common/src/main/java/com/yunbao/common/bean/VideoListBean.java new file mode 100644 index 000000000..7f930f971 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/VideoListBean.java @@ -0,0 +1,189 @@ +package com.yunbao.common.bean; + +/** + * Created by Chen Haoxuan on 2022/4/11. + */ + +public class VideoListBean { + + private String id; + private String img_or_video; + private String img_json; + private String video; + private String content;//内容 + private String talk_id; + private String is_top; + private String love_num; + private String comment_num; + private String share_num; + private String gift_num; + private String hot_num; + private String create_time; + private String ai_content; + private String user_name;//名字 + private String user_avatar;//头像 + private String is_attention;//-1=自己 1=关注了 2=没关注 0=没关注 + private String user_id; + private String talk_name; + private String is_love; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getImg_or_video() { + return img_or_video; + } + + public void setImg_or_video(String img_or_video) { + this.img_or_video = img_or_video; + } + + public String getImg_json() { + return img_json; + } + + public void setImg_json(String img_json) { + this.img_json = img_json; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTalk_id() { + return talk_id; + } + + public void setTalk_id(String talk_id) { + this.talk_id = talk_id; + } + + public String getIs_top() { + return is_top; + } + + public void setIs_top(String is_top) { + this.is_top = is_top; + } + + public String getLove_num() { + return love_num; + } + + public void setLove_num(String love_num) { + this.love_num = love_num; + } + + public String getComment_num() { + return comment_num; + } + + public void setComment_num(String comment_num) { + this.comment_num = comment_num; + } + + public String getShare_num() { + return share_num; + } + + public void setShare_num(String share_num) { + this.share_num = share_num; + } + + public String getGift_num() { + return gift_num; + } + + public void setGift_num(String gift_num) { + this.gift_num = gift_num; + } + + public String getHot_num() { + return hot_num; + } + + public void setHot_num(String hot_num) { + this.hot_num = hot_num; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getAi_content() { + return ai_content; + } + + public void setAi_content(String ai_content) { + this.ai_content = ai_content; + } + + public String getUser_name() { + return user_name; + } + + public void setUser_name(String user_name) { + this.user_name = user_name; + } + + public String getUser_avatar() { + return user_avatar; + } + + public void setUser_avatar(String user_avatar) { + this.user_avatar = user_avatar; + } + + public String getIs_attention() { + return is_attention; + } + + public void setIs_attention(String is_attention) { + this.is_attention = is_attention; + } + + public String getUser_id() { + return user_id; + } + + public void setUser_id(String user_id) { + this.user_id = user_id; + } + + public String getTalk_name() { + return talk_name; + } + + public void setTalk_name(String talk_name) { + this.talk_name = talk_name; + } + + public String getIs_love() { + return is_love; + } + + public void setIs_love(String is_love) { + this.is_love = is_love; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/WeekListBean.java b/common/src/main/java/com/yunbao/common/bean/WeekListBean.java new file mode 100644 index 000000000..0f67b1b9e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/WeekListBean.java @@ -0,0 +1,45 @@ +package com.yunbao.common.bean; + +/** + * Created by Chen Haoxuan on 2022/6/21. + * 签到奖励实体类 + */ + +public class WeekListBean { + private String anchor_id; + private String anchor_name; + private String anchor_avatar; + private String seconds; + + public String getAnchor_id() { + return anchor_id; + } + + public void setAnchor_id(String anchor_id) { + this.anchor_id = anchor_id; + } + + public String getAnchor_name() { + return anchor_name; + } + + public void setAnchor_name(String anchor_name) { + this.anchor_name = anchor_name; + } + + public String getAnchor_avatar() { + return anchor_avatar; + } + + public void setAnchor_avatar(String anchor_avatar) { + this.anchor_avatar = anchor_avatar; + } + + public String getSeconds() { + return seconds; + } + + public void setSeconds(String seconds) { + this.seconds = seconds; + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/CircleProgress.java b/common/src/main/java/com/yunbao/common/custom/CircleProgress.java new file mode 100644 index 000000000..7408d35b0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/CircleProgress.java @@ -0,0 +1,104 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2019/4/27. + */ + +public class CircleProgress extends View { + + private float mStrokeWidth; + private float mR; + private int mBgColor; + private int mFgColor; + private float mMaxProgress; + private float mCurProgress; + private Paint mBgPaint; + private Paint mFgPaint; + private float mX; + private RectF mRectF; + + public CircleProgress(Context context) { + this(context, null); + } + + public CircleProgress(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public CircleProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleProgress); + mBgColor = ta.getColor(R.styleable.CircleProgress_cp_bg_color, 0); + mFgColor = ta.getColor(R.styleable.CircleProgress_cp_fg_color, 0); + mStrokeWidth = ta.getDimension(R.styleable.CircleProgress_cp_stroke_width, 0); + mMaxProgress = ta.getFloat(R.styleable.CircleProgress_cp_max_progress, 0); + mCurProgress = ta.getFloat(R.styleable.CircleProgress_cp_cur_progress, 0); + ta.recycle(); + initPaint(); + } + + private void initPaint() { + mBgPaint = new Paint(); + mBgPaint.setAntiAlias(true); + mBgPaint.setDither(true); + mBgPaint.setColor(mBgColor); + mBgPaint.setStyle(Paint.Style.STROKE); + mBgPaint.setStrokeWidth(mStrokeWidth); + + mFgPaint = new Paint(); + mFgPaint.setAntiAlias(true); + mFgPaint.setDither(true); + mFgPaint.setColor(mFgColor); + mFgPaint.setStyle(Paint.Style.STROKE); + mFgPaint.setStrokeWidth(mStrokeWidth); + mRectF = new RectF(); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY)); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + float offset = mStrokeWidth / 2; + mX = w / 2; + mR = mX - offset; + mRectF = new RectF(); + mRectF.left = offset; + mRectF.top = offset; + mRectF.right = w - offset; + mRectF.bottom = mRectF.right; + + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawCircle(mX, mX, mR, mBgPaint); + if (mMaxProgress > 0 && mCurProgress > 0) { + canvas.drawArc(mRectF, -90, mCurProgress / mMaxProgress * 360, false, mFgPaint); + } + } + + public void setMaxProgress(float maxProgress) { + mMaxProgress = maxProgress; + } + + public void setCurProgress(float curProgress) { + mCurProgress = curProgress; + invalidate(); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/CoinGiveLayout.java b/common/src/main/java/com/yunbao/common/custom/CoinGiveLayout.java new file mode 100644 index 000000000..0a934c16a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/CoinGiveLayout.java @@ -0,0 +1,90 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/7/11. + */ + +public class CoinGiveLayout extends FrameLayout { + + private static final String TAG = "CoinGiveLayout"; + private Paint mPaint; + private int mBgColor; + private float mRadius; + private float mRadiusD; + private float mArrowWidth; + private float mArrowHeight; + private float mArrowOffsetX; + private int mWidth; + private int mHeight; + private RectF mRectF; + + + public CoinGiveLayout(Context context) { + super(context, null); + } + + public CoinGiveLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CoinGiveLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CoinGiveLayout); + mBgColor = ta.getColor(R.styleable.CoinGiveLayout_cgl_bg_color, 0); + mRadius = ta.getDimension(R.styleable.CoinGiveLayout_cgl_radius, 0); + mArrowWidth = ta.getDimension(R.styleable.CoinGiveLayout_cgl_arrow_width, 0); + mArrowHeight = ta.getDimension(R.styleable.CoinGiveLayout_cgl_arrow_height, 0); + mArrowOffsetX = ta.getDimension(R.styleable.CoinGiveLayout_cgl_arrow_offset_x, 0); + ta.recycle(); + initPaint(); + mRadiusD = mRadius * 2; + mRectF = new RectF(); + } + + private void initPaint() { + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setDither(true); + mPaint.setColor(mBgColor); + mPaint.setStyle(Paint.Style.FILL); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + mHeight = h; + mRectF.left = 0; + mRectF.top = 0; + mRectF.right = w; + float bottom = h - mArrowHeight; + mRectF.bottom = bottom > 0 ? bottom : 0; + } + + + @Override + protected void dispatchDraw(Canvas canvas) { + canvas.drawRoundRect(mRectF, mRadius, mRadiusD, mPaint); + if (mArrowHeight > 0 && mArrowWidth > 0) { + Path path = new Path(); + path.moveTo(mWidth - mArrowWidth - mArrowOffsetX, mHeight - mArrowHeight); + path.rLineTo(0, mArrowHeight); + path.rLineTo(mArrowWidth, -mArrowHeight); + path.close(); + canvas.drawPath(path, mPaint); + } + super.dispatchDraw(canvas); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/CommonRefreshView.java b/common/src/main/java/com/yunbao/common/custom/CommonRefreshView.java new file mode 100644 index 000000000..5fe1d2a70 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/CommonRefreshView.java @@ -0,0 +1,438 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; + +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.footer.ClassicsFooter; +import com.scwang.smartrefresh.layout.header.ClassicsHeader; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; +import com.yunbao.common.R; +import com.yunbao.common.adapter.RefreshAdapter; +import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.utils.ToastUtil; + +import java.util.List; + +/** + * Created by cxf on 2018/6/7. + */ + +public class CommonRefreshView extends FrameLayout implements View.OnClickListener { + + private Context mContext; + private DataHelper mDataHelper; + private int mLayoutRes; + private View mContentView; + private SmartRefreshLayout mSmartRefreshLayout; + private ClassicsHeader mHeader; + private ClassicsFooter mFooter; + public RecyclerView mRecyclerView; + private FrameLayout mEmptyLayout;//没有数据的View + private View mLoadFailureView;//加载失败View + private boolean mRefreshEnable;//下拉刷新是否可用 + private boolean mLoadMoreEnable;//上拉加载是否可用 + private int mPageCount;//页数 + private int mItemCount;//每页的Item个数 + + public CommonRefreshView(Context context) { + this(context, null); + } + + public CommonRefreshView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CommonRefreshView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CommonRefreshView); + mRefreshEnable = ta.getBoolean(R.styleable.CommonRefreshView_crv_refreshEnable, true); + mLoadMoreEnable = ta.getBoolean(R.styleable.CommonRefreshView_crv_loadMoreEnable, true); + mLayoutRes = ta.getResourceId(R.styleable.CommonRefreshView_crv_layout, R.layout.view_refresh_default); + mItemCount = ta.getInteger(R.styleable.CommonRefreshView_crv_itemCount, 20); + ta.recycle(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater inflater = LayoutInflater.from(mContext); + View view = inflater.inflate(mLayoutRes, this, false); + mContentView = view; + addView(view); + mSmartRefreshLayout = (SmartRefreshLayout) view.findViewById(R.id.refreshLayout); + mSmartRefreshLayout.setEnableLoadMoreWhenContentNotFull(false);//是否在列表不满一页时候开启上拉加载功能 + mSmartRefreshLayout.setEnableFooterFollowWhenLoadFinished(true);//是否在全部加载结束之后Footer跟随内容 + mSmartRefreshLayout.setEnableOverScrollBounce(false);//设置是否开启越界回弹功能(默认true) + mEmptyLayout = (FrameLayout) view.findViewById(R.id.no_data_container); + mLoadFailureView = view.findViewById(R.id.load_failure); + mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); + mRecyclerView.setHasFixedSize(true); + ((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); + mSmartRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + refresh(); + } + }); + + mSmartRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull RefreshLayout refreshlayout) { + Log.i("t2", "来了哦"); + loadMore(); + } + }); + mSmartRefreshLayout.setEnableRefresh(mRefreshEnable); + mSmartRefreshLayout.setEnableLoadMore(mLoadMoreEnable); + View btnReload = view.findViewById(R.id.btn_reload); + if (btnReload != null) { + btnReload.setOnClickListener(this); + } + int textColor = ContextCompat.getColor(mContext, R.color.textColor); + mHeader = findViewById(R.id.header); + mHeader.setAccentColor(textColor); + mFooter = findViewById(R.id.footer); + mFooter.setAccentColor(textColor); + mFooter.setTextSizeTitle(14); + } + + private HttpCallback mRefreshCallback = new HttpCallback() { + + private int mDataCount; + + @Override + public void onSuccess(int code, String msg, String[] info) { + if (mDataHelper == null) { + return; + } + if (mLoadFailureView != null && mLoadFailureView.getVisibility() == View.VISIBLE) { + mLoadFailureView.setVisibility(View.INVISIBLE); + } + RefreshAdapter adapter = null; + RecyclerView.Adapter recyclerViewAdapter = mRecyclerView.getAdapter(); + if (recyclerViewAdapter != null && recyclerViewAdapter instanceof RefreshAdapter) { + adapter = (RefreshAdapter) recyclerViewAdapter; + } else { + adapter = mDataHelper.getAdapter(); + if (adapter == null) { + return; + } + mRecyclerView.setAdapter(adapter); + } + if (code != 0) { + ToastUtil.show(msg); + return; + } + if (info != null) { + List list = mDataHelper.processData(info); + if (list == null) { + return; + } + mDataCount = list.size(); + if (mDataCount > 0) { + if (mEmptyLayout != null && mEmptyLayout.getVisibility() == View.VISIBLE) { + mEmptyLayout.setVisibility(View.INVISIBLE); + } + adapter.refreshData(list); + } else { + adapter.clearData(); + if (mEmptyLayout != null && mEmptyLayout.getVisibility() != View.VISIBLE) { + mEmptyLayout.setVisibility(View.VISIBLE); + } + } + } else { + if (adapter != null) { + adapter.clearData(); + } + if (mEmptyLayout != null && mEmptyLayout.getVisibility() != View.VISIBLE) { + mEmptyLayout.setVisibility(View.VISIBLE); + } + } + mDataHelper.onRefreshSuccess(adapter.getList(), adapter.getItemCount()); + } + + + @Override + public void onError() { + if (mEmptyLayout != null && mEmptyLayout.getVisibility() == View.VISIBLE) { + mEmptyLayout.setVisibility(View.INVISIBLE); + } + if (mLoadFailureView != null) { + if (mLoadFailureView.getVisibility() != View.VISIBLE) { + if (mRecyclerView != null) { + RecyclerView.Adapter adapter = mRecyclerView.getAdapter(); + if (adapter != null && adapter.getItemCount() > 0) { + ToastUtil.show(R.string.load_failure); + } else { + mLoadFailureView.setVisibility(View.VISIBLE); + } + } else { + mLoadFailureView.setVisibility(View.VISIBLE); + } + } else { + ToastUtil.show(R.string.load_failure); + } + } + if (mDataHelper != null) { + mDataHelper.onRefreshFailure(); + } + } + + @Override + public void onFinish() { + if (mSmartRefreshLayout != null) { + mSmartRefreshLayout.finishRefresh(true); + if (mDataCount < mItemCount) { + mSmartRefreshLayout.finishLoadMore(true); + } + + } + } + }; + + private HttpCallback mLoadMoreCallback = new HttpCallback() { + + private int mDataCount; + + @Override + public void onSuccess(int code, String msg, String[] info) { + if (mDataHelper == null) { + mPageCount--; + return; + } + if (code != 0) { + ToastUtil.show(msg); + mPageCount--; + return; + } + if (mLoadFailureView != null && mLoadFailureView.getVisibility() == View.VISIBLE) { + mLoadFailureView.setVisibility(View.INVISIBLE); + } + if (info != null) { + List list = mDataHelper.processData(info); + if (list == null) { + mPageCount--; + return; + } + mDataCount = list.size(); + RefreshAdapter adapter = mDataHelper.getAdapter(); + if (mDataCount > 0) { + if (adapter != null) { + adapter.insertList(list); + } + } else { + mPageCount--; + } + mDataHelper.onLoadMoreSuccess(list, mDataCount); + } else { + mPageCount--; + } + } + + @Override + public void onError() { + super.onError(); + mPageCount--; + if (mDataHelper != null) { + mDataHelper.onLoadMoreFailure(); + } + } + + @Override + public void onFinish() { + Log.i("t2", "更多"); + if (mSmartRefreshLayout != null) { + if (mDataCount <= 0) { + mSmartRefreshLayout.finishLoadMoreWithNoMoreData(); + } else { + mSmartRefreshLayout.finishLoadMore(true); + } + } + } + }; + + public void setDataHelper(DataHelper dataHelper) { + mDataHelper = dataHelper; + } + + public void setLayoutManager(RecyclerView.LayoutManager layoutManager) { + mRecyclerView.setLayoutManager(layoutManager); + } + + public void setItemDecoration(ItemDecoration itemDecoration) { + mRecyclerView.addItemDecoration(itemDecoration); + } + + + public void showLoading() { + mPageCount = 1; + if (mSmartRefreshLayout != null) { + mSmartRefreshLayout.autoRefreshAnimationOnly(); + } + if (mEmptyLayout != null && mEmptyLayout.getVisibility() == VISIBLE) { + mEmptyLayout.setVisibility(INVISIBLE); + } + if (mLoadFailureView != null && mLoadFailureView.getVisibility() == VISIBLE) { + mLoadFailureView.setVisibility(INVISIBLE); + } + } + + public void showRefreshBar() { + if (mSmartRefreshLayout != null) { + mSmartRefreshLayout.autoRefresh(100);//延迟400毫秒后自动刷新 + + } + } + + public void showEmpty() { + if (mEmptyLayout != null && mEmptyLayout.getVisibility() != VISIBLE) { + mEmptyLayout.setVisibility(VISIBLE); + } + } + + public void hideEmpty() { + if (mEmptyLayout != null && mEmptyLayout.getVisibility() == VISIBLE) { + mEmptyLayout.setVisibility(INVISIBLE); + } + } + + public void hideLoadFailure() { + if (mLoadFailureView != null && mLoadFailureView.getVisibility() == VISIBLE) { + mLoadFailureView.setVisibility(INVISIBLE); + } + } + + + public void initData() { + Log.i("t2", "AAAs1212"); + refresh(); + } + + private void refresh() { + if (mDataHelper != null) { + Log.i("t2", "AAAs"); + mPageCount = 1; + mDataHelper.loadData(mPageCount, mRefreshCallback); + } + } + + private void loadMore() { + Log.i("t2", "来了哦111"); + + if (mDataHelper != null) { + Log.i("t2", "来了哦12121"); + mPageCount++; + mDataHelper.loadData(mPageCount, mLoadMoreCallback); + } + } + + public int getPageCount() { + return mPageCount; + } + + public void setPageCount(int pageCount) { + mPageCount = pageCount; + } + + + public int getItemCount() { + return mItemCount; + } + + public void setItemCount(int itemCount) { + mItemCount = itemCount; + } + + public void setRefreshEnable(boolean enable) { + if (mSmartRefreshLayout != null) { + mSmartRefreshLayout.setEnableRefresh(enable); + } + } + + public void setLoadMoreEnable(boolean enable) { + if (mSmartRefreshLayout != null) { + mSmartRefreshLayout.setEnableLoadMore(enable); + } + } + + @Override + public void onClick(View v) { + if (v.getId() == R.id.btn_reload) { + refresh(); + } + } + + + public interface DataHelper { + RefreshAdapter getAdapter(); + + void loadData(int p, HttpCallback callback); + + List processData(String[] info); + + /** + * 下拉刷新成功 + * + * @param list Adapter的全部数据的List + * @param listCount Adapter的全部数据的个数 + */ + void onRefreshSuccess(List list, int listCount); + + /** + * 下拉刷新失败 + */ + void onRefreshFailure(); + + /** + * 上拉加载成功 + * + * @param loadItemList 本次加载到的数据 + * @param loadItemCount 加载到的数据个数 + */ + void onLoadMoreSuccess(List loadItemList, int loadItemCount); + + /** + * 加载失败 + */ + void onLoadMoreFailure(); + } + + /** + * 空数据的布局 + */ + public void setEmptyLayoutId(int noDataLayoutId) { + if (mEmptyLayout != null) { + mEmptyLayout.removeAllViews(); + View v = LayoutInflater.from(mContext).inflate(noDataLayoutId, mEmptyLayout, false); + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) v.getLayoutParams(); + params.gravity = Gravity.CENTER; + v.setLayoutParams(params); + mEmptyLayout.addView(v); + } + } + + public View getContentView() { + return mContentView; + } + + public void setRecyclerViewAdapter(RefreshAdapter adapter) { + if (mRecyclerView != null) { + mRecyclerView.setAdapter(adapter); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/DrawableCheckBox.java b/common/src/main/java/com/yunbao/common/custom/DrawableCheckBox.java new file mode 100644 index 000000000..424a452f0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/DrawableCheckBox.java @@ -0,0 +1,99 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import androidx.appcompat.widget.AppCompatCheckBox; +import android.util.AttributeSet; + +import com.yunbao.common.R; + + +/** + * Created by cxf on 2017/7/19. + * 可以调节drawable大小的CheckBox + */ + +public class DrawableCheckBox extends AppCompatCheckBox { + + private int mTopWidth; + private int mTopHeight; + private int mLeftWidth; + private int mLeftHeight; + private int mRightWidth; + private int mRightHeight; + private int mBottomWidth; + private int mBottomHeight; + private Drawable mTopDrawable; + private Drawable mLeftDrawable; + private Drawable mRightDrawable; + private Drawable mBottomDrawable; + + public DrawableCheckBox(Context context) { + this(context, null); + } + + public DrawableCheckBox(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DrawableCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.DrawableTextView); + mTopWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_width, 0); + mTopHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_height, 0); + mLeftWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_width, 0); + mLeftHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_height, 0); + mRightWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_width, 0); + mRightHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_height, 0); + mBottomWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_width, 0); + mBottomHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_height, 0); + mTopDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_top_drawable); + mLeftDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_left_drawable); + mRightDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_right_drawable); + mBottomDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_bottom_drawable); + ta.recycle(); + + } + + public void setTopDrawable(Drawable topDrawable) { + mTopDrawable = topDrawable; + } + + public void setBottomDrawable(Drawable bottomDrawable) { + mBottomDrawable = bottomDrawable; + } + + public void setLeftDrawable(Drawable leftDrawable) { + mLeftDrawable = leftDrawable; + } + + public void setRightDrawable(Drawable rightDrawable) { + mRightDrawable = rightDrawable; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + setCompoundDrawablesWithIntrinsicBounds(mLeftDrawable, mTopDrawable, mRightDrawable, mBottomDrawable); + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + if (left != null) { + left.setBounds(0, 0, mLeftWidth, mLeftHeight); + } + if (top != null) { + top.setBounds(0, 0, mTopWidth, mTopHeight); + } + if (right != null) { + right.setBounds(0, 0, mRightWidth, mRightHeight); + } + if (bottom != null) { + bottom.setBounds(0, 0, mBottomWidth, mBottomHeight); + } + setCompoundDrawables(left, top, right, bottom); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton.java b/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton.java new file mode 100644 index 000000000..d426697e5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton.java @@ -0,0 +1,99 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import androidx.appcompat.widget.AppCompatRadioButton; +import android.util.AttributeSet; + +import com.yunbao.common.R; + + +/** + * Created by cxf on 2017/7/19. + * 可以调节drawable大小的RadioButton + */ + +public class DrawableRadioButton extends AppCompatRadioButton { + + private int mTopWidth; + private int mTopHeight; + private int mLeftWidth; + private int mLeftHeight; + private int mRightWidth; + private int mRightHeight; + private int mBottomWidth; + private int mBottomHeight; + private Drawable mTopDrawable; + private Drawable mLeftDrawable; + private Drawable mRightDrawable; + private Drawable mBottomDrawable; + + public DrawableRadioButton(Context context) { + this(context, null); + } + + public DrawableRadioButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DrawableRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.DrawableTextView); + mTopWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_width, 0); + mTopHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_height, 0); + mLeftWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_width, 0); + mLeftHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_height, 0); + mRightWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_width, 0); + mRightHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_height, 0); + mBottomWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_width, 0); + mBottomHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_height, 0); + mTopDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_top_drawable); + mLeftDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_left_drawable); + mRightDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_right_drawable); + mBottomDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_bottom_drawable); + ta.recycle(); + + } + + public void setTopDrawable(Drawable topDrawable) { + mTopDrawable = topDrawable; + } + + public void setBottomDrawable(Drawable bottomDrawable) { + mBottomDrawable = bottomDrawable; + } + + public void setLeftDrawable(Drawable leftDrawable) { + mLeftDrawable = leftDrawable; + } + + public void setRightDrawable(Drawable rightDrawable) { + mRightDrawable = rightDrawable; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + setCompoundDrawablesWithIntrinsicBounds(mLeftDrawable, mTopDrawable, mRightDrawable, mBottomDrawable); + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + if (left != null) { + left.setBounds(0, 0, mLeftWidth, mLeftHeight); + } + if (top != null) { + top.setBounds(0, 0, mTopWidth, mTopHeight); + } + if (right != null) { + right.setBounds(0, 0, mRightWidth, mRightHeight); + } + if (bottom != null) { + bottom.setBounds(0, 0, mBottomWidth, mBottomHeight); + } + setCompoundDrawables(left, top, right, bottom); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton2.java b/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton2.java new file mode 100644 index 000000000..7eda6c4af --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/DrawableRadioButton2.java @@ -0,0 +1,107 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import androidx.appcompat.widget.AppCompatRadioButton; +import android.util.AttributeSet; + +import com.yunbao.common.R; + + +/** + * Created by cxf on 2017/7/19. + * 可以调节drawable大小的RadioButton + */ + +public class DrawableRadioButton2 extends AppCompatRadioButton { + + private int mTopWidth; + private int mTopHeight; + private int mLeftWidth; + private int mLeftHeight; + private int mRightWidth; + private int mRightHeight; + private int mBottomWidth; + private int mBottomHeight; + private Drawable mTopDrawable; + private Drawable mLeftDrawable; + private Drawable mRightDrawable; + private Drawable mBottomDrawable; + + public DrawableRadioButton2(Context context) { + this(context, null); + } + + public DrawableRadioButton2(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DrawableRadioButton2(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.DrawableTextView); + mTopWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_width, 0); + mTopHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_height, 0); + mLeftWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_width, 0); + mLeftHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_height, 0); + mRightWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_width, 0); + mRightHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_height, 0); + mBottomWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_width, 0); + mBottomHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_height, 0); + mTopDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_top_drawable); + mLeftDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_left_drawable); + mRightDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_right_drawable); + mBottomDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_bottom_drawable); + ta.recycle(); + + } + + public void setTopDrawable(Drawable topDrawable) { + mTopDrawable = topDrawable; + } + + public void setBottomDrawable(Drawable bottomDrawable) { + mBottomDrawable = bottomDrawable; + } + + public void setLeftDrawable(Drawable leftDrawable) { + mLeftDrawable = leftDrawable; + } + + public void setRightDrawable(Drawable rightDrawable) { + mRightDrawable = rightDrawable; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + setCompoundDrawablesWithIntrinsicBounds(mLeftDrawable, mTopDrawable, mRightDrawable, mBottomDrawable); + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + if (left != null) { + left.setBounds(0, 0, mLeftWidth, mLeftHeight); + } + if (top != null) { + top.setBounds(0, 0, mTopWidth, mTopHeight); + } + if (right != null) { + right.setBounds(0, 0, mRightWidth, mRightHeight); + } + if (bottom != null) { + bottom.setBounds(0, 0, mBottomWidth, mBottomHeight); + } + setCompoundDrawables(left, top, right, bottom); + } + + @Override + public void setChecked(boolean checked) { + // super.setChecked(checked); + } + + public void doToggle() { + super.setChecked(!isChecked()); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/DrawableTextView.java b/common/src/main/java/com/yunbao/common/custom/DrawableTextView.java new file mode 100644 index 000000000..70064b166 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/DrawableTextView.java @@ -0,0 +1,118 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import androidx.appcompat.widget.AppCompatTextView; +import android.util.AttributeSet; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2017/8/15. + * 可以调节drawable大小的TextView + */ + +public class DrawableTextView extends AppCompatTextView { + + private int mTopWidth; + private int mTopHeight; + private int mLeftWidth; + private int mLeftHeight; + private int mRightWidth; + private int mRightHeight; + private int mBottomWidth; + private int mBottomHeight; + private Drawable mTopDrawable; + private Drawable mLeftDrawable; + private Drawable mRightDrawable; + private Drawable mBottomDrawable; + + public DrawableTextView(Context context) { + this(context, null); + } + + public DrawableTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + + public DrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.DrawableTextView); + mTopWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_width, 0); + mTopHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_top_height, 0); + mLeftWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_width, 0); + mLeftHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_left_height, 0); + mRightWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_width, 0); + mRightHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_right_height, 0); + mBottomWidth = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_width, 0); + mBottomHeight = (int) ta.getDimension(R.styleable.DrawableTextView_dt_bottom_height, 0); + mTopDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_top_drawable); + mLeftDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_left_drawable); + mRightDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_right_drawable); + mBottomDrawable = ta.getDrawable(R.styleable.DrawableTextView_dt_bottom_drawable); + ta.recycle(); + } + + public void setTopDrawable(Drawable topDrawable) { + mTopDrawable = topDrawable; + invalidate(); + } + + public void setBottomDrawable(Drawable bottomDrawable) { + mBottomDrawable = bottomDrawable; + invalidate(); + } + + public void setLeftDrawable(Drawable leftDrawable) { + mLeftDrawable = leftDrawable; + invalidate(); + } + + public void setRightDrawable(Drawable rightDrawable) { + mRightDrawable = rightDrawable; + invalidate(); + } + + public Drawable getTopDrawable() { + return mTopDrawable; + } + + public Drawable getLeftDrawable() { + return mLeftDrawable; + } + + public Drawable getRightDrawable() { + return mRightDrawable; + } + + public Drawable getBottomDrawable() { + return mBottomDrawable; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + setCompoundDrawablesWithIntrinsicBounds(mLeftDrawable, mTopDrawable, mRightDrawable, mBottomDrawable); + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + if (left != null) { + left.setBounds(0, 0, mLeftWidth, mLeftHeight); + } + if (top != null) { + top.setBounds(0, 0, mTopWidth, mTopHeight); + } + if (right != null) { + right.setBounds(0, 0, mRightWidth, mRightHeight); + } + if (bottom != null) { + bottom.setBounds(0, 0, mBottomWidth, mBottomHeight); + } + setCompoundDrawables(left, top, right, bottom); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/FixAppBarLayoutBehavior.java b/common/src/main/java/com/yunbao/common/custom/FixAppBarLayoutBehavior.java new file mode 100644 index 000000000..aaf966c69 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/FixAppBarLayoutBehavior.java @@ -0,0 +1,58 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import com.google.android.material.appbar.AppBarLayout; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; +import android.util.AttributeSet; +import android.view.View; + +/** + * Created by cxf on 2018/10/1. + * + * 问题: + * AppBarLayout + RecycleView 滑动后,item 在一段时间内无法点击的问题 + * 1. 快速滑动 RecycleView 后,立即去点击 item 往往没有反应,第二次点击或者等待片刻后点击可以生效。 + * 2. 缓慢滑动后,立即点击 item,发现大多数情况下是有反应的。 + * + * 现象: + * 重写 AppBarLayout.Behavior 打印 log,发现在快速滑动到顶部和底部之后, + * AppBarLayout 在一段时间内还处于 Fling 状态,那么我们想办法把这段无效的 Fling 干掉就好了。 + * + * 结论: + * 最后翻找 google 的时候发现这是 google 在修复上个版本嵌套滑动的时候引进来的新 bug。。。 + */ + +public class FixAppBarLayoutBehavior extends AppBarLayout.Behavior { + + public FixAppBarLayoutBehavior() { + super(); + } + + public FixAppBarLayoutBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type); + stopNestedScrollIfNeeded(dyUnconsumed, child, target, type); + } + + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + stopNestedScrollIfNeeded(dy, child, target, type); + } + + private void stopNestedScrollIfNeeded(int dy, AppBarLayout child, View target, int type) { + if (type == ViewCompat.TYPE_NON_TOUCH) { + final int currOffset = getTopAndBottomOffset(); + if ((dy < 0 && currOffset == 0) || (dy > 0 && currOffset == -child.getTotalScrollRange())) { + ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH); + } + } + } + + +} diff --git a/common/src/main/java/com/yunbao/common/custom/ItemDecoration.java b/common/src/main/java/com/yunbao/common/custom/ItemDecoration.java new file mode 100644 index 000000000..da40f2ba9 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/ItemDecoration.java @@ -0,0 +1,595 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import androidx.annotation.ColorInt; +import androidx.annotation.Dimension; +import androidx.annotation.DrawableRes; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import android.util.TypedValue; +import android.view.View; + +/** + * RecyclerView分割线 + */ + +public class ItemDecoration extends RecyclerView.ItemDecoration { + private static final String TAG = "ItemDecoration"; + private Drawable mDivider; + private int dividerHeight; + private int dividerWidth; + private int dividerColor; + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + private static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; + private static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + /** + * 设置是否显示左右边界线 + */ + private boolean drawBorderLeftAndRight = false; + /** + * 设置是否显示上下边界线 + */ + private boolean drawBorderTopAndBottom = false; + + /** + * 是否只留空白,不画分割线 + */ + private boolean onlySetItemOffsetsButNoDraw=false; + + /** + * 是否是线性布局 + */ + private boolean isLinearLayoutManager=true; + /** + * 布局方向 + */ + private int orientation=VERTICAL_LIST; + + public ItemDecoration(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + this.dividerHeight=mDivider.getIntrinsicHeight(); + this.dividerWidth=mDivider.getIntrinsicWidth(); + } + + /** + * 自定义分割线 + * + * @param context + * @param drawableId 分割线图片 + */ + public ItemDecoration(Context context, @DrawableRes int drawableId) { + mDivider = ContextCompat.getDrawable(context, drawableId); + this.dividerHeight=mDivider.getIntrinsicHeight(); + this.dividerWidth=mDivider.getIntrinsicWidth(); + } + + /** + * 自定义分割线 + * 也可以使用{@link Canvas#drawRect(float, float, float, float, Paint)}或者{@link Canvas#drawText(String, float, float, Paint)}等等 + * 结合{@link Paint}去绘制各式各样的分割线 + * @param context + * @param color 整型颜色值,非资源id + * @param dividerWidth 单位为dp + * @param dividerHeight 单位为dp + */ + public ItemDecoration(Context context, @ColorInt int color, @Dimension float dividerWidth, @Dimension float dividerHeight) { + mDivider = new ColorDrawable(color); + this.dividerWidth= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dividerWidth,context.getResources().getDisplayMetrics()); + this.dividerHeight= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dividerHeight,context.getResources().getDisplayMetrics()); + } + + + /** + * 垂直滚动,item宽度充满,高度自适应 + * 水平滚动,item高度充满,宽度自适应 + * 在itemView绘制完成之前调用,也就是说此方法draw出来的效果将会在itemView的下面 + * onDrawOver方法draw出来的效果将叠加在itemView的上面 + * @param c + * @param parent + * @param state + */ + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + if(onlySetItemOffsetsButNoDraw){ + return; + } + if(isLinearLayoutManager){ + drawLinearItemDivider(c,parent); + }else{ + drawHorizontalLine(c, parent); + drawVerticalLine(c, parent); + } + + } + + private void drawLinearItemDivider(Canvas c, RecyclerView parent){ + int spanCount = getSpanCount(parent); + int allChildCount = parent.getAdapter().getItemCount(); + int top=0,bottom=0,left=0,right=0; + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + if(orientation==VERTICAL_LIST){//画横线 + left = child.getLeft() - params.leftMargin; + right = child.getRight() + params.rightMargin; + if(drawBorderTopAndBottom){ + //加上第一条 + if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount)){ + top=child.getTop()-params.topMargin-dividerHeight; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + if(isLastRaw(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + top = child.getBottom() + params.bottomMargin; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + }else{//画竖线 + top=child.getTop()-params.topMargin; + bottom=child.getBottom()+params.bottomMargin; + if(drawBorderLeftAndRight){ + //加上第一条 + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount)){ + left=child.getLeft()-params.leftMargin-dividerWidth; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + if(isLastColum(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + left = child.getRight() + params.rightMargin; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + if(orientation==VERTICAL_LIST){ + if(drawBorderLeftAndRight){ + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + left=parent.getPaddingLeft(); + right=left+dividerWidth; + //画左边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + left=parent.getWidth()-parent.getPaddingRight()-dividerWidth; + right=left+dividerWidth; +// Log.e(TAG, "drawLinearItemDivider: "+parent.getWidth()+"#"+parent.getPaddingLeft()+"#"+mDivider.getIntrinsicWidth() ); + //画右边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + } + }else if(orientation==HORIZONTAL_LIST){ + if(drawBorderTopAndBottom){ + left=parent.getPaddingLeft(); + right=parent.getWidth()-parent.getPaddingRight(); + top=parent.getPaddingTop(); + bottom=top+dividerHeight; + //画上边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + top=parent.getHeight()-parent.getPaddingBottom()-dividerHeight; + bottom=top+dividerHeight; + //画下边界 + mDivider.setBounds(left,top,right,bottom); + mDivider.draw(c); + } + } + } + + /** + * 画水平分割线 + * @param c + * @param parent + */ + private void drawHorizontalLine(Canvas c, RecyclerView parent) { + int spanCount = getSpanCount(parent); + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + int top=0,bottom=0,left=0,right=0; + left = child.getLeft() - params.leftMargin; + //因为getItemOffsets中为竖线留了空隙,所以要加上分割线的宽度(在此处处理,下面不用处理) + right = child.getRight() + params.rightMargin+ dividerWidth; + if(i==parent.getChildCount()-1 && !drawBorderLeftAndRight){ + right-=dividerWidth;//防止最后一个越界 + } + + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount) && drawBorderLeftAndRight){ + left-=dividerWidth;//下面不用处理 + } + if(drawBorderTopAndBottom){ + //加上第一条 + if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount)){ + top=child.getTop()-params.topMargin-dividerHeight; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + int allChildCount = parent.getAdapter().getItemCount(); + if(isLastRaw(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } +// Log.e(TAG, "drawVertical: "+params.getViewLayoutPosition()+"@@"+mDivider.getIntrinsicWidth()+"#"+parent.getLayoutManager().getLeftDecorationWidth(child) ); + top = child.getBottom() + params.bottomMargin; + bottom = top + dividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + /** + * 画垂直分割线 + * @param c + * @param parent + */ + private void drawVerticalLine(Canvas c, RecyclerView parent) { + int spanCount = getSpanCount(parent); + for (int i = 0; i < parent.getChildCount(); i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); + int left=0,right=0,top=0,bottom=0; + top=child.getTop()-params.topMargin; + //因为getItemOffsets中为横线留了空隙,所以要加上分割线的高度(上下加一处即可) + bottom=child.getBottom()+params.bottomMargin/**+mDivider.getIntrinsicHeight()*/; +// if(isFirstRaw(parent,params.getViewLayoutPosition(),spanCount) && drawBorderTopAndBottom){ +// top-=mDivider.getIntrinsicHeight(); +// } + if(drawBorderLeftAndRight){ + //加上第一条 + if(isFirstColumn(parent,params.getViewLayoutPosition(),spanCount)){ + left=child.getLeft()-params.leftMargin-dividerWidth; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + }else{ + int allChildCount = parent.getAdapter().getItemCount(); + if(isLastColum(parent,params.getViewLayoutPosition(),spanCount,allChildCount)){ + continue; + } + } + + left = child.getRight() + params.rightMargin; + right = left + dividerWidth; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + /** + * item的偏移,如果不设置,也能画线,但是画在了item后面(被item挡住了,可以通过设置item背景透明度证实) + * @param outRect + * @param view + * @param parent + * @param state + */ + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if(!(layoutManager instanceof LinearLayoutManager)){ + throw new IllegalStateException("The LayoutManager must be LinearLayoutManager or it's subclass!!!"); + } + isLinearLayoutManager=(layoutManager instanceof LinearLayoutManager) && !(layoutManager instanceof GridLayoutManager); + if(isLinearLayoutManager){ + orientation=((LinearLayoutManager) layoutManager).getOrientation(); + }else{ + orientation=(layoutManager instanceof GridLayoutManager)?((GridLayoutManager) layoutManager).getOrientation():((StaggeredGridLayoutManager)layoutManager).getOrientation(); + } + int spanCount = getSpanCount(parent); + int childCount = parent.getAdapter().getItemCount(); + int itemPosition=((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); +// Log.e(TAG, "getItemOffsets: "+childCount+"$"+spanCount+"$"+itemPosition ); + boolean isLastRaw=isLastRaw(parent, itemPosition, spanCount, childCount); + boolean isLastColum=isLastColum(parent, itemPosition, spanCount, childCount); + boolean isFirstRaw=isFirstRaw(parent,itemPosition,spanCount); + boolean isFirstColumn=isFirstColumn(parent,itemPosition,spanCount); + int left=0,top=0,right=0,bottom=0; + if(isLinearLayoutManager){ + if(orientation==VERTICAL_LIST){ + //垂直滚动线性布局 + bottom=dividerHeight; + if(isLastRaw && !drawBorderTopAndBottom){ + bottom=0; + } + if(isFirstRaw && drawBorderTopAndBottom){ + top=dividerHeight; + } + if(drawBorderLeftAndRight){ + left=dividerWidth; + right=dividerWidth; + } + }else if(orientation==HORIZONTAL_LIST){ + right=dividerWidth; + if(isLastColum && !drawBorderLeftAndRight){ + right=0; + } + if(isFirstColumn && drawBorderLeftAndRight){ + left=dividerWidth; + } + if(drawBorderTopAndBottom){ + top=dividerHeight; + bottom=dividerHeight; + } + } + }else{ + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)layoutManager).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(itemPosition, spanCount);//左边的跨度索引值[0,spanCount)之间 + int spanIndexRight = spanIndexLeft - 1 + spanSizeLookup.getSpanSize(itemPosition);//右边的跨度索引值[0,spanCount)之间 +// Log.e(TAG, "getItemOffsets: "+spanIndexLeft +"#"+spanIndexRight+"#"+itemPosition+"$$$"+spanSizeLookup.getSpanGroupIndex(itemPosition, spanCount)); + if(orientation==VERTICAL_LIST){ + if(drawBorderLeftAndRight){ + //注:如果此处不能整除,会造成divider的宽或高不统一的bug(下同),因为Rect不支持float,所以暂无法解决 + left=dividerWidth * (spanCount - spanIndexLeft) / spanCount; + right=dividerWidth * (spanIndexRight + 1) / spanCount; + }else{ + left = dividerWidth * spanIndexLeft / spanCount; + right = dividerWidth * (spanCount - spanIndexRight - 1) / spanCount; + } + if(drawBorderTopAndBottom){ + if (spanSizeLookup.getSpanGroupIndex(itemPosition, spanCount) == 0) { + top = dividerHeight; + } else { + top = 0; + } + bottom = dividerHeight; + }else{ + if (isLastRaw) { + bottom=0; + } else { + bottom = dividerHeight; + } + top=0; + } + }else if(orientation==HORIZONTAL_LIST){ + if(drawBorderTopAndBottom){ + top=dividerHeight * (spanCount - spanIndexLeft) / spanCount; + bottom=dividerHeight * (spanIndexRight + 1) / spanCount; + }else{ + top = dividerHeight * spanIndexLeft / spanCount; + bottom = dividerHeight * (spanCount - spanIndexRight - 1) / spanCount; + } + if(drawBorderLeftAndRight){ + if(isFirstColumn){ + left=dividerWidth; + }else{ + left=0; + } + right=dividerWidth; + }else{ + if(isLastColum){ + right=0; + }else{ + right=dividerWidth; + } + left=0; + } + } + } + //Log.e(TAG, "getItemOffsets: "+left+"@"+top+"#"+right+"$"+bottom+"%"+itemPosition ); + outRect.set(left,top,right,bottom); + } + + private boolean isFirstRaw(RecyclerView parent, int pos, int spanCount){ + if (!isLinearLayoutManager) { + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)parent.getLayoutManager()).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(pos, spanCount); + if (orientation == GridLayoutManager.VERTICAL) { +// if(pos=childCount-spanCount && childCount%spanCount==0){ +// //整除的情况判断最后一整列 +// return true; +// }else if(childCount%spanCount!=0 && pos>=spanCount*(childCount/spanCount)){ +// //不能整除的情况只判断最后几个 +// return true; +// } + //=========================另一种方案============================== +// if(pos>=childCount-spanCount){ +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + int lastItemSpanGroupIndex=spanSizeLookup.getSpanGroupIndex(childCount-1,spanCount); + if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex){ + return true;//如果与最后一个元素同组则判定为最后一行 + } + } + }else{ + if (orientation == LinearLayoutManager.VERTICAL) { + //每一个都是第一列,也是最后一列 + return true; + }else{ + if(pos==childCount-1){ + return true; + } + } + } + return false; + } + + private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { + if (!isLinearLayoutManager) { + GridLayoutManager.SpanSizeLookup spanSizeLookup = ((GridLayoutManager)parent.getLayoutManager()).getSpanSizeLookup(); + int spanIndexLeft = spanSizeLookup.getSpanIndex(pos, spanCount); + if (orientation == GridLayoutManager.VERTICAL) { +// if(pos>=childCount-spanCount && childCount%spanCount==0){ +// //整除的情况判断最后一整行 +// return true; +// }else if(childCount%spanCount!=0 && pos>=spanCount*(childCount/spanCount)){ +// //不能整除的情况只判断最后几个 +// return true; +// } + //=======================另一种方案=============================== +// if(pos>=childCount-spanCount){ +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + //判断最后一行是否充满整行 + boolean flag=spanSizeLookup.getSpanIndex(childCount-1, spanCount)==spanCount-1 || spanCount==spanSizeLookup.getSpanSize(childCount-1); + int lastItemSpanGroupIndex=spanSizeLookup.getSpanGroupIndex(childCount-1,spanCount); + if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex){ + return true;//如果与最后一个元素同组则判定为最后一行 + } +// if(flag){ +// }else{ +// //没有充满则前一行跟最后一行都判定为最后一行 +// if(spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex || spanSizeLookup.getSpanGroupIndex(pos,spanCount)==lastItemSpanGroupIndex-1){ +// return true; +// } +// } + }else{ + //最后一行或者不能整除的情况下最后一个 +// if ((pos + 1) % spanCount == 0 /**|| pos==childCount-1*/){// 如果是最后一行 +// return true; +// } + //=========================另一种方案,兼容每个item的spanSize不同的情况============================== + if(spanIndexLeft==spanCount-1 || spanCount==spanSizeLookup.getSpanSize(pos) || pos==childCount-1){ + return true; + } + } + }else{ + if (orientation == LinearLayoutManager.VERTICAL) { + if(pos==childCount-1){ + return true; + } + }else{ + //每一个都是第一行,也是最后一行 + return true; + } + } + return false; + } + + + private int getSpanCount(RecyclerView parent) { + // 列数 + int spanCount = -1; + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount(); + } + return spanCount; + } + + public boolean isDrawBorderTopAndBottom() { + return drawBorderTopAndBottom; + } + + public void setDrawBorderTopAndBottom(boolean drawBorderTopAndBottom) { + this.drawBorderTopAndBottom = drawBorderTopAndBottom; + } + + public boolean isDrawBorderLeftAndRight() { + return drawBorderLeftAndRight; + } + + public void setDrawBorderLeftAndRight(boolean drawBorderLeftAndRight) { + this.drawBorderLeftAndRight = drawBorderLeftAndRight; + } + + public boolean isOnlySetItemOffsetsButNoDraw() { + return onlySetItemOffsetsButNoDraw; + } + + public void setOnlySetItemOffsetsButNoDraw(boolean onlySetItemOffsetsButNoDraw) { + this.onlySetItemOffsetsButNoDraw = onlySetItemOffsetsButNoDraw; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yunbao/common/custom/ItemSlideHelper.java b/common/src/main/java/com/yunbao/common/custom/ItemSlideHelper.java new file mode 100644 index 000000000..fd1a1bef8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/ItemSlideHelper.java @@ -0,0 +1,366 @@ +package com.yunbao.common.custom; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.Rect; +import androidx.core.view.GestureDetectorCompat; +import androidx.core.view.MotionEventCompat; +import androidx.recyclerview.widget.RecyclerView; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; + +/** + * 消息列表左滑菜单帮助类 + */ +public class ItemSlideHelper implements RecyclerView.OnItemTouchListener, GestureDetector.OnGestureListener { + + private final int DEFAULT_DURATION = 150; + private View mTargetView; + + private int mActivePointerId; + private int mTouchSlop; + private int mMaxVelocity; + private int mMinVelocity; + private int mLastX; + private int mLastY; + + private boolean mIsDragging; + private Animator mExpandAndCollapseAnim; + private GestureDetectorCompat mGestureDetector; + + private Callback mCallback; + + public ItemSlideHelper(Context context, Callback callback) { + this.mCallback = callback; + + //手势用于处理fling + mGestureDetector = new GestureDetectorCompat(context, this); + + ViewConfiguration configuration = ViewConfiguration.get(context); + mTouchSlop = configuration.getScaledTouchSlop(); + mMaxVelocity = configuration.getScaledMaximumFlingVelocity(); + mMinVelocity = configuration.getScaledMinimumFlingVelocity(); + } + + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { + int action = MotionEventCompat.getActionMasked(e); + int x = (int) e.getX(); + int y = (int) e.getY(); + + + //如果RecyclerView滚动状态不是空闲targetView不是空 + if (rv.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) { + if (mTargetView != null) { + //隐藏已经打开 + smoothHorizontalExpandOrCollapse(DEFAULT_DURATION / 2); + mTargetView = null; + } + + return false; + } + + //如果正在运行动画 ,直接拦截什么都不做 + if (mExpandAndCollapseAnim != null && mExpandAndCollapseAnim.isRunning()) { + return true; + } + + boolean needIntercept = false; + switch (action) { + case MotionEvent.ACTION_DOWN: + + mActivePointerId = MotionEventCompat.getPointerId(e, 0); + mLastX = (int) e.getX(); + mLastY = (int) e.getY(); + + /* + * 如果之前有一个已经打开的项目,当此次点击事件没有发生在右侧的菜单中则返回TRUE, + * 如果点击的是右侧菜单那么返回FALSE这样做的原因是因为菜单需要响应Onclick + * */ + if (mTargetView != null) { + return !inView(x, y); + } + + //查找需要显示菜单的view; + mTargetView = mCallback.findTargetView(x, y); + + break; + case MotionEvent.ACTION_MOVE: + + int deltaX = (x - mLastX); + int deltaY = (y - mLastY); + + if (Math.abs(deltaY) > Math.abs(deltaX)) + return false; + + //如果移动距离达到要求,则拦截 + needIntercept = mIsDragging = mTargetView != null && Math.abs(deltaX) >= mTouchSlop; + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + /* + * 走这是因为没有发生过拦截事件 + * */ + if (isExpanded()) { + + if (inView(x, y)) { + // 如果走这那行这个ACTION_UP的事件会发生在右侧的菜单中 + } else { + //拦截事件,防止targetView执行onClick事件 + needIntercept = true; + } + + //折叠菜单 + smoothHorizontalExpandOrCollapse(DEFAULT_DURATION / 2); + } + + mTargetView = null; + break; + } + + return needIntercept; + } + + private boolean isExpanded() { + int range = getHorizontalRange(); + if (range == 0) { + return false; + } + return mTargetView != null && mTargetView.getScrollX() == range; + } + + private boolean isCollapsed() { + + return mTargetView != null && mTargetView.getScrollX() == 0; + } + + /* + * 根据targetView的scrollX计算出targetView的偏移,这样能够知道这个point + * 是在右侧的菜单中 + * */ + private boolean inView(int x, int y) { + + if (mTargetView == null) + return false; + + int scrollX = mTargetView.getScrollX(); + int left = mTargetView.getWidth() - scrollX; + int top = mTargetView.getTop(); + int right = left + getHorizontalRange(); + int bottom = mTargetView.getBottom(); + Rect rect = new Rect(left, top, right, bottom); + return rect.contains(x, y); + } + + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent e) { + if (mExpandAndCollapseAnim != null && mExpandAndCollapseAnim.isRunning() || mTargetView == null) + return; + + //如果要响应fling事件设置将mIsDragging设为false + if (mGestureDetector.onTouchEvent(e)) { + mIsDragging = false; + return; + } + + int x = (int) e.getX(); + int y = (int) e.getY(); + int action = MotionEventCompat.getActionMasked(e); + switch (action) { + case MotionEvent.ACTION_DOWN: + //RecyclerView 不会转发这个Down事件 + + break; + case MotionEvent.ACTION_MOVE: + int deltaX = (int) (mLastX - e.getX()); + if (mIsDragging) { + horizontalDrag(deltaX); + } + mLastX = x; + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + + if (mIsDragging) { + if (!smoothHorizontalExpandOrCollapse(0) && isCollapsed()) + mTargetView = null; + + mIsDragging = false; + } + break; + } + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } + + /** + * 根据touch事件来滚动View的scrollX + * + * @param delta + */ + private void horizontalDrag(int delta) { + if (mCallback != null && !mCallback.useLeftScroll()) { + if(delta > 0){ + RecyclerView.ViewHolder viewHolder = mCallback.getChildViewHolder(mTargetView); + mCallback.onLeftScroll(viewHolder); + } + return; + } + int scrollX = mTargetView.getScrollX(); + int scrollY = mTargetView.getScrollY(); + if ((scrollX + delta) <= 0) { + mTargetView.scrollTo(0, scrollY); + return; + } + + int horRange = getHorizontalRange(); + scrollX += delta; + if (Math.abs(scrollX) < horRange) { + mTargetView.scrollTo(scrollX, scrollY); + } else { + mTargetView.scrollTo(horRange, scrollY); + } + + } + + /** + * 根据当前scrollX的位置判断是展开还是折叠 + * + * @param velocityX 如果不等于0那么这是一次fling事件,否则是一次ACTION_UP或者ACTION_CANCEL + */ + private boolean smoothHorizontalExpandOrCollapse(float velocityX) { + + int scrollX = mTargetView.getScrollX(); + int scrollRange = getHorizontalRange(); + + if (mExpandAndCollapseAnim != null) + return false; + + int to = 0; + int duration = DEFAULT_DURATION; + + if (velocityX == 0) { + //如果已经展一半,平滑展开 + if (scrollX > scrollRange / 2) { + to = scrollRange; + } + } else { + + if (velocityX > 0) + to = 0; + else + to = scrollRange; + + duration = (int) ((1.f - Math.abs(velocityX) / mMaxVelocity) * DEFAULT_DURATION); + } + + if (to == scrollX) { + return false; + } + mExpandAndCollapseAnim = ObjectAnimator.ofInt(mTargetView, "scrollX", to); + mExpandAndCollapseAnim.setDuration(duration); + mExpandAndCollapseAnim.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + mExpandAndCollapseAnim = null; + if (isCollapsed()) + mTargetView = null; + + } + + @Override + public void onAnimationCancel(Animator animation) { + //onAnimationEnd(animation); + mExpandAndCollapseAnim = null; + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + mExpandAndCollapseAnim.start(); + + return true; + } + + public int getHorizontalRange() { + RecyclerView.ViewHolder viewHolder = mCallback.getChildViewHolder(mTargetView); + if (viewHolder == null) { + return 0; + } + return mCallback.getHorizontalRange(viewHolder); + } + + @Override + public boolean onDown(MotionEvent e) { + return false; + } + + @Override + public void onShowPress(MotionEvent e) { + + } + + @Override + public boolean onSingleTapUp(MotionEvent e) { + return false; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + return false; + } + + @Override + public void onLongPress(MotionEvent e) { + + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + + if (Math.abs(velocityX) > mMinVelocity && Math.abs(velocityX) < mMaxVelocity) { + if (!smoothHorizontalExpandOrCollapse(velocityX)) { + if (isCollapsed()) + mTargetView = null; + return true; + } + } + return false; + } + + /** + * 左滑菜单Callback + */ + public interface Callback { + + int getHorizontalRange(RecyclerView.ViewHolder holder); + + RecyclerView.ViewHolder getChildViewHolder(View childView); + + View findTargetView(float x, float y); + + //是否使用左滑删除 + boolean useLeftScroll(); + + void onLeftScroll(RecyclerView.ViewHolder holder); + + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/yunbao/common/custom/MyFrameLayout1.java b/common/src/main/java/com/yunbao/common/custom/MyFrameLayout1.java new file mode 100644 index 000000000..160725603 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyFrameLayout1.java @@ -0,0 +1,36 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * Created by cxf on 2018/9/27. + */ + +public class MyFrameLayout1 extends FrameLayout { + + private int mScreenWidth; + + public MyFrameLayout1(@NonNull Context context) { + this(context, null); + } + + public MyFrameLayout1(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyFrameLayout1(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + mScreenWidth = context.getResources().getDisplayMetrics().widthPixels; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(mScreenWidth, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyFrameLayout2.java b/common/src/main/java/com/yunbao/common/custom/MyFrameLayout2.java new file mode 100644 index 000000000..23498e9fa --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyFrameLayout2.java @@ -0,0 +1,45 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/27. + */ + +public class MyFrameLayout2 extends FrameLayout { + + private float mRatio; + private float mOffestY; + + public MyFrameLayout2(@NonNull Context context) { + this(context, null); + } + + public MyFrameLayout2(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyFrameLayout2(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyFrameLayout2); + mRatio = ta.getFloat(R.styleable.MyFrameLayout2_mfl_ratio, 1); + mOffestY = ta.getDimension(R.styleable.MyFrameLayout2_mfl_offestY, 0); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * mRatio + mOffestY), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyImageView2.java b/common/src/main/java/com/yunbao/common/custom/MyImageView2.java new file mode 100644 index 000000000..8776d5e35 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyImageView2.java @@ -0,0 +1,50 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; + +/** + * Created by cxf on 2018/11/21. + */ + +public class MyImageView2 extends AppCompatImageView { + + private boolean mAnimating; + private RotateAnimation mRotateAnimation; + + + public MyImageView2(Context context) { + this(context, null); + } + + public MyImageView2(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyImageView2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mRotateAnimation = new RotateAnimation(-30f, 30f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.2f); + mRotateAnimation.setDuration(300); + mRotateAnimation.setRepeatCount(-1); + mRotateAnimation.setRepeatMode(Animation.REVERSE); + } + + public void startAnim() { + if (!mAnimating) { + mAnimating = true; + startAnimation(mRotateAnimation); + } + } + + public void stopAnim() { + if(mAnimating){ + mAnimating = false; + clearAnimation(); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyLinearLayout1.java b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout1.java new file mode 100644 index 000000000..58e546999 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout1.java @@ -0,0 +1,34 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +/** + * Created by cxf on 2018/9/27. + */ + +public class MyLinearLayout1 extends LinearLayout { + + private int mScreenWidth; + + public MyLinearLayout1(Context context) { + this(context, null); + } + + public MyLinearLayout1(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyLinearLayout1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mScreenWidth = context.getResources().getDisplayMetrics().widthPixels; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(mScreenWidth * 2, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyLinearLayout2.java b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout2.java new file mode 100644 index 000000000..73b0a76dc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout2.java @@ -0,0 +1,42 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/25. + */ + +public class MyLinearLayout2 extends LinearLayout { + + private float mScreenWidth; + private int mSpanCount; + + public MyLinearLayout2(Context context) { + this(context, null); + } + + public MyLinearLayout2(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyLinearLayout2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mScreenWidth = context.getResources().getDisplayMetrics().widthPixels; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyLinearLayout2); + mSpanCount = ta.getInteger(R.styleable.MyLinearLayout2_mll_span_count, 6); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (mScreenWidth / mSpanCount), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyLinearLayout3.java b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout3.java new file mode 100644 index 000000000..691dc4511 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout3.java @@ -0,0 +1,49 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.widget.LinearLayout; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/12/3. + */ + +public class MyLinearLayout3 extends LinearLayout { + + private int mScreenHeight; + private float mHeightPercent; + private int mHeight; + + public MyLinearLayout3(Context context) { + this(context, null); + } + + public MyLinearLayout3(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyLinearLayout3(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + mScreenHeight = dm.heightPixels; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyLinearLayout3); + mHeightPercent = ta.getFloat(R.styleable.MyLinearLayout3_mll_height_percent, 0); + mHeight = (int) (mHeightPercent * mScreenHeight); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + public int getHeight2() { + return mHeight; + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyLinearLayout4.java b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout4.java new file mode 100644 index 000000000..4dc1a9b21 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout4.java @@ -0,0 +1,45 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +import com.yunbao.common.R; + + +/** + * Created by cxf on 2018/7/26. + */ + +public class MyLinearLayout4 extends LinearLayout { + + private int mScreenWidth; + private float mCount; + + public MyLinearLayout4(Context context) { + this(context, null); + } + + public MyLinearLayout4(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyLinearLayout4(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyLinearLayout4); + mCount = ta.getFloat(R.styleable.MyLinearLayout4_mll4_count, 1); + ta.recycle(); + init(context); + } + + private void init(Context context) { + mScreenWidth = context.getResources().getDisplayMetrics().widthPixels; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (mScreenWidth / mCount), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyLinearLayout5.java b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout5.java new file mode 100644 index 000000000..eefa6bf49 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyLinearLayout5.java @@ -0,0 +1,34 @@ +package com.yunbao.common.custom; + +import android.content.Context; + +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.LinearLayout; + + +/** + * Created by cxf on 2018/7/26. + */ + +public class MyLinearLayout5 extends LinearLayout { + + + public MyLinearLayout5(Context context) { + super(context); + } + + public MyLinearLayout5(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public MyLinearLayout5(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + super.onMeasure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.UNSPECIFIED), heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyRadioButton.java b/common/src/main/java/com/yunbao/common/custom/MyRadioButton.java new file mode 100644 index 000000000..6b74162a1 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyRadioButton.java @@ -0,0 +1,34 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RadioButton; + +/** + * Created by cxf on 2018/9/28. + */ + +public class MyRadioButton extends RadioButton { + + public MyRadioButton(Context context) { + super(context); + } + + public MyRadioButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public void setChecked(boolean checked) { + //super.setChecked(checked); + } + + public void doChecked(boolean checked){ + super.setChecked(checked); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout2.java b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout2.java new file mode 100644 index 000000000..45a9d1519 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout2.java @@ -0,0 +1,48 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/27. + */ + +public class MyRelativeLayout2 extends RelativeLayout { + + private int mScreenWidth; + private float mRatio; + private float mScaleWidth; + + public MyRelativeLayout2(@NonNull Context context) { + this(context, null); + } + + public MyRelativeLayout2(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public MyRelativeLayout2(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + mScreenWidth = context.getResources().getDisplayMetrics().widthPixels; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyRelativeLayout2); + mRatio = ta.getFloat(R.styleable.MyRelativeLayout2_mrl_ratio, 1); + mScaleWidth = ta.getFloat(R.styleable.MyRelativeLayout2_mrl_scaleX, 1); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = (int) (mScreenWidth * mScaleWidth); + widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * mRatio), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout5.java b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout5.java new file mode 100644 index 000000000..a2a02c9a5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout5.java @@ -0,0 +1,31 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +/** + * Created by cxf on 2018/9/26. + */ + +public class MyRelativeLayout5 extends RelativeLayout { + + public MyRelativeLayout5(Context context) { + super(context); + } + + public MyRelativeLayout5(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyRelativeLayout5(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout6.java b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout6.java new file mode 100644 index 000000000..43dbe5898 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyRelativeLayout6.java @@ -0,0 +1,31 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +/** + * Created by cxf on 2018/9/26. + */ + +public class MyRelativeLayout6 extends RelativeLayout { + + public MyRelativeLayout6(Context context) { + super(context); + } + + public MyRelativeLayout6(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyRelativeLayout6(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + float widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * 13 / 9), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/MyViewPager.java b/common/src/main/java/com/yunbao/common/custom/MyViewPager.java new file mode 100644 index 000000000..9d22e14bf --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/MyViewPager.java @@ -0,0 +1,62 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.viewpager.widget.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/6/9. + * 可以禁止滑动的ViewPager + */ + +public class MyViewPager extends ViewPager { + + private boolean mCanScroll; + + public MyViewPager(Context context) { + this(context, null); + } + + public MyViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager); + mCanScroll = ta.getBoolean(R.styleable.MyViewPager_canScroll, true); + ta.recycle(); + } + + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (mCanScroll) { + try { + return super.onInterceptTouchEvent(ev); + } catch (Exception e) { + return false; + } + } else { + return false; + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (mCanScroll) { + try { + return super.onTouchEvent(ev); + } catch (Exception e) { + return false; + } + } else { + return false; + } + } + + public void setCanScroll(boolean canScroll) { + mCanScroll = canScroll; + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/RatioImageView.java b/common/src/main/java/com/yunbao/common/custom/RatioImageView.java new file mode 100644 index 000000000..35ae953e4 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/RatioImageView.java @@ -0,0 +1,41 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.appcompat.widget.AppCompatTextView; +import android.util.AttributeSet; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/27. + */ + +public class RatioImageView extends AppCompatImageView { + + private float mRatio; + + public RatioImageView(Context context) { + this(context, null); + } + + public RatioImageView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public RatioImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RatioImageView); + mRatio = ta.getFloat(R.styleable.RatioImageView_ri_ratio, 1); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * mRatio), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/RatioRoundImageView.java b/common/src/main/java/com/yunbao/common/custom/RatioRoundImageView.java new file mode 100644 index 000000000..0171e88b0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/RatioRoundImageView.java @@ -0,0 +1,40 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; +import android.util.AttributeSet; + +import com.makeramen.roundedimageview.RoundedImageView; +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/27. + */ + +public class RatioRoundImageView extends RoundedImageView { + + private float mRatio; + + public RatioRoundImageView(Context context) { + this(context, null); + } + + public RatioRoundImageView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public RatioRoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RatioImageView); + mRatio = ta.getFloat(R.styleable.RatioImageView_ri_ratio, 1); + ta.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * mRatio), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/SquareImageView.java b/common/src/main/java/com/yunbao/common/custom/SquareImageView.java new file mode 100644 index 000000000..68363cfe3 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/SquareImageView.java @@ -0,0 +1,31 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import androidx.appcompat.widget.AppCompatImageView; +import android.util.AttributeSet; + +/** + * Created by cxf on 2018/6/7. + */ + +public class SquareImageView extends AppCompatImageView { + public SquareImageView(Context context) { + super(context); + } + + public SquareImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/SquareRoundedImageView.java b/common/src/main/java/com/yunbao/common/custom/SquareRoundedImageView.java new file mode 100644 index 000000000..df7a9866f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/SquareRoundedImageView.java @@ -0,0 +1,32 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import android.util.AttributeSet; + +import com.makeramen.roundedimageview.RoundedImageView; + +/** + * Created by cxf on 2018/6/7. + */ + +public class SquareRoundedImageView extends RoundedImageView { + public SquareRoundedImageView(Context context) { + super(context); + } + + public SquareRoundedImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareRoundedImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/common/src/main/java/com/yunbao/common/custom/TabButton.java b/common/src/main/java/com/yunbao/common/custom/TabButton.java new file mode 100644 index 000000000..d2c72d512 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/TabButton.java @@ -0,0 +1,159 @@ +package com.yunbao.common.custom; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import androidx.core.content.ContextCompat; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/9/21. + * 向宽平 + */ + +public class TabButton extends LinearLayout { + + private Context mContext; + private float mScale; + private String mTip; + private int mIconSize; + private int mTextSize; + private int mTextColorChecked; + private int mTextColorUnChecked; + private boolean mChecked; + private ImageView mImg; + private TextView mText; + private Drawable[] mDrawables; + private int mDrawaleArrayLength; + private ValueAnimator mAnimator;//帧动画 + private int mDrawableIndex; + + public TabButton(Context context) { + this(context, null); + } + + public TabButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TabButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + mScale = context.getResources().getDisplayMetrics().density; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TabButton); + int iconArrayId = ta.getResourceId(R.styleable.TabButton_tbn_icon_array_id, 0); + mTip = ta.getString(R.styleable.TabButton_tbn_tip); + mIconSize = (int) ta.getDimension(R.styleable.TabButton_tbn_icon_size, 0); + mTextSize = (int) ta.getDimension(R.styleable.TabButton_tbn_text_size, 0); + mTextColorChecked = ta.getColor(R.styleable.TabButton_tbn_text_color_checked, 0); + mTextColorUnChecked = ta.getColor(R.styleable.TabButton_tbn_text_color_unchecked, 0); + mChecked = ta.getBoolean(R.styleable.TabButton_tbn_checked, false); + ta.recycle(); + if (iconArrayId != 0) { + TypedArray arr = getResources().obtainTypedArray(iconArrayId); + int len = arr.length(); + int[] iconResArray = new int[len]; + for (int i = 0; i < len; i++) { + iconResArray[i] = arr.getResourceId(i, 0); + } + arr.recycle(); + mDrawaleArrayLength = iconResArray.length; + if (mDrawaleArrayLength > 0) { + mDrawables = new Drawable[mDrawaleArrayLength]; + for (int i = 0; i < mDrawaleArrayLength; i++) { + mDrawables[i] = ContextCompat.getDrawable(context, iconResArray[i]); + } + } + } + mAnimator = ValueAnimator.ofFloat(1, mDrawaleArrayLength - 1); + mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float v = (float) animation.getAnimatedValue(); + int index = (int) v; + if (mDrawableIndex != index) { + mDrawableIndex = index; + if (mImg != null) { + mImg.setImageDrawable(mDrawables[index]); + } + } + } + }); + mAnimator.setDuration(800); + mAnimator.setInterpolator(new LinearInterpolator()); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + setOrientation(VERTICAL); + setGravity(Gravity.CENTER_HORIZONTAL); + mImg = new ImageView(mContext); + LayoutParams params1 = new LayoutParams(mIconSize, mIconSize); + params1.setMargins(0, dp2px(4), 0, 0); + mImg.setLayoutParams(params1); + if (mDrawables != null && mDrawaleArrayLength > 0) { + if (mChecked) { + mImg.setImageDrawable(mDrawables[1]); + } else { + mImg.setImageDrawable(mDrawables[0]); + } + } + mText = new TextView(mContext); + LayoutParams params2 = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + mText.setLayoutParams(params2); + mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize); + mText.setText(mTip); + mText.setTextColor(mChecked ? mTextColorChecked : mTextColorUnChecked); + addView(mImg); + addView(mText); + } + + public void setChecked(boolean checked) { + mChecked = checked; + if (mDrawables != null && mDrawaleArrayLength > 0) { + if (mChecked) { + if (mText != null) { + mText.setTextColor(mTextColorChecked); + } + if (mAnimator != null) { + mAnimator.start(); + } + mImg.setImageDrawable(mDrawables[1]); + + } else { + if (mAnimator != null) { + mAnimator.cancel(); + } + if (mImg != null) { + mImg.setImageDrawable(mDrawables[0]); + } + if (mText != null) { + mText.setTextColor(mTextColorUnChecked); + } + } + } + } + + private int dp2px(int dpVal) { + return (int) (mScale * dpVal + 0.5f); + } + + public void cancelAnim() { + if (mAnimator != null) { + mAnimator.cancel(); + mAnimator.removeAllUpdateListeners(); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/TabButtonGroup.java b/common/src/main/java/com/yunbao/common/custom/TabButtonGroup.java new file mode 100644 index 000000000..c0fc8de1c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/TabButtonGroup.java @@ -0,0 +1,102 @@ +package com.yunbao.common.custom; + +import android.content.Context; +import androidx.annotation.Nullable; +import androidx.viewpager.widget.ViewPager; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; + +import com.yunbao.common.bean.UpdataListBean; + +import org.greenrobot.eventbus.EventBus; + +/** + * Created by cxf on 2018/9/22. + */ + +public class TabButtonGroup extends LinearLayout implements View.OnClickListener { + + private TabButton[] mTabButtons; + private ViewPager mViewPager; + private int mCurPosition; + + + public TabButtonGroup(Context context) { + this(context, null); + } + + public TabButtonGroup(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public TabButtonGroup(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + int childCount = getChildCount(); + if (childCount > 0) { + mTabButtons = new TabButton[childCount]; + for (int i = 0; i < childCount; i++) { + View v = getChildAt(i); + v.setTag(i); + v.setOnClickListener(this); + mTabButtons[i] = (TabButton) v; + } + } + } + + private long mLastClickBackTime; + + public void setCurPosition(int position) { + //点击事件切换 + if (position == mCurPosition) { +// return; + long curTime = System.currentTimeMillis(); + if (curTime - mLastClickBackTime <= 500) { + if (position != 2 && position != 3) { + EventBus.getDefault().post(new UpdataListBean(position, "")); + } + } else { + mLastClickBackTime = curTime; + } + } else { + mLastClickBackTime = 0; + } + mTabButtons[mCurPosition].setChecked(false); + mTabButtons[position].setChecked(true); + mCurPosition = position; + if (mViewPager != null) { + mViewPager.setCurrentItem(position, false); + } + } + + + @Override + public void onClick(View v) { + Object tag = v.getTag(); + if (tag != null) { + setCurPosition((int) tag); + } + } + + public void setViewPager(ViewPager viewPager) { + mViewPager = viewPager; + } + + public void cancelAnim() { + if (mTabButtons != null) { + for (TabButton tbn : mTabButtons) { + if (tbn != null) { + tbn.cancelAnim(); + + + } + } + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/custom/VerticalImageSpan.java b/common/src/main/java/com/yunbao/common/custom/VerticalImageSpan.java new file mode 100644 index 000000000..bf09d2a2f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/custom/VerticalImageSpan.java @@ -0,0 +1,48 @@ +package com.yunbao.common.custom; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.style.ImageSpan; + +/** + * Created by cxf on 2017/12/1. + */ + +public class VerticalImageSpan extends ImageSpan { + private Drawable drawable; + public VerticalImageSpan(Drawable drawable) { + super(drawable); + this.drawable=drawable; + } + @Override + public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fontMetricsInt) { + Drawable drawable = getDrawable(); + if(drawable==null){ + drawable= this.drawable; + } + Rect rect = drawable.getBounds(); + if (fontMetricsInt != null) { + Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt(); + int fontHeight = fmPaint.bottom - fmPaint.top; + int drHeight = rect.bottom - rect.top; + int top = drHeight / 2 - fontHeight / 4; + int bottom = drHeight / 2 + fontHeight / 4; + fontMetricsInt.ascent = -bottom; + fontMetricsInt.top = -bottom; + fontMetricsInt.bottom = top; + fontMetricsInt.descent = top; + } + return rect.right; + } + @Override + public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { + Drawable drawable = getDrawable(); + canvas.save(); + int transY = ((bottom - top) - drawable.getBounds().bottom) / 2 + top; + canvas.translate(x, transY); + drawable.draw(canvas); + canvas.restore(); + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/AbsDialogFragment.java b/common/src/main/java/com/yunbao/common/dialog/AbsDialogFragment.java new file mode 100644 index 000000000..b6480a53a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/AbsDialogFragment.java @@ -0,0 +1,63 @@ +package com.yunbao.common.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; + +import com.yunbao.common.utils.ClickUtil; + +import java.lang.ref.WeakReference; + +/** + * Created by cxf on 2018/9/29. + */ + +public abstract class AbsDialogFragment extends DialogFragment { + + protected Context mContext; + protected View mRootView; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + mContext = new WeakReference<>(getActivity()).get(); + mRootView = LayoutInflater.from(mContext).inflate(getLayoutId(), null); + final Dialog dialog = new Dialog(mContext, getDialogStyle()); + dialog.setContentView(mRootView); + dialog.setCancelable(canCancel()); + dialog.setCanceledOnTouchOutside(canCancel()); + setWindowAttributes(dialog.getWindow()); + return dialog; + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + } + + protected abstract int getLayoutId(); + + protected abstract int getDialogStyle(); + + protected abstract boolean canCancel(); + + protected abstract void setWindowAttributes(Window window); + + protected View findViewById(int id) { + if (mRootView != null) { + return mRootView.findViewById(id); + } + return null; + } + + protected boolean canClick() { + return ClickUtil.canClick(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/dialog/ChatFaceDialog.java b/common/src/main/java/com/yunbao/common/dialog/ChatFaceDialog.java new file mode 100644 index 000000000..283d95309 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/ChatFaceDialog.java @@ -0,0 +1,63 @@ +package com.yunbao.common.dialog; + +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.PopupWindow; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/11/7. + * 聊天表情弹窗 + */ + +public class ChatFaceDialog extends PopupWindow { + + private View mParent; + private View mContentView; + private ActionListener mActionListener; + + public ChatFaceDialog(View parent, View contentView, boolean needAnim, ActionListener actionListener) { + mParent = parent; + mActionListener = actionListener; + ViewParent viewParent = contentView.getParent(); + if (viewParent != null) { + ((ViewGroup) viewParent).removeView(contentView); + } + mContentView = contentView; + setContentView(contentView); + setWidth(ViewGroup.LayoutParams.MATCH_PARENT); + setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + setOutsideTouchable(false); + if (needAnim) { + setAnimationStyle(R.style.bottomToTopAnim2); + } + setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss() { + ViewParent viewParent = mContentView.getParent(); + if (viewParent != null) { + ((ViewGroup) viewParent).removeView(mContentView); + } + mContentView = null; + if (mActionListener != null) { + mActionListener.onFaceDialogDismiss(); + } + mActionListener = null; + } + }); + } + + + public void show() { + showAtLocation(mParent, Gravity.BOTTOM, 0, 0); + } + + + public interface ActionListener { + void onFaceDialogDismiss(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/dialog/ImageFolderView.java b/common/src/main/java/com/yunbao/common/dialog/ImageFolderView.java new file mode 100644 index 000000000..9291ca4aa --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/ImageFolderView.java @@ -0,0 +1,169 @@ +package com.yunbao.common.dialog; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.FrameLayout; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.ImageFolderAdapter; +import com.yunbao.common.adapter.OnItemClickListener; +import com.yunbao.common.bean.ImageFolderEntity; + +import java.util.List; + +/** + * Created by Chen Haoxuan on 2022/4/30. + *Description: + */ +public class ImageFolderView extends FrameLayout implements OnItemClickListener { + private View mShadowView; +// private String mShadowViewColor = "#CCCCCC"; + private RecyclerView mImageFolderRv; + private List mImageFolders; + private ImageFolderViewListener mListener; + private int mImageFolderHeight; + private boolean mShow; + + public ImageFolderView(Context context) { + this(context, null); + } + + public ImageFolderView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public ImageFolderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mShadowView = new View(context); + mShadowView.setBackgroundColor(getResources().getColor(R.color.gray_cccccc)); + mImageFolderRv = (RecyclerView) inflate(context, R.layout.image_folder_layout, null); + //设置LayoutParams + FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT); + layoutParams.gravity = Gravity.BOTTOM; + mImageFolderRv.setLayoutParams(layoutParams); + //设置布局管理器setLayoutManager + mImageFolderRv.setLayoutManager(new LinearLayoutManager(context)); + addView(mShadowView); + addView(mImageFolderRv); + //开始不显示阴影 + mShadowView.setAlpha(0f); + mShadowView.setVisibility(GONE); + + } + + public void setImageFolders(List imageFolders) { + mImageFolders = imageFolders; + } + + public void setAdapter(ImageFolderAdapter adapter) { + if (adapter == null) { + throw new NullPointerException("adapter not null!"); + } + mImageFolderRv.setAdapter(adapter); + adapter.setItemClickListener(this); + } + + public void setListener(ImageFolderViewListener listener) { + this.mListener = listener; + } + + /** + * 显示 + */ + public void show() { + if (mShow) { + return; + } + if (mListener != null) { + mListener.onShow(); + } + mShow = true; + mShadowView.setVisibility(VISIBLE); + ObjectAnimator translationYAnimator = ObjectAnimator.ofFloat(mImageFolderRv, "translationY", mImageFolderHeight, 0); + translationYAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); + ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mShadowView, "alpha", 0f, 1f); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(translationYAnimator, alphaAnimator); + animatorSet.setDuration(388); + animatorSet.start(); + + } + + /** + * 隐藏 + */ + public void hide() { + if (!mShow) { + return; + } + if (mListener != null) { + mListener.onDismiss(); + } + ObjectAnimator translationYAnimator = ObjectAnimator.ofFloat(mImageFolderRv, + "translationY", 0, mImageFolderHeight); + translationYAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); + ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mShadowView, "alpha", 1f, 0f); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(translationYAnimator, alphaAnimator); + animatorSet.setDuration(388); + animatorSet.start(); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + mShow = false; + mShadowView.setVisibility(GONE); + } + }); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + //获取高度 + int height = MeasureSpec.getSize(heightMeasureSpec); + mImageFolderHeight = (int) (height * 0.9f); + ViewGroup.LayoutParams params = mImageFolderRv.getLayoutParams(); + params.height = mImageFolderHeight; + mImageFolderRv.setLayoutParams(params); + measureChild(mImageFolderRv, widthMeasureSpec, heightMeasureSpec); + //开始的时候,移下去 + mImageFolderRv.setTranslationY(mImageFolderHeight); + } + + public boolean isShowing() { + return mShow; + } + + + @Override + public void onItemClick(int position) { + if (mListener != null) { + mListener.onSelectFolder(this, mImageFolders.get(position)); + hide(); + } + } + + public interface ImageFolderViewListener { + void onSelectFolder(ImageFolderView imageFolderView, ImageFolderEntity imageFolder); + + void onDismiss(); + + void onShow(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/dialog/LiveChargeDialogFragment.java b/common/src/main/java/com/yunbao/common/dialog/LiveChargeDialogFragment.java new file mode 100644 index 000000000..1122ae9e2 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/LiveChargeDialogFragment.java @@ -0,0 +1,222 @@ +package com.yunbao.common.dialog; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.activity.AbsActivity; +import com.yunbao.common.bean.CoinBean; +import com.yunbao.common.bean.CoinPayBean; +import com.yunbao.common.custom.ItemDecoration; +import com.yunbao.common.http.CommonHttpConsts; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.pay.PayPresenter; +import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.R; +import com.yunbao.common.adapter.ChatChargeCoinAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2019/4/22. + */ + +public class LiveChargeDialogFragment extends AbsDialogFragment implements View.OnClickListener, OnItemClickListener, LiveChargePayDialogFragment.ActionListener { + + private RecyclerView mRecyclerView; + private TextView mBtnCharge; + private List mPayList; + private ChatChargeCoinAdapter mAdapter; + private CoinBean mCheckedCoinBean; + private PayPresenter mPayPresenter; + + @Override + protected int getLayoutId() { + return R.layout.dialog_chat_charge; + } + + @Override + protected int getDialogStyle() { + return R.style.dialog2; + } + + @Override + protected boolean canCancel() { + return true; + } + + @Override + protected void setWindowAttributes(Window window) { + window.setWindowAnimations(R.style.bottomToTopAnim); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.height = DpUtil.dp2px(500); + params.gravity = Gravity.BOTTOM; + window.setAttributes(params); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 3, GridLayoutManager.VERTICAL, false)); + ItemDecoration decoration = new ItemDecoration(mContext, 0x00000000, 5, 20); + decoration.setOnlySetItemOffsetsButNoDraw(true); + mRecyclerView.addItemDecoration(decoration); + mBtnCharge = (TextView) findViewById(R.id.btn_charge); + mBtnCharge.setOnClickListener(this); + findViewById(R.id.btn_close).setOnClickListener(this); + loadData(); + } + + private void loadData() { + CommonHttpUtil.getBalance(new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + if (mRecyclerView == null) { + return; + } + JSONObject obj = JSON.parseObject(info[0]); + List paylist = JSON.parseArray(obj.getString("paylist"), CoinPayBean.class); + mPayList = paylist; + List list = JSON.parseArray(obj.getString("rules"), CoinBean.class); + if (list != null && list.size() > 0) { + CoinBean bean = list.get(0); + bean.setChecked(true); + mAdapter = new ChatChargeCoinAdapter(mContext, list); + mAdapter.setOnItemClickListener(LiveChargeDialogFragment.this); + mRecyclerView.setAdapter(mAdapter); + showMoney(bean); + } + if (mPayPresenter != null) { + String coin = obj.getString("coin"); + mPayPresenter.setBalanceValue(Long.parseLong(coin)); + mPayPresenter.setAliPartner(obj.getString("aliapp_partner")); + mPayPresenter.setAliSellerId(obj.getString("aliapp_seller_id")); + mPayPresenter.setAliPrivateKey(obj.getString("aliapp_key_android")); + mPayPresenter.setWxAppID(obj.getString("wx_appid")); + } + } + } + }); + } + + + @Override + public void onClick(View v) { + int i = v.getId(); + if (i == R.id.btn_close) { + dismiss(); + } else if (i == R.id.btn_charge) { + charge(); + } + } + + @Override + public void onItemClick(CoinBean bean, int position) { + showMoney(bean); + } + + private void showMoney(CoinBean bean) { + mCheckedCoinBean = bean; + if (mCheckedCoinBean != null && mBtnCharge != null) { +// mBtnCharge.setText(String.format(WordUtil.getString(R.string.chat_charge_tip), mCheckedCoinBean.getMoney())); + mBtnCharge.setText(String.format(WordUtil.getString(R.string.chat_charge_tip))); + } + } + + private void charge() { + if (mCheckedCoinBean == null || mPayList == null || mPayList.size() == 0) { + return; + } + // L.e("《==》支付按钮2--->" ); + LiveChargePayDialogFragment fragment = new LiveChargePayDialogFragment(); + fragment.setCoinString(StringUtil.contact(mCheckedCoinBean.getCoin(), CommonAppConfig.getInstance().getCoinName())); + fragment.setMoneyString(mCheckedCoinBean.getMoney()); + String moneyS=mCheckedCoinBean.getMoney(); + float money=0; + if (moneyS!=null && !moneyS.isEmpty()){ + try { + money=Float.parseFloat(moneyS); + }catch (Exception e){e.printStackTrace();} + } + List payListTmp = new ArrayList<>(); + for (int i=0;i 2800){ + for (int i=0;i" ); + mActionListener.onChargeClick(mAdapter.getCheckedPayBean()); + dismiss(); + } + } + + + public void setPayList(List payList) { + for (int i = 0, size = payList.size(); i < size; i++) { + payList.get(i).setChecked(i == 0); + } + mPayList = payList; + } + + public void setCoinString(String coinString) { + mCoinString = coinString; + } + + public void setMoneyString(String moneyString) { + mMoneyString = moneyString; + } + + @Override + public void onDestroy() { + mActionListener = null; + super.onDestroy(); + } + + public interface ActionListener { + void onChargeClick(CoinPayBean coinPayBean); + } + + + public void setActionListener(ActionListener actionListener) { + mActionListener = actionListener; + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/NotCancelableDialog.java b/common/src/main/java/com/yunbao/common/dialog/NotCancelableDialog.java new file mode 100644 index 000000000..3c0af5dd8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/NotCancelableDialog.java @@ -0,0 +1,97 @@ +package com.yunbao.common.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.fragment.app.DialogFragment; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.yunbao.common.R; +import com.yunbao.common.utils.DpUtil; + +/** + * Created by cxf on 2019/5/29. + */ + +public class NotCancelableDialog extends AbsDialogFragment implements View.OnClickListener { + + private ActionListener mActionListener; + private String mContent; + + @Override + protected int getLayoutId() { + return R.layout.dialog_simple_tip; + } + + @Override + protected int getDialogStyle() { + return R.style.dialog2; + } + + @Override + protected boolean canCancel() { + return false; + } + + @Override + protected void setWindowAttributes(Window window) { + WindowManager.LayoutParams params = window.getAttributes(); + params.width = DpUtil.dp2px(280); + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.CENTER; + window.setAttributes(params); + } + + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + return true; + } + return false; + } + }); + } + TextView textView = mRootView.findViewById(R.id.content); + textView.setText(mContent); + mRootView.findViewById(R.id.btn_confirm).setOnClickListener(this); + + } + + @Override + public void onClick(View v) { + if (mActionListener != null) { + mActionListener.onConfirmClick(mContext, this); + } + } + + public void setActionListener(ActionListener actionListener) { + mActionListener = actionListener; + } + + public void setContent(String content) { + mContent = content; + } + + public interface ActionListener { + void onConfirmClick(Context context, DialogFragment dialog); + } + + @Override + public void onDestroy() { + mActionListener = null; + super.onDestroy(); + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/SquareFrameLayout.java b/common/src/main/java/com/yunbao/common/dialog/SquareFrameLayout.java new file mode 100644 index 000000000..af1c1971a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/SquareFrameLayout.java @@ -0,0 +1,29 @@ +package com.yunbao.common.dialog; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * Created by Chen Haoxuan on 2022/4/30 + * Description:正方形的FrameLayout容器 + */ +public class SquareFrameLayout extends FrameLayout { + public SquareFrameLayout(Context context) { + this(context,null); + } + + public SquareFrameLayout(Context context, AttributeSet attrs) { + this(context, attrs,0); + } + + public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec); + + } +} diff --git a/common/src/main/java/com/yunbao/common/event/CoinChangeEvent.java b/common/src/main/java/com/yunbao/common/event/CoinChangeEvent.java new file mode 100644 index 000000000..9deb4296f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/CoinChangeEvent.java @@ -0,0 +1,52 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2018/11/1. + * 钻石数量变化的事件 + */ + +public class CoinChangeEvent { + + private String coin; + private String goldCoinNum; + private boolean chargeSuccess; + + public CoinChangeEvent(String coin) { + this.coin = coin; + } + + public CoinChangeEvent(String coin, boolean chargeSuccess) { + this.coin = coin; + this.chargeSuccess = chargeSuccess; + } + public CoinChangeEvent(String coin,String goldCoinNum, boolean chargeSuccess) { + this.coin = coin; + this.goldCoinNum = goldCoinNum; + this.chargeSuccess = chargeSuccess; + } + + public String getCoin() { + return coin; + } + + public void setCoin(String coin) { + this.coin = coin; + } + + public String getGoldCoinNum() { + return goldCoinNum; + } + + public void setGoldCoinNum(String goldCoinNum) { + this.goldCoinNum = goldCoinNum; + } + + public boolean isChargeSuccess() { + return chargeSuccess; + } + + public void setChargeSuccess(boolean chargeSuccess) { + this.chargeSuccess = chargeSuccess; + } + +} diff --git a/common/src/main/java/com/yunbao/common/event/FollowEvent.java b/common/src/main/java/com/yunbao/common/event/FollowEvent.java new file mode 100644 index 000000000..a5b5d97f1 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/FollowEvent.java @@ -0,0 +1,32 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2018/9/28. + */ + +public class FollowEvent { + + private String mToUid; + private int mIsAttention; + + public FollowEvent(String toUid, int isAttention) { + mToUid = toUid; + mIsAttention = isAttention; + } + + public String getToUid() { + return mToUid; + } + + public void setToUid(String toUid) { + mToUid = toUid; + } + + public int getIsAttention() { + return mIsAttention; + } + + public void setIsAttention(int isAttention) { + mIsAttention = isAttention; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LocationEvent.java b/common/src/main/java/com/yunbao/common/event/LocationEvent.java new file mode 100644 index 000000000..4d5d8be21 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LocationEvent.java @@ -0,0 +1,23 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2018/7/18. + */ + +public class LocationEvent { + private double lng; + private double lat; + + public LocationEvent(double lng, double lat) { + this.lng = lng; + this.lat = lat; + } + + public double getLng() { + return lng; + } + + public double getLat() { + return lat; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LoginInvalidEvent.java b/common/src/main/java/com/yunbao/common/event/LoginInvalidEvent.java new file mode 100644 index 000000000..bd415cc3a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LoginInvalidEvent.java @@ -0,0 +1,9 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2018/10/31. + * 登录失效事件 + */ + +public class LoginInvalidEvent { +} diff --git a/common/src/main/java/com/yunbao/common/event/UpdateFieldEvent.java b/common/src/main/java/com/yunbao/common/event/UpdateFieldEvent.java new file mode 100644 index 000000000..6b17e88d6 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/UpdateFieldEvent.java @@ -0,0 +1,8 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2019/6/22. + */ + +public class UpdateFieldEvent { +} diff --git a/common/src/main/java/com/yunbao/common/event/UpdateTablePoint.java b/common/src/main/java/com/yunbao/common/event/UpdateTablePoint.java new file mode 100644 index 000000000..d624bc789 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/UpdateTablePoint.java @@ -0,0 +1,21 @@ +package com.yunbao.common.event; + +/** + * Created by cxf on 2019/6/22. + */ + +public class UpdateTablePoint { + int point; + + public UpdateTablePoint(int point) { + this.point = point; + } + + public int getPoint() { + return point; + } + + public void setPoint(int point) { + this.point = point; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/UpdateTablePointMe.java b/common/src/main/java/com/yunbao/common/event/UpdateTablePointMe.java new file mode 100644 index 000000000..2c23c642e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/UpdateTablePointMe.java @@ -0,0 +1,21 @@ +package com.yunbao.common.event; + +/** + * Created by Chen Haoxuan on 2022/6/17. + */ + +public class UpdateTablePointMe { + int point; + + public UpdateTablePointMe(int point) { + this.point = point; + } + + public int getPoint() { + return point; + } + + public void setPoint(int point) { + this.point = point; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/getDeviceId.java b/common/src/main/java/com/yunbao/common/event/getDeviceId.java new file mode 100644 index 000000000..97ecf1b7e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/getDeviceId.java @@ -0,0 +1,244 @@ +package com.yunbao.common.event; + +import android.content.Context; +import android.os.Environment; +import android.telephony.TelephonyManager; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.security.MessageDigest; +import java.util.UUID; + + /** + * @author liangjun on 2018/1/21. + */ + public class getDeviceId { + + //保存文件的路径 + private static final String CACHE_IMAGE_DIR = "aray/cache/devices"; + //保存的文件 采用隐藏文件的形式进行保存 + private static final String DEVICES_FILE_NAME = ".DEVICES"; + + /** + * 获取设备唯一标识符 + * + * @param context + * @return + */ + public static String getDeviceId(Context context) { + //读取保存的在sd卡中的唯一标识符 + String deviceId = readDeviceID(context); + //用于生成最终的唯一标识符 + StringBuffer s = new StringBuffer(); + //判断是否已经生成过, + if (deviceId != null && !"".equals(deviceId)) { + return deviceId; + } + try { + //获取IMES(也就是常说的DeviceId) + deviceId = getIMIEStatus(context); + s.append(deviceId); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + //获取设备的MACAddress地址 去掉中间相隔的冒号 + deviceId = getLocalMac(context).replace(":", ""); + s.append(deviceId); + } catch (Exception e) { + e.printStackTrace(); + } +// } + + //如果以上搜没有获取相应的则自己生成相应的UUID作为相应设备唯一标识符 + if (s == null || s.length() <= 0) { + UUID uuid = UUID.randomUUID(); + deviceId = uuid.toString().replace("-", ""); + s.append(deviceId); + } + //为了统一格式对设备的唯一标识进行md5加密 最终生成32位字符串 + String md5 = getMD5(s.toString(), false); + if (s.length() > 0) { + //持久化操作, 进行保存到SD卡中 + saveDeviceID(md5, context); + } + return md5; + } + + + /** + * 读取固定的文件中的内容,这里就是读取sd卡中保存的设备唯一标识符 + * + * @param context + * @return + */ + public static String readDeviceID(Context context) { + File file = getDevicesDir(context); + StringBuffer buffer = new StringBuffer(); + try { + FileInputStream fis = new FileInputStream(file); + InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); + Reader in = new BufferedReader(isr); + int i; + while ((i = in.read()) > -1) { + buffer.append((char) i); + } + in.close(); + return buffer.toString(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取设备的DeviceId(IMES) 这里需要相应的权限
+ * 需要 READ_PHONE_STATE 权限 + * + * @param context + * @return + */ + private static String getIMIEStatus(Context context) { + TelephonyManager tm = (TelephonyManager) context + .getSystemService(Context.TELEPHONY_SERVICE); + return tm.getDeviceId(); + } + + + /** + * 获取设备MAC 地址 由于 6.0 以后 WifiManager 得到的 MacAddress得到都是 相同的没有意义的内容 + * 所以采用以下方法获取Mac地址 + * @param context + * @return + */ + private static String getLocalMac(Context context) { +// WifiManager wifi = (WifiManager) context +// .getSystemService(Context.WIFI_SERVICE); +// WifiInfo info = wifi.getConnectionInfo(); +// return info.getMacAddress(); + + + String macAddress = null; + StringBuffer buf = new StringBuffer(); + NetworkInterface networkInterface = null; + try { + networkInterface = NetworkInterface.getByName("eth1"); + if (networkInterface == null) { + networkInterface = NetworkInterface.getByName("wlan0"); + } + if (networkInterface == null) { + return ""; + } + byte[] addr = networkInterface.getHardwareAddress(); + + + for (byte b : addr) { + buf.append(String.format("%02X:", b)); + } + if (buf.length() > 0) { + buf.deleteCharAt(buf.length() - 1); + } + macAddress = buf.toString(); + } catch (SocketException e) { + e.printStackTrace(); + return ""; + } + return macAddress; + + + } + + /** + * 保存 内容到 SD卡中, 这里保存的就是 设备唯一标识符 + * @param str + * @param context + */ + public static void saveDeviceID(String str, Context context) { + File file = getDevicesDir(context); + try { + FileOutputStream fos = new FileOutputStream(file); + Writer out = new OutputStreamWriter(fos, "UTF-8"); + out.write(str); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 对挺特定的 内容进行 md5 加密 + * @param message 加密明文 + * @param upperCase 加密以后的字符串是是大写还是小写 true 大写 false 小写 + * @return + */ + public static String getMD5(String message, boolean upperCase) { + String md5str = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + + byte[] input = message.getBytes(); + + byte[] buff = md.digest(input); + + md5str = bytesToHex(buff, upperCase); + + } catch (Exception e) { + e.printStackTrace(); + } + return md5str; + } + + + public static String bytesToHex(byte[] bytes, boolean upperCase) { + StringBuffer md5str = new StringBuffer(); + int digital; + for (int i = 0; i < bytes.length; i++) { + digital = bytes[i]; + + if (digital < 0) { + digital += 256; + } + if (digital < 16) { + md5str.append("0"); + } + md5str.append(Integer.toHexString(digital)); + } + if (upperCase) { + return md5str.toString().toUpperCase(); + } + return md5str.toString().toLowerCase(); + } + + /** + * 统一处理设备唯一标识 保存的文件的地址 + * @param context + * @return + */ + private static File getDevicesDir(Context context) { + File mCropFile = null; + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + File cropdir = new File(Environment.getExternalStorageDirectory(), CACHE_IMAGE_DIR); + if (!cropdir.exists()) { + cropdir.mkdirs(); + } + mCropFile = new File(cropdir, DEVICES_FILE_NAME); // 用当前时间给取得的图片命名 + } else { + File cropdir = new File(context.getFilesDir(), CACHE_IMAGE_DIR); + if (!cropdir.exists()) { + cropdir.mkdirs(); + } + mCropFile = new File(cropdir, DEVICES_FILE_NAME); + } + return mCropFile; + } + } diff --git a/common/src/main/java/com/yunbao/common/fragment/ProcessFragment.java b/common/src/main/java/com/yunbao/common/fragment/ProcessFragment.java new file mode 100644 index 000000000..328fbe9fb --- /dev/null +++ b/common/src/main/java/com/yunbao/common/fragment/ProcessFragment.java @@ -0,0 +1,138 @@ +package com.yunbao.common.fragment; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.R; +import com.yunbao.common.interfaces.ActivityResultCallback; +import com.yunbao.common.utils.ToastUtil; + +import cn.rongcloud.rtc.api.RCRTCEngine; + +/** + * Created by cxf on 2018/9/29. + * 处理 检查权限和 startActivityForResult 的回调的Fragment + */ + +public class ProcessFragment extends Fragment { + + private Context mContext; + private Runnable mPermissionCallback; + private ActivityResultCallback mActivityResultCallback; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mContext = getActivity(); + } + + + /** + * 检查是否具有多个权限 + * + * @param permissions + * @return true 有权限 false无权限 + */ + private boolean checkPermissions(String[] permissions) { + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (isAllGranted(permissions, grantResults)) { + if (mPermissionCallback != null) { + mPermissionCallback.run(); + } + } + mPermissionCallback = null; + } + + + /** + * 判断申请的权限有没有被允许 + */ + private boolean isAllGranted(String[] permissions, int[] grantResults) { + for (int i = 0; i < grantResults.length; i++) { + if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { + showTip(permissions[i]); + return false; + } + } + return true; + } + + /** + * 拒绝某项权限时候的提示 + */ + private void showTip(String permission) { + switch (permission) { + case Manifest.permission.READ_EXTERNAL_STORAGE: + case Manifest.permission.WRITE_EXTERNAL_STORAGE: + ToastUtil.show(R.string.permission_storage_refused); + break; + case Manifest.permission.CAMERA: + ToastUtil.show(R.string.permission_camera_refused); + break; + case Manifest.permission.RECORD_AUDIO: + ToastUtil.show(R.string.permission_record_audio_refused); + break; + case Manifest.permission.ACCESS_COARSE_LOCATION: + ToastUtil.show(R.string.permission_location_refused); + CommonAppConfig.getInstance().clearLocationInfo(); + break; + case Manifest.permission.READ_PHONE_STATE: + ToastUtil.show(R.string.permission_read_phone_state_refused); + break; + } + } + + public void requestPermissions(String[] permissions, Runnable runnable) { + if (runnable != null) { + if (checkPermissions(permissions)) { + runnable.run(); + } else { + mPermissionCallback = runnable; + requestPermissions(permissions, 0); + } + } + } + + public void startActivityForResult(Intent intent, ActivityResultCallback callback) { + mActivityResultCallback = callback; + super.startActivityForResult(intent, 0); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + try { + RCRTCEngine.getInstance().getDefaultVideoStream().startCamera(null); + }catch (Exception e){ + + } + if (mActivityResultCallback != null) { + if (resultCode == -1) {//RESULT_OK + mActivityResultCallback.onSuccess(data); + } else { + mActivityResultCallback.onFailure(); + } + } + } + + public void release(){ + mPermissionCallback=null; + mActivityResultCallback=null; + } +} diff --git a/common/src/main/java/com/yunbao/common/glide/ImgLoader.java b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java new file mode 100644 index 000000000..f5aac986a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/glide/ImgLoader.java @@ -0,0 +1,157 @@ +package com.yunbao.common.glide; + +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; +import com.yunbao.common.R; + +import java.io.File; + +import jp.wasabeef.glide.transformations.BlurTransformation; + +/** + * Created by cxf on 2017/8/9. + */ + +public class ImgLoader { + private static final boolean SKIP_MEMORY_CACHE = false; + + private static BlurTransformation sBlurTransformation; + + static { + sBlurTransformation= new BlurTransformation(25); + } + + + public static void display(Context context, String url, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(url).skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + public static void display2(Context context, String url, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(url).placeholder(imageView.getDrawable()).dontAnimate().skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + public static void displayWithError(Context context, String url, ImageView imageView, int errorRes) { + if (!contextIsExist(context)){ + return; + } + if (imageView == null){ + return; + } + Glide.with(context).asDrawable().load(url).error(errorRes).skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + public static void displayAvatar(Context context, String url, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + displayWithError(context, url, imageView, R.mipmap.icon_avatar_placeholder); + + } + + public static void display(Context context, File file, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(file).skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + public static void display(Context context, int res, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(res).skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + /** + * 显示视频封面缩略图 + */ + public static void displayVideoThumb(Context context, String videoPath, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(Uri.fromFile(new File(videoPath))).skipMemoryCache(SKIP_MEMORY_CACHE).into(imageView); + } + + public static void displayDrawable(Context context, String url, final DrawableCallback callback) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(url).skipMemoryCache(SKIP_MEMORY_CACHE).into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + if (callback != null) { + callback.onLoadSuccess(resource); + } + } + + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + if (callback != null) { + callback.onLoadFailed(); + } + } + + }); + } + + public static void clear(Context context, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).clear(imageView); + } + + + + /** + * 显示模糊的毛玻璃图片 + */ + public static void displayBlur(Context context, String url, ImageView imageView) { + if (!contextIsExist(context)){ + return; + } + Glide.with(context).asDrawable().load(url) + .skipMemoryCache(SKIP_MEMORY_CACHE) + .apply(RequestOptions.bitmapTransform(sBlurTransformation)) + .into(imageView); + } + + private static boolean contextIsExist(Context context) { + if (context == null ) { + return false; + } + if (context instanceof Activity) { + Activity activity = (Activity) context; + if (activity.isDestroyed() || activity.isFinishing()) { + return false; + } + } + return true; + } + + + public interface DrawableCallback { + void onLoadSuccess(Drawable drawable); + + void onLoadFailed(); + } + + +} diff --git a/common/src/main/java/com/yunbao/common/http/CommonHttpConsts.java b/common/src/main/java/com/yunbao/common/http/CommonHttpConsts.java new file mode 100644 index 000000000..396a8f719 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/CommonHttpConsts.java @@ -0,0 +1,28 @@ +package com.yunbao.common.http; + +/** + * Created by cxf on 2018/9/17. + */ + +public class CommonHttpConsts { + public static final String LANGUAGE = "language"; + public static final String GET_MAP_INFO = "getMapInfoByTxSdk"; + public static final String GET_MAP_SEARCH = "searchInfoByTxSdk"; + public static final String GET_LOCAITON = "getLocationByTxSdk"; + public static final String GET_CONFIG = "getConfig"; + public static final String GET_QQ_LOGIN_UNION_ID = "getQQLoginUnionID"; + public static final String SET_ATTENTION = "setAttention"; + public static final String GET_ALI_ORDER = "getAliOrder"; + public static final String GET_WX_ORDER = "getWxOrder"; + public static final String GET_CASHIER_ORDER = "getCashierOrder"; + public static final String GET_WX_H5ORDER = "getWxH5Order"; + + public static final String DOWNLOAD_GIF = "downloadGif"; + public static final String GET_BALANCE = "getBalance"; + public static final String CHECK_TOKEN_INVALID = "checkTokenInvalid"; + public static final String NOTIFY_GOOGLE = "Charge.google_pay"; + public static final String COMMUNITY_SETREPORT = "Community.setReport"; + + public static final String GET_USER_HOME = "getUserHome"; + public static final String GET_USER_BASEINFO = "getUserBaseinfo"; +} diff --git a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java new file mode 100644 index 000000000..d04fb5b5c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java @@ -0,0 +1,437 @@ +package com.yunbao.common.http; + +import android.content.Context; +import android.os.Build; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.StringCallback; +import com.lzy.okgo.model.Response; +import com.lzy.okgo.request.PostRequest; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.R; +import com.yunbao.common.activity.ErrorActivity; +import com.yunbao.common.bean.ConfigBean; +import com.yunbao.common.event.FollowEvent; +import com.yunbao.common.interfaces.CommonCallback; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.MD5Util; +import com.yunbao.common.utils.SpUtil; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.io.File; +import java.util.Locale; + +/** + * Created by cxf on 2018/9/17. + */ + +public class CommonHttpUtil { + + + /** + * 初始化 + */ + public static void init() { + HttpClient.getInstance().init(); + } + + /** + * 取消网络请求 + */ + public static void cancel(String tag) { + HttpClient.getInstance().cancel(tag); + } + + /** + * 使用腾讯定位sdk获取 位置信息 + * + * @param lng 经度 + * @param lat 纬度 + * @param poi 是否要查询POI + */ + public static void getAddressInfoByTxLocaitonSdk(final double lng, final double lat, final int poi, int pageIndex, String tag, final HttpCallback commonCallback) { + String txMapAppKey = CommonAppConfig.getInstance().getTxMapAppKey(); + String s = "/ws/geocoder/v1/?get_poi=" + poi + "&key=" + txMapAppKey + "&location=" + lat + "," + lng + + "&poi_options=address_format=short;radius=1000;page_size=20;page_index=" + pageIndex + ";policy=5" + CommonAppConfig.getInstance().getTxMapAppSecret(); + String sign = MD5Util.getMD5(s); + OkGo.get("https://apis.map.qq.com/ws/geocoder/v1/") + .params("location", lat + "," + lng) + .params("get_poi", poi) + .params("poi_options", "address_format=short;radius=1000;page_size=20;page_index=" + pageIndex + ";policy=5") + .params("key", txMapAppKey) + .params("sig", sign) + .tag(tag) + .execute(new StringCallback() { + @Override + public void onSuccess(Response response) { + JSONObject obj = JSON.parseObject(response.body()); + if (obj != null && commonCallback != null) { + commonCallback.onSuccess(obj.getIntValue("status"), "", new String[]{obj.getString("result")}); + } + } + + + @Override + public void onError(Response response) { + super.onError(response); + if (commonCallback != null) { + commonCallback.onError(); + } + } + + @Override + public void onFinish() { + super.onFinish(); + if (commonCallback != null) { + commonCallback.onFinish(); + } + } + }); + } + + /** + * 使用腾讯地图API进行搜索 + * + * @param lng 经度 + * @param lat 纬度 + */ + public static void searchAddressInfoByTxLocaitonSdk(final double lng, final double lat, String keyword, int pageIndex, final HttpCallback commonCallback) { + + String txMapAppKey = CommonAppConfig.getInstance().getTxMapAppKey(); + String s = "/ws/place/v1/search?boundary=nearby(" + lat + "," + lng + ",1000)&key=" + txMapAppKey + "&keyword=" + keyword + "&orderby=_distance&page_index=" + pageIndex + + "&page_size=20" + CommonAppConfig.getInstance().getTxMapAppSecret(); + String sign = MD5Util.getMD5(s); + OkGo.get("https://apis.map.qq.com/ws/place/v1/search") + .params("keyword", keyword) + .params("boundary", "nearby(" + lat + "," + lng + ",1000)&orderby=_distance&page_size=20&page_index=" + pageIndex) + .params("key", txMapAppKey) + .params("sig", sign) + .tag(CommonHttpConsts.GET_MAP_SEARCH) + .execute(new StringCallback() { + @Override + public void onSuccess(Response response) { + JSONObject obj = JSON.parseObject(response.body()); + if (obj != null && commonCallback != null) { + commonCallback.onSuccess(obj.getIntValue("status"), "", new String[]{obj.getString("data")}); + } + } + + @Override + public void onError(Response response) { + super.onError(response); + if (commonCallback != null) { + commonCallback.onError(); + } + } + + @Override + public void onFinish() { + super.onFinish(); + if (commonCallback != null) { + commonCallback.onFinish(); + } + } + }); + } + + + /** + * 获取config + */ + public static void getConfig(Context context, final CommonCallback commonCallback) { + String lang = ""; + if (context != null) { + Locale locale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + locale = context.getResources().getConfiguration().getLocales().get(0); + } else { + locale = context.getResources().getConfiguration().locale; + } + if (locale.getLanguage().equals("en")) { + lang = "english"; + } else { + lang = "chinese"; + } + } + Log.i("来了", lang); + //或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题 + HttpClient.getInstance().get("Home.getConfig", CommonHttpConsts.GET_CONFIG) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("langue", lang) + .execute(new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + try { + JSONObject obj = JSON.parseObject(info[0]); + ConfigBean bean = JSON.toJavaObject(obj, ConfigBean.class); + CommonAppConfig.getInstance().setConfig(bean); + CommonAppConfig.getInstance().setLevel(obj.getString("level")); + CommonAppConfig.getInstance().setAnchorLevel(obj.getString("levelanchor")); + CommonAppConfig.getInstance().alert_time = obj.getInteger("alert_time"); + CommonAppConfig.getInstance().alert_end_time = obj.getInteger("alert_end_time"); + //解析粉丝徽章 + CommonAppConfig.getInstance().setAnchorFansMedal(obj.getString("levelfans")); + SpUtil.getInstance().setStringValue(SpUtil.CONFIG, info[0]); + if (commonCallback != null) { + commonCallback.callback(bean); + } + } catch (Exception e) { + String error = "info[0]:" + info[0] + "\n\n\n" + "Exception:" + e.getClass() + "---message--->" + e.getMessage(); + ErrorActivity.forward("GetConfig接口返回数据异常", error); + } + } + } + + @Override + public void onError() { + if (commonCallback != null) { + commonCallback.callback(null); + } + } + }); + } + + + /** + * QQ登录的时候 获取unionID 与PC端互通的时候用 + */ + public static void getQQLoginUnionID(String accessToken, final CommonCallback commonCallback) { + OkGo.get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken + "&unionid=1") + .tag(CommonHttpConsts.GET_QQ_LOGIN_UNION_ID) + .execute(new StringCallback() { + @Override + public void onSuccess(Response response) { + if (commonCallback != null) { + String data = response.body(); + data = data.substring(data.indexOf("{"), data.lastIndexOf("}") + 1); + L.e("getQQLoginUnionID------>" + data); + JSONObject obj = JSON.parseObject(data); + commonCallback.callback(obj.getString("unionid")); + } + } + }); + } + + + /** + * 关注别人 或 取消对别人的关注的接口 + */ + public static void setAttention(String touid, CommonCallback callback) { + setAttention(CommonHttpConsts.SET_ATTENTION, touid, callback); + } + +// /** +// * 关注别人 或 取消对别人的关注的接口 +// */ +// public static void setAttention(String tag, final String touid, final CommonCallback callback) { +// if (touid.equals(CommonAppConfig.getInstance().getUid())) { +// ToastUtil.show(WordUtil.getString(R.string.cannot_follow_self)); +// return; +// } +// HttpClient.getInstance().get("User.setAttent", tag) +// .params("uid", CommonAppConfig.getInstance().getUid()) +// .params("token", CommonAppConfig.getInstance().getToken()) +// .params("touid", touid) +// .execute(new HttpCallback() { +// @Override +// public void onSuccess(int code, String msg, String[] info) { +// if (code == 0 && info.length > 0) { +// int isAttention = JSON.parseObject(info[0]).getIntValue("isattent");//1是 关注 0是未关注 +// EventBus.getDefault().post(new FollowEvent(touid, isAttention)); +// if (callback != null) { +// callback.callback(isAttention); +// } +// } +// } +// }); +// } + + /** + * 关注别人 或 取消对别人的关注的接口 + */ + public static void setAttention(String tag, final String touid, final CommonCallback callback) { + if (touid.equals(CommonAppConfig.getInstance().getUid())) { + ToastUtil.show(WordUtil.getString(R.string.cannot_follow_self)); + return; + } + HttpClient.getInstance().get("User.setAttents", tag) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("touid", touid) + .execute(new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + int isAttention = JSON.parseObject(info[0]).getIntValue("isattent");//1是 关注 0是未关注 + EventBus.getDefault().post(new FollowEvent(touid, isAttention)); + if (callback != null) { + callback.callback(isAttention); + } + } + } + }); + } + + /** + * 充值页面,我的钻石 + */ + public static void getBalance(HttpCallback callback) { + String isGoogle; + if (CommonAppConfig.IS_GOOGLE_PLAY) { + isGoogle = "1"; + } else { + isGoogle = "-1"; + } + HttpClient.getInstance().get("User.getBalance", CommonHttpConsts.GET_BALANCE) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("type", 0) + .params("isGooglePay", isGoogle) + .execute(callback); + } + + /** + * 用支付宝充值 的时候在服务端生成订单号 + * + * @param callback + */ + public static void getAliOrder(String parmas, HttpCallback callback) { + HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_ALI_ORDER) + .execute(callback); + } + + /** + * 用微信支付充值 的时候在服务端生成订单号 + * + * @param callback + */ + public static void getWxOrder(String parmas, HttpCallback callback) { + HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_ORDER) + .execute(callback); + } + + + /** + * 海外支付 + * + * @param callback + */ + + public static void getCashierOrder(String parmas, HttpCallback callback) { + HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_CASHIER_ORDER) + .execute(callback); + } + + + /** + * H5支付 + * + * @param callback + */ + + + public static void getWxH5Order(String parmas, HttpCallback callback) { + HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_H5ORDER) + .execute(callback); + } + + + /** + * 检查token是否失效 + */ + public static void checkTokenInvalid() { + HttpClient.getInstance().get("User.ifToken", CommonHttpConsts.CHECK_TOKEN_INVALID) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .execute(NO_CALLBACK); + } + + + /** + * 谷歌支付成功后,通知自己服务器 + */ + public static void notifyMeGoogle(String purchaseToken, String productId, String orderno, HttpCallback callback) { + HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE) + .params("purchaseToken", purchaseToken) + .params("productId", productId) + .params("orderno", orderno) + .execute(callback); + } + + public static void notifyGoogle(String purchaseToken, String orderNo, String tradeNo, String allData, HttpCallback callback) { + HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE) + .params("purchaseToken", purchaseToken) + .params("orderno", orderNo) + .params("trade_no", tradeNo) + .params("allData", allData) + .execute(callback); + } + + //不做任何操作的HttpCallback + public static final HttpCallback NO_CALLBACK = new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + + } + }; + + /** + * 社区举报用户 + 图片 + */ + public static void setCommunityReport(String community_type, String comment_id, String dynamic_id, String content, File file1, File file2, File file3, String report_type, HttpCallback callback) { + PostRequest request; + if ("2".equals(community_type)) { + request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT) + .isMultipart(true) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("dynamic_id", dynamic_id) + .params("report_type", report_type) + .params("content", content) + .params("community_type", community_type) + .params("comment_id", comment_id); + } else { + request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT) + .isMultipart(true) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("dynamic_id", dynamic_id) + .params("report_type", report_type) + .params("content", content) + .params("community_type", community_type); + } + if (file1 != null) { + request.params("file1", file1); + } + if (file2 != null) { + request.params("file2", file2); + } + if (file3 != null) { + request.params("file3", file3); + } + request.execute(callback); + } + + /** + * 用户个人主页信息 + */ + public static void getUserBaseinfo(String touid, HttpCallback callback) { + HttpClient.getInstance().get("User.getUserBaseinfo", CommonHttpConsts.GET_USER_BASEINFO) + .params("uid", CommonAppConfig.getInstance().getUid()) + .params("touid", touid) + .execute(callback); + } + +} + + + + diff --git a/common/src/main/java/com/yunbao/common/http/Data.java b/common/src/main/java/com/yunbao/common/http/Data.java new file mode 100644 index 000000000..0d73a7d38 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/Data.java @@ -0,0 +1,35 @@ +package com.yunbao.common.http; + +/** + * Created by cxf on 2017/8/5. + */ + +public class Data { + private int code; + private String msg; + private String[] info; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String[] getInfo() { + return info; + } + + public void setInfo(String[] info) { + this.info = info; + } +} diff --git a/common/src/main/java/com/yunbao/common/http/HttpCallback.java b/common/src/main/java/com/yunbao/common/http/HttpCallback.java new file mode 100644 index 000000000..d71b3da49 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/HttpCallback.java @@ -0,0 +1,109 @@ +package com.yunbao.common.http; + +import android.app.Dialog; + +import com.alibaba.fastjson.JSON; +import com.lzy.okgo.callback.AbsCallback; +import com.lzy.okgo.model.Response; +import com.lzy.okgo.request.base.Request; +import com.yunbao.common.R; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.ToastUtil; + +import java.net.ConnectException; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.net.UnknownHostException; +import java.net.UnknownServiceException; + +/** + * Created by cxf on 2017/8/7. + */ + +public abstract class HttpCallback extends AbsCallback { + + private Dialog mLoadingDialog; + + @Override + public JsonBean convertResponse(okhttp3.Response response) throws Throwable { + return JSON.parseObject(response.body().string(), JsonBean.class); + } + + @Override + public void onSuccess(Response response) { + JsonBean bean = response.body(); + if (bean != null) { + if (200 == bean.getRet()) { + Data data = bean.getData(); + if (data != null) { + if (700 == data.getCode()) { + //token过期,重新登录 + RouteUtil.forwardLoginInvalid(data.getMsg()); + } else { + onSuccess(data.getCode(), data.getMsg(), data.getInfo()); + } + } else { + L.e("服务器返回值异常--->ret: " + bean.getRet() + " msg: " + bean.getMsg()); + } + } else { + L.e("服务器返回值异常--->ret: " + bean.getRet() + " msg: " + bean.getMsg()); + } + + } else { + L.e("服务器返回值异常--->bean = null"); + } + } + + @Override + public void onError(Response response) { + Throwable t = response.getException(); + L.e("网络请求错误---->" + t.getClass() + " : " + t.getMessage()); + if (t instanceof SocketTimeoutException || t instanceof ConnectException || t instanceof UnknownHostException || t instanceof UnknownServiceException || t instanceof SocketException) { + ToastUtil.show(R.string.load_failure); + } + if (showLoadingDialog() && mLoadingDialog != null) { + mLoadingDialog.dismiss(); + } + onError(); + } + + public void onError() { + + } + + + public abstract void onSuccess(int code, String msg, String[] info); + + @Override + public void onStart(Request request) { + onStart(); + } + + public void onStart() { + if (showLoadingDialog()) { + if (mLoadingDialog == null) { + mLoadingDialog = createLoadingDialog(); + } + try { + mLoadingDialog.show(); + }catch (Exception e){e.printStackTrace();} + } + } + + @Override + public void onFinish() { + if (showLoadingDialog() && mLoadingDialog != null) { + mLoadingDialog.dismiss(); + } + } + + public Dialog createLoadingDialog() { + return null; + } + + public boolean showLoadingDialog() { + return false; + } + +} diff --git a/common/src/main/java/com/yunbao/common/http/HttpClient.java b/common/src/main/java/com/yunbao/common/http/HttpClient.java new file mode 100644 index 000000000..fecc3895a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/HttpClient.java @@ -0,0 +1,98 @@ +package com.yunbao.common.http; + +import com.lzy.okgo.OkGo; +import com.lzy.okgo.cache.CacheMode; +import com.lzy.okgo.cookie.CookieJarImpl; +import com.lzy.okgo.cookie.store.MemoryCookieStore; +import com.lzy.okgo.request.GetRequest; +import com.lzy.okgo.request.PostRequest; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.CommonAppContext; + +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; + +/** + * Created by cxf on 2018/9/17. + */ + +public class HttpClient { + + private static final int TIMEOUT = 10000; + private static HttpClient sInstance; + private OkHttpClient mOkHttpClient; + private String mLanguage;//语言 + private String mUrl; + + private HttpClient() { + mUrl = CommonAppConfig.HOST + "/api/public/?service="; + } + + public static HttpClient getInstance() { + if (sInstance == null) { + synchronized (HttpClient.class) { + if (sInstance == null) { + sInstance = new HttpClient(); + } + } + } + return sInstance; + } + + public void init() { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS); + builder.readTimeout(TIMEOUT, TimeUnit.MILLISECONDS); + builder.writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS); + builder.cookieJar(new CookieJarImpl(new MemoryCookieStore())); + builder.retryOnConnectionFailure(true); +// Dispatcher dispatcher = new Dispatcher(); +// dispatcher.setMaxRequests(20000); +// dispatcher.setMaxRequestsPerHost(10000); +// builder.dispatcher(dispatcher); + + //输出HTTP请求 响应信息 + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("http"); + loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY); + builder.addInterceptor(loggingInterceptor); + mOkHttpClient = builder.build(); + + OkGo.getInstance().init(CommonAppContext.sInstance) + .setOkHttpClient(mOkHttpClient) + .setCacheMode(CacheMode.NO_CACHE) + .setRetryCount(1); + + } + + public GetRequest get(String serviceName, String tag) { + return OkGo.get(mUrl + serviceName) + .headers("Connection","keep-alive") + .tag(tag) + .params(CommonHttpConsts.LANGUAGE, mLanguage); + } + + + public GetRequest get(String url,String serviceName, String tag) { + return OkGo.get(url + serviceName) + .headers("Connection","keep-alive") + .tag(tag) + .params(CommonHttpConsts.LANGUAGE, mLanguage); + } + + public PostRequest post(String serviceName, String tag) { + return OkGo.post(mUrl + serviceName) + .headers("Connection","keep-alive") + .tag(tag) + .params(CommonHttpConsts.LANGUAGE, mLanguage); + } + + public void cancel(String tag) { + OkGo.cancelTag(mOkHttpClient, tag); + } + + public void setLanguage(String language) { + mLanguage = language; + } + +} diff --git a/common/src/main/java/com/yunbao/common/http/HttpLoggingInterceptor.java b/common/src/main/java/com/yunbao/common/http/HttpLoggingInterceptor.java new file mode 100644 index 000000000..7df49adbe --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/HttpLoggingInterceptor.java @@ -0,0 +1,205 @@ +package com.yunbao.common.http; + +import com.lzy.okgo.utils.IOUtils; +import com.lzy.okgo.utils.OkLogger; +import com.yunbao.common.utils.L; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +import okhttp3.Connection; +import okhttp3.Headers; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okhttp3.internal.http.HttpHeaders; +import okio.Buffer; + +public class HttpLoggingInterceptor implements Interceptor { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private volatile Level printLevel = Level.NONE; + private java.util.logging.Level colorLevel; + private Logger logger; + + public enum Level { + NONE, //不打印log + BASIC, //只打印 请求首行 和 响应首行 + HEADERS, //打印请求和响应的所有 Header + BODY //所有数据全部打印 + } + + public HttpLoggingInterceptor(String tag) { + logger = Logger.getLogger(tag); + } + + public void setPrintLevel(Level level) { + if (printLevel == null) + throw new NullPointerException("printLevel == null. Use Level.NONE instead."); + printLevel = level; + } + + public void setColorLevel(java.util.logging.Level level) { + colorLevel = level; + } + + private void log(String message) { + //logger.log(colorLevel, message); + L.e(message); + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + if (printLevel == Level.NONE) { + return chain.proceed(request); + } + + //请求日志拦截 + logForRequest(request, chain.connection()); + + //执行请求,计算请求时间 + long startNs = System.nanoTime(); + Response response; + try { + response = chain.proceed(request); + } catch (Exception e) { + log("<-- HTTP FAILED: " + e); + throw e; + } + long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); + + //响应日志拦截 + return logForResponse(response, tookMs); + } + + private void logForRequest(Request request, Connection connection) throws IOException { + boolean logBody = (printLevel == Level.BODY); + boolean logHeaders = (printLevel == Level.BODY || printLevel == Level.HEADERS); + RequestBody requestBody = request.body(); + boolean hasRequestBody = requestBody != null; + Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1; + + try { + String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol; + log(requestStartMessage); + + if (logHeaders) { + if (hasRequestBody) { + // Request body headers are only present when installed as a network interceptor. Force + // them to be included (when available) so there values are known. + if (requestBody.contentType() != null) { + log("\tContent-Type: " + requestBody.contentType()); + } + if (requestBody.contentLength() != -1) { + log("\tContent-Length: " + requestBody.contentLength()); + } + } + Headers headers = request.headers(); + for (int i = 0, count = headers.size(); i < count; i++) { + String name = headers.name(i); + // Skip headers from the request body as they are explicitly logged above. + if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) { + log("\t" + name + ": " + headers.value(i)); + } + } + + log(" "); + if (logBody && hasRequestBody) { + if (isPlaintext(requestBody.contentType())) { + bodyToString(request); + } else { + log("\tbody: maybe [binary body], omitted!"); + } + } + } + } catch (Exception e) { + OkLogger.printStackTrace(e); + } finally { + log("--> END " + request.method()); + } + } + + private Response logForResponse(Response response, long tookMs) { + Response.Builder builder = response.newBuilder(); + Response clone = builder.build(); + ResponseBody responseBody = clone.body(); + boolean logBody = (printLevel == Level.BODY); + boolean logHeaders = (printLevel == Level.BODY || printLevel == Level.HEADERS); + + try { + log("<-- " + clone.code() + ' ' + clone.message() + ' ' + clone.request().url() + " (" + tookMs + "ms)"); + if (logHeaders) { + Headers headers = clone.headers(); + for (int i = 0, count = headers.size(); i < count; i++) { + log("\t" + headers.name(i) + ": " + headers.value(i)); + } + log(" "); + if (logBody && HttpHeaders.hasBody(clone)) { + if (responseBody == null) return response; + + if (isPlaintext(responseBody.contentType())) { + byte[] bytes = IOUtils.toByteArray(responseBody.byteStream()); + MediaType contentType = responseBody.contentType(); + String body = new String(bytes, getCharset(contentType)); + log("\tbody:" + body); + responseBody = ResponseBody.create(responseBody.contentType(), bytes); + return response.newBuilder().body(responseBody).build(); + } else { + log("\tbody: maybe [binary body], omitted!"); + } + } + } + } catch (Exception e) { + OkLogger.printStackTrace(e); + } finally { + log("<-- END HTTP"); + } + return response; + } + + private static Charset getCharset(MediaType contentType) { + Charset charset = contentType != null ? contentType.charset(UTF8) : UTF8; + if (charset == null) charset = UTF8; + return charset; + } + + /** + * Returns true if the body in question probably contains human readable text. Uses a small sample + * of code points to detect unicode control characters commonly used in binary file signatures. + */ + private static boolean isPlaintext(MediaType mediaType) { + if (mediaType == null) return false; + if (mediaType.type() != null && mediaType.type().equals("text")) { + return true; + } + String subtype = mediaType.subtype(); + if (subtype != null) { + subtype = subtype.toLowerCase(); + if (subtype.contains("x-www-form-urlencoded") || subtype.contains("json") || subtype.contains("xml") || subtype.contains("html")) // + return true; + } + return false; + } + + private void bodyToString(Request request) { + try { + Request copy = request.newBuilder().build(); + RequestBody body = copy.body(); + if (body == null) return; + Buffer buffer = new Buffer(); + body.writeTo(buffer); + Charset charset = getCharset(body.contentType()); + log("\tbody:" + buffer.readString(charset)); + } catch (Exception e) { + OkLogger.printStackTrace(e); + } + } +} diff --git a/common/src/main/java/com/yunbao/common/http/JsonBean.java b/common/src/main/java/com/yunbao/common/http/JsonBean.java new file mode 100644 index 000000000..392fe4e60 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/http/JsonBean.java @@ -0,0 +1,35 @@ +package com.yunbao.common.http; + +/** + * Created by cxf on 2017/8/5. + */ + +public class JsonBean { + private int ret; + private String msg; + private Data data; + + public int getRet() { + return ret; + } + + public void setRet(int ret) { + this.ret = ret; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Data getData() { + return data; + } + + public void setData(Data data) { + this.data = data; + } +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/ActivityResultCallback.java b/common/src/main/java/com/yunbao/common/interfaces/ActivityResultCallback.java new file mode 100644 index 000000000..3f1fdfab0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/ActivityResultCallback.java @@ -0,0 +1,15 @@ +package com.yunbao.common.interfaces; + +import android.content.Intent; + +/** + * Created by cxf on 2018/9/29. + */ + +public abstract class ActivityResultCallback { + public abstract void onSuccess(Intent intent); + + public void onFailure() { + + } +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/CommonCallback.java b/common/src/main/java/com/yunbao/common/interfaces/CommonCallback.java new file mode 100644 index 000000000..aab03ea6c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/CommonCallback.java @@ -0,0 +1,9 @@ +package com.yunbao.common.interfaces; + +/** + * Created by cxf on 2017/8/11. + */ + +public abstract class CommonCallback { + public abstract void callback(T bean); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/ImageResultCallback.java b/common/src/main/java/com/yunbao/common/interfaces/ImageResultCallback.java new file mode 100644 index 000000000..ed482704e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/ImageResultCallback.java @@ -0,0 +1,16 @@ +package com.yunbao.common.interfaces; + +import java.io.File; + +/** + * Created by cxf on 2018/9/29. + */ + +public interface ImageResultCallback { + //跳转相机前执行 + void beforeCamera(); + + void onSuccess(File file); + + void onFailure(); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/KeyBoardHeightChangeListener.java b/common/src/main/java/com/yunbao/common/interfaces/KeyBoardHeightChangeListener.java new file mode 100644 index 000000000..5ba381ee5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/KeyBoardHeightChangeListener.java @@ -0,0 +1,11 @@ +package com.yunbao.common.interfaces; + +/** + * Created by cxf on 2018/11/8. + */ + +public interface KeyBoardHeightChangeListener { + void onKeyBoardHeightChanged(int visibleHeight, int keyboardHeight); + + boolean isSoftInputShowed(); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/LifeCycleListener.java b/common/src/main/java/com/yunbao/common/interfaces/LifeCycleListener.java new file mode 100644 index 000000000..ab227b53c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/LifeCycleListener.java @@ -0,0 +1,22 @@ +package com.yunbao.common.interfaces; + +/** + * Created by cxf on 2018/9/26. + */ + +public interface LifeCycleListener { + + void onCreate(); + + void onStart(); + + void onReStart(); + + void onResume(); + + void onPause(); + + void onStop(); + + void onDestroy(); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/OnFaceClickListener.java b/common/src/main/java/com/yunbao/common/interfaces/OnFaceClickListener.java new file mode 100644 index 000000000..899cca5e5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/OnFaceClickListener.java @@ -0,0 +1,12 @@ +package com.yunbao.common.interfaces; + +/** + * Created by cxf on 2018/7/11. + */ + +public interface OnFaceClickListener { + + void onFaceClick(String str, int faceImageRes); + + void onFaceDeleteClick(); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/OnItemClickListener.java b/common/src/main/java/com/yunbao/common/interfaces/OnItemClickListener.java new file mode 100644 index 000000000..a67e2763b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/OnItemClickListener.java @@ -0,0 +1,10 @@ +package com.yunbao.common.interfaces; + +/** + * Created by cxf on 2017/8/9. + * RecyclerView的Adapter点击事件 + */ + +public interface OnItemClickListener { + void onItemClick(T bean, int position); +} diff --git a/common/src/main/java/com/yunbao/common/interfaces/OnItemLongClickListener.java b/common/src/main/java/com/yunbao/common/interfaces/OnItemLongClickListener.java new file mode 100644 index 000000000..43d7e3cce --- /dev/null +++ b/common/src/main/java/com/yunbao/common/interfaces/OnItemLongClickListener.java @@ -0,0 +1,12 @@ +package com.yunbao.common.interfaces; + +import android.view.View; + +/** + * Created by Chen haoxuan on 2022/1/12. + * RecyclerView的Adapter长按点击事件 + */ + +public interface OnItemLongClickListener { + void onItemLongClick(T bean, int position, View v); +} diff --git a/common/src/main/java/com/yunbao/common/pay/PayCallback.java b/common/src/main/java/com/yunbao/common/pay/PayCallback.java new file mode 100644 index 000000000..c34033235 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/PayCallback.java @@ -0,0 +1,11 @@ +package com.yunbao.common.pay; + +/** + * Created by cxf on 2018/10/23. + */ + +public interface PayCallback { + void onSuccess(); + + void onFailed(); +} diff --git a/common/src/main/java/com/yunbao/common/pay/PayPresenter.java b/common/src/main/java/com/yunbao/common/pay/PayPresenter.java new file mode 100644 index 000000000..add349e06 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/PayPresenter.java @@ -0,0 +1,515 @@ +package com.yunbao.common.pay; + +import android.app.Activity; + +import androidx.annotation.NonNull; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.SkuDetails; +import com.tjbaobao.gitee.billing.GoogleBillingUtil; +import com.tjbaobao.gitee.billing.OnGoogleBillingListener; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.Constants; +import com.yunbao.common.R; +import com.yunbao.common.activity.WebViewActivity; +import com.yunbao.common.bean.UserBean; +import com.yunbao.common.event.CoinChangeEvent; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.pay.ali.AliPayBuilder; +import com.yunbao.common.pay.wx.WxPayBuilder; +import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.ToastUtil; +import org.greenrobot.eventbus.EventBus; +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.Locale; + +/** + * Created by cxf on 2019/4/22. + */ + +public class PayPresenter { + + private String mAliPartner;// 支付宝商户ID + private String mAliSellerId; // 支付宝商户收款账号 + private String mAliPrivateKey; // 支付宝商户私钥,pkcs8格式 + private String mAliCallbackUrl;//支付宝充值回调地址 + private String mWxAppID;//微信AppID + private String mServiceNameAli; + private String mServiceNameWx; + private long mBalanceValue; + private Activity mActivity; + private PayCallback mPayCallback; + + + private GoogleBillingUtil googleBillingUtil; + private String TAG="PayPresenter"; + private String [] arrPro = {"1"}; + private String mOrderid; + + public PayPresenter(Activity activity) { + mActivity = new WeakReference<>(activity).get(); + } + + public void setPayCallback(PayCallback callback){ + mPayCallback=callback; + } + + public long getBalanceValue() { + return mBalanceValue; + } + + public void setBalanceValue(long balanceValue) { + mBalanceValue = balanceValue; + } + + public void setAliPartner(String aliPartner) { + mAliPartner = aliPartner; + } + + public void setAliSellerId(String aliSellerId) { + mAliSellerId = aliSellerId; + } + + public void setAliPrivateKey(String aliPrivateKey) { + mAliPrivateKey = aliPrivateKey; + } + + public void setWxAppID(String wxAppID) { + mWxAppID = wxAppID; + } + + + public void setServiceNameAli(String serviceNameAli) { + mServiceNameAli = serviceNameAli; + } + + public void setServiceNameWx(String serviceNameWx) { + mServiceNameWx = serviceNameWx; + } + + public void setAliCallbackUrl(String aliCallbackUrl) { + mAliCallbackUrl = aliCallbackUrl; + } + public void pay(String payType, String money, String goodsName, String orderParams) { + if (TextUtils.isEmpty(payType)) { + ToastUtil.show(R.string.wallet_tip_5); + return; + } + //L.e("《==》支付按钮4--->" +payType); + switch (payType) { + case Constants.PAY_TYPE_ALI://支付宝支付 + aliPay(money, goodsName, orderParams); + break; + + case Constants.PAY_TYPE_WX://微信支付 + wxPay(orderParams); + break; + case Constants.PAY_TYPE_HW://海外支付 + hwPay(orderParams); + break; + case Constants.PAY_TYPE_HFB://微信支付 + hfbPay(orderParams); + break; + case Constants.PAY_TYPE_YUNQU://YUNQU支付 + yunquPay(orderParams); + break; + case Constants.PAY_TYPE_PAYSSION://payssion支付 + payssionPay(orderParams); + break; + case Constants.PAY_TYPE_PAYPAL://paypal支付 + paypalPay(orderParams); + break; + case Constants.PAY_TYPE_GOOGLE://google支付 + googlePay(orderParams); + break; + default: + otherPay(orderParams,payType); + break; + } + } + + //谷歌支付 + private void googlePay(String orderParams) { + mOrderid="1"; + String pid="2"; + if (pid != null && !pid.isEmpty()){ + arrPro[0]=pid; + initGooglePay(); + } + + String newParm= StringUtil.contact("Charge.getGoogleOrder",orderParams,"&type=android", + "&appname=",mActivity.getString(R.string.app_name), + "&desc="+mActivity.getPackageName()+"&source=android" + ); + CommonHttpUtil.getWxH5Order(newParm, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0){ + try { + ToastUtil.show("开始支付,请稍后"); + org.json.JSONObject jsonObject=new org.json.JSONObject(info[0]); + mOrderid=jsonObject.getString("orderid"); + String pid=jsonObject.getString("pid"); + if (pid != null && !pid.isEmpty()){ + arrPro[0]=pid; + initGooglePay(); + } + }catch (Exception e){ e.printStackTrace(); } + }else { + ToastUtil.show("无法支付,请联系客服"); + } + + } + }); + } + + private void initGooglePay() { + GoogleBillingUtil.isDebug(true); + GoogleBillingUtil.setSkus(arrPro,null); + GoogleBillingUtil.setIsAutoAcknowledgePurchase(true);//设置自动确认购买 + googleBillingUtil = GoogleBillingUtil.getInstance() + .addOnGoogleBillingListener(mActivity, mOnMyGoogleBillingListener) + .build(mActivity); + } + + private void paypalPay(String orderParams) { + String url1="/index.php?m=App&a=paypal" +orderParams +"&source=android"; + String url2= CommonAppConfig.HOST+url1; + open(url2); + } + + private void payssionPay(String orderParams) { + String url1="/index.php?m=App&a=pay" +orderParams +"&source=android"; + String url2= CommonAppConfig.HOST+url1; + open(url2); + + } + + private void yunquPay(String orderParams) { + String newParm= StringUtil.contact("Charge.getYunquOrder",orderParams,"&type=android", + "&appname=",mActivity.getString(R.string.app_name), + "&desc="+mActivity.getPackageName()+"&source=android" + ); + //L.e("《==》支付URL--->" +newParm); + CommonHttpUtil.getWxH5Order(newParm, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0){ + try { + org.json.JSONObject jsonObject=new org.json.JSONObject(info[0]); + String payment_url=jsonObject.getString("payment_url"); + open(payment_url); + // L.e("《==》支付URL--->" +payment_url); + + }catch (Exception e){ + e.printStackTrace(); + } + } + } + }); + } + + private void hfbPay(String orderParams) { + String newParm= StringUtil.contact("Charge.getWxH5Order",orderParams,"&type=android", + "&appname=",mActivity.getString(R.string.app_name), + "&desc="+mActivity.getPackageName() + ); + + CommonHttpUtil.getCashierOrder(newParm, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0){ + try { + org.json.JSONObject jsonObject=new org.json.JSONObject(info[0]); + String redirectUrl=jsonObject.getString("redirectUrl"); + open(redirectUrl); + }catch (Exception e){ + e.printStackTrace(); + } + } + } + }); + } + + public void open(String url){ + //支付时内部跳转 false要添加 + WebViewActivity.forward(mActivity,url,false); + } + + + private void hwPay(String orderParams) { + String newParm= StringUtil.contact("Charge.getCashierOrder",orderParams,"&type=android", + "&appname=",mActivity.getString(R.string.app_name), + "&desc="+mActivity.getPackageName()+"&source=android" + ); + //L.e("《==》支付URL--->" +newParm); + CommonHttpUtil.getWxH5Order(newParm, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0){ + try { + org.json.JSONObject jsonObject=new org.json.JSONObject(info[0]); + String payment_url=jsonObject.getString("payment_url"); + open(payment_url); + // L.e("《==》支付URL--->" +payment_url); + + }catch (Exception e){ + e.printStackTrace(); + } + } + } + }); + } + private void otherPay(String orderParams,String payType) { + String newParm= StringUtil.contact("Charge.getOtherPayOrder",orderParams,"&type=android", + "&appname=",mActivity.getString(R.string.app_name), + "&desc="+mActivity.getPackageName()+"&source=android&payType="+payType + ); + CommonHttpUtil.getWxH5Order(newParm, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0){ + try { + org.json.JSONObject jsonObject=new org.json.JSONObject(info[0]); + String payment_url=jsonObject.getString("payment_url"); + open(payment_url); + // L.e("《==》支付URL--->" +payment_url); + + }catch (Exception e){ + e.printStackTrace(); + } + } + } + }); + } + /** + * 支付宝支付 + */ + private void aliPay(String money, String goodsName, String orderParams) { + if (mActivity == null || TextUtils.isEmpty(mServiceNameAli)|| TextUtils.isEmpty(mAliCallbackUrl)) { + return; + } + if (!CommonAppConfig.isAppExist(Constants.PACKAGE_NAME_ALI)) { + ToastUtil.show(R.string.coin_ali_not_install); + return; + } + if (TextUtils.isEmpty(mAliPartner) || TextUtils.isEmpty(mAliSellerId) || TextUtils.isEmpty(mAliPrivateKey)) { + ToastUtil.show(Constants.PAY_ALI_NOT_ENABLE); + return; + } + AliPayBuilder builder = new AliPayBuilder(mActivity, mAliPartner, mAliSellerId, mAliPrivateKey); + builder.setMoney(money); + builder.setGoodsName(goodsName); + builder.setCallbackUrl(mAliCallbackUrl); + builder.setOrderParams(StringUtil.contact(mServiceNameAli, orderParams)); + builder.setPayCallback(mPayCallback); + builder.pay(); + } + + + /** + * 微信支付 + */ + private void wxPay(String orderParams) { + if (mActivity == null || TextUtils.isEmpty(mServiceNameWx)) { + return; + } + if (!CommonAppConfig.isAppExist(Constants.PACKAGE_NAME_WX)) { + ToastUtil.show(R.string.coin_wx_not_install); + return; + } + if (TextUtils.isEmpty(mWxAppID)) { + ToastUtil.show(Constants.PAY_WX_NOT_ENABLE); + return; + } + WxPayBuilder builder = new WxPayBuilder(mActivity, mWxAppID); + builder.setOrderParams(StringUtil.contact(mServiceNameWx, orderParams)); + builder.setPayCallback(mPayCallback); + builder.pay(); + } + + + /** + * 检查支付结果 + */ + + public void checkPayResult() { + CommonHttpUtil.getBalance(new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + JSONObject obj = JSON.parseObject(info[0]); + String coin = obj.getString("coin"); + long balanceValue = Long.parseLong(coin); + String goldCoin = obj.getString("gold"); + long goldValue = Long.parseLong(goldCoin); + if (balanceValue > mBalanceValue) { + mBalanceValue = balanceValue; + ToastUtil.show(R.string.coin_charge_success); + UserBean u = CommonAppConfig.getInstance().getUserBean(); + if (u != null) { + u.setCoin(coin); + } + EventBus.getDefault().post(new CoinChangeEvent(coin,goldCoin, true)); + } + } + } + }); + } + + + private OnGoogleBillingListener mOnMyGoogleBillingListener=new OnGoogleBillingListener(){ + @Override + public void onSetupSuccess(boolean isSelf) { + super.onSetupSuccess(isSelf); + Log.d(TAG,"内购服务初始化完成"); + checkSubs(); + } + + @Override + public void onQuerySuccess(@NonNull String skuType, @NonNull List list, boolean isSelf) { +// if(!isSelf) return; +// StringBuffer tempBuffer =new StringBuffer(); +// tempBuffer.append("查询商品信息成功,数量=" + list.size() + "\n"); +// Log.d(TAG,tempBuffer.toString()); +// if (list.size()<=0){ +// ToastUtil.show("商品金额过大,无法支付"); +// return; +// } +// for(int i=0;i(activity).get(); + mPartner = partner; + mSellerId = sellerId; + mPrivateKey = privateKey; + } + + public AliPayBuilder setMoney(String money) { + mMoney = money; + return this; + } + + public AliPayBuilder setGoodsName(String goodsName) { + mGoodsName = goodsName; + return this; + } + + public AliPayBuilder setOrderParams(String orderParams) { + mOrderParams = orderParams; + return this; + } + + + public AliPayBuilder setPayCallback(PayCallback callback) { + mPayHandler = new PayHandler(callback); + return this; + } + + public void setCallbackUrl(String callbackUrl) { + mCallbackUrl = callbackUrl; + } + + /** + * 从服务器端获取订单号,即下单 + */ + public void pay() { + if (TextUtils.isEmpty(mOrderParams) || TextUtils.isEmpty(mMoney) || TextUtils.isEmpty(mGoodsName)|| TextUtils.isEmpty(mCallbackUrl)) { + return; + } + CommonHttpUtil.getAliOrder(mOrderParams, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + JSONObject obj = JSON.parseObject(info[0]); + String orderInfo = createAliOrder(obj.getString("orderid"));//商品信息 + String sign = getOrderSign(orderInfo);//订单签名 + if (TextUtils.isEmpty(sign)) { + ToastUtil.show("商户私钥错误,订单签名失败"); + return; + } + sign = urlEncode(sign); + String signType = "sign_type=\"RSA\"";//签名类型 + mPayInfo = orderInfo + "&sign=\"" + sign + "\"&" + signType; + L.e("支付宝订单信息----->" + mPayInfo); + invokeAliPay(); + } + } + + @Override + public boolean showLoadingDialog() { + return true; + } + + @Override + public Dialog createLoadingDialog() { + return DialogUitl.loadingDialog(mActivity); + } + + + }); + } + + /** + * 根据订单号和商品信息生成支付宝格式的订单信息 + * + * @param orderId 服务器返回的订单号 + * @return + */ + private String createAliOrder(String orderId) { + // 合作者身份ID + String orderInfo = "partner=" + "\"" + mPartner + "\""; + + // 卖家支付宝账号 + orderInfo += "&seller_id=" + "\"" + mSellerId + "\""; + + // 商户网站唯一订单号 + orderInfo += "&out_trade_no=" + "\"" + orderId + "\""; + + // 商品名称 + orderInfo += "&subject=" + "\"" + mGoodsName + "\""; + + // 商品详情 + orderInfo += "&body=" + "\"" + mGoodsName + "\""; + + // 商品金额 + orderInfo += "&total_fee=" + "\"" + mMoney + "\""; + + // 服务器异步通知页面路径 //服务器异步通知页面路径 参数 notify_url,如果商户没设定,则不会进行该操作 + orderInfo += "¬ify_url=" + "\"" + mCallbackUrl + "\""; + + // 接口名称, 固定值 + orderInfo += "&service=\"mobile.securitypay.pay\""; + + // 支付类型, 固定值 + orderInfo += "&payment_type=\"1\""; + + // 参数编码, 固定值 + orderInfo += "&_input_charset=\"utf-8\""; + + // 设置未付款交易的超时时间 + // 默认30分钟,一旦超时,该笔交易就会自动被关闭。 + // 取值范围:1m〜15d。 + // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。 + // 该参数数值不接受小数点,如1.5h,可转换为90m。 + orderInfo += "&it_b_pay=\"30m\""; + + // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空 + orderInfo += "&return_url=\"m.alipay.com\""; + + // 调用银行卡支付,需配置此参数,参与签名, 固定值 + // orderInfo += "&paymethod=\"expressGateway\""; + + return orderInfo; + } + + /** + * 根据订单信息生成订单的签名 + * + * @param orderInfo 订单信息 + * @return + */ + private String getOrderSign(String orderInfo) { + return SignUtils.sign(orderInfo, mPrivateKey); + } + + /** + * 对订单签名进行urlencode转码 + * + * @param sign 签名 + * @return + */ + private String urlEncode(String sign) { + try { + sign = URLEncoder.encode(sign, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return sign; + } + + /** + * 调用支付宝sdk + */ + private void invokeAliPay() { + new Thread(new Runnable() { + @Override + public void run() { + PayTask alipay = new PayTask(mActivity); + //执行支付,这是一个耗时操作,最后返回支付的结果,用handler发送到主线程 + Map result = alipay.payV2(mPayInfo, true); + L.e("支付宝返回结果----->" + result); + if (mPayHandler != null) { + Message msg = Message.obtain(); + msg.obj = result; + mPayHandler.sendMessage(msg); + } + } + }).start(); + } + + + private static class PayHandler extends Handler { + + private PayCallback mPayCallback; + + public PayHandler(PayCallback payCallback) { + mPayCallback = new WeakReference<>(payCallback).get(); + } + + @Override + public void handleMessage(Message msg) { + if (mPayCallback != null) { + @SuppressWarnings("unchecked") + Map result = (Map) msg.obj; + if ("9000".equals(result.get("resultStatus"))) { + mPayCallback.onSuccess(); + } else { + mPayCallback.onFailed(); + } + } + mPayCallback = null; + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/pay/ali/Base64.java b/common/src/main/java/com/yunbao/common/pay/ali/Base64.java new file mode 100644 index 000000000..994ed9c15 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/ali/Base64.java @@ -0,0 +1,268 @@ +package com.yunbao.common.pay.ali; + +public final class Base64 { + + private static final int BASELENGTH = 128; + private static final int LOOKUPLENGTH = 64; + private static final int TWENTYFOURBITGROUP = 24; + private static final int EIGHTBIT = 8; + private static final int SIXTEENBIT = 16; + private static final int FOURBYTE = 4; + private static final int SIGN = -128; + private static char PAD = '='; + private static byte[] base64Alphabet = new byte[BASELENGTH]; + private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static { + for (int i = 0; i < BASELENGTH; ++i) { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + + } + + private static boolean isWhiteSpace(char octect) { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) { + return (octect == PAD); + } + + private static boolean isData(char octect) { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData + * Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) { + + if (binaryData == null) { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 + : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) + : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) + : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } else if (fewerThan24bits == SIXTEENBIT) { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) + : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) + : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded + * string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) { + + if (encoded == null) { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) { + + if (!isData((d1 = base64Data[dataIndex++])) + || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) + || !isData((d4 = base64Data[dataIndex++]))) { + return null; + }// if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) + || !isData((d2 = base64Data[dataIndex++]))) { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } else if (!isPad(d3) && isPad(d4)) { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } else { + return null; + } + } else { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data + * the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) { + if (data == null) { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) { + if (!isWhiteSpace(data[i])) { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/common/src/main/java/com/yunbao/common/pay/ali/SignUtils.java b/common/src/main/java/com/yunbao/common/pay/ali/SignUtils.java new file mode 100644 index 000000000..4b55f8e7d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/ali/SignUtils.java @@ -0,0 +1,42 @@ +package com.yunbao.common.pay.ali; + +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; + +/** + * 支付宝给订单加签名工具 + */ +public class SignUtils { + + private static final String ALGORITHM = "RSA"; + + private static final String SIGN_ALGORITHMS = "SHA1WithRSA"; + + private static final String DEFAULT_CHARSET = "UTF-8"; + + public static String sign(String content, String privateKey) { + try { + + PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( + Base64.decode(privateKey)); + KeyFactory keyf = KeyFactory.getInstance(ALGORITHM); + PrivateKey priKey = keyf.generatePrivate(priPKCS8); + + java.security.Signature signature = java.security.Signature + .getInstance(SIGN_ALGORITHMS); + + signature.initSign(priKey); + signature.update(content.getBytes(DEFAULT_CHARSET)); + + byte[] signed = signature.sign(); + + return Base64.encode(signed); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/common/src/main/java/com/yunbao/common/pay/wx/WxApiWrapper.java b/common/src/main/java/com/yunbao/common/pay/wx/WxApiWrapper.java new file mode 100644 index 000000000..ffe1eea5d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/wx/WxApiWrapper.java @@ -0,0 +1,52 @@ +package com.yunbao.common.pay.wx; + +import android.text.TextUtils; + +import com.yunbao.common.CommonAppContext; + +/** + * Created by cxf on 2018/10/23. + */ + +public class WxApiWrapper { + + private static WxApiWrapper sInstance; +// private IWXAPI mApi; + private String mAppID; + + private WxApiWrapper() { + + } + + public static WxApiWrapper getInstance() { + if (sInstance == null) { + synchronized (WxApiWrapper.class) { + if (sInstance == null) { + sInstance = new WxApiWrapper(); + } + } + } + return sInstance; + } + + public void setAppID(String appID) { + if (!TextUtils.isEmpty(appID)) { +// if (!appID.equals(mAppID) || mApi == null) { +// if (mApi != null) { +// mApi.unregisterApp(); +// } +// mAppID = appID; +// mApi = WXAPIFactory.createWXAPI(CommonAppContext.sInstance, appID); +// mApi.registerApp(appID); +// } + } + } + + public String getAppID() { + return mAppID; + } + +// public IWXAPI getWxApi() { +// return mApi; +// } +} diff --git a/common/src/main/java/com/yunbao/common/pay/wx/WxPayBuilder.java b/common/src/main/java/com/yunbao/common/pay/wx/WxPayBuilder.java new file mode 100644 index 000000000..a34349bc7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/pay/wx/WxPayBuilder.java @@ -0,0 +1,122 @@ +package com.yunbao.common.pay.wx; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.yunbao.common.Constants; +import com.yunbao.common.R; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.pay.PayCallback; +import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.ToastUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.lang.ref.WeakReference; + +/** + * Created by cxf on 2017/9/22. + */ + +public class WxPayBuilder { + + private Context mContext; + private String mAppId; + private PayCallback mPayCallback; + private String mOrderParams;//订单获取订单需要的参数 + + public WxPayBuilder(Context context, String appId) { + mContext = context; + mAppId = appId; + WxApiWrapper.getInstance().setAppID(appId); + EventBus.getDefault().register(this); + } + + public WxPayBuilder setOrderParams(String orderParams) { + mOrderParams = orderParams; + return this; + } + + public WxPayBuilder setPayCallback(PayCallback callback) { + mPayCallback = new WeakReference<>(callback).get(); + return this; + } + + public void pay() { + CommonHttpUtil.getWxOrder(mOrderParams, new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + JSONObject obj = JSON.parseObject(info[0]); + String partnerId = obj.getString("partnerid"); + String prepayId = obj.getString("prepayid"); + String packageValue = obj.getString("package"); + String nonceStr = obj.getString("noncestr"); + String timestamp = obj.getString("timestamp"); + String sign = obj.getString("sign"); + if (TextUtils.isEmpty(partnerId) || + TextUtils.isEmpty(prepayId) || + TextUtils.isEmpty(packageValue) || + TextUtils.isEmpty(nonceStr) || + TextUtils.isEmpty(timestamp) || + TextUtils.isEmpty(sign)) { + ToastUtil.show(Constants.PAY_WX_NOT_ENABLE); + return; + } +// PayReq req = new PayReq(); +// req.appId = mAppId; +// req.partnerId = partnerId; +// req.prepayId = prepayId; +// req.packageValue = packageValue; +// req.nonceStr = nonceStr; +// req.timeStamp = timestamp; +// req.sign = sign; +// IWXAPI wxApi = WxApiWrapper.getInstance().getWxApi(); +// if (wxApi == null) { +// ToastUtil.show(R.string.coin_charge_failed); +// return; +// } +// boolean result = wxApi.sendReq(req); +// if (!result) { +// ToastUtil.show(R.string.coin_charge_failed); +// } + } + } + + @Override + public boolean showLoadingDialog() { + return true; + } + + @Override + public Dialog createLoadingDialog() { + return DialogUitl.loadingDialog(mContext); + } + }); + } + + +// @Subscribe(threadMode = ThreadMode.MAIN) +// public void onPayResponse(BaseResp resp) { +// L.e("resp---微信支付回调---->" + resp.errCode); +// if (mPayCallback != null) { +// if (0 == resp.errCode) {//支付成功 +// mPayCallback.onSuccess(); +// } else {//支付失败 +// mPayCallback.onFailed(); +// } +// } +// mContext = null; +// mPayCallback = null; +// EventBus.getDefault().unregister(this); +// } + + +} diff --git a/common/src/main/java/com/yunbao/common/utils/AndroidBug5497Workaround.java b/common/src/main/java/com/yunbao/common/utils/AndroidBug5497Workaround.java new file mode 100644 index 000000000..cc3f2aec0 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/AndroidBug5497Workaround.java @@ -0,0 +1,55 @@ +package com.yunbao.common.utils; + +import android.app.Activity; +import android.graphics.Rect; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; + +public class AndroidBug5497Workaround { + + // For more information, see https://issuetracker.google.com/issues/36911528 + // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. + + public static void assistActivity (Activity activity) { + new AndroidBug5497Workaround(activity); + } + + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + + private AndroidBug5497Workaround(Activity activity) { + FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + possiblyResizeChildOfContent(); + } + }); + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != usableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard/4)) { + // keyboard probably just became visible + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } else { + // keyboard probably just became hidden + frameLayoutParams.height = usableHeightSansKeyboard; + } + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/BitmapUtil.java b/common/src/main/java/com/yunbao/common/utils/BitmapUtil.java new file mode 100644 index 000000000..9af6cd15f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/BitmapUtil.java @@ -0,0 +1,141 @@ +package com.yunbao.common.utils; + +import android.content.ContentValues; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.provider.MediaStore; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.CommonAppContext; + +import org.apache.commons.io.IOUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.ref.SoftReference; + +/** + * Created by cxf on 2018/6/22. + */ + +public class BitmapUtil { + + private static BitmapUtil sInstance; + private Resources mResources; + private BitmapFactory.Options mOptions; + + private BitmapUtil() { + mResources = CommonAppContext.sInstance.getResources(); + mOptions = new BitmapFactory.Options(); + mOptions.inPreferredConfig = Bitmap.Config.RGB_565; + mOptions.inDither = true; + mOptions.inSampleSize = 1; + } + + public static BitmapUtil getInstance() { + if (sInstance == null) { + synchronized (BitmapUtil.class) { + if (sInstance == null) { + sInstance = new BitmapUtil(); + } + } + } + return sInstance; + } + + + public Bitmap decodeBitmap(int imgRes) { + Bitmap bitmap = null; + try { + byte[] bytes = IOUtils.toByteArray(mResources.openRawResource(imgRes)); + bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, mOptions); + } catch (IOException e) { + e.printStackTrace(); + } + return new SoftReference<>(bitmap).get(); + } + + /** + * 把Bitmap保存成图片文件 + * + * @param bitmap + */ + public String saveBitmap(Bitmap bitmap) { + String path = null; + File dir = new File(CommonAppConfig.CAMERA_IMAGE_PATH); + if (!dir.exists()) { + dir.mkdirs(); + } + File imageFile = new File(dir, DateFormatUtil.getCurTimeString() + ".jpg"); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(imageFile); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); + fos.flush(); + path = imageFile.getAbsolutePath(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return path; + } + + + /** + * 把Bitmap保存成图片文件 + */ + public boolean saveBitmap(Bitmap bitmap, File imageFile) { + boolean success = false; + FileOutputStream fos = null; + try { + fos = new FileOutputStream(imageFile); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); + fos.flush(); + saveImageInfo(imageFile); + success = true; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return success; + } + + + /** + * 把视频保存到ContentProvider,在选择上传的时候能找到 + */ + private void saveImageInfo(File file) { + try { + String fileName = file.getName(); + long currentTimeMillis = System.currentTimeMillis(); + ContentValues values = new ContentValues(); + values.put(MediaStore.MediaColumns.TITLE, fileName); + values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName); + values.put(MediaStore.MediaColumns.DATE_MODIFIED, currentTimeMillis); + values.put(MediaStore.MediaColumns.DATE_ADDED, currentTimeMillis); + values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); + values.put(MediaStore.MediaColumns.SIZE, file.length()); + values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); + CommonAppContext.sInstance.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/CityUtil.java b/common/src/main/java/com/yunbao/common/utils/CityUtil.java new file mode 100644 index 000000000..e8cba8c27 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/CityUtil.java @@ -0,0 +1,99 @@ +package com.yunbao.common.utils; + +import android.os.Handler; +import android.text.TextUtils; + +import com.alibaba.fastjson.JSON; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.interfaces.CommonCallback; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; + +import cn.qqtheme.framework.entity.Province; + +/** + * Created by cxf on 2018/6/28. + */ + +public class CityUtil { + + private ArrayList mProvinceList; + private static CityUtil sInstance; + private Handler mHandler; + + private CityUtil() { + mProvinceList = new ArrayList<>(); + mHandler = new Handler(); + } + + public static CityUtil getInstance() { + if (sInstance == null) { + synchronized (CityUtil.class) { + if (sInstance == null) { + sInstance = new CityUtil(); + } + } + } + return sInstance; + } + + public void getCityListFromAssets(final CommonCallback> callback) { + new Thread(new Runnable() { + @Override + public void run() { + BufferedReader br = null; + try { + InputStream is = CommonAppContext.sInstance.getAssets().open("city.json"); + br = new BufferedReader(new InputStreamReader(is, "utf-8")); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + } + String result = sb.toString(); + if (!TextUtils.isEmpty(result)) { + if (mProvinceList == null) { + mProvinceList = new ArrayList<>(); + } + mProvinceList.addAll(JSON.parseArray(result, Province.class)); + mHandler.post(new Runnable() { + @Override + public void run() { + if (callback != null) { + callback.callback(mProvinceList); + } + } + }); + } + } catch (IOException e) { + e.printStackTrace(); + mHandler.post(new Runnable() { + @Override + public void run() { + if (callback != null) { + callback.callback(null); + } + } + }); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + }).start(); + } + + public ArrayList getCityList() { + return mProvinceList; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/ClickUtil.java b/common/src/main/java/com/yunbao/common/utils/ClickUtil.java new file mode 100644 index 000000000..fc0edac76 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ClickUtil.java @@ -0,0 +1,20 @@ +package com.yunbao.common.utils; + +/** + * Created by cxf on 2018/9/29. + */ + +public class ClickUtil { + + private static long sLastClickTime; + + public static boolean canClick() { + long curTime = System.currentTimeMillis(); + if (curTime - sLastClickTime < 500) { + return false; + } + sLastClickTime = curTime; + return true; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/CommonIconUtil.java b/common/src/main/java/com/yunbao/common/utils/CommonIconUtil.java new file mode 100644 index 000000000..391d7873b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/CommonIconUtil.java @@ -0,0 +1,15 @@ +package com.yunbao.common.utils; + +import com.yunbao.common.R; + +/** + * Created by cxf on 2018/10/11. + */ + +public class CommonIconUtil { + + public static int getSexIcon(int key) { + return key == 1 ? R.mipmap.icon_sex_male_1 : R.mipmap.icon_sex_female_1; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/DateFormatUtil.java b/common/src/main/java/com/yunbao/common/utils/DateFormatUtil.java new file mode 100644 index 000000000..006366acf --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/DateFormatUtil.java @@ -0,0 +1,34 @@ +package com.yunbao.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by cxf on 2018/7/19. + */ + +public class DateFormatUtil { + + private static SimpleDateFormat sFormat; + private static SimpleDateFormat sFormat2; + private static SimpleDateFormat sFormat3; + + static { + sFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + sFormat2 = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS"); + sFormat3 = new SimpleDateFormat("MM.dd-HH:mm:ss"); + } + + + public static String getCurTimeString() { + return sFormat.format(new Date()); + } + + public static String getVideoCurTimeString() { + return sFormat2.format(new Date()); + } + + public static String getCurTimeString2() { + return sFormat3.format(new Date()); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java new file mode 100644 index 000000000..d7e23fe33 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java @@ -0,0 +1,465 @@ +package com.yunbao.common.utils; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.SparseArray; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.yunbao.common.R; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; + +import cn.qqtheme.framework.entity.Province; +import cn.qqtheme.framework.picker.AddressPicker; + + +/** + * Created by cxf on 2017/8/8. + */ + +public class DialogUitl { + public static final int INPUT_TYPE_TEXT = 0; + public static final int INPUT_TYPE_NUMBER = 1; + public static final int INPUT_TYPE_NUMBER_PASSWORD = 2; + public static final int INPUT_TYPE_TEXT_PASSWORD = 3; + + //第三方登录的时候用显示的dialog + public static Dialog loginAuthDialog(Context context) { + Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_login_loading); + dialog.setCancelable(false); + dialog.setCanceledOnTouchOutside(false); + return dialog; + } + + /** + * 用于网络请求等耗时操作的LoadingDialog + */ + public static Dialog loadingDialog(Context context, String text) { + Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_loading); + dialog.setCancelable(false); + dialog.setCanceledOnTouchOutside(false); + if (!TextUtils.isEmpty(text)) { + TextView titleView = (TextView) dialog.findViewById(R.id.text); + if (titleView != null) { + titleView.setText(text); + } + } + return dialog; + } + + + public static Dialog loadingDialog(Context context) { + return loadingDialog(context, ""); + } + + public static void showSimpleTipDialog(Context context, String content) { + showSimpleTipDialog(context, null, content); + } + + public static void showSimpleTipDialog(Context context, String title, String content) { + final Dialog dialog = new Dialog(context, R.style.dialog2); + dialog.setContentView(R.layout.dialog_simple_tip); + dialog.setCancelable(true); + dialog.setCanceledOnTouchOutside(true); + if (!TextUtils.isEmpty(title)) { + TextView titleView = (TextView) dialog.findViewById(R.id.title); + titleView.setText(title); + } + if (!TextUtils.isEmpty(content)) { + TextView contentTextView = (TextView) dialog.findViewById(R.id.content); + contentTextView.setText(content); + } + dialog.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + dialog.show(); + } + + public static void showSimpleDialog(Context context, String content, SimpleCallback callback) { + showSimpleDialog(context, content, true, callback); + } + + public static void showSimpleDialog(Context context, String content, boolean cancelable, SimpleCallback callback) { + showSimpleDialog(context, null, content, cancelable, callback); + } + + public static void showSimpleDialog(Context context, String title, String content, boolean cancelable, SimpleCallback callback) { + new Builder(context) + .setTitle(title) + .setContent(content) + .setCancelable(cancelable) + .setClickCallback(callback) + .build() + .show(); + } + + + public static void showSimpleInputDialog(Context context, String title, String hint, int inputType, int length, SimpleCallback callback) { + new Builder(context).setTitle(title) + .setCancelable(true) + .setInput(true) + .setHint(hint) + .setInputType(inputType) + .setLength(length) + .setClickCallback(callback) + .build() + .show(); + } + + + public static void showSimpleInputDialog(Context context, String title, int inputType, int length, SimpleCallback callback) { + showSimpleInputDialog(context, title, null, inputType, length, callback); + } + + public static void showSimpleInputDialog(Context context, String title, int inputType, SimpleCallback callback) { + showSimpleInputDialog(context, title, inputType, 0, callback); + } + + public static void showSimpleInputDialog(Context context, String title, SimpleCallback callback) { + showSimpleInputDialog(context, title, INPUT_TYPE_TEXT, callback); + } + + + public static void showStringArrayDialog(Context context, Integer[] array, final StringArrayDialogCallback callback) { + final Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_string_array); + dialog.setCancelable(true); + dialog.setCanceledOnTouchOutside(true); + Window window = dialog.getWindow(); + window.setWindowAnimations(R.style.bottomToTopAnim); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.BOTTOM; + window.setAttributes(params); + LinearLayout container = (LinearLayout) dialog.findViewById(R.id.container); + View.OnClickListener itemListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + TextView textView = (TextView) v; + if (callback != null) { + callback.onItemClick(textView.getText().toString(), (int) v.getTag()); + } + dialog.dismiss(); + } + }; + for (int i = 0, length = array.length; i < length; i++) { + TextView textView = new TextView(context); + textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DpUtil.dp2px(54))); + textView.setTextColor(0xff323232); + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + textView.setGravity(Gravity.CENTER); + textView.setText(array[i]); + textView.setTag(array[i]); + textView.setOnClickListener(itemListener); + container.addView(textView); + if (i != length - 1) { + View v = new View(context); + v.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DpUtil.dp2px(1))); + v.setBackgroundColor(0xfff5f5f5); + container.addView(v); + } + } + dialog.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + dialog.show(); + } + + public static void showStringArrayDialog(Context context, SparseArray array, final StringArrayDialogCallback callback) { + final Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_string_array); + dialog.setCancelable(true); + dialog.setCanceledOnTouchOutside(true); + Window window = dialog.getWindow(); + window.setWindowAnimations(R.style.bottomToTopAnim); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.BOTTOM; + window.setAttributes(params); + LinearLayout container = (LinearLayout) dialog.findViewById(R.id.container); + View.OnClickListener itemListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + TextView textView = (TextView) v; + if (callback != null) { + callback.onItemClick(textView.getText().toString(), (int) v.getTag()); + } + dialog.dismiss(); + } + }; + for (int i = 0, length = array.size(); i < length; i++) { + TextView textView = new TextView(context); + textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DpUtil.dp2px(54))); + textView.setTextColor(0xff323232); + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + textView.setGravity(Gravity.CENTER); + textView.setText(array.valueAt(i)); + textView.setTag(array.keyAt(i)); + textView.setOnClickListener(itemListener); + container.addView(textView); + if (i != length - 1) { + View v = new View(context); + v.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DpUtil.dp2px(1))); + v.setBackgroundColor(0xfff5f5f5); + container.addView(v); + } + } + dialog.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + dialog.show(); + } + + public static void showDatePickerDialog(Context context, final DataPickerCallback callback) { + final Dialog dialog = new Dialog(context, R.style.dialog); + dialog.setContentView(R.layout.dialog_date_picker); + dialog.setCancelable(true); + dialog.setCanceledOnTouchOutside(true); + DatePicker datePicker = (DatePicker) dialog.findViewById(R.id.datePicker); + final Calendar c = Calendar.getInstance(); + datePicker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { + + @Override + public void onDateChanged(DatePicker view, int year, int month, int dayOfMonth) { + c.set(year, month, dayOfMonth); + } + }); + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v.getId() == R.id.btn_confirm) { + if (callback != null) { + if (c.getTime().getTime() > new Date().getTime()) { + ToastUtil.show(WordUtil.getString(R.string.edit_profile_right_date)); + } else { + String result = DateFormat.format("yyyy-MM-dd", c).toString(); + callback.onConfirmClick(result); + dialog.dismiss(); + } + } + } else { + dialog.dismiss(); + } + } + }; + dialog.findViewById(R.id.btn_cancel).setOnClickListener(listener); + dialog.findViewById(R.id.btn_confirm).setOnClickListener(listener); + dialog.show(); + } + + public static class Builder { + + private Context mContext; + private String mTitle; + private String mContent; + private String mConfrimString; + private String mCancelString; + private boolean mCancelable; + private boolean mBackgroundDimEnabled;//显示区域以外是否使用黑色半透明背景 + private boolean mInput;//是否是输入框的 + private String mHint; + private int mInputType; + private int mLength; + private SimpleCallback mClickCallback; + + public Builder(Context context) { + mContext = context; + } + + public Builder setTitle(String title) { + mTitle = title; + return this; + } + + public Builder setContent(String content) { + mContent = content; + return this; + } + + public Builder setConfrimString(String confrimString) { + mConfrimString = confrimString; + return this; + } + + public Builder setCancelString(String cancelString) { + mCancelString = cancelString; + return this; + } + + public Builder setCancelable(boolean cancelable) { + mCancelable = cancelable; + return this; + } + + public Builder setBackgroundDimEnabled(boolean backgroundDimEnabled) { + mBackgroundDimEnabled = backgroundDimEnabled; + return this; + } + + public Builder setInput(boolean input) { + mInput = input; + return this; + } + + public Builder setHint(String hint) { + mHint = hint; + return this; + } + + public Builder setInputType(int inputType) { + mInputType = inputType; + return this; + } + + public Builder setLength(int length) { + mLength = length; + return this; + } + + public Builder setClickCallback(SimpleCallback clickCallback) { + mClickCallback = clickCallback; + return this; + } + + public Dialog build() { + final Dialog dialog = new Dialog(mContext, mBackgroundDimEnabled ? R.style.dialog : R.style.dialog2); + dialog.setContentView(mInput ? R.layout.dialog_input : R.layout.dialog_simple); + dialog.setCancelable(mCancelable); + dialog.setCanceledOnTouchOutside(mCancelable); + TextView titleView = (TextView) dialog.findViewById(R.id.title); + if (!TextUtils.isEmpty(mTitle)) { + titleView.setText(mTitle); + } + final TextView content = (TextView) dialog.findViewById(R.id.content); + if (!TextUtils.isEmpty(mHint)) { + content.setHint(mHint); + } + if (!TextUtils.isEmpty(mContent)) { + content.setText(mContent); + } + if (mInputType == INPUT_TYPE_NUMBER) { + content.setInputType(InputType.TYPE_CLASS_NUMBER); + } else if (mInputType == INPUT_TYPE_NUMBER_PASSWORD) { + content.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD); + } else if (mInputType == INPUT_TYPE_TEXT_PASSWORD) { + content.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); + } + if (mLength > 0 && content instanceof EditText) { + content.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mLength)}); + } + TextView btnConfirm = (TextView) dialog.findViewById(R.id.btn_confirm); + if (!TextUtils.isEmpty(mConfrimString)) { + btnConfirm.setText(mConfrimString); + } + TextView btnCancel = (TextView) dialog.findViewById(R.id.btn_cancel); + if (!TextUtils.isEmpty(mCancelString)) { + btnCancel.setText(mCancelString); + } + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v.getId() == R.id.btn_confirm) { + if (mClickCallback != null) { + if (mInput) { + mClickCallback.onConfirmClick(dialog, content.getText().toString()); + } else { + dialog.dismiss(); + mClickCallback.onConfirmClick(dialog, ""); + } + } else { + dialog.dismiss(); + } + } else { + dialog.dismiss(); + if (mClickCallback instanceof SimpleCallback2) { + ((SimpleCallback2) mClickCallback).onCancelClick(); + } + } + } + }; + btnConfirm.setOnClickListener(listener); + btnCancel.setOnClickListener(listener); + return dialog; + } + + } + + public interface DataPickerCallback { + void onConfirmClick(String date); + } + + public interface StringArrayDialogCallback { + void onItemClick(String text, int tag); + } + + public interface SimpleCallback { + void onConfirmClick(Dialog dialog, String content); + } + + public interface SimpleCallback2 extends SimpleCallback { + void onCancelClick(); + } + + + /** + * 城市选择 + */ + public static void showCityChooseDialog(Activity activity, ArrayList list, + String province, String city, String district, AddressPicker.OnAddressPickListener listener) { + AddressPicker picker = new AddressPicker(activity, list); + picker.setTextColor(0xff323232); + picker.setDividerColor(0xffdcdcdc); + picker.setAnimationStyle(R.style.bottomToTopAnim); + picker.setCancelTextColor(0xff969696); + picker.setSubmitTextColor(0xffff6131); + picker.setTopLineColor(0xfff5f5f5); + picker.setTopBackgroundColor(0xfff5f5f5); + picker.setHeight(DpUtil.dp2px(250)); + picker.setOffset(5); + picker.setHideProvince(false); + picker.setHideCounty(false); + picker.setColumnWeight(3 / 9.0f, 3 / 9.0f, 3 / 9.0f); + if (TextUtils.isEmpty(province)) { + province = "北京市"; + } + if (TextUtils.isEmpty(city)) { + city = "北京市"; + } + if (TextUtils.isEmpty(district)) { + district = "东城区"; + } + picker.setSelectedItem(province, city, district); + picker.setOnAddressPickListener(listener); + picker.show(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/DownloadUtil.java b/common/src/main/java/com/yunbao/common/utils/DownloadUtil.java new file mode 100644 index 000000000..6472a30b2 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/DownloadUtil.java @@ -0,0 +1,92 @@ +package com.yunbao.common.utils; + +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.FileCallback; +import com.lzy.okgo.model.Progress; +import com.lzy.okgo.model.Response; + +import java.io.File; + +/** + * Created by cxf on 2017/9/4. + */ + +public class DownloadUtil { + + public void download(String tag, String fileDir, String fileName, String url, final Callback callback) { + File file = new File(fileDir); + if (!file.exists()) { + file.mkdirs(); + } + OkGo.get(url).tag(tag).execute(new FileCallback(fileDir, fileName) { + @Override + public void onSuccess(Response response) { + //下载成功结束后的回调 + if (callback != null) { + callback.onSuccess(response.body()); + } + } + + @Override + public void downloadProgress(Progress progress) { + if (callback != null) { + int val = (int) (progress.currentSize * 100 / progress.totalSize); +// L.e("下载进度--->" + val); + callback.onProgress(val); + } + } + + @Override + public void onError(Response response) { + super.onError(response); + Throwable e = response.getException(); + L.e("下载失败--->" + e); + if (callback != null) { + callback.onError(e); + } + } + }); + } + + public void download(String tag, final File fileDir, final String fileName, String url, final Callback callback) { + OkGo.get(url).tag(tag).execute(new FileCallback(fileDir.getAbsolutePath(), fileName) { + @Override + public void onSuccess(Response response) { + //下载成功结束后的回调 + if (callback != null) { + File file1 = new File(fileDir.getAbsolutePath(), fileName+".svga"); + response.body().renameTo(file1); + callback.onSuccess(file1); + } + } + + @Override + public void downloadProgress(Progress progress) { + if (callback != null) { + int val = (int) (progress.currentSize * 100 / progress.totalSize); +// L.e("下载进度--->" + val); + callback.onProgress(val); + } + } + + @Override + public void onError(Response response) { + super.onError(response); + Throwable e = response.getException(); + L.e("下载失败--->" + e); + if (callback != null) { + callback.onError(e); + } + } + }); + } + + + public interface Callback { + void onSuccess(File file); + + void onProgress(int progress); + + void onError(Throwable e); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/DpUtil.java b/common/src/main/java/com/yunbao/common/utils/DpUtil.java new file mode 100644 index 000000000..c25828bb7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/DpUtil.java @@ -0,0 +1,21 @@ +package com.yunbao.common.utils; + +import com.yunbao.common.CommonAppContext; + +/** + * Created by cxf on 2017/8/9. + * dp转px工具类 + */ + +public class DpUtil { + + private static float scale; + + static { + scale = CommonAppContext.sInstance.getResources().getDisplayMetrics().density; + } + + public static int dp2px(int dpVal) { + return (int) (scale * dpVal + 0.5f); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/FaceUtil.java b/common/src/main/java/com/yunbao/common/utils/FaceUtil.java new file mode 100644 index 000000000..a78eb8221 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/FaceUtil.java @@ -0,0 +1,139 @@ +package com.yunbao.common.utils; + +import com.yunbao.common.R; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by cxf on 2018/7/11. + */ + +public class FaceUtil { + + private static final Map FACE_MAP; + + private static final List FACE_LIST; + + static { + FACE_MAP = new LinkedHashMap<>(); + FACE_MAP.put("[微笑]", R.mipmap.face_001); + FACE_MAP.put("[色]", R.mipmap.face_002); + FACE_MAP.put("[发呆]", R.mipmap.face_003); + FACE_MAP.put("[抽烟]", R.mipmap.face_004); + FACE_MAP.put("[抠鼻]", R.mipmap.face_005); + FACE_MAP.put("[哭]", R.mipmap.face_006); + FACE_MAP.put("[发怒]", R.mipmap.face_007); + FACE_MAP.put("[呲牙]", R.mipmap.face_008); + FACE_MAP.put("[睡]", R.mipmap.face_009); + FACE_MAP.put("[害羞]", R.mipmap.face_010); + FACE_MAP.put("[调皮]", R.mipmap.face_011); + FACE_MAP.put("[晕]", R.mipmap.face_012); + FACE_MAP.put("[衰]", R.mipmap.face_013); + FACE_MAP.put("[闭嘴]", R.mipmap.face_014); + FACE_MAP.put("[指点]", R.mipmap.face_015); + FACE_MAP.put("[关注]", R.mipmap.face_016); + FACE_MAP.put("[搞定]", R.mipmap.face_017); + FACE_MAP.put("[胜利]", R.mipmap.face_018); + FACE_MAP.put("[无奈]", R.mipmap.face_019); + FACE_MAP.put("[打脸]", R.mipmap.face_020); + FACE_MAP.put("[大笑]", R.mipmap.face_021); + FACE_MAP.put("[哈欠]", R.mipmap.face_022); + FACE_MAP.put("[害怕]", R.mipmap.face_023); + FACE_MAP.put("[喜欢]", R.mipmap.face_024); + FACE_MAP.put("[困]", R.mipmap.face_025); + FACE_MAP.put("[疑问]", R.mipmap.face_026); + FACE_MAP.put("[伤心]", R.mipmap.face_027); + FACE_MAP.put("[鼓掌]", R.mipmap.face_028); + FACE_MAP.put("[得意]", R.mipmap.face_029); + FACE_MAP.put("[捂嘴]", R.mipmap.face_030); + FACE_MAP.put("[惊恐]", R.mipmap.face_031); + FACE_MAP.put("[思考]", R.mipmap.face_032); + FACE_MAP.put("[吐血]", R.mipmap.face_033); + FACE_MAP.put("[卖萌]", R.mipmap.face_034); + FACE_MAP.put("[嘘]", R.mipmap.face_035); + FACE_MAP.put("[生气]", R.mipmap.face_036); + FACE_MAP.put("[尴尬]", R.mipmap.face_037); + FACE_MAP.put("[笑哭]", R.mipmap.face_038); + FACE_MAP.put("[口罩]", R.mipmap.face_039); + FACE_MAP.put("[斜眼]", R.mipmap.face_040); + FACE_MAP.put("[酷]", R.mipmap.face_041); + FACE_MAP.put("[脸红]", R.mipmap.face_042); + FACE_MAP.put("[大叫]", R.mipmap.face_043); + FACE_MAP.put("[眼泪]", R.mipmap.face_044); + FACE_MAP.put("[见钱]", R.mipmap.face_045); + FACE_MAP.put("[嘟]", R.mipmap.face_046); + FACE_MAP.put("[吓]", R.mipmap.face_047); + FACE_MAP.put("[开心]", R.mipmap.face_048); + FACE_MAP.put("[想哭]", R.mipmap.face_049); + FACE_MAP.put("[郁闷]", R.mipmap.face_050); + FACE_MAP.put("[互粉]", R.mipmap.face_051); + FACE_MAP.put("[赞]", R.mipmap.face_052); + FACE_MAP.put("[拜托]", R.mipmap.face_053); + FACE_MAP.put("[唇]", R.mipmap.face_054); + FACE_MAP.put("[粉]", R.mipmap.face_055); + FACE_MAP.put("[666]", R.mipmap.face_056); + FACE_MAP.put("[玫瑰]", R.mipmap.face_057); + FACE_MAP.put("[黄瓜]", R.mipmap.face_058); + FACE_MAP.put("[啤酒]", R.mipmap.face_059); + FACE_MAP.put("[无语]", R.mipmap.face_060); + FACE_MAP.put("[纠结]", R.mipmap.face_061); + FACE_MAP.put("[吐舌]", R.mipmap.face_062); + FACE_MAP.put("[差评]", R.mipmap.face_063); + FACE_MAP.put("[飞吻]", R.mipmap.face_064); + FACE_MAP.put("[再见]", R.mipmap.face_065); + FACE_MAP.put("[拒绝]", R.mipmap.face_066); + FACE_MAP.put("[耳机]", R.mipmap.face_067); + FACE_MAP.put("[抱抱]", R.mipmap.face_068); + FACE_MAP.put("[嘴]", R.mipmap.face_069); + FACE_MAP.put("[露牙]", R.mipmap.face_070); + FACE_MAP.put("[黄狗]", R.mipmap.face_071); + FACE_MAP.put("[灰狗]", R.mipmap.face_072); + FACE_MAP.put("[蓝狗]", R.mipmap.face_073); + FACE_MAP.put("[狗]", R.mipmap.face_074); + FACE_MAP.put("[脸黑]", R.mipmap.face_075); + FACE_MAP.put("[吃瓜]", R.mipmap.face_076); + FACE_MAP.put("[绿帽]", R.mipmap.face_077); + FACE_MAP.put("[汗]", R.mipmap.face_078); + FACE_MAP.put("[摸头]", R.mipmap.face_079); + FACE_MAP.put("[阴险]", R.mipmap.face_080); + FACE_MAP.put("[擦汗]", R.mipmap.face_081); + FACE_MAP.put("[瞪眼]", R.mipmap.face_082); + FACE_MAP.put("[疼]", R.mipmap.face_083); + FACE_MAP.put("[鬼脸]", R.mipmap.face_084); + FACE_MAP.put("[拇指]", R.mipmap.face_085); + FACE_MAP.put("[亲]", R.mipmap.face_086); + FACE_MAP.put("[大吐]", R.mipmap.face_087); + FACE_MAP.put("[高兴]", R.mipmap.face_088); + FACE_MAP.put("[敲打]", R.mipmap.face_089); + FACE_MAP.put("[加油]", R.mipmap.face_090); + FACE_MAP.put("[吐]", R.mipmap.face_091); + FACE_MAP.put("[握手]", R.mipmap.face_092); + FACE_MAP.put("[18禁]", R.mipmap.face_093); + FACE_MAP.put("[菜刀]", R.mipmap.face_094); + FACE_MAP.put("[威武]", R.mipmap.face_095); + FACE_MAP.put("[给力]", R.mipmap.face_096); + FACE_MAP.put("[爱心]", R.mipmap.face_097); + FACE_MAP.put("[心碎]", R.mipmap.face_098); + FACE_MAP.put("[便便]", R.mipmap.face_099); + FACE_MAP.put("[礼物]", R.mipmap.face_100); + FACE_MAP.put("[生日]", R.mipmap.face_101); + FACE_MAP.put("[喝彩]", R.mipmap.face_102); + FACE_MAP.put("[雷]", R.mipmap.face_103); + + FACE_LIST = new ArrayList<>(); + for (Map.Entry entry : FACE_MAP.entrySet()) { + FACE_LIST.add(entry.getKey()); + } + } + + public static List getFaceList() { + return FACE_LIST; + } + + public static Integer getFaceImageRes(String key) { + return FACE_MAP.get(key); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/FileUtil.java b/common/src/main/java/com/yunbao/common/utils/FileUtil.java new file mode 100644 index 000000000..7dcb8ddcb --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/FileUtil.java @@ -0,0 +1,32 @@ +package com.yunbao.common.utils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintWriter; + +/** + * Created by cxf on 2018/10/20. + */ + +public class FileUtil { + + /** + * 把字符串保存成文件 + */ + public static void saveStringToFile(File dir, String content, String fileName) { + PrintWriter writer = null; + try { + FileOutputStream os = new FileOutputStream(new File(dir, fileName)); + writer = new PrintWriter(os); + writer.write(content); + writer.flush(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } finally { + if (writer != null) { + writer.close(); + } + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/GifCacheUtil.java b/common/src/main/java/com/yunbao/common/utils/GifCacheUtil.java new file mode 100644 index 000000000..b3d5f64c5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/GifCacheUtil.java @@ -0,0 +1,52 @@ +package com.yunbao.common.utils; + +import android.util.Log; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.http.CommonHttpConsts; +import com.yunbao.common.interfaces.CommonCallback; + +import java.io.File; + +/** + * Created by cxf on 2018/10/17. + */ + +public class GifCacheUtil { + + public static void getFile(String fileName, String url,String forwhat, final CommonCallback commonCallback) { + if (commonCallback == null) { + return; + } + File dir = new File(CommonAppConfig.GIF_PATH); + if (!dir.exists()) { + dir.mkdirs(); + } + File file1 = new File(dir, fileName+".svga"); + if (file1.exists()) { + commonCallback.callback(file1); + } else { + DownloadUtil downloadUtil = new DownloadUtil(); + if(forwhat.equals("1")){ + ToastUtil.show("礼物正在获取中..."); + } + downloadUtil.download(CommonHttpConsts.DOWNLOAD_GIF, dir, fileName, url, new DownloadUtil.Callback() { + @Override + public void onSuccess(File file) { + commonCallback.callback(file); + } + + @Override + public void onProgress(int progress) { + + } + + @Override + public void onError(Throwable e) { + commonCallback.callback(null); + } + }); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/GlideCatchUtil.java b/common/src/main/java/com/yunbao/common/utils/GlideCatchUtil.java new file mode 100644 index 000000000..ecacb44a3 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/GlideCatchUtil.java @@ -0,0 +1,176 @@ +package com.yunbao.common.utils; + +import android.os.Looper; +import android.text.TextUtils; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory; +import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory; +import com.yunbao.common.CommonAppContext; + +import java.io.File; +import java.math.BigDecimal; + +/** + * Created by cxf on 2017/8/18. + * 获取Glide图片缓存的大小 + */ + +public class GlideCatchUtil { + private static GlideCatchUtil instance; + + public static GlideCatchUtil getInstance() { + if (null == instance) { + instance = new GlideCatchUtil(); + } + return instance; + } + + /** + * 清除图片磁盘缓存 + */ + public void clearImageDiskCache() { + try { + if (Looper.myLooper() == Looper.getMainLooper()) { + new Thread(new Runnable() { + @Override + public void run() { + Glide.get(CommonAppContext.sInstance).clearDiskCache(); + } + }).start(); + } else { + Glide.get(CommonAppContext.sInstance).clearDiskCache(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 清除图片内存缓存 + */ + public void clearImageMemoryCache() { + try { + if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行 + Glide.get(CommonAppContext.sInstance).clearMemory(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 清除图片所有缓存 + */ + public void clearImageAllCache() { + clearImageDiskCache(); + clearImageMemoryCache(); + String ImageExternalCatchDir = CommonAppContext.sInstance.getExternalCacheDir() + ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR; + deleteFolderFile(ImageExternalCatchDir, true); + } + + /** + * 获取Glide造成的缓存大小 + * + * @return CacheSize + */ + public String getCacheSize() { + try { + return getFormatSize(getFolderSize(new File(CommonAppContext.sInstance.getCacheDir() + "/" + InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR))); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * 获取指定文件夹内所有文件大小的和 + * + * @param file file + * @return size + * @throws Exception + */ + private long getFolderSize(File file) throws Exception { + long size = 0; + try { + File[] fileList = file.listFiles(); + for (File aFileList : fileList) { + if (aFileList.isDirectory()) { + size = size + getFolderSize(aFileList); + } else { + size = size + aFileList.length(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return size; + } + + /** + * 删除指定目录下的文件,这里用于缓存的删除 + * + * @param filePath filePath + * @param deleteThisPath deleteThisPath + */ + private void deleteFolderFile(String filePath, boolean deleteThisPath) { + if (!TextUtils.isEmpty(filePath)) { + try { + File file = new File(filePath); + if (file.isDirectory()) { + File files[] = file.listFiles(); + for (File file1 : files) { + deleteFolderFile(file1.getAbsolutePath(), true); + } + } + if (deleteThisPath) { + if (!file.isDirectory()) { + file.delete(); + } else { + if (file.listFiles().length == 0) { + file.delete(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 格式化单位 + * + * @param size size + * @return size + */ + private static String getFormatSize(double size) { + + double kiloByte = size / 1024; + if (kiloByte < 1) { + return "0.00MB"; + } + + double megaByte = kiloByte / 1024; + if (megaByte < 1) { + BigDecimal result1 = new BigDecimal(Double.toString(kiloByte)); + return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB"; + } + + double gigaByte = megaByte / 1024; + if (gigaByte < 1) { + BigDecimal result2 = new BigDecimal(Double.toString(megaByte)); + return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB"; + } + + double teraBytes = gigaByte / 1024; + if (teraBytes < 1) { + BigDecimal result3 = new BigDecimal(Double.toString(gigaByte)); + return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB"; + } + BigDecimal result4 = new BigDecimal(teraBytes); + + return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/HtmlTagHandler.java b/common/src/main/java/com/yunbao/common/utils/HtmlTagHandler.java new file mode 100644 index 000000000..8f45b0808 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/HtmlTagHandler.java @@ -0,0 +1,98 @@ +package com.yunbao.common.utils; + +import android.graphics.Color; +import android.text.Editable; +import android.text.Html; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.ForegroundColorSpan; + +import org.xml.sax.XMLReader; + +import java.lang.reflect.Field; +import java.util.HashMap; + +public class HtmlTagHandler implements Html.TagHandler { + // 自定义标签名称 + private String tagName; + + // 标签开始索引 + private int startIndex = 0; + // 标签结束索引 + private int endIndex = 0; + // 存放标签所有属性键值对 + final HashMap attributes = new HashMap<>(); + + public HtmlTagHandler(String tagName) { + this.tagName = tagName; + } + + @Override + public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { + // 判断是否是当前需要的tag + if (tag.equalsIgnoreCase(tagName)) { + // 解析所有属性值 + parseAttributes(xmlReader); + + if (opening) { + startHandleTag(tag, output, xmlReader); + } + else { + endEndHandleTag(tag, output, xmlReader); + } + } + } + + public void startHandleTag(String tag, Editable output, XMLReader xmlReader) { + startIndex = output.length(); + } + + public void endEndHandleTag(String tag, Editable output, XMLReader xmlReader) { + endIndex = output.length(); + + // 获取对应的属性值 + String color = attributes.get("color"); + String size = attributes.get("size"); + size = size.split("px")[0]; + + // 设置颜色 + if (!TextUtils.isEmpty(color)) { + output.setSpan(new ForegroundColorSpan(Color.parseColor(color)), startIndex, endIndex, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + // 设置字体大小 + if (!TextUtils.isEmpty(size)) { + output.setSpan(new AbsoluteSizeSpan(Integer.parseInt(size)), startIndex, endIndex, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + + /** + * 解析所有属性值 + * + * @param xmlReader + */ + private void parseAttributes(final XMLReader xmlReader) { + try { + Field elementField = xmlReader.getClass().getDeclaredField("theNewElement"); + elementField.setAccessible(true); + Object element = elementField.get(xmlReader); + Field attsField = element.getClass().getDeclaredField("theAtts"); + attsField.setAccessible(true); + Object atts = attsField.get(element); + Field dataField = atts.getClass().getDeclaredField("data"); + dataField.setAccessible(true); + String[] data = (String[]) dataField.get(atts); + Field lengthField = atts.getClass().getDeclaredField("length"); + lengthField.setAccessible(true); + int len = (Integer) lengthField.get(atts); + + for (int i = 0; i < len; i++) { + attributes.put(data[i * 5 + 1], data[i * 5 + 4]); + } + } catch (Exception e) { + + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil.java b/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil.java new file mode 100644 index 000000000..13ea060f8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil.java @@ -0,0 +1,112 @@ +package com.yunbao.common.utils; + +import android.content.Context; +import android.graphics.Rect; +import android.view.View; +import android.view.ViewTreeObserver; + +import com.yunbao.common.interfaces.KeyBoardHeightChangeListener; + +import java.lang.ref.WeakReference; + +/** + * Created by cxf on 2018/10/27. + * 获取键盘高度的工具类 + */ + +public class KeyBoardHeightUtil implements ViewTreeObserver.OnGlobalLayoutListener { + + private final static String TAG = "KeyBoardHeightUtil"; + private View mParentView; + private Rect mRect; + private int mScreenHeight; + private int mScreenStatusHeight; + private int mLastRectHeight; + private KeyBoardHeightChangeListener mKeyBoardChangeListener; + private boolean mSoftInputShowed; + private int mErrorHeight; + private boolean mFirst = true; + private int mLastKeyBoardHeight; + + public KeyBoardHeightUtil(Context context, View parentView, KeyBoardHeightChangeListener listener) { + mParentView = parentView; + mRect = new Rect(); + mFirst = true; + ScreenDimenUtil util = ScreenDimenUtil.getInstance(); + mScreenHeight = util.getScreenHeight(); + mScreenStatusHeight = util.getStatusBarHeight(); + L.e(TAG, "---屏幕高度--->" + mScreenHeight); + L.e(TAG, "---状态栏高度--->" + mScreenStatusHeight); + mKeyBoardChangeListener = new WeakReference<>(listener).get(); + } + + + @Override + public void onGlobalLayout() { + L.e(TAG, "-------onGlobalLayout--->"); + if (mParentView != null && mRect != null) { + mParentView.getWindowVisibleDisplayFrame(mRect); + int curRectHeight = mRect.height(); + if (mFirst) { + mFirst = false; + mScreenHeight = curRectHeight + mScreenStatusHeight; + mLastRectHeight = curRectHeight; + } + if (mLastRectHeight != curRectHeight) { + mLastRectHeight = curRectHeight; + int visibleHeight = curRectHeight + mScreenStatusHeight; + int keyboardHeight = mScreenHeight - visibleHeight; + mSoftInputShowed = keyboardHeight > mScreenHeight / 4; + if (mSoftInputShowed) { + keyboardHeight -= mErrorHeight; + } else { + if (keyboardHeight > 0) { + mErrorHeight = keyboardHeight; + }else { + mErrorHeight = 0; + } + keyboardHeight = 0; + } + visibleHeight = mScreenHeight - keyboardHeight; + if (mLastKeyBoardHeight != keyboardHeight) { + mLastKeyBoardHeight = keyboardHeight; + L.e(TAG, "-------可视区高度----->" + visibleHeight); + L.e(TAG, "-------键盘高度----->" + keyboardHeight); + if (mKeyBoardChangeListener != null) { + mKeyBoardChangeListener.onKeyBoardHeightChanged(visibleHeight, keyboardHeight); + } + } + } + } + } + + + /** + * 添加布局变化的监听器 + */ + public void start() { + if (mParentView != null) { + mParentView.getViewTreeObserver().addOnGlobalLayoutListener(this); + L.e(TAG, "-------添加键盘监听--->"); + } + } + + + /** + * 移除布局变化的监听器 + */ + public void release() { + if (mParentView != null) { + mParentView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + mParentView = null; + mRect = null; + mKeyBoardChangeListener = null; + L.e(TAG, "-------移除键盘监听--->"); + } + + + public boolean isSoftInputShowed() { + return mSoftInputShowed; + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil2.java b/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil2.java new file mode 100644 index 000000000..acc8f7eb7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/KeyBoardHeightUtil2.java @@ -0,0 +1,93 @@ +package com.yunbao.common.utils; + +import android.content.Context; +import android.graphics.Rect; +import android.view.View; +import android.view.ViewTreeObserver; + +import com.yunbao.common.interfaces.KeyBoardHeightChangeListener; + +import java.lang.ref.WeakReference; + +/** + * Created by cxf on 2018/10/27. + * 获取键盘高度的工具类 + */ + +public class KeyBoardHeightUtil2 implements ViewTreeObserver.OnGlobalLayoutListener { + + private final static String TAG = "KeyBoardHeightUtil"; + private View mParentView; + private Rect mRect; + private int mScreenHeight; + private int mScreenStatusHeight; + private int mLastHeight; + private KeyBoardHeightChangeListener mKeyBoardChangeListener; + private boolean mSoftInputShowed; + + public KeyBoardHeightUtil2(Context context, View parentView, KeyBoardHeightChangeListener listener) { + mParentView = parentView; + mRect = new Rect(); + ScreenDimenUtil util = ScreenDimenUtil.getInstance(); + mScreenHeight = util.getScreenHeight(); + mScreenStatusHeight = util.getStatusBarHeight(); + L.e(TAG, "---屏幕高度--->" + mScreenHeight); + L.e(TAG, "---状态栏高度--->" + mScreenStatusHeight); + mKeyBoardChangeListener = new WeakReference<>(listener).get(); + } + + + @Override + public void onGlobalLayout() { + if (mParentView != null && mRect != null) { + mParentView.getWindowVisibleDisplayFrame(mRect); + int visibleHeight = mRect.height() + mScreenStatusHeight; + if (visibleHeight > mScreenHeight) { + mScreenHeight = visibleHeight; + } + if (mLastHeight != visibleHeight) { + mLastHeight = visibleHeight; + if (mKeyBoardChangeListener != null) { + int keyboardHeight = mScreenHeight - visibleHeight; + if (keyboardHeight < 0) { + keyboardHeight = 0; + } + L.e(TAG, "-------可视区高度----->" + visibleHeight); + L.e(TAG, "-------键盘高度----->" + keyboardHeight); + mSoftInputShowed = keyboardHeight > 100; + mKeyBoardChangeListener.onKeyBoardHeightChanged(visibleHeight, keyboardHeight); + } + } + } + } + + + /** + * 添加布局变化的监听器 + */ + public void start() { + if (mParentView != null) { + mParentView.getViewTreeObserver().addOnGlobalLayoutListener(this); + L.e(TAG, "-------添加键盘监听--->"); + } + } + + + /** + * 移除布局变化的监听器 + */ + public void release() { + if (mParentView != null) { + mParentView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + mParentView = null; + mRect = null; + mKeyBoardChangeListener = null; + L.e(TAG, "-------移除键盘监听--->"); + } + + + public boolean isSoftInputShowed() { + return mSoftInputShowed; + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/L.java b/common/src/main/java/com/yunbao/common/utils/L.java new file mode 100644 index 000000000..990473aed --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/L.java @@ -0,0 +1,28 @@ +package com.yunbao.common.utils; + +import android.util.Log; + +/** + * Created by cxf on 2017/8/3. + */ + +public class L { + + public static boolean sDeBug; + + private final static String TAG = "log--->"; + + public static void e(String s) { + e(TAG, s); + } + + public static void e(String tag, String s) { + if (sDeBug) { + Log.e(tag, s); + } + } + + public static void setDeBug(boolean deBug) { + sDeBug = deBug; + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/LocationUtil.java b/common/src/main/java/com/yunbao/common/utils/LocationUtil.java new file mode 100644 index 000000000..564d43ba7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/LocationUtil.java @@ -0,0 +1,118 @@ +package com.yunbao.common.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.tencent.map.geolocation.TencentLocation; +import com.tencent.map.geolocation.TencentLocationListener; +import com.tencent.map.geolocation.TencentLocationManager; +import com.tencent.map.geolocation.TencentLocationRequest; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.bean.TxLocationBean; +import com.yunbao.common.bean.TxLocationPoiBean; +import com.yunbao.common.event.LocationEvent; +import com.yunbao.common.http.CommonHttpConsts; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.interfaces.CommonCallback; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; + +public class LocationUtil { + private static final String TAG = "定位"; + private static LocationUtil sInstance; + private TencentLocationManager mLocationManager; + private boolean mLocationStarted; + private boolean mNeedPostLocationEvent;//是否需要发送定位成功事件 + + private LocationUtil() { + mLocationManager = TencentLocationManager.getInstance(CommonAppContext.sInstance); + } + + public static LocationUtil getInstance() { + if (sInstance == null) { + synchronized (LocationUtil.class) { + if (sInstance == null) { + sInstance = new LocationUtil(); + } + } + } + return sInstance; + } + + + private TencentLocationListener mLocationListener = new TencentLocationListener() { + @Override + public void onLocationChanged(TencentLocation location, int code, String reason) { + if (code == TencentLocation.ERROR_OK) { + double lng = location.getLongitude();//经度 + double lat = location.getLatitude();//纬度 + L.e(TAG, "获取经纬度成功------>经度:" + lng + ",纬度:" + lat); + CommonHttpUtil.getAddressInfoByTxLocaitonSdk(lng, lat, 0, 1, CommonHttpConsts.GET_LOCAITON, mCallback); + if (mNeedPostLocationEvent) { + EventBus.getDefault().post(new LocationEvent(lng, lat)); + } + } + } + + @Override + public void onStatusUpdate(String s, int i, String s1) { + + } + }; + + private HttpCallback mCallback = new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + JSONObject obj = JSON.parseObject(info[0]); + if (obj != null) { + L.e(TAG, "获取位置信息成功---当前地址--->" + obj.getString("address")); + JSONObject location = obj.getJSONObject("location"); + JSONObject addressComponent = obj.getJSONObject("address_component"); + CommonAppConfig.getInstance().setLocationInfo( + location.getDoubleValue("lng"), + location.getDoubleValue("lat"), + addressComponent.getString("province"), + addressComponent.getString("city"), + addressComponent.getString("district")); + } + } + } + }; + + + //启动定位 + public void startLocation() { + if (!mLocationStarted && mLocationManager != null) { + mLocationStarted = true; + L.e(TAG, "开启定位"); + TencentLocationRequest request = TencentLocationRequest + .create() + .setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_GEO) + .setInterval(60 * 60 * 1000);//1小时定一次位 + + //当定位周期大于0时, 不论是否有得到新的定位结果, 位置监听器都会按定位周期定时被回调; + // 当定位周期等于0时, 仅当有新的定位结果时, 位置监听器才会被回调(即, 回调时机存在不确定性). + // 如果需要周期性回调, 建议将 定位周期 设置为 5000-10000ms + mLocationManager.requestLocationUpdates(request, mLocationListener); + } + } + + //停止定位 + public void stopLocation() { + CommonHttpUtil.cancel(CommonHttpConsts.GET_LOCAITON); + if (mLocationStarted && mLocationManager != null) { + L.e(TAG, "关闭定位"); + mLocationManager.removeUpdates(mLocationListener); + mLocationStarted = false; + } + } + + public void setNeedPostLocationEvent(boolean needPostLocationEvent) { + mNeedPostLocationEvent = needPostLocationEvent; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/LogUtil.java b/common/src/main/java/com/yunbao/common/utils/LogUtil.java new file mode 100644 index 000000000..61d49238f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/LogUtil.java @@ -0,0 +1,34 @@ +package com.yunbao.common.utils; + +import android.text.TextUtils; + +import java.io.File; +import java.io.FileWriter; + +/** + * Created by cxf on 2019/6/20. + */ + +public class LogUtil { + + public static void print(File file, String content) { + if (file == null || TextUtils.isEmpty(content)) { + return; + } + FileWriter writer = null; + try { + writer = new FileWriter(file, true); + writer.write(content); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/MD5Util.java b/common/src/main/java/com/yunbao/common/utils/MD5Util.java new file mode 100644 index 000000000..861ea6173 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/MD5Util.java @@ -0,0 +1,36 @@ +package com.yunbao.common.utils; + +import java.security.MessageDigest; + +/** + * Created by cxf on 2017/9/19. + */ + +public class MD5Util { + private static char sHexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + public static String getMD5(String source) { + try { + byte[] bytes = source.getBytes(); + // 获得MD5摘要算法的 MessageDigest 对象 + MessageDigest md = MessageDigest.getInstance("MD5"); + // 使用指定的字节更新摘要 + md.update(bytes); + // 获得密文 + byte[] mdBytes = md.digest(); + // 把密文转换成十六进制的字符串形式 + int length = mdBytes.length; + char[] chars = new char[length * 2]; + int k = 0; + for (int i = 0; i < length; i++) { + byte byte0 = mdBytes[i]; + chars[k++] = sHexDigits[byte0 >>> 4 & 0xf]; + chars[k++] = sHexDigits[byte0 & 0xf]; + } + return new String(chars); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/PreViewImageView.java b/common/src/main/java/com/yunbao/common/utils/PreViewImageView.java new file mode 100644 index 000000000..c35849564 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/PreViewImageView.java @@ -0,0 +1,455 @@ +package com.yunbao.common.utils; + +import android.animation.FloatEvaluator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import androidx.appcompat.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.animation.AccelerateInterpolator; + +/** + *Description: PreViewImageView 预览图片 手指缩放 移动 + * Created by Haoxuan Chen on 2019.07.14. + */ +public class PreViewImageView extends AppCompatImageView { + private static final String TAG = PreViewImageView.class.getSimpleName(); + private GestureDetector mGestureDetector; + private ScaleGestureDetector mScaleGestureDetector; + private int mBoundWidth = 0; + private int mBoundHeight = 0; + private boolean isAutoScale = false; + private float scale = 1.0f; + private float translateLeft = 0.0f; + private float translateTop = 0.0f; + private static final float mMaxScale = 4.0f; + private static final float mMinScale = 0.4f; + + private ValueAnimator mScaleAnimator; + private ValueAnimator mHorizontalXAnimator; + private ValueAnimator mVerticalYAnimator; + + private AccelerateInterpolator mAccelerateInterpolator = new AccelerateInterpolator(); + private FloatEvaluator mFloatEvaluator = new FloatEvaluator(); + + public PreViewImageView(Context context) { + this(context,null); + } + + public PreViewImageView(Context context, AttributeSet attrs) { + this(context, attrs,0); + } + + public PreViewImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mGestureDetector = new GestureDetector(getContext(), new GestureListener()); + mScaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleGestureListener()); + } + + //手势处理类GestureDetector.SimpleOnGestureListener + private class GestureListener extends GestureDetector.SimpleOnGestureListener { + /** + * 手指滑动调用 + * + * @param e1 horizontal event + * @param e2 vertical event + * @param distanceX previous X - current X, toward left , is position + * @param distanceY previous Y - current Y, toward up, is position + * @return true + */ + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + final float mScaledWidth = mBoundWidth * scale; + final float mScaledHeight = mBoundHeight * scale; + if (mScaledHeight > getHeight()) { + translateTop -= distanceY * 1.5; + translateTop = getTranslateTop(translateTop); + } + boolean isReachBorder = false; + if (mScaledWidth > getWidth()) { + translateLeft -= distanceX * 1.5; + final float t = getTranslateLeft(translateLeft); + if (t != translateLeft) isReachBorder = true; + translateLeft = t; + } else { + isReachBorder = true; + } + invalidate(); + return true; + } + + /** + * 手指双击调用 + * + * @param e event + * @return true + */ + @Override + public boolean onDoubleTap(MotionEvent e) { + isAutoScale = true; + ValueAnimator scaleAnimator = getResetScaleAnimator(); + if (scale == 1.0f) { + //缩放 + scaleAnimator.setFloatValues(1.0f, 2.0f); + //x轴平移 + ValueAnimator xAnimator = getHorizontalXAnimator(); + //y轴平移 + ValueAnimator yAnimator = getVerticalYAnimator(); + xAnimator.setFloatValues(translateLeft, (getWidth() - mBoundWidth * 2.f) / 2.f);//-540 + Log.i(TAG, "onDoubleTap: translateLeft " + (getWidth() - mBoundWidth * 2.f) / 2.f); + yAnimator.setFloatValues(translateTop, getDefaultTranslateTop(getHeight(), mBoundHeight * 2)); + Log.i(TAG, "onDoubleTap: translateTop" + getDefaultTranslateTop(getHeight(), mBoundHeight * 2)); //0 + xAnimator.addUpdateListener(getOnTranslateXAnimationUpdate()); + yAnimator.addUpdateListener(getOnTranslateYAnimationUpdate()); + //开启动画 + xAnimator.start(); + yAnimator.start(); + } else { + scaleAnimator.setFloatValues(scale, 1.0f); + resetDefaultState(); + + } + scaleAnimator.addUpdateListener(getOnScaleAnimationUpdate()); + scaleAnimator.start(); + return true; + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + return super.onFling(e1, e2, velocityX, velocityY); + } + } + + //手指缩放类ScaleGestureDetector.SimpleOnScaleGestureListener + private class ScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + /** + * 两个手指缩放调用 + * + * @param detector ScaleGestureDetector + * @return true + */ + @Override + public boolean onScale(ScaleGestureDetector detector) { + final float mOldScaledWidth = mBoundWidth * scale; + final float mOldScaledHeight = mBoundHeight * scale; + if (mOldScaledWidth > getWidth() && getDiffX() != 0 || + (mOldScaledHeight > getHeight() && getDiffY() != 0)) return false; + float factor = detector.getScaleFactor(); + Log.i(TAG, "factor=" + factor); + float value = scale; + value += (factor - 1) * 2; + if (value == scale) return true; + if (value <= mMinScale) return false; + if (value > mMaxScale) return false; + scale = value; + final float mScaledWidth = mBoundWidth * scale; + final float mScaledHeight = mBoundHeight * scale; + + // 走了些弯路, 不应该带入translateX计算, 因为二次放大之后计算就不正确了,它应该受scale的制约 + translateLeft = getWidth() / 2.f - (getWidth() / 2.f - translateLeft) * mScaledWidth / mOldScaledWidth; + translateTop = getHeight() / 2.f - (getHeight() / 2.f - translateTop) * mScaledHeight / mOldScaledHeight; + + final float diffX = getDiffX(); + final float diffY = getDiffY(); + + // 考虑宽图, 如果缩小的时候图片左边界到了屏幕左边界,停留在左边界缩小 + if (diffX > 0 && mScaledWidth > getWidth()) { + translateLeft = 0; + } + // 右边界问题 + if (diffX < 0 && mScaledWidth > getWidth()) { + translateLeft = getWidth() - mScaledWidth; + } + + // 考虑到长图,上边界问题 + if (diffY > 0 && mScaledHeight > getHeight()) { + translateTop = 0; + } + + // 下边界问题 + if (diffY < 0 && mScaledHeight > getHeight()) { + translateTop = getHeight() - mScaledHeight; + } + + invalidate(); + return true; + } + } + + + /** + * @return 如果是正数, 左边有空隙, 如果是负数, 右边有空隙, 如果是0, 代表两边都没有空隙 + */ + private float getDiffX() { + final float mScaledWidth = mBoundWidth * scale; + return translateLeft >= 0 + ? translateLeft + : getWidth() - translateLeft - mScaledWidth > 0 + ? -(getWidth() - translateLeft - mScaledWidth) + : 0; + } + + /** + * @return 如果是正数, 上面有空隙, 如果是负数, 下面有空隙, 如果是0, 代表两边都没有空隙 + */ + private float getDiffY() { + final float mScaledHeight = mBoundHeight * scale; + return translateTop >= 0 + ? translateTop + : getHeight() - translateTop - mScaledHeight > 0 + ? -(getHeight() - translateTop - mScaledHeight) + : 0; + } + + + @Override + protected boolean setFrame(int l, int t, int r, int b) { + super.setFrame(l, t, r, b); + Drawable drawable = getDrawable(); + if (drawable == null) return false; + if (mBoundWidth != 0 && mBoundHeight != 0 && scale != 1) return false; + adjustBounds(getWidth(), getHeight()); + return true; + } + + + private void adjustBounds(int width, int height) { + Drawable drawable = getDrawable(); + if (drawable == null) return; + mBoundWidth = drawable.getBounds().width(); + mBoundHeight = drawable.getBounds().height(); + float scale = ( float ) mBoundWidth / width; + mBoundHeight /= scale; + mBoundWidth = width; + drawable.setBounds(0, 0, mBoundWidth, mBoundHeight); + translateLeft = 0; + translateTop = getDefaultTranslateTop(height, mBoundHeight); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + adjustBounds(w, h); + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + Drawable drawable = getDrawable(); + if (drawable == null) return; + //图片的宽和高 + int drawableWidth = drawable.getIntrinsicWidth(); + int drawableHeight = drawable.getIntrinsicHeight(); + if (drawableWidth == 0 || drawableHeight == 0) { + return; + } + canvas.save(); + canvas.translate(translateLeft, translateTop); + canvas.scale(scale, scale); + //如果先scale,再translate,那么,真实translate的值是要与scale值相乘的 + drawable.draw(canvas); + canvas.restore(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + cancelAnimator(); + } + mGestureDetector.onTouchEvent(event); + mScaleGestureDetector.onTouchEvent(event); + return true; + } + + + /** + * 重置伸缩 + * + * @return mScaleAnimator + */ + private ValueAnimator getResetScaleAnimator() { + if (mScaleAnimator != null) { + mScaleAnimator.removeAllUpdateListeners(); + } else { + mScaleAnimator = ValueAnimator.ofFloat(); + } + mScaleAnimator.setDuration(150); + mScaleAnimator.setInterpolator(mAccelerateInterpolator); + mScaleAnimator.setEvaluator(mFloatEvaluator); + return mScaleAnimator; + } + + + /** + * 水平方向的动画 (X轴) + * + * @return mHorizontalAnimator + */ + private ValueAnimator getHorizontalXAnimator() { + if (mHorizontalXAnimator != null) { + mHorizontalXAnimator.removeAllUpdateListeners(); + } else { + mHorizontalXAnimator = ValueAnimator.ofFloat(); + } + mHorizontalXAnimator.setDuration(150); + mHorizontalXAnimator.setInterpolator(mAccelerateInterpolator); + mHorizontalXAnimator.setEvaluator(mFloatEvaluator); + return mHorizontalXAnimator; + } + + + /** + * 垂直方向的动画 + * + * @return resetYAnimator + */ + private ValueAnimator getVerticalYAnimator() { + if (mVerticalYAnimator != null) { + mVerticalYAnimator.removeAllUpdateListeners(); + } else { + mVerticalYAnimator = ValueAnimator.ofFloat(); + } + mVerticalYAnimator.setDuration(150); + mVerticalYAnimator.setInterpolator(mAccelerateInterpolator); + mVerticalYAnimator.setEvaluator(mFloatEvaluator); + return mVerticalYAnimator; + } + + /** + * 重置到初始的状态 + */ + private void resetDefaultState() { + if (translateLeft != 0) { + ValueAnimator mTranslateXAnimator = getHorizontalXAnimator(); + mTranslateXAnimator.setFloatValues(translateLeft, 0); + mTranslateXAnimator.addUpdateListener(getOnTranslateXAnimationUpdate()); + mTranslateXAnimator.start(); + } + + ValueAnimator mTranslateYAnimator = getVerticalYAnimator(); + mTranslateYAnimator.setFloatValues(translateTop, getDefaultTranslateTop(getHeight(), mBoundHeight)); + mTranslateYAnimator.addUpdateListener(getOnTranslateYAnimationUpdate()); + mTranslateYAnimator.start(); + + } + + + private float getDefaultTranslateTop(int height, int boundHeight) { + float top = (height - boundHeight) / 2.f; + return top > 0 ? top : 0; + } + + + private ValueAnimator.AnimatorUpdateListener onScaleAnimationUpdate; + + /** + * 重置伸缩动画的监听器 + * + * @return onScaleAnimationUpdate + */ + public ValueAnimator.AnimatorUpdateListener getOnScaleAnimationUpdate() { + if (onScaleAnimationUpdate != null) return onScaleAnimationUpdate; + onScaleAnimationUpdate = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + scale = ( float ) animation.getAnimatedValue(); + invalidate(); + } + }; + return onScaleAnimationUpdate; + } + + /** + * 水平动画的监听器 + * + * @return + */ + private ValueAnimator.AnimatorUpdateListener onTranslateXAnimationUpdate; + + public ValueAnimator.AnimatorUpdateListener getOnTranslateXAnimationUpdate() { + if (onTranslateXAnimationUpdate != null) return onTranslateXAnimationUpdate; + onTranslateXAnimationUpdate = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + translateLeft = ( float ) animation.getAnimatedValue(); + invalidate(); + } + }; + return onTranslateXAnimationUpdate; + } + + /** + * 垂直动画的监听器 + * + * @return onTranslateYAnimationUpdate + */ + private ValueAnimator.AnimatorUpdateListener onTranslateYAnimationUpdate; + + public ValueAnimator.AnimatorUpdateListener getOnTranslateYAnimationUpdate() { + if (onTranslateYAnimationUpdate != null) return onTranslateYAnimationUpdate; + onTranslateYAnimationUpdate = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + translateTop = ( float ) animation.getAnimatedValue(); + invalidate(); + } + }; + return onTranslateYAnimationUpdate; + } + + /** + * 向左平移的距离 + * + * @param l translateLeft + * @return l + */ + private float getTranslateLeft(float l) { + final float mScaledWidth = mBoundWidth * scale; + if (l > 0) { + l = 0; + } + if (-l + getWidth() > mScaledWidth) { + l = getWidth() - mScaledWidth; + } + return l; + } + + /** + * 向上平移的距离 + * + * @param t top + * @return t + */ + private float getTranslateTop(float t) { + final float mScaledHeight = mBoundHeight * scale; + if (t > 0) { + t = 0; + } + if (-t + getHeight() > mScaledHeight) { + t = getHeight() - mScaledHeight; + } + return t; + } + + + /** + * 取消动画 + */ + private void cancelAnimator() { + if (mHorizontalXAnimator != null && mHorizontalXAnimator.isRunning()) { + mHorizontalXAnimator.cancel(); + } + if (mVerticalYAnimator != null && mVerticalYAnimator.isRunning()) { + mVerticalYAnimator.cancel(); + } + if (mScaleAnimator != null && mScaleAnimator.isRunning()) { + mScaleAnimator.cancel(); + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java b/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java new file mode 100644 index 000000000..c2264d608 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java @@ -0,0 +1,229 @@ +package com.yunbao.common.utils; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.MediaStore; +import androidx.fragment.app.FragmentActivity; +import androidx.core.content.FileProvider; + +import com.yalantis.ucrop.UCrop; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.R; +import com.yunbao.common.interfaces.ActivityResultCallback; +import com.yunbao.common.interfaces.ImageResultCallback; + +import java.io.File; + +/** + * Created by cxf on 2018/9/29. + * 选择图片 裁剪 + */ + +public class ProcessImageUtil extends ProcessResultUtil { + + private Context mContext; + private String[] mCameraPermissions; + private String[] mAlumbPermissions; + private Runnable mCameraPermissionCallback; + private Runnable mAlumbPermissionCallback; + private ActivityResultCallback mCameraResultCallback; + private ActivityResultCallback mAlumbResultCallback; + private ActivityResultCallback mCropResultCallback; + private File mCameraResult;//拍照后得到的图片 + private File mCorpResult;//裁剪后得到的图片 + private ImageResultCallback mResultCallback; + private boolean mNeedCrop;//是否需要裁剪 + + public ProcessImageUtil(FragmentActivity activity) { + super(activity); + mContext = activity; + mCameraPermissions = new String[]{ + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.CAMERA + }; + mAlumbPermissions = new String[]{ + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + }; + mCameraPermissionCallback = new Runnable() { + @Override + public void run() { + takePhoto(); + } + }; + mAlumbPermissionCallback = new Runnable() { + @Override + public void run() { + chooseFile(); + } + }; + mCameraResultCallback = new ActivityResultCallback() { + @Override + public void onSuccess(Intent intent) { + if (mNeedCrop) { + Uri uri = null; + if (Build.VERSION.SDK_INT >= 24) { + uri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCameraResult); + } else { + uri = Uri.fromFile(mCameraResult); + } + if (uri != null) { + crop(uri); + } + } else { + if (mResultCallback != null) { + mResultCallback.onSuccess(mCameraResult); + } + } + } + + @Override + public void onFailure() { + ToastUtil.show(R.string.img_camera_cancel); + } + }; + mAlumbResultCallback = new ActivityResultCallback() { + @Override + public void onSuccess(Intent intent) { + crop(intent.getData()); + } + + @Override + public void onFailure() { + ToastUtil.show(R.string.img_alumb_cancel); + } + }; + mCropResultCallback = new ActivityResultCallback() { + @Override + public void onSuccess(Intent intent) { + if (mResultCallback != null) { + mResultCallback.onSuccess(mCorpResult); + } + } + + @Override + public void onFailure() { + ToastUtil.show(R.string.img_crop_cancel); + } + }; + } + + /** + * 拍照获取图片 + */ + public void getImageByCamera(boolean needCrop) { + mNeedCrop = needCrop; + requestPermissions(mCameraPermissions, mCameraPermissionCallback); + } + + /** + * 拍照获取图片 + */ + public void getImageByCamera() { + getImageByCamera(true); + } + + /** + * 相册获取图片 + */ + public void getImageByAlumb() { + requestPermissions(mAlumbPermissions, mAlumbPermissionCallback); + } + + + /** + * 开启摄像头,执行照相 + */ + private void takePhoto() { + try { + if (mResultCallback != null) { + mResultCallback.beforeCamera(); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + mCameraResult = getNewFile(); + Uri uri = null; + if (Build.VERSION.SDK_INT >= 24) { + uri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCameraResult); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } else { + uri = Uri.fromFile(mCameraResult); + } + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + startActivityForResult(intent, mCameraResultCallback); + }catch (Exception e){e.printStackTrace();} + } + + private File getNewFile() { + // 裁剪头像的绝对路径 + File dir = new File(CommonAppConfig.CAMERA_IMAGE_PATH); + if (!dir.exists()) { + dir.mkdirs(); + } + return new File(dir, DateFormatUtil.getCurTimeString() + ".png"); + } + + + /** + * 打开相册,选择文件 + */ + private void chooseFile() { + Intent intent = new Intent(); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("image/*"); + if (Build.VERSION.SDK_INT < 19) { + intent.setAction(Intent.ACTION_GET_CONTENT); + } else { + intent.setAction(Intent.ACTION_OPEN_DOCUMENT); + } + startActivityForResult(intent, mAlumbResultCallback); + } + + /** + * 裁剪 + */ + private void crop(Uri inputUri) { + mCorpResult = getNewFile(); + try { + Uri resultUri = Uri.fromFile(mCorpResult); + if (resultUri == null || mFragment == null || mContext == null) { + return; + } + UCrop uCrop = UCrop.of(inputUri, resultUri) + .withAspectRatio(1, 1) + .withMaxResultSize(400, 400); + Intent intent = uCrop.getIntent(mContext); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + startActivityForResult(intent, mCropResultCallback); + } catch (Exception e) { + try { + Uri resultUri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCorpResult); + if (resultUri == null || mFragment == null || mContext == null) { + return; + } + UCrop uCrop = UCrop.of(inputUri, resultUri) + .withAspectRatio(1, 1) + .withMaxResultSize(400, 400); + Intent intent = uCrop.getIntent(mContext); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + startActivityForResult(intent, mCropResultCallback); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + + + public void setImageResultCallback(ImageResultCallback resultCallback) { + mResultCallback = resultCallback; + } + + @Override + public void release() { + super.release(); + mResultCallback = null; + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/ProcessResultUtil.java b/common/src/main/java/com/yunbao/common/utils/ProcessResultUtil.java new file mode 100644 index 000000000..06e4b384b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ProcessResultUtil.java @@ -0,0 +1,43 @@ +package com.yunbao.common.utils; + +import android.content.Intent; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.yunbao.common.fragment.ProcessFragment; +import com.yunbao.common.interfaces.ActivityResultCallback; + +/** + * Created by cxf on 2018/9/29. + */ + +public class ProcessResultUtil { + + protected ProcessFragment mFragment; + + + public ProcessResultUtil(FragmentActivity activity) { + mFragment = new ProcessFragment(); + FragmentManager fragmentManager = activity.getSupportFragmentManager(); + FragmentTransaction tx = fragmentManager.beginTransaction(); + tx.add(mFragment, "ProcessFragment").commit(); + } + + public void requestPermissions(String[] permissions, Runnable runnable) { + mFragment.requestPermissions(permissions, runnable); + } + + + public void startActivityForResult(Intent intent, ActivityResultCallback callback){ + mFragment.startActivityForResult(intent,callback); + } + + + public void release(){ + if(mFragment!=null){ + mFragment.release(); + } + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/RandomUtil.java b/common/src/main/java/com/yunbao/common/utils/RandomUtil.java new file mode 100644 index 000000000..71dc4e660 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/RandomUtil.java @@ -0,0 +1,19 @@ +package com.yunbao.common.utils; + +import java.util.Random; + +/** + * Created by cxf on 2018/10/11. + */ + +public class RandomUtil { + private static Random sRandom; + + static { + sRandom = new Random(); + } + + public static int nextInt(int bound) { + return sRandom.nextInt(bound); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/RouteUtil.java b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java new file mode 100644 index 000000000..f75134248 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java @@ -0,0 +1,129 @@ +package com.yunbao.common.utils; + +import android.content.Context; +import android.content.Intent; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.Constants; +import com.yunbao.common.HtmlConfig; + +/** + * Created by cxf on 2019/2/25. + */ + +public class RouteUtil { + //Intent隐式启动 action + public static final String PATH_LAUNCHER = "/app/LauncherActivity"; + public static final String PATH_LOGIN_INVALID = "/main/LoginInvalidActivity"; + public static final String PATH_USER_HOME = "/main/UserHomeActivity"; + public static final String PATH_COIN = "/main/MyWalletActivity"; + public static final String PATH_GOOGLE = "/main/GooglePayActivity"; + public static final String PATH_REWARD = "/main/RewardActivity"; + public static final String PATH_EDITPROFILE = "/main/EditProfileActivity"; + public static final String PATH_LIVEREPORT = "/live/LiveReportActivity"; + public static final String PATH_MYWEBVIEWACTIVTITY = "/main/MyWebViewActivity"; + public static final String PATH_ZHUANGBANACTIVITY = "/main/ZhuangBanActivity"; + public static final String PATH_FACEBOOKACTIVITY = "/baidu/FacebookLoginActivity"; + + /** + * 启动页 + */ + public static void forwardLauncher(Context context) { + ARouter.getInstance().build(PATH_LAUNCHER) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) + .navigation(); + } + + /** + * 登录过期 + */ + public static void forwardLoginInvalid(String tip) { + ARouter.getInstance().build(PATH_LOGIN_INVALID) + .withString(Constants.TIP, tip) + .navigation(); + } + + /** + * 跳转到个人主页 + * intoIndex 2=个人中心进入 1=单聊进入 0=其他 + */ + public static void forwardUserHome(Context context, String toUid, int intoIndex) { + forwardUserHome(context, toUid, false, null, intoIndex); + } + + /** + * 跳转到个人主页 + */ + public static void forwardUserHome(Context context, String toUid, boolean fromLiveRoom, String fromLiveUid, int intoIndex) { + Constants.myIntoIndex = 2; +// if (intoIndex == 2) { +// ARouter.getInstance().build(PATH_USER_HOME) +// .withString(Constants.TO_UID, toUid) +// .withBoolean(Constants.FROM_LIVE_ROOM, fromLiveRoom) +// .withString(Constants.LIVE_UID, fromLiveUid) +// .navigation(); + +// WebViewActivity.forward(context, HtmlConfig.PERSONAL + "?touid=" + toUid + "&&isHomePage=1" + "&&fromType=0"); +// } else { +// WebViewActivity.forward(context, HtmlConfig.PERSONAL + "?touid=" + toUid + "&&isHomePage=1" + "&&fromType=0"); +// } + forwardMainUserHome(context, toUid, fromLiveRoom, fromLiveUid, intoIndex); + } + + /** + * 跳转到个人主页 + */ + public static void forwardMainUserHome(Context context, String toUid, boolean fromLiveRoom, String fromLiveUid, int intoIndex) { + String url = HtmlConfig.PERSONAL + "?touid=" + toUid + "&isHomePage=1" + "&fromType=0"; + if (!"".equals(Constants.chatActionUrl)) { + url = Constants.chatActionUrl; + } + Constants.myUrl = url + "&uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken()+"&t=" + System.currentTimeMillis(); + ARouter.getInstance().build(PATH_MYWEBVIEWACTIVTITY) + .navigation(); + } + + /** + * 跳转到装扮 + */ + public static void forwardZhuangBanActivity(String url) { + Constants.myPackageUrl = url; + ARouter.getInstance().build(PATH_ZHUANGBANACTIVITY) + .navigation(); + } + + /** + * 跳转到充值页面 + */ + public static void forwardMyCoin(Context context) { + String url = CommonAppConfig.HOST + "/index.php?g=Appapi&m=Mall&a=zhifu&uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken(); + ARouter.getInstance().build(PATH_COIN).withString("url", url).navigation(); + } + + + /** + * 修改个人资料 + */ + public static void forwardEditProfileActivity() { + ARouter.getInstance().build(PATH_EDITPROFILE) + .navigation(); + } + + /** + * 举报个人 + */ + public static void forwardLiveReportActivity(String touid) { + ARouter.getInstance().build(PATH_LIVEREPORT) + .withString(Constants.TO_UID, touid) + .navigation(); + } + + /** + * 进入facebook登录 + */ + public static void forwardFacebookActivity() { + ARouter.getInstance().build(PATH_FACEBOOKACTIVITY) + .navigation(); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/ScreenDimenUtil.java b/common/src/main/java/com/yunbao/common/utils/ScreenDimenUtil.java new file mode 100644 index 000000000..b21a45aed --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ScreenDimenUtil.java @@ -0,0 +1,91 @@ +package com.yunbao.common.utils; + +import android.content.res.Resources; +import android.util.DisplayMetrics; + +import com.yunbao.common.CommonAppContext; + +import java.lang.reflect.Field; + +/** + * Created by cxf on 2017/10/30. + * 获取屏幕尺寸 + */ + +public class ScreenDimenUtil { + + private Resources mResources; + private int mStatusBarHeight;//状态栏高度 + private int mContentHeight; + private int mScreenWdith; + private int mScreenHeight; + + + private static ScreenDimenUtil sInstance; + + private ScreenDimenUtil() { + mResources = CommonAppContext.sInstance.getResources(); + DisplayMetrics dm = mResources.getDisplayMetrics(); + mScreenWdith = dm.widthPixels; + mScreenHeight = dm.heightPixels; + //网上找的办法,使用反射在DecoderView未绘制出来之前计算状态栏的高度 + try { + Class c = Class.forName("com.android.internal.R$dimen"); + Object obj = c.newInstance(); + Field field = c.getField("status_bar_height"); + int x = Integer.parseInt(field.get(obj).toString()); + mStatusBarHeight = mResources.getDimensionPixelSize(x); + mContentHeight = mScreenHeight - mStatusBarHeight; + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static ScreenDimenUtil getInstance() { + if (sInstance == null) { + synchronized (ScreenDimenUtil.class) { + if (sInstance == null) { + sInstance = new ScreenDimenUtil(); + } + } + } + return sInstance; + } + + /** + * 获取屏幕的宽度 + * + * @return + */ + public int getScreenWdith() { + return mScreenWdith; + } + + /** + * 获取屏幕的高度 + * + * @return + */ + public int getScreenHeight() { + return mScreenHeight; + } + + /** + * 获取ContentView的高度 + * + * @return + */ + public int getContentHeight() { + return mContentHeight; + } + + /** + * 获取状态栏的高度 + * + * @return + */ + public int getStatusBarHeight() { + return mStatusBarHeight; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/SpUtil.java b/common/src/main/java/com/yunbao/common/utils/SpUtil.java new file mode 100644 index 000000000..cfb12648c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/SpUtil.java @@ -0,0 +1,173 @@ +package com.yunbao.common.utils; + +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; + +import com.yunbao.common.CommonAppContext; + +import java.util.Map; + +/** + * Created by cxf on 2018/9/17. + * SharedPreferences 封装 + */ + +public class SpUtil { + + private static SpUtil sInstance; + private static SharedPreferences mSharedPreferences; + + public static final String UID = "uid"; + public static final String TOKEN = "token"; + public static final String USER_INFO = "userInfo"; + public static final String CONFIG = "config"; + public static final String IM_LOGIN = "jimLogin"; + public static final String HAS_SYSTEM_MSG = "hasSystemMsg"; + public static final String LOCATION_LNG = "locationLng"; + public static final String LOCATION_LAT = "locationLat"; + public static final String LOCATION_PROVINCE = "locationProvince"; + public static final String LOCATION_CITY = "locationCity"; + public static final String LOCATION_DISTRICT = "locationDistrict"; + public static final String TI_BEAUTY_ENABLE = "tiBeautyEnable"; + public static final String BEAUTY_SDK_TYPE = "beautySdkType"; + public static final String TURNTABLE_ENABLE = "turntableEnable"; + public static final String BEAUTY_360_TIEZHI_URL = "beauty360TiezhiUrl"; + public static final String BEAUTY_360_TIEZHI_EXIST = "beauty360TiezhiExist"; + public static final String ANCHOR_PK_TIME = "anchorPkTime"; + //播放短视频上下滑动引导页 + public static final String READ_VIDEO_GUIDE = "readVideoGuide"; + + + public SpUtil() { + mSharedPreferences = CommonAppContext.sInstance.getSharedPreferences("SharedPreferences", Context.MODE_PRIVATE); + } + + public static SpUtil getInstance() { + if (sInstance == null) { + synchronized (SpUtil.class) { + if (sInstance == null) { + sInstance = new SpUtil(); + } + } + } + return sInstance; + } + + /** + * 保存一个字符串 + */ + public static void setStringValue(String key, String value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putString(key, value); + editor.apply(); + } + + /** + * 获取一个字符串 + */ + public static String getStringValue(String key) { + return mSharedPreferences.getString(key, ""); + } + + /** + * 保存多个字符串 + */ + public void setMultiStringValue(Map pairs) { + if (pairs == null || pairs.size() == 0) { + return; + } + SharedPreferences.Editor editor = mSharedPreferences.edit(); + for (Map.Entry entry : pairs.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + editor.putString(key, value); + } + } + editor.apply(); + } + + /** + * 获取多个字符串 + */ + public String[] getMultiStringValue(String... keys) { + if (keys == null || keys.length == 0) { + return null; + } + int length = keys.length; + String[] result = new String[length]; + for (int i = 0; i < length; i++) { + String temp = ""; + if (!TextUtils.isEmpty(keys[i])) { + temp = mSharedPreferences.getString(keys[i], ""); + } + result[i] = temp; + } + return result; + } + + + /** + * 保存一个布尔值 + */ + public void setBooleanValue(String key, boolean value) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(key, value); + editor.apply(); + } + + /** + * 获取一个布尔值 + */ + public boolean getBooleanValue(String key) { + return mSharedPreferences.getBoolean(key, false); + } + + /** + * 保存多个布尔值 + */ + public void setMultiBooleanValue(Map pairs) { + if (pairs == null || pairs.size() == 0) { + return; + } + SharedPreferences.Editor editor = mSharedPreferences.edit(); + for (Map.Entry entry : pairs.entrySet()) { + String key = entry.getKey(); + Boolean value = entry.getValue(); + if (!TextUtils.isEmpty(key)) { + editor.putBoolean(key, value); + } + } + editor.apply(); + } + + /** + * 获取多个布尔值 + */ + public boolean[] getMultiBooleanValue(String[] keys) { + if (keys == null || keys.length == 0) { + return null; + } + int length = keys.length; + boolean[] result = new boolean[length]; + for (int i = 0; i < length; i++) { + boolean temp = false; + if (!TextUtils.isEmpty(keys[i])) { + temp = mSharedPreferences.getBoolean(keys[i], false); + } + result[i] = temp; + } + return result; + } + + + public void removeValue(String... keys) { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + for (String key : keys) { + editor.remove(key); + } + editor.apply(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/StatusBarUtil.java b/common/src/main/java/com/yunbao/common/utils/StatusBarUtil.java new file mode 100644 index 000000000..545c90249 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/StatusBarUtil.java @@ -0,0 +1,172 @@ +package com.yunbao.common.utils; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * 状态栏工具类(沉浸式) + */ +public class StatusBarUtil { + + /**设置状态栏透明与字体颜色*/ + public static void setStatusBarTrans(Activity activity, boolean lightStatusBar) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + } + + ILightStatusBar IMPL; + if (MIUILightStatusBarImpl.isMe()) { + IMPL = new MIUILightStatusBarImpl(); + } else if (MeizuLightStatusBarImpl.isMe()) { + IMPL = new MeizuLightStatusBarImpl(); + } else { + IMPL = new ILightStatusBar() { + @Override + public void setLightStatusBar(Window window, boolean lightStatusBar) { + } + }; + } + IMPL.setLightStatusBar(activity.getWindow(), lightStatusBar); + } + + /**小米状态栏设置类*/ + public static class MIUILightStatusBarImpl implements ILightStatusBar { + static boolean isMe() { + return "Xiaomi".equals(Build.MANUFACTURER); + } + + public void setLightStatusBar(Window window, boolean lightStatusBar) { + Class clazz = window.getClass(); + try { + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + int darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag); + } catch (Exception e) { + } + } + } + + /**魅族状态栏设置类*/ + public static class MeizuLightStatusBarImpl implements ILightStatusBar { + static boolean isMe() { + final Method method; + try { + method = Build.class.getMethod("hasSmartBar"); + return method != null; + } catch (NoSuchMethodException e) { + } + return false; + } + + public void setLightStatusBar(Window window, boolean lightStatusBar) { + WindowManager.LayoutParams params = window.getAttributes(); + try { + Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(params); + if (lightStatusBar) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(params, value); + window.setAttributes(params); + darkFlag.setAccessible(false); + meizuFlags.setAccessible(false); + } catch (Exception e) { + } + } + } + + interface ILightStatusBar { + + void setLightStatusBar(Window window, boolean lightStatusBar); + } + + /** + * 设置状态栏的颜色 + */ + @TargetApi(21) + public static void statusBarTintColor(Activity activity, int color) { + // 代表 5.0 及以上 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(color); + return; + } + + // versionCode > 4.4 and versionCode < 5.0 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 在原来的位置上添加一个状态栏 + View statusBarView = createStatusBarView(activity); + ViewGroup androidContainer = (ViewGroup) activity.getWindow().getDecorView(); + androidContainer = (ViewGroup) androidContainer.getChildAt(0); + androidContainer.addView(statusBarView, 0); + statusBarView.setBackgroundColor(color); + } + } + + /** + * 创建一个需要填充statusBarView + */ + private static View createStatusBarView(Activity activity) { + View statusBarView = new View(activity); + ViewGroup.LayoutParams statusBarParams = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(statusBarParams); + return statusBarView; + } + + /** + * 获取状态栏的高度 + */ + public static int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + + /** + * 状态栏透明,整个界面全屏 + */ + public static void statusBarTranslucent(Activity activity) { + // 代表 5.0 及以上 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + View decorView = activity.getWindow().getDecorView(); + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + decorView.setSystemUiVisibility(option); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + return; + } + // versionCode > 4.4 and versionCode < 5.0 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/StringUtil.java b/common/src/main/java/com/yunbao/common/utils/StringUtil.java new file mode 100644 index 000000000..6074021e4 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/StringUtil.java @@ -0,0 +1,149 @@ +package com.yunbao.common.utils; + +import com.yunbao.common.CommonAppConfig; + +import java.io.File; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.Random; +import java.util.regex.Pattern; + +/** + * Created by cxf on 2018/9/28. + */ + +public class StringUtil { + private static DecimalFormat sDecimalFormat; + private static DecimalFormat sDecimalFormat2; + // private static Pattern sPattern; + private static Pattern sIntPattern; + private static Random sRandom; + private static StringBuilder sStringBuilder; + + + static { + sDecimalFormat = new DecimalFormat("#.#"); + sDecimalFormat.setRoundingMode(RoundingMode.HALF_UP); + sDecimalFormat2 = new DecimalFormat("#.##"); + sDecimalFormat2.setRoundingMode(RoundingMode.DOWN); + //sPattern = Pattern.compile("[\u4e00-\u9fa5]"); + sIntPattern = Pattern.compile("^[-\\+]?[\\d]*$"); + sRandom = new Random(); + sStringBuilder = new StringBuilder(); + } + + public static String format(double value) { + return sDecimalFormat.format(value); + } + + /** + * 把数字转化成多少万 + */ + public static String toWan(long num) { + if (num < 10000) { + return String.valueOf(num); + } + return sDecimalFormat.format(num / 10000d) + "W"; + } + + + /** + * 把数字转化成多少万 + */ + public static String toWan2(long num) { + if (num < 10000) { + return String.valueOf(num); + } + return sDecimalFormat.format(num / 10000d); + } + + /** + * 把数字转化成多少万 + */ + public static String toWan3(long num) { + if (num < 10000) { + return String.valueOf(num); + } + return sDecimalFormat2.format(num / 10000d) + "w"; + } + +// /** +// * 判断字符串中是否包含中文 +// */ +// public static boolean isContainChinese(String str) { +// Matcher m = sPattern.matcher(str); +// if (m.find()) { +// return true; +// } +// return false; +// } + + /** + * 判断一个字符串是否是数字 + */ + public static boolean isInt(String str) { + return sIntPattern.matcher(str).matches(); + } + + + /** + * 把一个long类型的总毫秒数转成时长 + */ + public static String getDurationText(long mms) { + int hours = (int) (mms / (1000 * 60 * 60)); + int minutes = (int) ((mms % (1000 * 60 * 60)) / (1000 * 60)); + int seconds = (int) ((mms % (1000 * 60)) / 1000); + sStringBuilder.delete(0, sStringBuilder.length()); + if (hours > 0) { + if (hours < 10) { + sStringBuilder.append("0"); + } + sStringBuilder.append(String.valueOf(hours)); + sStringBuilder.append(":"); + } + if (minutes > 0) { + if (minutes < 10) { + sStringBuilder.append("0"); + } + sStringBuilder.append(String.valueOf(minutes)); + sStringBuilder.append(":"); + } else { + sStringBuilder.append("00:"); + } + if (seconds > 0) { + if (seconds < 10) { + sStringBuilder.append("0"); + } + sStringBuilder.append(String.valueOf(seconds)); + } else { + sStringBuilder.append("00"); + } + return sStringBuilder.toString(); + } + + + /** + * 设置视频输出路径 + */ + public static String generateVideoOutputPath() { + String outputDir = CommonAppConfig.VIDEO_PATH; + File outputFolder = new File(outputDir); + if (!outputFolder.exists()) { + outputFolder.mkdirs(); + } + String videoName = DateFormatUtil.getVideoCurTimeString() + sRandom.nextInt(9999); + return outputDir + "android_" + CommonAppConfig.getInstance().getUid() + "_" + videoName + ".mp4"; + } + + + /** + * 多个字符串拼接 + */ + public static String contact(String... args) { + sStringBuilder.delete(0, sStringBuilder.length()); + for (String s : args) { + sStringBuilder.append(s); + } + return sStringBuilder.toString(); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/TDevice.java b/common/src/main/java/com/yunbao/common/utils/TDevice.java new file mode 100644 index 000000000..046a73c2c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/TDevice.java @@ -0,0 +1,42 @@ +package com.yunbao.common.utils; + +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.TypedValue; + +/** + * Created by Chen Haoxuan on 2022/4/30. + * 图片选择 + */ +public class TDevice { + + /** + * Change SP to PX + * + * @param resources Resources + * @param sp SP + * @return PX + */ + public static float spToPx(Resources resources, float sp) { + DisplayMetrics metrics = resources.getDisplayMetrics(); + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, metrics); + } + + /** + * Change Dip to PX + * + * @param resources Resources + * @param dp Dip + * @return PX + */ + public static float dipToPx(Resources resources, float dp) { + DisplayMetrics metrics = resources.getDisplayMetrics(); + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); + } + + + public static float pxTodip(Resources resources, float px) { + DisplayMetrics metrics = resources.getDisplayMetrics(); + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px, metrics); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/ToastUtil.java b/common/src/main/java/com/yunbao/common/utils/ToastUtil.java new file mode 100644 index 000000000..cb4fb343f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ToastUtil.java @@ -0,0 +1,67 @@ +package com.yunbao.common.utils; + +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Toast; + +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.R; + +/** + * Created by cxf on 2017/8/3. + */ + +public class ToastUtil { + + private static Toast sToast; + private static long sLastTime; + private static String sLastString; + + static { + sToast = makeToast(); + } + + private static Toast makeToast() { + Toast toast = new Toast(CommonAppContext.sInstance); + toast.setDuration(Toast.LENGTH_SHORT); + toast.setGravity(Gravity.CENTER, 0, 0); + View view = LayoutInflater.from(CommonAppContext.sInstance).inflate(R.layout.view_toast, null); + toast.setView(view); + return toast; + } + + + public static void show(int res) { + show(WordUtil.getString(res)); + } + + public static void show(String s) { + if (TextUtils.isEmpty(s)) { + return; + } + Log.i("ts","ll"); + Toast.makeText(CommonAppContext.sInstance,s,Toast.LENGTH_SHORT).show(); + Log.i("ts","22"); + +// long curTime = System.currentTimeMillis(); +// if (curTime - sLastTime > 2000) { +// sLastTime = curTime; +// sLastString = s; +//// sToast.setText(s); +//// sToast.show(); +// } else { +// if (!s.equals(sLastString)) { +// sLastTime = curTime; +// sLastString = s; +// sToast = makeToast(); +// sToast.setText(s); +// sToast.show(); +// } +// } + + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/ValidatePhoneUtil.java b/common/src/main/java/com/yunbao/common/utils/ValidatePhoneUtil.java new file mode 100644 index 000000000..5bcd85e81 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/ValidatePhoneUtil.java @@ -0,0 +1,24 @@ +package com.yunbao.common.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class ValidatePhoneUtil { + //判断手机号码的正则表达式 + private static final String MOBILE_NUM_REGEX = "^((13[0-9])|(14[0-9])|(15[^4,\\D])|(18[0-9])|(17[0-9])|(16[0-9])|(19[0-9]))\\d{8}$"; + + + /** + * 验证一个号码是不是手机号,以前这个地方是用正则判断的,现在改由服务端验证 + * + * @param mobileNumber + */ + public static boolean validateMobileNumber(String mobileNumber) { + Pattern p = Pattern.compile(MOBILE_NUM_REGEX); + Matcher m = p.matcher(mobileNumber); + return m.matches(); + } + + +} diff --git a/common/src/main/java/com/yunbao/common/utils/VersionUtil.java b/common/src/main/java/com/yunbao/common/utils/VersionUtil.java new file mode 100644 index 000000000..17908dfab --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/VersionUtil.java @@ -0,0 +1,173 @@ +package com.yunbao.common.utils; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.text.TextUtils; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.R; +import com.yunbao.common.bean.ConfigBean; + +import constant.UiType; +import model.UiConfig; +import model.UpdateConfig; +import update.UpdateAppUtils; + +/** + * Created by cxf on 2017/10/9. + */ + +public class VersionUtil { + + private static String sVersion; + + + /** + * 是否是最新版本 + */ + public static boolean isLatest(String version) { + if (TextUtils.isEmpty(version)) { + return true; + } + String curVersion = getVersion(); + if (TextUtils.isEmpty(curVersion)) { + return true; + } + int ret = curVersion.compareTo(version); + if (ret >= 0) return true; + else return false; +// return curVersion.equal(version); + } + + + //是否是谷歌版本 + public static void showDialog(final Context context, ConfigBean configBean, final String downloadUrl) { + if (configBean.getForceUpdate() != 0) { + if (CommonAppConfig.IS_GOOGLE_PLAY == false) { + if (!TextUtils.isEmpty(downloadUrl)) { + try { + UpdateAppUtils.init(context); + UpdateConfig updateConfig = new UpdateConfig(); + updateConfig.setForce(true); + updateConfig.setShowNotification(true); + updateConfig.setAlwaysShowDownLoadDialog(true); + + //UI + UiConfig uiConfig = new UiConfig(); + uiConfig.setUiType(UiType.PLENTIFUL); + UpdateAppUtils + .getInstance() + .uiConfig(uiConfig) + .apkUrl(downloadUrl) + .updateConfig(updateConfig) + .updateTitle("发现新版本") + .updateContent(configBean.getUpdateDes()) + .update(); + + } catch (Exception e) { + ToastUtil.show(R.string.version_download_url_error); + } + } else { + ToastUtil.show(R.string.version_download_url_error); + } + + //谷歌更新 + } else if (CommonAppConfig.IS_GOOGLE_PLAY == true) { + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(true) + .setClickCallback(new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + try { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); + context.startActivity(i); + } catch (Exception e) { + ToastUtil.show(R.string.version_download_url_error); + } + } + }) + .build() + .show(); + + } + } else { + if (CommonAppConfig.IS_GOOGLE_PLAY == false) { + if (!TextUtils.isEmpty(downloadUrl)) { + try { + UpdateAppUtils.init(context); + UpdateConfig updateConfig = new UpdateConfig(); + updateConfig.setShowNotification(true); + updateConfig.setAlwaysShowDownLoadDialog(true); + + //UI + UiConfig uiConfig = new UiConfig(); + uiConfig.setUiType(UiType.PLENTIFUL); + UpdateAppUtils + .getInstance() + .uiConfig(uiConfig) + .apkUrl(downloadUrl) + .updateConfig(updateConfig) + .updateTitle("新版本更新") + .updateContent(configBean.getUpdateDes()) + .update(); + + } catch (Exception e) { + ToastUtil.show(R.string.version_download_url_error); + } + } else { + ToastUtil.show(R.string.version_download_url_error); + } + }else if(CommonAppConfig.IS_GOOGLE_PLAY == true){ + DialogUitl.Builder builder = new DialogUitl.Builder(context); + builder.setTitle(WordUtil.getString(R.string.version_update)) + .setContent(configBean.getUpdateDes()) + .setConfrimString(WordUtil.getString(R.string.version_immediate_use)) + .setCancelString(WordUtil.getString(R.string.version_not_update)) + .setCancelable(true) + .setClickCallback(new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + try { + Intent i = new Intent(android.content.Intent.ACTION_VIEW); + i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu")); + context.startActivity(i); + } catch (Exception e) { + ToastUtil.show(R.string.version_download_url_error); + } + } + }) + .build() + .show(); + } + } + + } + + + /** + * 获取版本号 + */ + public static String getVersion() { + if (TextUtils.isEmpty(sVersion)) { + try { + PackageManager manager = CommonAppContext.sInstance.getPackageManager(); + PackageInfo info = manager.getPackageInfo(CommonAppContext.sInstance.getPackageName(), 0); + sVersion = info.versionName; + } catch (Exception e) { + e.printStackTrace(); + } + } + return sVersion; + } + +} diff --git a/common/src/main/java/com/yunbao/common/utils/WordUtil.java b/common/src/main/java/com/yunbao/common/utils/WordUtil.java new file mode 100644 index 000000000..cfe6c9075 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/WordUtil.java @@ -0,0 +1,23 @@ +package com.yunbao.common.utils; + +import android.content.res.Resources; + +import com.yunbao.common.CommonAppContext; + +/** + * Created by cxf on 2017/10/10. + * 获取string.xml中的字 + */ + +public class WordUtil { + + private static Resources sResources; + + static { + sResources = CommonAppContext.sInstance.getResources(); + } + + public static String getString(int res) { + return sResources.getString(res); + } +} diff --git a/common/src/main/java/com/yunbao/common/utils/formatBigNum.java b/common/src/main/java/com/yunbao/common/utils/formatBigNum.java new file mode 100644 index 000000000..7e5c3ebcc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/formatBigNum.java @@ -0,0 +1,44 @@ +package com.yunbao.common.utils; + + +import java.math.BigDecimal; + +public class formatBigNum { + + private static double ns; + public static String formatBigNum(String num) { + String o = num; + if(num!=null&&!num.equals("")) { + double f = Double.parseDouble(num); + BigDecimal b = new BigDecimal(f); + double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + if (f1 >= 10000) { + ns = f1 / 1000; + BigDecimal b1 = new BigDecimal(ns); + o = b1.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue() + "K"; + + } else { + o = num; + } + } + return o; + } + + public static String formatBigNum2(String num) { + String o = num; + if(num!=null&&!num.equals("")) { + double f = Double.parseDouble(num); + BigDecimal b = new BigDecimal(f); + double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + if (f1 >= 100000) { + ns = f1 / 1000; + BigDecimal b1 = new BigDecimal(ns); + o = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "K"; + + } else { + o = num; + } + } + return o; + } +} diff --git a/common/src/main/java/com/yunbao/common/views/AbsMainViewHolder.java b/common/src/main/java/com/yunbao/common/views/AbsMainViewHolder.java new file mode 100644 index 000000000..dc8124c46 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/AbsMainViewHolder.java @@ -0,0 +1,38 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.view.ViewGroup; + +/** + * Created by cxf on 2018/10/26. + */ + +public abstract class AbsMainViewHolder extends AbsViewHolder { + + protected boolean mFirstLoadData = true; + private boolean mShowed; + + public AbsMainViewHolder(Context context, ViewGroup parentView) { + super(context, parentView); + } + + public void loadData() { + } + + protected boolean isFirstLoadData() { + if (mFirstLoadData) { + mFirstLoadData = false; + return true; + } + return false; + } + + + public void setShowed(boolean showed) { + mShowed = showed; + } + + public boolean isShowed() { + return mShowed; + } +} diff --git a/common/src/main/java/com/yunbao/common/views/AbsViewHolder.java b/common/src/main/java/com/yunbao/common/views/AbsViewHolder.java new file mode 100644 index 000000000..30a155779 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/AbsViewHolder.java @@ -0,0 +1,135 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import com.yunbao.common.activity.AbsActivity; +import com.yunbao.common.interfaces.LifeCycleListener; +import com.yunbao.common.utils.ClickUtil; +import com.yunbao.common.utils.L; + +/** + * Created by cxf on 2018/9/22. pkContainer + */ + +public abstract class AbsViewHolder implements LifeCycleListener { + + private String mTag; + protected Context mContext; + protected ViewGroup mParentView; + protected View mContentView; + + public AbsViewHolder(Context context, ViewGroup parentView) { + mTag = getClass().getSimpleName(); + mContext = context; + mParentView = parentView; + mContentView = LayoutInflater.from(context).inflate(getLayoutId(), mParentView, false); + init(); + } + + public AbsViewHolder(Context context, ViewGroup parentView, Object... args) { + mTag = getClass().getSimpleName(); + processArguments(args); + mContext = context; + mParentView = parentView; + mContentView = LayoutInflater.from(context).inflate(getLayoutId(), mParentView, false); + init(); + } + + protected void processArguments(Object... args) { + + } + + protected abstract int getLayoutId(); + + public abstract void init(); + + protected View findViewById(int res) { + return mContentView.findViewById(res); + } + + public View getContentView() { + return mContentView; + } + + protected boolean canClick() { + return ClickUtil.canClick(); + } + + public void addToParent() { + if (mParentView != null && mContentView != null) { + mParentView.addView(mContentView); + } + } + + public void removeFromParent() { + ViewParent parent = mContentView.getParent(); + if (parent != null) { + ((ViewGroup) parent).removeView(mContentView); + } + } + + /** + * 订阅Activity的生命周期 + */ + public void subscribeActivityLifeCycle() { + if (mContext instanceof AbsActivity) { + ((AbsActivity) mContext).addLifeCycleListener(this); + } + } + + /** + * 取消订阅Activity的生命周期 + */ + public void unSubscribeActivityLifeCycle() { + if (mContext instanceof AbsActivity) { + ((AbsActivity) mContext).removeLifeCycleListener(this); + } + } + + /** + * 释放资源 + */ + public void release() { + L.e(mTag, "release-------->"); + } + + @Override + public void onCreate() { + L.e(mTag, "lifeCycle-----onCreate----->"); + } + + @Override + public void onStart() { + L.e(mTag, "lifeCycle-----onStart----->"); + } + + @Override + public void onReStart() { + L.e(mTag, "lifeCycle-----onReStart----->"); + } + + @Override + public void onResume() { + L.e(mTag, "lifeCycle-----onResume----->"); + } + + @Override + public void onPause() { + L.e(mTag, "lifeCycle-----onPause----->"); + } + + @Override + public void onStop() { + L.e(mTag, "lifeCycle-----onStop----->"); + } + + @Override + public void onDestroy() { + L.e(mTag, "lifeCycle-----onDestroy----->"); + } + +} diff --git a/common/src/main/java/com/yunbao/common/views/CustomViewHolder.java b/common/src/main/java/com/yunbao/common/views/CustomViewHolder.java new file mode 100644 index 000000000..3e650f583 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/CustomViewHolder.java @@ -0,0 +1,28 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.ms.banner.holder.BannerViewHolder; +import com.yunbao.common.bean.BannerBean; + +public class CustomViewHolder implements BannerViewHolder { + + @Override + public View createView(Context context, int position, BannerBean data) { + // 返回mImageView页面布局 + ImageView imageView = new ImageView(context); + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT + ); + imageView.setLayoutParams(params); + imageView.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(context).load(data.getImageUrl()).into(imageView); + + return imageView; + } + +} diff --git a/common/src/main/jniLibs/arm64-v8a/libTRAECodec.so b/common/src/main/jniLibs/arm64-v8a/libTRAECodec.so new file mode 100644 index 000000000..561847128 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libTRAECodec.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libliteavsdk.so b/common/src/main/jniLibs/arm64-v8a/libliteavsdk.so new file mode 100644 index 000000000..b10d74701 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libliteavsdk.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libsaturn.so b/common/src/main/jniLibs/arm64-v8a/libsaturn.so new file mode 100644 index 000000000..2c283f9fe Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libsaturn.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libstlport_shared.so b/common/src/main/jniLibs/arm64-v8a/libstlport_shared.so new file mode 100644 index 000000000..4eb1ff6e4 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libstlport_shared.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libtencentloc.so b/common/src/main/jniLibs/arm64-v8a/libtencentloc.so new file mode 100644 index 000000000..43e9e99c3 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libtencentloc.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libtraeimp-rtmp.so b/common/src/main/jniLibs/arm64-v8a/libtraeimp-rtmp.so new file mode 100644 index 000000000..9e2c6e31e Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libtraeimp-rtmp.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libtxffmpeg.so b/common/src/main/jniLibs/arm64-v8a/libtxffmpeg.so new file mode 100644 index 000000000..a646ea0c6 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libtxffmpeg.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libtxplayer.so b/common/src/main/jniLibs/arm64-v8a/libtxplayer.so new file mode 100644 index 000000000..9acc21b57 Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libtxplayer.so differ diff --git a/common/src/main/jniLibs/arm64-v8a/libtxsdl.so b/common/src/main/jniLibs/arm64-v8a/libtxsdl.so new file mode 100644 index 000000000..75bbd1e5f Binary files /dev/null and b/common/src/main/jniLibs/arm64-v8a/libtxsdl.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libTRAECodec.so b/common/src/main/jniLibs/armeabi-v7a/libTRAECodec.so new file mode 100644 index 000000000..e648a2765 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libTRAECodec.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libliteavsdk.so b/common/src/main/jniLibs/armeabi-v7a/libliteavsdk.so new file mode 100644 index 000000000..c57e2f009 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libliteavsdk.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libsaturn.so b/common/src/main/jniLibs/armeabi-v7a/libsaturn.so new file mode 100644 index 000000000..2f530a2ad Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libsaturn.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libstlport_shared.so b/common/src/main/jniLibs/armeabi-v7a/libstlport_shared.so new file mode 100644 index 000000000..0dacc922e Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libstlport_shared.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libtencentloc.so b/common/src/main/jniLibs/armeabi-v7a/libtencentloc.so new file mode 100644 index 000000000..490c0b6b3 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libtencentloc.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libtraeimp-rtmp.so b/common/src/main/jniLibs/armeabi-v7a/libtraeimp-rtmp.so new file mode 100644 index 000000000..014c0a1b5 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libtraeimp-rtmp.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libtxffmpeg.so b/common/src/main/jniLibs/armeabi-v7a/libtxffmpeg.so new file mode 100644 index 000000000..b72357b30 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libtxffmpeg.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libtxplayer.so b/common/src/main/jniLibs/armeabi-v7a/libtxplayer.so new file mode 100644 index 000000000..d9dd1c11f Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libtxplayer.so differ diff --git a/common/src/main/jniLibs/armeabi-v7a/libtxsdl.so b/common/src/main/jniLibs/armeabi-v7a/libtxsdl.so new file mode 100644 index 000000000..b5bccdc79 Binary files /dev/null and b/common/src/main/jniLibs/armeabi-v7a/libtxsdl.so differ diff --git a/common/src/main/res/anim/bottomview_anim_enter.xml b/common/src/main/res/anim/bottomview_anim_enter.xml new file mode 100644 index 000000000..145134755 --- /dev/null +++ b/common/src/main/res/anim/bottomview_anim_enter.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/bottomview_anim_enter_2.xml b/common/src/main/res/anim/bottomview_anim_enter_2.xml new file mode 100644 index 000000000..fb537b8de --- /dev/null +++ b/common/src/main/res/anim/bottomview_anim_enter_2.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/bottomview_anim_exit.xml b/common/src/main/res/anim/bottomview_anim_exit.xml new file mode 100644 index 000000000..d249ae939 --- /dev/null +++ b/common/src/main/res/anim/bottomview_anim_exit.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/bottomview_anim_exit_2.xml b/common/src/main/res/anim/bottomview_anim_exit_2.xml new file mode 100644 index 000000000..3fc415cd1 --- /dev/null +++ b/common/src/main/res/anim/bottomview_anim_exit_2.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/left_anim_enter.xml b/common/src/main/res/anim/left_anim_enter.xml new file mode 100644 index 000000000..afb5ffaee --- /dev/null +++ b/common/src/main/res/anim/left_anim_enter.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/left_anim_exit.xml b/common/src/main/res/anim/left_anim_exit.xml new file mode 100644 index 000000000..6df9417e5 --- /dev/null +++ b/common/src/main/res/anim/left_anim_exit.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/color/fg_btn_follow.xml b/common/src/main/res/color/fg_btn_follow.xml new file mode 100644 index 000000000..d36a9ca68 --- /dev/null +++ b/common/src/main/res/color/fg_btn_follow.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/anim_loading.xml b/common/src/main/res/drawable/anim_loading.xml new file mode 100644 index 000000000..5ac1eec81 --- /dev/null +++ b/common/src/main/res/drawable/anim_loading.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/common/src/main/res/drawable/background_ff50715.xml b/common/src/main/res/drawable/background_ff50715.xml new file mode 100644 index 000000000..bdc704372 --- /dev/null +++ b/common/src/main/res/drawable/background_ff50715.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/common/src/main/res/drawable/bg_btn_chat_charge.xml b/common/src/main/res/drawable/bg_btn_chat_charge.xml new file mode 100644 index 000000000..2b834c4c8 --- /dev/null +++ b/common/src/main/res/drawable/bg_btn_chat_charge.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_btn_common_small.xml b/common/src/main/res/drawable/bg_btn_common_small.xml new file mode 100644 index 000000000..8b1523d82 --- /dev/null +++ b/common/src/main/res/drawable/bg_btn_common_small.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_btn_follow.xml b/common/src/main/res/drawable/bg_btn_follow.xml new file mode 100644 index 000000000..a24c673f9 --- /dev/null +++ b/common/src/main/res/drawable/bg_btn_follow.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_btn_follow_2.xml b/common/src/main/res/drawable/bg_btn_follow_2.xml new file mode 100644 index 000000000..79a701c73 --- /dev/null +++ b/common/src/main/res/drawable/bg_btn_follow_2.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_chat_btn_face.xml b/common/src/main/res/drawable/bg_chat_btn_face.xml new file mode 100644 index 000000000..7d48203ee --- /dev/null +++ b/common/src/main/res/drawable/bg_chat_btn_face.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_chat_face_item.xml b/common/src/main/res/drawable/bg_chat_face_item.xml new file mode 100644 index 000000000..ff2762b85 --- /dev/null +++ b/common/src/main/res/drawable/bg_chat_face_item.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_coin_item_0.xml b/common/src/main/res/drawable/bg_coin_item_0.xml new file mode 100644 index 000000000..a0e500702 --- /dev/null +++ b/common/src/main/res/drawable/bg_coin_item_0.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_coin_item_1.xml b/common/src/main/res/drawable/bg_coin_item_1.xml new file mode 100644 index 000000000..2c4fb1a9e --- /dev/null +++ b/common/src/main/res/drawable/bg_coin_item_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/common/src/main/res/drawable/bg_dialog.xml b/common/src/main/res/drawable/bg_dialog.xml new file mode 100644 index 000000000..e9a1f2cba --- /dev/null +++ b/common/src/main/res/drawable/bg_dialog.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_dialog_2.xml b/common/src/main/res/drawable/bg_dialog_2.xml new file mode 100644 index 000000000..4fd926538 --- /dev/null +++ b/common/src/main/res/drawable/bg_dialog_2.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_dialog_chat_charge.xml b/common/src/main/res/drawable/bg_dialog_chat_charge.xml new file mode 100644 index 000000000..c82e6b551 --- /dev/null +++ b/common/src/main/res/drawable/bg_dialog_chat_charge.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_dialog_chat_charge_pay.xml b/common/src/main/res/drawable/bg_dialog_chat_charge_pay.xml new file mode 100644 index 000000000..3e4f44a66 --- /dev/null +++ b/common/src/main/res/drawable/bg_dialog_chat_charge_pay.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_dialog_input.xml b/common/src/main/res/drawable/bg_dialog_input.xml new file mode 100644 index 000000000..626afdede --- /dev/null +++ b/common/src/main/res/drawable/bg_dialog_input.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_horizontal_progressbar.xml b/common/src/main/res/drawable/bg_horizontal_progressbar.xml new file mode 100644 index 000000000..555dd0f51 --- /dev/null +++ b/common/src/main/res/drawable/bg_horizontal_progressbar.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_list_btn.xml b/common/src/main/res/drawable/bg_list_btn.xml new file mode 100644 index 000000000..ae28c3e59 --- /dev/null +++ b/common/src/main/res/drawable/bg_list_btn.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_list_head.xml b/common/src/main/res/drawable/bg_list_head.xml new file mode 100644 index 000000000..02dbcde19 --- /dev/null +++ b/common/src/main/res/drawable/bg_list_head.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_live_chat_indicator.xml b/common/src/main/res/drawable/bg_live_chat_indicator.xml new file mode 100644 index 000000000..3a3287e69 --- /dev/null +++ b/common/src/main/res/drawable/bg_live_chat_indicator.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_loading_dialog.xml b/common/src/main/res/drawable/bg_loading_dialog.xml new file mode 100644 index 000000000..732e91049 --- /dev/null +++ b/common/src/main/res/drawable/bg_loading_dialog.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common/src/main/res/drawable/bg_red_point.xml b/common/src/main/res/drawable/bg_red_point.xml new file mode 100644 index 000000000..d4c186838 --- /dev/null +++ b/common/src/main/res/drawable/bg_red_point.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_toast.xml b/common/src/main/res/drawable/bg_toast.xml new file mode 100644 index 000000000..a5fceb5af --- /dev/null +++ b/common/src/main/res/drawable/bg_toast.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/btn_reload.xml b/common/src/main/res/drawable/btn_reload.xml new file mode 100644 index 000000000..f422ec40c --- /dev/null +++ b/common/src/main/res/drawable/btn_reload.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/dr1.xml b/common/src/main/res/drawable/dr1.xml new file mode 100644 index 000000000..cee8a8e99 --- /dev/null +++ b/common/src/main/res/drawable/dr1.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/dr2.xml b/common/src/main/res/drawable/dr2.xml new file mode 100644 index 000000000..e44300abb --- /dev/null +++ b/common/src/main/res/drawable/dr2.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/dr3.xml b/common/src/main/res/drawable/dr3.xml new file mode 100644 index 000000000..446269f47 --- /dev/null +++ b/common/src/main/res/drawable/dr3.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/dr4.xml b/common/src/main/res/drawable/dr4.xml new file mode 100644 index 000000000..f24e57e0a --- /dev/null +++ b/common/src/main/res/drawable/dr4.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/dr5.xml b/common/src/main/res/drawable/dr5.xml new file mode 100644 index 000000000..9953380be --- /dev/null +++ b/common/src/main/res/drawable/dr5.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/ic_camera.png b/common/src/main/res/drawable/ic_camera.png new file mode 100644 index 000000000..442178fa6 Binary files /dev/null and b/common/src/main/res/drawable/ic_camera.png differ diff --git a/common/src/main/res/drawable/ic_chb_normal.png b/common/src/main/res/drawable/ic_chb_normal.png new file mode 100644 index 000000000..ff724f9a2 Binary files /dev/null and b/common/src/main/res/drawable/ic_chb_normal.png differ diff --git a/common/src/main/res/drawable/ic_chb_selectd.png b/common/src/main/res/drawable/ic_chb_selectd.png new file mode 100644 index 000000000..2539d1bd1 Binary files /dev/null and b/common/src/main/res/drawable/ic_chb_selectd.png differ diff --git a/common/src/main/res/drawable/ic_check_background.xml b/common/src/main/res/drawable/ic_check_background.xml new file mode 100644 index 000000000..7639acc56 --- /dev/null +++ b/common/src/main/res/drawable/ic_check_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/ic_default_image.png b/common/src/main/res/drawable/ic_default_image.png new file mode 100644 index 000000000..1f7ad00ee Binary files /dev/null and b/common/src/main/res/drawable/ic_default_image.png differ diff --git a/common/src/main/res/drawable/icon_chat_charge_pay_1.xml b/common/src/main/res/drawable/icon_chat_charge_pay_1.xml new file mode 100644 index 000000000..91aa68ded --- /dev/null +++ b/common/src/main/res/drawable/icon_chat_charge_pay_1.xml @@ -0,0 +1,5 @@ + + diff --git a/common/src/main/res/drawable/icon_link_mic.png b/common/src/main/res/drawable/icon_link_mic.png new file mode 100644 index 000000000..19a37cc92 Binary files /dev/null and b/common/src/main/res/drawable/icon_link_mic.png differ diff --git a/common/src/main/res/drawable/icon_wish_player.png b/common/src/main/res/drawable/icon_wish_player.png new file mode 100644 index 000000000..3abcbd9b1 Binary files /dev/null and b/common/src/main/res/drawable/icon_wish_player.png differ diff --git a/common/src/main/res/drawable/iconfh_left_white.png b/common/src/main/res/drawable/iconfh_left_white.png new file mode 100644 index 000000000..a1542bae2 Binary files /dev/null and b/common/src/main/res/drawable/iconfh_left_white.png differ diff --git a/common/src/main/res/drawable/login_btn.xml b/common/src/main/res/drawable/login_btn.xml new file mode 100644 index 000000000..cad625ba2 --- /dev/null +++ b/common/src/main/res/drawable/login_btn.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/question_medal.png b/common/src/main/res/drawable/question_medal.png new file mode 100644 index 000000000..c4376e467 Binary files /dev/null and b/common/src/main/res/drawable/question_medal.png differ diff --git a/common/src/main/res/layout/activity_empty.xml b/common/src/main/res/layout/activity_empty.xml new file mode 100644 index 000000000..47938b75d --- /dev/null +++ b/common/src/main/res/layout/activity_empty.xml @@ -0,0 +1,7 @@ + + diff --git a/common/src/main/res/layout/activity_error.xml b/common/src/main/res/layout/activity_error.xml new file mode 100644 index 000000000..29cf45200 --- /dev/null +++ b/common/src/main/res/layout/activity_error.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_preview_image.xml b/common/src/main/res/layout/activity_preview_image.xml new file mode 100644 index 000000000..e1eafe8e5 --- /dev/null +++ b/common/src/main/res/layout/activity_preview_image.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_preview_video.xml b/common/src/main/res/layout/activity_preview_video.xml new file mode 100644 index 000000000..4c794231a --- /dev/null +++ b/common/src/main/res/layout/activity_preview_video.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_select_image.xml b/common/src/main/res/layout/activity_select_image.xml new file mode 100644 index 000000000..3a5fb625a --- /dev/null +++ b/common/src/main/res/layout/activity_select_image.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/src/main/res/layout/activity_webview.xml b/common/src/main/res/layout/activity_webview.xml new file mode 100644 index 000000000..c67a6132b --- /dev/null +++ b/common/src/main/res/layout/activity_webview.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_webview_medal.xml b/common/src/main/res/layout/activity_webview_medal.xml new file mode 100644 index 000000000..c6c69f6a5 --- /dev/null +++ b/common/src/main/res/layout/activity_webview_medal.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_webview_my.xml b/common/src/main/res/layout/activity_webview_my.xml new file mode 100644 index 000000000..1a0b701e3 --- /dev/null +++ b/common/src/main/res/layout/activity_webview_my.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_chat_charge.xml b/common/src/main/res/layout/dialog_chat_charge.xml new file mode 100644 index 000000000..202c43a64 --- /dev/null +++ b/common/src/main/res/layout/dialog_chat_charge.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_chat_charge_pay.xml b/common/src/main/res/layout/dialog_chat_charge_pay.xml new file mode 100644 index 000000000..44e51eed6 --- /dev/null +++ b/common/src/main/res/layout/dialog_chat_charge_pay.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_date_picker.xml b/common/src/main/res/layout/dialog_date_picker.xml new file mode 100644 index 000000000..48b37bcd8 --- /dev/null +++ b/common/src/main/res/layout/dialog_date_picker.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_input.xml b/common/src/main/res/layout/dialog_input.xml new file mode 100644 index 000000000..e85e83a9f --- /dev/null +++ b/common/src/main/res/layout/dialog_input.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_loading.xml b/common/src/main/res/layout/dialog_loading.xml new file mode 100644 index 000000000..826b51fb0 --- /dev/null +++ b/common/src/main/res/layout/dialog_loading.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_login_loading.xml b/common/src/main/res/layout/dialog_login_loading.xml new file mode 100644 index 000000000..b1a307b69 --- /dev/null +++ b/common/src/main/res/layout/dialog_login_loading.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_simple.xml b/common/src/main/res/layout/dialog_simple.xml new file mode 100644 index 000000000..3b6c47c1a --- /dev/null +++ b/common/src/main/res/layout/dialog_simple.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_simple_tip.xml b/common/src/main/res/layout/dialog_simple_tip.xml new file mode 100644 index 000000000..7568b1e3d --- /dev/null +++ b/common/src/main/res/layout/dialog_simple_tip.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_string_array.xml b/common/src/main/res/layout/dialog_string_array.xml new file mode 100644 index 000000000..61a19611b --- /dev/null +++ b/common/src/main/res/layout/dialog_string_array.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/image_folder_layout.xml b/common/src/main/res/layout/image_folder_layout.xml new file mode 100644 index 000000000..ec161c9ff --- /dev/null +++ b/common/src/main/res/layout/image_folder_layout.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_chat_charge_pay.xml b/common/src/main/res/layout/item_chat_charge_pay.xml new file mode 100644 index 000000000..392a18dcb --- /dev/null +++ b/common/src/main/res/layout/item_chat_charge_pay.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_chat_charge_pay2.xml b/common/src/main/res/layout/item_chat_charge_pay2.xml new file mode 100644 index 000000000..064748b47 --- /dev/null +++ b/common/src/main/res/layout/item_chat_charge_pay2.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_coin.xml b/common/src/main/res/layout/item_coin.xml new file mode 100644 index 000000000..321f65392 --- /dev/null +++ b/common/src/main/res/layout/item_coin.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_coin_pay.xml b/common/src/main/res/layout/item_coin_pay.xml new file mode 100644 index 000000000..53a0b5410 --- /dev/null +++ b/common/src/main/res/layout/item_coin_pay.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_coin_pay2.xml b/common/src/main/res/layout/item_coin_pay2.xml new file mode 100644 index 000000000..acc7f4d0a --- /dev/null +++ b/common/src/main/res/layout/item_coin_pay2.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_list_camera.xml b/common/src/main/res/layout/item_list_camera.xml new file mode 100644 index 000000000..eb4b01721 --- /dev/null +++ b/common/src/main/res/layout/item_list_camera.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_list_face.xml b/common/src/main/res/layout/item_list_face.xml new file mode 100644 index 000000000..4616a7b60 --- /dev/null +++ b/common/src/main/res/layout/item_list_face.xml @@ -0,0 +1,9 @@ + + diff --git a/common/src/main/res/layout/item_list_folder.xml b/common/src/main/res/layout/item_list_folder.xml new file mode 100644 index 000000000..c67e2eb05 --- /dev/null +++ b/common/src/main/res/layout/item_list_folder.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/item_list_image.xml b/common/src/main/res/layout/item_list_image.xml new file mode 100644 index 000000000..91b9284e2 --- /dev/null +++ b/common/src/main/res/layout/item_list_image.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_chat_face.xml b/common/src/main/res/layout/view_chat_face.xml new file mode 100644 index 000000000..84ed19bda --- /dev/null +++ b/common/src/main/res/layout/view_chat_face.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_chat_face_page.xml b/common/src/main/res/layout/view_chat_face_page.xml new file mode 100644 index 000000000..b192db243 --- /dev/null +++ b/common/src/main/res/layout/view_chat_face_page.xml @@ -0,0 +1,9 @@ + + diff --git a/common/src/main/res/layout/view_chat_indicator.xml b/common/src/main/res/layout/view_chat_indicator.xml new file mode 100644 index 000000000..8bd0b21dc --- /dev/null +++ b/common/src/main/res/layout/view_chat_indicator.xml @@ -0,0 +1,11 @@ + + diff --git a/common/src/main/res/layout/view_no_data_default.xml b/common/src/main/res/layout/view_no_data_default.xml new file mode 100644 index 000000000..9e246bdbf --- /dev/null +++ b/common/src/main/res/layout/view_no_data_default.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_no_data_search.xml b/common/src/main/res/layout/view_no_data_search.xml new file mode 100644 index 000000000..9c6aba6e9 --- /dev/null +++ b/common/src/main/res/layout/view_no_data_search.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_refresh_default.xml b/common/src/main/res/layout/view_refresh_default.xml new file mode 100644 index 000000000..c3e03f8b6 --- /dev/null +++ b/common/src/main/res/layout/view_refresh_default.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_title.xml b/common/src/main/res/layout/view_title.xml new file mode 100644 index 000000000..dbb315a52 --- /dev/null +++ b/common/src/main/res/layout/view_title.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/common/src/main/res/layout/view_toast.xml b/common/src/main/res/layout/view_toast.xml new file mode 100644 index 000000000..6370c23ab --- /dev/null +++ b/common/src/main/res/layout/view_toast.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/mipmap-hdpi/face_001.png b/common/src/main/res/mipmap-hdpi/face_001.png new file mode 100644 index 000000000..eb1792b9c Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_001.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_002.png b/common/src/main/res/mipmap-hdpi/face_002.png new file mode 100644 index 000000000..e65d406e8 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_002.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_003.png b/common/src/main/res/mipmap-hdpi/face_003.png new file mode 100644 index 000000000..612c5c2d2 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_003.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_004.png b/common/src/main/res/mipmap-hdpi/face_004.png new file mode 100644 index 000000000..a2d486be1 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_004.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_005.png b/common/src/main/res/mipmap-hdpi/face_005.png new file mode 100644 index 000000000..ffb9cde5f Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_005.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_006.png b/common/src/main/res/mipmap-hdpi/face_006.png new file mode 100644 index 000000000..69de76215 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_006.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_007.png b/common/src/main/res/mipmap-hdpi/face_007.png new file mode 100644 index 000000000..e421a027e Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_007.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_008.png b/common/src/main/res/mipmap-hdpi/face_008.png new file mode 100644 index 000000000..bbf639c3f Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_008.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_009.png b/common/src/main/res/mipmap-hdpi/face_009.png new file mode 100644 index 000000000..85e1e3ac3 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_009.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_010.png b/common/src/main/res/mipmap-hdpi/face_010.png new file mode 100644 index 000000000..393abee40 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_010.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_011.png b/common/src/main/res/mipmap-hdpi/face_011.png new file mode 100644 index 000000000..9bd26a1b8 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_011.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_012.png b/common/src/main/res/mipmap-hdpi/face_012.png new file mode 100644 index 000000000..2ce046dac Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_012.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_013.png b/common/src/main/res/mipmap-hdpi/face_013.png new file mode 100644 index 000000000..d891e2362 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_013.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_014.png b/common/src/main/res/mipmap-hdpi/face_014.png new file mode 100644 index 000000000..0ab06c7eb Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_014.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_015.png b/common/src/main/res/mipmap-hdpi/face_015.png new file mode 100644 index 000000000..cc6976318 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_015.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_016.png b/common/src/main/res/mipmap-hdpi/face_016.png new file mode 100644 index 000000000..c3d5dae2a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_016.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_017.png b/common/src/main/res/mipmap-hdpi/face_017.png new file mode 100644 index 000000000..8913505cb Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_017.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_018.png b/common/src/main/res/mipmap-hdpi/face_018.png new file mode 100644 index 000000000..3dd05fe7e Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_018.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_019.png b/common/src/main/res/mipmap-hdpi/face_019.png new file mode 100644 index 000000000..cb276c86a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_019.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_020.png b/common/src/main/res/mipmap-hdpi/face_020.png new file mode 100644 index 000000000..a4d921680 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_020.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_021.png b/common/src/main/res/mipmap-hdpi/face_021.png new file mode 100644 index 000000000..330c5e26d Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_021.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_022.png b/common/src/main/res/mipmap-hdpi/face_022.png new file mode 100644 index 000000000..02406676a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_022.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_023.png b/common/src/main/res/mipmap-hdpi/face_023.png new file mode 100644 index 000000000..0b2f4bad9 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_023.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_024.png b/common/src/main/res/mipmap-hdpi/face_024.png new file mode 100644 index 000000000..0fc98900c Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_024.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_025.png b/common/src/main/res/mipmap-hdpi/face_025.png new file mode 100644 index 000000000..86b236536 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_025.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_026.png b/common/src/main/res/mipmap-hdpi/face_026.png new file mode 100644 index 000000000..6abad58e9 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_026.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_027.png b/common/src/main/res/mipmap-hdpi/face_027.png new file mode 100644 index 000000000..789e340ea Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_027.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_028.png b/common/src/main/res/mipmap-hdpi/face_028.png new file mode 100644 index 000000000..94c7f74da Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_028.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_029.png b/common/src/main/res/mipmap-hdpi/face_029.png new file mode 100644 index 000000000..b11565372 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_029.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_030.png b/common/src/main/res/mipmap-hdpi/face_030.png new file mode 100644 index 000000000..5b146f256 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_030.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_031.png b/common/src/main/res/mipmap-hdpi/face_031.png new file mode 100644 index 000000000..712d08451 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_031.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_032.png b/common/src/main/res/mipmap-hdpi/face_032.png new file mode 100644 index 000000000..110ebdaa8 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_032.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_033.png b/common/src/main/res/mipmap-hdpi/face_033.png new file mode 100644 index 000000000..bb2b8004c Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_033.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_034.png b/common/src/main/res/mipmap-hdpi/face_034.png new file mode 100644 index 000000000..095e34d59 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_034.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_035.png b/common/src/main/res/mipmap-hdpi/face_035.png new file mode 100644 index 000000000..2bbec3dcb Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_035.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_036.png b/common/src/main/res/mipmap-hdpi/face_036.png new file mode 100644 index 000000000..1e1a20ab8 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_036.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_037.png b/common/src/main/res/mipmap-hdpi/face_037.png new file mode 100644 index 000000000..a5ede4d36 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_037.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_038.png b/common/src/main/res/mipmap-hdpi/face_038.png new file mode 100644 index 000000000..7551601d8 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_038.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_039.png b/common/src/main/res/mipmap-hdpi/face_039.png new file mode 100644 index 000000000..b3268a20d Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_039.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_040.png b/common/src/main/res/mipmap-hdpi/face_040.png new file mode 100644 index 000000000..16a6083cb Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_040.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_041.png b/common/src/main/res/mipmap-hdpi/face_041.png new file mode 100644 index 000000000..dc6c07075 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_041.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_042.png b/common/src/main/res/mipmap-hdpi/face_042.png new file mode 100644 index 000000000..6a228460a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_042.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_043.png b/common/src/main/res/mipmap-hdpi/face_043.png new file mode 100644 index 000000000..717f1db2e Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_043.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_044.png b/common/src/main/res/mipmap-hdpi/face_044.png new file mode 100644 index 000000000..fed4afbcc Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_044.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_045.png b/common/src/main/res/mipmap-hdpi/face_045.png new file mode 100644 index 000000000..1fe2a40e9 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_045.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_046.png b/common/src/main/res/mipmap-hdpi/face_046.png new file mode 100644 index 000000000..6092a6cbb Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_046.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_047.png b/common/src/main/res/mipmap-hdpi/face_047.png new file mode 100644 index 000000000..64020282f Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_047.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_048.png b/common/src/main/res/mipmap-hdpi/face_048.png new file mode 100644 index 000000000..3dde582ed Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_048.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_049.png b/common/src/main/res/mipmap-hdpi/face_049.png new file mode 100644 index 000000000..076a3b75a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_049.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_050.png b/common/src/main/res/mipmap-hdpi/face_050.png new file mode 100644 index 000000000..803cd4845 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_050.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_051.png b/common/src/main/res/mipmap-hdpi/face_051.png new file mode 100644 index 000000000..e9e4888ba Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_051.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_052.png b/common/src/main/res/mipmap-hdpi/face_052.png new file mode 100644 index 000000000..c1dade856 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_052.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_053.png b/common/src/main/res/mipmap-hdpi/face_053.png new file mode 100644 index 000000000..1daccc2c4 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_053.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_054.png b/common/src/main/res/mipmap-hdpi/face_054.png new file mode 100644 index 000000000..8f0495793 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_054.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_055.png b/common/src/main/res/mipmap-hdpi/face_055.png new file mode 100644 index 000000000..5f1083d6a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_055.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_056.png b/common/src/main/res/mipmap-hdpi/face_056.png new file mode 100644 index 000000000..ee1bb44b2 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_056.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_057.png b/common/src/main/res/mipmap-hdpi/face_057.png new file mode 100644 index 000000000..406ab1958 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_057.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_058.png b/common/src/main/res/mipmap-hdpi/face_058.png new file mode 100644 index 000000000..afd445cd0 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_058.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_059.png b/common/src/main/res/mipmap-hdpi/face_059.png new file mode 100644 index 000000000..242efe524 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_059.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_060.png b/common/src/main/res/mipmap-hdpi/face_060.png new file mode 100644 index 000000000..8e49272ae Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_060.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_061.png b/common/src/main/res/mipmap-hdpi/face_061.png new file mode 100644 index 000000000..29806760a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_061.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_062.png b/common/src/main/res/mipmap-hdpi/face_062.png new file mode 100644 index 000000000..c03b9ebdc Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_062.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_063.png b/common/src/main/res/mipmap-hdpi/face_063.png new file mode 100644 index 000000000..45c1d6941 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_063.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_064.png b/common/src/main/res/mipmap-hdpi/face_064.png new file mode 100644 index 000000000..5eb25a8aa Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_064.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_065.png b/common/src/main/res/mipmap-hdpi/face_065.png new file mode 100644 index 000000000..d9a5d447a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_065.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_066.png b/common/src/main/res/mipmap-hdpi/face_066.png new file mode 100644 index 000000000..e67078a64 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_066.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_067.png b/common/src/main/res/mipmap-hdpi/face_067.png new file mode 100644 index 000000000..2a756b97b Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_067.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_068.png b/common/src/main/res/mipmap-hdpi/face_068.png new file mode 100644 index 000000000..096ae2b11 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_068.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_069.png b/common/src/main/res/mipmap-hdpi/face_069.png new file mode 100644 index 000000000..fff28194d Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_069.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_070.png b/common/src/main/res/mipmap-hdpi/face_070.png new file mode 100644 index 000000000..32b347ac3 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_070.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_071.png b/common/src/main/res/mipmap-hdpi/face_071.png new file mode 100644 index 000000000..941090abe Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_071.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_072.png b/common/src/main/res/mipmap-hdpi/face_072.png new file mode 100644 index 000000000..802710d0b Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_072.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_073.png b/common/src/main/res/mipmap-hdpi/face_073.png new file mode 100644 index 000000000..eeed17535 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_073.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_074.png b/common/src/main/res/mipmap-hdpi/face_074.png new file mode 100644 index 000000000..526001c40 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_074.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_075.png b/common/src/main/res/mipmap-hdpi/face_075.png new file mode 100644 index 000000000..dd5cbd31b Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_075.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_076.png b/common/src/main/res/mipmap-hdpi/face_076.png new file mode 100644 index 000000000..758110101 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_076.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_077.png b/common/src/main/res/mipmap-hdpi/face_077.png new file mode 100644 index 000000000..9c5eb2a77 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_077.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_078.png b/common/src/main/res/mipmap-hdpi/face_078.png new file mode 100644 index 000000000..0a3b81a2a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_078.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_079.png b/common/src/main/res/mipmap-hdpi/face_079.png new file mode 100644 index 000000000..256f59de5 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_079.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_080.png b/common/src/main/res/mipmap-hdpi/face_080.png new file mode 100644 index 000000000..96c83f680 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_080.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_081.png b/common/src/main/res/mipmap-hdpi/face_081.png new file mode 100644 index 000000000..c2b4c46f6 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_081.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_082.png b/common/src/main/res/mipmap-hdpi/face_082.png new file mode 100644 index 000000000..77b583130 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_082.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_083.png b/common/src/main/res/mipmap-hdpi/face_083.png new file mode 100644 index 000000000..2094b0d9a Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_083.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_084.png b/common/src/main/res/mipmap-hdpi/face_084.png new file mode 100644 index 000000000..446f03369 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_084.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_085.png b/common/src/main/res/mipmap-hdpi/face_085.png new file mode 100644 index 000000000..180d01e95 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_085.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_086.png b/common/src/main/res/mipmap-hdpi/face_086.png new file mode 100644 index 000000000..6d9343a46 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_086.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_087.png b/common/src/main/res/mipmap-hdpi/face_087.png new file mode 100644 index 000000000..41b7cf917 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_087.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_088.png b/common/src/main/res/mipmap-hdpi/face_088.png new file mode 100644 index 000000000..57015ba1b Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_088.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_089.png b/common/src/main/res/mipmap-hdpi/face_089.png new file mode 100644 index 000000000..0ba492361 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_089.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_090.png b/common/src/main/res/mipmap-hdpi/face_090.png new file mode 100644 index 000000000..fbe080824 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_090.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_091.png b/common/src/main/res/mipmap-hdpi/face_091.png new file mode 100644 index 000000000..d0171e0ea Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_091.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_092.png b/common/src/main/res/mipmap-hdpi/face_092.png new file mode 100644 index 000000000..51a45cbb2 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_092.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_093.png b/common/src/main/res/mipmap-hdpi/face_093.png new file mode 100644 index 000000000..6397d58b7 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_093.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_094.png b/common/src/main/res/mipmap-hdpi/face_094.png new file mode 100644 index 000000000..1a8f5fd67 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_094.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_095.png b/common/src/main/res/mipmap-hdpi/face_095.png new file mode 100644 index 000000000..b5d605d17 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_095.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_096.png b/common/src/main/res/mipmap-hdpi/face_096.png new file mode 100644 index 000000000..1a33405f9 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_096.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_097.png b/common/src/main/res/mipmap-hdpi/face_097.png new file mode 100644 index 000000000..d044e952c Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_097.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_098.png b/common/src/main/res/mipmap-hdpi/face_098.png new file mode 100644 index 000000000..ae2d47683 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_098.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_099.png b/common/src/main/res/mipmap-hdpi/face_099.png new file mode 100644 index 000000000..87a5604a1 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_099.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_100.png b/common/src/main/res/mipmap-hdpi/face_100.png new file mode 100644 index 000000000..b3ec793a2 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_100.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_101.png b/common/src/main/res/mipmap-hdpi/face_101.png new file mode 100644 index 000000000..9655990ab Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_101.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_102.png b/common/src/main/res/mipmap-hdpi/face_102.png new file mode 100644 index 000000000..04eb22eb0 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_102.png differ diff --git a/common/src/main/res/mipmap-hdpi/face_103.png b/common/src/main/res/mipmap-hdpi/face_103.png new file mode 100644 index 000000000..80cb6c629 Binary files /dev/null and b/common/src/main/res/mipmap-hdpi/face_103.png differ diff --git a/common/src/main/res/mipmap-mdpi/bg_load_failure.png b/common/src/main/res/mipmap-mdpi/bg_load_failure.png new file mode 100644 index 000000000..1fcd25acf Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/bg_load_failure.png differ diff --git a/common/src/main/res/mipmap-mdpi/btn_openprotection.png b/common/src/main/res/mipmap-mdpi/btn_openprotection.png new file mode 100644 index 000000000..f870c6f8c Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/btn_openprotection.png differ diff --git a/common/src/main/res/mipmap-mdpi/chat_head_mo.png b/common/src/main/res/mipmap-mdpi/chat_head_mo.png new file mode 100644 index 000000000..8d1479063 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/chat_head_mo.png differ diff --git a/common/src/main/res/mipmap-mdpi/diamond.png b/common/src/main/res/mipmap-mdpi/diamond.png new file mode 100644 index 000000000..27f1a81af Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/diamond.png differ diff --git a/common/src/main/res/mipmap-mdpi/gold_coin.png b/common/src/main/res/mipmap-mdpi/gold_coin.png new file mode 100644 index 000000000..288abd557 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/gold_coin.png differ diff --git a/common/src/main/res/mipmap-mdpi/good_nub.png b/common/src/main/res/mipmap-mdpi/good_nub.png new file mode 100644 index 000000000..ad63b2e60 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/good_nub.png differ diff --git a/common/src/main/res/mipmap-mdpi/guli_null.png b/common/src/main/res/mipmap-mdpi/guli_null.png new file mode 100644 index 000000000..854ef0406 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/guli_null.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_avatar_placeholder.png b/common/src/main/res/mipmap-mdpi/icon_avatar_placeholder.png new file mode 100644 index 000000000..e6aae9173 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_avatar_placeholder.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_avatar_test.png b/common/src/main/res/mipmap-mdpi/icon_avatar_test.png new file mode 100644 index 000000000..d6a6f919f Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_avatar_test.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_back.png b/common/src/main/res/mipmap-mdpi/icon_back.png new file mode 100644 index 000000000..408b92339 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_back.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_cash_radio_0.png b/common/src/main/res/mipmap-mdpi/icon_cash_radio_0.png new file mode 100644 index 000000000..75a555629 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_cash_radio_0.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_cash_radio_1.png b/common/src/main/res/mipmap-mdpi/icon_cash_radio_1.png new file mode 100644 index 000000000..5f2562d3f Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_cash_radio_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_chat_charge_pay_1.png b/common/src/main/res/mipmap-mdpi/icon_chat_charge_pay_1.png new file mode 100644 index 000000000..ce39830c2 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_chat_charge_pay_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_chat_face.png b/common/src/main/res/mipmap-mdpi/icon_chat_face.png new file mode 100644 index 000000000..5f825d0b0 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_chat_face.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_chat_keyboard.png b/common/src/main/res/mipmap-mdpi/icon_chat_keyboard.png new file mode 100644 index 000000000..d654a4c94 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_chat_keyboard.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_checked.png b/common/src/main/res/mipmap-mdpi/icon_checked.png new file mode 100644 index 000000000..0c8cf5db4 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_checked.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_checked_none.png b/common/src/main/res/mipmap-mdpi/icon_checked_none.png new file mode 100644 index 000000000..f7c6898d3 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_checked_none.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_coin_wrap.png b/common/src/main/res/mipmap-mdpi/icon_coin_wrap.png new file mode 100644 index 000000000..23da90888 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_coin_wrap.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_coin_wrap3.png b/common/src/main/res/mipmap-mdpi/icon_coin_wrap3.png new file mode 100644 index 000000000..c075ece37 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_coin_wrap3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_coin_wrap_1.png b/common/src/main/res/mipmap-mdpi/icon_coin_wrap_1.png new file mode 100644 index 000000000..679b43811 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_coin_wrap_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_coin_wrap_recommend.png b/common/src/main/res/mipmap-mdpi/icon_coin_wrap_recommend.png new file mode 100644 index 000000000..f7d89a06f Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_coin_wrap_recommend.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_data_empty.png b/common/src/main/res/mipmap-mdpi/icon_data_empty.png new file mode 100644 index 000000000..d0a46a0ae Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_data_empty.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_dialog_charge_close.png b/common/src/main/res/mipmap-mdpi/icon_dialog_charge_close.png new file mode 100644 index 000000000..4b12a41fd Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_dialog_charge_close.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_down_arrow.png b/common/src/main/res/mipmap-mdpi/icon_down_arrow.png new file mode 100644 index 000000000..7f222fd5b Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_down_arrow.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_face_delete.png b/common/src/main/res/mipmap-mdpi/icon_face_delete.png new file mode 100644 index 000000000..76c706c04 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_face_delete.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_live_gift_zs.png b/common/src/main/res/mipmap-mdpi/icon_live_gift_zs.png new file mode 100644 index 000000000..f3d04cde8 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_live_gift_zs.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_login_fb.png b/common/src/main/res/mipmap-mdpi/icon_login_fb.png new file mode 100644 index 000000000..36bf0c716 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_login_fb.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_login_qq.png b/common/src/main/res/mipmap-mdpi/icon_login_qq.png new file mode 100644 index 000000000..f120f9f1a Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_login_qq.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_login_tt.png b/common/src/main/res/mipmap-mdpi/icon_login_tt.png new file mode 100644 index 000000000..a46160ebb Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_login_tt.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_login_wx.png b/common/src/main/res/mipmap-mdpi/icon_login_wx.png new file mode 100644 index 000000000..880336a40 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_login_wx.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_sex_female_1.png b/common/src/main/res/mipmap-mdpi/icon_sex_female_1.png new file mode 100644 index 000000000..e8f359477 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_sex_female_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_sex_male_1.png b/common/src/main/res/mipmap-mdpi/icon_sex_male_1.png new file mode 100644 index 000000000..6c62e6a40 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_sex_male_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_fb_1.png b/common/src/main/res/mipmap-mdpi/icon_share_fb_1.png new file mode 100644 index 000000000..52c1c6970 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_fb_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_fb_2.png b/common/src/main/res/mipmap-mdpi/icon_share_fb_2.png new file mode 100644 index 000000000..f5546206c Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_fb_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_fb_3.png b/common/src/main/res/mipmap-mdpi/icon_share_fb_3.png new file mode 100644 index 000000000..5fcc5bb1b Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_fb_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_fb_4.png b/common/src/main/res/mipmap-mdpi/icon_share_fb_4.png new file mode 100644 index 000000000..7e1729372 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_fb_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_pyq_1.png b/common/src/main/res/mipmap-mdpi/icon_share_pyq_1.png new file mode 100644 index 000000000..88c70933b Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_pyq_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_pyq_2.png b/common/src/main/res/mipmap-mdpi/icon_share_pyq_2.png new file mode 100644 index 000000000..956c215c5 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_pyq_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_pyq_3.png b/common/src/main/res/mipmap-mdpi/icon_share_pyq_3.png new file mode 100644 index 000000000..6ca12d38e Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_pyq_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_pyq_4.png b/common/src/main/res/mipmap-mdpi/icon_share_pyq_4.png new file mode 100644 index 000000000..69bee19d4 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_pyq_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qq_1.png b/common/src/main/res/mipmap-mdpi/icon_share_qq_1.png new file mode 100644 index 000000000..f2ab8d80e Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qq_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qq_2.png b/common/src/main/res/mipmap-mdpi/icon_share_qq_2.png new file mode 100644 index 000000000..126b9d1c6 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qq_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qq_3.png b/common/src/main/res/mipmap-mdpi/icon_share_qq_3.png new file mode 100644 index 000000000..d0b697d47 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qq_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qq_4.png b/common/src/main/res/mipmap-mdpi/icon_share_qq_4.png new file mode 100644 index 000000000..243954940 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qq_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qzone_1.png b/common/src/main/res/mipmap-mdpi/icon_share_qzone_1.png new file mode 100644 index 000000000..1d06e78b0 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qzone_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qzone_2.png b/common/src/main/res/mipmap-mdpi/icon_share_qzone_2.png new file mode 100644 index 000000000..b531a7939 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qzone_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qzone_3.png b/common/src/main/res/mipmap-mdpi/icon_share_qzone_3.png new file mode 100644 index 000000000..b0c4508fa Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qzone_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_qzone_4.png b/common/src/main/res/mipmap-mdpi/icon_share_qzone_4.png new file mode 100644 index 000000000..c253b2d85 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_qzone_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_tt_1.png b/common/src/main/res/mipmap-mdpi/icon_share_tt_1.png new file mode 100644 index 000000000..36260ad36 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_tt_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_tt_2.png b/common/src/main/res/mipmap-mdpi/icon_share_tt_2.png new file mode 100644 index 000000000..ddcb00a85 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_tt_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_tt_3.png b/common/src/main/res/mipmap-mdpi/icon_share_tt_3.png new file mode 100644 index 000000000..d6a454287 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_tt_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_tt_4.png b/common/src/main/res/mipmap-mdpi/icon_share_tt_4.png new file mode 100644 index 000000000..568e72e55 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_tt_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_wx_1.png b/common/src/main/res/mipmap-mdpi/icon_share_wx_1.png new file mode 100644 index 000000000..64151839b Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_wx_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_wx_2.png b/common/src/main/res/mipmap-mdpi/icon_share_wx_2.png new file mode 100644 index 000000000..2a9f4638f Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_wx_2.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_wx_3.png b/common/src/main/res/mipmap-mdpi/icon_share_wx_3.png new file mode 100644 index 000000000..2717a627e Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_wx_3.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_share_wx_4.png b/common/src/main/res/mipmap-mdpi/icon_share_wx_4.png new file mode 100644 index 000000000..a93b1e040 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_share_wx_4.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_user_dialog_home.png b/common/src/main/res/mipmap-mdpi/icon_user_dialog_home.png new file mode 100644 index 000000000..17a070e98 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_user_dialog_home.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_user_home_follow_0.png b/common/src/main/res/mipmap-mdpi/icon_user_home_follow_0.png new file mode 100644 index 000000000..4cf0db3a6 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_user_home_follow_0.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_user_home_follow_1.png b/common/src/main/res/mipmap-mdpi/icon_user_home_follow_1.png new file mode 100644 index 000000000..e29ed4fe2 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_user_home_follow_1.png differ diff --git a/common/src/main/res/mipmap-mdpi/icon_user_home_living.gif b/common/src/main/res/mipmap-mdpi/icon_user_home_living.gif new file mode 100644 index 000000000..91243c9eb Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_user_home_living.gif differ diff --git a/common/src/main/res/mipmap-mdpi/icon_user_home_msg.png b/common/src/main/res/mipmap-mdpi/icon_user_home_msg.png new file mode 100644 index 000000000..2d7387f0e Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/icon_user_home_msg.png differ diff --git a/common/src/main/res/mipmap-mdpi/tipbox_btn_gray.png b/common/src/main/res/mipmap-mdpi/tipbox_btn_gray.png new file mode 100644 index 000000000..72fb5b798 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/tipbox_btn_gray.png differ diff --git a/common/src/main/res/mipmap-mdpi/tipbox_btn_orange.png b/common/src/main/res/mipmap-mdpi/tipbox_btn_orange.png new file mode 100644 index 000000000..52a122163 Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/tipbox_btn_orange.png differ diff --git a/common/src/main/res/mipmap-mdpi/topbg.gif b/common/src/main/res/mipmap-mdpi/topbg.gif new file mode 100644 index 000000000..ad5cd308d Binary files /dev/null and b/common/src/main/res/mipmap-mdpi/topbg.gif differ diff --git a/common/src/main/res/mipmap-xxhdpi/bg_trickery_top.png b/common/src/main/res/mipmap-xxhdpi/bg_trickery_top.png new file mode 100644 index 000000000..e7f7bfc38 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/bg_trickery_top.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/bg_zg.png b/common/src/main/res/mipmap-xxhdpi/bg_zg.png new file mode 100644 index 000000000..6ff8c69f4 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/bg_zg.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_horizontally.png b/common/src/main/res/mipmap-xxhdpi/icon_horizontally.png new file mode 100644 index 000000000..abbc4bcb3 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_horizontally.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_love.png b/common/src/main/res/mipmap-xxhdpi/icon_love.png new file mode 100644 index 000000000..942381821 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_love.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_user_home_edit.png b/common/src/main/res/mipmap-xxhdpi/icon_user_home_edit.png new file mode 100644 index 000000000..e5b0bd729 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_user_home_edit.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_video_play.png b/common/src/main/res/mipmap-xxhdpi/icon_video_play.png new file mode 100644 index 000000000..46cc6bded Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_video_play.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_wish_anchor.png b/common/src/main/res/mipmap-xxhdpi/icon_wish_anchor.png new file mode 100644 index 000000000..b9d049663 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_wish_anchor.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_wish_live.png b/common/src/main/res/mipmap-xxhdpi/icon_wish_live.png new file mode 100644 index 000000000..665650a82 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_wish_live.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/img_mess.png b/common/src/main/res/mipmap-xxhdpi/img_mess.png new file mode 100644 index 000000000..066d1f61e Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/img_mess.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/img_no_anchor.png b/common/src/main/res/mipmap-xxhdpi/img_no_anchor.png new file mode 100644 index 000000000..7b3c0a1a1 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/img_no_anchor.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/img_no_new.png b/common/src/main/res/mipmap-xxhdpi/img_no_new.png new file mode 100644 index 000000000..bf4b2d059 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/img_no_new.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/img_on_official.png b/common/src/main/res/mipmap-xxhdpi/img_on_official.png new file mode 100644 index 000000000..d26223eb2 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/img_on_official.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/loading.png b/common/src/main/res/mipmap-xxhdpi/loading.png new file mode 100644 index 000000000..7c45d0745 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/loading.png differ diff --git a/common/src/main/res/values-en/strings.xml b/common/src/main/res/values-en/strings.xml new file mode 100644 index 000000000..bbdf86e1b --- /dev/null +++ b/common/src/main/res/values-en/strings.xml @@ -0,0 +1,817 @@ + + + Drop down to refresh + Refreshing + Loading + Release refresh now + Refresh finish + refresh failed + M-d HH:mm + Pull up to load more + Release load now + Loading + Refreshing + Load complete + Failed to load + Are you sure to use the data? + Edit Profile + Are you sure to use the data? + Confirm + The nickname is duplicated, please re-enter it. + This invitation code does not exist, please re-enter it. + Nickname is illegal + + + No more data + Pull black + Relieving blackout + Remarks + Sign in immediately + Continuously signed in + day + Beauty initialization exception, unable to use + Withdrawals account + You have not set up a withdrawal account yet + Add withdrawal account + Account type + Please enter the cardholder\'s name + Please enter the bank card account number + Please enter bank name + Please enter wechat account + Please enter Alipay account number. + Please enter the name of Alipay account. + Alipay + WeChat + Bank card + Do you want to delete this account? + Withdrawals record + Give + Account balance + Alipay + WeChat payment + Recharge success + Failure of recharge + Alipay is not installed. + Wechat is not installed + No QQ installed + Replication link + Replication success + Editing materials + Head portrait + Nickname + ModifyName + Modify remarks + Please enter comments~ + Signature modification + autograph + Binding phone + ApplyMic + Cancel Mic + Quit Mic + Birthday + Gender + Location + My anchor impression + Set the picture successfully + Leave something~ + Please enter a nickname~ + Up to 20 words can be input + Up to 8 words can be input + Please enter a nickname + Please enter signature + Please select the correct date + Warm tip: you can change your nickname once for free, and then 1800 diamonds will be needed + Follow + VIP + Rosy + Skin + Smooth + BigEyes + SlimFace + ThinFace + Chin + Nose + Lips + copy + Today\'s Live WishList + Make a wish, the audience to help you achieve + Generate + Add gifts and quantities + Wishes set on the same day will expire at 24:00 on the same day + BrightEye + Teeth + Light + Cute + Goddess + Glamour + Magnificent + White + White + JP + B&W + Soft + Warmth + Retro + Flower + Easy + Vitality + Warm + Bright + Deep + Sunset + Cure + Filter + Preset + Beauty + + The anchor sends a flying kiss to you + It\'s a great opportunity, reply now! + A bunch of rose + Roses Bouquet + Lollipop + Free for a limited time + Follow and reply + + Following + My concern + My Black List + TA\'s attention + You haven\'t paid attention to anyone yet + Pay attention to the people you are interested in + TA hasn\'t paid attention to anyone yet + Fans + Opps… The anchor did not open the voice link + Fans + My fans + TA fans + You don\'t have fans yet + Improving personal information will make more people pay attention to you~ + TA doesn\'t have any fans yet + Forget password + Retrieve immediately + Choose guard duration + Option privilege + Immediate opening + Open guard + Renewal Guardian + My + Guard + Contribution this week + Become the girst Guard of he/she + Let\'s open up a guard for our favorite anchor + You are the current anchor\'s monthly guard \ n the guard date expires + You are the current anchor\'s annual guardian \ n the guardian date expires + Special gift for annual guard + You haven\'t guarded + 您為當前主播的月守護\n無法開通周守護 + You are the monthly guard of the current anchor. Opening the annual guard will cover your monthly guard time. Do you want to open it? + You will spend%1$s%2$s to open%3$s for the anchor + + Week Guardian + Month Guardian + Year Guardian + Pack + Guardian list + Guard the anchor + homepage + "%1$s" is also in%2$s, ~ Click to view TA\'s story + TA has%1$s fans. Come and watch! + Hi ~ I\'m the anchor. Come and talk to me. + [picture] + [voice] + [position] + news + Message + Ignore unread + Unread message ignored + Message sending failed + Frequent operation + The other party temporarily refuses to receive your message + You haven\'t heard anything yet + Send message + picture + shot + Speech input + position + Select pictures + No pictures found + Please select a picture + Search location + Location information not obtained + Map not loaded + Address not obtained + Failed to get location + Click follow to see the other party\'s news in time + Hold to talk + Release end + Please speak. + Recording time is too short + System message + No system message yet + Private chat + Anchor impression + Add impression + Add up to three impressions + Please select impression + Unmodified impression + Please choose your impression of the host + The impression you received from the anchor + You haven\'t received the impression of the anchor yet + Cancel photo + Deselected + Cancel clipping + Sign in for consent + Service and privacy terms + Other login methods + More exciting experience after registering! + Please enter your mobile number + Please input a password + Login immediately + Logon + Immediate registration + Forget password + Please enter the correct mobile number + Authorizing login + Login successfully + privilege grant failed + Authorization cancelled + Live broadcast + Login + shopmall + Recomm + CSD + anchor + Live broadcast + Room type + Share to + Live cover + Change cover + Live broadcast title + Write a title for the live broadcast + channel + Select live channel + Pay attention to the channel that suits you. During the live broadcast, if the operator finds that the selected channel does not match the live content, he / she will adjust your live channel. + Please set room password + Please set the charge amount (the revenue is subject to the end of live broadcast) + Please set room password + Please set the charge amount + Charge amount + Selective charging + Do you want to end the live broadcast? + The anchor has approved your application, do you want to join now? + Exiting the live broadcast room will disconnect the microphone connection. Do you want to exit? + Beauty + Beans + DO + Coins + + Personalized Dress Up + Flip + Mirroring + Tricky + MultiplayerPK + LianmaiVoice + ZhouXingbang + LeaveTemporarily + ResumeLive + Flash lamp + accompaniment + share + Game + Red envelopes + Lian Mai + SinglePK + WishList + Only the rear camera can turn on the flash + Flash on failed + You\'ve been banned + Live broadcast ended + Back to home page + Duration of live broadcast + Harvest + Number of visitors + Guan Zhong + Tell you something + Open the barrage, + strip + Please enter the room password + Password error + Broadcast failure + Video format not supported + Video address contains Chinese, unable to play + Guard + I light up. + Into the studio + Sending gifts + sent + UnlockVIP + + + I sent one. + Give + Continuous delivery + x + Sending x + Pretty + Send out + income + City not set + Gift contribution list + Kick people + Permanent ban + This field ban + Set as management + Cancel management + managers + Close live broadcast + Forbidden live broadcast + Disable account + Current administrator + Kicked out of the room + Forbidden forever + Forbidden by this scene + Set as Administrator + Cancelled administrator + You\'ve been kicked out of the room + Live content suspected of violation + Rank + data + The anchorman will leave for a while. The highlights will not be interrupted. Don\'t go away + The anchor is back! + Thrust failure + Camera open failed + Microphone on failed + View + Online List + Viewers + There is no anchor for the time being + Let\'s start your live broadcast~ + The host you\'re focusing on doesn\'t start + Let\'s go and see the live broadcast of other hosts~ + Go to other channels quickly~ + You haven\'t had a live broadcast recently + Let\'s go to the opening live experience + TA hasn\'t had a live broadcast recently + Please select a channel + Focus on the anchor + Are you sure to report? + Interaction between wheat and wheat + End Lian Mai + Allowed even wheat + Ban Lian Mai + Initiate a link request + Initiate PK request + Quit even wheat + The current anchor is temporarily unable to connect + No response from the other party + The anchor is busy + The other anchor is busy + The host rejected your request for wheat + The host refused your request + The opposite host rejected your PK request + Opposite host exits Lianmai + The host accepts your request to connect wheat and begins to connect wheat + You have applied, please wait + The host accepts your request to connect wheat + The host accepts your request to connect wheat and begins to connect wheat + The anchor accepted your PK request and started PK + Failed to push the stream of Lianmai, has exited Lianmai + Link request sent~ + PK request sent~ + PK initiated by the other party + You can\'t play background music when you\'re on Wheat + You need to turn off the background music when connecting the wheat + Live recording + No title + People watched the live broadcast + You can\'t connect the wheat in the game state~ + You can\'t play with Mai~ + Please try again later + Connecting wheat is currently in progress~ + You are already in PK + We + Other party + The balance is insufficient. Do you want to recharge it? + Current online anchor + The other anchor is in the game + Invite Lian Mai + Already invited + Please enter the host nickname or ID you want to search + No anchor at present + PK time + Penalty time + No video + Let\'s release our own video + home page + nearby + Ranking + My + Ordinary room + Paying room + Time room + Password room + Income statement + Contribution list + Daily + Week + Honor + Car + No mount yet + Medal + No medal yet + OwningGuild + Monthly list + General list + Maintenance notice + Guard + Temporary lack of time and space + Live broadcast immediately + Release dynamics + Please fill in the invitation code + Press again to exit + Old password + Please enter the old password + New password + Please fill in the new password + Confirm password + Confirm new password + Confirm revision + reset password + QQ + QQ Zone + WeChat + Wechat Moments + Facebook + Twitter + Search songs + No songs to download + Invalid song download address + Lyrics not found + Song not found + Music + volume + No music at all + You haven\'t collected any music yet + No such music + Let\'s take a look at other types of music + You have denied the permission to read and write files. Please modify it in the settings + You have denied the permission to use the camera. Please modify it in the settings + You have denied permission to use microphone. Please modify it in settings + You have denied the permission to use the location. Please modify it in the settings + You have denied the right to read mobile phone information. Please modify it in settings + My income + Receivable amount + Please select a withdrawal account + Enter the number of%1$s to withdraw + Total%1$s number + Number of%1$s withdrawable + Enter the number of%1$s to extract + Immediate withdrawals + register + Please enter your mobile number + Please enter the verification code + Please fill in the password + Please confirm the password + Fill in the invitation code (optional) + Register and log in + Get verification code + Regain + Passwords are inconsistent + In registration + Live room red envelope + Send red envelopes to the audience in the current live studio + Red envelopes + Average red envelope + Congratulations on making a fortune + Hand out red envelopes + Please enter the amount + Please enter quantity + %1$s red packets in total + rob + An instant red envelope was distributed + A delayed red packet was distributed + rob + View claim details + Congratulations! + Grab the%1$s red packet sent by%1$s + %1$s red packets + My%1$s has been saved + Received%1$s of%2$s%3$s + Not snatch + After the countdown + Red envelopes in the studio! Grab it + Single amount + Total sum + skip + Click to enter + Recommended for you + male + female + Personality settings + Logout + Scavenging + Cache cleared + search + Please enter the nickname or ID to search + No content found + QQ + QQ Zone + WeChat + Wechat Moments + facebook + twitter + Share success + Sharing failure + Share cancel + Version update + Immediate use + Not updated + It\'s the latest version + Invalid download address + Say something~ + Video download successful + Video download failed + No more videos + comment + I can\'t give myself a compliment + No comment for the moment. Grab the sofa + Reply + Expand more replies + Retract + Flip + Flash lamp + Camera open failed + Microphone on failed + Record failure + Don\'t worry, the picture hasn\'t come out yet + And the recording is not over + The incoming video path is empty + Outdated Version + Tencent cloud authentication failed + Extremely slow + slow + normal + fast + Extremely fast + WishList + Video preprocessing + Video preprocessing failed + Video preprocessing cancel + In processing + Abnormal status, Stop editing + Choose music + Search song name + Popular songs + My collection + Filter + Tailoring + Special effects + Capture the required audio clip + Original voice + Drag the sliders on both sides to select the clipping area + Add video description~ + Confirm release + Video Publishing + Video generation in progress + Video generated successfully + Failed to generate video + Do you want to give up publishing this video + Local video not found + Local video + Video duration does not meet the requirements + Failed to generate video cover image + Please add a video description + In release + Released successfully + Publishing succeeded, please wait for approval + Save only + Release only + Save and publish + Re shooting + Sign out + Long press to add special effects + Publishing failure + You don\'t have a video yet + Go to shoot and upload + TA has no video works yet + My video + Choose a reason to report + For more details, please describe in the description box (optional) + Submission + Please select the reason for reporting + Report success + It\'s at the top + Are you sure you want to delete the previous video? + Exit video editing + Add to + accept + whole + Album + cancel + camera + Picture selection/Preview + Preview + Pictures and videos + Determine + Please enter content + Choice + Select file + Can not pay attention to yourself + Tips + download + delete + End + Popular + Network request failed + Please check the network connection and try again~ + Loading + position + No more data + No data + nearby + ten thousand + One moment please + Private letter + Report + retry + refuse + Preservation + Register + No one is currently in the voice link + + + Send out + I am sorry + video + myname.pdlive.shayu.fileprovider + people + individual + + Number + Next step + upload + My studio + My room + Administrators + Black users + Banned users + List of forbidden users + Live room of + Lifting of the ban + Blacklist of users + No banned users + No blacklisted users + You are not an administrator yet + Relieving blackout + Happy mid + Invitation code + Congratulations%1$s get%2$SX%3$s times + Lucky gift description + Current prize pool level + Current bonus pool amount + Lv.%1$s + Send barrage, need to reach level%1$s + Speak, need to reach level%1$s + Open positioning + Resolutely shut down + Close the location, the live broadcast will not be seen by nearby people, and the number of people in the live studio may be reduced. Are you sure to close it? + Mars + Shopping Mall + Detailed + wallet + Personalized signature + Personal information + Please select payment method + expenditure + income + User recharge agreement + Read and agree + Please select the recharge amount + Payment method not selected + My%1$s + Recharge + Receive + News Center + Version + Confirm payment + Confirm payment (¥%1$s) + Payment method + Immediate payment + User level + Anchor level + The connection has been disconnected, please restart the broadcast + Absolutely empty + Chat + Live + Break + + Please, can you pay attention to me? + Follow and exit + Exit + User + + If you don\'t take the initiative,how can we have a story?\nTell the anchor say hi~ + + + follow + Enter activity + + in + gave + \'s live studio has been opened + \'s live studio has been renewed + opened the + renewed + + Enter the live broadcast room + Beans + + Encourage the author of this dynamic article + + Confirm encouragement + Dynamic encouragement + Encouraging records + + The author hasn\'t given encouragement yet T_T + + Click to see more + + Customer service + Set up + Every Day 13:00PM-24:00AM + + Withdraw + + Open VIP and enjoy exclusive privileges! + Meet someone you like by chance~ + There is no news yet~~ + + Current VIP : + Expiration time: + + Successfully joined the blacklist + Failed to join blacklist + + Blacklist removed successfully + Failed to remove blacklist + + Reply + Reply to comments + + Click here to enter the reply + + For the time being, it is only open to the anchor + + 391137926073929 + 64dbc61681a4492544be268eb1084c3e + + ui10vIggex2F043HnztYNuA3g + J8jvBBeJoZbVojbkWUrvsj0K0UUkuV69CqQ7CEobhJn6tvAKpQ + ZWRrZnRUNlBlcHVxMXpsMzVmb2k6MTpjaQ + aq0eV4R1pqMK_AAeKRWnjPr7ErGMGgTPGgZJdm73WeRY-Kluws + + 1527128092082286592-NfYVOcHXy630vYUj4nMlDPh8PsVBHE + U5avdnRMb7yON6sYp4SAb1I99mFD8ch9KHIuFbEbd0IDN + + Complete the new person\'s pre task + Unlock custom features + Unlock the live room speech function + + Predecessors + Sign in with Facebook + Sign in with Twitter + + Request timed out, please try again later. + + Receive 1000 free beans + Now mobile number + Confirm to bind mobile number + Modify mobile number + After the mobile phone number is successfully bound, it will be automatically obtained + x1000 + After binding the mobile account, you can log in with the mobile account, + It can also be used to retrieve passwords. + + Bind account + + Trickster initiator + Trickery content + Exempt from this trickery + + Consume + Thanks for saving + + You can only speak after completing the previous task + + Heat addition + Hot & Time + + 熱度可以給主播的房間增加曝光度,熱度越高的直播間,在首頁的排名也越靠前,從而帶來更多的進房用戶,幫助主播在一段時間內迅速提高房間熱度,送出之後立即生效。 + 熱度卡如何獲得? + 1、周星榜主播冠軍的第一名用戶每週可自動獲得; + 2、通過參與官方活動,具體活動可留意官方消息。 + 熱度卡如何使用? + 前往「個人中心」-「我的包裹」中,即可使用熱度卡。 + 熱度卡生效多久? + 對指定主播使用熱度卡後,將會立即生效,效果時長為24小時,不管主播是否在線,熱度時長都將會持續減少 + + diff --git a/common/src/main/res/values/attrs.xml b/common/src/main/res/values/attrs.xml new file mode 100644 index 000000000..46dfd145b --- /dev/null +++ b/common/src/main/res/values/attrs.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml new file mode 100644 index 000000000..41e0e9cb3 --- /dev/null +++ b/common/src/main/res/values/colors.xml @@ -0,0 +1,81 @@ + + + @color/global + @color/global + @color/global + + #FF8D41 + @color/gray2 + #00000000 + #98000000 + #323232 + #fff + #85ffffff + #969696 + #f5f5f5 + #c8c8c8 + #CCCCCC + #AAAAAA + #ededed + #fffa37 + #F6FF00 + #f0cd08 + #FFF34D + #ffdd00 + #FFBE41 + #646464 + #ff0000 + #f03a40 + #b14066 + #2a92f7 + #e6323232 + #000000 + #222324 + #161616 + + #B1B1B1 + #DCDCDC + #FD6052 + #FD5E53 + #FF1679 + + #7CD6FF + #707CD6FF + #6170FF + + #FD2F5A + #FF35BF + + #81CEF2 + #32AAE0 + #227BEF + + #C81DE0 + #B100FF + #9133FF + #FF5CA1 + + #09BBFE + #5A42EC + #337CF5 + #00FFEA + + #FAB522 + #FF6C00 + #FD890E + + #ffb6c4 + #ffeff2 + #F8F6F8 + + #8C8C8C + + #ffbf2f + #FFBE41 + + #853528 + + #81C16D + + #F6F7FB + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml new file mode 100644 index 000000000..11b0d5d05 --- /dev/null +++ b/common/src/main/res/values/strings.xml @@ -0,0 +1,830 @@ + + + 下拉可以重繪 + 正在重繪 + 正在加載 + 釋放立即重繪 + 重繪完成 + 重繪失敗 + 上次更新M-d HH:mm + 上拉加載更多 + 釋放立即加載 + 正在加載 + 正在重繪 + 加載完成 + 加載失敗 + 沒有更多數據了 + 拉黑 + 解除拉黑 + 備註 + 立即簽到 + 已連續簽到 + + 美顏初始化异常,無法使用 + 提現帳戶 + 您當前還沒設定提現帳戶 + 添加提現帳戶 + 帳戶類型 + 請輸入持卡人姓名 + 請輸入銀行卡帳號 + 請輸入銀行名稱 + 請輸入微信帳號 + 請輸入支付寶帳號 + 請輸入支付寶帳號姓名 + 支付寶 + 微信 + 銀行卡 + 是否要删除該帳戶? + 提現記錄 + 贈送 + 帳戶餘額 + 支付寶 + 微信支付 + 充值成功 + 充值失敗 + 未安裝支付寶 + 未安裝微信 + 未安裝QQ + 複製連結 + 複製成功 + 編輯資料 + 頭像 + 昵稱 + 修改昵稱 + 修改備註 + 修改簽名 + 簽名 + 綁定手機 + 生日 + 性別 + 申请連麥 + 取消申請 + 退出連麥 + 所在地 + 編輯個人資料 + 進入PD LIVE + 是否確認使用一下資料 + 確認 + 暱稱重複,請重新輸入 + 該邀請碼不存在,請重新輸入 + 暱稱不合法 + + + 我的主播印象 + 設定頭像成功 + 留下點什麼吧~ + 請輸入昵稱~ + 請輸入備註~ + 最多可輸入20個字 + 最多可輸入8個字 + 請輸入昵稱 + 請輸入簽名 + 請選擇正確的日期 + 溫馨提示:可以免費修改昵稱一次,之後修改需要鑽石1800一次 + 關注 + 已關注 + 我的關注 + 我的黑名單 + TA的關注 + 你還沒有關注任何人 + 趕快去關注自己感興趣的人吧 + TA還沒有關注任何人 + 粉絲 + Opps… 主播沒有開啟語音連麥 + 粉絲 + 貴族 + 我的粉絲 + TA的粉絲 + 你還沒有粉絲 + 完善個人資訊會讓更多的人關注到你哦~ + TA還沒有任何粉絲 + 忘記密碼 + 立即找回 + 選擇守護時長 + 選擇特權 + 立即開通 + 開通守護 + 續費守護 + 我的 + 鑽石 + + 守護 + 本周貢獻 + 主播正在等待您成為TA的守護,為TA保駕護航! + 快去為喜歡的主播開通守護吧 + 您是當前主播的月守護\n守護日期截止到 + 您是當前主播的年守護\n守護日期截止到 + 年守護專屬禮物 + 你還沒有守護哦 + 您為當前主播的月守護\n無法開通周守護 + 您為當前主播的月守護,開通年守護將覆蓋您的月守護時長,是否開通? + 您將花費%1$s%2$s,為主播開通%3$s + + 周守護 + 月守護 + 年守護 + 守護榜 + 守護了主播 + 主頁 + “%1$s”也在%2$s,~點擊查看TA的故事 + TA有%1$s粉絲,快來圍觀呀! + Hi~我是主播,快來和我聊天吧。 + [圖片] + [語音] + [位置] + 消息 + 信息中心 + 忽略未讀 + 已忽略未讀消息 + 消息發送失敗 + 操作頻繁 + 對方暫時拒絕接收您的消息 + 你還沒有收到任何消息 + 發送消息… + 圖片 + 拍攝 + 語音輸入 + 位置 + 選擇圖片 + 沒有找到圖片 + 請選擇圖片 + 蒐索地點 + 未獲取到位置資訊 + 地圖未加載 + 未獲取到地址 + 獲取位置失敗 + 點擊關注,可及時看到對方動態 + 按住說話 + 鬆開結束 + 請說話… + 錄音時間太短 + 官方通知 + 暫無消息 + 私聊 + 主播印象 + 添加印象 + 最多添加三個印象 + 請選擇印象 + 未修改印象 + 請選擇你對主播的印象 + 你收到的主播印象 + 你還暫時沒有收到主播印象 + 取消拍照 + 取消選擇 + 取消裁剪 + 登錄 + 登入即代表同意 + 服務和隱私條款 + 其他登入管道 + 注册登入後體驗更精彩! + 請輸入手機號碼 + 請輸入密碼 + 立即登入 + 登入中 + 立即注册 + 忘記密碼 + 請輸入正確的手機號碼 + 正在授權登入 + 登入成功 + 授權失敗 + 授權取消 + 直播 + 商城 + 客服 + 主播 + 開始直播 + 房間類型 + 分享至 + 直播封面 + 更換封面 + 直播標題 + 給直播寫個標題吧 + 頻道 + 選擇直播頻道 + 注意選擇適合自己的頻道。直播過程中,若運營人員發現選擇的頻道和直播內容不相符的情况,會調整您的直播頻道。 + 請設定房間密碼 + 請設定收費金額\n(收益以直播結束顯示為准) + 請設定房間密碼 + 請設定收費金額 + 收費金額 + 選擇收費 + 是否要結束直播? + 主播已同意你的連麥申請,是否現在加入連麥? + 退出直播間,將斷開連麥,是否退出? + 美顏 + 翻轉 + 鏡像 + 閃光燈 + 伴奏 + 分享 + 遊戲 + 紅包 + 連麥 + 單人PK + 只有後置監視器才能開啟閃光燈 + 打開閃光燈失敗 + 你已經被禁言 + 直播已結束 + 返回首頁 + 直播時長 + 收穫 + 觀看人數 + 關播中 + 和大家說點什麼… + 開啟彈幕, + + 請輸入房間密碼 + 密碼錯誤 + 播放失敗 + 視頻格式不支持 + 視頻地址包含中文,無法播放 + 守護 + 我點亮了 + 進入了直播間 + 發送禮物 + + + 送了一個 + 贈送 + 連送 + + 連送x + + 主播向您發出了一個飛吻 + 機會難得 快回覆吧 + 一束玫瑰 + 玫瑰花束 + 棒棒糖 + 限時免費 + 關注並回覆 + 送出 + 收入 + 都市未設定 + 禮物貢獻榜 + 踢人 + 永久禁言 + 本場禁言 + 設為管理 + 取消管理 + 管理員清單 + 關閉直播 + 禁用直播 + 禁用帳戶 + 當前管理員 + 被踢出房間 + 被永久禁言 + 被本場禁言 + 被設為管理員 + 被取消管理員 + 你已經被踢出房間 + 直播內容涉嫌違規 + 貢獻榜 + 去圍觀 + 資料 + 主播離開一下,精彩不中斷,不要走開哦 + 主播回來了! + 推流失敗 + 監視器開啟失敗 + 麥克風開啟失敗 + 暫時沒有主播開播 + 趕快開啟你的直播吧~ + 你關注的主播沒有開播 + 趕快去看看其他主播的直播吧~ + 趕快去其他頻道逛逛吧~ + 你最近沒有開過直播 + 趕快去開場直播體驗下吧 + TA最近沒有開過直播 + 請選擇頻道 + 關注了主播 + 確定舉報? + 連麥互動 + 結束連麥 + 允許連麥 + 禁止連麥 + 發起連麥請求 + 發起PK請求 + 退出連麥 + 當前主播暫時無法接通 + 對方無響應 + 主播正在忙 + 對方主播正在忙 + 主播拒絕了您的連麥請求 + 對方主播拒絕了您的連麥請求 + 對方主播拒絕了您的PK請求 + 對方主播退出連麥 + 對方主播接受了您的連麥請求,開始連麥 + 您已申請,請稍等 + 主播接受了您的連麥請求,開始連麥 + 對方主播接受了您的連麥請求,開始連麥 + 主播接受了您的PK請求,開始PK + 連麥推流失敗,已退出連麥 + 連麥請求已發送~ + PK請求已發送~ + 對方發起PK + 連麥時候無法播放背景音樂 + 連麥時需要關閉背景音樂 + 直播記錄 + 無標題 + 人看過直播 + 遊戲狀態不能進行連麥哦~ + 連麥狀態不能進行遊戲哦~ + 主播連麥中,請等會兒再試哦~ + 當前正在進行連麥~ + 你已經在PK中 + 我方 + 對方 + 餘額不足,是否要充值? + 當前線上主播 + 對方主播在遊戲中 + 邀請連麥 + 已邀請 + 請輸入您要蒐索的主播昵稱或ID + 暫時沒有主播 + PK時間 + 懲罰 + 暫無視頻 + 趕快發佈自己的視頻吧 + 首頁 + 附近 + 排行 + 我的 + 金豆 + + 普通房間 + 付費房間 + 計時房間 + 密碼房間 + 收益榜 + 豪氣榜 + 日榜 + 周榜 + 月榜 + 總榜 + 維護通知 + 虛位以待 + 暫時空缺 + 立即直播 + 發布動態 + 請填寫邀請碼(非必填) + 再按一次退出 + 舊密碼 + 請輸入舊密碼 + 新密碼 + 請填寫新密碼 + 確認密碼 + 確認新密碼 + 確認修改 + 重置密碼 + QQ電話 + QQ空間 + 微信 + 朋友圈 + 臉譜網 + 推特 + 蒐索歌曲 + 暫無下載歌曲 + 歌曲下載地址無效 + 歌詞未找到 + 歌曲未找到 + 音樂 + 音量 + 暫無音樂 + 你還沒有收藏任何音樂 + 暫無此類音樂 + 去看看其他音樂類型吧 + 您拒絕了檔案讀寫的許可權,請到設定中修改 + 您拒絕了使用監視器的許可權,請到設定中修改 + 您拒絕了使用麥克風的許可權,請到設定中修改 + 您拒絕了使用定位的許可權,請到設定中修改 + 您拒絕了讀取手機資訊的許可權,請到設定中修改 + 我的收益 + 可到賬金額 + 請選擇提現帳戶 + 輸入要提現的%1$s數 + 總%1$s數 + 可提現%1$s數 + 輸入要選取的%1$s數 + 立即提現 + 注册 + 請輸入您的手機號 + 請輸入驗證碼 + 請填寫密碼 + 請確認密碼 + 填寫邀請碼(非必填) + 注册並登入 + 獲取驗證碼 + 重新獲取 + 密碼不一致 + 注册中 + 直播間紅包 + 給當前直播間觀眾發紅包 + 拼手氣紅包 + 平均紅包 + 恭喜發財,大吉大利 + 發紅包 + 請輸入金額 + 請輸入數量 + 共%1$s個紅包 + + 派發了一個即時紅包 + 派發了一個延時紅包 + + 查看領取詳情》 + 恭喜你! + 搶到%1$s派發的%2$s紅包 + %1$s的紅包 + 已存入「我的%1$s」 + 已領取%1$s個,共%2$s%3$s + 未搶到 + 倒數計時結束後可搶 + 在直播間發紅包啦!快去搶哦~ + 單個金額 + 總金額 + 跳過 + 點擊進入 + 為你推薦 + 推薦 + + + 個性設置 + 登出 + 清除中 + 緩存已清除 + 蒐索 + 請輸入要搜索的昵稱或ID + 沒有搜索到相關內容 + QQ電話 + QQ空間 + 微信 + 朋友圈 + 臉譜網 + 推特 + 分享成功 + 分享失敗 + 分享取消 + 版本更新 + 版本號 + 立即使用 + 暫不更新 + 已經是最新版本 + 下載地址無效 + 說點什麼吧~ + 視頻下載成功 + 視頻下載失敗 + 沒有更多視頻 + 評論 + 不能給自己點贊 + 暫無評論,快來搶沙發吧 + 回復 + 展開更多回復 + 收起 + 翻轉 + 閃光燈 + 監視器打開失敗 + 麥克風打開失敗 + 錄製失敗 + 別著急,畫面還沒出來 + 還有錄製的任務沒有結束 + 傳入的視頻路徑為空 + 版本太低 + 騰訊雲鑒權失敗 + 極慢 + + 正常 + + 極快 + 視頻預處理中… + 視頻預處理失敗 + 視頻預處理取消 + 處理中 + 狀態异常,停止編輯 + 選擇音樂 + 蒐索歌曲名稱 + 熱門歌曲 + 我的收藏 + 濾鏡 + 裁剪 + 特效 + 截取所需音訊片段 + 原聲 + 拖拽兩側滑塊選擇裁剪區域 + 添加視頻描述~ + 確認發佈 + 視頻發佈 + 視頻生成中 + 生成視頻成功 + 生成視頻失敗 + 是否放弃發佈此條視頻 + 未找到本地視頻 + 本地視頻 + 視頻時長不符合要求 + 生成視頻封面圖失敗 + 請添加視頻描述 + 發佈中 + 發佈成功 + 發佈成功,請等待稽核 + 僅保存 + 僅發佈 + 保存並發佈 + 重新拍攝 + 退出 + 長按可添加特效 + 發佈失敗 + 你還沒有視頻作品 + 趕快去拍攝上傳吧 + TA還沒有視頻作品 + 我的視頻 + 選擇舉報理由 + 更多詳細資訊請在說明框中描述(選填) + 提交 + 請選擇舉報理由 + 舉報成功 + 已經到頂了哦 + 確定删除上一段視頻? + 是否退出視頻編輯 + 添加 + 接受 + 全部 + 相册 + 取消 + 相機 + 圖片選取/預覽 + 預覽 + 圖片和視頻 + 確認 + 請輸入內容 + 選擇 + 選擇檔案 + 無法關注自己哦~ + 提示 + 下載 + 删除 + 結束 + 熱門 + 觀衆 + 红润 + 美白 + 磨皮 + 大眼 + 瘦脸 + 削脸 + 下巴 + 鼻子 + 嘴唇 + 亮眼 + 白牙 + 自然 + 白皙 + 净白 + 日系 + 黑白 + 柔和 + 暖光 + 复古 + 花香 + 轻氧 + 元气 + 鲜明 + 明亮 + 深海 + 夕阳 + 治愈 + 滤镜 + 美型 + 美颜 + 可爱 + 女神 + 個性裝扮 + 魅力榜 + 豪氣榜 + 當前沒有人在語音連麥中 + 網絡請求失敗 + 請檢查網絡連接後重試~ + 加載中 + 位置 + 沒有更多數據 + 暫無數據 + 附近 + + 請稍等 + 私信 + 舉報 + 重試 + 拒絕 + 保存 + 發送 + 對不起 + 視頻 + 榮譽 + 勛章 + 立即註冊 + TA還沒有勛章 + 座駕 + TA還沒有座騎 + + + com.pdlive.shayu.fileprovider + + + 數量 + 下一步 + 上傳 + 我的直播間 + 我的房間 + 管理員 + 拉黑用戶 + 禁言用戶 + 禁言用戶列表 +  的直播間 + 在綫列表 + 解除禁言 + 拉黑用戶列表 + 沒有被禁言用戶 + 沒有被拉黑用戶 + 你還不是管理員 + 解除拉黑 + 喜中 + 邀請碼 + 恭喜%1$s獲取%2$sx%3$s倍 + 幸運禮物說明 + 當前獎池等級 + 當前獎池金額 + 等級%1$s + 發送彈幕,需要到達%1$s級 + 發言,需要到達%1$s級 + 開定位 + 堅決關閉 + 關閉定位,直播不會被附近的人看到,直播間人數可能會减少,確認關閉嗎? + 火星 + 商城 + 明細 + 錢包 + 星幣 + + 個性簽名 + 個人資訊 + 請選擇支付方式 + 支出 + 收入 + 《用戶充值協議》 + 已閱讀並同意 + 請選擇充值金額 + 未選中支付方式 + 我的%1$s + 充值 + 领取 + 消息中心 + 所屬公會 + 開通貴族 + 確認支付 + 確認支付(¥%1$s) + 支付方式 + 立即支付 + 使用者等級 + 主播等級 + 連接已斷開,請重新開播 + 空空如也 + 聊天 + 給心儀的 + 開通了對 + 的守護 + 購買了座騎 + 購買了靚號 + VIP + 心願單 + 整蠱 + 多人PK + 連麥語音 + 周星榜 + 暫時離開 + 恢復直播 + 請輸入數字 + 您是當前主播的周守護\n守護日期截止到 + 我的%1$s: + 充值説明 + 注冊即代表同意 + 一次性贈送≥2000鑽石),可獲取粉絲特權喲 + 充值 + 今日直播心願單 + 禮物 + 用戶服務協議 + 一 粉絲特權 一 + 包裹 + 許下心願,觀衆幫你實現 + 禮物名稱 + 心願單 + 真愛排行 + + 發言微章 + 生成心願 + 隱私政策 + 每日禮包 + 添加禮物和數量 + 貴賓座席 + 當日設置的心願,會在當天24:00失效 + 真爱排行 + 複製 + 送禮獲得粉絲微章 + 直播中 + 休息中 + + 拜托拜托,可以關注一下我嗎? + 關注並退出 + 直接退出 + 用戶 + + 你都不主動我們怎麼會有故事,\n跟主播Say Hi吧~ + + 關注 + 進入活動 + + + 送給了 + 的直播間開通了 + 的直播間續費了 + 開通了 + 續費了 + 進入直播間 + + 金豆 + 給這篇動態的作者鼓鼓勵吧! + 確認鼓勵 + 動態鼓勵 + 鼓勵記錄 + 暫時還沒有人給予作者鼓勵T_T + 點擊查看更多 + 客服 + 設定 + 每日13:00PM-1:00AM + 撤回 + 開通貴族享受專屬特權! + + 與喜歡的人不期而遇~ + 暫無動態消息哦~~ + + 當前貴族: + 到期時間: + 已加入黑名单 + 加入黑名单失败 + 移除黑名单成功 + 移除黑名单失败 + + 回復 + 回復評論 + + 點此輸入回復內容 + + 暫時只對主播開放 + + 391137926073929 + 64dbc61681a4492544be268eb1084c3e + + ui10vIggex2F043HnztYNuA3g + J8jvBBeJoZbVojbkWUrvsj0K0UUkuV69CqQ7CEobhJn6tvAKpQ + F8t7PgspJ8Xl2k09ccqmnmynf + aq0eV4R1pqMK_AAeKRWnjPr7ErGMGgTPGgZJdm73WeRY-Kluws + + 1527128092082286592-NfYVOcHXy630vYUj4nMlDPh8PsVBHE + U5avdnRMb7yON6sYp4SAb1I99mFD8ch9KHIuFbEbd0IDN + + 完成新人前置任務 + 解鎖自定義功能 + 解鎖直播間發言功能 + 前置任務 + + 使用Facebook登录 + 使用Twitter登录 + + 請求超時,請稍後再試。 + + 免費領取1000金豆 + 當前綁定手機號為 + 確定綁定手機號 + 修改手機號 + 成功綁定手機號後將會自動獲得 + x1000 + 綁定手機賬號後,即可使用手機號登錄, + 同時可用於找回密碼。 + + 綁定賬號 + + 整蠱發起人 + 整蠱內容 + 免除本次整蠱 + + 消耗 + 感謝拯救 + + 需完成前置任務才可發言 + + 熱度加成中 + 熱度加成&時間 + +     熱度可以給主播的房間增加曝光度,熱度越高的直播間,在首頁的排名也越靠前,從而帶來更多的進房用戶,幫助主播在一段時間內迅速提高房間熱度,送出之後立即生效。 + 熱度卡如何獲得? + 1、周星榜主播冠軍的第一名用戶每週可自動獲得; + 2、通過參與官方活動,具體活動可留意官方消息。 + 熱度卡如何使用? + 前往「個人中心」-「我的包裹」中,即可使用熱度卡。 + 熱度卡生效多久? + 對指定主播使用熱度卡後,將會立即生效,效果時長為24小時,不管主播是否在線,熱度時長都將會持續減少 + diff --git a/common/src/main/res/values/style.xml b/common/src/main/res/values/style.xml new file mode 100644 index 000000000..b31bb9383 --- /dev/null +++ b/common/src/main/res/values/style.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/xml/file_paths.xml b/common/src/main/res/xml/file_paths.xml new file mode 100644 index 000000000..f015a2f27 --- /dev/null +++ b/common/src/main/res/xml/file_paths.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config.gradle b/config.gradle new file mode 100644 index 000000000..eddca7244 --- /dev/null +++ b/config.gradle @@ -0,0 +1,29 @@ +ext { + android = [ + compileSdkVersion: 30, + buildToolsVersion: "28.0.3", + minSdkVersion : 21, + targetSdkVersion : 30, + versionCode : 189, + versionName : "6.3.5" + ] + manifestPlaceholders = [ + //正式 + serverHost : "https://napi.yaoulive.com", + //測試 +// serverHost : "https://ceshi.yaoulive.com", + + //腾讯地图 + txMapAppKey : "EOZBZ-ASLCU-4XPV3-BDCHZ-4E3Q7-H4BWB", +// txMapAppSecret : "", + + //百度语音识别 + + baiduAppId : "23774720", + baiduAppKey : "zgCgFhUKEOV7I3ZXDFpTfnRB", + baiduAppSecretKey: "nEVSgmuGpU0pjPr6VleEGGAl0hzGW52S", + +// true表示谷歌支付 false + isGooglePlay : true + ] +} \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle new file mode 100644 index 000000000..c9f6e4287 --- /dev/null +++ b/dependencies.gradle @@ -0,0 +1,37 @@ +ext { + + dependencies = [ + "appcompat-androidx" : 'androidx.appcompat:appcompat:1.0.2', + "recyclerview-androidx": 'androidx.recyclerview:recyclerview:1.0.0', + "design" : 'com.google.android.material:material:1.0.0', + "cardview-androidx" : 'androidx.cardview:cardview:1.0.0', + "multidex" : 'androidx.multidex:multidex:2.0.0', + "okhttp" : 'com.squareup.okhttp3:okhttp:3.14.9',//okHttp网络请求 + "okgo" : 'com.lzy.net:okgo:3.0.4',//OkGo 是对okHttp的封装 + "okserver" : 'com.lzy.net:okserver:2.0.5',//OkGo上传下载扩展库 + "fastjson" : 'com.alibaba:fastjson:1.1.70.android',//fastJson解析json + "eventbus" : 'org.greenrobot:eventbus:3.0.0',//eventbus事件总线 + "glide" : 'com.github.bumptech.glide:glide:4.9.0',//使用Glide加载图片 + "glide-transformations": 'jp.wasabeef:glide-transformations:3.1.1',//一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果 + "roundedimageview" : 'com.makeramen:roundedimageview:2.3.0', //带圆角,边框的的ImageView + "gif-drawable" : 'pl.droidsonroids.gif:android-gif-drawable:1.2.23',//gif库,播放礼物gif用 + "SVGAPlayer" : 'com.github.yyued:SVGAPlayer-Android:2.5.14', //svga播放器 + "qiniu-sdk" : 'com.qiniu:qiniu-android-sdk:7.2.1',//七牛云存储 + "tencent-cosxml" : 'com.tencent.qcloud:cosxml:5.4.13',//腾讯云存储 + "tencent-wechat-sdk" : 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+',//微信sdk,支付登录分享 + "tencent-bugly" : 'com.tencent.bugly:crashreport:2.6.6',//腾讯bugly + "umeng-common" : 'com.umeng.sdk:common:1.5.3',//友盟统计 + "umeng-analytics" : 'com.umeng.sdk:analytics:7.5.3',//友盟统计 + "ucrop" : 'com.github.yalantis:ucrop:2.2.3',//图片裁剪 + "smartRefreshLayout" : 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-20',//下拉刷新上拉加载 + "magicIndicator" : 'com.github.hackware1993:MagicIndicator:1.6.0',//ViewPager指示器 + "banner" : 'com.ms:banner:1.0.0',//轮播图 + "Luban" : 'top.zibin:Luban:1.1.8',//鲁班压缩图片 + "arouter" : 'com.alibaba:arouter-api:1.5.2',//ARouter + "arouter-compiler" : 'com.alibaba:arouter-compiler:1.2.2', + "blank-utilcode" : 'com.blankj:utilcode:1.25.9', + + ] + + +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..3c93222c4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,20 @@ +## For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +#Thu Feb 04 00:05:45 CST 2021 +android.injected.testOnly=false +org.gradle.daemon=true +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.parallel=true +org.gradle.configureondemand=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..13372aef5 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..f55729f8f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +#Mon Sep 17 11:16:30 CST 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip + diff --git a/gradlew b/gradlew new file mode 100644 index 000000000..9d82f7891 --- /dev/null +++ b/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..609bfa897 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-groupLast arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command groupLast arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments uid the 4NT Shell uid JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command groupLast + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/hdl.jks b/hdl.jks new file mode 100644 index 000000000..576761ca5 Binary files /dev/null and b/hdl.jks differ diff --git a/lib_beauty360/build.gradle b/lib_beauty360/build.gradle new file mode 100644 index 000000000..c9d498c07 --- /dev/null +++ b/lib_beauty360/build.gradle @@ -0,0 +1,77 @@ +apply plugin: 'com.android.library' +apply plugin: 'img-optimizer' + + +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + packagingOptions { + pickFirst "lib/armeabi/libyuvutils.so" + pickFirst "lib/arm64-v8a/libyuvutils.so" + pickFirst "lib/armeabi-v7a/libyuvutils.so" + pickFirst "lib/armeabi/libyuvtools.so" + pickFirst "lib/arm64-v8a/libyuvtools.so" + pickFirst "lib/armeabi-v7a/libyuvtools.so" + exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" + exclude "lib/arm64-v8a/libmmcv_api_express.so" + exclude "lib/arm64-v8a/libMediaEncoder.so" + exclude "lib/arm64-v8a/libarcore_sdk_c.so" + exclude "lib/arm64-v8a/libmediadecoder.so" + exclude "lib/arm64-v8a/libMediaMuxer.so" + exclude "lib/arm64-v8a/libarcore_sdk_jni.so" + exclude "lib/arm64-v8a/libMediaUtils.so" + exclude "lib/arm64-v8a/libcosmosffmpeg.so" + + } + + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + manifestPlaceholders = rootProject.ext.manifestPlaceholders + + testInstrumentationRunner "android.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + + flavorDimensions "version" + productFlavors { + original { + dimension "version" + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} +repositories { + flatDir { + dirs 'libs' + } + mavenCentral() +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation rootProject.ext.dependencies["appcompat-androidx"] + implementation rootProject.ext.dependencies["recyclerview-androidx"] + + implementation project(path: ':common') +} diff --git a/lib_beauty360/consumer-rules.pro b/lib_beauty360/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/lib_beauty360/img_optimizer.log b/lib_beauty360/img_optimizer.log new file mode 100644 index 000000000..f9af03a78 --- /dev/null +++ b/lib_beauty360/img_optimizer.log @@ -0,0 +1,16 @@ +2019-11-01 13:59:28 info: Task optimizeLib_beauty360Release begin: +---------------------------------------- +2019-11-01 13:59:28 info: 4 images need to be optimized. +---------------------------------------- +2019-11-01 13:59:28 warn: Skipped! /Users/yaling/Documents/bayue/denglong_release4/lib_beauty360/src/main/res/drawable/icon_none.png +---------------------------------------- +2019-11-01 13:59:28 info: Succeed! 3464B-->883B, 74.50924% saved! /Users/yaling/Documents/bayue/denglong_release4/lib_beauty360/src/main/res/drawable/icon_none_32.png +---------------------------------------- +2019-11-01 13:59:29 info: Succeed! 2943B-->1353B, 54.026505% saved! /Users/yaling/Documents/bayue/denglong_release4/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb.png +---------------------------------------- +2019-11-01 13:59:29 info: Succeed! 3673B-->2632B, 28.341955% saved! /Users/yaling/Documents/bayue/denglong_release4/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb_press.png +---------------------------------------- +2019-11-01 13:59:29 info: Total: 4, Succeed: 3, Skipped: 1, Failed: 0, Saved: 5.08984375KB +---------------------------------------- +2019-11-01 13:59:29 info: Task optimizeLib_beauty360Release executed successfully. +---------------------------------------- diff --git a/lib_beauty360/proguard-rules.pro b/lib_beauty360/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/lib_beauty360/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/lib_beauty360/src/androidTest/java/com/by/lib_beauty360/ExampleInstrumentedTest.java b/lib_beauty360/src/androidTest/java/com/by/lib_beauty360/ExampleInstrumentedTest.java new file mode 100644 index 000000000..374674278 --- /dev/null +++ b/lib_beauty360/src/androidTest/java/com/by/lib_beauty360/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.by.lib_beauty360; + +import android.content.Context; + +import android.test.platform.app.InstrumentationRegistry; +import android.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.by.lib_beauty360.test", appContext.getPackageName()); + } +} diff --git a/lib_beauty360/src/main/AndroidManifest.xml b/lib_beauty360/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c51b6682c --- /dev/null +++ b/lib_beauty360/src/main/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/AppConfig.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/AppConfig.java new file mode 100644 index 000000000..ac75a7d5b --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/AppConfig.java @@ -0,0 +1,78 @@ +package com.by.lib_beauty360; + +import android.os.Environment; + +import java.io.File; + +/** + * Created by wh on 2017/3/16. + */ + +public class AppConfig { + + + public static final String SDK_KEY_NEW = "NsWl9ZRt+oHFWVmgwmmGFmoGRyzu7xoF2SFj43Xw0gpqYALgUZ+RY8ATXKGIawejr0LMtnYFfVyqfc8uellQXT+PyZzNB+PCtGBO2yj+5I2PsB2eCXr6qb6zccJxMg2s8Ekj5FEn26mrB3k/FXBFCxG9u6caUqYmvcBLbb17K2eghd8zRlsCZ2PJnqcKUkzB5K4wqXHSzYu2f9xXrPibCNqYUYhpC6eZVqY1/JetMKTPNcyfI522A2CKS6fq/gIEWSirosAIAuZAqhyI7augB/3489uaepcD3pQAjo9MhJqavvNh5He7X2ohV3ZCy4Q+3D1FWJySZl4Jth35+XgV6ErtRaWpUfbujyZ78yAjtUmbewnz1yZVwB/AD+JRd/nNd9agrI/2LmJSW6gSlj2k+ehw8k5SREnJR9EX75dftDc89d49eeB1Dh6fmyipCzjil8MCwulCuG4+OjumfP7/U66NfcSbRZyOMn5FTPBgjZnydycKWJUSEXYhJkCkaaa6Fq4oYM64JTaY5WldWmG+aRktCTYW/BtopPbI/qSY5CJpN+K7Q+ORCxta8LNYQXlVWxEy1A22PxGy8RWvWrwI0ncjnKmCT8Szih222P7ad+8lCA6lHZZx8njfPFAD7tvuxTUPAAkY5t8yvlBMK5rcyIaz09BZQdUOzWqgqg7eamPMVaDzmWOIl9JHlCEC2jLp4CcyqQcDuOAUb/OA/e385CTaqrnTXIe7/TRAqocRmTtHnuwbAgVxv53K9hhPOJ2kSH0hshHP+hRIN3J8Pmqetee46Be/pu0dDGnqYA2v4fp9MHmeuhiTH20K8rViYV64KZVDmOu9mcT9jkVPZwFPQnE/BfV5NOsW83r8FmCQ9ignmOmavsNsTAhsc7Vs75Kc/Jhoj/0K5jpiLTU5ZbhPqIbl1ciFTJHlYHirzfhUotlxGDGWsR7jC56bPXSANHY/9nY8ZnmvADlADjLmlZYqpRhM5Ef8nTntjlAa9bvu92oo6Whn2DQAuBn3v839zqc8WMZYaJY1GmZm0+MQxTf51CQ/KNl0hvW5V59JEPChEVbRG0QjYWcECQvXUCXylokGnBYDwtqBbll7az/JHed7GzPej7AcEXZVg3i2MjOGph+Gn0VRVdfNayCKfWCRaOi3i4P9GxQqNWvPvAnAOVrwBlg9dba7HON9pbl426q64vRiAKGaUvMbIMtKGLVK3kgqKkrUb+uw+Q+vmWc1ijYk24ZtlJ4l9Pwnadxwi8sXJTlr9GqIv63fCs2AQeZnCy38tUP2uifZPM05EwngI0Xu1Md7Tj19Sj6h/KnTyqpIMuMYQuSwmammhj+AQesB49j7NlEdu68kfaJ0PDslOY8voY/FwCRBdNTDep3OAS7pLYccp79x0R9z25kQVymPaIuQh/RIu6Wv4FpdFH0JA/ydmQWcf5B/SRmYp4OfQuwFRSYDN934du0W599vgRCRP82N7oUJp4Bi2CNCuR+kttWqQkSDDKxyiuH7m2+97QLIbTfuh12AKBKCq51YBVK/twn4DOWssVosTw+YdjiIzAQX0dw+Nh6vSTymWbu9y17OAvZ2702Tm7cOypZh8N4Ia9X3E7LlSLZSXzg/FfbzR0JGbLi2xKwLGSex5FeaAOZBY5l0JuoQR6ESaIFVpUbZBCIzBoG0TZEeMmLWnyrzyHjqROT9z+ZzJxtaoGKHj4a/M2JGn9dbdpGa0TJ3fXlUdldin876FCRCl/1CJiJAq1e2TKhlH4pyetdHqycxpLA5ykb8S72Fkw1DPiEj4jyCHL79B/67VCqB9u3lSLcFtGTEWxi6MTzs6o6SuHTNh1gs6E7qFlCLrSVSJCPkF+hL5HYxGY51Myx9qswHv/yiuMByTQMerWjKDjXS73xuBEc7n8pZZVGTzpPWb+EIMTEpD5ht10cB2W/l3944F3rZnMclgG1cYRPGKCMQetPJqrN7QVVyH40MAiUEBB7tqh2Q9LDfWzXtiUfM6AoecPM+Kj4v1Tx8y+pc7mkarMziSWRYWRPLqhwjiPEcP0kYlwMXDaVY0cKWGVY2DjfBS4YqQVGQUkRw96gjTVps2TjBK3j8TMW4/0QU0U+iG0JCI68mIZ3d7zYOvTO7MB2Te2qYvKIA4qypL9eYvSJbF+Ner+i9vviD7TdMjTJHkG8W6A/Q+KN4GLCKS8dCnyF4wpeW2P6aUU1NBNrV8tmhNxvYYI0TIymSoWgdicfxi6AUXOV6yQHPdH4fSHSBcNmJyde8Gc9T3rU9Litg3lSF0DFPCmzF/vjRk+UaUWH5j0jDA7sjcOw/LyIKwm81+P6ho5DQv+lxzpsUoxfU68OfZQqDK1ba5BFrJ7vTN7G3g5bmSGSmtSaLiCp/+RtJuHF6E0FKpPnoYo0RkZisoXxSJYNhgP5Ngc7SWDDVjyEpsZRTGNPeR3SdR9DkVa8aJkfkG6kWgKgCBRhXURR8iC4EkDCgluj/5OjrF2szwVqqR/8BRiONOWfZM5HeGqy3ioVbr47JAdqTKwEieAOxjHp5dB35GCsS1cd2kHggSJ88+qQs4rffmtYvtuHRUeXZfzFn7OYli78NfXQIZ4Tfa2cy8EKCeZ6lHq+ieKT34tbeyZZxSm9KUUrc2rDjHO40FIP4u4kEZjpfB9q1sFU0ItUTdkQCwBm5kaRxXMNOdcDAv8ehxckSo09/xepW0tkyrjHg3xhGIMKIc10fWOaAOiGw2BMV1c/jeAxhAm5hPOUptIAbVeSkCbyaEUwAOlANZ9n2lSYzIB7vusjdEHv1uTKYHMUjq0pihDfHR1n1FflYm/ZT5mc6B0uR1K82Ecg8gwjvDWoD8rKWS5ec2AjH/g+l3E6fTm5CLxFwzPrMaVAg8fZIoEEz/iU9uZkbzuxu6rOiBsljGKWFXLi/eYJ3QioY1RQpLJDfOw=="; + + //滤镜列表 17/05/11 + public static String[] mFilterName = {"深度美白", "清新丽人", "暖暖阳光", "香艳红唇", "艺术黑白", + "甜美", "温暖", "果冻", "唯美", "淡雅", "清新", + "Movie", "电影色1", "电影色2", "胶片", + "日系", "淡雅", "怀旧", "黑调", "少女", "初夏", "超现实" }; + public static String[] mFilterType = {"Deep", "Skinfresh", "Sunshine", "Sexylips", "Skinbw", + "Sweet", "Lightwarm", "Jelly", "Grace", "Elegant", + "Fresh", "Movie", "FM2", "FM7", "Vista", + "Chihiro", "LZYY", "OldTimeFour", "OldTimeTwo", "PinkyFive", "Zoe", "SketchBW" }; + + public static String[] mFilterNameAll = {"无", + "深度美白", "清新丽人", "暖暖阳光", "香艳红唇", "艺术黑白", + "甜美", "温暖", "果冻", "唯美", "淡雅", "清新", + "Movie", "电影色1", "电影色2", "胶片", + "日系", "淡雅2", "怀旧", "黑调", "少女", "初夏", "超现实" +// ,"漏光","AU","菊次郎","挪威森林","红润" + ,"M霏颜","M清凉","M蓝调","M柔光","M初夏", + "B棉花糖","B纯真","B红润","B清晰","B桃花", + "B心境","B霏颜"}; + public static String[] mFilterTypeAll = {"none", + "Deep", "Skinfresh", "Sunshine", "Sexylips", "Skinbw", + "Sweet", "Lightwarm", "Jelly", "Grace", "Elegant", "Fresh", + "Movie", "FM2", "FM7", "Vista", + "Chihiro", "LZYY", "OldTimeFour", "OldTimeTwo", "PinkyFive", "Zoe", "SketchBW" +// ,"YKLightLeak","YKButterAU","YKVUEL3","YKVUER1","SkinRosy" + ,"MYFeiYan","MYQingLiang","MYLanDiao","MYRouGuang","MYChuXia", + "KJMianHuaTang", "KJChunZhen","KJHongRun","KJQingXi","KJTaoHua", + "KJXinJing","KJFeiYan" + }; + + + public static int[] mFilterPictrueAll = {R.drawable.icon_none_32, + R.drawable.shen_du_mei_bai, R.drawable.qing_xin_li_ren, R.drawable.nuan_nuan_yang_guang, R.drawable.xiang_yan_hong_chun, R.drawable.yi_shu_hei_bai, + R.drawable.tian_mei, R.drawable.wen_nuan, R.drawable.guo_dong, R.drawable.wei_mei, R.drawable.dan_ya, R.drawable.qing_xin, + R.drawable.movie, R.drawable.movie1, R.drawable.movie2, R.drawable.jiao_pian, + R.drawable.ri_xi, R.drawable.dan_ya2, R.drawable.huai_jiu, R.drawable.hei_diao, R.drawable.shao_nv, R.drawable.chu_xia, R.drawable.chao_xian_shi, + +// R.drawable.shen_du_mei_bai, R.drawable.qing_xin_li_ren, R.drawable.nuan_nuan_yang_guang, R.drawable.xiang_yan_hong_chun, R.drawable.yi_shu_hei_bai, + R.drawable.m_fei_yan, R.drawable.m_qing_liang, R.drawable.m_lan_diao, R.drawable.m_rou_guang, R.drawable.m_chu_xia, + R.drawable.b_mian_hua_tang, R.drawable.b_chun_zhen, R.drawable.b_hong_run, R.drawable.b_qing_xi, R.drawable.b_tao_hua, + R.drawable.b_xin_jing, R.drawable.b_fei_yan, }; + + + + //贴纸列表 +// public static String[] mTiezhiName = {"无","大哭河", "大眼睛", "大眼睛发夹", "粉色蝴蝶结", "搞怪眼镜", +// "狗耳朵", "红色嘴唇", "皇冠", "婚礼森系小仙女捧花", "蓝色猫耳朵", +// "龙猫", "猫耳朵", "猫咪玩球", "米老鼠耳朵", "米老鼠蝴蝶结", +// "沙球", "闪光黄金耳朵", "桃心兔子耳朵", "天使羽毛", "兔子带草花", "星空眼镜", "长颈鹿","猪鼻子" }; + + + public static final String DEFAULT_PATH = Environment.getExternalStorageDirectory() + + File.separator + "sdk_demo" + File.separator; + + public static final String STICKER_NAME = "TestSticker"; + + public static final String STICKER_LOCAL_PATH = DEFAULT_PATH + "sticker" + File.separator ; + + public static final String STICKER_NOMEDIA_PATH = DEFAULT_PATH + ".nomedia"; + + public static final boolean IS_USE_INDEPENDENT_THREAD = false; + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/Beauty360Activity.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/Beauty360Activity.java new file mode 100644 index 000000000..b7e9baedc --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/Beauty360Activity.java @@ -0,0 +1,320 @@ +package com.by.lib_beauty360; + +import android.app.Activity; + + +//Camera360美颜 +public class Beauty360Activity extends Activity { +// implements SurfaceHolder.Callback, +// SurfaceTexture.OnFrameAvailableListener, +// SeekBar.OnSeekBarChangeListener, Camera.PreviewCallback, MyItemClickListener { +// +// private float mPinkValue = 0.4f; +// private float mWhitenValue = 0.7f; +// private float mReddenValue = 0.5f; +// private int mSoftenValue = 70; +// private int mFilterValue = 100; +// private boolean mClear = false; +// +// private RecyclerView mListView; +// private MyRecycleAdapter4LvJing mAdapter; +// private List mListData; +// private String mCurFilterStrength; +// +// private PreviewUtils mPreviewUtils; +// private SurfaceView mSurfaceView; +// private boolean mFirstFrame = true; +// +// private boolean isSticker = false; +// private boolean zipSuccess = false; +// Context mContext; +// TextView tvSticker; +// private OrientationEventListener mOrientationListener; +// +// @Override +// protected void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setContentView(R.layout.activity_main2); +// mContext = this; +// mPreviewUtils = new PreviewUtils(getApplicationContext(), this); +// initViews(); +// +// /** +// * 贴纸zip 解压到本地 +// */ +// new UnzipAssets().unZipRequest(this, "TestSticker.zip", new UnzipAssets.IUnZipCallBack() { +// @Override +// public void onStart() { +// } +// +// @Override +// public void Response(String outFileDirectory) { +// zipSuccess = true; +// } +// +// @Override +// public void onError() { +// } +// }); +// +// } +// +// public void initViews() { +// mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); +// +// SeekBar m_Seekpink = (SeekBar) findViewById(R.id.seek_pink); +// m_Seekpink.setOnSeekBarChangeListener(this); +// m_Seekpink.setProgress((int) (mPinkValue * 100)); +// TextView tv_pink = (TextView) findViewById(R.id.pink_value); +// tv_pink.setText(String.valueOf(mPinkValue)); +// +// SeekBar m_Seekwhiten = (SeekBar) findViewById(R.id.seek_whiten); +// m_Seekwhiten.setOnSeekBarChangeListener(this); +// m_Seekwhiten.setProgress((int) (mWhitenValue * 100)); +// TextView tv_whiten = (TextView) findViewById(R.id.whiten_value); +// tv_whiten.setText(String.valueOf(mWhitenValue)); +// +// SeekBar m_Seekredden = (SeekBar) findViewById(R.id.seek_redden); +// m_Seekredden.setOnSeekBarChangeListener(this); +// m_Seekredden.setProgress((int) (mReddenValue * 100)); +// TextView tv_redden = (TextView) findViewById(R.id.redden_value); +// tv_redden.setText(String.valueOf(mReddenValue)); +// +// +// SeekBar m_Seeksoften = (SeekBar) findViewById(R.id.seek_soften); +// m_Seeksoften.setOnSeekBarChangeListener(this); +// m_Seeksoften.setProgress(mSoftenValue); +// TextView tv_soften = (TextView) findViewById(R.id.soften_value); +// tv_soften.setText(String.valueOf(mSoftenValue)); +// +// SeekBar m_SeeksFilter = (SeekBar) findViewById(R.id.filter_redden); +// m_SeeksFilter.setOnSeekBarChangeListener(this); +// m_SeeksFilter.setProgress(mFilterValue); +// TextView tv_filter = (TextView) findViewById(R.id.filter_value); +// tv_filter.setText(String.valueOf(mFilterValue)); +// +// tvSticker = (TextView) findViewById(R.id.tv_sticker); +// tvSticker.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// if (!zipSuccess) return; +// if (!isSticker) { +// tvSticker.setText("取消贴纸"); +// isSticker = true; +// mPreviewUtils.setSticker(AppConfig.STICKER_LOCAL_PATH + "TestSticker/dog"); +// } else { +// tvSticker.setText("贴纸"); +// isSticker = false; +// mPreviewUtils.removeSticker(); +// } +// +// } +// }); +// tvSticker.setVisibility(View.VISIBLE); +// +// View layoutSurface = findViewById(R.id.layout_surface); +// layoutSurface.setOnTouchListener(new View.OnTouchListener() { +// @Override +// public boolean onTouch(View v, MotionEvent event) { +// switch (event.getAction()) { +// case MotionEvent.ACTION_DOWN: +// case MotionEvent.ACTION_MOVE: +// clearAllBuffer(); +// break; +// case MotionEvent.ACTION_CANCEL: +// case MotionEvent.ACTION_UP: +// resetBuffer(); +// break; +// } +// return true; +// } +// }); +// +// mListView = (RecyclerView) findViewById(R.id.listview); +// LinearLayoutManager mLayoutManager = new LinearLayoutManager(mListView.getContext(), LinearLayoutManager.HORIZONTAL, false); +// mListView.setLayoutManager(mLayoutManager); +// ConstructList(); +// mAdapter = new MyRecycleAdapter4LvJing(this, mListData); +// mListView.setAdapter(mAdapter); +// mListView.setItemAnimator(new DefaultItemAnimator()); +// } +// +// @Override +// public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { +// int id = seekBar.getId(); +// if (id == R.id.seek_pink) { +// if (fromUser) { +// mPinkValue = progress / 100f; +// mPreviewUtils.SetSkinColor(mPinkValue, mWhitenValue, mReddenValue); +// TextView tv_pink = (TextView) findViewById(R.id.pink_value); +// tv_pink.setText(String.valueOf(mPinkValue)); +// } +// } else if (id == R.id.seek_whiten) { +// if (fromUser) { +// mWhitenValue = progress / 100f; +// mPreviewUtils.SetSkinColor(mPinkValue, mWhitenValue, mReddenValue); +// TextView tv_whiten = (TextView) findViewById(R.id.whiten_value); +// tv_whiten.setText(String.valueOf(mWhitenValue)); +// } +// } else if (id == R.id.seek_redden) { +// if (fromUser) { +// mReddenValue = progress / 100f; +// mPreviewUtils.SetSkinColor(mPinkValue, mWhitenValue, mReddenValue); +// TextView tv_redden = (TextView) findViewById(R.id.redden_value); +// tv_redden.setText(String.valueOf(mReddenValue)); +// } +// } else if (id == R.id.filter_redden) { +// if (fromUser) { +// mFilterValue = progress; +// mPreviewUtils.SetColorFilterStrength(mFilterValue); +// TextView tv_blur = (TextView) findViewById(R.id.filter_value); +// tv_blur.setText(String.valueOf(mFilterValue)); +// } +// } else if (id == R.id.seek_soften) { +// if (fromUser) { +// mSoftenValue = progress; +// mPreviewUtils.SetSkinSoftenStrength(mSoftenValue); +// TextView tv_soften = (TextView) findViewById(R.id.soften_value); +// tv_soften.setText(String.valueOf(mSoftenValue)); +// } +// } +// } +// +// @Override +// public void onStartTrackingTouch(SeekBar seekBar) { +// } +// +// @Override +// public void onStopTrackingTouch(SeekBar seekBar) { +// } +// +// @Override +// protected void onResume() { +// super.onResume(); +// mPreviewUtils.onresume();//启动照相机 +// reStartEngine(); +// +// // 注册方向回调,检测屏幕方向改变 +// if (null == mOrientationListener) { +// mOrientationListener = new OrientationEventListener(this) { +// @Override +// public void onOrientationChanged(int orientation) { +// mPreviewUtils.onScreenOriChanged(orientation); +// } +// }; +// mOrientationListener.enable(); +// } +// } +// +// public void reStartEngine() { +// DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); +// float fScreenHeight = displayMetrics.heightPixels; +// +// int iLayoutHeight = (int) fScreenHeight;//- (int)(fScreenHeight * 0.2f); +// int iLayoutWidth = (int) ((iLayoutHeight / (float) mPreviewUtils.getCameraWidth()) * mPreviewUtils.getCameraHeight()); +// +// mSurfaceView.getHolder().addCallback(this); +// +// ViewGroup.LayoutParams surfaceLayout; +// surfaceLayout = mSurfaceView.getLayoutParams(); +// surfaceLayout.width = iLayoutWidth; +// surfaceLayout.height = iLayoutHeight; +// mSurfaceView.setLayoutParams(surfaceLayout); +// } +// +// +// @Override +// protected void onPause() { +// super.onPause(); +// mPreviewUtils.pause(); +// mFirstFrame = true; +// +// if (null != mOrientationListener) { +// mOrientationListener.disable(); +// mOrientationListener = null; +// } +// } +// +// @Override +// protected void onDestroy() { +// super.onDestroy(); +// mPreviewUtils.freeRes(); +// } +// +// @Override +// public void surfaceCreated(SurfaceHolder holder) { +// mPreviewUtils.startCameraPreview(holder);//开始预览 绑定surface +// } +// +// @Override +// public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { +// mPreviewUtils.setCameraInfo(width, height); +// } +// +// @Override +// public void surfaceDestroyed(SurfaceHolder holder) { +// } +// +// @Override +// public void onFrameAvailable(SurfaceTexture surfaceTexture) { +// } +// +// @Override +// public void onPreviewFrame(byte[] data, Camera camera) { +// mPreviewUtils.frameProcess(data, 0, mFirstFrame, false);//data 可以传空 根据TextureId进行美颜 +// mFirstFrame = false; +//// getTxLivePush(); +// } +// +// private void getTxLivePush() { +// +// } +// +// private void ConstructList() { +// mListData = new ArrayList<>(); +// for (int i = 0; i < AppConfig.mFilterName.length; ++i) { +// ItemData4LvJing itemData = new ItemData4LvJing(); +// itemData.filterName = AppConfig.mFilterName[i]; +// itemData.filterType = AppConfig.mFilterType[i]; +// mListData.add(new HomeItemCell4LvJing(this, itemData, this)); +// } +// } +// +// @Override +// public void onItemClick(String filtertype) { +// if (TextUtils.isEmpty(filtertype)) +// return; +// +// if (filtertype.equals(mCurFilterStrength)) { +// return; +// } +// mCurFilterStrength = filtertype; +// mPreviewUtils.SetColorFilterByName(filtertype); +// mPreviewUtils.SetColorFilterStrength(mFilterValue); +// mAdapter.notifyDataSetChanged(); +// +// } +// +// @Override +// public String getCurFilterType() { +// return mCurFilterStrength; +// } +// +// +// private void clearAllBuffer() { +// if (mClear) return; +// mClear = true; +// mPreviewUtils.SetSkinColor(0, 0, 0); +// mPreviewUtils.SetSkinSoftenStrength(0); +// mPreviewUtils.SetColorFilterStrength(0); +// } +// +// private void resetBuffer() { +// mClear = false; +// mPreviewUtils.SetSkinColor(mPinkValue, mWhitenValue, mReddenValue); +// mPreviewUtils.SetSkinSoftenStrength(mSoftenValue); +// mPreviewUtils.SetColorFilterStrength(mFilterValue); +// +// } + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/CameraUtils.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/CameraUtils.java new file mode 100644 index 000000000..14c9e1347 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/CameraUtils.java @@ -0,0 +1,207 @@ +package com.by.lib_beauty360; + +import android.graphics.ImageFormat; +import android.graphics.SurfaceTexture; +import android.hardware.Camera; +import android.util.Log; + +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * Created by xieyi on 2017/banner_03/12. + */ + +public class CameraUtils implements ICameraUtils { + private final String LOG_TAG = "CameraUtils"; + private Camera mCamera; + private Object mThreadLock = new Object(); + private int mCurrentCameraType = 1;//Camera.CameraInfo.CAMERA_FACING_FRONT + private Camera.Size mCameraPreviewFrameSize; + private int mOritation; + Camera.PreviewCallback mPreviewCallbakck; + SurfaceTexture mSurfaceTexture; + + public CameraUtils(Camera.PreviewCallback callback) { + mPreviewCallbakck = callback; + + } + + public void switchCamera() { + if (mSurfaceTexture == null) return; + stopCamera(); + mCurrentCameraType = mCurrentCameraType == 0 ? 1 : 0; + startCamera(); + startCameraPreview(mSurfaceTexture); + + } + + public int getCurrentOrientation() { + return mOritation; + } + + @Override + public void stopCamera() { + if (mCamera == null) + return; + synchronized (mThreadLock) { + mCamera.stopPreview(); + mCamera.setPreviewCallback(null); + mCamera.release(); + mCamera = null; + } + Log.i(LOG_TAG, "stopped camera"); + } + + @Override + public void switchCameraFlashLigth() { + if (mCamera == null) {return;} + Camera.Parameters camParams = mCamera.getParameters(); + if (camParams != null){ + if ( Camera.Parameters.FLASH_MODE_TORCH.equals(camParams.getFlashMode() ) ){ + camParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);//设置成关闭的 + } + else { + camParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);//设置成开启的 + } + mCamera.setParameters(camParams); + } + } + + @Override + public void startCamera() { + Log.i(LOG_TAG, "starting camera"); + if (mCamera != null) return; + synchronized (mThreadLock) { + Camera.CameraInfo camInfo = new Camera.CameraInfo(); + + int numCameras = Camera.getNumberOfCameras(); + for (int i = 0; i < numCameras; i++) { + Camera.getCameraInfo(i, camInfo); + if (camInfo.facing == mCurrentCameraType) { + mCamera = Camera.open(i); + mOritation = camInfo.orientation; + break; + } + } + + if (mCamera == null) { + Log.i(LOG_TAG, "No back-facing camera found; opening default"); + mCamera = Camera.open(); + } + if (mCamera == null) { + throw new RuntimeException("Unable to open camera"); + } + + Camera.Parameters camParams = mCamera.getParameters(); + + mCameraPreviewFrameSize = getProperPreviewSize(camParams); + if (mCameraPreviewFrameSize == null) + mCameraPreviewFrameSize = camParams.getPreviewSize(); + + + if (mCameraPreviewFrameSize != null) { + camParams.setPreviewSize(mCameraPreviewFrameSize.width, mCameraPreviewFrameSize.height); + } + camParams.setPreviewFormat(ImageFormat.NV21);//YV12时才用 + + camParams.setRecordingHint(true); + + + mCamera.setParameters(camParams); + mCamera.setPreviewCallback(mPreviewCallbakck); + /* mCamera.addCallbackBuffer(new byte[((mCameraPreviewFrameSize.width * mCameraPreviewFrameSize.height) + * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]); + + mCamera.setPreviewCallbackWithBuffer(mPreviewCallbakck);*/ + + + int[] fps = new int[2]; + camParams.getPreviewFpsRange(fps); + + Log.i(LOG_TAG, "camera preview frame size is " + mCameraPreviewFrameSize.width + "x" + mCameraPreviewFrameSize.height); + Log.i(LOG_TAG, "camera preview fps range is " + fps[0] / 1000.0f + " - " + fps[1] / 1000.0f); + } + } + +/* + + public void setPreviewCallback(Camera.PreviewCallback callback){ + mCamera.setPreviewCallbackWithBuffer(callback); + } +*/ + + @Override + public void startCameraPreview(SurfaceTexture surfaceTexture) { + + try { + mSurfaceTexture = surfaceTexture; + if (mCamera!=null && mSurfaceTexture!=null){ + mCamera.setPreviewTexture(mSurfaceTexture); + } + } catch (IOException e) { + e.printStackTrace(); + } + + // start the camera preview output + Log.i(LOG_TAG, "starting camera preview"); + if (mCamera != null) + mCamera.startPreview(); + + } + + public void addCallbackBuffer(byte[] data) { + mCamera.addCallbackBuffer(data); + } + + + private Camera.Size getProperPreviewSize(Camera.Parameters parameters) { + int min = 640 * 480; + int max = 720 * 1280; + List sizeList = parameters.getSupportedPreviewSizes(); + + Collections.sort(sizeList, new Comparator() { + public int compare(Camera.Size o1, Camera.Size o2) { + if (o1.width > o2.width) { + return -1; + } + if (o1.width == o2.width) { + if (o1.height > o2.height) return -1; + if (o1.height == o2.height) return 0; + return 1; + } + return 1; + } + }); + + Camera.Size previewSize = null; + for (int i = 0; i < sizeList.size(); i++) { + Camera.Size size = sizeList.get(i); + int value = size.width * size.height; + + if (value >= min && value <= max) { + previewSize = size; + break; + } + } + + return previewSize; + } + + @Override + public int getCameraWidth() { + return mCameraPreviewFrameSize.width;//1280 + } + + @Override + public int getCameraHeight() { + return mCameraPreviewFrameSize.height;//720 + } + + @Override + public int getCameraID() { + return mCurrentCameraType; + } +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/GlContextUtils.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/GlContextUtils.java new file mode 100644 index 000000000..badafb443 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/GlContextUtils.java @@ -0,0 +1,97 @@ +package com.by.lib_beauty360; + +import android.graphics.SurfaceTexture; +import android.util.Log; +import android.view.SurfaceHolder; + + + +/** + * Created by wh on 2017/03/12. + */ + +public class GlContextUtils { +// +// private final String LOG_TAG = "GlContextUtils"; +// +// private IContextManagerApi mGlContext; +// private SurfaceTexture mCameraTexture; +// private int mCameraTextureID; +// +// public GlContextUtils() { +// if (AppConfig.IS_USE_INDEPENDENT_THREAD) { +// mGlContext = new PGContextManager(); +// } else { +// mGlContext = new PGContextManager2(); +// } +// } +// +// public SurfaceTexture init(SurfaceHolder holder) { +// +// mGlContext.initGLContext(0); +// +// Log.i(LOG_TAG, "creating window surface"); +// +// //如果不需要渲染,仅做数据处理, mGlContext.addSurface(null); +// mGlContext.addSurface(holder); +// mGlContext.activateOurGLContext(); +// +// Log.i(LOG_TAG, "creating camera frame texture"); +// mCameraTextureID = mGlContext.createGLExtTexture(); +// mCameraTexture = new SurfaceTexture(mCameraTextureID); +// // m_pCameraTexture.setOnFrameAvailableListener(this); +// +// Log.i(LOG_TAG, "created camera frame texture with id " + mCameraTextureID); +// return mCameraTexture; +// } +// +// public void pause() { +// if (mGlContext != null) { +// mGlContext.activateOurGLContext(); +// } +// // 销毁 PGHelixEngine +// // 销毁 GL Texture +// if (mCameraTexture != null) { +// Log.i(LOG_TAG, "releasing camera frame texture"); +// mGlContext.deleteGLExtTexture(mCameraTextureID); +// mCameraTexture.release(); +// mCameraTexture = null; +// } +// // 销毁 GL Surface +// if (mGlContext != null) { +// Log.i(LOG_TAG, "releasing window surface"); +// mGlContext.releaseSurface(); +// } +// // 销毁 GL 上下文 +// if (mGlContext != null) { +// mGlContext.releaseContext(); +// mGlContext.finalEnd(); +// mGlContext = null; +// } +// } +// +// public boolean activateOurGLContext(){ +// if (mCameraTexture == null || mGlContext == null) return false; +// mGlContext.activateOurGLContext(); +// if (AppConfig.IS_USE_INDEPENDENT_THREAD) { +// mGlContext.postTaskOnRenderThread(new Runnable() { +// @Override +// public void run() { +// mCameraTexture.updateTexImage(); +// } +// }); +// } else { +// mCameraTexture.updateTexImage(); +// } +// return true; +// } +// +// public void presentSurface(){ +// mGlContext.presentSurface(); +// } +// +// public int getTextureId(){ +// return mCameraTextureID; +// } + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/ICameraUtils.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/ICameraUtils.java new file mode 100644 index 000000000..55a731a9a --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/ICameraUtils.java @@ -0,0 +1,21 @@ +package com.by.lib_beauty360; + +import android.graphics.SurfaceTexture; + +/** + * Created by PC-Xu on 2017/3/16. + */ + +public interface ICameraUtils +{ + public int getCameraWidth(); + public int getCameraHeight(); + public int getCameraID(); + public int getCurrentOrientation(); + public void switchCamera(); + public void startCamera(); + public void stopCamera(); + //相机闪光 + public void switchCameraFlashLigth(); + public void startCameraPreview(SurfaceTexture surfaceTexture); +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData.java new file mode 100644 index 000000000..d8ebcca45 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData.java @@ -0,0 +1,12 @@ +package com.by.lib_beauty360; + +/** + * Created by PC-Xu on 2017/1/5. + * 滤镜 + */ + +public class ItemData +{ + public String filterName; + public String filterType; +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4LvJing.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4LvJing.java new file mode 100644 index 000000000..8375138ca --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4LvJing.java @@ -0,0 +1,13 @@ +package com.by.lib_beauty360; + +/** + * Created by PC-Xu on 2017/1/5. + * 滤镜 + */ + +public class ItemData4LvJing +{ + public String filterName; + public String filterType; + public int filterPictrue; +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4TieZhi.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4TieZhi.java new file mode 100644 index 000000000..ff0c60bc4 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/ItemData4TieZhi.java @@ -0,0 +1,11 @@ +package com.by.lib_beauty360; + +/** + * Created by PC-Xu on 2017/1/5. + * 贴纸 + */ + +public class ItemData4TieZhi +{ + public String tieZhiName; +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/PGSkinUtils.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/PGSkinUtils.java new file mode 100644 index 000000000..30acc5bfa --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/PGSkinUtils.java @@ -0,0 +1,15 @@ +package com.by.lib_beauty360; + +import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; + +import java.nio.ByteBuffer; + + +/** + * Created by wh on 2017/03/12. + */ + +public class PGSkinUtils { +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/PreviewUtils.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/PreviewUtils.java new file mode 100644 index 000000000..b238ea751 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/PreviewUtils.java @@ -0,0 +1,182 @@ +package com.by.lib_beauty360; + +import android.content.Context; +import android.graphics.Bitmap; +import android.hardware.Camera; +import android.util.Log; +import android.view.SurfaceHolder; + +import java.nio.ByteBuffer; + + + + +/** + * Created by xieyi on 2017/03/12. + */ + +public class PreviewUtils { +// +// PGSkinUtils mPGSkinUtils; +// GlContextUtils mGlContextUtils; +// ICameraUtils mCameraUtils; +// +// private int mSurfaceWidth; +// private int mSurfaceHeight; +// +// public PreviewUtils(Context mContext, Camera.PreviewCallback callback) { +// mCameraUtils = new CameraUtils(callback); +// mGlContextUtils = new GlContextUtils(); +// mPGSkinUtils = new PGSkinUtils(mContext); +// +// } +// +// public void switchCamera() { +// mCameraUtils.switchCamera(); +// setCameraInfo(mSurfaceWidth, mSurfaceHeight); +// } +// +// public void switchCameraFlashLight(){ +// mCameraUtils.switchCameraFlashLigth(); +// } +// public void SetColorFilterStrength(int progress) { +// mPGSkinUtils.SetColorFilterStrength(progress);//滤镜强度 +// } +// +// public void SetSkinColor(float fPinking, float fWhitening, float fRedden) { +// mPGSkinUtils.SetSkinColor(fPinking, fWhitening, fRedden); +// } +// +// +// +// +// public void SetSkinSoftenStrength(int iSoftenStrength) { +// mPGSkinUtils.SetSkinSoftenStrength(iSoftenStrength); +// } +// +// +// public void setFaceShapingParam(int iBigEyeStrength, int iThinFaceStrength) { +// mPGSkinUtils.setFaceShapingParam(iBigEyeStrength,iThinFaceStrength); +// } +// +// +// public void startCamera() { +// mCameraUtils.startCamera(); +// setCameraInfo(mCameraUtils.getCameraWidth(), mCameraUtils.getCameraHeight()); +// } +// +// public void setCameraInfo(int screenWidth, int screenHeight) { +// mSurfaceWidth = screenWidth; +// mSurfaceHeight = screenHeight; +// +// +// Log.d("相机宽度",""+mSurfaceWidth+" "+mCameraUtils.getCameraWidth()); +// } +// +// +// +// public void startCameraPreview(SurfaceHolder holder) { +// mCameraUtils.startCameraPreview(mGlContextUtils.init(holder)); +// } +// +// public void pause() { +// mCameraUtils.stopCamera(); +//// mPGSkinUtils.pause(); +// } +// +// public void freeRes() { +// mPGSkinUtils.removeSticker(); +// mPGSkinUtils.pause();//释放 +// mGlContextUtils.pause(); +// } +// +// public void onresume() { +// startCamera();//启动照相机 +// mPGSkinUtils.onresume();//初始化美肤引擎 +// } +// +// +// public void SetColorFilterByName(String filtertype) { +// mPGSkinUtils.SetColorFilterByName(filtertype); +// } +// +// public void frameProcess(byte[] data, int textureId, boolean isFirstFrame, boolean bInitEGL) { +// mGlContextUtils.activateOurGLContext(); +// mPGSkinUtils.frameProcess(data, textureId, isFirstFrame, bInitEGL); +// +// mPGSkinUtils.GetOutputToScreen(mSurfaceWidth, mSurfaceHeight); +// /** +// * FAQ +// * 渲染到SurfaceView上部出现白屏 +// * +// * mPGSkinUtils.GetOutputToScreen宽高对换 +// * */ +// +//// mPGSkinUtils.getSkinSoftenByte(); +// mGlContextUtils.presentSurface(); +// +// } +// +// +// +// public int getCameraWidth() { +// return mCameraUtils.getCameraWidth(); +// } +// +// public int getCameraHeight() { +// return mCameraUtils.getCameraHeight(); +// } +// +// +// public ByteBuffer SkinSoftenGetResult() { +// return mPGSkinUtils.SkinSoftenGetResult(); +// } +// +// public byte[] getSkinSoftenByte() { +// return mPGSkinUtils.getSkinSoftenByte(); +// } +// +// public int getSkinSoftenTextureId() { +// return mPGSkinUtils.getSkinSoftenTextureId(); +// } +// +// public void setSticker(String path){ +// mPGSkinUtils.setSticker(path); +// } +// +// public void removeSticker(){ +// mPGSkinUtils.removeSticker(); +// } +// +// public void onScreenOriChanged(int ori){ +// mPGSkinUtils.onScreenOriChanged(ori); +// } +// +// public boolean setInputImageByJpegPath(String pJpegPath, int iScale) { +// return mPGSkinUtils.setInputImageByJpegPath(pJpegPath, iScale); +// } +// +// public boolean setInputImageByPngPath(String pPngPath) { +// return mPGSkinUtils.setInputImageByPngPath(pPngPath); +// } +// +// public boolean setInputImageByBitmap(Bitmap pBitmap) { +// return mPGSkinUtils.setInputImageByBitmap(pBitmap); +// } +// +// public boolean setInputImageByJpegBuffer(byte[] pJpegBuffer, int iScale) { +// return mPGSkinUtils.setInputImageByJpegBuffer(pJpegBuffer, iScale); +// } +// +// public boolean getOutputToJpegPath(String pJpegPath, int iQuality) { +// return mPGSkinUtils.getOutputToJpegPath(pJpegPath, iQuality); +// } +// +// public boolean getOutputToPngPath(String pPngPath, boolean bSaveAlphaChannel) { +// return mPGSkinUtils.getOutputToPngPath(pPngPath, bSaveAlphaChannel); +// } +// +// public boolean getOutputToBitmap(Bitmap pBitmap) { +// return mPGSkinUtils.getOutputToBitmap(pBitmap); +// } +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4LvJing.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4LvJing.java new file mode 100644 index 000000000..596e50d40 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4LvJing.java @@ -0,0 +1,110 @@ +package com.by.lib_beauty360.RecycleView; + +import android.app.Activity; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.by.lib_beauty360.ItemData; +import com.by.lib_beauty360.ItemData4LvJing; +import com.by.lib_beauty360.R; + + +/** + * Created by PC-Xu on 2016/6/24. + * 滤镜 + */ +public class HomeItemCell4LvJing extends IRecycleCell implements View.OnClickListener{ + private Activity mContext; + private MyItemClickListener myItemClickListener; + + public HomeItemCell4LvJing(Activity activity, ItemData4LvJing data, MyItemClickListener listener) + { + SetData(data); + mContext =activity; + myItemClickListener= listener; + } + + @Override + public int getViewType() + { + return RecycleType.TYPE_NORMAL; + } + + @Override + public MyViewHolder onCreateCellView(ViewGroup viewGroup) + { + View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listview_item_lvjing,null); + + return new MyViewHolder(view); + } + + @Override + public void onBindViewHolder(MyViewHolder viewHolder) + { + View itemView = viewHolder.itemView; + InitView(itemView); + } + + + private void InitView(View view) + { + TextView textView = (TextView)view.findViewById(R.id.tv_name); + ImageView iv_lvjing = (ImageView) view.findViewById(R.id.iv_lvjing); + + if (textView!=null) + { + ItemData4LvJing itemData = getData(); + textView.setText(itemData.filterName); + iv_lvjing.setImageResource(itemData.filterPictrue); + if (myItemClickListener !=null&&itemData.filterType.equals(myItemClickListener.getCurFilterType())) + {//选中后设置为黄色 +// textView.setBackgroundColor(mContext.getResources().getColor(R.color.color_selectedlitem)); +// textView.setBackgroundColor(Color.parseColor("#ff6131")); + textView.setTextColor(Color.parseColor("#ff6131")); + } + else + { +// textView.setBackgroundColor(mContext.getResources().getColor(R.color.color_normalitem)); +// textView.setBackgroundColor(Color.parseColor("#ffffff")); + textView.setTextColor(Color.parseColor("#ffffff")); + } + + } + + textView.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (myItemClickListener ==null) + return; + myItemClickListener.onItemClick(getData().filterType); + } + }); + + iv_lvjing.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (myItemClickListener ==null) + return; + myItemClickListener.onItemClick(getData().filterType); + } + }); + + } + + + @Override + public void onClick(View v) { + switch (v.getId()){ + + } + } + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4Tiezhi.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4Tiezhi.java new file mode 100644 index 000000000..b20e8aba9 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/HomeItemCell4Tiezhi.java @@ -0,0 +1,123 @@ +package com.by.lib_beauty360.RecycleView; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.by.lib_beauty360.ItemData; +import com.by.lib_beauty360.ItemData4TieZhi; +import com.by.lib_beauty360.R; +import com.yunbao.common.CommonAppConfig; + +import java.io.File; + + +/** + * Created by PC-Xu on 2016/6/24. + * 360美颜贴纸 + */ +public class HomeItemCell4Tiezhi extends IRecycleCell implements View.OnClickListener{ + private Activity mContext; + private MyItemClickListener4Tiezhi myItemClickListener; + public HomeItemCell4Tiezhi(Activity activity, ItemData4TieZhi data, MyItemClickListener4Tiezhi listener) + { + SetData(data); + mContext =activity; + myItemClickListener= listener; + } + + @Override + public int getViewType() + { + return RecycleType.TYPE_NORMAL; + } + + @Override + public MyViewHolder onCreateCellView(ViewGroup viewGroup) + { + View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listview_item_tiezhi,null); + + return new MyViewHolder(view); + } + + @Override + public void onBindViewHolder(MyViewHolder viewHolder) + { + View itemView = viewHolder.itemView; + InitView(itemView); + } + + + private void InitView(View view) + { + TextView textView = (TextView)view.findViewById(R.id.tv_name); + ImageView iv_tiezhi = (ImageView) view.findViewById(R.id.iv_tiezhi); + if (textView!=null) + { + ItemData4TieZhi itemData = getData(); + textView.setText(itemData.tieZhiName); + + if ("无".equals(itemData.tieZhiName)){ + iv_tiezhi.setImageResource(R.drawable.icon_none_32); + } + else { + String path= CommonAppConfig.VIDEO_TIE_ZHI_PATH+CommonAppConfig.TIEZHI_360_NAME + + File.separator + "StickerResource_20170502"+File.separator+itemData.tieZhiName + +File.separator+"icon.jpg"; + File file=new File(path); + if (file.exists()){ + Bitmap bitmap= BitmapFactory.decodeFile(path); + iv_tiezhi.setImageBitmap(bitmap); + } + + } + + if (myItemClickListener !=null&&itemData.tieZhiName.equals(myItemClickListener.getCurTiezhiName())) + { + textView.setTextColor(Color.parseColor("#ff6131")); + } + else + { + textView.setTextColor(Color.parseColor("#ffffff")); + } + + } + + textView.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (myItemClickListener ==null) + return; + myItemClickListener.onTiezhiItemClick(getData().tieZhiName); + } + }); + iv_tiezhi.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (myItemClickListener ==null) + return; + myItemClickListener.onTiezhiItemClick(getData().tieZhiName); + } + }); + + } + + + @Override + public void onClick(View v) { + switch (v.getId()){ + + } + } + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/IRecycleCell.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/IRecycleCell.java new file mode 100644 index 000000000..4ae598018 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/IRecycleCell.java @@ -0,0 +1,23 @@ +package com.by.lib_beauty360.RecycleView; + +import android.view.ViewGroup; + +/** + * Created by PC-Xu on 2016/6/24. + */ +public abstract class IRecycleCell +{ + private T mData; + public abstract int getViewType(); + public abstract MyViewHolder onCreateCellView(ViewGroup viewGroup); + public abstract void onBindViewHolder(MyViewHolder viewHolder); + public T getData() + { + return mData; + } + public void SetData(T data) + { + mData =data; + } + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener.java new file mode 100644 index 000000000..e27dea286 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener.java @@ -0,0 +1,9 @@ +package com.by.lib_beauty360.RecycleView; + +/** + * Created by zongkaili on 16/6/12. + */ +public interface MyItemClickListener { + void onItemClick(String filtertype); + String getCurFilterType(); +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener4Tiezhi.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener4Tiezhi.java new file mode 100644 index 000000000..da337539f --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyItemClickListener4Tiezhi.java @@ -0,0 +1,10 @@ +package com.by.lib_beauty360.RecycleView; + +/** + * Created by zongkaili on 16/6/12. + */ +public interface MyItemClickListener4Tiezhi { + void onTiezhiItemClick(String index); + String getCurTiezhiName(); + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4LvJing.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4LvJing.java new file mode 100644 index 000000000..302a17f62 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4LvJing.java @@ -0,0 +1,61 @@ +package com.by.lib_beauty360.RecycleView; + +import android.app.Activity; +import androidx.recyclerview.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by PC-Xu on 2016/6/24. + */ +public class MyRecycleAdapter4LvJing extends RecyclerView.Adapter +{ + private static final String TAG = MyRecycleAdapter4LvJing.class.getSimpleName(); + private List mListData; + private Activity mActivity; + + public MyRecycleAdapter4LvJing(Activity activity, List mListData) + { + this.mListData = mListData; + mActivity = activity; + } + + @Override + public int getItemViewType(int position) + { + return mListData.get(position).getViewType(); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + mListData.get(position).onBindViewHolder((MyViewHolder)holder); + } + + @Override + public int getItemCount() + { + return mListData.size(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + int pos= getFirstPositionByType(viewType); + if (pos ==-1 || pos >=getItemCount()) + return null; + IRecycleCell cell = mListData.get(pos); + return cell == null ? null : cell.onCreateCellView(parent); + } + + public int getFirstPositionByType(int viewType) { + int size = getItemCount(); + for (int i = 0; i < size; i++) { + if (getItemViewType(i) == viewType) { + return i; + } + } + return -1; + } +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4Tiezhi.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4Tiezhi.java new file mode 100644 index 000000000..f8ff3d136 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyRecycleAdapter4Tiezhi.java @@ -0,0 +1,62 @@ +package com.by.lib_beauty360.RecycleView; + +import android.app.Activity; +import androidx.recyclerview.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by PC-Xu on 2016/6/24. + * 360美颜贴纸列表的adapter + */ +public class MyRecycleAdapter4Tiezhi extends RecyclerView.Adapter +{ + private static final String TAG = MyRecycleAdapter4Tiezhi.class.getSimpleName(); + private List mListData; + private Activity mActivity; + + public MyRecycleAdapter4Tiezhi(Activity activity, List mListData) + { + this.mListData = mListData; + mActivity = activity; + } + + @Override + public int getItemViewType(int position) + { + return mListData.get(position).getViewType(); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + mListData.get(position).onBindViewHolder((MyViewHolder)holder); + } + + @Override + public int getItemCount() + { + return mListData.size(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + int pos= getFirstPositionByType(viewType); + if (pos ==-1 || pos >=getItemCount()) + return null; + IRecycleCell cell = mListData.get(pos); + return cell == null ? null : cell.onCreateCellView(parent); + } + + public int getFirstPositionByType(int viewType) { + int size = getItemCount(); + for (int i = 0; i < size; i++) { + if (getItemViewType(i) == viewType) { + return i; + } + } + return -1; + } +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyViewHolder.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyViewHolder.java new file mode 100644 index 000000000..e01a3caf1 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/MyViewHolder.java @@ -0,0 +1,15 @@ +package com.by.lib_beauty360.RecycleView; + +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; + +/** + * Created by PC-Xu on 2016/6/25. + */ +public class MyViewHolder extends RecyclerView.ViewHolder +{ + public MyViewHolder(View itemView) + { + super(itemView); + } +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/RecycleType.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/RecycleType.java new file mode 100644 index 000000000..c5f1372c7 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/RecycleView/RecycleType.java @@ -0,0 +1,10 @@ +package com.by.lib_beauty360.RecycleView; + +/** + * Created by PC-Xu on 2016/6/25. + */ +public class RecycleType +{ + public static int TYPE_NORMAL = 1001; + +} diff --git a/lib_beauty360/src/main/java/com/by/lib_beauty360/utils/UnzipAssets.java b/lib_beauty360/src/main/java/com/by/lib_beauty360/utils/UnzipAssets.java new file mode 100644 index 000000000..46abe9944 --- /dev/null +++ b/lib_beauty360/src/main/java/com/by/lib_beauty360/utils/UnzipAssets.java @@ -0,0 +1,200 @@ +package com.by.lib_beauty360.utils; + +import android.content.Context; +import android.os.AsyncTask; + +import com.by.lib_beauty360.AppConfig; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + + +/** + * Created by wh on 2017/3/22. + */ + +public class UnzipAssets { + + UnZipTask mUnZipTask; + private static Context mContext; + + public UnzipAssets() { + } + + public void unZipRequest(Context context, String zipName, IUnZipCallBack callBack) { + mUnZipTask = new UnZipTask(callBack); + mUnZipTask.execute(zipName); + mContext = context; + } + + /* + * 异步解压zip + * */ + public class UnZipTask extends AsyncTask { + + IUnZipCallBack mCallBack; + + public UnZipTask(IUnZipCallBack callBack) { + mCallBack = callBack; + } + + + @Override + //在界面上显示进度条 + protected void onPreExecute() { + mCallBack.onStart(); + } + + @Override + protected String doInBackground(String... zipName) { + + if (isFileEmpty(AppConfig.STICKER_LOCAL_PATH + AppConfig.STICKER_NAME)) { + try { + unZip(zipName[0], AppConfig.STICKER_LOCAL_PATH); + createNoMediaFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return AppConfig.STICKER_LOCAL_PATH; + } + + + @Override + protected void onPostExecute(String result) { + super.onPostExecute(result); + mCallBack.Response(result); + + } + } + + public static void createNoMediaFile() { + File file = new File(AppConfig.STICKER_NOMEDIA_PATH); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + // 注入数据对象 + public interface IUnZipCallBack { + /** + * 开始解压数据 + */ + void onStart(); + + /** + * @param outFileDirectory + */ + void Response(String outFileDirectory); + + /** + * 解压失败 + */ + void onError(); + } + + + /** + * 解压Assets中的文件 + * + * @param assetName 压缩包文件名 + * @param outputDirectory 输出目录 + * @throws IOException + */ + public static void unZip(String assetName, String outputDirectory) throws IOException { + //创建解压目标目录 + File file = new File(outputDirectory); + //如果目标目录不存在,则创建 + if (!file.exists()) { + file.mkdirs(); + } + InputStream inputStream = null; + //打开压缩文件 + inputStream = mContext.getAssets().open(assetName); + ZipInputStream zipInputStream = new ZipInputStream(inputStream); + //读取一个进入点 + ZipEntry zipEntry = zipInputStream.getNextEntry(); + //使用1Mbuffer + byte[] buffer = new byte[1024 * 1024]; + //解压时字节计数 + int count = 0; + //如果进入点为空说明已经遍历完所有压缩包中文件和目录 + while (zipEntry != null) { + //如果是一个目录 + if (zipEntry.isDirectory()) { + //String name = zipEntry.getName(); + //name = name.substring(0, name.length() - 1); + file = new File(outputDirectory + File.separator + zipEntry.getName()); + file.mkdir(); + } else { + //如果是文件 + file = new File(outputDirectory + File.separator + + zipEntry.getName()); + //创建该文件 + file.createNewFile(); + FileOutputStream fileOutputStream = new FileOutputStream(file); + while ((count = zipInputStream.read(buffer)) > 0) { + fileOutputStream.write(buffer, 0, count); + } + fileOutputStream.close(); + } + //定位到下一个文件入口 + zipEntry = zipInputStream.getNextEntry(); + } + zipInputStream.close(); + } + + + + public boolean isFileEmpty(String path) { + File file = new File(path); + if (file.exists()) { + File[] files = file.listFiles(); + if (files!=null && files.length > 0) return false; + } + return true; + } + + + public String get(Context context, int id) { + InputStream stream = context.getResources().openRawResource(id); + return read(stream); + } + + public String read(InputStream stream) { + return read(stream, "utf-8"); + } + + public String read(InputStream is, String encode) { + if (is != null) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(is, encode)); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + is.close(); + return sb.toString(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ""; + } +} \ No newline at end of file diff --git a/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb.png b/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb.png new file mode 100644 index 000000000..a9072daa4 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb.png differ diff --git a/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb_press.png b/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb_press.png new file mode 100644 index 000000000..efd24eff0 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable-xxhdpi/seek_thumb_press.png differ diff --git a/lib_beauty360/src/main/res/drawable/b_chun_zhen.jpg b/lib_beauty360/src/main/res/drawable/b_chun_zhen.jpg new file mode 100644 index 000000000..43bcd6ac2 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_chun_zhen.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_fei_yan.jpg b/lib_beauty360/src/main/res/drawable/b_fei_yan.jpg new file mode 100644 index 000000000..8101b9dca Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_fei_yan.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_hong_run.jpg b/lib_beauty360/src/main/res/drawable/b_hong_run.jpg new file mode 100644 index 000000000..61c017ee6 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_hong_run.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_mian_hua_tang.jpg b/lib_beauty360/src/main/res/drawable/b_mian_hua_tang.jpg new file mode 100644 index 000000000..3b9af5f4c Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_mian_hua_tang.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_qing_xi.jpg b/lib_beauty360/src/main/res/drawable/b_qing_xi.jpg new file mode 100644 index 000000000..07c356d49 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_qing_xi.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_tao_hua.jpg b/lib_beauty360/src/main/res/drawable/b_tao_hua.jpg new file mode 100644 index 000000000..a4792fdca Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_tao_hua.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/b_xin_jing.jpg b/lib_beauty360/src/main/res/drawable/b_xin_jing.jpg new file mode 100644 index 000000000..b2164158a Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/b_xin_jing.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/bg_live_cover.xml b/lib_beauty360/src/main/res/drawable/bg_live_cover.xml new file mode 100644 index 000000000..4a5a315b2 --- /dev/null +++ b/lib_beauty360/src/main/res/drawable/bg_live_cover.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/lib_beauty360/src/main/res/drawable/chao_xian_shi.jpg b/lib_beauty360/src/main/res/drawable/chao_xian_shi.jpg new file mode 100644 index 000000000..0dd8fe53e Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/chao_xian_shi.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/chu_xia.jpg b/lib_beauty360/src/main/res/drawable/chu_xia.jpg new file mode 100644 index 000000000..9beecb2c2 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/chu_xia.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/dan_ya.jpg b/lib_beauty360/src/main/res/drawable/dan_ya.jpg new file mode 100644 index 000000000..69eb6a04f Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/dan_ya.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/dan_ya2.jpg b/lib_beauty360/src/main/res/drawable/dan_ya2.jpg new file mode 100644 index 000000000..d25b34d88 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/dan_ya2.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/guo_dong.jpg b/lib_beauty360/src/main/res/drawable/guo_dong.jpg new file mode 100644 index 000000000..7635cc478 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/guo_dong.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/hei_diao.jpg b/lib_beauty360/src/main/res/drawable/hei_diao.jpg new file mode 100644 index 000000000..359f19d87 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/hei_diao.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/hong_run.jpg b/lib_beauty360/src/main/res/drawable/hong_run.jpg new file mode 100644 index 000000000..ca9920db6 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/hong_run.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/huai_jiu.jpg b/lib_beauty360/src/main/res/drawable/huai_jiu.jpg new file mode 100644 index 000000000..269eba67a Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/huai_jiu.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/icon_none.png b/lib_beauty360/src/main/res/drawable/icon_none.png new file mode 100644 index 000000000..5dc2dbba5 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/icon_none.png differ diff --git a/lib_beauty360/src/main/res/drawable/icon_none_32.png b/lib_beauty360/src/main/res/drawable/icon_none_32.png new file mode 100644 index 000000000..b306e1178 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/icon_none_32.png differ diff --git a/lib_beauty360/src/main/res/drawable/jiao_pian.jpg b/lib_beauty360/src/main/res/drawable/jiao_pian.jpg new file mode 100644 index 000000000..42e86acc6 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/jiao_pian.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/m_chu_xia.jpg b/lib_beauty360/src/main/res/drawable/m_chu_xia.jpg new file mode 100644 index 000000000..76de17ba6 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/m_chu_xia.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/m_fei_yan.jpg b/lib_beauty360/src/main/res/drawable/m_fei_yan.jpg new file mode 100644 index 000000000..9f79e1e5c Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/m_fei_yan.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/m_lan_diao.jpg b/lib_beauty360/src/main/res/drawable/m_lan_diao.jpg new file mode 100644 index 000000000..e382d2178 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/m_lan_diao.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/m_qing_liang.jpg b/lib_beauty360/src/main/res/drawable/m_qing_liang.jpg new file mode 100644 index 000000000..235bf9336 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/m_qing_liang.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/m_rou_guang.jpg b/lib_beauty360/src/main/res/drawable/m_rou_guang.jpg new file mode 100644 index 000000000..f1a80c994 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/m_rou_guang.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/movie.jpg b/lib_beauty360/src/main/res/drawable/movie.jpg new file mode 100644 index 000000000..51e8a5d3c Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/movie.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/movie1.jpg b/lib_beauty360/src/main/res/drawable/movie1.jpg new file mode 100644 index 000000000..378c76fc3 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/movie1.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/movie2.jpg b/lib_beauty360/src/main/res/drawable/movie2.jpg new file mode 100644 index 000000000..fbd60ceb0 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/movie2.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/nuan_nuan_yang_guang.jpg b/lib_beauty360/src/main/res/drawable/nuan_nuan_yang_guang.jpg new file mode 100644 index 000000000..ef27acabc Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/nuan_nuan_yang_guang.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/qing_xin.jpg b/lib_beauty360/src/main/res/drawable/qing_xin.jpg new file mode 100644 index 000000000..26533235b Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/qing_xin.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/qing_xin_li_ren.jpg b/lib_beauty360/src/main/res/drawable/qing_xin_li_ren.jpg new file mode 100644 index 000000000..440aa8e50 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/qing_xin_li_ren.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/ri_xi.jpg b/lib_beauty360/src/main/res/drawable/ri_xi.jpg new file mode 100644 index 000000000..2f33204d2 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/ri_xi.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/seekbar_bg.xml b/lib_beauty360/src/main/res/drawable/seekbar_bg.xml new file mode 100644 index 000000000..0da3f42a3 --- /dev/null +++ b/lib_beauty360/src/main/res/drawable/seekbar_bg.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib_beauty360/src/main/res/drawable/seekbar_thumb_selector.xml b/lib_beauty360/src/main/res/drawable/seekbar_thumb_selector.xml new file mode 100644 index 000000000..3180fe1ac --- /dev/null +++ b/lib_beauty360/src/main/res/drawable/seekbar_thumb_selector.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/lib_beauty360/src/main/res/drawable/shao_nv.jpg b/lib_beauty360/src/main/res/drawable/shao_nv.jpg new file mode 100644 index 000000000..35bc9cfd6 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/shao_nv.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/shen_du_mei_bai.jpg b/lib_beauty360/src/main/res/drawable/shen_du_mei_bai.jpg new file mode 100644 index 000000000..9fd2889a3 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/shen_du_mei_bai.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/tian_mei.jpg b/lib_beauty360/src/main/res/drawable/tian_mei.jpg new file mode 100644 index 000000000..a42aae447 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/tian_mei.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/wei_mei.jpg b/lib_beauty360/src/main/res/drawable/wei_mei.jpg new file mode 100644 index 000000000..e6b109a59 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/wei_mei.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/wen_nuan.jpg b/lib_beauty360/src/main/res/drawable/wen_nuan.jpg new file mode 100644 index 000000000..05682a63a Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/wen_nuan.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/xiang_yan_hong_chun.jpg b/lib_beauty360/src/main/res/drawable/xiang_yan_hong_chun.jpg new file mode 100644 index 000000000..36aa45b02 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/xiang_yan_hong_chun.jpg differ diff --git a/lib_beauty360/src/main/res/drawable/yi_shu_hei_bai.jpg b/lib_beauty360/src/main/res/drawable/yi_shu_hei_bai.jpg new file mode 100644 index 000000000..efd46ac05 Binary files /dev/null and b/lib_beauty360/src/main/res/drawable/yi_shu_hei_bai.jpg differ diff --git a/lib_beauty360/src/main/res/layout/activity_edit.xml b/lib_beauty360/src/main/res/layout/activity_edit.xml new file mode 100644 index 000000000..d0622523c --- /dev/null +++ b/lib_beauty360/src/main/res/layout/activity_edit.xml @@ -0,0 +1,23 @@ + + + +