// Path: src/main/java/com/twitter/joauth/Request.java
// public interface Request {
// 
//   public String authHeader();
//   public String body();
//   public String contentType();
//   public String host();
//   public String method();
//   public String path();
//   public int port();
//   public String queryString();
//   public String scheme();
// 
//   public static interface ParsedRequestFactory {
//     ParsedRequest parsedRequest(Request request, List<Pair> params);
//   }
// 
//   public final ParsedRequestFactory factory = new ParsedRequestFactory() {
//     @Override
//     public ParsedRequest parsedRequest(Request request, List<Pair> params) {
//       return new ParsedRequest(
//         (request.scheme() == null) ? null : request.scheme().toUpperCase(),
//         request.host(),
//         request.port(),
//         (request.method() == null) ? null : request.method().toUpperCase(),
//         request.path(),
//         params
//       );
//     }
//   };
// 
//   public static class Pair {
//     public final String key;
//     public final String value;
// 
//     public Pair(String key, String value) {
//       this.key = key;
//       this.value = value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//       if (this == o) return true;
//       if (o == null || getClass() != o.getClass()) return false;
// 
//       Pair pair = (Pair) o;
// 
//       if (key != null ? !key.equals(pair.key) : pair.key != null) return false;
//       if (value != null ? !value.equals(pair.value) : pair.value != null) return false;
// 
//       return true;
//     }
// 
//     @Override
//     public int hashCode() {
//       int result = key != null ? key.hashCode() : 0;
//       result = 31 * result + (value != null ? value.hashCode() : 0);
//       return result;
//     }
// 
//     @Override
//     public String toString() {
//       return "Pair{" +
//         "key='" + key + '\'' +
//         ", value='" + value + '\'' +
//         '}';
//     }
//   }
// 
//   public static class ParsedRequest {
//     private final String scheme;
//     private final String host;
//     private final int port;
//     private final String verb;
//     private final String path;
//     private final List<Pair> params;
// 
//     public ParsedRequest(String scheme, String host, int port, String verb, String path, List<Pair> params) {
//       this.scheme = scheme;
//       this.host = host;
//       this.port = port;
//       this.verb = verb;
//       this.path = path;
//       this.params = Collections.unmodifiableList(params);
//     }
// 
//     public String scheme() { return scheme; }
//     public String host() { return host; }
//     public int port() { return port; }
//     public String verb() { return verb; }
//     public String path() { return path; }
//     public List<Pair> params() { return params; }
// 
//     @Override
//     public String toString() {
//       return "ParsedRequest{" +
//         "scheme='" + scheme + '\'' +
//         ", host='" + host + '\'' +
//         ", port=" + port +
//         ", verb='" + verb + '\'' +
//         ", path='" + path + '\'' +
//         ", params=" + params +
//         '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//       if (this == o) return true;
//       if (o == null || getClass() != o.getClass()) return false;
// 
//       ParsedRequest that = (ParsedRequest) o;
// 
//       if (port != that.port) return false;
//       if (host != null ? !host.equals(that.host) : that.host != null) return false;
//       if (params != null ? !params.equals(that.params) : that.params != null) return false;
//       if (path != null ? !path.equals(that.path) : that.path != null) return false;
//       if (scheme != null ? !scheme.equals(that.scheme) : that.scheme != null) return false;
//       if (verb != null ? !verb.equals(that.verb) : that.verb != null) return false;
// 
//       return true;
//     }
// 
//     @Override
//     public int hashCode() {
//       int result = scheme != null ? scheme.hashCode() : 0;
//       result = 31 * result + (host != null ? host.hashCode() : 0);
//       result = 31 * result + port;
//       result = 31 * result + (verb != null ? verb.hashCode() : 0);
//       result = 31 * result + (path != null ? path.hashCode() : 0);
//       result = 31 * result + (params != null ? params.hashCode() : 0);
//       return result;
//     }
//   }
// }


