@@ -8,7 +8,6 @@ import me.chanjar.weixin.common.util.http.HttpType; | |||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||
import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; | |||
import me.chanjar.weixin.cp.api.WxCpConfigStorage; | |||
import me.chanjar.weixin.cp.api.impl.AbstractWxCpServiceImpl; | |||
import org.apache.http.HttpHost; | |||
import org.apache.http.client.config.RequestConfig; | |||
@@ -1,24 +1,15 @@ | |||
package me.chanjar.weixin.mp.api.impl.apache; | |||
import com.google.gson.JsonArray; | |||
import com.google.gson.JsonElement; | |||
import com.google.gson.JsonObject; | |||
import com.google.gson.JsonParser; | |||
import me.chanjar.weixin.common.bean.WxAccessToken; | |||
import me.chanjar.weixin.common.bean.WxJsapiSignature; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.session.StandardSessionManager; | |||
import me.chanjar.weixin.common.session.WxSessionManager; | |||
import me.chanjar.weixin.common.util.RandomUtils; | |||
import me.chanjar.weixin.common.util.crypto.SHA1; | |||
import me.chanjar.weixin.common.util.http.*; | |||
import me.chanjar.weixin.common.util.http.HttpType; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; | |||
import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; | |||
import me.chanjar.weixin.mp.api.*; | |||
import me.chanjar.weixin.mp.api.impl.*; | |||
import me.chanjar.weixin.mp.bean.*; | |||
import me.chanjar.weixin.mp.bean.result.*; | |||
import me.chanjar.weixin.mp.api.WxMpConfigStorage; | |||
import me.chanjar.weixin.mp.api.WxMpService; | |||
import me.chanjar.weixin.mp.api.impl.AbstractWxMpServiceImpl; | |||
import org.apache.http.HttpHost; | |||
import org.apache.http.client.config.RequestConfig; | |||
import org.apache.http.client.methods.CloseableHttpResponse; | |||
@@ -32,7 +23,7 @@ import java.util.concurrent.locks.Lock; | |||
/** | |||
* apache-http方式实现 | |||
*/ | |||
public class WxMpServiceImpl extends AbstractWxMpServiceImpl<CloseableHttpClient,HttpHost> { | |||
public class WxMpServiceImpl extends AbstractWxMpServiceImpl<CloseableHttpClient, HttpHost> { | |||
private CloseableHttpClient httpClient; | |||
private HttpHost httpProxy; | |||
@@ -7,15 +7,16 @@ import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.HttpType; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.mp.api.*; | |||
import me.chanjar.weixin.mp.api.impl.*; | |||
import me.chanjar.weixin.mp.api.WxMpConfigStorage; | |||
import me.chanjar.weixin.mp.api.WxMpService; | |||
import me.chanjar.weixin.mp.api.impl.AbstractWxMpServiceImpl; | |||
import java.util.concurrent.locks.Lock; | |||
/** | |||
* jodd-http方式实现 | |||
*/ | |||
public class WxMpServiceImpl extends AbstractWxMpServiceImpl<HttpConnectionProvider,ProxyInfo> { | |||
public class WxMpServiceImpl extends AbstractWxMpServiceImpl<HttpConnectionProvider, ProxyInfo> { | |||
private HttpConnectionProvider httpClient; | |||
private ProxyInfo httpProxy; | |||
@@ -1,12 +1,10 @@ | |||
package me.chanjar.weixin.mp.bean.kefu.request; | |||
import java.io.Serializable; | |||
import org.apache.commons.lang3.builder.ToStringBuilder; | |||
import com.google.gson.annotations.SerializedName; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import org.apache.commons.lang3.builder.ToStringBuilder; | |||
import java.io.Serializable; | |||
public class WxMpKfAccountRequest implements Serializable { | |||
private static final long serialVersionUID = -5451863610674856927L; | |||
@@ -16,7 +14,7 @@ public class WxMpKfAccountRequest implements Serializable { | |||
*/ | |||
@SerializedName("kf_account") | |||
private String kfAccount; | |||
/** | |||
* nickname 客服昵称,最长6个汉字或12个英文字符 | |||
*/ | |||
@@ -28,12 +26,16 @@ public class WxMpKfAccountRequest implements Serializable { | |||
*/ | |||
@SerializedName("invite_wx") | |||
private String inviteWx; | |||
public static Builder builder() { | |||
return new Builder(); | |||
} | |||
@Override | |||
public String toString() { | |||
return ToStringBuilder.reflectionToString(this); | |||
} | |||
public String toJson() { | |||
return WxMpGsonBuilder.INSTANCE.create().toJson(this); | |||
} | |||
@@ -54,10 +56,6 @@ public class WxMpKfAccountRequest implements Serializable { | |||
this.nickName = nickName; | |||
} | |||
public static Builder builder() { | |||
return new Builder(); | |||
} | |||
public String getInviteWx() { | |||
return this.inviteWx; | |||
} | |||
@@ -67,39 +65,39 @@ public class WxMpKfAccountRequest implements Serializable { | |||
} | |||
public static class Builder { | |||
private String kfAccount; | |||
private String nickName; | |||
private String inviteWx; | |||
public Builder kfAccount(String kfAccount) { | |||
this.kfAccount = kfAccount; | |||
return this; | |||
} | |||
public Builder nickName(String nickName) { | |||
this.nickName = nickName; | |||
return this; | |||
} | |||
public Builder inviteWx(String inviteWx) { | |||
this.inviteWx = inviteWx; | |||
return this; | |||
} | |||
public Builder from(WxMpKfAccountRequest origin) { | |||
this.kfAccount(origin.kfAccount); | |||
this.nickName(origin.nickName); | |||
this.inviteWx(origin.inviteWx); | |||
return this; | |||
} | |||
public WxMpKfAccountRequest build() { | |||
WxMpKfAccountRequest m = new WxMpKfAccountRequest(); | |||
m.kfAccount = this.kfAccount; | |||
m.nickName = this.nickName; | |||
m.inviteWx = this.inviteWx; | |||
return m; | |||
} | |||
private String kfAccount; | |||
private String nickName; | |||
private String inviteWx; | |||
public Builder kfAccount(String kfAccount) { | |||
this.kfAccount = kfAccount; | |||
return this; | |||
} | |||
public Builder nickName(String nickName) { | |||
this.nickName = nickName; | |||
return this; | |||
} | |||
public Builder inviteWx(String inviteWx) { | |||
this.inviteWx = inviteWx; | |||
return this; | |||
} | |||
public Builder from(WxMpKfAccountRequest origin) { | |||
this.kfAccount(origin.kfAccount); | |||
this.nickName(origin.nickName); | |||
this.inviteWx(origin.inviteWx); | |||
return this; | |||
} | |||
public WxMpKfAccountRequest build() { | |||
WxMpKfAccountRequest m = new WxMpKfAccountRequest(); | |||
m.kfAccount = this.kfAccount; | |||
m.nickName = this.nickName; | |||
m.inviteWx = this.inviteWx; | |||
return m; | |||
} | |||
} | |||
} |
@@ -1,7 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.IOException; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -11,10 +9,12 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.mp.util.http.MaterialDeleteRequestExecutor; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMaterialDeleteRequestExecutor extends MaterialDeleteRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMaterialDeleteRequestExecutor extends MaterialDeleteRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMaterialDeleteRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,7 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.IOException; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -13,10 +11,12 @@ import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; | |||
import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMaterialNewsInfoRequestExecutor extends MaterialNewsInfoRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMaterialNewsInfoRequestExecutor extends MaterialNewsInfoRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMaterialNewsInfoRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,10 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.util.Map; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -17,10 +12,15 @@ import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | |||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | |||
import me.chanjar.weixin.mp.util.http.MaterialUploadRequestExecutor; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.util.Map; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMaterialUploadRequestExecutor extends MaterialUploadRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMaterialUploadRequestExecutor extends MaterialUploadRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMaterialUploadRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,7 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.IOException; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -12,10 +10,12 @@ import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | |||
import me.chanjar.weixin.mp.util.http.MaterialVideoInfoRequestExecutor; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMaterialVideoInfoRequestExecutor extends MaterialVideoInfoRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMaterialVideoInfoRequestExecutor extends MaterialVideoInfoRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMaterialVideoInfoRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,12 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import org.apache.commons.io.IOUtils; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -16,12 +9,17 @@ import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||
import me.chanjar.weixin.mp.util.http.MaterialVoiceAndImageDownloadRequestExecutor; | |||
import me.chanjar.weixin.mp.util.http.okhttp.OkhttpMaterialVoiceAndImageDownloadRequestExecutor; | |||
import org.apache.commons.io.IOUtils; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMaterialVoiceAndImageDownloadRequestExecutor extends MaterialVoiceAndImageDownloadRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMaterialVoiceAndImageDownloadRequestExecutor extends MaterialVoiceAndImageDownloadRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMaterialVoiceAndImageDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { | |||
super(requestHttp, tmpDirFile); | |||
} | |||
@@ -1,8 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -13,10 +10,13 @@ import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | |||
import me.chanjar.weixin.mp.util.http.MediaImgUploadRequestExecutor; | |||
import java.io.File; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddMediaImgUploadRequestExecutor extends MediaImgUploadRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddMediaImgUploadRequestExecutor extends MediaImgUploadRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddMediaImgUploadRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,12 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.jodd; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.net.URLEncoder; | |||
import java.util.UUID; | |||
import jodd.http.HttpConnectionProvider; | |||
import jodd.http.HttpRequest; | |||
import jodd.http.HttpResponse; | |||
@@ -19,10 +12,17 @@ import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; | |||
import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.net.URLEncoder; | |||
import java.util.UUID; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
public class JoddQrCodeRequestExecutor extends QrCodeRequestExecutor<HttpConnectionProvider,ProxyInfo> { | |||
public class JoddQrCodeRequestExecutor extends QrCodeRequestExecutor<HttpConnectionProvider, ProxyInfo> { | |||
public JoddQrCodeRequestExecutor(RequestHttp requestHttp) { | |||
super(requestHttp); | |||
} | |||
@@ -1,15 +1,14 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.IOException; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestExecutor; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | |||
import me.chanjar.weixin.mp.util.http.MaterialDeleteRequestExecutor; | |||
import okhttp3.*; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
@@ -1,7 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.IOException; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
@@ -11,6 +9,8 @@ import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import okhttp3.*; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
@@ -1,21 +1,8 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.util.Map; | |||
import org.apache.http.client.config.RequestConfig; | |||
import org.apache.http.client.methods.CloseableHttpResponse; | |||
import org.apache.http.client.methods.HttpPost; | |||
import org.apache.http.entity.ContentType; | |||
import org.apache.http.entity.mime.HttpMultipartMode; | |||
import org.apache.http.entity.mime.MultipartEntityBuilder; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | |||
import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | |||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||
import me.chanjar.weixin.mp.bean.material.WxMpMaterial; | |||
@@ -23,6 +10,11 @@ import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; | |||
import me.chanjar.weixin.mp.util.http.MaterialUploadRequestExecutor; | |||
import okhttp3.*; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.util.Map; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
@@ -66,7 +58,7 @@ public class OkhttpMaterialUploadRequestExecutor extends MaterialUploadRequestEx | |||
if (material.getForm() != null) { | |||
bodyBuilder.addFormDataPart("description", WxGsonBuilder.create().toJson(form)); | |||
} | |||
RequestBody body =bodyBuilder.build(); | |||
RequestBody body = bodyBuilder.build(); | |||
Request request = new Request.Builder().url(uri).post(body).build(); | |||
Response response = client.newCall(request).execute(); | |||
String responseContent = response.body().string(); | |||
@@ -1,7 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.IOException; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
@@ -10,6 +8,8 @@ import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; | |||
import me.chanjar.weixin.mp.util.http.MaterialVideoInfoRequestExecutor; | |||
import okhttp3.*; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
@@ -38,7 +38,7 @@ public class OkhttpMaterialVideoInfoRequestExecutor extends MaterialVideoInfoReq | |||
//得到httpClient | |||
OkHttpClient client = clientBuilder.build(); | |||
RequestBody requestBody =new FormBody.Builder().add("media_id", materialId).build(); | |||
RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build(); | |||
Request request = new Request.Builder().url(uri).post(requestBody).build(); | |||
Response response = client.newCall(request).execute(); | |||
String responseContent = response.body().string(); | |||
@@ -1,12 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import org.apache.commons.io.IOUtils; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
@@ -14,6 +7,12 @@ import me.chanjar.weixin.common.util.http.okhttp.OkhttpProxyInfo; | |||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||
import me.chanjar.weixin.mp.util.http.MaterialVoiceAndImageDownloadRequestExecutor; | |||
import okhttp3.*; | |||
import org.apache.commons.io.IOUtils; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
@@ -1,8 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
import me.chanjar.weixin.common.util.http.RequestHttp; | |||
@@ -11,6 +8,9 @@ import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; | |||
import me.chanjar.weixin.mp.util.http.MediaImgUploadRequestExecutor; | |||
import okhttp3.*; | |||
import java.io.File; | |||
import java.io.IOException; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||
@@ -1,11 +1,5 @@ | |||
package me.chanjar.weixin.mp.util.http.okhttp; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.util.UUID; | |||
import jodd.util.MimeTypes; | |||
import me.chanjar.weixin.common.bean.result.WxError; | |||
import me.chanjar.weixin.common.exception.WxErrorException; | |||
@@ -16,6 +10,12 @@ import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; | |||
import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor; | |||
import okhttp3.*; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.util.UUID; | |||
/** | |||
* Created by ecoolper on 2017/5/5. | |||
*/ | |||