/**
   * This method handles shuffling together two gcodes, it first executes preprocessing and then
   * hands the gcodes off to Layer_Helper
   */
  public void combine() {
    MutableGCodeSource left, right;

    // load our layers into something we can use
    left = new MutableGCodeSource(leftFile);
    right = new MutableGCodeSource(rightFile);

    // remove  some tags we don't want/get
    SkeinforgePostProcessor.stripNonLayerTagComments(left);
    SkeinforgePostProcessor.stripNonLayerTagComments(right);

    // load our layers into something we can *really* use
    LinkedList<Layer> leftLayers = parseLayers(left);
    LinkedList<Layer> rightLayers = parseLayers(right);

    // merge our layers into one list
    final LinkedList<Layer> layers = doMerge(leftLayers, rightLayers);

    // refresh and repopulate our result
    result = new MutableGCodeSource();
    for (Layer l : layers) {
      result.add(l.getCommands());
    }

    // add start gcode, updated based on settings
    SkeinforgePostProcessor.prependAndModifyStartCode(result, startGCode);
    // add end code
    Layer endLayer = new Layer(Double.MAX_VALUE, endGCode.asList());
    result.add(endLayer.toString());
    // interlace progress updates
    result.addProgressUpdates();
  }