// Path: src/edu/unc/genomics/CommandLineTool.java
// public abstract class CommandLineTool {
// 
//   /**
//    * The default bite-size to use for applications that process files in chunks
//    * TODO Read from a configuration file
//    */
//   public static final int DEFAULT_CHUNK_SIZE = 10_000_000;
// 
//   /**
//    * Do the main computation of this tool
//    * 
//    * @throws IOException
//    */
//   public abstract void run() throws IOException;
// 
//   /**
//    * Parse command-line arguments and run the tool Exit on parameter exceptions
//    * 
//    * @param args
//    */
//   public void instanceMain(String[] args) throws CommandLineToolException {
//     // Initialize the command-line options parser
//     JCommander jc = new JCommander(this);
// 
//     // Add factories for parsing Paths, Assemblies, IntervalFiles, and WigFiles
//     jc.addConverterFactory(new PathFactory());
//     jc.addConverterFactory(new AssemblyFactory());
// 
//     // Set the program name to be the class name
//     String[] nameParts = getClass().getName().split("\\.");
//     String shortName = StringUtils.join(Arrays.copyOfRange(nameParts, nameParts.length - 2, nameParts.length), '.');
//     jc.setProgramName(shortName);
// 
//     try {
//       jc.parse(args);
//     } catch (ParameterException e) {
//       System.err.println(e.getMessage());
//       jc.usage();
//       System.exit(-1);
//     }
// 
//     ValidationStringency stringency = SAMFileReader.getDefaultValidationStringency();
//     try {
//       SAMFileReader.setDefaultValidationStringency(SAMFileReader.ValidationStringency.LENIENT);
//       run();
//     } catch (IOException e) {
//       throw new CommandLineToolException("IO error while running", e);
//     } finally {
//       SAMFileReader.setDefaultValidationStringency(stringency);
//     }
//   }
// }
// 
// Path: src/edu/unc/genomics/CommandLineToolException.java
// public class CommandLineToolException extends RuntimeException {
// 
//   /**
// 	 * 
// 	 */
//   private static final long serialVersionUID = 4740440799806133636L;
// 
//   /**
// 	 * 
// 	 */
//   public CommandLineToolException() {
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    */
//   public CommandLineToolException(String message) {
//     super(message);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param cause
//    */
//   public CommandLineToolException(Throwable cause) {
//     super(cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    */
//   public CommandLineToolException(String message, Throwable cause) {
//     super(message, cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    * @param enableSuppression
//    * @param writableStackTrace
//    */
//   public CommandLineToolException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//     super(message, cause, enableSuppression, writableStackTrace);
//     // TODO Auto-generated constructor stub
//   }
// 
// }
// 
// Path: src/edu/unc/genomics/ReadablePathValidator.java
// public class ReadablePathValidator implements IParameterValidator {
// 
//   /*
//    * (non-Javadoc)
//    * 
//    * @see com.beust.jcommander.IParameterValidator#validate(java.lang.String,
//    * java.lang.String)
//    */
//   @Override
//   public void validate(String name, String value) throws ParameterException {
//     PathConverter converter = new PathConverter();
//     Path p = converter.convert(value);
//     if (!Files.isReadable(p)) {
//       throw new ParameterException("Parameter " + name + " should be a readable file");
//     }
//   }
// 
// }