import java.util.*;
import com.twitter.joauth.Request;
    }

    @Override
    public void handle(String key, String value) {
      underlying.handle(key, valueTransformer.transform(value));
    }
  }

  /**
   * UrlEncodingNormalizingKeyValueHandler normalizes URLEncoded
   * keys and values, to properly capitalize them
   */
  public static class UrlEncodingNormalizingKeyValueHandler extends TransformingKeyValueHandler {

    public UrlEncodingNormalizingKeyValueHandler(KeyValueHandler underlying) {
      super(underlying, Transformer.URL_ENCODING_NORMALIZING_TRANSFORMER, Transformer.URL_ENCODING_NORMALIZING_TRANSFORMER);
    }
  }


  /**
   * key is set iff the handler was invoked exactly once with an empty value
   *
   * Note: this class is not thead safe
   */
  public static class OneKeyOnlyKeyValueHandler implements KeyValueHandler {
    private boolean invoked = false;
    private String _key = null;

    @Override
// Path: src/main/java/com/twitter/joauth/Request.java
// public interface Request {
// 
//   public String authHeader();
//   public String body();
//   public String contentType();
//   public String host();
//   public String method();
//   public String path();
//   public int port();
//   public String queryString();
//   public String scheme();
// 
//   public static interface ParsedRequestFactory {
//     ParsedRequest parsedRequest(Request request, List<Pair> params);
//   }
// 
//   public final ParsedRequestFactory factory = new ParsedRequestFactory() {
//     @Override
//     public ParsedRequest parsedRequest(Request request, List<Pair> params) {
//       return new ParsedRequest(
//         (request.scheme() == null) ? null : request.scheme().toUpperCase(),
//         request.host(),
//         request.port(),
//         (request.method() == null) ? null : request.method().toUpperCase(),
//         request.path(),
//         params
//       );
//     }
//   };
// 
//   public static class Pair {
//     public final String key;
//     public final String value;
// 
//     public Pair(String key, String value) {
//       this.key = key;
//       this.value = value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//       if (this == o) return true;
//       if (o == null || getClass() != o.getClass()) return false;
// 
//       Pair pair = (Pair) o;
// 
//       if (key != null ? !key.equals(pair.key) : pair.key != null) return false;
//       if (value != null ? !value.equals(pair.value) : pair.value != null) return false;
// 
//       return true;
//     }
// 
//     @Override
//     public int hashCode() {
//       int result = key != null ? key.hashCode() : 0;
//       result = 31 * result + (value != null ? value.hashCode() : 0);
//       return result;
//     }
// 
//     @Override
//     public String toString() {
//       return "Pair{" +
//         "key='" + key + '\'' +
//         ", value='" + value + '\'' +
//         '}';
//     }
//   }
// 
//   public static class ParsedRequest {
//     private final String scheme;
//     private final String host;
//     private final int port;
//     private final String verb;
//     private final String path;
//     private final List<Pair> params;
// 
//     public ParsedRequest(String scheme, String host, int port, String verb, String path, List<Pair> params) {
//       this.scheme = scheme;
//       this.host = host;
//       this.port = port;
//       this.verb = verb;
//       this.path = path;
//       this.params = Collections.unmodifiableList(params);
//     }
// 
//     public String scheme() { return scheme; }
//     public String host() { return host; }
//     public int port() { return port; }
//     public String verb() { return verb; }
//     public String path() { return path; }
//     public List<Pair> params() { return params; }
// 
//     @Override
//     public String toString() {
//       return "ParsedRequest{" +
//         "scheme='" + scheme + '\'' +
//         ", host='" + host + '\'' +
//         ", port=" + port +
//         ", verb='" + verb + '\'' +
//         ", path='" + path + '\'' +
//         ", params=" + params +
//         '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//       if (this == o) return true;
//       if (o == null || getClass() != o.getClass()) return false;
// 
//       ParsedRequest that = (ParsedRequest) o;
// 
//       if (port != that.port) return false;
//       if (host != null ? !host.equals(that.host) : that.host != null) return false;
//       if (params != null ? !params.equals(that.params) : that.params != null) return false;
//       if (path != null ? !path.equals(that.path) : that.path != null) return false;
//       if (scheme != null ? !scheme.equals(that.scheme) : that.scheme != null) return false;
//       if (verb != null ? !verb.equals(that.verb) : that.verb != null) return false;
// 
//       return true;
//     }
// 
//     @Override
//     public int hashCode() {
//       int result = scheme != null ? scheme.hashCode() : 0;
//       result = 31 * result + (host != null ? host.hashCode() : 0);
//       result = 31 * result + port;
//       result = 31 * result + (verb != null ? verb.hashCode() : 0);
//       result = 31 * result + (path != null ? path.hashCode() : 0);
//       result = 31 * result + (params != null ? params.hashCode() : 0);
//       return result;
//     }
//   }
// }


// Path: src/main/java/com/twitter/joauth/keyvalue/KeyValueHandler.java
import java.util.*;
import com.twitter.joauth.Request;

    }

    @Override
    public void handle(String key, String value) {
      underlying.handle(key, valueTransformer.transform(value));
    }
  }

  /**
   * UrlEncodingNormalizingKeyValueHandler normalizes URLEncoded
   * keys and values, to properly capitalize them
   */
  public static class UrlEncodingNormalizingKeyValueHandler extends TransformingKeyValueHandler {

    public UrlEncodingNormalizingKeyValueHandler(KeyValueHandler underlying) {
      super(underlying, Transformer.URL_ENCODING_NORMALIZING_TRANSFORMER, Transformer.URL_ENCODING_NORMALIZING_TRANSFORMER);
    }
  }


  /**
   * key is set iff the handler was invoked exactly once with an empty value
   *
   * Note: this class is not thead safe
   */
  public static class OneKeyOnlyKeyValueHandler implements KeyValueHandler {
    private boolean invoked = false;
    private String _key = null;

    @Override
    public void handle(String key, String value) {