// Path: src/main/java/xpertss/utils/Utils.java
// public class Utils {
// 
//    /**
//     * Creates and returns an {@link InetSocketAddress} that represents the authority
//     * of the given {@link java.net.URI}. If the {@link java.net.URI} does not define
//     * a port then the specified default port is used instead.
//     *
//     * @throws NullPointerException if uri is {@code null}
//     * @throws IllegalArgumentException if the port is outside the range 1 - 65545
//     */
//    public static SocketAddress createSocketAddress(URI uri, int defPort)
//    {
//       String authority = uri.getAuthority();
//       if(Strings.isEmpty(authority))
//          throw new IllegalArgumentException("uri does not define an authority");
//       String[] parts = authority.split(":");
//       int port = defPort;
//       if(parts.length == 2) {
//          port = Integers.parse(parts[1], defPort);
//          Numbers.within(1, 65545, port, String.format("%d is an invalid port", port));
//       }
//       return new InetSocketAddress(parts[0], port);
//    }
// 
// 
// 
// 
//    public static <T> T get(T[] items, int index)
//    {
//       if(items == null || index < 0) return null;
//       return (items.length > index) ? items[index] : null;
//    }
// 
// 
//    public static String trimAndClear(StringBuilder buf)
//    {
//       return getAndClear(buf).trim();
//    }
// 
//    public static String getAndClear(StringBuilder buf)
//    {
//       try {
//          return buf.toString();
//       } finally {
//          buf.setLength(0);
//       }
//    }
// 
// 
//    public static long computeTimeout(int millis)
//    {
//       if(millis == 0) millis = 60000;  // default timeout of 60 seconds
//       return System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(millis);
//    }
// 
// 
// 
// 
// 
// 
//    public static String consume(CharBuffer buf, boolean trim)
//    {
//       buf.flip();
//       int offset = 0; int end = buf.limit();
//       if(trim) {
//          while(offset < end && buf.get(offset) == ' ') offset++;
//          while(end > offset && buf.get(end - 1) == ' ') end--;
//       }
//       char[] result = new char[end-offset];
//       buf.position(offset);
//       buf.get(result).clear();
//       return new String(result);
//    }
// 
// 
//    public static boolean isWhiteSpace(char c)
//    {
//       return (c == '\t' || c == '\r' || c == '\n' || c == ' ');
//    }
// 
// 
//    public static int maxIfZero(int value)
//    {
//       return (value == 0) ? Integer.MAX_VALUE : value;
//    }
// 
// 
//    public static String getHeader(RtspResponse response, String name)
//    {
//       return Headers.toString(response.getHeaders().getHeader(name));
//    }
// 
// }


import xpertss.function.Predicate;
import xpertss.function.Predicates;
import xpertss.lang.Integers;
import xpertss.lang.Objects;
import xpertss.lang.Strings;
import xpertss.utils.Utils;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.NoSuchElementException;
   /**
    * Returns the set of headers with one header per line
    */
   @Override
   public String toString()
   {
      StringBuilder builder = new StringBuilder();
      for(Enumeration<Header> e = headers(); e.hasMoreElements(); ) {
         builder.append(e.nextElement()).append("\r\n");
      }
      return builder.toString();
   }












   public static Headers create(List<String> raw)
   {
      List<Header> headers = new ArrayList<Header>();
      StringBuilder header = new StringBuilder();
      for(int i = raw.size() - 1; i >= 0; i--) {
         header.insert(0, raw.get(i));
// Path: src/main/java/xpertss/utils/Utils.java
// public class Utils {
// 
//    /**
//     * Creates and returns an {@link InetSocketAddress} that represents the authority
//     * of the given {@link java.net.URI}. If the {@link java.net.URI} does not define
//     * a port then the specified default port is used instead.
//     *
//     * @throws NullPointerException if uri is {@code null}
//     * @throws IllegalArgumentException if the port is outside the range 1 - 65545
//     */
//    public static SocketAddress createSocketAddress(URI uri, int defPort)
//    {
//       String authority = uri.getAuthority();
//       if(Strings.isEmpty(authority))
//          throw new IllegalArgumentException("uri does not define an authority");
//       String[] parts = authority.split(":");
//       int port = defPort;
//       if(parts.length == 2) {
//          port = Integers.parse(parts[1], defPort);
//          Numbers.within(1, 65545, port, String.format("%d is an invalid port", port));
//       }
//       return new InetSocketAddress(parts[0], port);
//    }
// 
// 
// 
// 
//    public static <T> T get(T[] items, int index)
//    {
//       if(items == null || index < 0) return null;
//       return (items.length > index) ? items[index] : null;
//    }
// 
// 
//    public static String trimAndClear(StringBuilder buf)
//    {
//       return getAndClear(buf).trim();
//    }
// 
//    public static String getAndClear(StringBuilder buf)
//    {
//       try {
//          return buf.toString();
//       } finally {
//          buf.setLength(0);
//       }
//    }
// 
// 
//    public static long computeTimeout(int millis)
//    {
//       if(millis == 0) millis = 60000;  // default timeout of 60 seconds
//       return System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(millis);
//    }
// 
// 
// 
// 
// 
// 
//    public static String consume(CharBuffer buf, boolean trim)
//    {
//       buf.flip();
//       int offset = 0; int end = buf.limit();
//       if(trim) {
//          while(offset < end && buf.get(offset) == ' ') offset++;
//          while(end > offset && buf.get(end - 1) == ' ') end--;
//       }
//       char[] result = new char[end-offset];
//       buf.position(offset);
//       buf.get(result).clear();
//       return new String(result);
//    }
// 
// 
//    public static boolean isWhiteSpace(char c)
//    {
//       return (c == '\t' || c == '\r' || c == '\n' || c == ' ');
//    }
// 
// 
//    public static int maxIfZero(int value)
//    {
//       return (value == 0) ? Integer.MAX_VALUE : value;
//    }
// 
// 
//    public static String getHeader(RtspResponse response, String name)
//    {
//       return Headers.toString(response.getHeaders().getHeader(name));
//    }
// 
// }


// Path: src/main/java/xpertss/mime/Headers.java
import xpertss.function.Predicate;
import xpertss.function.Predicates;
import xpertss.lang.Integers;
import xpertss.lang.Objects;
import xpertss.lang.Strings;
import xpertss.utils.Utils;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.NoSuchElementException;

   /**
    * Returns the set of headers with one header per line
    */
   @Override
   public String toString()
   {
      StringBuilder builder = new StringBuilder();
      for(Enumeration<Header> e = headers(); e.hasMoreElements(); ) {
         builder.append(e.nextElement()).append("\r\n");
      }
      return builder.toString();
   }












   public static Headers create(List<String> raw)
   {
      List<Header> headers = new ArrayList<Header>();
      StringBuilder header = new StringBuilder();
      for(int i = raw.size() - 1; i >= 0; i--) {
         header.insert(0, raw.get(i));
         if(!Utils.isWhiteSpace(header.charAt(0))) {