import java.io.IOException;
import java.nio.file.Path;
import java.util.Iterator;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineTool;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Contig;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.io.IntervalFileReader;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;
import edu.unc.genomics.io.WigFileWriter;
        int stop = reader.getChrStop(chr);
        log.debug("Processing chromosome " + chr + " region " + bp + "-" + stop);

        // Process the chromosome in chunks
        while (bp < stop) {
          int chunkStart = bp;
          int chunkStop = Math.min(bp + DEFAULT_CHUNK_SIZE - 1, stop);
          Interval chunk = new Interval(chr, chunkStart, chunkStop);
          log.debug("Processing chunk " + chunk);

          try {
            Contig contig = reader.query(chunk);
            Iterator<? extends Interval> it = loci.query(contig);
            int start = contig.getStart();
            // Copy the data up to the excluded point, then skip past the
            // excluded point
            while (it.hasNext()) {
              Interval exclude = it.next();
              log.debug("Skipping interval " + exclude);
              if (exclude.low() - 1 > start) {
                writer.write(contig.copy(start, exclude.low() - 1));
              }
              start = exclude.high() + 1;
            }

            // Copy the remaining data, if there is any
            if (start <= contig.getStop()) {
              writer.write(contig.copy(start, contig.getStop()));
            }
          } catch (WigFileException e) {
// Path: src/edu/unc/genomics/CommandLineTool.java
// public abstract class CommandLineTool {
// 
//   /**
//    * The default bite-size to use for applications that process files in chunks
//    * TODO Read from a configuration file
//    */
//   public static final int DEFAULT_CHUNK_SIZE = 10_000_000;
// 
//   /**
//    * Do the main computation of this tool
//    * 
//    * @throws IOException
//    */
//   public abstract void run() throws IOException;
// 
//   /**
//    * Parse command-line arguments and run the tool Exit on parameter exceptions
//    * 
//    * @param args
//    */
//   public void instanceMain(String[] args) throws CommandLineToolException {
//     // Initialize the command-line options parser
//     JCommander jc = new JCommander(this);
// 
//     // Add factories for parsing Paths, Assemblies, IntervalFiles, and WigFiles
//     jc.addConverterFactory(new PathFactory());
//     jc.addConverterFactory(new AssemblyFactory());
// 
//     // Set the program name to be the class name
//     String[] nameParts = getClass().getName().split("\\.");
//     String shortName = StringUtils.join(Arrays.copyOfRange(nameParts, nameParts.length - 2, nameParts.length), '.');
//     jc.setProgramName(shortName);
// 
//     try {
//       jc.parse(args);
//     } catch (ParameterException e) {
//       System.err.println(e.getMessage());
//       jc.usage();
//       System.exit(-1);
//     }
// 
//     ValidationStringency stringency = SAMFileReader.getDefaultValidationStringency();
//     try {
//       SAMFileReader.setDefaultValidationStringency(SAMFileReader.ValidationStringency.LENIENT);
//       run();
//     } catch (IOException e) {
//       throw new CommandLineToolException("IO error while running", e);
//     } finally {
//       SAMFileReader.setDefaultValidationStringency(stringency);
//     }
//   }
// }
// 
// Path: src/edu/unc/genomics/CommandLineToolException.java
// public class CommandLineToolException extends RuntimeException {
// 
//   /**
// 	 * 
// 	 */
//   private static final long serialVersionUID = 4740440799806133636L;
// 
//   /**
// 	 * 
// 	 */
//   public CommandLineToolException() {
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    */
//   public CommandLineToolException(String message) {
//     super(message);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param cause
//    */
//   public CommandLineToolException(Throwable cause) {
//     super(cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    */
//   public CommandLineToolException(String message, Throwable cause) {
//     super(message, cause);
//     // TODO Auto-generated constructor stub
//   }
// 
//   /**
//    * @param message
//    * @param cause
//    * @param enableSuppression
//    * @param writableStackTrace
//    */
//   public CommandLineToolException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//     super(message, cause, enableSuppression, writableStackTrace);
//     // TODO Auto-generated constructor stub
//   }
// 
// }
// 
// Path: src/edu/unc/genomics/ReadablePathValidator.java
// public class ReadablePathValidator implements IParameterValidator {
// 
//   /*
//    * (non-Javadoc)
//    * 
//    * @see com.beust.jcommander.IParameterValidator#validate(java.lang.String,
//    * java.lang.String)
//    */
//   @Override
//   public void validate(String name, String value) throws ParameterException {
//     PathConverter converter = new PathConverter();
//     Path p = converter.convert(value);
//     if (!Files.isReadable(p)) {
//       throw new ParameterException("Parameter " + name + " should be a readable file");
//     }
//   }
// 
// }


// Path: src/edu/unc/genomics/ngs/FilterRegions.java
import java.io.IOException;
import java.nio.file.Path;
import java.util.Iterator;
import org.apache.log4j.Logger;
import com.beust.jcommander.Parameter;
import edu.unc.genomics.CommandLineTool;
import edu.unc.genomics.CommandLineToolException;
import edu.unc.genomics.Contig;
import edu.unc.genomics.Interval;
import edu.unc.genomics.ReadablePathValidator;
import edu.unc.genomics.io.IntervalFileReader;
import edu.unc.genomics.io.WigFileReader;
import edu.unc.genomics.io.WigFileException;
import edu.unc.genomics.io.WigFileWriter;

        int stop = reader.getChrStop(chr);
        log.debug("Processing chromosome " + chr + " region " + bp + "-" + stop);

        // Process the chromosome in chunks
        while (bp < stop) {
          int chunkStart = bp;
          int chunkStop = Math.min(bp + DEFAULT_CHUNK_SIZE - 1, stop);
          Interval chunk = new Interval(chr, chunkStart, chunkStop);
          log.debug("Processing chunk " + chunk);

          try {
            Contig contig = reader.query(chunk);
            Iterator<? extends Interval> it = loci.query(contig);
            int start = contig.getStart();
            // Copy the data up to the excluded point, then skip past the
            // excluded point
            while (it.hasNext()) {
              Interval exclude = it.next();
              log.debug("Skipping interval " + exclude);
              if (exclude.low() - 1 > start) {
                writer.write(contig.copy(start, exclude.low() - 1));
              }
              start = exclude.high() + 1;
            }

            // Copy the remaining data, if there is any
            if (start <= contig.getStop()) {
              writer.write(contig.copy(start, contig.getStop()));
            }
          } catch (WigFileException e) {
            throw new CommandLineToolException("Wig file error while processing chunk " + chr + ":" + chunkStart + "-"