// Path: src/org/openstreetmap/josm/plugins/tracer/clipper/Path.java
// public class Path extends ArrayList<Point2d> {
//     void reverse() {
//         Collections.reverse(this);
//     }
// }
// 
// Path: src/org/openstreetmap/josm/plugins/tracer/clipper/Paths.java
// public class Paths extends ArrayList<Path>{
// 
// }


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.projection.ProjectionRegistry;
import org.openstreetmap.josm.plugins.tracer.clipper.ClipType;
import org.openstreetmap.josm.plugins.tracer.clipper.Clipper;
import org.openstreetmap.josm.plugins.tracer.clipper.ClipperException;
import org.openstreetmap.josm.plugins.tracer.clipper.Path;
import org.openstreetmap.josm.plugins.tracer.clipper.Paths;
import org.openstreetmap.josm.plugins.tracer.clipper.Point2d;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyNode;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyTree;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyType;
                if (GeomUtils.duplicateNodes(list.get(i).getCoor(), list.get(i2).getCoor(), m_duplicateNodesPrecision)) {
                    System.out.println(" x d: tail " + Long.toString(list.get(i).getUniqueId()));
                    list.remove(i1);
                    list.remove(i2 > i1 ? i1 : 0);
                    i = i >= 3 ? i - 3 : 0;
                    changed = true;
                }
                else {
                    i++;
                }
            }
        } while (changed);

        // Polygon degenerated to two or one nodes
        if (list.size() < 3) {
            list.clear();
            return list;
        }

        // Close the polygon
        list.add(list.get(0));

        return list;
    }


    private Path wayToPath(EdWay w, boolean issubj) {
        if (!w.isClosed())
            throw new IllegalArgumentException ("Way must be closed");

// Path: src/org/openstreetmap/josm/plugins/tracer/clipper/Path.java
// public class Path extends ArrayList<Point2d> {
//     void reverse() {
//         Collections.reverse(this);
//     }
// }
// 
// Path: src/org/openstreetmap/josm/plugins/tracer/clipper/Paths.java
// public class Paths extends ArrayList<Path>{
// 
// }


// Path: src/org/openstreetmap/josm/plugins/tracer/connectways/AngPolygonClipper.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.projection.ProjectionRegistry;
import org.openstreetmap.josm.plugins.tracer.clipper.ClipType;
import org.openstreetmap.josm.plugins.tracer.clipper.Clipper;
import org.openstreetmap.josm.plugins.tracer.clipper.ClipperException;
import org.openstreetmap.josm.plugins.tracer.clipper.Path;
import org.openstreetmap.josm.plugins.tracer.clipper.Paths;
import org.openstreetmap.josm.plugins.tracer.clipper.Point2d;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyNode;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyTree;
import org.openstreetmap.josm.plugins.tracer.clipper.PolyType;

                if (GeomUtils.duplicateNodes(list.get(i).getCoor(), list.get(i2).getCoor(), m_duplicateNodesPrecision)) {
                    System.out.println(" x d: tail " + Long.toString(list.get(i).getUniqueId()));
                    list.remove(i1);
                    list.remove(i2 > i1 ? i1 : 0);
                    i = i >= 3 ? i - 3 : 0;
                    changed = true;
                }
                else {
                    i++;
                }
            }
        } while (changed);

        // Polygon degenerated to two or one nodes
        if (list.size() < 3) {
            list.clear();
            return list;
        }

        // Close the polygon
        list.add(list.get(0));

        return list;
    }


    private Path wayToPath(EdWay w, boolean issubj) {
        if (!w.isClosed())
            throw new IllegalArgumentException ("Way must be closed");

        Path p = new Path();