.class public Lx/v; .super Ljava/lang/Object; .source "OkHttpClient.kt" # interfaces .implements Ljava/lang/Cloneable; .implements Lx/e$a; .implements Lokhttp3/WebSocket$a; # annotations .annotation system Ldalvik/annotation/MemberClasses; value = { Lx/v$a;, Lx/v$b; } .end annotation # static fields .field public static final E:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lx/w;", ">;" } .end annotation .end field .field public static final F:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lx/k;", ">;" } .end annotation .end field .field public static final G:Lx/v$b; # instance fields .field public final A:I .field public final B:I .field public final C:I .field public final D:I .field public final d:Lx/o; .field public final e:Lx/j; .field public final f:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lokhttp3/Interceptor;", ">;" } .end annotation .end field .field public final g:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lokhttp3/Interceptor;", ">;" } .end annotation .end field .field public final h:Lx/r$b; .field public final i:Z .field public final j:Lx/c; .field public final k:Z .field public final l:Z .field public final m:Lx/n; .field public final n:Lx/q; .field public final o:Ljava/net/Proxy; .field public final p:Ljava/net/ProxySelector; .field public final q:Lx/c; .field public final r:Ljavax/net/SocketFactory; .field public final s:Ljavax/net/ssl/SSLSocketFactory; .field public final t:Ljavax/net/ssl/X509TrustManager; .field public final u:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lx/k;", ">;" } .end annotation .end field .field public final v:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lx/w;", ">;" } .end annotation .end field .field public final w:Ljavax/net/ssl/HostnameVerifier; .field public final x:Lx/g; .field public final y:Lx/c0/i/c; .field public final z:I # direct methods .method public static constructor ()V .locals 5 new-instance v0, Lx/v$b; const/4 v1, 0x0 invoke-direct {v0, v1}, Lx/v$b;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V sput-object v0, Lx/v;->G:Lx/v$b; const/4 v0, 0x2 new-array v1, v0, [Lx/w; sget-object v2, Lx/w;->g:Lx/w; const/4 v3, 0x0 aput-object v2, v1, v3 sget-object v2, Lx/w;->e:Lx/w; const/4 v4, 0x1 aput-object v2, v1, v4 invoke-static {v1}, Lx/c0/a;->a([Ljava/lang/Object;)Ljava/util/List; move-result-object v1 sput-object v1, Lx/v;->E:Ljava/util/List; new-array v0, v0, [Lx/k; sget-object v1, Lx/k;->g:Lx/k; aput-object v1, v0, v3 sget-object v1, Lx/k;->h:Lx/k; aput-object v1, v0, v4 invoke-static {v0}, Lx/c0/a;->a([Ljava/lang/Object;)Ljava/util/List; move-result-object v0 sput-object v0, Lx/v;->F:Ljava/util/List; return-void .end method .method public constructor ()V .locals 1 new-instance v0, Lx/v$a; invoke-direct {v0}, Lx/v$a;->()V invoke-direct {p0, v0}, Lx/v;->(Lx/v$a;)V return-void .end method .method public constructor (Lx/v$a;)V .locals 3 const/4 v0, 0x0 if-eqz p1, :cond_10 invoke-direct {p0}, Ljava/lang/Object;->()V iget-object v1, p1, Lx/v$a;->a:Lx/o; iput-object v1, p0, Lx/v;->d:Lx/o; iget-object v1, p1, Lx/v$a;->b:Lx/j; iput-object v1, p0, Lx/v;->e:Lx/j; iget-object v1, p1, Lx/v$a;->c:Ljava/util/List; invoke-static {v1}, Lx/c0/a;->b(Ljava/util/List;)Ljava/util/List; move-result-object v1 iput-object v1, p0, Lx/v;->f:Ljava/util/List; iget-object v1, p1, Lx/v$a;->d:Ljava/util/List; invoke-static {v1}, Lx/c0/a;->b(Ljava/util/List;)Ljava/util/List; move-result-object v1 iput-object v1, p0, Lx/v;->g:Ljava/util/List; iget-object v1, p1, Lx/v$a;->e:Lx/r$b; iput-object v1, p0, Lx/v;->h:Lx/r$b; iget-boolean v1, p1, Lx/v$a;->f:Z iput-boolean v1, p0, Lx/v;->i:Z iget-object v1, p1, Lx/v$a;->g:Lx/c; iput-object v1, p0, Lx/v;->j:Lx/c; iget-boolean v1, p1, Lx/v$a;->h:Z iput-boolean v1, p0, Lx/v;->k:Z iget-boolean v1, p1, Lx/v$a;->i:Z iput-boolean v1, p0, Lx/v;->l:Z iget-object v1, p1, Lx/v$a;->j:Lx/n; iput-object v1, p0, Lx/v;->m:Lx/n; iget-object v1, p1, Lx/v$a;->k:Lx/q; iput-object v1, p0, Lx/v;->n:Lx/q; iget-object v1, p1, Lx/v$a;->l:Ljava/net/Proxy; iput-object v1, p0, Lx/v;->o:Ljava/net/Proxy; if-eqz v1, :cond_0 sget-object v1, Lx/c0/h/a;->a:Lx/c0/h/a; goto :goto_1 :cond_0 iget-object v1, p1, Lx/v$a;->m:Ljava/net/ProxySelector; if-eqz v1, :cond_1 goto :goto_0 :cond_1 invoke-static {}, Ljava/net/ProxySelector;->getDefault()Ljava/net/ProxySelector; move-result-object v1 :goto_0 if-eqz v1, :cond_2 goto :goto_1 :cond_2 sget-object v1, Lx/c0/h/a;->a:Lx/c0/h/a; :goto_1 iput-object v1, p0, Lx/v;->p:Ljava/net/ProxySelector; iget-object v1, p1, Lx/v$a;->n:Lx/c; iput-object v1, p0, Lx/v;->q:Lx/c; iget-object v1, p1, Lx/v$a;->o:Ljavax/net/SocketFactory; iput-object v1, p0, Lx/v;->r:Ljavax/net/SocketFactory; iget-object v1, p1, Lx/v$a;->r:Ljava/util/List; iput-object v1, p0, Lx/v;->u:Ljava/util/List; iget-object v1, p1, Lx/v$a;->s:Ljava/util/List; iput-object v1, p0, Lx/v;->v:Ljava/util/List; iget-object v1, p1, Lx/v$a;->t:Ljavax/net/ssl/HostnameVerifier; iput-object v1, p0, Lx/v;->w:Ljavax/net/ssl/HostnameVerifier; iget v1, p1, Lx/v$a;->w:I iput v1, p0, Lx/v;->z:I iget v1, p1, Lx/v$a;->x:I iput v1, p0, Lx/v;->A:I iget v1, p1, Lx/v$a;->y:I iput v1, p0, Lx/v;->B:I iget v1, p1, Lx/v$a;->z:I iput v1, p0, Lx/v;->C:I iget v1, p1, Lx/v$a;->A:I iput v1, p0, Lx/v;->D:I iget-object v1, p1, Lx/v$a;->p:Ljavax/net/ssl/SSLSocketFactory; if-nez v1, :cond_9 iget-object v1, p0, Lx/v;->u:Ljava/util/List; instance-of v2, v1, Ljava/util/Collection; if-eqz v2, :cond_3 invoke-interface {v1}, Ljava/util/Collection;->isEmpty()Z move-result v2 if-eqz v2, :cond_3 goto :goto_2 :cond_3 invoke-interface {v1}, Ljava/lang/Iterable;->iterator()Ljava/util/Iterator; move-result-object v1 :cond_4 invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z move-result v2 if-eqz v2, :cond_5 invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object; move-result-object v2 check-cast v2, Lx/k; iget-boolean v2, v2, Lx/k;->a:Z if-eqz v2, :cond_4 const/4 v1, 0x0 goto :goto_3 :cond_5 :goto_2 const/4 v1, 0x1 :goto_3 if-eqz v1, :cond_6 goto :goto_4 :cond_6 sget-object v1, Lx/c0/g/f;->c:Lx/c0/g/f$a; invoke-virtual {v1}, Lx/c0/g/f$a;->b()Lx/c0/g/f; move-result-object v1 invoke-virtual {v1}, Lx/c0/g/f;->b()Ljavax/net/ssl/X509TrustManager; move-result-object v1 iput-object v1, p0, Lx/v;->t:Ljavax/net/ssl/X509TrustManager; sget-object v1, Lx/c0/g/f;->c:Lx/c0/g/f$a; invoke-virtual {v1}, Lx/c0/g/f$a;->b()Lx/c0/g/f; move-result-object v1 iget-object v2, p0, Lx/v;->t:Ljavax/net/ssl/X509TrustManager; invoke-virtual {v1, v2}, Lx/c0/g/f;->c(Ljavax/net/ssl/X509TrustManager;)V sget-object v1, Lx/v;->G:Lx/v$b; iget-object v2, p0, Lx/v;->t:Ljavax/net/ssl/X509TrustManager; if-eqz v2, :cond_8 invoke-virtual {v1, v2}, Lx/v$b;->a(Ljavax/net/ssl/X509TrustManager;)Ljavax/net/ssl/SSLSocketFactory; move-result-object v1 iput-object v1, p0, Lx/v;->s:Ljavax/net/ssl/SSLSocketFactory; sget-object v1, Lx/c0/i/c;->a:Lx/c0/i/c$a; iget-object v2, p0, Lx/v;->t:Ljavax/net/ssl/X509TrustManager; if-eqz v2, :cond_7 invoke-virtual {v1, v2}, Lx/c0/i/c$a;->a(Ljavax/net/ssl/X509TrustManager;)Lx/c0/i/c; move-result-object v1 iput-object v1, p0, Lx/v;->y:Lx/c0/i/c; goto :goto_5 :cond_7 invoke-static {}, Lt/u/b/j;->throwNpe()V throw v0 :cond_8 invoke-static {}, Lt/u/b/j;->throwNpe()V throw v0 :cond_9 :goto_4 iget-object v1, p1, Lx/v$a;->p:Ljavax/net/ssl/SSLSocketFactory; iput-object v1, p0, Lx/v;->s:Ljavax/net/ssl/SSLSocketFactory; iget-object v1, p1, Lx/v$a;->v:Lx/c0/i/c; iput-object v1, p0, Lx/v;->y:Lx/c0/i/c; iget-object v1, p1, Lx/v$a;->q:Ljavax/net/ssl/X509TrustManager; iput-object v1, p0, Lx/v;->t:Ljavax/net/ssl/X509TrustManager; :goto_5 iget-object v1, p0, Lx/v;->s:Ljavax/net/ssl/SSLSocketFactory; if-eqz v1, :cond_a sget-object v1, Lx/c0/g/f;->c:Lx/c0/g/f$a; invoke-virtual {v1}, Lx/c0/g/f$a;->b()Lx/c0/g/f; move-result-object v1 iget-object v2, p0, Lx/v;->s:Ljavax/net/ssl/SSLSocketFactory; invoke-virtual {v1, v2}, Lx/c0/g/f;->a(Ljavax/net/ssl/SSLSocketFactory;)V :cond_a iget-object p1, p1, Lx/v$a;->u:Lx/g; iget-object v1, p0, Lx/v;->y:Lx/c0/i/c; iget-object v2, p1, Lx/g;->b:Lx/c0/i/c; invoke-static {v2, v1}, Lt/u/b/j;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z move-result v2 if-eqz v2, :cond_b goto :goto_6 :cond_b new-instance v2, Lx/g; iget-object p1, p1, Lx/g;->a:Ljava/util/Set; invoke-direct {v2, p1, v1}, Lx/g;->(Ljava/util/Set;Lx/c0/i/c;)V move-object p1, v2 :goto_6 iput-object p1, p0, Lx/v;->x:Lx/g; iget-object p1, p0, Lx/v;->f:Ljava/util/List; const-string v1, "null cannot be cast to non-null type kotlin.collections.List" if-eqz p1, :cond_f invoke-interface {p1, v0}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result p1 xor-int/lit8 p1, p1, 0x1 if-eqz p1, :cond_e iget-object p1, p0, Lx/v;->g:Ljava/util/List; if-eqz p1, :cond_d invoke-interface {p1, v0}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result p1 xor-int/lit8 p1, p1, 0x1 if-eqz p1, :cond_c return-void :cond_c const-string p1, "Null network interceptor: " invoke-static {p1}, Le/e/b/a/a;->a(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p1 iget-object v0, p0, Lx/v;->g:Ljava/util/List; invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 new-instance v0, Ljava/lang/IllegalStateException; invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p1 invoke-direct {v0, p1}, Ljava/lang/IllegalStateException;->(Ljava/lang/String;)V throw v0 :cond_d new-instance p1, Lt/l; invoke-direct {p1, v1}, Lt/l;->(Ljava/lang/String;)V throw p1 :cond_e const-string p1, "Null interceptor: " invoke-static {p1}, Le/e/b/a/a;->a(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p1 iget-object v0, p0, Lx/v;->f:Ljava/util/List; invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 new-instance v0, Ljava/lang/IllegalStateException; invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p1 invoke-direct {v0, p1}, Ljava/lang/IllegalStateException;->(Ljava/lang/String;)V throw v0 :cond_f new-instance p1, Lt/l; invoke-direct {p1, v1}, Lt/l;->(Ljava/lang/String;)V throw p1 :cond_10 const-string p1, "builder" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V throw v0 .end method # virtual methods .method public a(Lx/y;Lokhttp3/WebSocketListener;)Lokhttp3/WebSocket; .locals 8 const/4 v0, 0x0 if-eqz p1, :cond_c if-eqz p2, :cond_b new-instance v7, Lx/c0/j/a; new-instance v4, Ljava/util/Random; invoke-direct {v4}, Ljava/util/Random;->()V iget v1, p0, Lx/v;->D:I int-to-long v5, v1 move-object v1, v7 move-object v2, p1 move-object v3, p2 invoke-direct/range {v1 .. v6}, Lx/c0/j/a;->(Lx/y;Lokhttp3/WebSocketListener;Ljava/util/Random;J)V new-instance p1, Lx/v$a; invoke-direct {p1, p0}, Lx/v$a;->(Lx/v;)V sget-object p2, Lx/r;->a:Lx/r; if-eqz p2, :cond_a invoke-static {p2}, Lx/c0/a;->a(Lx/r;)Lx/r$b; move-result-object p2 iput-object p2, p1, Lx/v$a;->e:Lx/r$b; sget-object p2, Lx/c0/j/a;->x:Ljava/util/List; if-eqz p2, :cond_9 invoke-static {p2}, Lt/q/l;->toMutableList(Ljava/util/Collection;)Ljava/util/List; move-result-object v1 sget-object v2, Lx/w;->h:Lx/w; invoke-interface {v1, v2}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result v2 const/4 v3, 0x0 const/4 v4, 0x1 if-nez v2, :cond_1 sget-object v2, Lx/w;->e:Lx/w; invoke-interface {v1, v2}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result v2 if-eqz v2, :cond_0 goto :goto_0 :cond_0 const/4 v2, 0x0 goto :goto_1 :cond_1 :goto_0 const/4 v2, 0x1 :goto_1 if-eqz v2, :cond_8 sget-object v2, Lx/w;->h:Lx/w; invoke-interface {v1, v2}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result v2 if-eqz v2, :cond_2 invoke-interface {v1}, Ljava/util/List;->size()I move-result v2 if-gt v2, v4, :cond_3 :cond_2 const/4 v3, 0x1 :cond_3 if-eqz v3, :cond_7 sget-object v2, Lx/w;->d:Lx/w; invoke-interface {v1, v2}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result v2 xor-int/2addr v2, v4 if-eqz v2, :cond_6 invoke-interface {v1, v0}, Ljava/util/List;->contains(Ljava/lang/Object;)Z move-result v2 xor-int/2addr v2, v4 if-eqz v2, :cond_5 sget-object v2, Lx/w;->f:Lx/w; invoke-interface {v1, v2}, Ljava/util/List;->remove(Ljava/lang/Object;)Z invoke-static {p2}, Ljava/util/Collections;->unmodifiableList(Ljava/util/List;)Ljava/util/List; move-result-object p2 const-string v1, "Collections.unmodifiableList(protocols)" invoke-static {p2, v1}, Lt/u/b/j;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V iput-object p2, p1, Lx/v$a;->s:Ljava/util/List; new-instance p2, Lx/v; invoke-direct {p2, p1}, Lx/v;->(Lx/v$a;)V iget-object p1, v7, Lx/c0/j/a;->t:Lx/y; invoke-virtual {p1}, Lx/y;->c()Lx/y$a; move-result-object p1 const-string v1, "Upgrade" const-string v2, "websocket" invoke-virtual {p1, v1, v2}, Lx/y$a;->b(Ljava/lang/String;Ljava/lang/String;)Lx/y$a; const-string v2, "Connection" invoke-virtual {p1, v2, v1}, Lx/y$a;->b(Ljava/lang/String;Ljava/lang/String;)Lx/y$a; iget-object v1, v7, Lx/c0/j/a;->a:Ljava/lang/String; const-string v2, "Sec-WebSocket-Key" invoke-virtual {p1, v2, v1}, Lx/y$a;->b(Ljava/lang/String;Ljava/lang/String;)Lx/y$a; const-string v1, "Sec-WebSocket-Version" const-string v2, "13" invoke-virtual {p1, v1, v2}, Lx/y$a;->b(Ljava/lang/String;Ljava/lang/String;)Lx/y$a; invoke-virtual {p1}, Lx/y$a;->a()Lx/y; move-result-object p1 sget-object v1, Lx/x;->i:Lx/x$b; invoke-virtual {v1, p2, p1, v4}, Lx/x$b;->a(Lx/v;Lx/y;Z)Lx/x; move-result-object p2 iput-object p2, v7, Lx/c0/j/a;->b:Lx/e; iget-object p2, v7, Lx/c0/j/a;->b:Lx/e; if-eqz p2, :cond_4 new-instance v0, Lx/c0/j/b; invoke-direct {v0, v7, p1}, Lx/c0/j/b;->(Lx/c0/j/a;Lx/y;)V check-cast p2, Lx/x; invoke-virtual {p2, v0}, Lx/x;->a(Lx/f;)V return-object v7 :cond_4 invoke-static {}, Lt/u/b/j;->throwNpe()V throw v0 :cond_5 new-instance p1, Ljava/lang/IllegalArgumentException; const-string p2, "protocols must not contain null" invoke-virtual {p2}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p2 invoke-direct {p1, p2}, Ljava/lang/IllegalArgumentException;->(Ljava/lang/String;)V throw p1 :cond_6 new-instance p1, Ljava/lang/StringBuilder; invoke-direct {p1}, Ljava/lang/StringBuilder;->()V const-string p2, "protocols must not contain http/1.0: " invoke-virtual {p1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {p1, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 new-instance p2, Ljava/lang/IllegalArgumentException; invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p1 invoke-direct {p2, p1}, Ljava/lang/IllegalArgumentException;->(Ljava/lang/String;)V throw p2 :cond_7 new-instance p1, Ljava/lang/StringBuilder; invoke-direct {p1}, Ljava/lang/StringBuilder;->()V const-string p2, "protocols containing h2_prior_knowledge cannot use other protocols: " invoke-virtual {p1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {p1, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 new-instance p2, Ljava/lang/IllegalArgumentException; invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p1 invoke-direct {p2, p1}, Ljava/lang/IllegalArgumentException;->(Ljava/lang/String;)V throw p2 :cond_8 new-instance p1, Ljava/lang/StringBuilder; invoke-direct {p1}, Ljava/lang/StringBuilder;->()V const-string p2, "protocols must contain h2_prior_knowledge or http/1.1: " invoke-virtual {p1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {p1, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 new-instance p2, Ljava/lang/IllegalArgumentException; invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object p1 invoke-direct {p2, p1}, Ljava/lang/IllegalArgumentException;->(Ljava/lang/String;)V throw p2 :cond_9 const-string p1, "protocols" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V throw v0 :cond_a const-string p1, "eventListener" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V throw v0 :cond_b const-string p1, "listener" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V throw v0 :cond_c const-string p1, "request" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V throw v0 .end method .method public a(Lx/y;)Lx/e; .locals 2 if-eqz p1, :cond_0 sget-object v0, Lx/x;->i:Lx/x$b; const/4 v1, 0x0 invoke-virtual {v0, p0, p1, v1}, Lx/x$b;->a(Lx/v;Lx/y;Z)Lx/x; move-result-object p1 return-object p1 :cond_0 const-string p1, "request" invoke-static {p1}, Lt/u/b/j;->a(Ljava/lang/String;)V const/4 p1, 0x0 throw p1 .end method .method public final a()V .locals 0 return-void .end method .method public clone()Ljava/lang/Object; .locals 1 invoke-super {p0}, Ljava/lang/Object;->clone()Ljava/lang/Object; move-result-object v0 return-object v0 .end method