From 5ad1caad3dedb63c10e2350b9be96bba7eef770e Mon Sep 17 00:00:00 2001
From: Amandine Tournay <amandine.tournay@pasteur.fr>
Date: Tue, 9 Mar 2021 19:23:56 +0100
Subject: [PATCH] Added project

---
 .gitignore                                    |    6 +
 bin/plugins/ragini/voronoidiagram/AFL.class   |  Bin 0 -> 2464 bytes
 .../ragini/voronoidiagram/Alpha_Morph$1.class |  Bin 0 -> 2308 bytes
 .../voronoidiagram/Alpha_Morph$10.class       |  Bin 0 -> 1533 bytes
 .../voronoidiagram/Alpha_Morph$11.class       |  Bin 0 -> 1340 bytes
 .../voronoidiagram/Alpha_Morph$12.class       |  Bin 0 -> 1412 bytes
 .../voronoidiagram/Alpha_Morph$13.class       |  Bin 0 -> 1017 bytes
 .../voronoidiagram/Alpha_Morph$14.class       |  Bin 0 -> 1144 bytes
 .../voronoidiagram/Alpha_Morph$15.class       |  Bin 0 -> 830 bytes
 .../voronoidiagram/Alpha_Morph$16.class       |  Bin 0 -> 1834 bytes
 .../voronoidiagram/Alpha_Morph$17.class       |  Bin 0 -> 1453 bytes
 .../voronoidiagram/Alpha_Morph$18.class       |  Bin 0 -> 1521 bytes
 .../voronoidiagram/Alpha_Morph$19.class       |  Bin 0 -> 1215 bytes
 ...Alpha_Morph$1_cls1SelectItemListener.class |  Bin 0 -> 1409 bytes
 ...lpha_Morph$1_cls1SelectItemListener1.class |  Bin 0 -> 1413 bytes
 ...lpha_Morph$1_cls1SelectItemListener2.class |  Bin 0 -> 1413 bytes
 ...lpha_Morph$1_cls1SelectItemListener3.class |  Bin 0 -> 1413 bytes
 ...ha_Morph$1_cls1SelectItemListenerBin.class |  Bin 0 -> 1351 bytes
 ...pha_Morph$1_cls1SelectItemListenerTb.class |  Bin 0 -> 1373 bytes
 .../ragini/voronoidiagram/Alpha_Morph$2.class |  Bin 0 -> 1532 bytes
 .../voronoidiagram/Alpha_Morph$20.class       |  Bin 0 -> 1578 bytes
 .../voronoidiagram/Alpha_Morph$21.class       |  Bin 0 -> 1017 bytes
 .../voronoidiagram/Alpha_Morph$22.class       |  Bin 0 -> 1693 bytes
 .../voronoidiagram/Alpha_Morph$23.class       |  Bin 0 -> 1970 bytes
 .../ragini/voronoidiagram/Alpha_Morph$3.class |  Bin 0 -> 1542 bytes
 .../ragini/voronoidiagram/Alpha_Morph$4.class |  Bin 0 -> 1527 bytes
 .../ragini/voronoidiagram/Alpha_Morph$5.class |  Bin 0 -> 1570 bytes
 .../ragini/voronoidiagram/Alpha_Morph$6.class |  Bin 0 -> 1917 bytes
 .../ragini/voronoidiagram/Alpha_Morph$7.class |  Bin 0 -> 1592 bytes
 .../ragini/voronoidiagram/Alpha_Morph$8.class |  Bin 0 -> 1602 bytes
 .../ragini/voronoidiagram/Alpha_Morph$9.class |  Bin 0 -> 1530 bytes
 .../ragini/voronoidiagram/Alpha_Morph.class   |  Bin 0 -> 14589 bytes
 bin/plugins/ragini/voronoidiagram/Arcs.class  |  Bin 0 -> 938 bytes
 .../ragini/voronoidiagram/ArraySetter.class   |  Bin 0 -> 966 bytes
 bin/plugins/ragini/voronoidiagram/Circ.class  |  Bin 0 -> 1082 bytes
 .../ragini/voronoidiagram/Constants.class     |  Bin 0 -> 7765 bytes
 bin/plugins/ragini/voronoidiagram/DT.class    |  Bin 0 -> 1421 bytes
 .../ragini/voronoidiagram/Delaunay.class      |  Bin 0 -> 3093 bytes
 .../voronoidiagram/DelaunayTriangulator.class |  Bin 0 -> 15465 bytes
 .../ragini/voronoidiagram/Display.class       |  Bin 0 -> 21436 bytes
 bin/plugins/ragini/voronoidiagram/Edge.class  |  Bin 0 -> 1274 bytes
 bin/plugins/ragini/voronoidiagram/EdgeL.class |  Bin 0 -> 387 bytes
 .../ragini/voronoidiagram/EdgeList.class      |  Bin 0 -> 8733 bytes
 .../ragini/voronoidiagram/EdgeRNG.class       |  Bin 0 -> 1617 bytes
 bin/plugins/ragini/voronoidiagram/EdgeS.class |  Bin 0 -> 1576 bytes
 bin/plugins/ragini/voronoidiagram/Face.class  |  Bin 0 -> 6601 bytes
 .../ragini/voronoidiagram/FreeList.class      |  Bin 0 -> 390 bytes
 .../ragini/voronoidiagram/FreeNode.class      |  Bin 0 -> 328 bytes
 .../ragini/voronoidiagram/Geometry.class      |  Bin 0 -> 3041 bytes
 .../ragini/voronoidiagram/GraphD.class        |  Bin 0 -> 964 bytes
 .../ragini/voronoidiagram/HalfEdge.class      |  Bin 0 -> 2613 bytes
 .../ragini/voronoidiagram/Image_Extract.class |  Bin 0 -> 2772 bytes
 .../voronoidiagram/IntArraySetter.class       |  Bin 0 -> 907 bytes
 .../ragini/voronoidiagram/IntSetter.class     |  Bin 0 -> 957 bytes
 .../MorphologicalOperators.class              |  Bin 0 -> 614 bytes
 bin/plugins/ragini/voronoidiagram/NVert.class |  Bin 0 -> 1021 bytes
 .../ragini/voronoidiagram/Neighbor.class      |  Bin 0 -> 1292 bytes
 bin/plugins/ragini/voronoidiagram/Point.class |  Bin 0 -> 667 bytes
 .../ragini/voronoidiagram/PointType.class     |  Bin 0 -> 129 bytes
 .../ragini/voronoidiagram/PointVor.class      |  Bin 0 -> 309 bytes
 .../ragini/voronoidiagram/Provider.class      |  Bin 0 -> 244 bytes
 .../ragini/voronoidiagram/QuadEdge.class      |  Bin 0 -> 6966 bytes
 .../ragini/voronoidiagram/ROI2DEdge.class     |  Bin 0 -> 531 bytes
 .../ragini/voronoidiagram/ROI2DSite.class     |  Bin 0 -> 691 bytes
 .../ragini/voronoidiagram/Setter.class        |  Bin 0 -> 294 bytes
 .../voronoidiagram/Site$NeighborComp.class    |  Bin 0 -> 2234 bytes
 bin/plugins/ragini/voronoidiagram/Site.class  |  Bin 0 -> 1942 bytes
 .../ragini/voronoidiagram/SiteProvider.class  |  Bin 0 -> 1204 bytes
 bin/plugins/ragini/voronoidiagram/Tri.class   |  Bin 0 -> 924 bytes
 .../voronoidiagram/UniformGrid$GridCell.class |  Bin 0 -> 804 bytes
 .../UniformGrid$GridInterval.class            |  Bin 0 -> 2478 bytes
 .../UniformGrid$GridPosition.class            |  Bin 0 -> 1206 bytes
 .../UniformGrid$PointItem.class               |  Bin 0 -> 710 bytes
 .../UniformGrid$PointIterator.class           |  Bin 0 -> 1580 bytes
 .../ragini/voronoidiagram/UniformGrid.class   |  Bin 0 -> 11951 bytes
 .../ragini/voronoidiagram/VRegion$scomp.class |  Bin 0 -> 1448 bytes
 .../voronoidiagram/VRegion$vtcomp.class       |  Bin 0 -> 1289 bytes
 .../ragini/voronoidiagram/VRegion.class       |  Bin 0 -> 25001 bytes
 bin/plugins/ragini/voronoidiagram/Vert.class  |  Bin 0 -> 569 bytes
 .../ragini/voronoidiagram/VertTheta.class     |  Bin 0 -> 1264 bytes
 .../ragini/voronoidiagram/Vertex.class        |  Bin 0 -> 6099 bytes
 .../voronoidiagram/Vonoroi$GLscomp.class      |  Bin 0 -> 1324 bytes
 .../ragini/voronoidiagram/Vonoroi.class       |  Bin 0 -> 7012 bytes
 .../voronoidiagram/VoronoiDiagram$1.class     |  Bin 0 -> 4706 bytes
 .../voronoidiagram/VoronoiDiagram$2.class     |  Bin 0 -> 1640 bytes
 .../VoronoiDiagram$MethodType.class           |  Bin 0 -> 1660 bytes
 .../VoronoiDiagram$buttonlist.class           |  Bin 0 -> 1537 bytes
 .../voronoidiagram/VoronoiDiagram.class       |  Bin 0 -> 16092 bytes
 bin/plugins/ragini/voronoidiagram/dkmax.class |  Bin 0 -> 331 bytes
 pom.xml                                       |   84 ++
 .../plugins/ragini/voronoidiagram/AFL.java    |   89 ++
 .../ragini/voronoidiagram/Alpha_Morph.java    | 1327 +++++++++++++++++
 .../plugins/ragini/voronoidiagram/Arcs.java   |   33 +
 .../ragini/voronoidiagram/ArraySetter.java    |   17 +
 .../plugins/ragini/voronoidiagram/Circ.java   |   33 +
 .../ragini/voronoidiagram/Constants.java      |  377 +++++
 .../plugins/ragini/voronoidiagram/DT.java     |   50 +
 .../ragini/voronoidiagram/Delaunay.java       |  121 ++
 .../voronoidiagram/DelaunayTriangulator.java  |  581 ++++++++
 .../ragini/voronoidiagram/Display.java        |  791 ++++++++++
 .../plugins/ragini/voronoidiagram/Edge.java   |   51 +
 .../plugins/ragini/voronoidiagram/EdgeL.java  |    8 +
 .../ragini/voronoidiagram/EdgeList.java       |  318 ++++
 .../ragini/voronoidiagram/EdgeRNG.java        |   34 +
 .../plugins/ragini/voronoidiagram/EdgeS.java  |   65 +
 .../plugins/ragini/voronoidiagram/Face.java   |  291 ++++
 .../ragini/voronoidiagram/FreeList.java       |    8 +
 .../ragini/voronoidiagram/FreeNode.java       |    7 +
 .../ragini/voronoidiagram/Geometry.java       |   98 ++
 .../plugins/ragini/voronoidiagram/GraphD.java |   29 +
 .../ragini/voronoidiagram/HalfEdge.java       |  103 ++
 .../ragini/voronoidiagram/Image_Extract.java  |   69 +
 .../ragini/voronoidiagram/IntArraySetter.java |   17 +
 .../ragini/voronoidiagram/IntSetter.java      |   21 +
 .../MorphologicalOperators.java               |   15 +
 .../plugins/ragini/voronoidiagram/NVert.java  |   39 +
 .../ragini/voronoidiagram/Neighbor.java       |   32 +
 .../plugins/ragini/voronoidiagram/Point.java  |   23 +
 .../ragini/voronoidiagram/PointType.java      |    5 +
 .../ragini/voronoidiagram/PointVor.java       |    5 +
 .../ragini/voronoidiagram/Provider.java       |    7 +
 .../ragini/voronoidiagram/QuadEdge.java       |  289 ++++
 .../ragini/voronoidiagram/ROI2DEdge.java      |   13 +
 .../ragini/voronoidiagram/ROI2DSite.java      |   22 +
 .../plugins/ragini/voronoidiagram/Setter.java |    9 +
 .../plugins/ragini/voronoidiagram/Site.java   |   87 ++
 .../ragini/voronoidiagram/SiteProvider.java   |   26 +
 .../plugins/ragini/voronoidiagram/Tri.java    |   31 +
 .../ragini/voronoidiagram/UniformGrid.java    |  719 +++++++++
 .../ragini/voronoidiagram/VRegion.java        | 1071 +++++++++++++
 .../plugins/ragini/voronoidiagram/Vert.java   |   19 +
 .../ragini/voronoidiagram/VertTheta.java      |   53 +
 .../plugins/ragini/voronoidiagram/Vertex.java |  218 +++
 .../ragini/voronoidiagram/Vonoroi.java        |  295 ++++
 .../ragini/voronoidiagram/VoronoiDiagram.java |  561 +++++++
 .../plugins/ragini/voronoidiagram/dkmax.java  |    8 +
 136 files changed, 8175 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 bin/plugins/ragini/voronoidiagram/AFL.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Alpha_Morph.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Arcs.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/ArraySetter.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Circ.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Constants.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/DT.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Delaunay.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Display.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Edge.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeL.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeList.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeRNG.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/EdgeS.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Face.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/FreeList.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/FreeNode.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Geometry.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/GraphD.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/HalfEdge.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Image_Extract.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/IntArraySetter.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/IntSetter.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/NVert.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Neighbor.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Point.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/PointType.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/PointVor.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Provider.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/QuadEdge.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/ROI2DEdge.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/ROI2DSite.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Setter.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Site.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/SiteProvider.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Tri.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/UniformGrid.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion$scomp.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VRegion.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Vert.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VertTheta.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Vertex.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/Vonoroi.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class
 create mode 100644 bin/plugins/ragini/voronoidiagram/dkmax.class
 create mode 100644 pom.xml
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/AFL.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Arcs.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Circ.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Constants.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/DT.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Delaunay.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Display.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Edge.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeL.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeList.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/EdgeS.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Face.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/FreeList.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/FreeNode.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Geometry.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/GraphD.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/IntSetter.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/NVert.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Neighbor.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Point.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/PointType.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/PointVor.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Provider.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Setter.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Site.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Tri.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VRegion.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vert.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VertTheta.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vertex.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java
 create mode 100644 src/main/java/plugins/ragini/voronoidiagram/dkmax.java

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3d47f98
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.idea/
+target/
+.settings/
+*.iml
+.project
+.classpath
\ No newline at end of file
diff --git a/bin/plugins/ragini/voronoidiagram/AFL.class b/bin/plugins/ragini/voronoidiagram/AFL.class
new file mode 100644
index 0000000000000000000000000000000000000000..989d4691c65c3279dcb854c503057a592473b752
GIT binary patch
literal 2464
zcmb7G-%}G;6#i~PNLW@8MASk>P$>yQ6sbQ5qJYrSBB-IEU~Ri3w{bDa#?6L-_SOHO
zPi>#t7hZg@P8(+GOs6w_>wnPy#cBK9-A#;XE%36t_nv#c^PTUUdy+r?`sG&uqj16q
z2=o<m<*ZpK#chKxGrnorR>3kerjfOce0*wdA&e%0BOAu15ziTgY<y{bL#7>prkq*g
zt7E}6l^rt|Ptjo634!JbVmXrn!NF*XM`x^z)DT3gjxZu&9I7JLxoObR+5%d1gwQO|
zwqO?IVmZGq?PX&<CsiyfZRAphZK}1u+2lMlO9E#W_RNID!o{+)EEVs2gL^pKEgPBH
zOjahM`#q?U{0SW=@s>a&Z514Y!U_!SKhnGsp-0EtI7Ja{nYT8X_OZeFsHbvW0TN-H
z78v;dq^mh7*nS;naF!)8G8u*WZ^Y=DfMC3R^A!l0g^b*y+q}S`q+_HX-8PDTVS?29
zK-s4h&0&@OStVs$#|2y@;jDCVD8l}-O=#%FB^_gUmnzD~Wg~a6GOQ_pD>|;?8pD^i
z^8&HK14P%6&@qAQ?EI4XB^Bj0pg;l1YyxtWZD^Ke^F?RdwJ@5F867t<MT^{WY$NTc
zy*VB4sYYm#IhmIQXNod}indvBTJQmQF+Z$cBeyS-+a*Wlb=<}xaV;hOF|Wv`6~Ck0
zl8!BnJUi!(!0}f%n%ia}J6$$&8EHpwkLA3tVF}CXwtm#mE8gKml*Q`BijI%5$}}z8
z%(8Lz6e%TbM{cn|OSrG&6FgvnjABt1*pkEl)sl5x`Wnqd1fP-Td4*&sr1b`XD$h3p
zDE=88(&eAwOo)IfhzAPM)Ukm_yv2^?;Rtjxw?@gBM;=xf1%ack?RBAb6qS5ow`4gU
z5~hHbw90l`&Y5bUML1talqdSw@IlUHHi(*j{8Cqd!;;SyuBK@fd>@JJLW{kCzPgLU
zKcnqO?gh}!=V8~s9ZfijHguwcd%EYtoldS;Np$&mU(rj&>x&IlaQu4DcW8_Kgtndv
zx_?9OGxbeF-->v~LqRt{7l{EUNbV%bbrb3oCG2$ro%X=|K!n9P3@}tP&%J{|28+_S
z8R8|nr~_gc@`+5-7NAY5g?yEg=335CfB`p3mv^!jMf0Nwj*K_qonL9hixF>V4?NCr
zpWk!FY$CtO;PoB!$0*Rq;?Qsfqu-)ey)X0g8#M2r{YgOds3a;F|NiektDiq0)blj(
zln9=R{VXXs*h2gXZp9^PI7YQDAdV{-=fs)dQ<W~}MXlvJiAh({08e;|wz2{@xEFM_
z)ew4#kmwF*s_2|0KL1g^RpUfFYSW5|*D$OGzi+tFyhe%C8s!$Q`Tm!ATAkCCf6#A_
z28>&E7<vtZ1JK84;4t3EVZP44%0X##(f7Ye4ys374&4>ZsupeFu;^lV9a80>E`ZWX
zDe!*nDt%3571~^IVh2~BWBvt}Ry*$QA{it0NCl}1);d0|;B$YSR_iaguHaz>xhFz&
w*XsPc>MpOc9d5;vtn4ytnZztob)4pWT>_ZFW0#Y<5&RFPsy0S~wwqAtA56meaR2}S

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..3fa201a1ee4b983ff3665119989790163bbd6443
GIT binary patch
literal 2308
zcmb7G-BTM?6#re4W=U9RN>fUu7SOaNP)I4_7q#+{pkRU>f@!O0U6M<(WwRT1HzBp^
z_~x50eb5K>m6>+N85~HRI#NGpv^qLI_~3uxyEE#!yWvCI0zPE#z2~0uyXXFX=bp)(
zzizDqIE}X@G%)m*v~ph6t(d9MpvEeOY3PQUQ<c1_6l0@Wsi0g+8D^;v9+2Q=2wqky
zN=#GqeC&n!%RFmK@G%^9tjdxd;}x#kv6NA^cv7`&u5**YXBSi}e2R`s?)ki72FVQz
z6Tlft&OXb~ANd~$(F}uk+{kf17+Pfb(HMXSK^XxYVDLnu8L@LvhJ;3j{Yh2l)8*nk
zH)oZ3jWe_+jjW<&6jK%Jy3s4LV(8m@BH;nLj9e6)oHMy)@f^dkNb+8sB?NuLBJqIZ
z@6gH6v4isl^th&G7X@^)6FI{*uFz2dbfQ~A7sHYJ9w_4>JWO2WxqZRmWzvu1ctpYp
zhUlIZlMz9bw6ZicCsaS=BwdYJODa{%RN65Q2hfW?2`7nnk<Wj&W%P?o8Yz?WYR)c*
zJWk0Nz-fkkRCGcW7Wa)*-k~A}>Gl}IVdq{>Nv3U+&KfJL8f6f`5Q5_Kq>QIP68Mx-
ziR;AB(MUY%GJ1CuB{+nqWt_z`l!tA&kPM;7-676pMrDj)oO~^AXB4eW8G0j=qO^`9
zA!7p1GBntOgs>&zEU(%VD%Wy^Fp1|SOi{6I%CosEBZ(Bf140%yqO@K$+tQ|D@s0Sq
z|D28YwfjaKRzQ`W#)}eW8M=0sFFq?HgYyhc6>i$RI_gq<Vwd91IL?&(MZ7HGC3;<3
z8l)7vAY%@%P$gvzdMRFFJMPCNC=y;{2=APc3oT<_NY1L_h@1@Wz*(v;aPl$=&h8c8
z?LXWbOVAiPw~}z5@q}R(6+2PQ@{+9@I_Xd(b$m`8rN#5!3UFnnB587VXB29I6yVVp
zD586t<2{int~qTh*~OGna@vH1^1piJMiseTAfemb6i>Cud8&!3YKv7MZIsO{pHM}W
z2e<X!evv0NsDz%?3?d<);&#CxTHX|W%qw~$b%9Bpn(erzP=m41MUBlvzkO&xQ1mw-
z7!)0l`0~*&fF|0NX*Nn84K(iW>0Lu}&rNsIx<aM~gy`EsKwzK1&sNYv;~}!i6igv#
z!(kd3+Hs@~H$-azN6s4nKH<!2PGFn6Sq~JU51@m-^eA_SxU~z!gBuXcgqN-ktoN*<
z`2Z{Q)^MyK=Bo(T(4)P(hM2pIg)sR3$8>Spr0JHu<%18=B&;oD`y4|TZ{qQKNDWWa
za3<xh!gb?&Uaf`^cM(5X!*hgI-^zzDy%@qd`VAUWpJFEZ87{2hRd<$M!@@G!rfC&|
z>YAO&!V1xH70bAeMbbcMF-Bs7t)qk8re6Cc2H98Cr@p2h^9|<Mw<xjiaFu<JYwQPn
z#O`33{fO)AC){8^W0n1aFW9dRhmX4KY|5~Xq9el`y*nKSiFA$5E7AW14{o3pufwF7
zMH#fiJ9zMKa`Q-F5;`T=Vq9#cTq_&=QwzOM75uh~giE_a{JtZE2UX|nD|mxOFE!z-
Nc#CEMr^sjm`~#c;95es`

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$10.class
new file mode 100644
index 0000000000000000000000000000000000000000..e171e11efc9ef3db5fbcc1e64442716bcb944143
GIT binary patch
literal 1533
zcmb7ETTc@~7(KHsZdn&77p*r$6tyi#LGfC=08*{AR0W&(WQKMqtJ~dXJ4Jtt?>?I-
z8cqBGCO(*`F<zehAL=)|4XqIqY_mJF-^`pn-}%nBZ-2ge1K=d?=+GF(YIdVyIrWss
zX|Pi3uID<gRknD=<JHuRU0dV#@~&4~8=0KY5oU<q=j%LWbElFjtlSqRsbdGjpdaNA
zWlF3IN2X><(sG@gRhPmM9>Wf~X4OX~7)Ep3eq)+J4~~rxz%<d5ml($5|ACMwGKA;c
zvgiauw~0<f41^FhVW5{G6i*b@O1}vm5r&?e<%q>bbwzl~e8m<FeL1(p?IQOq_1p}G
z6)R%0eIg_tWz)lbRc;Dz)%B{P%rF$sZ7JNm5;2`98rY9P9S0cp{d=E@gBYU1RD=v<
zpL45K?hyPyJQ3jg<yw-S<y6uJhH*s4VTRsTDYK3g72%l}!BLWZo!bpjSY<fgB-jqn
zj@dltgB~{#M}i?@IkKn#e1Wr_7{v)4V+@IHm)^uUQVbm)cOIN%U_QvCNwz(uyj1YY
z9-$Ak#9J1RWX2M9Ij!R~L#&lqko9cCvdh9Va2DrvocqJZ!48%B1%_SmY<qs2noVI^
zndYL}@wcX`Qd78W;)<$7M7qH_1GBiQV~%{ZS-wrCCgv5KUKdiubX+4pw0H+L%#cyI
zoPSgjHPuig1?7F9m3Mo$1*V}b<juanIZ`#8RXRP~wzTC-$f;dRl9wLjd9CSqW65oJ
zC6TdIPej|k3ge0}IeXqI*>0Wel^1f&Et^<U{S{U{%V1_5`UuR~yj~Y|9HNE`(bWMB
zQPp=qG^#q2K1&*126ob_NwXPxR*|0M=yP->Uj&oBr~bwPx_1*0w0G##exRGiT@*9v
zFde~e#AsyLgS}0-?+DW$xH-Ckefi`wbd9~lp$!~+j^q=Viz*VLxf-7#`4~I@j7+@7
z)ZOOdOPqOu^ad_%VCE^|cc7o%m?1uj*D*>5+Iw_pAJDIT#BS{qV%ld6X<v}gzG71Q
zhJyCp=bH>THTe=dTu0VNT)+)1kN`1~CWky>FA{bPp<lE)q=V_$ualu^%tU%=xj@Sr
U0o<Z7OkH;y%QQ0xOi4n&-w5G<K>z>%

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$11.class
new file mode 100644
index 0000000000000000000000000000000000000000..7c0bf72d7663399e5766c8e09b108f0455bab972
GIT binary patch
literal 1340
zcmb7E%Tg0T6g}OE1j0bVLs0}l4VnZ@1Qb*r$|ES6fK^bGg$t{bw8`KwlbV@;?)?du
zu3TFMSmnYG@C*C|7mDR`MX9$lDZ;{1OjW1vz1{crxu;Lh+n=xB02snz0Gwf<WRwfK
z=_GAIlb+nLY|FItye<m1SWiwFrJ{I{vFuVYGB_B3pCP;^Hbl}8W+AzlU6VOCfI5cm
zN>psRNx30SH#wDab<0fajw?-RGt{|7-HBXe=uaQ|#4(0|mlmM{;{?y0WJpB+qe5(j
z!9Qc=Wdj(RH8h|;2p_^4f@opzMPn;!rA<Qs^$el3Zpwx7dRE%YB5O#7*0hxq#)`0Y
z<yV7#g^G|I9te>~-GoGimAle@XxZyB&(IT1|B<+qB5_QCJBjW9x)@@IrcJ{s^bmEM
zLU(nuz`#~jnbR81;4IOR*PRkW^!`84&(bzSJQ)k359b3o$I$n82-O4)QN)N^yKK^7
z(Rr_lehmY-z`(O33@x>$r^~KunRG}JBrnoOXrB*nNh7HaGXx#!rc8AQ#F{_4>Q%k0
zVZ^ICtXjOH;i~7Rlsl$j+;eA@JE`G1ZYU`(+IgGqw!H>pSw42>bZO)X$+SW;Ls!3#
zWPg>oq`a<L-a)Z@cSc)u8uJWIORmU0%7{``HNhpTZ0F>hu5=YX@Ujx>AnH72<_ycB
zE6Yf?Xyr9zlt%qZ_YB&+Ne^kp5RM}q^pa?OG>(8Hth5V+!%E%sv^k9+8fjG{Yl?go
z3B~)j(G-8>8LclX8{6r>nF@iwM+4tOGtEaSrcpAb;21h+W;l)$)pGBs80|+szJ;bO
zbUs6)vV7a<^i8}#n-}iw8uINR@|3f#!1G_bUNG+8LBcaH)y&bFd97wnkU6C=`k*i-
zs2%VR2=b3;<-6$MpAeyWfPcm)|AJ}$6&d~w_xN|@_>W2ty&leL4}=)ANKqH<)Xf}j
lQXjXday@*ld-Pcg(e8QjId0<)&3+P08Vh6vDMztEzu#hyL~j59

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$12.class
new file mode 100644
index 0000000000000000000000000000000000000000..8b43be3ca242f5af5ef9c72b83567facfaabe3a2
GIT binary patch
literal 1412
zcmb7ETT|0O6#lk}4aB9Ci>N4GuxJZN1raYrv_OGsxd_ON=nS*8F%5>KlcYHQ6#sxe
z>tLPn!6%>mQI2Pu4B!l-n3-hv+p~MlcfLI*KYxAu4qyz=HN+T(Yj)kV96##`8m#P|
z>$#3=RV-n8VmF(&YgMte=z6tkYIID4%8=X<dm?KK$ILEo?-=DkL!6<nxhmcUS!2&|
zf^5DVSgupD{J?Mwk0BmZEkAXOVW@QCh&cu=JeDE{lSD6=Vi-yPhlk7tgF53@j8-rt
zI9k!7LqU>5M+bwF&TL3a7l(!xhW3)>7)$ltZNpm^+qS{bS#rz5-VmN8akQvPR>b7w
zL`Xc!rd>2uSuwoVuD5Gc7%rzv#|l@FBIYEy3+U5uks)(p**GrYGNoOy{2D|0<v&=?
z(l%SX%gInzIr?!;-j-{cGJRImF@PHyt}_h$ok8S>BaIA2_umSNuBMA&5<?urxXBRP
z9%JY@OnSN=1g?|Qk;SM6s*m;qJwg+wQoYU4W*Wh?D8Dg1x9*T|o$1V>lNr}`JxbsX
z?rNBzi$3ttv~b+ReY)(`!Yq~VamR8TlX8n*D$XygZ_TgfUr0t%9FOprg8P34?>cg8
zVeBx;X^xpN$q9M9z%hq;hE~fjII?_*H&xuGv=up?;3-8U*9S&5y(tTpk?<D}X&!B;
zur7$vT0mkfids~W`kGt!%Ep`}FD-ebYe%FMq-wz_+pcdp=Asc)-3rH=tbbMZ6az0h
z)TA@E@O{I_6>12D-cyJnDf<FQCS~W)ZzD#pj?-l2G|Ll~EA4|rU(h!AHJo&QYHsYN
zZ-N{_AqA9fBxpQCYn%?#5%l0JjSS~-K63XXa#tPPN83Jn!{N$Uva^9y2nHJ%`Hb-o
z=!)=XJZRwIM<fsMIN=cF8<>5MjtD3XEPO;FLMkE2Q-S2!FOySFp<9U~rDzyeT9H?D
zEGeh)N@;_sB%0iNn(0;}?m!hKEE4-A@)3tR&U@wGWtmV6D|kkuN?o;zb(-n4Pi9Wf
EZw=d06#xJL

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$13.class
new file mode 100644
index 0000000000000000000000000000000000000000..3133c95dc94c305fdcf59f9e497f7476afbbd49d
GIT binary patch
literal 1017
zcmb7DVQ<nv7=Dh{b<_fN&gpcFsW1vmx-tEPF(Gp%OPHEy_~Hk1l(XDYTGAF4f0oId
zi68s{{wU*nzz4IKiA}EW^}W02dEV!}{`~d*2Y?oy8OSi~jf06V!^Dj_1?f(sI0_><
zklc^?$n6B<A^&(9#p7Z5;Lw21V4v|RcLN^!?wkIZ@KOUS48>WNpQo;viZFFMUMi!o
zE0a`&B4$`ghcYSeGc>wOGqxFw`LQwqJSTbS3x=li9|*M`gMJhZL>3Hr3t6n1&|q6I
zaf?B7YCW}b+k$~rhC)|{;`L<I7x8=E4+O(nH}ZJU<FQoVi=?hpk&@+wka<*1fzMod
zE8<U4JQ4$jlGFXGamUKUwi5RMMFU$5wWV#du#FOxJ&?(m!TInHl`m;qz(2PY)k6!9
z@K|*#@_ki4J26o~)xa)8<$47R919L=#GagUV%MFMT2DbVEbJ-AjaZDi3{!$8_^s=z
zXE5JIlh_llq>^I)aTlA)H1hK}^nxgnp?@mUVKlICs5o?WQy8q1kgncQz>`EI*r7IS
zG;SaRTXh?-ZFL{$XUNbnag$apnsw+~WeWAiSLEv7=99HAvyJQY&Jz%{O=PtS@)Yk-
z&Z5I~1RJ<Zk>MUT7jWJJu3Eo9?gIDcVW(y1E>XUcyF~peO%dzbHg>hrjAmn|th%59
es(6AX5ovIVHiLZ}P}HfFEj*=}Noz_NJ--1P`t>0I

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$14.class
new file mode 100644
index 0000000000000000000000000000000000000000..4b4e7266214ed26a13e0f74c92fa286809176f9a
GIT binary patch
literal 1144
zcmb7DT~8B16g|_eEUep7QSl1|wbiy@7b@UKjR~okkQ6nM@Zy6Rw&QllcBYx#*6_1T
zP!k{g0sbiCowkX_5U88X-kCdd?>Tesou9wH{{T?OGZz_#)n43>q)GzA$;e=!jaFK=
zC65g62HSD3!$0h4)9V!1H(X>H3P*gvgP5x*cyo9p!qmkS!{X4(Kc#^f2$crgVJfw1
z$s`p@7>22|Ba`A9!%Ayn#0G;q3M*2A=R_}k!B8vzM~2D)L$;~gVg?L(A2XQt;Gp2c
z!zBi%Tsg2imwmXHW|(bBC0_Tthr;ah!&orPwRFhi18$^UkDXb|ikM7Jgv6uU%<`cs
zZ-x1&O;@xTmddSDh1;<rHY~YYSah+#P?=aZAGfi@kZGq3oA1xz_)^5YulVskT~I~+
zn5Wt_Eb1K}cX7`aPDhbdg6(=J;em_$4E3|goR-u_*(#n3wMtUc57VaZ_AF4<#|l=d
zOl_I;7|Q1|reiTbZg{9+%|*aaI)}|Dz{k2J;2P26Qjs={F12u${0!bZ-8Z3lC9MF3
zzaB%)R*ed}qrzAxQbl_r?dZ0TCl(`XTb04zRn+^<m?w!yuuOgC(71pM3bx&VLcum9
zy~Yd;4;N|Ir`a~Gt!K8n@&&o-x6x$o^YGvm`sXPToGNCVE#%2wC7(~h6oPqNBg=3d
zH^%AsI9;iFg4_vij?8lXD~h9O<&Wp#zaTZtIRT2!+7M)Z$g4C40rf*2j|j%W27zX<
Ui7m2Os_J7rrI|;2mKJ@#0dG<xwEzGB

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$15.class
new file mode 100644
index 0000000000000000000000000000000000000000..712d23ccc8087045869f7113cf18f294513853f8
GIT binary patch
literal 830
zcmb7CZEF)j5Pl|i?Iq_mIjh#U)>@64q|#HtPZ4b>EeKZ?lzc6lWKFhQcEjE!{w~26
z@Pj|VA0^Hv0sSBn5B6qucITOAp4lHizkLVr1P=m~2oERObf|QmSiwdmGh>Z5YM{i>
zigD7(CL?inYV2fGfBZCnPl(UOOeC4m!{l}ET=t6q>x7+oRD38BIg`3bI{iW!ovOT$
zT3W(-F;aQ`5n(@Fxni3TEYj)>@Qmpd&j|;O|3GMV3I358$O;J62o;n=c!(o}xJd9C
z&8|DS6d^#FP)n7TucqUkwC_YOlZ4IG^hMScR=NE$=sQ--WOX7e9(Pj{b5-6*``*~G
z91wOJ>0gCAb|SW$-4Hji6JVRrTv@gVw_I;)R_3xG5O=ZtuPTJ_t(n@sJW;OW_>Y+%
zIC9MUSobrND?L1w#mEdI+;bItHxWYgQuBz9GLh#p$8DC=<F$qoVy7w)$4+;CbR}LP
zF7Ro@UWfNCQfuvh#zyPw!rA;dzj&GdRR)6BM#VcpmF*RdMV!nj*uqt|glo9Igga#G
z;L5E}*!Y4Qzi~nr_g*0I4(AwKi+f89&cN=H_8#Y#a0hqU`Ye4N_t^^>*;VE57qOAV
A9smFU

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$16.class
new file mode 100644
index 0000000000000000000000000000000000000000..934c533a69c1307252e8f569bf2ef7a8ddbe877d
GIT binary patch
literal 1834
zcmb7EZF3tn5PsxybB?PfPH792mb8#k+j((oXbZT!BxwQ$rzuS^&{B%*Q|wF5I-`?A
z%D>=8@B^4>of(+n1O3L2Vp!doIMd1C;F+_e)$X&q&#v~bzkmA!KpDzKieauB^jf}(
zN?Oq3mv%!Ps?hg*(bA$*S`4~v@pvuN-S*7&n=aA}xoxp4N`X+V(t2ZCHjRrhhKsRO
z{AfyYS1MClY#KjQH9s;^NzE{3+I}>1jbXNSY>yQNH!+(bfZG(F`H*2D|3454b%ykE
z=*e*~OmK`NlZAsEM;22IPQFmLH!pFx$S_RSd?oMpIt{5eMI(?5r)yzT1a+Z(dmaeW
zHY$qb_<<04l+C1wS-B_mR;WADW0=m@jwEiyl3209y@rb}E-)01O&iDSn5ML~P&*8)
zYB4Tzyn#1K==o8XA^&hh=yymh5Kk)B_6o;a7I4gjtyUnj$fM|@z;NZiLmFUk%wmoz
z8A)?Ljwqe4CW$R@lq~QG8)@0%Ugy-9q?{Qjm#zPIIBwvk^}nt?O*J_)<ZM&!nN?o~
zUd6?`3{%72tSTd0QfF}s@7rq6+1+i94?sPXG2w>MzG@LzzL3Dh9i2!kS$vEo7mHN?
zgYq1>;#kI=Bq1wfI6ElfVT2^ZRgO<==x!2voKBVFGkngF^2qeY$U?|K^ptqANe!r4
zy+D{y$5mP5xQlg5m2YIU<ST}&qrmD?8@Wf>eSr-Z_Zi9~DtLr*j!k^Yz?-3pjP5l}
z?7BFzqXxbUbzA4JIKH-ZPPct8Zm0(w5AB0=wd@LC8C&;99N*zF5!E0Dr-n6O>KPL%
z%0i&&qCwB<phn3RhX-ntEH%-Jvd@+tS~~y0&H_gA3qz>GvnqLVWVR9ZbW^VS_W9=y
z4ZsEKhP<t)W)McyJZsXlLyse{k*Do=B3`PB=G}52qDV%#M6<=A?*vlF*%1Tea&`#O
z1WwVH#Ywv5v|FUJl}r|ApW#$-KiQoAHC8-B{}TiRXA9%bPne+fEXg<-lL^k@Wm*|t
z!K(=zn?^c@dtQ8sQ_eG-x9d|}N|u>&vYzkb>Of)sNQL=6t|b?5|BhSV46OF?ULTb{
zK1$9j!>johu0BmP{`FVu<6a^;2qbs1kNOL;J_eq?b^7>zNWlWJ1!o%>X9t&^00pOm
zB}d_r6JpQl;%Dav{NiZrI}!eLOia<agoXh{z;kS&MI<?B6J;s**rqj2?Y4ss?Xq-d
HNu}REnmyQv

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$17.class
new file mode 100644
index 0000000000000000000000000000000000000000..e12466982f50a5b5afd1ad6eaa64342b5b16a9d7
GIT binary patch
literal 1453
zcmb7ET~8B16g|_eU8n;T{6<jJqAehmDx%h}ibbmhR0xUjL5FrIi_2~^J4Jc&!Otgu
ziiru9L=%62KgxKg+W-$naFgA8=g!QTGw0sBzkYxJ2_TC(8xe+)np>|rUXW3OjFVaO
zmGAjZ#Sv8{Rx^3Gwk)1c`>M8_9GkEaWk{@uHIZ?JSIx{WuE?^s5o73YM#U?gk!#Y^
znS5D0zE^SrEj_6iVtUyLk{1|;OM5;s$6$xsk_2#_=;@mbqpANuNG~u%C;f_S2SX=E
zJKEx~kl=`;o54z@7tG874jXL@T_wkpGxgO)spiF^D;au9ep$E+LOEvK3PuepVzPH4
zBp%(SOEgt^B-N6yR%M0ZWUBO6;R;5?oFR7{{Wkg-(tDPT;{;C9wUzK*GO(h-IK^=q
zXDC>4f*M2W*)G)Y(lS@9=gi(gj<W_Zru}Nwm2spnWFyTm_-{%r431%pP$mPZpEMao
zQ^oLNqZ}DfNyPN5swfis;I<g^^0l6Fq+7|^$TD<q7hTcQvMN;^W4L6}IAXlZ922<0
z(5C%4tsJjPV5xKn*DTdAnv3HauG^qo^la(Abri=9P=OhyCdP26m7SdkA@$oFdE8-$
zRA|}wu4+nG)IG62PgUeq>#oqgA}V(=Wuw55-9^X0?B=*<>bJA(dx2K<vMwkpa+8`O
z#{)BED_IkcNAwse+qbRk&i)L`j3GYf*Hu|gIi}<jJDPsfs6>TZ@XD?qkgn5GFZ&ga
z$L5TvX-NiN^r*)tT@eH_zyS4=MejaDkT7ipBoe0a=&uu@H;(-@%gM{r*hIR9hQFa>
zXft$rzBU&gq;Dqy!Fq#s>oYpZ9-<hh&9nuFafB?xQ5<W*eL=Jdw=}eYj;9;wjlTGX
zUNhLhKxmTL(DpWPF7(d-z}VAPa1$3B7;oTeIKCB{WVV6H(A`35;QlttUc`vyTXb0O
zaMpT{y!8Qd)<;O|Q<L%GkX4H@u!M&w5oZh2bb|<HFiSQ{o%RS%$cxjQxg$M)0FlIV
A-T(jq

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$18.class
new file mode 100644
index 0000000000000000000000000000000000000000..b3db3f378cbf38197507858cc090b5390dc2a6af
GIT binary patch
literal 1521
zcmb7ETT>HD5dJ0`SXc*$c*nb<CjlgacjGM*(3}&*BN#;=bV$aqy3D3#C#b)}2hUNT
z{0CNHtU6l$0DqKaPc{M%mT*$F>7JgM?ytY@o^Rj(`wCzj4_zb}M(RPM=Bp^H1qna9
z9O_Voe$^K>EtazRpuQ*`O^3R^I5>9RMUo-)R4j{ZAXF_ov+z__jEhc&{Vl6_ZnAP&
zDwEAuj326!9~r5nX6Q7Fel&QJVYsyEh&cu~zBWh>E)hI)g<&-PKRjg049SVGD!akZ
z%h8Q44-Qfs9=0+#=}g(~Y~ygz#n4ysmAuthT9A59ECiCFzZ6zPP!`&^>$WjzQ4x~O
z10nJ#n?BKE<+jvMLcJub3<uMtUlKQINz7Srd$HfeK8DPuY2!G6gA5&7sAuC0tZ1Da
z<~V|*L`Kz*>I~_J8(=Tcu|T}c*}KO$j$4nNCal#0=^>3F7a4|QzsJ<}!7+>xhOS7O
zJ29kWx)`T6%8>;%g==PXRZBv<eT|Pf`NB;3GN|TU(9YJizAGvtYf^g{!)aT|5v!f$
zIEV8T$Aq&+`>ICH(wW#@t6O7h&cj7qazW+jU!{IE6vt&ykGX`^+8B1U3$)%tjQtu%
z9@iNXRXTQNLq2678cMvJqefD-Mj%Y6TjUlvCNV|jBC~BcR<M-c<S1IJE9;RTgv!HT
zn08TO7~g>NU&P_Kg&FF;N~j{E8x>RVDL%#ONEZs3vaRRe9Cz$MxLVeQuP7r%`}@|4
zv3{!K=49|@!-lTNDc|Bwt$Qj)EwL1EQdNR5qEbvtvlv!6=536m9b^VxRP-`T1R{!L
zghMoi4t*U+AZ3RUNTuw!(p#0F&%+kl<)r0lZ7qF6!ynNz^eI;QKeP^Rr~h7Z1m_jH
zo%iS^xr1z+F4Gn4#4eHyyRoP3?n^5qV1`!EGrxj?<l~PRu!|KOipAh~EC-tSBi2rQ
z#@Kw@_z9<)IMc+1czrb%KkrP$%NtGn8EdOPo4CD(c>tY+`89f+e{kIS7kTFmg!2}W
p^R9(|XDemX#!qN5i#f``!ClHHfimuqOj76E#{<$l+Orwc?*}K2g8%>k

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$19.class
new file mode 100644
index 0000000000000000000000000000000000000000..a4af60edd89571bb73a98ea1f328206f07b3448f
GIT binary patch
literal 1215
zcmb7DT~8B16g|@|F4P4oB7T9O7Htc%QbfffiWCx(q9zhvd@#dy+zwf0n*G4QAM!zc
zFd`;C_yhb=#yh*17()OznY}Z2=FU0y+&e#ieg6TVhG#Z%43nK8@uiB~kdu+_jt;fb
zvL(46@@;o9=(PEpH63=^rRg~vd4}Q^-{Ee+mG8dT+!9`F;|#+{>gDfZSL_HCyNg~d
zwQ9;J7D|K+XX3VuN_QD1nx{srGuT;Ji7uEYdhr6oRQW${sBAFgmvl??fT7Pp54sDm
zP;^khIR>j-*)Tij9oXn*=x<6To+sOzB3$R2fnXSDYL5pSJd|dA=*$~d#N_luNIc4>
zpQoz46yaMPZi^PfXt{Z$aLY!-x*>NJBQ}N^DyNps!8MFB<XSPq?CTRaHblS^#dp^!
zLFFd_k9Al#sMj6bz)e#)?fXUvwrbqt4sPK#Ll>P+y$$27IH(%0Ejp15v?^c{Q#S4}
z)Q+cp6ubi$)F^|VR#6-#Uc8d*?d>)saU&XC<whgZrRHD;_o%)t8Fd)SC#Fir0=`=>
z;65JOc)&1z0=X=}!JO$8I}{x*6^Y7-#_(}<V<^1RN$80cX*4SS^@^rUxv3MDl^5tp
zDt}GHZQXM4)L`UIk25%{iXP2Uz@tb+7^4QYXmlZmqUlqhSTvnX&p1b;fU~sg&}@;`
z#?xP&_=?`@w`?--IXyT?|3111)_e3=U(iSP0{I*YrVtF_B3Xt@xO{k>P9cGr>OOk+
zaV0Zjwak_>Q$D~%Hk<yle}LJ4AwOWu`iPqKDTN$LS<W0n5&#~dPM{X%i9!yKu|PIY
PjrD|bG8vNSWa;}24(K*1

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener.class
new file mode 100644
index 0000000000000000000000000000000000000000..8dc50f643c2b5eb6a1e7f7e2a55cd4b531ee7e10
GIT binary patch
literal 1409
zcma)6TTc^F5dNlJx}~g8E`s6>6{H323V1J~T#A+yO)Q|n3ps6%?c%bFyIb_H_~x6>
zCW46%#%KS9|HByPY-@@MBs_Fy&(}FK-+VK(KmUCD4qy^XIwFL*ZM$Bz9N+W=8_V2r
zJ=bxqiY2O^*fMAB?V8wFcD?P|@We*h_9u$cmgOKH$gP6q2hx$A4vmo96g$GSg;O;j
zmp0i$M~rYPM8&(nlsnQ1%>CC0v7l!8!&eF8g(I`b67<HkVNPl>jbb1IIbY+<vO+kM
zDjbkAr?O|$YXoiHt;hsAk<`&eIB}S>fo}8=x~np*wNbSw*^-M&rCT{vMXf)xI{FBM
zD(HLDe`m28vn4<9L^+tN2Z8IT%>4!iaDvduvG<WDL{sT}0=*bCa0;inP<B|6?*l^L
zzm%cC#lYjp**MM;Xd;0jT+ng;zaBJP3|s`u6q9f3!uAQro8s(iQ#QTc4#Fh^?TEJ{
zg)tpzLi)%JF))tHs+VrHs??!;92qu~ad2m8Dvn7u*9ct&%aM=jTP5kOG=%IaxMg9l
z3C~jJCa9_I5*Cg=5{C{Z&k8Z4!B)3gQ`ndY*4&pi;dJP7aLYK#F>X`&&9c~Ta*R#$
zssuBHOzP+~dHfQH;+}zN+z*?*rj(yEpd(I56y3U4mW!4WF}ZK=GHRMwzMNCGU7s7j
zEQ6X`G4Mcz(G(Mck#~3#=WXHplGPhHWL0@oI5Yp+5J6HU29inDdj2Ft7*C*sp9Y_P
z@j1$Nb9@iSexP@m?Q!iRUR>V8$(}QNIQIdaV_z^5-Noo9<U;sL3)Vt76T)T-ZVTao
z5S|F(4izNE@Mq2z#S}j?%mVa;Who*_E4&M<7^SC}qGy<)bu7_ytkO#edIgI%aE<Q_
zHQ3@hZt#hD<0fu#Epe1^8+W*xETbLJeq&TeZ-0L;AE$A*S#FLUB8+s6jqhS)>?>x}
z%dFxQ2|4vZV@?&ckwiPaMkiInyaos0Yt6h-%!fA?kYlUyJ}u%Qza`j9`Q?GX1|(g*

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener1.class
new file mode 100644
index 0000000000000000000000000000000000000000..deaa13cc9f92d99ce8824bac6ca0d62210ac88a5
GIT binary patch
literal 1413
zcma)6TTc^F5dKcPbW2&F+!0VwL0Z7B1-uqfs6|U!eE@kdCgil7w2R9w?rwp<;+t<i
zn+PUG@e+-f2QNRt|6z=Cwl&2B5+1s<=i50m-^@4DuYX?d0hqvoiU31;!>p7H%herD
z#?Uuy$F^)^)!-$Euj{ksMwzeVZD*rAlw2vAZgNqWqUdEkv7R$rPguf9s!$lBYkZUI
zCbvrZ-NG8Vs0cCi`zYV?bg?NcPv3u!A>@?}cj!FBSnkL)QVeSK+7Kl*h{vMGJ&`U`
zX0gg}JeE5kXGUgE#g`eBw7n`KXhBp(D?{&L&Kla#&d^p8ezDcEdBGG^R4iW4AuFnX
zOsVK(=#xRWb$834Zp;>3&*4RHuHt#NB{O$x=s_<-3&q|?o*@{EXCvr9pN4)6P@&|o
zB(^<<&VMQW1}}OJMNWlrf`KI?7{qB6r~cER>Z0Kcs7)d9sKQN`p{v%MeKMuu_Zz`*
zRzoAgjfi1XMVujiWI;5HVO)x0mrABc5~FMw2{IF5khE+vj0rMR46QlC5_c-=1>r1J
zJK3JIi`-o1jv>!AP?7R7WR5-)hmR&r3nRt)>U!1ZusRdebyt`S1HQ|_qEVD)5~}zx
z&o^o$L({Y^-V8$`c66RJfDr_7UBfhP_;N4H-p^@J5oU-i+7+iL<_$Sy(S56zkn=?S
z%UDIzc1ilY@XGe8hFda>BAGB~S&No2ZF1KY)V|)sww0!ZQq!*i0YqhHAR3kG)89gX
z@CcgdsnO{dor7f8#&*&C79DxAUCI+Y7~jRQ_T#%a`4}yu&oLa_!N^l&eE3`)R(v?&
z!+ITV@ZlaGPWo_@3=$&v8D$G%lAZ}-0lXqsuZiUz2Ji+Wct_vfV+J3vfRDI`PvH0r
z179#j-h)-PxPXgvBHp-!%T!Ak1zf>ZswPEf6O`W=QPI)e-9g7`T&tCvA%_4Vt)pW*
z7#@9r8Tm3RIR$)9?NI3b8+GnG_3H<%@=rgnMgizrEpHHM|He&Z$SSl_^SDiK5%Q9L
GS>P`rZDgzf

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener2.class
new file mode 100644
index 0000000000000000000000000000000000000000..88635cec7878341965a8a58c639715b5e85587c0
GIT binary patch
literal 1413
zcma)6+fEZv6kVqsI;9Ly%2hx`1!*aE<l?o6LM>WS^r6UuF(IezNjo^q;LH^G72kaG
z*+ek$!T9W7_yb;|(Rhh*pJ`1ofrN+7nX_h}z1H4qpT7I^`VD|-EUO4GWVXy&#jsr6
z;j|d~w(Z!KZIlgOarmabU~X0U`ikvrRY#}ROQt(j5T+=3IZtfn4c8NvaHdr#4ABj~
z&2^Jo75#p3gF;k<7>0b5?|8b{7M7<UJjW37s)jpyks+Bswv04`T0b^Qqz36Ic-#}2
zDlv;P!^wF55YDV*PbbzGl#E>#5p*D`qLX3Zs9+6Uh%t0kgkNmEY+f`46%|i3Ib=o6
zk7*S>41+T1uI}y_)QyFr>p8sSE!I5Gwj^_(hJFk%bWrXC;u(VRL@t7E3~Cs{FcnGx
zt76w<==n$KH@M(AlsO&7DF!wb!3fT(IP;$e^$-o`Ky3<%CpB)m484u!9Iz>!c-RVt
z^BP(aZbcjuDiREdV;iC&iAiaSU8$I2niS>2NYOGK23gBy!jRxBLucNw#J$>PQ8=sh
zPR8<fiJNQOG334hD$-tt?D1#f=+UHUVdU6g)34?n)@Opc?h2D(*bh0}G|JLWMwK3~
z@U4c(&>Y<sZ=N9)KfX>HzzBl4sbLPce7o0V?-w<w2s1<qcFie?B|{Eb^uX0i$$6sw
zWv!BFyJY=}@TzuM!yTDMkxCe}oJE&0V{+FO)V_hEZYxa-QPZyl0YoJ;5RFRr>2D!G
zcm!?q)M)pf_CZ=VlKW_Xi|!R#dzEK+G`Wuxv6K5a{S+M&FEJL}!}xP#efUBXR(v?+
z!+H~L@!@_Sp7P-~nIuH;3t|gmhMp->0em1;A4%mW4C6D#@rAy9#XP=Y8Q<{$Kfv)5
z27Y0dqDSg#aS4}cN4jwZSE-gTinxaBR85-DHYmR_uA;lIubZ}WxX~y#O925wIwz8Q
z7@K&7dHJ#+H3fW4F({x|v@nKN7C;9J`n;M1(b?b)BIBR9jV!GSU8yD9rMC!0$+#Tw
E7Y&4Cq5uE@

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListener3.class
new file mode 100644
index 0000000000000000000000000000000000000000..0652ecc878ae7cb2aeb517f8ead1ebe1038e7a54
GIT binary patch
literal 1413
zcma)6TTc^F5dNlJx}_{o?ua+!+EVBW#cL6TTC}9-1IU9hA*bb}U0il?cZ>cN-+c4g
zL@@Ee`0T&%e;DJOZA~$egop0z`8sFjoB3w;$M3J-04!lsM}$x~vKuwa@l8*#vCL!F
za~;>(w?xeohvu4nR2O?&u6I<QTHLGJ{^GW@Wi==T@~~|Afpnyo)1eWP2jW<mws30Z
z^U49c=!g+6hp2cPnDSUUfqC{GAr{mvf9fV7Q@${bJV9?>o8qJv^VkkVAPaTQEcXdl
zQ|15UEUN7J^e#awxcf4J9wc@25=PH+HqeKDLSIdW#Wu?p6<cyqsdPJss;K>EUdJF|
zOa*;s`fn}n##+S>JW&nS8$sYYD)X>`5sVUgIQALxglH;VN?-tE1}@_Y7s?Jh@?Ag}
z{F^dt@OI#F<a`|02(*~MI3{%5_(y}Li-AdSn_}`!L)boHsMVY^GUd}RJ3*K+(1~~_
zQkc_`CZsPch=B~|l_+klX3HEiD#ejyvlItQOSw3f*enxz%a$XbH4ZD%+i7;PzwB0p
zy(>IRom-%$<Rug@J`?AUCQl2oVq<N++H=^P3GTWtZNin%<^Q5_lx`NP`g%(owMfQR
zcw2&1LN;}Ao;-jFMDftT3Lb@W@2cLf8_*FaB(~j#SCt!<8nWb>)yt}R;{Fw#s_ptL
z{gw>s?!JL1DvYL>5R8(;%UH05?@Mmq=y}`9)559w*MSI<Dl?EwD)srZ5MexlE`Az(
z`pM@g+k?z0y1!#!i|vs10k7syajF06DXzaq&)jEBM^7;O5ycQ*Xv10vXG7R*!yO?!
z62gli+@*rV82-fBqR8<x%Pc_S+?N|j(gd%=BxY$EIhw&LrLak9yr2vO&BLMvEc2c5
zCR^OXZ9Xw?+`(P0C5{U2;XYTBXS562FU;x~7#<$r;|d<M$}O@(gpuC4%n7FFzF<|o
ztSL^BkW)W2=Cp(k%Au2%(L=Ywyaos0YpuLd6v7*iQDm#}N^RgNza`j9`IUe_lb2hc

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerBin.class
new file mode 100644
index 0000000000000000000000000000000000000000..a2b640f5936864c1bb3427eba7e093db823ff619
GIT binary patch
literal 1351
zcma)6OHUI~6#h<In6?a1C<yWr6{H1ZKzyLBC}1&7iY`DFZpgIUw1dM8&fEe^A5k|x
z*6wuW+C(sMVO;y0jPcxQ4VZwTN$;I|=G^mr=X~eP&)?s^1Gt1m4Ix5q%dVC!$2UBa
zH_O;|J=bxqb;~S!=B6=cZ&l2-CD+@k3{9<-Y=3H5*rFu!QfwA1UkXQf^OmC_LP%_w
z+ooZgPT9C$++ZgSjfCF7YVJrwYzs#khi?)ZWySJ`CJAGO6BEf0wA!^H2DO;UvNWYw
zs4%ivC-kQZM_}d@dM3R}h%C74B90a$G_(@Bk8{@1hIT?*Sp@0U5;u#s;G|ON0}PeX
z!OM(>4nmI#x@-757FT1g=u6Km$@!|3uA`7o>F7c?p@m}~B2NgX()l=&=+V)OK2DS!
zR>ZC(bo_-33cM^mj+}{NfY6Y4r10Vx#5oOT|Iwl5rsF)gRE^?s)wF#=XT3m&q{^fp
z#z45BBZg=UDU51J6VfLZMaLM%2{GxG%eLT_AW%Mv38weJv0Og37A!~Ht8NyBw^FNO
zd%-Q4_NwVw>RdNQl(dAqC+~;<H7558v0gm~Y8`Z8ts}VRzOV^>fy>d7ag=73sq|>c
z+^W-T%<{CzS;9o><V?B!;s_(7V+Pqk>{V6uSsfapg!r;s^-5yVQZ1G^G<p-No4A5G
zr)0Z63%?{}#a-92pu$8H6M~+1co-LK)At1zu;=(`<xXL6{x=|mgu(_A38g%L7(#51
zqls6YPapXl<~=*MkLDjpF7e(O`GAS>eVlIZ-^ZEvXc_&2;qV?tKA|fxUkuDm${b<y
zXTBeX!Rr8Hfu3-#Pm!Q!+~ChKLN72)FOi{Fm}H;98Xl(j6QzDxOye@MiSl{{SDDW>
zw#E?pg%J(OBp+sQy-qjBuS0BU9Ua@l@aR|EP!Bg1gHXVr9T8^m8V&RYF?x#@dKaMT
e9DuLYQNy?u+_;T7-XlB?^SHxLarRPvIp7b4_g5YO

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$1_cls1SelectItemListenerTb.class
new file mode 100644
index 0000000000000000000000000000000000000000..49e46e1d837b857cceb2c0fa44e186e2c7090bff
GIT binary patch
literal 1373
zcma)6TTc@~6#k~IY+DzpAYKp@6|n_mMe$m1$VEwtCYJEvi<!0)y14At-6^8Kz)RE@
zFX7EMpN$a{AB@lbCS&||TSHBd@US~`&YW|;bIx~We*XUU9l&YaG7uA(syX#V+YKyV
za<Q!y&-Yx<uGn(Xm&?|KQ>)7RbDm$T4vgI|JHc2{IjXE@wOTINfmW{a=Sv0>0+}Vb
zA}vR{i`Jde5^W5$2^@^H@{zXGigLBp>L}2rt9CGON?^FK?L6`VM#F7@pf(dJYN^#^
zmB^|h(3dT2f;k<c=W`1JiAk@b(%6NJfewNF|1&nR8=V5X7gbbkqi$Jp6pPB{HZa19
zHV*R!_6YQZL07Hdk<D&QlmhL`vc6H*+H*tXy(acyzrZfWZb@Dsp3Tjs(S;rp2hqzy
zX)v!=wZNXgkWqt++Gpf^5{KBsyRu@}gEaba)WDH{h-lcEI0p8rO+BnjClKgvcBqA`
zeC}QfgUA{<A<(}y7gO^lau{MK_2U}5A!d^pp;WY=Q0geyuDV@cE^#m#-RdlOW$7$P
z-wx%bG7(ZJFtdH$x0pYUgdlX!1}PiE)*zm(4U{9$8<}j*45PG@jq-yzS!-t5cA0lV
zUlkb5Za+~@SqcIdO{9=aBaXa@bGRI_8=YJ=VIV1xE_!vptY++RrZO#8Z8RJowsP7n
zJ6=Gh=ajB`6$6t3xvj}*iDF_pL`{Sx2$-`j@9Lx@gFvzI2mX7RIY&&D-wwo(2{Q#U
znXnc<8!_tB*vY?1X^nE6>-g|G+JB&Hj%#<~0|rOdaiFtr9f#MDPJG7kkLZe2Jg3Tt
zQ}u~{ah&A;5HWzKjQ@;y&(Vt)9N3qz@Cs+}8lybzZ{SdOiV_hq#wSeBXM{H6%;PMz
zDa3x^n1QYi3g>XXndUT)W7KpE4S&Ifp|7|UZmxtG#G(v3k>LIfD}Kuu?|4JsN2n$P
c(5;CY$F<1gIwrU#a064A;Vw<9(C#Mi2L~))00000

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..290a6c10e0e677067683678d65b90c01248bd3d5
GIT binary patch
literal 1532
zcmb7E%Tg0T6g?dxLxuq&0*WZ21_>YxM)4IyF$4vJT0)^!F03Z$N*X6KshJ6nAK-s1
z5vyGI0e*!G7cSI=3s;uq?U@LaB?K2Uw_o?%bMHOfAAY@i4<LmH8X^qC6{}j5wr9GW
zj5Jpr*RdU0ki6*fvN>f{O8mvV<5o(El!hone1)%a)8cl~e6+kG^1g;fhEu^RU-M0|
zDs11JcdDMqNzWIya2Xo?lJpW|6fSq@cxeVLbW0Gx1d;P68Ag-;fiSql5Y0FR5d%Z3
zff$-}G$3w3$5Doc<lvIpIc7jZ6GK~0+Tvlgye!;BzHAAG_MDUF))IH6n%5SiiWS4i
z;fW+tl#EeUHF@j`&l3fP-em4yHOs2<r4?~KI3JXgq33|Zf1op#%)eC7ErI6~VF^y5
zbezFi4SfvV`vx>{4(F*>Md3dS>M|QcKL#{hU>H1f#|$JfNWJnbSx{Z?3`nn=-kKz}
z%q;}VX&u8D(QuLKuK4`5ZD3R}X(A?1Wx+4SFa{FdC5FC(c}y=FxQr_#8mGeZ(%)cU
zGb)R#2Cm^cC0CGMg(3O8PT!{Kn8i2J%J-&$G$xdOonlc5g3aof#2pQ{8T#uG3ULff
zDXnR)sBmff43RS7gks3rzHn8?nuCsI*QKv!`hrt+^I}G-i19sFa8wnHbegsEmg7-T
z=Y?N#3I=9Xh^V?E1U+lhoy%C9bmpOt^xZ(;5kwGIG6&*ubrI+dXrxa^Gwm8QnxYdC
zvTZ}dZ_qOIHXO9SqNNBr=-)~}U>^}<Kha9IlhzD!CKq(!I9Y}h=&r$y(_F!^U4TY)
zn0*QyyTZ+yqjEio9{ST$QXk@T9f;FA5P1rtSPTqrqjz&?3oTnnY-4ECeho96j)&$(
zY8$t9xrWJpK?nOvm*Cr;fCD?62XME>IkOXR-?YE)fnYljyJ=6?hxl<IL<6!x$!Bnn
RY?Rb{A9FO)gR0U1_zh$mPwxN#

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$20.class
new file mode 100644
index 0000000000000000000000000000000000000000..a445b9734bcadd123f3b03d5cc59c122bf2c380b
GIT binary patch
literal 1578
zcmb7E+foxj5IvKPEQA3fC|&?T1xW(35CktlG~6^AE(-GEgEb^;varmib~jl3hfjWh
zJX?imS&F4T=`UHO_GI$_RTRNgZF;7+`^-5#-TUj$r+olPJk=3m7%bW4f+an}6=W=9
z%W)m)Sb0knT(N1S?NU*^n0MS#u{SxaBg_z87hA%xg)A70YwKpt*HOpNRq={fzF}^e
z(l^pM-*RNu@_bX8E<>GPw7lM7hJoyfPfRiBL0T^XOb|VPl3^(J9|-YPhVZnLHygmv
z%+Y}Q2sA`FA~?;U#p0{#O&f=fdWM#)CC!EM=9=lQh&9_}Xw5n~VXq3;Qv0eitXL6~
zlM|uhk(w4!smhY+zI5D8GtbZ+%N|*{SyjZ8BG-W~9i0sE6PJzS61qut-ttNevF9~d
z&QO>wwo~e;%N$p5Ro#|TC@A?X6G0#PbzEcUJDx!mha-kKRn{#_;t<OO8U{E96|f!v
zk1Et54nu{8i<Y{d4vcVWOA2ZTf~G8~yf-+;FwPLl`wU|>)tI&@OR>E|7bXj3TlkJ!
zk#>vY_5lVX3OdCxaln_1U=sIr++#@A(0arv9BE8ZljR)g`EEJqXQZz>f1_5v&Kv=j
zs&#2c<-}K&fEkY2!$h7*8bwv{2OJMo+v~1b5|*TTGP>i=<64lRY1tRKjd@Y3Hh*N<
zDZ4py&QkpmJ@A1TQk_gqJ}Yy!<5{vWZ~8?i&#|P=46E^F;2BBZgK1lMp6Q{7W>2H%
z6herq5d@-9HKg=~3egimBfaIcO4D9>S`q{A(UkZQELz`H0?*KYGXX*Shz9K^n#rCe
zAE#tWK|9WoWjK!uRk*(hSKxLMyJ*_Q#lZ9=wLSD6awU?{#ywmQe8X=r9;`+KlSm%g
z-aNd$lib7I9aLjaoH89?RyidIWKPM{pk!X6Dna{<Hth@gwSA0eUy;|o;kEW1Z?zv4
u+3kU}s%&5f89XB4k14+nq2I_GgqEdU2=iDV8>V4c#1mRYC{7iPe*XaK)1CML

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$21.class
new file mode 100644
index 0000000000000000000000000000000000000000..6a74d34b4e94733a28b6ee1f1b5f53c0f7db6dd7
GIT binary patch
literal 1017
zcmb7DO>fgc6r7Ds-557<ODSJ1Es!=&QsOqiDF`VlMXHn*Bv39K&?Z@&tsHM;JE{0t
zNTo;|_yHU^04IJ7;%$-xs!$1*)^GiGcV^za^_O3tJ_D%Xk%bJy_8=SvGD`fIQ;_~h
z#VS&=D|ry}zTXH3J^toU#e-g<wrjy;aF6+j`yr14|9SgZbW#g*3~S>oKS_Nt5>e_m
zI;m7qQzog1M9eUk_GD7nVW>1`W~?(<lVb$}cuexrCk$2ZKM+bS26In!MHUP>2U*P9
zFyK0{vB+R}rIuc~;=sZ@L%t~^aWw3=Mf{4lL&31rR2?3+cr5kzG-+y8q-1s>WFA$M
z=VMo1i1@9F`=ZOR?lu2v+`cxkuEpKLnuS${(#*CwxQ%rxyDO6cgZKI$DxcD}kiV;I
zsyhzu;-2o73Ibg|JFu~dqJ=Gn&5IRGaU6Ik5qomNiQV)LN-Yghaj>l&w_-8iGD-=W
z;8!oIp22>phH*zclUj=V$6c&y)5y>Ls1vG0M!}&-d#dZ;f#xvvO<`~jBD#8eAx{#K
zV1wFh(71#QT-|NJb@hFqpCLoT#${S{Xx5-_oynIgAFxpVIGHTHA8%ZycaDHyd_~sy
zi5$hNlym4X9l;8&QDnG|8&kN>6s}l4#lk6WPQpgbT|7hKT<#3z^EBVEY<$O-@ncN0
jGFDcc(f~!=N0o>S_(Yq*4t6P;)XEwj(#)ncEsUPu7RLEu

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$22.class
new file mode 100644
index 0000000000000000000000000000000000000000..8fcf286fb316d7291f5fefb44851e24540f5f4c7
GIT binary patch
literal 1693
zcmb7E-*XdH6#i~<VcX@l4Fw96)&jPgw6&o{>yPlm&;*U9r3yv`6>pMDvURhY+1-{h
z{t^BSzWd?~gc%=r;L#c1^`CJ(C$}_A$C0`-yXTzm-gEAEzdiT<{`YUs0IVQ%kP=wz
z`r9opi1U#q<K=h4C=5cc>FHLaJNcsDZR`8%VbpEUuB<qa0+}tnqw~HFTKQY`Ez?LG
z92J=EqxxZzH#;Us^2J8tg+bMe6BC$7;AqnJ;@L|A3)MrfSP*b*+AI~gLiCbr0!!Kd
zQ6X0okZWPn3`1a4VHiU$(#R;dI4+RR=4w20Lczh1z*yA_%*J-7ZlXK7?i+#eYS_?z
zO-CNbd!S@i#N_ZqNIcrjnC`2xX`%;V)G<wgnQZl6g)6g&g<Q?WIZQj46387|Hig%C
zZ$}~%n`D>@oL9JjizGzTi@O5Zd#~VKqG`T<RN&lMg*m*z|1WH{SP)Thk;S}&oWR_F
zbK0w;uz*E@p+29Y?-P;iUEW$2OA2}BdaU6a9c_kQki?8HD{4^6Q6^y7i_NANw3yD@
z3hywTbQCl>eplf=yiXN7Ua(8#N(>ehuDk#rF>p=cx&`#^E(1k{8!v$VjFLhbH>r*v
zYWgj?S4p&CyjHs&Mg?a3u|fr(2)LYVHzBZ`t(53FbRjE9Rbd?)#3OEp4_T;+#Wxi`
zW1*bLbTz5Oo4BoT2VV%J>dOMh2Yqy7J4wQTn0<+_9ehP?x8GuRNZ~Gv>r#7^`}+2!
z{6^thTkbMfzpwDU4Ocm=D>Q6a=FliSuwjW*r?!|HtpD-_VEdTXx*cvu4Rh1u7RtPI
zt1K}$qF4?Zei+kVUN=cQY$|kkyOPg5wLvAIOJvR0acp9orvsa&_XtwR@VNyt89v!`
zt)=L7ag0V4c}0pD8Jk~tf|2>B)*1h`Kk+1eN2w6xD2C-6M#-KcOi?nWU;?Mf3Y@`N
zTTWc1!d&jJ`NtUPVUo>b%vkgKitORd15gid9YAQ(r2~)+FI%%}%?H+8wdO->)_VBJ
zdi!f;+#WtXfc0?8BA?S@HS69>@4Md(Ts?4`><)xk#Rv&A4o9BAq&$g5c?#F%1b&pK
z@sm7*pXFKnA}8@wp2KrFg+Jsp{**I)0Vk|TdjgVNXrWCKrs0uzDQw{fvXZ*UM?juS
JV=Os6{{TMZl&t^&

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$23.class
new file mode 100644
index 0000000000000000000000000000000000000000..07e6f0fab069306afc9e0d61aa30ffb4388da980
GIT binary patch
literal 1970
zcmb7FZBrXn6n-u&ELoSAVoM8c1(agKTafxnDwXo0sR>Z2QChWLl1s9%*-dvhLB<)s
z*1uz?21jQ6=m&pP$LA)o1<EL9W^*_9p8K40p7WfOzn=g82Y@;3n`jf5s<_pn<AupU
za&eM1Kkz-@DLAqi$Z~Sgt(4@WtRGZLV{<o67y^B}vL=(R^oq&#?Om0ROmqrdZ|utb
zD5+}7i;|1^$nm|56GqBYfk0<ea>B7$fyvCdJ*EWA=Cv^b++ujqg1}7te;_1s0>+YG
zP%#Mf*odLaLOc3wShyh29#7=-$?G;ubP4ok98axP%iAirFSlJK(4X=1(#^@h(Z5@p
zhK`DnoIenf$836KgOv>x?D#=h6$FOknKOx7(Ilo4ITKeIgEsjg8SXpe{O&62qPlRM
ziLE-WvM_{Uoz95Br50MFIGa&G`v%6F%<zR9eQDW|u3zi|dF{DZRqn`+lP@_c7`bg>
z6yqB1ZGrJ)!8N?5n!z52PbYHvO2WnjCIzfeML8#Q8r&K22hG!I8#73<nne|9_W~E=
ziC3{qydz*Y0(JbPHZ*Zl;BsT<nA1B|$1SKp`+d*G`x@CM^0E_9jec-o;X}-u_~?XI
zn{?Pn;T8j_Nw=!jcV6arOwXw^LbKQ~!!gX_wvA7)C=d%(MFx`Yv_?)xn9}x3HkPqM
z<;qG$c`WwyS><`<ZY#S6#HThs)9H0ZelvcHAux{5ku{Mynco3ht!!fr>(sShjVOmE
zHo4rO6e1!hSx$A~9{CDojp|_CT{U816JMIR|Bp&eUa*nV+A=E|!}VhL8V^it2_(+l
z$TlA08|t;-gcX7K!~f`;WtzG2Af;V>XX6pR*Ym?K7PWFj+QK#pCh`I|{yl;gjtvD?
z+S(7CNTtiNNR$h$QnYl&E+I1auQe$<J;$2uDA2K^n~(Bsn4N4%_IKM3tK4E;L%eJ?
z9@?RDsZUi%vrZ&KQ_uE$Q6p_kv+m7E=J&F)(wa5are6*6N}sac$L8^j79D5GikEl&
zkj2cZsN@%HRP|&t^t7bYw8!zg<jOEqAx1dr+WB;#4Sjmz0eyXXCh`xVjgN)bcxv-)
zk-zm$@5JP<=$<%izV!dnFucg`9s<EAB4+%E9<G<TXY(?zU;vl73S7Zp6HZ*A%TDh7
ze1xH`{%ePLBYT9=t*QREj6>X5n>Ol*PuDRuZwwlLqHu)Sts~5BaqHdR@WCNIeu{-U
z?r0M(b*vsDJ>T&ZcePdj1`V_+k51dw@x{b5bU(va&E?y<!Hznl&Z8YVk8!3CV-J?$
zV!$Zls^MYO@G)*YM%D-r8X=w-)kb~`%^X_!F&h+7Vuluef`eTWHh=(oaEU$2vodKk
tki|Sa_++3$e?1V-@x;WCiBXetsvVEH+s1n#SA&X=P~)3LT+Jpwe*^jF`bq!*

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$3.class
new file mode 100644
index 0000000000000000000000000000000000000000..50b4b8ddf4989d5560f1507b4b53692ccbb40939
GIT binary patch
literal 1542
zcmb7ET~pIQ6g`_3(#Ak56!BZof^8A%Cw_n+0#&pH6|Ccvv$RWzrb#E=qW{3Z;Dhfz
zqlk>o_yZh&lX^Gl&^joiok@4Id+*t^=boEyKR$m2a1l>*XbdAYyHT;6de-AKSlJEN
za~;<zTfE}&YIer1t@CFE*Q>23FX;#~#GmsGp0&AC$u6xv7bU5qli`HF%3sQ?*bt7)
z&XlC(I(e%ug(EzMPPuN?ljrHY{68N!!Jr3eNdlN8c5;egEcG7<=^{gT)-8)D7`jbF
z5it-#+=PLH453uIsCIfy=!h`H@|GhO8`V|et?*S_F!bcz61R)ov($TYF|1fIjQ%^3
z<R!XHjQgTI5Z;>WRYjTMR4V^R-R6~s6X~LXV>qGXIK$Du$C)^ZQ&g9Vkb&y6ZnerC
zf={H<0lr_YW$9T?Wx~K9&geKzd|H*v*)EqRk{BY*H@MvpOKS{6O?vI=?TCJs4|vu@
z3TcLj<;bE+_qAP!Vg#c)&M^$^U-h{a6Jy9ymM2JAHW$SOkl!vcr1#HkGpLEnxWb@G
zvRR@f?233LbC$5n6FROk^tWyuC~~`D*=6AwxDJZA@tebg2qnxULtkpH{r0<hj$=ys
zX<9|>)mv3@95W_vt13mL8{`?7Lr%v$S!}noyG%{oQE+-)NVTS8fxOb<9XK>cCgO7b
zRY}xTuaRn``tjDi+Z!=36ortuJ$pHl?#>!z54LUn@ep!x*RtfL7X@BxHiNP3HoTI^
zS*l&)ZRHqKgvn*|PRVxbWW9or>u%Y^W7T?L)y@p&f<xbjS)14EqK*OT#SlFm&=6NG
z3B=>7Y3YNd(PQ8M?V2>3p?9?s%Zz+PSLRbN>DlxH6ZGFrK<fJz)%wv*V;`-VluRi&
zgnk+s4&z7@?mHbBrnTvjZ5%C}+rhv#hF^a`<{cu7F&f_^6MOR(x|(OU(6xp0UoifZ
zmUnRN6K-zf);4B039f^f_u?)cuV@StduSc#&?1OyQS@pC5}Jv_S~mu?7?N5XQ`$kF
zUM8T>q(@|M5BGh<8_1(T_f1g5B9;jI0b%ze^plPX>0mmJ>EvG;?}iW1_Cwm%@CeH^
RhN+cSP^6hbU`he{{Q_?QdSd_p

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$4.class
new file mode 100644
index 0000000000000000000000000000000000000000..52225bd77375589e5513ea169ceddcb1a6bd2ddf
GIT binary patch
literal 1527
zcmb7EYflqF6g{&oEL|6<fK-u}TBQ%9D)m`>AX2Tipny&MWQKMqi`(61J4JtwU;J!>
zNHp;W_$T})>Yd$&)`$tVX=nD%+%xB%Id{MR{PGRJHN4cJF{B%It7bXPjK^uPGP|zl
zI<8f<c+KPW%%a`c=C4bx*Vv9{b%YtBJA9XCZ0^)DtD8HbB6ajKO!!g$R%XPmaAan&
zA}!Y`T1_b&;W6~eZL1l-Lgy8aePE7357OcUut4nOJ%+i&e;_2w4B;iWDk5MQFcCqY
zfe@l544h;LC6Z;eGHgOeAH!hLa>PojzA3y7zG(}Fp`u&icA0yYdTs~9iWS4<;}eNz
zshC0Ti}GA}Tdr3ZRfefV@krg4m4>-w*}z#$=on`h`}aN*lbE7=sR<dVzU0>H+#&dp
zL^8nlZ);t8mQ%|aIEM>5&NH0s++@L#q9!~Oaa<(Tce&jXt6K~+ZGznZ-I(n>A9Th<
z0!fBG%aLUT;Okq6AdSm9W*L&lzIhXK$WXecs$f3ERg)|`&!EYxR9Hv04e?IqEn!!4
zI<7OsIyD9LK5SWbRd@z&;<k=kfA}}pp^Co4a4J#guIx~)EEbeo?y4PstEuiNi~A-X
zs5|JBZjfi-As*>iA_E;>+#ypF%L-0!3aMf`9+ML~yaWH`$s$}XzpIFb>LikZ^c?Th
z-Q8w^U1$rLa_Dc4B&4%N+2^{Jjy!}s+P^M&<xPn<+EzE#-IiAoc}q1zwCim!rwEg$
zmz|33Hpy5eA-CPCiFMUjVb!b*X2GHEU$S|#DVmt3P7Bem2O6TP;ecpVwIsccH2N7h
zL8~Us7U@|<22<%z=udqPCPN?njU)6wKtRyO5z($;fW}i4Gbx!;Fp3zB45x9X4fg|K
z`T}d|eT<b-d+47%!1O*YeM0I3`d3sWI!O;|vWHafdz?_y-owz9ugJb?uO8sWXXN&A
zZy$>v>4Y8()0uf<q?lczf}l;KN4tPwEsjy`B4XMMrnMx}S_<=88ZWe2pK&T+)n-im
z@B{@Pv4p31MiRsbt%wp~uMl<&p<lE)q=V@=tCOW^%twZ3d6kwmJjV+f!_;wW*r1s~
JU`iDF{04c$bbSB-

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$5.class
new file mode 100644
index 0000000000000000000000000000000000000000..04b24d48c4b08d60dd9a55ad3e2a500a7bd9d35e
GIT binary patch
literal 1570
zcmb7EU31e$6g?|D-dIs$*9i^ZNvKI}2Vy3a5-^Z2+kDhc(k6AwQ)gpu98p>FNb8jT
z6CQZynXkaW3_qYV{Xczbdsp%#W}pn!jJ&Jez2}}i_gw$+_nUVB7I2@#V3_MVy|(QJ
zMPJZh7xz8ib3MCdi?%O1#TBQ!Cw{4Wes?c>g(J?8ejxTm(GhODxUus<HWf#L;Y_$H
zep5xcFI`n!X)4=uYj&WdD}9E9+Ovb~CCXR(?1Uu-9))EI;0Cc%w;1Mg{{tc4V2H1I
zEtv$vn1v*UO~jD4VB!mgST5htJL48Oh8a>d+m-9R&W`lA#f~ExGBvL$oQCji{oP-T
zYgP;wKc7hU3SA~8LQyuQzw7xO*<zT=)jq0QMQd2fH%y$u8IIEoC;$7Lg|nEVy0oQ=
zRA2Kt9pMuEL@poUht=9rzU{V4CT8#z$GP_^S@wE#JquZ!C(-wX(~}#!46}WHgYkoq
zQCJB1wS^q=3?r=&s-Yo5fy+tE;UdQchUrh2zPxQ=9z`P7l5SwD-!}zWP%7;oR!%Ja
zMYg3UiOV1>e#4OeG~R%BEqsfs42D`DRgN^@mJe0cmQJh0agAZ}$l8%ut3BIkN#8^X
zH#u&+Cs}ktOGc(VmMahHawzp8mbKMZ^ob8kp$oi-H49~3z+vS@aVDy`!*QG3cUbj9
zrWWpMI37r)*Eqf-8y)eE%v&XY2~~O6lwIA1Bp=n{^wGTsdo=PI9U(_&KIBL>bayFw
zW?<{1Nyy-%TS_#4t&48IPs}Z^=Qm~5)}53dD95}eObt<Sn~oQdE9+A2c`XY+>8_0H
zPG_+0y7bqv=7=DW0j8-<WAqNeKw5VzkWTA<CPx_bni!#7i)JhItyfZoxtAC%yox57
zr{Tc~`W+)67*~-r>KLQ(7_C_pOd<FZlQc3M$B91NpOi9AYs+&7I9b2&8q)`ueU8Et
znCla`M6+ioj6He`o}zi-1x8<B;Vl;L)ADOve}$z3tRA59l<<ZqLk9OKzveMZ^kI}R
zWZXi^SVG2F#<;PH6Gj;`Mg`}MDwd4fA-_Vzq0f)lpoV&gSi(9s=)&VjU=!aH_78+T
qiP%4sD#pP$PH{3YjrS5Gw7o^!2Db4djdALw27acQNnlz6dj18%YK5Hu

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$6.class
new file mode 100644
index 0000000000000000000000000000000000000000..32740095bae204d92995a492a4972897b38c278a
GIT binary patch
literal 1917
zcmb7EZF3V<6n^f_%Qj)##u%U?wFPTQTH0X2`Vy>tNz02#i%kpyLb*w9lWjM<akB~a
z8$ZKw9R28L99lX$1K<5Me%En4cQ=qSMXWosd+$Aa&U4Ov&dcwA|N0cb4B8qv!(`KJ
z*9@zbb_6X(x??-GWgAsP)Ev=BFPP1`*vQ*XvpzPfA;=Kh5*?8?g;h(hmA7QY)evSF
z_N3y0o0c7Ex#@+9YuHxKXt~mo4nx?j8?CVm<S%z*hZzRVHya~>%M_hE$1t7z9|)-u
zLvYEi$_N++bVSe>MF24!QM|zrNTy2a&zm|l^f3(P3`?%I8)fMfMcI@L@tj=|W=S}P
zI(LOZ6&1tO(E}NqrOONokCYqI*|eR8tTK!wbFbuWS#g+2m7;hX!x~OAoceb?9q(X-
z@=}wo&-#+xXb6ko6Umg1?`5mtI)+utgrEIE>8B@xck!ME;x={Ul;{}8Iff8rU$Mio
zQKT@bVdAB_$l7fpOUHRkQ3^Z4Y|FJxhVkxg4@Pq^K;JB*Ak#W7;C+T;RS&A9AiQ*C
zBe;kUG+bgBeSOr~qK;X7NEjXIxN>K~4|)7Ql2-DRGZB1@jD}Ab#$NBn*Vl1b@xpeL
z-JFikywkVg`OZU+>+pQ!%%8>V)KGZdJA>-)3a)9mN@dw=sJw9NI<Dh$x@*Oz5(_4?
zDdPAF@;X*Mam%n&;%?~p0_zOiy-0cPRZ&syxGRP<s}y{Z;bafnPyb@uFsssuqJ*zB
z+<Yl*zJ^NMEr#Rd`Ec<>QNSJ5JYOq~!~a#u7I06;hAPQE*Y+`^5U6M<Q$M|^;}?<Y
zs46(EC0!-cK&3L$i`#F<73vt_F7H%iQw<iPn(E<n@7@Qej^90`LIlPS$4C|7mG8Qs
zAxB67Ym>0f98i3vOKRZ$f-5T9dC~07foQ>QI~BQNs9uO27?sm1d}{b*t76)ev07fb
zb-SvgrKV0$O)>`knnj~=$rP=YY+;nfP=MYLIAUrV0kN2xS5z;Y-YAaIU!8UfbXJnV
ziOF5`PdxEA@kgFwg1!R;1ip?4cQ8Qfagym|OeQ#ile97n;VmDIT_u+xlKnKfhg129
z$LLRBbQfpU?)*NIdzkK?9^>r5cRyh07tDAnA3fiE`ZJajm{%60Q%hiRJAo{{^Y(Sp
zN$q207fPFUxm}R@iPh(}JrLh~?Kc!|b&>Y*<rCcA!`(gHe?;L9VhasOx}Lh`BJl)X
zLWtkQAis@aeg`Rj7c=}GGJFGbT%g3uxX&xt;t~zM35(b9fE#$oxA7x4J!&rb*Y8q8
zM4*N`c?;ot803*tuOzUIbL7`T945t}c0fM@e_>8T$<iR>B(zD$(Zn~j2B}LOxU`EB
Jm|~xve*lDS;#&X!

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$7.class
new file mode 100644
index 0000000000000000000000000000000000000000..58c9608b78359c4c42220f28c8b4b24795efe6d1
GIT binary patch
literal 1592
zcmb7EZF3V<6n^e)+S@FfHm1cQudM`3Qs^>>qAf3$rqycFqODQ%gL9kQrdv0=naxdM
z#u;!NUO({>bsWF)8N`A*qu==*{tocm-Ao$?WN<T^`*zNA&V9~v_VJV7{{(OxUkY%B
z@ut_VyMD_FB@M2#5rlysxHVVSL)mbqz2=(ysvLyPwd_fO1VegVZb-+Ie%)DISyxpp
z(8sVZ+Lafzqc)VUo$0D}1Ha_9wDMKR(5KhjR`wXhE4_5UDFzX{WeMOEWv9<DOyvFt
zLcYR~m<ehs35Ee1N%ULjLE46eR~UM7`HDFivLVpVFj#VZwa{*?sBl@Xc#0uY3aZkp
z$j~+G&St`7#c=fH6Um;W%M8khl=CWF4Z?=1F&xO1p3B>;;czNnv9JgG1okrQ{%<=Q
z`*DEkQdc@=eI{r$q)+g}xqOTtRclFyu3w+BFouHyum7u(#h^{svysIiB7H-8ZMC?{
zaJZ9Sw|_Te>=r@3VIzk;!;V@6RWT3|!NnxTaa7<4!|01kUtG2^0f%b6?rLpR!-{=p
zfBV5aKlc6AnI!QRNQrMV<X;TeC0!fu;9Ul;PY@~FlrO7Gdd^i|ZAyUZGqSDhn5%Pb
z*Q=?}!fBipAnkQ&KejN8y~nUKSL~)`i|I+6GfJB=7SC3~)OQlIHs(zI`gIWdS@-}S
z3e1!Ewu-)$sf~{eoM<U+_5{kLqV2q6?aq<Bq@KN0RZY`{#3Pkr@AkdBTQrs$nUJ6}
z&*n%a^jFDytn28xL5RQ9l9tu4%d**N6Kg4GhgCJ_nnp@@m1DvrO#LwHSG}M`qAV-D
z7SwE9Fin{-jm}`t`}F0Q@nox|S{S7+?V-099BI?6Kss&OnLcHlUJE<u)TY@qt<BD0
zVf<I53J>E+=3ZntO#cG}1bz`oej5Wc?xa1NoXG{RVuVJ9U3jen_cw)1(B8uMCU%#P
zJi_QE4*!C}UGy&u(0Ct(VH~^jGsM>F`1e1>tHJ}M9^k|un7lw{k8tWCrZ-XC#QXOM
zy_e!;P@-&1Rugmq@Ndw|FJq8jL56>eA^sgk_*IPYYdFNO!{ImZCclX?zZGR&h%@VC
zO*ztUF+!fld3;PX43WhrSfUuq6k`_>Pbp-N02A0FNY*r#5~&oOe@f>Z6?{fxf?Diz
Nd_gmd&<r#5`~xqml7s*N

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$8.class
new file mode 100644
index 0000000000000000000000000000000000000000..b45ff48a146937ea1d15d5a4c411989488bc3863
GIT binary patch
literal 1602
zcmb7EU2hXd6g@L>yz#QJ-P9BcgwGUghr~3BN{IQ$hm%5TJG4pN&^}ZXd*UptcdXrY
zKs?a?h(1sW5Uo&o>H|^;2&Ddi{)7G&s;YOqR_qEY1xw?Zy>sWxz2}}gfBy684*(PR
z&H!f^Z91*G?fN-S&}8Sfl&4%}*KASuL?burG&jZfCFM0YN2Ux!7?L-|mdH86t>>24
zZ^~+5Aj&Y@wu;+9PHssz$jw#*Te(Hs52PzShG?*9`y=P*zT%!Q%rh9_u@M5eNYMqC
z8OGD^fsm;%MCMgZ#=sD_5W|3pJ|r!e_<*4=ovG-Z4=orNU`P~gSC(6ib?L2&bw@G`
z6;)L@72(<XyJL*#s2Ilf9>~ZPC6f?sQm#vHLwOBZV>p&BzLU2F&0#)MF>x5f297Ws
z`hPzQM{$hmQkOx<`n+m1giG+LbSA`aS8FBkY`30|Uis_9o7KYD!5B{A69dF;X3r(D
za2jW*EVAj_j&d1T!9)h52D1NAMnScRE(>QdM&4V(Y02dchSQyVd*kU1F+7&nkU0zI
z@F~N-S{tgOA=(8iL}y}Q0@0a`A4$oes-D7m3sbnjz=J7Dyi4n<yb~<i(y8SQPz?@r
z)f@6L*Rq|O^h{jB6$7NN9({)%I*S>G{pmt)s2w&<Ok+-~X<mE0&9<)LG!`r@>KY9M
zDm-W6DwYgfBZ2J}b~jQBUuZbPmw~n!D3MaSafkX`BngRN;Z9XHb*E7!h@K<eynEX)
zloPp-Xoud8k!W={==6!6t#@8R{0*)IqI#<&nw?fKS5(WZ%0*i@OS0#+7}o)l<`>+m
zqkIxxNd}v$X5ofzyohdQ2J4zjufx0}d|&!FPMz3CqaPee-H<>ssauvx%xRd|N4plS
zX6aj764}w`7|gy17emk5jw$+&6A<`Mi1FVMr+GiwEILd_@DUEs%y1ANhj7fK%OYg^
zVRQ$FO4)4;rf~c@PU_X!mq_nmyz{k<lkxix5Z60#vOUEaz0`xYQkb}v!lY_%#LL>+
z1=_}EuQ7dN*L9LyC)7(^e1X{=6n60WGYThxC6rL4@O2vFlri{y^z)yQ;14j&A0opa
zVUj<_68{Ay{wvD-3D)>;xW}Ki)69mcbkd}xP{uML_v0?E<4fYLOiX@-6}n@U?ifVh
i-<ULTY0W@UKaO9Mk)widXpT^4t>If*nFOKvqu;;L@sPX#

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph$9.class
new file mode 100644
index 0000000000000000000000000000000000000000..19f6b2deb0ee9bd7278fb8f87f8918651bc976f1
GIT binary patch
literal 1530
zcmb7E*>Vy=6g@o<hm4biY~mglR3I@#jVo?R42nWf6RGma>OhA~9A>DYiGGalK5Heo
zmFtt`Klm%^?HMXysZ|jQy61NH>2uFLcfS32`vJgdJkX&rjMwdE)p8nXkJDhK*Imzb
zT&rU7s>f^T8N0s99~E4$z8b%%Bg_z8<Lf+abEldvF0YBQ)Uku%fFI>gWLm5XN2X`W
z(sG@=)sVsw9>Wf~YBl0hbYFhk7iJjr;8>ghE)zR>m0>dR9|*}3LwL@uh+Z)Co9IQv
zKnPJ21_l{IiDXHw44cpqVHn6;j#y~cmW8*(mu<l?ly}SAE^*IN&+TAXv0^y6eIoIT
zl*|D4MY$`y71yhY3d2|;|5x4Sm4=yQ$-q7w(6OIk@4xq%IEXQ-OI64~^*Ogz;|{@(
zB$5HXU#&&ySxz-$;4qHrIKnX4sbtQPqAENSaU3Jn*SXyk#TAAVZGznZ-I(ojKIjP(
z2_zXJmLp3Fz}Gj|i*cOPF~N}BcI8b>B2AU^xbv8S`5326^6VMqq@q{x2z;cY-I91J
zvzD+c869UCVx7c-q-UF!T@jvv^B@yn_|3$@4wd;OhS5Z>JH0K*rg2$W=8D?!r=+S-
z)3|2hx++9Oy1_XEv$&ySj$E`=y)C9D<`taY5K_f-+$1}6cn2oTl25pte_9rG)lMV@
z<-Na?cXzJ^o}n$|%%MLyQZbwrI(@in>93cNQTrApFF!8udfV^DqTBS!B5SFRh<3da
zCKX{a_PkTJ-3Ga<AmplBF|nw+E37(}!OS`I3YfEbqahkNMC}%$Uk@}yRo4O0sOn34
zCu#IEu#;9zn$6I&iVUR2H_?}R6-<U+_!~#)zn_4hy+p6}75y}hQp}{obOgH)qmf}Z
z_O#)?BTQf5?syA(3#kqCO}xgT7LIQs^&IAciiBvc#to#NVdw9Wsdt!u*j{{%bFYwT
z;c5#rF9^Q}!*pYo_$Xe-DII7n^k{D|ti8o9?Hyv;dyHuxk<>onl=c}#?TgPh6>w_v
zC3d)loR4@1w{eFAh><jT6bO5Puww}Qq|G56OvgT*3{7J;GDyosTGj~Q9*tpYy8Bq7
LnL%Jm68iiCkl=lI

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Alpha_Morph.class b/bin/plugins/ragini/voronoidiagram/Alpha_Morph.class
new file mode 100644
index 0000000000000000000000000000000000000000..6edffeaf06b24725ebdc5e662ea153826f521a81
GIT binary patch
literal 14589
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
Z7abbeO!MJ=DfmVTzLkRSq~HMu{y!C-k@Nrn

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Arcs.class b/bin/plugins/ragini/voronoidiagram/Arcs.class
new file mode 100644
index 0000000000000000000000000000000000000000..307641af20c256758b072c14c519e1d60080f8ad
GIT binary patch
literal 938
zcma)(UuzRl5XH~zCRwvxo0{6FskZiy?WTeYzA6Q=1OlNxD0#n0mUv6LE4xYYLy0ID
z1RwkWekk$Wn?NAlVqbRdotg8yb7uei{q-BbOB{P}1pA-H(~(Z{C{qkNx=OP&N%c^x
zQKl}VH`yTfP!eohs4EqXRWgd+^)KSVMBwP5KstibQ0Kf$o5v*n%;RDA|JYZ8%4<G3
zITg5Jt4HzMbQt?^Q46q!Kv3)IBtD;B_T%h>>W^bVy_*iyxTi90?u%q;@=@o4avo1Q
zXT*e^R<8;{BS0Ay4yFYji)VJsQrMoCw*z>%!!m7{^0^)TIK0j5bHdXARrn+*!BN<{
zjnI1KqUe~L^WUe_Y!J7#@m4j<eqr{EJx=fPFS&4x1)dx;tBrh-(PIa9#P40+B1T~>
zpZvu7ciXnXZ^b5E+~e7_vH^7~7i{7_Ge&$$xMR9cwrAK{s(qXFsadmx#=L7mF!TrZ
z1;Il+y2d(~p}ERhC#!Y?>oM&a6Hl;njrDwn-Bnhdtj!x(d-P~nRqQWV%LV<w?l+os
kuv}21a6ujp3dGH?E8=FMxQxRB@z$3W@lK)mne96I2S@vY!vFvP

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/ArraySetter.class b/bin/plugins/ragini/voronoidiagram/ArraySetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..6b677eba32f1f4193cb353bc73564d3f7360f9de
GIT binary patch
literal 966
zcma)4O>fgc6r7FI1RK+aHk5Blp&&bvu*5Z0qzZ{sR1QJDaAA|K%vPygZJbE_E0CZ_
z91v%I6k^u4NYqGe4&IOFnR)Zx+dqGQ{sQnC2Tjxj!t=>2(djfYlADg^naR>jpJ<sF
zc@`ZRBR>ySo-5NtU7&R;=Q5heG>P7gPSrSXq9Jf_wMfYqaOTnoy!<e@8h#urllKG~
zhcuM;$qT|*p#CO1Q63!J^5Mc0*c#|m9na22%Dk7Oi4xczWMesrrP20Y1?%}IJr(F)
zlXa<5=60qkXLEw}yoRw0fjd5$xFN8i)AJeGPGU8JAY4y`0>R*NdwXF_O^@o2d~9P!
zpdEy(C=1y0aToUlykRyoWA#?sj<lA_dS%50+@VfVna>P=e_WNircLE657#TH-@`tg
zIs7*G)og$G_UxGx<a(30h`X@S&JXxsd8lENYoiD{*y7nQ0chbiZ=5rBxLR_b=$b`$
zy5G@Wu)QMcGL=^-?3SoX!K&}licQR(Ray%p-_ZU-(Pbl>t43N!G;+TpheTT=Zm0Vj
q4=(U<;iasE@3oNRNSO0+MSH=$EdBydF6aDDq4Lv$ypLza{`?;z`_a_^

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Circ.class b/bin/plugins/ragini/voronoidiagram/Circ.class
new file mode 100644
index 0000000000000000000000000000000000000000..c2312a1e68a0c6354b93e0fb61c80cacc54d925e
GIT binary patch
literal 1082
zcmah|YfsZ)7(H*<RyK=_U0iU8I8eJzDdGhcL=qMflSPe}MLu?0Q;J<{x(@!7iJCY`
zH1P-cqm1Y6Hi8SrChhaQ?{honIoq$_-+uyF$Bqg`pz^`%JFed|LyN{WkAg7p1GnQ^
zPH1(_T{mp2NC;#Pts~3yEZ;F-v<~fdB#>&`eq@INrA8dIjw92tgRc29aQ$e#zR8r(
z>bU)$fT+v-AoOK^^4RS}2Le-}-4-ZMRKH?#j`8eahb^Ltwwb0+<c+7)t4)E#ZqTta
zn8KWf8RXbouQt;VC}>C`CA~`;R7|IKNM1hj>avCmrd2EmESyVWr5^NK9vd%WNySxx
z;<;%WuAxE@jvc*=N7rS=iiYds>-`MMxGAye<geEWS^_XM;z+5uC9w2&=QCS41yRGQ
z>|hG0>@e<eN5chZ0<#U*x1aaBEjxT;5wt+A5wtC@X@#ylk1i9@flEPF8vhrb0tyNw
zC|R0P4OJ1iqE{!RI0Ke7nb$!-Y}<RT#E_Q1pjF9DKzrs>|6R}O^=v{&4VSCpslfa{
z*>kmADFsVHky6rAq>!=Y@?uLBW6MR*PO)MJ7x|s#=_A*Zpluo_$Qrc)@`gS@(a;Mh
zy&quS_<{1i@fG=RWabQ=W!*W!jRC3*)?~2C;Lt47%**!#w+C4J63<=dcaf;TsR>R^
zBTH`%CFF1qdAvmdcNtxZnKXHKpC@9%12Pb?w?PgH{S8z`$j$gn<{Vf2#3Y4(TZ{@y
waYHRGPL3K1JjA2ZVk*aMS-kdnqPTocv4Y2O)+V-Sa~xJCrzhl6!?v`400cAB%m4rY

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Constants.class b/bin/plugins/ragini/voronoidiagram/Constants.class
new file mode 100644
index 0000000000000000000000000000000000000000..1279d5f25e0fd2766cfd48ed7b195f3bbb58a327
GIT binary patch
literal 7765
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
Ji|*fl{Xf!`_ap!S

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/DT.class b/bin/plugins/ragini/voronoidiagram/DT.class
new file mode 100644
index 0000000000000000000000000000000000000000..277611b217a50d0d03f09547511c7ad1040d8b6e
GIT binary patch
literal 1421
zcma)6+j7%Z6kW%6i<1jrAf*kYAp|>IOhOBt5=e}d1cQ?RaZJohMsbv&)JPs#&OrOx
zpWp}DmriGj9x?+n@XlAzKj<S*OxHOP#81GCM*FON_Fnrcz5Vd=HGnBJ(ufI+v|HV6
z$L$n-i^3`HdcNm+&Zc8+`__}9SxX}!Ft}swTE&*-ZWos~cI;*#kX$RRRaOK<MWC<j
zxt+jrgSyq~+Hul@1`TDPfFOAE5iq7vsxGWomdeZKTm;Oyhox#Y0t>5^TO~4QnqJop
zY=83LICXHmB9QjlR?`WdF^PGBMDVO_Q*;8mEfDwZ4)vx$YR3u4B9L7yt*zHf)m26v
z+_c>eUGG_}($?39c5OefpO)P17HP(-pKnZE8((K-TZ)0~TUOIvce|~Yz}Od@=V?mU
zC}QL!_v5cS?v^SkGu>=)Ai+)6k}uR*SlQdOvux}+iKED=Q$gYwQtEVG;`sjQqQnUd
zrDlHr_1}fRbHAy}Nr`Wi>YW-4pj1Cfe2bwpt})rKDKz!wzkO!|S8-ip8aLS4=_tWu
z-ZTq!#XBSM9fs2=35<T8SM|WaEXs;(O!>}9oW_VcEl7Ni;neK=olgnhl{kqZb-5@p
zieZ6)s^i*A-6tEiU$ZvU%#KvOrq!xjzN4^K8i=E;cH^<bbr}7^T+AA$l6CE;LD}>C
zP5R|41@5<SxZ^8<)%<1AYDdA06|d_z?RiH<PMft$>Jwqw92b*5#*QbEB1#j*kRi_Y
zV1xKj4^|WE>%q#tzXvP(fgUW$Hb|_dc{q|sBFW{@daj0+TnsI_7Fu!_v}8ZE<RWOv
z!D)Favga@~<|wpe*D2$y<qXDH*;%4Lv@P&Rh8RzT$Pea2Obmp$ki(@Amvfj3@xv=z
zZRGG1pFR8>;^r&NHui8UgsE=&`?YpHhub0UD9sDp;iI+He;6f(CBCO1`5r-nUCwX^
z`k2RIW^w}K%<LR4qJV3dKp90;a2X9uVp)5u-w~HA%J~YVpguXVhkFO~2E%|&Pq4Ad
zP3{}vJ{}Ndv4UDeFcT3NC!Zr7{}YMCU$ltpB-O~l0UR(GSk+CcQ=ddEGpnLMB#2?{
Ef7x>f9RL6T

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Delaunay.class b/bin/plugins/ragini/voronoidiagram/Delaunay.class
new file mode 100644
index 0000000000000000000000000000000000000000..d9af3f1ec9d354cd6c824b7c6b49c94568ec7022
GIT binary patch
literal 3093
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class b/bin/plugins/ragini/voronoidiagram/DelaunayTriangulator.class
new file mode 100644
index 0000000000000000000000000000000000000000..4163004f3d2b97e4d7bc5b8790a19e87f83335ed
GIT binary patch
literal 15465
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Display.class b/bin/plugins/ragini/voronoidiagram/Display.class
new file mode 100644
index 0000000000000000000000000000000000000000..9ebec8d416b5ae82e22b387d1cb36ffd8b5d33f5
GIT binary patch
literal 21436
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Edge.class b/bin/plugins/ragini/voronoidiagram/Edge.class
new file mode 100644
index 0000000000000000000000000000000000000000..4a59f403158bc8f8e2f2da5783f27e6a0409d6bd
GIT binary patch
literal 1274
zcma)4&2G~`7@SQUyKxK+A^m}tl7@!ZrmfpvLFGV+R1wibQ7)XEWEEVcapfd^4xR*o
zM1+I{55PkqW}PThmP<J7&bRBG+4*Mu>-YDc0FH2EAR|z{>W_QDVCY3YA@HulC>(@A
zH}HFrf9bvM_M`z#pm^b5`(EE4^t`k7h3t$3gwN67XmfM~GV)5G_P+UV#q(e!p9^Fo
z*%L4%^#|>U0;dA{3pyAb^P}yw1hiLSSDMJ8WZ^EB4U`w!RpNOFtXjy!RMonL0!)GB
zW-yR%$Cqsxz4P0BDNt&L9lzi5qd=`^o7(6@FcjEX(1eObHDNmqb;)B3Iq0g|wqQ)F
zCl;2V3)F4rKO@nGa>PhA`$Tmwx*R85a+d)sV8$k4o|$H!IxThUz6A?+cz(bW=ixZ&
z$VQ-g%qye&>glk}b6GyTj*K$PDx<8%NTV?_vly9Jj1(oBWHNuwMXuhECx|QVH{5e`
zKX8A-dWvgbV%h`FC1{*Y&INk2P^Q#F?pRYYHn7Q+pp{26VUMVUbM9AcePWS;64K+%
z;tg_cPBv1>l_a^GN?uAOSCi!RRB|3WDYjQWCv0z~k_)NiwIsQcO0MDQ?B<tzPxYdP
zTmLx0*5B++MhD)ZqZUi7#%p618wsexrig%Zi&!NoW>d^rAm-j8R!xfSQfzO5*fZ?T
k+B~Lv)sOCOOt6>KI^Z94ctcB{cd5hUKc~7ph+pOK56BRve*gdg

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/EdgeL.class b/bin/plugins/ragini/voronoidiagram/EdgeL.class
new file mode 100644
index 0000000000000000000000000000000000000000..a73b08741d43a8f827f3740ec528b640a9986879
GIT binary patch
literal 387
zcmah_%SyyR5UkEqV|3S5KR`rK4-W2C@gfRB(1Wt~NixLQO)@f@EdG`!!Gj;*M~R(b
z&w8ouD*9FZ{qy++V2Xnn9^vS<?kn9cg_Rt%SQ%?tqf0F-D;sfJRw|1T5XN)4lA@Mv
zB_8v+DmsF%%L@YCyKG7b8u_*$9A|&eEEimNNr<j^VRy~lC#N&+zA>dr;A1C6f-S-*
z)2({wn_Ssvnb(Ri$xI>ZnY4P~Ycc3v^z#3$&IxZ#o=k5Gb*G1ciBr!9Yd8d7!k_Ws
yAw<NPhj<+~u*sag4wo^e%!K1Wc=mzqcUL}Qj94Cqj2TmxhuFo08DWpn!~QRivQ|F;

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/EdgeList.class b/bin/plugins/ragini/voronoidiagram/EdgeList.class
new file mode 100644
index 0000000000000000000000000000000000000000..5cef6dd365bca202f99739808b30de9968ca7e78
GIT binary patch
literal 8733
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/EdgeRNG.class b/bin/plugins/ragini/voronoidiagram/EdgeRNG.class
new file mode 100644
index 0000000000000000000000000000000000000000..a5dca4306febbe78f6b39a7d921615af0a6282ba
GIT binary patch
literal 1617
zcmb7E*-{fh6g@owhQv`+z@WIZBomNP+yzl2qG(tY3zxS}GBu2b8J$dAzkzR2s{}2r
z@&kPLcPvl$q<o-K8dKHNr~BT%_uMT%etrE8U=sIC7y={DYYop2>P{rN`OeEQ3WLzE
z`qGQ!hI6y(x%ZcDndlH0d@5f`N4|<3&kZ-6k{`H}#o=PuDA!y8BRC_FFa6!zlIwfx
z<uIC3`jY}_H>f@j{UELj^p~{#M(o#|*(j24N`5`2VtUp00vR_VI=R+LXS!XdGql!K
za|1747Z61rrWtZPBe2>w@pgULYXTi}Vb#rGKl)7c3XHaw8w>q7Akgi(@mv^2Re@aI
z{)gKYmBXnF25`v4L4l#ayVB|w2632qcqEX@+w<!2Q47cP-Qx^WIALKAP70X$B7gQ;
z8Un)>I?<)js09;UCh`KkEee-G4h3akjCsf}B(G0d=tf$J91EwxhDpgP1MJTyb*;(3
zbC%0b-AX)VKgrO`SqtZIp4q6f8Dvml4>ai%6^V-$EbJEOQO&s2*eJWv1F73_e<`fU
z+M0}fb#7jE#OppgE%%RXHk)2GsYi~6$4<?%1}(y*&TMPRe{^LAvzRk+Ltu|~q0_J^
z<8=!~++_ahFQQnbv1qet4f$Gq-tbdas7%BHQj%E>8&Sob_tiXF%_t_6Ngfx1z>Vf=
zvR-%VCYA;Iw67iG%$Z0A8Yh_E6#pnXV5pK48LHrVXAvpQXuON}tbx{K0O+A)FHb)y
zSMT2y#<sC<8`;fdKe9RAJSY2+&CfVq7~8^7VSEcCg>T3`?)(gU3*&`PdJS!3;$ahy
zXxxU$$t_&?s0m);_ayrcBsoliHYrY!;uY+}Jcsi>dhr&0xJ-@X31!Nrcp`aBGi0IB
zRU(798#COK;IHXW9o{OPPDSzqfdS<-d6?CPtwf<|*icQ)8<i(tjRg1XKxfWV>)C*5
zdulzae8KhiJIoDgbLUtRKKa8l%Sd)>7g^jQQi;#vHc_ItKx9&G;ZD=7qhm=pU)bs7
VSWC`#HI)(;xvSYsVF@cp{{}#3YDWM7

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/EdgeS.class b/bin/plugins/ragini/voronoidiagram/EdgeS.class
new file mode 100644
index 0000000000000000000000000000000000000000..4f67acd43dc15be7d5a0b2903a8aee3fd750190b
GIT binary patch
literal 1576
zcma))U2hUW6o%hfzPDqkRH=ee3(^8wR#59_xG|D6A$n26{Q?`@26oK?4g4o#Vq#<B
zg+IU_Wjr$rB^ih4%{epg%=^rlGxO{BkDmaVc#(j?Q2I2Q4P9?y1vVwuy6^+v^WA}K
z4+DE_y&Vjlvjn0HJLmR=ZH;ViXua>9JN+qxF>f%iHVqauFy>7$q7e0Zfmk^WheDo@
z#Tte9YdU4xVu)0#U0Q$R4;&K_>~f^B!;tQ{p7U-t?m58+yEk$eG9ABfkGgi?iuqEE
zPCvR6hH~dW%74WWn>bTZY_!s@c2i);bHos*8t38Sq9N3Mj)YVfOG{IzC61&}1!N(W
zLynYC5~PH8jaE)WaE-&n7J<F1WofB%aG}de#sb^mxORn=$`g)lp-^kuGExK0Gk+HJ
zowh4lVan&Ii<iIwAtLmUNf_cPG%`f-GE=!SQ;{-LMKV(bGSj&-(`l5`M55kPyiPNV
zGNT-;eMjc2+;)RvT#6Cgq%jXSAd5YkG2Fs!io)EYA`G#+R=PxP?KY)qQlVRtkPUY&
z34(q{p1^Qd&nl>_ZDOT2u<k8c2YOafWo3x9yMeW;>%N{<R#{nM?QLMK>N-N@uYTn(
zQB_$vV&ylm9#AL6Lp{{9j#XBHSo{BAS^7IZQdvb}l{T<e{c7r2k5$$ov5q#dR{e_M
z>9Swz&-o3xFZ9t2tUqT>V${!>(3%UXxvn)QwdSH~Zfeabt+}k4PqbzeCz?A~KPz{B
TsWo%0`B*i#wB~2>i06L*Y8sKf

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Face.class b/bin/plugins/ragini/voronoidiagram/Face.class
new file mode 100644
index 0000000000000000000000000000000000000000..b11f338f5949d6f467470a8410b66f54da49414e
GIT binary patch
literal 6601
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%0DEc>D

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/FreeList.class b/bin/plugins/ragini/voronoidiagram/FreeList.class
new file mode 100644
index 0000000000000000000000000000000000000000..57e4486d12b9fa742118955e4452c84de26ff06b
GIT binary patch
literal 390
zcma)2y-ve07(A!>DIulh=LJ|$VZahAhy|$<Qd9;|cPFt@S80r#qyulogv7uD@KA_L
z1T)Ceecyey&v*X(dj9}$g_8)Lz}a)vm8Nc_Q!GaAth2Q>g;AwbTe)yrr>1Em_yV(y
z+9_G7x|9#uM(3@7zt*Y{n5TcsEN!8$1;#aNV_vj?xEBa-_-cDAFq)sQsCUQR7$Zy)
z>>(DIrl!`*ZkuWMq_T>)j#8VeYNed%`OnaA*QWWOk3J54#E-Ufxn7uFbMl+>vX6*U
y&<{V!;|dTCU4$_!P4~Wt`($$9KydMf<aIc9Knyts1*XJg=mX4fNJjTW569m&$y|E?

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/FreeNode.class b/bin/plugins/ragini/voronoidiagram/FreeNode.class
new file mode 100644
index 0000000000000000000000000000000000000000..2e9b019fa7e762589f2dacd88cd96f8e618e2e8b
GIT binary patch
literal 328
zcma)1!A`<J5Pj2@7Hbjo54;%Q;3i%*TueAMcz|%<mQ7t!cFocff6J4J2R^`$BF<L4
zdzts<<;}dA@6*>2zyq!m1cbY{x~;U?3nv-0I9O+m)f+7<CwF4*lv>!0N)Qo7TX~S8
zmZlOf#a5LKp>NcC<4uHd{=Zd^g!qZ0ni(M+Pu7I!nG;fkxXh5CPZ;Lfs71Rglv~N7
z=H)lJEoHryPW%2WM$N0<6Vjz^U8&~U8wY<E-}_^63l8CT2?2VDJ4QZ)l?(0!BQf@-
apGZHL1jx9?ofu-kJo`1^>O4N|T%#W~w@O<8

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Geometry.class b/bin/plugins/ragini/voronoidiagram/Geometry.class
new file mode 100644
index 0000000000000000000000000000000000000000..bf54e943d1a038d7c077b03570586a7b074926ab
GIT binary patch
literal 3041
zcmb7GOH))w7(G32hD$`mL;@m;;yh3UHADu8%0os$2QetVFEdxTFwEf01wqNHDwRzt
zscf>bl7(4>jaDU9I;LVJ*`!$HKV+S%{D3Sh6LPxmWuQzIV`hf#+udJ(-#Opw^4mW@
z{tTcEANk=DXqrvWO_-T{OHSuxw#;X9*-X|<nfgRdpJ_Q|WM>R3x9EpQpmIu|*IUwh
zW}@ZX_>_^f1pJBNWOgpYClMF$CWdFsjDRmOJgMg=1;SSbH`hO)r*HM8CXARsSu&f+
zTYARI^InN-J!_)8=j$YHt6QKs^vbuwqXM3uY|042jY<s~whFjI;n6Y(Y|{`#xxkh|
zGh>{cn;AE97xeM8Ay74#P3q}UJ!i_bv+1!WO+qeZe9e<Y9K5lCY9KL8_ZvC7Fi}cJ
z(OV^mj+mAa>kW?vQHOdzc9snDnqm#R(7;gS4QrH;j0J)Hr9dfT($*gA^`lW>&*mYQ
z@*4J`Ngyy`SUuTnE+x&Big_YyW~^8cAw>KL3p8$SMu}^PqM5llrlQ*~{c%u33l7mX
zIW98aa?FHKza9BD4FQw|nFB{O9K~CdN(_(BC8rHWCtAu8Yfg-X<I>RE8jhhu6+^~Y
zpn^zAibW0bey4^m3ErzvO5X2iIIieilIJHi^q`me=bcD3mDI07CGYlYIE4W_(1~Fi
z-v8jI%H*^LFMI;7Nmj-y`-Z`o7ufqM2~1HYh9E^xTF=vg9vf)Ih@~f|hxA#e02!l{
zkv1$A^C&L)ago`yd2STjhlVlb;`v4PEqVQlhO2VNKTnmGz9{#uYq)`%EL*#)<;}Y!
z%w`dn&0<`GUwXl}mL}|o#>}j>s6;NyuvN-oQiCbe&cn20_(GW0kY3whdiwNC{*J+9
z+*iUib{Pn0w6kF4^rWR)t|vK{<8AKBZfNRhqVyfFWT)pxvY68_k2_?Mzn!x(c@`m?
z7FqPl!$l2uaZjLv=r*$SgyMD=c~AC83J8-LMzV9cq|tB6mRPaY*AB{;19sCTZd&xf
zC9{K1F6kdNv$WLA=E^xhNevYoU*oEuaxTun$Wv^IM4zDQdnH@V@inEfj5>qVP>$`~
zd)=1i{03K&;SQb<A8PQXty44*fuCnf(dGhb<*>Ve{hx)CUled4@))g=XaR@YI=sv9
z*Z4ZTHQoZ+$2xo~ILw1sjgP~ZU$6eLzPOJXTT8b*JfReJQ{>mEx?4bBjhE7Wk+H{!
zdu~2KT(WROvWO5Pu#K3i`Q45NVs9k+{hY^%dYZUzqZaqDQ!yN{u@@OG;S2`JjC?SJ
zvx@%`&LKhl4NTf$o_eX#gY$gyvB?cNPb0ij4fo$@^rMcy=WxG32Op^I0tRev;TP(W
zkvl^ICsxoeClXvir@e7>-D5+`2+$AhLvo0IyZTo%McRwJQ{){LbotBVcVjC7?!aD-
z?Em~mIUi;*#1KXwU341FihP3&rAYpaL%xyjl0;pQq%=vSi9|flQBNA|*bbRTl#pcN
z1QsLkssi4<WzUy0_I&M=sZYD=zJk}?Rp;zHK!x+<NvTc!8w4VCPoUR5q%u2>^(ro{
zd{MS3@P}{&9W;Cr?d++?Ho%V;;l~~LyGSv~*x2v`68=6>tr2tzh6BBuvy5^%p~UaQ
z>v`y2H||qMUCM~OMlr{T^oJWlwj@6tYgg4HZpo@T{|uqAr?@q^Ooq%&UFN1v1Fihi
z+Zeo+)jy*f*Tw8EVB)2NSOHVf@02;2*S0@Su%3GerkBuq7~p=syG}7T2NYDhTF*OB
z0}S&FGQ=oBm%;S{<$i=D^ekOzLpL4h;f<&Ui;MpzoJ8bOl~%<X04t<|)v=QpWXi1f
zjIe{Eg84tIDoU{KwmN2iU=2x+U5vPy#d45ts;Wj#P6b%gpBJzYu@~2V0+XZF-MNf<
ziLCY+>c(78u{5GqZLER5kA<jpq#vyQzFrYcsu^CQxiL0|%LICb)o>Mua1GtKPRCtk
hU%t5k_(cc!0VdJ=Od{KT{3reeUn8>TeV{z>;lHq6ss#W5

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/GraphD.class b/bin/plugins/ragini/voronoidiagram/GraphD.class
new file mode 100644
index 0000000000000000000000000000000000000000..40609a768209a875bf9c90847d3f80c59b1d7a85
GIT binary patch
literal 964
zcmaiy%}(1u6ot<?KW-dDAT6OKwETu9RKgNl5K=|eZX#MKRrcdxg+alN94AlJMJs_S
zb<qdtLm|$LBSnNzZ|2U7&iUrtYyZ3d^B2G|8a6C}{o!ETSK-KuC5!SVQ5=Plx>T|s
z%Ny@YEQeR0Y~%%2uH{5}0~z+cul{w=O9ZSTmqz>lh;NY!lM{iwjC&(Km?8g271hPi
zPxYe1!zrUBX9Brqt4q>(bQw6vq2i(pSD?~XVQ?|N@q_rg^ap`JwH@{3petjg&(q6%
za;2EyAR|HAGc(wuAklFI-ZwKmCUvV@g21{98!rTe6ey8!;irszvy%!oU6kNZV8E>m
zaymW@-gZ$yk@=fh9+SpQi^Fp|(Kzk}pOv0VIc@Gpe@pBTn&ZEagQdybSvtC@OvqZK
zf)nPt#FNJ=SPO^0vHZ)(R;D5iS>;|!DL@r3Sp{BUjjJ}F5pJ;-4?o<YHgh}X)}g0t
z2(?r-CFlsR8A(6<1{+UU^*hw(S<7Tqo?*RZTbfnCyD4kd)GfAtGN6T7Q`Ln{*=BN&
cCvuD0yt%f}T*B^xm+L>~Ufx(}-ZQHG2Lb@9?*IS*

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/HalfEdge.class b/bin/plugins/ragini/voronoidiagram/HalfEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..dcad064887896b4e1d163713defd9cdb13247cd9
GIT binary patch
literal 2613
zcma)+|5Fo37{;Fq`9i`eD1uffMMX`*muS(7N|9DVp`I87BcjfDkR=>*B+Ml+_J8Vh
zbjD0)`a}PK{!xz4?j6`}HxqtHc5nCI&%W>TK70Rs{_Af5-{W-(F$*^i{KKkOYZL;P
zgI74J2lZOrt9WiTaQ6#KuD?^PR7DDL3w?X;kz4THTD9<OYfo%9EhLMMFLpS|I;R6Y
zw2&$~&%Nqy7%d35FxDYjrohPVq7#Un?HWU^Wef45bFj}GjzrKD?>kf0yr!fierq({
zfQUuLmR489dzp&Ys2%z~S2r!By+%d&qA4oes0SXE;bfNjH0OA1b~#t(@VH(P8Fb;Y
zjX?}q=*s5GX;}Ey#(DJ1*>^TBgtIF)Z1l*rYc>YZW1-jaYGUPZe@g`G?v_sx&O7yO
z*Dt$)C!eFmcyrflFe{I(%H}%AqzaUW<ZYb6S?0_tl)#;1mBcc3%0@TRtWWq-T~<Y@
zQw`B{RHMgF-RV$`J2nzXvI1(`O^Ry0JZHv6N^P(e5-$_5aI+I$<tg>I_;!MErKg-9
zgbdkB$^Oa4ImKq*(tM{JIiw?9DX8caJsw&+-%<DDTO!Rxw@7QtQX`+mvx}h=j*VXQ
zF<WV?(rQf^kNVPwGRfl=YnR(zV@27K+o2&Bjtwcb3ismKO_l1Fg$x%@-pH)g4})#7
z=t)<dIZkd$-d<dxI$gZ~J&4J^a2AtoP$S!}#te7mIvuM<T1kyeUX7GijdZyh>2WpE
z*Bl3U!XPg4{}P{Ea$+36$^Xe;yoKR>R|_NgSPP^1p%$)wRH0-1zpSu*h_iQTUZJzZ
z_VWT=BJw)-2SX5UsP~A(O&&-&>Gf=MTtPhpiTo$zKAfPFTn0fBW2<>0!dMu`gduoR
z4<0rK7jVlEJo>wK@~AQRHowB5N^_A)$^3W=(_baYsFKInsq2amN{~E}Ac?yaLrU<2
znRQQRWy#95Vcm~d5Ae{G*QCyxAZxM>YnCmPdHs0egs(NS?V~#D7FoC3u;!vRKQh-i
zue0uub+--c=cvZVSTNO?(^)fQ-EYGx(xS4)Mf?)6{%yZ$-9fVoquX!E7<^9;o;L<B
z<JbRHajk_XdKC+-qS&U2r@Ym&iWOrb^Lipn#zcDY%pk#&KeT(`7=ufv>}!ctthT9Q
zHR|hgtQis+)-U9`F_Cp+@Q5C~VGMqOa&+>4oIb4g;ti{K+op<_{NTx6Y?xUiI_n)-
VZU@$Y@e_4bFREfJ>XmBX<`+qGYbO8z

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Image_Extract.class b/bin/plugins/ragini/voronoidiagram/Image_Extract.class
new file mode 100644
index 0000000000000000000000000000000000000000..9d60b372988bc1df161a4628ced24266ca37b0d5
GIT binary patch
literal 2772
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
bk@`su4`~<|0t6lwYa9L`%LM@_Qh)k4N2{cq

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/IntArraySetter.class b/bin/plugins/ragini/voronoidiagram/IntArraySetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..b7b0a5369a2c0635c24f818bb61eb15280578d24
GIT binary patch
literal 907
zcmah{U279T6g`to6SJ;uY+_SCYqi2|DqZk3B~S!G2=*b8mp)C>VV#ohmdS3wf2E)m
zd=Q`gQR121#k3~WhnYKbIp^GS@64~?-+usjg}pi|0xvJ7S)}7xXe5IU=ZQ(;M4xII
z8F?PQjngAz<j0{(Q)TL?3N+8;T!vE_N8$1KOij`{Y65#V>lAzeXD*Gvy_1u{LWMO{
zq)bnsc1R0ppD;fd2~=Mvr^<zcJ02Qv1vUmcR`0U&u`=)Fc&Y?82gyWEN786}FO${u
zgPsW-3~u&xy*HM3W-1lf_E)+KMh(!phdOQvtm*h7BiM;7rQ-)HImG){8ZE}v3r3W1
zDfY<2CRze*KUhXtz>bFwwguc_l9`EmqixHr>%I@{AO#vj9mO)u3=zl6YX2EU@jQns
zo9OqjOD_)B8dt>*fFH=7`6%3P^A<7+o9%vs_nC(Z*16a6q=OBfy#jzH?()W`LyNm5
z_ld4pba($N+6%UuXB#Z#<_cQ{s#LJ*TeM;eb4sPw!pIl2KT-6mk@aOG%_ADQUy=i&
wt&v7||0f<?;^D$e(Fwm`E(y{)cwEw6Fc!^U;>o`?|5B*@G$-%kSstJN0qy#@;{X5v

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/IntSetter.class b/bin/plugins/ragini/voronoidiagram/IntSetter.class
new file mode 100644
index 0000000000000000000000000000000000000000..94b5db001690fac428a99fc3463a6b1067df8fe8
GIT binary patch
literal 957
zcmaiyTW`}q5QWbsjzf%_D-D-Iq0my>m9WHXsz?Y4DN+g#L6LZL(v{gNwJXQz?*a*0
z2_(cbKMHZyHfc($@~}HQ<2m2X%=*{wZ$ALMgjYpLVE1IU2vs!qlYmC~r*RTTu{u;i
zm;}fEAWBCvO=VJrA<#SuP6K}yM4|s~awMl|6{f)U&4^qtAR>Xz@Pa_J3}w<2F!y<L
z+7~dKfjg#o9Un>yWvtn#p)OE%+;J66fz}ndg$CL>&8k7*j*TjA2{eW(l5ZEs6PdgZ
zCNn9}9>&vPHVzV{{UT_jAJtsI9p2o*atN$dD6RoZn#)w6>s-^2ZlR*0lLZsXp-x+O
z+-vf5d?lPuwC9d3HuBWQ1|G7ZOUfceC+yhR#A5+#6fcsge4})e^<||m^q>T4BNawL
zx=8r(;Obrf={tY9{T1EcH|zJX#UjdF6)xzhbJu6S1ozwY4q%`}+w#s~d*9LcuyKyo
zS9CrzSi(B@IuTlIP~N1pORt-Ya2NOJQI7j~K%~$UDbRi9Xte3=UE*0;bd817S6Jqf
zW#SQU(ku?IVELKP;=M2Ed?GY2&14v8XBay>S8`1A6$^P%h~1))nz#28jWcXr^p*qo
hk7P(twuxtjY=>6kE8ZEl|Gjf5A^UkI-i4D{_YZZIyjTDL

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class b/bin/plugins/ragini/voronoidiagram/MorphologicalOperators.class
new file mode 100644
index 0000000000000000000000000000000000000000..78c6ed8dadd0e4f0c1038707ebdd81af54290031
GIT binary patch
literal 614
zcmbVJO-}+b5PjuiS639pZ}EUP@L&@|yl6~}#>52FMB~+zr7qQFOWIwCKg*NGgFnC@
zWt;^C51c%-(>I+ro%j0r_5J~1A7vLAhI%hd0u@<q1O>(W+UQ8Dwi1C6UEb8D*U_O4
zlrO@oo-`uX#=6Kcl$HO?M{F)yHa5bK@A>txoePJd_NPEau{00Dm%kMkT@lEWNQBQ;
zSqA5b9*>V1venuhL+(_!rH3r$3UD#QP;973UMAg^G`FG^N`_KH(@1y1s1*Msb8#o_
zcF_2bszV0X*WF$c%Ndjys?)_+l&uW3c~VhOd7!B(J04cB=3<p$JCz(Hij#k28gEK#
zN$1%R6|jyC2G4f%V3c84tu`J-U+_>w0l$e2H9brX@NRTse0i=?spaW|?4?ZXfJ~#6
zr%%mLB)e#zCB!K*iuv7FcrU~20`1N)>0+MFg;4<(P$a~#I40K#rDUhH^oHdL+oMNP
RUY_`q4$ip4Cf#PR^$p9`neG4p

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/NVert.class b/bin/plugins/ragini/voronoidiagram/NVert.class
new file mode 100644
index 0000000000000000000000000000000000000000..026e888a8cbeb852596fd6a7b8f5f0bc70c734d6
GIT binary patch
literal 1021
zcma)4%St0b6g@YI>7;EnYJ6nkE53*>rqQk9Mvw`FI50!@m86L!ZMSqf`6@SpBDnAa
z=A*=0)s13PGH&WVIQQIh5B2Z$`31l+_ATTHJGcILD1(t32@cYogi#oTav;Sp5;tzA
z>qW7J0-<s(Cc^baFmx|_*Iqv+6oOuKM4(oZ9utaTa5eUQt|zy0!1XC}#%F|l^PtP!
z^KjtV$Ya)ljcLMMTLxZdeADxyzoO@RgoSq47k*bnQq^g*5MRj=VXyrSu_t<2s|>=D
zgA$5_^2m!XgI|fTW=kodPyv28m_kuyYYr?0wHVq-t_t2OK1}tyzvVz-w;hxfmL>%I
zPdJYH-i1`!ZSB@iWfU3=%(Kr0<kSw%a%zK)EJ{aa;ixFt41OK1T#m$X>hK9O_Zl|G
zZ&5e%sBrEi0L){7E8-g$`Tacnfa+alxMUn&#!5PT#tL(4)nWY+)sNM-?kcBdG{bU&
zO4loCt6Cm0!X%`Y6;d$@v5dp@>~PgMyl%dtmc3$?HP*hkVk5m`)67-Ra;-7f`hU2#
f%v_Bu*A{a%zTnzPb(M_<HL?cn8V%ajpJDF}c~)`O

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Neighbor.class b/bin/plugins/ragini/voronoidiagram/Neighbor.class
new file mode 100644
index 0000000000000000000000000000000000000000..0cab07e90c9f969c3a44d7163863d30a10fc96a2
GIT binary patch
literal 1292
zcmb7DU2hUW6g|V&mhHCCQb4LzTWiaQcD3pgO--xuiPRbzjJ^#pq0_)F8FriSuQXAc
zXyOm>M;Y%dAgBcD!_Mcq=iYnf?2n&czXRCEGXo)poo?H2NvCHkPLs4RUFABiY)alz
zyknmT**dSg%0Pr+Yc{qjJz*fmusa)f>Pp8u>vsi1q$ztI1A9r!9)&Y(S7rz6BxQz$
z9`A@jaJq8AFS+e|vTYwJ#rqZFBuKm}TMqYpMXb-KVGib`8uea2B(~TAspB0og!6?O
zRr|ti3KL<ZEF_RLkY-3tsl&t?QgJZcu&@Y=AyJWzIPp7mq0V@{O|`97+y-ygxRQE5
zJdAkfvd56WZix&=OL$rwdeVGhPFNtKuIjFZI825`-fWKAWhh-cZK0-Fwk_Pp4k_*o
z-9nY;CKNwa(pA#yzww1H$|mwC8YnPi$AbL<u~5PTQksflNaqJkZSJ(}*Yyk0@XCev
z<QYeMhFqW}E;1~S9MRSGq6)Gk!#KgDGmfU;{Ffihs_UzUcqR1{E{(L?(+ROjnuO_#
z(inn)1^VAYTIgUV8_?ZSuwEt%c>+lqSLoz8hy#+vE36j3VeQ=&GM|zC7@%`BE)xR8
z5Fv&H?bd@GqcMq_xJ5I=25t}eY?}35wD<{kKF}frO%e+ZS0;j^zk@fiH4Hu`bcoO<
z1>Y-u!S35}8D?;krlv9hOJ;x^vQP{jQZYLD-c-IU@!9|I<%n;64&Ng@rd$L0_5;x-
Ro6P>*<i^w{p9E4o{RQolB;Ei3

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Point.class b/bin/plugins/ragini/voronoidiagram/Point.class
new file mode 100644
index 0000000000000000000000000000000000000000..fe7b8ccd15beee014cd5d18d6f54480c405af9f7
GIT binary patch
literal 667
zcma)2%SyvQ6g`uquNdvSzAaLO+JynPN;g7QMFpkUl}y`Er=*FbY0;k&1VwP+2l!Fq
zooPTU5nRlD<(_lT$>-Pm2Y_SLGtd|s_ugzI{HYysO2VE8Vc-X1DEKJk6Z<j{ew2a1
zP#E($w>|EU?2G=`9YhT5fu2L}ks*Cb=%~%0HxIiE##u0QP3W*JWRYXYcZBbr&nA60
zyykt+Whixm0r$E*6ta(pMsz2p3<sTm$U33RH|n6114G3^3Tc}4WVdc1BRga2Mzmx!
z9Vtt@CCPHslQqdUuYy@Pa2+8Pnab^vG>U!V(CI&EFeEKih9sn%qAz5LqDh@inaOGE
z4J*%7Xjr9~Rzn?YR9lM$<WZoGp@<U2-{2RNpO(PcL~u0`Tw4ZPiQo-v#+TcqQ<FMd
tjaQU^ben2gAd^MKP+M%p+NG~8<&9xGnX9(URUxkGA6z>z*RHa@_YLQ!STg_s

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/PointType.class b/bin/plugins/ragini/voronoidiagram/PointType.class
new file mode 100644
index 0000000000000000000000000000000000000000..fc562490485b940b8a39bc9df1db14682312b293
GIT binary patch
literal 129
zcmX^0Z`VEs1_mPrc6J6PMh5kQoYM5nykh;LL?D%^UzT5#pO>GRl9`xZl$fg@ke``X
z5>i=^%Fe*T$RLoFSeB@tlbDyT@1K;Fnq0!jz!jWdT9lmXmYI{v$iN3zt_M=d#>l|P
Rzznnu1Q;1ufg}?H8vs(gBK80P

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/PointVor.class b/bin/plugins/ragini/voronoidiagram/PointVor.class
new file mode 100644
index 0000000000000000000000000000000000000000..d56bc8bc8c8353cd16a035149098cb9c48772176
GIT binary patch
literal 309
zcma)%u};H442FNFNduv!6>q?T3Iivxf>@B4B0vIVchXaEmENIi()VIQV&DOIC{$ks
zJInw3w`J?|_s{1SfGf;%B!siKZfM1AOkg!JTOYjhvJ`Fuug#Me*H=E|ND1>5Z`pM0
zTJu=1Y||6QH@ei{5=M*jijdy<r7bYR;RG4Rgjp%hJ`C&Hh8M0oOE@Wg!(GKeV*YKW
z{i|#Ui}HUo*M#EP523O55^qlbFfSt^PN6*dBh)E!sOFl?J_Fgs2M*q~k)TkGW9Y(>
Q>SSMM>QhaGW7Pz+9j!M<o&W#<

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Provider.class b/bin/plugins/ragini/voronoidiagram/Provider.class
new file mode 100644
index 0000000000000000000000000000000000000000..b44a874c497848ca81ea1305441b199da20b9cbd
GIT binary patch
literal 244
zcmZXPJqp4=5QX1FWBdgR&mc+Tf~AV3m7tJZU`>{=A@0g*f@ibv03J#lMH^ELZ{9b|
zW9IR^-2u!o4B!!_r?SemISVIQw5YAK#_CMV+{vTZJ6r2axd3g#xRA9Jr8K$N9SW6R
z2yLUTER!(W{tuUgUaWH?FO^dSKa7%uSwFUwOVvh~3`f8G*?XH1u98JFXx&5|0-?o!
V0K}L1=&%pidFXQWK3)Gy1}_?xK1cun

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/QuadEdge.class b/bin/plugins/ragini/voronoidiagram/QuadEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..3da8cd2047513ea55b203db1c009cea0c9263d1f
GIT binary patch
literal 6966
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
WtmiCM8a;t;FtzLd35tC5=l=p?5&jYY

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class b/bin/plugins/ragini/voronoidiagram/ROI2DEdge.class
new file mode 100644
index 0000000000000000000000000000000000000000..27fc0b9fa0d49c12f601bf6f5a5bb66d6e379b9e
GIT binary patch
literal 531
zcma)2O;5r=5Pe&LYAGOyDC)(NRueb$it!?tm^4b%a9?0k*Oaa)1>?{1qKOB8fIrGO
z3&??J;%;^(Z$946yw9)q4*)*)Y*-8jkI^_(@rWmaoZ=Im=vb?P5@8~S{O0=7Z?y-Z
zw2@&btNt@jw3>wj6-$QPDYd0%4E4j{K}-Y}Pbm+j9&(fSTTQRakU7@_>0k|c8xBMD
zw?Y>#3Jlp$rk#eN^OpEJTE!_58lIAi^+mPsU<DNyS!^&gmdE&M`-9DlS2CksjfXv%
z+=*U9TU7$x7g1Lv%HVl0lisTlgBSc$vnDMbO+~6LeLk0l!MWArq%SX&`LwuD`@{%@
zeK1<g97Z>b99f%Co1zx^!qM?7R_PVrP=29+g(_KRnsi9cJT?i}X2s;U2vHlhQJ+%o
I5VElQ4ZHJyV*mgE

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/ROI2DSite.class b/bin/plugins/ragini/voronoidiagram/ROI2DSite.class
new file mode 100644
index 0000000000000000000000000000000000000000..3b0f032c71f4256707caefc61244f767fa6b0d31
GIT binary patch
literal 691
zcmaix&rZTX5XQgdU!_z*L{L1L7zIq+ge!)N#KfdgBZm6|O<e<B(iV(wrHRJGgAd?C
z8D~r7pg}IX^G#=e^Ud`0>-_^j6MF^{3`djE)RkVqeL<JxGvzB!$)OakFUI`l>Y~}{
z%Fr>8VkpYNBlne@r>~XtLWWd8pBWD9|4ACsV#u6Qm$1!Ht=actCb)PAx$CGgk8sUS
ztKK8#nHoAKlE_&wu*Q(LrRQ8u$9>1Y75x$QE81!xMm^z6t>a`WypsV#eTA3BRAeYI
zoG?_DcwsOCC)CzyQ?(V;Xu^6g3x;hAX=E4}nK9fS!eMQdv3N;lS55tab1wCu8w<B5
zdSTcnev<wmS=UV{N>WT)qBBdXP5A`fna1%O%x8)cu;?_SY>wVoSSMYcS78HrQdExu
zHi<#2#nxZeD@wmvd14iou*$^KtO|Bw7LPQLZoHuML=ES*bQ!3jwq!+dI<~~H8&y@m
E0r=UHTmS$7

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Setter.class b/bin/plugins/ragini/voronoidiagram/Setter.class
new file mode 100644
index 0000000000000000000000000000000000000000..700b5f57869d1d71d0e25bd53d394dc983de106f
GIT binary patch
literal 294
zcmZWkI|{-;5Pjn(@vnv6z+%(5V5wqhC0HcbuevNNF_AU#a26iGLx~d=3)9T-e$1Q4
z^L7U?Mc+q-Fh0k*vB^a`#mmZT>e3{&2dj)zCmHH2)6PeYFgU8KlCesR-0Y5epAo7T
z&2uEy|I$3z5}KhkiOO=P37&|eH(51BWGI4ihENv)+X$^N&D~zFY|PR2r^BSUK@f{*
lR*o*qlt<u#{3%f3_H}rS{Q{xExQW&ex0&m_mG0NkdjY?EMsxrG

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class b/bin/plugins/ragini/voronoidiagram/Site$NeighborComp.class
new file mode 100644
index 0000000000000000000000000000000000000000..1f2fd0fcf8fba2559fe1da55ebaf538cc84aba87
GIT binary patch
literal 2234
zcmbtVOK%%h6#nk`F|nB@CVhoRAT$p@+ezAx(mH)61X7$d)FmVV7Gr1ROk>Z4@wlQt
zB1;~Ns=pu-qDm9Q0(I2|Y!FM<Y}g?7l@Q;ZvHM8U+7gz=_uO;8bI+M`zH{c6e}DQJ
zz-fG;LJ`n6s*Q?e*LBz6V(GUX*RdUI)iNrsQPYc-XAaGqR%NZ^xKmDTLq%91am%=E
z=vBk6=+{fP%(AB<DsaTtHax4UOQhi%p5qEcy)~;oG%7GuXzwde{3PS>E(#=5ofxDS
z1;SI#su_d8Aq^_J;s~KfLktOlP)Y)N3YKloH)<u*y=j!Hra*7ODI3*A!?onTsSL|d
z1;#q?`&?2OwOaOHnKu{Ph22VLzKxqFxb$oceRy5PYXT?Q=TO5NcvB!!b{uzAV7QH&
z1;?_zd>n6KK*ievgD>~s!!^8v69Qt%Pw<R19?~%E>z3n4BCR4NF!J)NS}&*}gRDST
z#q_3vn3Jh=hfxch)Nl$q%~!3uXV_(yKut~am!6i9jA`Wh8FHj<)OeKbxH{>@7~aKM
z6%)@9zIdnZnKcdX;T&JyX?Oxh3qJELM_+K6%cAF+MlIh3(jvTOx@H^~a7hIzefR*N
zhRe9Zm^Y+t)#i1n;6A^<c$sBa@{+`gJtoj`_!57b9Z~d*^7@>y;Zr=04=}6ZLxJw6
zEj(v<YZ|WMBblTxUA|B_#pLk<<15zK7w&LZ;!Y`1Vq-qF4hBGeza~8!XGaz_9K|t#
zrFMbKNz<+)_Dv(^MLJoO%^nws7oCP%HfJo^;W3FmB?I;4ifwoem--v~Lk%>0Cf8&e
z2DaFnzsNdkv$k!zQ&pp0H#tGH)}b7P7+{DYJ`spSLJla--v|^LGqta9H_n~HHJ-^n
zfR@=s_Yd4Dc$NQAVt_1q`LFqM9EWj)J5mM5f*ZsiyeCA}L?*KhZ5zjT(7*Xa9Nf(A
zU_`2db#QYRxfdXFO=Ph8$Zzi<65e_N{(s&4-CabKt!7Y7k6+(IPmZe5EES{SJ*VH?
zMUQ{rLt3`|&8QEyZJqA5y^rzU^E;RfZ84i6KiezJD4=5rqgcTh?sIx<;|w0LM!#|%
z{Dukqj<fia1K=;5!{0cMf7s~?CWVR%LSvhE<B}M_WiiaY&fu!ZVOosieZPVOL6w>n
zWW8_|Q?ja*rYR}J$vQ_LW92cH`}w1e11_jDEV3s?#PPmJvLc`LJ~dsD&wBYs%zV$I
zXK8cIcREhG(WK>+QUP<)DW!QzBo3wPlmgrWB{gw{^!m8z_9QV9btsd4h-8k>4sOV-
yJ?o5LRbPVy7~{>R=?F2>G@8lo;**1UEx8}Ur@r+Pmi=`FpK+BPBKY<D9Lj%%IxMaL

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Site.class b/bin/plugins/ragini/voronoidiagram/Site.class
new file mode 100644
index 0000000000000000000000000000000000000000..c157bc907b1479c17ec3d6c2e52cf5db3eac36b8
GIT binary patch
literal 1942
zcmb7EYflqF6g^Y=fVv8TfKZf&MYb)nf^S>vqiE8k;T<B0U$$i^L&`3hZb|%4e$Yfh
zB8fl1A7#8VyM|I*iXXbuJ9FpUbMCpjzkdJt31A7!F@zXqj%tmnaO#${X%W`3D_zGG
zyTYzY`_S4H9*-f+FmPZW+g8nXs@7`xfLA<*K8K6ye%Y0EhOv@9Z+N0+tx4fZ;eB3j
z@CMIP-lnKJw%3rHq0lKWSGt_YN>D4CC&Wm_b>%L@Y?n)Gu5dickJU+rQ<e;@$Pkr$
zui}t^$dNi{NOghPSS>Cst4<J9G)G<X@(ev@YMUWkaCdneJ-B6H05@Y8VX!V&qJWZr
z<rLh*qd10fTU{Sx_-J<FqG?<q=R$>SYCDDm!)OPS;uyyr#o#W(xLIuSNb$3!?YWXL
z`oJ({Ac81Ee@QrerEys1a?38)$lAe@Td`}~wiGH3HpAY&pz%mvfiX2VT%mFdi&x0L
zsE?ty%DsX=6?0}cL;bl>a?%F+5Z7)NRs6ufH5fFrb?$BOy@DE#uvzrAFB-V64jBzn
zoD!55D|)INB0w7f0kfNletk7RjN~SWZwF(jC+|C-{?|LB`02U~^WFHJ54<n@m4O@R
z_nRDGWV$x_9E7^H={97Ae-LU==zHMt1*Mq5C^`<8g_>QjbD9&Q`Mtn28PY@FstCer
z=qQR&6hbe><eL6ZZt0bb(JS$!Rar@|BRvNx`b4)wv`(Z?F?5FEoisbeXeoV$@txkx
zDJD)Z`Ay%Rrsp7`gNzQ7W`&j@q#4>7@iA}@Ns83jEbdbUhB=r)B}>P|IQ<=|uap)d
z5zy3uAq`_tijw5RFdDZ^o6GZGS}u>ay}STbQEALmDWx%*PMqN3xth4%O;Ev!CKb`3
zyrQ;5ol`0vwa1!o#hN6nsSa3=1FR=_`VX(n2~w?CNy3`#fc1<VR=gs3P8xjYUudn(
zU7l?1ve~v#FOh9WDA!78jmoWeB-F17<?%YeY9^9vC9>6qNC<DVuW#{=R;6#4eg%a7
E0B5|Pj{pDw

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/SiteProvider.class b/bin/plugins/ragini/voronoidiagram/SiteProvider.class
new file mode 100644
index 0000000000000000000000000000000000000000..10613b343cd2c134090f8fa285d7c67a49b927e3
GIT binary patch
literal 1204
zcma)5?QRl56g{&nEa0{UimgKZZYeBSw0~)um?kDBSWPe_#vgTn4V?<R&9V@l$0yK4
zYT}PRfX`%%XID_7Nw=Hq+}*iz&pC7E&i9|+E&=T0sR2#EIv<St${E!?$)M^J*K-|L
z^_1*;a#(LE-+t}66V<al1G+%wOipBdAf0~wRp-p^`UVmLrK?dE2m*2C^z5mCcp(rQ
zsG)$~b)AtwrFk{P5m))r@kb4T!~vE1hXS?owW}&^QXRQHJB=7JCQM|hpj>IEAh2%2
zKr;BcX(EjqX>8)Qfm;H**HmSqfFidyqF>xiwOn}@A??^!{nL)?H3Hf@CQ?WWtTmNm
zACHF}+j}EB16v^1bh~oUmYxd!=aagBs>o7{pjbXU+7>_gZME*$Q=cbaj`IAEL^|b;
zSrTRUQo%~gm)#F9<#{OCKqazC7R3U2D*Lz18fn^8Gw}%90_m1J_PX|S6*!b#-sWCV
zCy;8Xz9apy$9(U9tO(y0?RpTgZlSnw*uVqIi}8(f)Pio}9n*qC4I_JsG02-(;ke4b
z6XrF>qV*MPR&0ixRh=PkSznO9z{ceaTc5+?yBs$N48rMb&lJH{2~;4|y)YNT;66nJ
zPZ1Bff_E%1Yfd%|WdSA8Bz}(X)<+cPRKd)C(|XIGzo(AsC!)mgmp4nHIkK&jGf&LT
zCEn7USL6H+O61#RbrRwSwhfds&#1zhtJq-_%*L$?gd|!>k_ab72pVif!{cz=Lp_X7
FegP~LD+T}n

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Tri.class b/bin/plugins/ragini/voronoidiagram/Tri.class
new file mode 100644
index 0000000000000000000000000000000000000000..6056b515081fa06ee17b50d9efe112f17d7c9478
GIT binary patch
literal 924
zcma)3T}uK%6g{)6?rLjlnOWM06r~0&>0{wb(38|dvhSlVHnO_0uKuoqBIuzX(2t7l
zjDjFb_Hysc<$T;Z^ZoPr1)zar0~$l+*_#f;cwz^fny_bn;E#RL7km)#k=+S|ffz$}
z$Y<R4_;_GHbcb#)WYA_;45#hC`HmZe*Am;1rOA-EA(yblpjT@SL+sY?yD8{MTSy|s
zkZFstdp{j@-Jrv}p3AV+_IuoOcp&6`F^q*zV#08;#-7$E_xQvO9a{Fhx(2SctvN|B
z>{y5+!N6t<enU?8EEsaC6q|BVwqVN1S+({bafZ~RKMi{Bose%cX~9bwEh?m?)4%A@
zq%oZ|X{9<DP&Wuc5mDWsn@ycjkJmq7y(-uy)r1=A$k5rE1CT|IZWJW8sY-H-#5IYo
zU%Vr~WT({Bqy>^np)f}+6r_4VIWX)-YZX_uWQyrETKmyjrB$sgY30^v#c{BB<1(N(
j<X`Bq8kPa&BLgxb$;DN2F_LUXl1r=PawPds?RWGGQ$&Wb

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridCell.class
new file mode 100644
index 0000000000000000000000000000000000000000..6f12abda79e085381ba5a22f9ca95a0036d955a7
GIT binary patch
literal 804
zcmb7?U2hUW6o%ge*oAd#5o!e#Yul~zk+2Q5R~m0fG$f=ovBm2FrZ{vz$n3)Z>IE_J
z!XMy|GChNa_HxZ;&Ut4h=gFD(?C(E6e*x&?t%VGsJNFk;6~>+xoRqhWbQDHvqQq2-
zz`F|7b)<vOT1{LNdeZkT<Os!?SPIV<;ncer&Ez;CY|SGTCNbe`kRJNQ)btY>yeH%W
zp>GJ(XIAoE#qJ5Aou0)6>u;IMfDind<RhWe_zyyJ$X)cJi7bGh=-@GI8(EYbI4Bdc
zjpoqYJabThZParIkFaG_)q#aPVP~L1dA<lnQeTRZFA1eVG#36)Xl3^Q4s)hc!n^d%
zZT#nV+FzrE9?MV4@QV+I)G=crIQ=k`y61~Hma&CHLNoP92>JU-9}`YfSGt>F5(*oQ
z*X&M~f4LklHj5*SRUC`PMovXzH1CO*gKf@FSbal=KcL!budvhlfu~07wrGXDR%V6D
zEnj9(<5*i`D~zu)vc}~vP{vDCP-kVJ23_To`nu-TI_`68K#3WI101n-Illq!0Qncn
A=Kufz

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridInterval.class
new file mode 100644
index 0000000000000000000000000000000000000000..1930219dac50566b21736dcf3aac7b1fb944248f
GIT binary patch
literal 2478
zcmb7FZBtW66n-}E;sw)4&?s1GDJB7lAfgtfR;UsQYUD*;r1g?q;c7^jOTxhPKlE$A
z^pn#Wzv_%&r=95!=%48i=uF$^?7f8uOo7bY-LvQHp7ZQ;&e{C&_piSL=)+1FK81nR
zQf<jDuVoyQlbu<wIF)k6F52djW3FVT%Jz$jvvS|Diybm#%T>!+H%nmz6rwN9bu&{k
z%S)L@i!ZH0Rl&E>tDv$JHYxZv`b6RosxI4W9aj{(az_q0s1SCKbtw4PEV}n6Q_~88
z;Y!gu0fkQtgb@<yw1J>2#SIuZ*?==hgmG3Ob>w&k&f&a5#4Hr7H4U~Wc?`6vtN>{<
z5J5=7e`?@jy}w>De`eqWLJFsHcG-GZTUoT6NprDeDa3M>f?1k29b49(G9dR?xN&qC
zA7x1xOlJ8L)_gOPky#mLBrUTX8Yik|;nldg>cvYRcHwEusahL@BdO^V$e=e2rnKY#
z8Fr5tthlQzjSYSyLeDh=1Gv6RH_;rAZtdl!fiLU5ToqWi4BXbiHYLzk2JX~v>2F{j
z?iy&sC1P1u=sbj7@6Ie@$1K`4<|9(AOjI4ayrj^aOyzdlz|{_h!45dHSADl;mx`7X
z!5HJtH((Uw1|H%O9p7T>RfiPf$^Fh!)3P;h;0Y$U)m&Y*%0-3NWOjdKFT`L3Q_OHr
zkDPoeCubBcALM&qxLpr(^sq1=!84*=5J%q{xQF`@JZDwSTPv&8%>{+N!z!lk1sQZp
zu>pP*<mOG%5te}loK%=Pj-#Vxj8!VRUY1;6R%n>0)SQBK&z5$J*5T@rOeq-Ia@lf*
zOXk{|#UvZ`?;Ts2uMgkN5I?>&93gLyp4sqvW@mGb%6&LR<sIT$bd6}@`BRjhB0vdf
zPpAEJTZnEUmQKG%^Dk)GLaQfU*h2d|Zt~%CjxinqzM$Jq#BqsGlIWnua2?Uo$(01T
z<OWfv2{lMfK7IZtg#B+2I4^Npy+teIrrW%zKcmr;xUEev!~?G4!j9>}8wBG450qbn
zYS96@g;_qEJ?LlOJ;oIctltg311wL#Aq_T<6eXWPLz<E>nnxF<0J<s9A(9P4{X;Rx
zS$^<|Fm|AJ=0NSN)~Y=o=u)t{S@@F(Bh=Ko-t*O2a_`&k%{MAP3<PKx{Le5{X9(&O
zg?%Ri&j&*KjAyDlLsOWf#)I)tJiLvscQbpA7YC_J;2NLD0gU51mT?1B+|)#lvcw2-
zhsYX+F`|jA;Tv2fkqJE0<OX<tSd$y1m!u{)L|=`XToNL!>s|gw(k>-9$4kWcwZ6t9
zPEmgCuQBo)MrUIWJ|HLNZ9I-mZev=u1&Xqobyv|kOS@~Cr)3)pZ)4xRrFXYXnskb9
zqXk1O{X2DaJLla>(jJ8Ri)QdmFg=jpQz_&m(p_6<PJh6n2*q@3n=ttii*6}C;DIsz
zx#rkv<2XxK(j#suCUzK1XttyP6Phh4z=UQ?dMu&YlFoUE7aouTOH(xQJwUos+gRF7
yr3)g@txpJIf*>Z*j42J`q9!4}10t@|C?MiGjeaK5=E{ecc*R*BE&hL?1pEu9hyK$5

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$GridPosition.class
new file mode 100644
index 0000000000000000000000000000000000000000..43775da66cf6e98d2ad89a6ce54dcb71fbea996e
GIT binary patch
literal 1206
zcmb7D-A)rx5dIFW-L{-!#iAnqfK+U^*p?p=0f`Al(^!8JpjTdax?RdC+g-BT7JLbx
zz#AXI1fuc62k?=+P-mpk^#*J<XJ*dKcV_0y`S#n7FJA%7W8J`zz|y|cZE80t`HGY-
z^*rBmJ>Af%>8o~W+toXs-+t=rMwZ1ZFVG$Bxdx&F>6YrLlB3*a>1DlTTO9#$NUK8Y
ztw5}^tAlJ=piuqqBC7(%$+0XYSfh?Q>jGQ30WzEct=WFZK3vV$1fm;W!%jfpyhIX-
zBqF#VF^o}xNG@OFNJb)#L;{y^#lU5O?CCc-NiJ~?<1~ZENlf6nfolT!)6a#*EO7%j
z1>(xG>>$X_3ls;reg1dRDT!O*EDL;>EcX@TyUa)!80YSC68SK2k%0vc$2fdfqKMMp
zZs;)w>!!k4<|NTAlx2=4Ue&JsqT8<9{+6mcw!moBvy@X)zUF=38D%aAET8eFq4E90
zQeu<n3Cx^vyiW;%)MiInd(YK=zkG7j>-v`cM011bP?aJxUqDt|*Y-CY6$Cc5DZ_sV
zCTWrp`qQGcXznDzV<nkpPLWD8>u4`%4MUPnk@cO>eD1(39Am`%gftr$&DkT26+Yu?
zlf<O=?ikbTx=p(~e_W<{gz5K)n-LC^P0`s8NSUmojT5KY2QZie<vyUy0P`c2j$nc0
z3Pwo2p>`CtS*M+aDKxMM8>`sCBQ)_0yV!=tYqSWp2Zz2M+Jph|Y>4Cm?qP{ETlcX{
mz6WHFA^MXNL<|T669!?C8O~5}g@QwrevNdJCL)MG4}o9PYAy5t

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointItem.class
new file mode 100644
index 0000000000000000000000000000000000000000..d8ced8706dfb9616c19021e7d52c40b84f2f722c
GIT binary patch
literal 710
zcmb7C+fExX5IvIwmTX-J;Zi~ig*HMYNLd8xQ&C@#KuA$R0@7zEaZ{s>H}Y;!xP254
z5fTr403U@q4hZppxM<~>@y?v%GaldGUEcs$!*>rU!g?p{wzP=@E7|GbII@w6bW_Wg
zmF?ir=)aL|Z(H3g?nT-pJBez0$PjWz@>m9;G_7E_exw=+VW{IO2uszMNo&d`s`rzS
zF{;P)KVGSSRs_R`lYcrct`b(>PQWnl9#&+64Q@I4MW`&lgP~Mo<(pAcWx>}V@BzM$
zH1Yxh6NL0~spc|M0$KPj`Xn%fVHXtyJd6;=s@kaE-F98s16dChAzzIeGOS6f-TvWc
z#wjKE`%%|6)RuOIxhJ<#aWf!@9b=T;3}qav*ux^B^zs0nP!O_@bHxHnO!MQ&@M6Vm
z;q<c2xn9`iT(`U@UIHK4k8<<}DgJ;$d8LoB@)gEiFj=NPrk$C&<YWr7Y-b0wJ*Gcl
m%2S4)VFKrv!392ZUJR%U_%b*)g}DK89$(q}oFf+b4fqeC$gki4

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class b/bin/plugins/ragini/voronoidiagram/UniformGrid$PointIterator.class
new file mode 100644
index 0000000000000000000000000000000000000000..62dcac846177a2f22b9cd5822f6d8d12fbad0981
GIT binary patch
literal 1580
zcmbVMTTc@~6#j;mZh_U}4HZPuR_R4477?)G4be2IXo8TaPs=jG;&!)gw*>!yFUCZD
z^3Cg`51K$UlE|AT{wU)&ON-SPt7&G=IXiPM-*?XR`;X6G0OT;Kp+#V%Y*!a7r;_yy
z3M;$pdamPI^OmvT8KvxuW8HPV(pArzPuy@V$1nKOGkn+65EkfMGM0_3Z8!_r>vK!e
z^fg2Tb_QRozGY|Yw*^9F-xC-v{(HJoULfKxT9w40K&JTsbkjE764Vxr%9LF3Sx7Q<
zTOd5)&dW9sf({K)fmqRU<W#jZC%v1-oGl5X=$eK-Yj~EjYahcZqQF@5W&BPXi`q8r
z8|J-hM!6o+3F_LNOcnp6Gp}L4K;JJur`+kPxj1Rdl63sZ6;qad%XQkZ4?Q{#pqEUY
zWf%Q(0nXVr9KvA@eF8)O!MlzlhzqoqRo?}U{RQ)^^nAIJS2>UB=u)JHJV~-5o-Db`
zQbS6h{};p=r&2AKT{_KQFRP&<k_Jdg^au<l|B|#}KJ$e_iiibH=;%OuJ3{DD=Ae!?
zW#({7!;nC#X)1IK<Fr83FilyhB!&gdf2k*R=T7t0C)5+0khV<%M{!2Om_V-SO1Hdq
z<Q4Iepl9S>tZ)^$9tgBgyH(GWS1dK%oej(lsHO<$1;>%zgl$wRs%_DFMFMU0r(fdu
z*7e|T0DWXQ#MR0j>M3#WRD@G>sy@&T^IXR^?%QddqZE`K=~cwOqBZ<3^p0i-JGe)J
zqlef@UEjQhUD!=)PjE-5j&@-$cNObCTKEGJD%Ll2tYhD;kLcb|<|+;r)0;|S4YADo
zAb?8J#cF{^toAWtc*1B;IqJ`Xq+OfwYDxF9>SKsATP=NzYCn2w>2tiSphVY^WZv`!
z^_B)4&l_+=YazjRnyL9$i8@T5csjF&<LQqWP)ar}SZ_M>2`3NadULB7q4{AebT>%?
zUJ%1e^8AWCyk_V(MDR99*B5jmzLhSHvltIh#mW6RPg`(4h;{)NDZBY)l&|9w^+S{s
Kl$<?W27Uqwf`W(u

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/UniformGrid.class b/bin/plugins/ragini/voronoidiagram/UniformGrid.class
new file mode 100644
index 0000000000000000000000000000000000000000..7788a035447a78a7f92a2b2e9cf8c85556fe553f
GIT binary patch
literal 11951
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
XmiK4i?VK)szy!YatY!t@+?4+x{Y2zr

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VRegion$scomp.class b/bin/plugins/ragini/voronoidiagram/VRegion$scomp.class
new file mode 100644
index 0000000000000000000000000000000000000000..f0e5bc2a1384f253913fb7a4aec58e6146dbc265
GIT binary patch
literal 1448
zcma)6TTc^F5dLPj?Lu9o(u#OTx%C1p;58{BF-=HFDw5VzeLO9j<zU$*yIcN=J{f-j
zFFpu~55`wby!|2Lob6(`7}|&3bI#<OnQy+CbH4rg^clbs9vjdIrQLSNk#1o5f){D+
zdA{d*a#IS&7duv?W;@bzCxe!^vuhwh$ZU%}VYP+pSkIc<b}KZHBIF`#CzNfg!bstZ
z(DMnYa7zZ03xt_!UwO*xvdlEX6+$uJr%$0lNL0K{dk};n69xv-&@pUc5E+7=SAgNF
zbnW%dPSf_Ei)Py<j8wgrXg7o})j2jM6k)<#f2q5&Flj@{BYcip@5OrEmd;kw^UFO_
z{KFO2(ip=v16K*t=c{<+W8yk)5C$AOtazTk$@=FDJ@RdM(hbXL+`_nl+k}bpQ$=tS
zcW{?LuOgLKmGh*DsmS({paqMBzV%S}C2n9n6s^}!#cte@nSAy1#Ffullt_eG6PGbc
zc+o3qJl4H>aANw)g@(#usj*5E(si%nx9nA^X330^^NK2Aur3`}gdH^ywX<ZqmQ$By
zxkrDFdRt!Mc{A5s*Y+!I5d?N%;2~k^{C36s2+8OsW1K6|`AdQ_8Fgd$Nk~9brLpw_
zpYHQX<279@eS}#&#KjMM(r}6YDaL@lVubgm+Ot;{IbKOMAdaxlXq|1f(gCg<;O1<1
zdHW7YZU3b0&3hyhv2CJ@n>da;vUPF#K1bCfCZk*d=sR-s19|$1W%`8;`W-PF?`Dsg
zF%L{*CSqGdo_87w94CcDE}P9}o-p%b%zTbL74xBD=?lhY`8z;KB|TO?Lsj`KQ3fpA
nT<kg>7o94W4l)0K$&{=*79#IOeu-6-dn~w;k#7?o;1RUHEvj_}

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class b/bin/plugins/ragini/voronoidiagram/VRegion$vtcomp.class
new file mode 100644
index 0000000000000000000000000000000000000000..91bc2139580a584275f9ab14946ebb1541a5dae9
GIT binary patch
literal 1289
zcma)6O>fgc5PiE&ViKIzlu}A5r9j#wP8vhSEmb8HsZyl?5-AbaO=_hsjvYCh{1Z4K
zenBoAXeADaGaNu5{tjZ+aS^mg&S5;B(R{plGxq0SA3g%uhOL7$R0rOu=lVlC6r@~x
z9E5=%xQDLjg`#h_pE*4@@C#$v4f+EeDF*XcjD_t9zh^(~96Md9Bg3#5c}LRq>;^@O
zP{<%;$jBpiSh&wnY|hlEPANNtL+&zIr5SU|ZH81MICQdL$Q#gcDF+Sn2C^_2w2}&#
zZ@RwoWYq6C;eqIQ4#Pq-=nAhbLRZ<bGo=7C)MjfP^FpX~#g7Q7?DIs}PACtK94YEa
zP5uOy_j6drijEt^WCD?ANd|6Wl_4!vtB8d?20nhkP@cK3O4ue&TT*miJ{E(Rq++Rg
z{s`(9Jqk3#Jp<RU#PA}Kmg%V_lJd_**2`_xWK*p=$B=6Uqp<7jxoW>ge7rS<l_A@5
zd%ln(wWHQWv{TQy1KydLsa?7OW8e3ku;Gc}&>8C3V%SL7)pQoR`RVtCb(%#ZNrRcD
zx?}oMQ{ZYi@?IwEAz7Ss&Z@kJVVz>`9a$V#=$WAy@Gn@PcSF5X)>SN$W@-m<g)v2I
z<Xfwp;Chwh^&6!5<ji{Y7U|SPn^1%nRb3)9;9p_zZ<yoXvBG~~mH&*otWPV&U8p8*
zk*LmVxJ|-oqG*D-y!nVQ+=(%4QJ%t(w<@2oTqQZdUDfihK`2xWLc^LM0t#{JW(+@L
dRZg+-|KSxu8j4YN3FSyzsE}4P(oYXH@ZVxRNDlx2

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VRegion.class b/bin/plugins/ragini/voronoidiagram/VRegion.class
new file mode 100644
index 0000000000000000000000000000000000000000..1471d6510037b85c21b50270484a41e4fc600eae
GIT binary patch
literal 25001
zcmd6P33!x6(tlO=J4YsO5<-|v2ErY#a7n-zf+9z_luN_y0XZfi5E4j209|ju1MwCG
zuOMnr@s<G>4?Oo!*JUq{b$8WOch%kXTwMjt_p5&2nM@EF_j|to^ZZ#eU0q#$RaaM4
zSNFTW{O+eu5>bJk<|D<_Z)NT3>YBR7;SFU-YKAx0H`LeF*HqS&RX3Ea7(VaRNOetp
zosTT0PRq)g%ZAsM)m0ClRlY1z(Zu9gxpqZO9TQJ>;Ig%nt}{4ECGQs!2c=E}ott-y
z%GSoI1eC@+vz<mIH4V;=;T=+MMSVkEq=6~_wCPDkA8BZsvoz9FHU{0+tzOZLd?Q9X
zjVZ-sE2|^O`v5mJ)Cg2l2b#tRlR6DV-sYy-nnsytqnkE2ffjUSmCGDV@U+vWxASFM
zT~nkw(jeW<7{6fNq*LdVqN|Gfy2hrmI_Y{)k`Yggk)jEoyB16XlGK`qC2Od!K^?0c
zYsnOfjcRpMP3`dU4Gm@Mreh)?NGYwUt}AO=-GDicKQh(vNqU<Zsi|ICUf(cgtaP}d
zOxA2zk~;Gou_|%IO6rx4pFD{vEjHnKWwom#y6v-)C1CsUki@33Op694X*O27aZD1z
z!}=dI4<ndZUl|FIrUILW(MTpeaL~LIVmj6)4|xST&L*D&jkd|}Kx1r5ai9}y3Q(%h
zooJKoK;vynbD)VfrBkYpFv$TwQc9(%DK>SZE&@%nDc6Bcwy76o`>3a&XWG=mfo9v3
z<q(`|Q*Y`MpgA<pM{|>Q80VTz^JxKO729l{vo*kjY0}Fgo5Ivppwn#{MEOh^(`)J?
zGgq%Dk2K6FE3bw4be>*cQC2&ztf5BoF4AgRDjO-O#5#Hff)H3-5tDiB%w`}OBTepd
zVT&h|fSBkzOIKx6U&_PQsbAexTGNC<4oKF3kc|;}U<^Aii5MATrc^XPp{5ZkupVkC
zX%~~AW}GfCpk!SbVysC;ZOuwyIn%&oQ!rJg4Vo9A25RyV=F#Wq5+@aGT20_Kml?sI
zEOpn~w9eqlC3m(>KcRD=2_q|Ij)RgZTf-Zvc%Dt?OGVufsSePEwBAP-B^{E~wrPWi
zqpuNgU3r7Z^Tjq@LYD$pvD8)G1Cx(rrU>(x0BxepKDwN#@6owo$ZfiUu7rAo@Xe~5
zy1KR&3Syw)=_b0`rfXzi76vs!n!V1Z>xJ3}>X|O?2Agh-5fup0Hk)orAOh|}y2Ykj
z={Brxb);!xeSJfv;cOD2n_XX1C)3$ZJA8C|(&-p-o9-|xxlk75E}L3St|Eo*rh9#K
zPX}XOx~{P)vcjfabRQNCqRkX^Y+6nI@YxOMytJtyQnq4@pB_NP%9>`l2X)oG%GdQe
zE7DLOpoi!YA3e;JWej1*N;W-8yTPfI(oQWbMQ~t(y+p%k3423kx5uWvW|#|n^i!r>
z(^}b@rs36*`W3^?v<gb{O6pfb+XUz_dR+AO6EMyLOG>1LIrNlG`{`+5YO!&!4Z1;A
zT=RT*JK*OWde)}rWX)29zNW4+vR1G!*z_}5I2)_mq2L!b{ZhzNF=}{0t82@eFpxR)
zl1(quuf$!5I1a^+kWtx!rDH_F{@SLHX!qYFU0G8nKnDo2bbx+u(;w(n@l7I4Ye$H<
zP8Kd4px14BBUZ2u@_K;YwCPVV%vw|VFE+gu!>luycWnA=Ok73I#TGA?%J19sw}b)^
zGksvwhx8GorL4JH7GUz^LC_!v=$|(IE7t7V6@vN1rcYy-b->J_&u#ibxaezcsEm}a
zhKiU&U)uDQ;KUNiEF1mwHRMUy*-QMaUiH}hRkihNdIuoE2W>heBeEiEYap!N`i2_#
zuFzDCV1sHbz)yof4FU;k)LMbo3A9e2=J9ZRlk7T2i3sroXh~FHq-rJF2sr}$J&BTH
zw4PSlR93NkM%hYZ5q;bVGJix-2IH{VCd~#zIm@Pcf}TwQMzoiaM9#K3#5tgIb>ENB
z!bbH$thlR9L5LOSCRM#sCBWSvRosnx+T2Ul%Ysxb5JVrF`^FFp{oD`BB0h3c$8~|(
zo;bC1@$^ZP=gfkSp8|=He}ks^c@R7W*;`GK2DtawGN@S>3GiSZ>f<3y>Fw_GjIySs
zHV@<B(*LRktgSV$WKfAPXoSrLJQ5P;90_F0mq;7O+FZ!Ti6oX|!^<9+Ea=gK9`4<L
z430YZ=iQ%gQu6bO7*3?2p}wIPTIy8^;VP@EfR$AhYvpGhe#!(Y6R2FEazH*ITwGQT
zF(`@U$}3_}1&pYO?qZ?Ba$&NIL26PInH0nx^lR{v3SLs+Wzpv})T|Vz>g;63KJI-d
zli!$^{$uHk2gP%2%AsuRNuFo3@eX~M7)ICV<AqGUk8Vmq7vKd{;OEnsvK=*9d)OA1
zw$HSAF)slJ#MEQm2LA}79-B{q%i&Tm_}2gEgNboUD%>KX4DWCl$Mn@a43ukZUdGF1
z9Pl}@wUfGXW_v-+qV5Wt>*95>cNXwUn^(m#BL&lFa}%$I3^hY^`wvWZ`ZKM|R@@^$
zJEVnmHlO9RFha6FvH2V)D|(pEv$;PH5RP78^M#^8bwgdXkJrbHamVvtfG?r~A77mG
z*e^Qx)R|KPypb;zrd`HV`hPB%!p4jEa+^2v6|#XV;SF{04xA{%m_dt#?kbzF=4-Ie
zATbSP#_`SuLyht<vz+GQ$E5Ogyv4`YW21k+)aD!bMktE9$Xe{wF0mF8q8ejl*4u2p
ziEqZ%jMP=G6#olC8j2BjWU6=)e5=j383P8#POR2iQ9|2ozFl;g2bQb8LCEf~`OZYL
zb<$U>%{%#S*s<D3U3Jq^uwtO2+wQe_m(hh4k(yeme!tBRNOjqgIOvPF!VlT}Z~|_f
z=>A7->PP*BYf+o`@Ln{DaS3;)xg6^-U)1=i&HMOqaJO9{{y$jo5?PujZGMXPV-ict
z8fThSz<d|URGzW<Sz&r+Lj<l>O>+cJnTa$sO6l`9zra7k(m}0YHL#nKok*aKu$bli
z3!8t*FJdv{?HSiFL3ZHf!ii{FcgpI>>Imw*%&+(u9$lzifI5)a{A-a}KaQ?Vh<`Ln
zFTb(*xBNSJhY;kL>JiQM<Ml6&dOwyJDy0!BMK`U0(~#^)Y1E1kH`Kt#Owxrg4U&?;
zoW$@^vU9zwI3&QcJR%22UW7k%3tdTmi4BO{wu3OO5}1>ym0(>^3~o6Lb3+r5o^tF#
zq%H<!27}as?SND>{w&Ax`s<sPMjAj5BEi5N%kCJZShq43sTg~tDJF}3#pWlWuM___
z4a6h^!81|dpUJ-a9Fv1XBQ6crwOZWNYK+|5TsaMKFi}D)YD_o-Vn1kLGO0J`aGYGF
z0oT0t`%!gJq0X(~FP~7qRyvoB_npmc;sN?$B%38P3#4LOsRU%1=ptp=$`eOQ&{mK>
zTlo`^4rRdRgS0?SeXwJ5RGO{Q#nBBwO--3DGr*SL&OPO)kJxY6*K(C*t1c?&48%P>
zCyk9bhi5T0<tk*W962{ggh~3q(Oo+4YO8K??)1bb*WFe<987Eyy=>JxM&rz&udVW8
zG{Ephs=u5^uap)C+G>zO%&ZGK`kpRh%5jgthuIN1z0FZWY&A4C$aXcahTH0xj_7qh
zsCZNuX{%9EBFp2L9v};CbzCBHollL1GCI1$<Ocim8Y}8otPH3kg;?h>bv)DjWO~W1
zIVOp2>Cl0k`qfx9&Zpp#J9i813~990c!dL()mSgbfFY3j_G5zU7bI-Ii5PI1@d`{V
zVU8-X)g&dC4enB7=SUkzpMQLB%1W@BYV%k8AAwH7;e$T%p7?9$5CN3~pHYcYQkBp{
z41kd)HAwLek{>@ExrI=gC3RELd5->+M0#EZjI0*Z&?J-V$a`p<$jZi=T3qd@Q?Vmz
z>&q(VnSBQXHgMW$r@6;B5wIn;Dl<+C#L<xW6`b!b&LOI)z8(jux^=x8olU#R+0a$C
zs#b7iB%U_cZFgYO1&Ddq=yaK_mP-S&SEo#O8=s?A*s4zCTH2jy+LaNmwACt!68cxW
zVM4^;6hx>=NF_)&Z+1;(KsBqiKD8#P^XrC`ZM9Br1yV%<<2s4e*)|`dkpU{<D!5we
zT$?h?b$~kGrcMrYp-q_%wBDx9<b^Y@Hrnc9VWQQ%5<@}7OKtuV?O;%wBxsGEysOPL
zVW`1=toUm88f>+D{e^rPB+Y}oq_(X4>ZZuz^749Qbz=>zo;Swqq$=Na3ViO=AWIEC
zwb`fOHm6qMyza`2m?jYioaEIlaLt@mmx1;wuU}nP+2~h@XND`v>IO9Rl6t)wBCA%z
zE=MYjNPtl|$lwP@n!##^t?rOhyr&GOZfO1zb(gJLW7ff3)d^GYwyC=uLJ!c@LbJ<O
z_sL4iDQyx0S|#cMTRj-Zpq&HiVVf;#7U)r%l|Ut8K1yIdfZJ=c$0>!QtEt(i;Oh=K
zx;BVynC2!&9qv<4iaLCXX~F-oI&^w~=CYpdMYvNcQP0@wSz}z_&NP(?=6PGaAo8Ok
zBmC;;P?!j=<6^c~O=YC6sRs8jLi9^pz332uC#+t!)vwemkh$4&=fE8}Ch4#d)^V;&
zofVfh4%q59>bDTAnG<HsoeBTM1pB6mAUguLvKh4+C2wv<t@64`I53jHh4GYE)>KtN
zIBUyr?zU<pWsp(5as+}O_(h0BuPiWd0bsA0EGjzys;AVJH8vS6kd-cw^s3RhTFP^|
zD*EAlTm4P=Vl`k`g80Bz9~wlhi};7F{%H_RF5+WbePR&hKqSAnmEGj94s$|$9APcl
z3?=ZU5h<<}cV>?Ix2?WZUpYpp63#fdHXx}^6n|WtIgeW-FPRmS3O@BUI5ug<_&F1&
zGF|&)7Cx!%#ti?@Xa?a_pvJ>$sqw4uGeMvUfHEDXjjvo*RuQSIsFB#vh-9OmR@Y>X
zD5a4mgaF12nikNO_WHCZ=@#!;)7C!i$MQkTh>sS#IWR|MP@0Q<;~D6Htq!U~0d4Da
zpH9QD+kF$4(AF8c6Le>@Tx-w54#@6!^p3R$VW@1vV*=A>GRf{ZTsdRap(?gXU1UXB
zQ^nE<#7<7f;uIi(kK(N|`oVe{o{P*(-Y%rBT~|?GD>2wIxWBA(Z5@&wuEvXc8NX1L
zLZAtNj1c3xxH+=cxf2_fY%vaBi9Frkr~6?89bMTbRFh>G@M8`-PJ~`oWRo6b>wMX+
z-uk+wxV-ag1eQD3)%TK2FL9xIRf)9{zhI+Z56Ak})XBXw&WO;Ty#Qj0hFVxM!qx?P
zBzQ1alm=D~mm92)wRNF`UFg?E*t?On6}SYhL~S%?7@gQqFHwv&6|(hN7u&ik5AbU^
z(|u#rFe*G_k$`wY_hzt=`V`lb5m_9Z#I;Lc9)!YQ7r!g@m@_m~kDg$w>&yYGw0?C%
zMPzb~#F}l_#0?YiMRr;p#xoH*w^8<;*STqf<}v31ARLWKy+xGZ33nqU4<!I8c_v{}
zJd!Xeo=BK9K&d9h^9YmTafC_nG{U6tolFYP$)xa`ObV~bq<G+9Qe0)26gOoiMU2{{
zc%)!byqPd5UQC!2?t@A3RKlcqKVecllQ1b>378aNGR$Uxfd^t9c<KPSD-8xc)Q7<j
zg)@Q|E;Jm!a-Z-4W-s$!lfQ>X<frbYQSwtLKSlCWobP?yyPJ-8lCe%Q&PgWZXIk_G
zmF%X;acF9O{-bn~cd6%jnyz-!jC`LVn3X?xH=QD7r$njr@xX3cm_KAUo%WC!)EW3K
z#tRdI?`VOUIhasSiTdGxLouOIG?2z(I#V&B`IydPOr{bgt1yvfOyx|}?Bz@YWlNC5
zgs2ScVFQ(;o&sEfTF$h`BCk;9m2pMdM-edC0*Jy$(`vRu6>rr`<ro|MORA=&Zd=Eq
z9chc(oAIKE=(vO?INk(P4J|WGET`IJO^o@0CRR|LX#)3bP7{F}A!Hdup1Fggw93AI
z8w~@nCiVK8s2_l{tb&=6=z?Mk>A6-xu}4zmy{**8DKZo&F%&2<6v%srzCix4g?r?%
zCrTF-riHzdq&us*F_>0RoEn4E3ySS<suiWn!nXNMjnY+C3#EnaV0x6UZKdvEpth(M
z>LS2Z!SvfG5KfiCtzjDoln8N}OAM4lEM>toAvT3uF=m-3pNp=Gic&DfZbPGVbCg;H
zas91iyV;_YPzq4RKv@r=)}8oU6G~ZDRpb+NQ6Ox+fKg$zZsp=FH)9BHz9<k1NQ1y7
z)DEDwKP2@F(X7vEB}<3=9kS<|;!&uVP~4t9_x!DBFy6#Ksaxce;e~uvGQzr|6iHIC
zl&KHX&d&Eo>A`rDLOv=vd2B>Z>weR^-)%kc{nmvXBjg>X^&^w>#@Jw5`D|wt?W~Uq
zqMh~8B42!haptWG`M^9`k-{QKRXgjYa$y4Nqu{VRqITA=3i(kx5MNQ3x3WaCz)tpD
zQ!GoCP~4t%SsxP$VNS7O_MM>=Va}>L!`W3GSuf<$hLA(v3@?vD9vhL<x-k3BP{3_n
zID1&@F&T4OPe#6v9$OglZ4RYu-b4F}Q%%;tITSEi8v}%vebPyuDbV56(!)?z*fuDa
z#99)i=N<Ux+c@YzFCuwmA01e@hkonUH>iS;FG{~lpeYEYMCr8-2!E9R*Z~oU(w`F%
zVb2ScYP3l!c{*dGzTKhJE2W}jr1ae=y(jcD!$40<q|28UuxX=0D`}Me9;JUAiKN9P
zX)z=pJ0zdYNBW8b|ND08l)n&JYsqeUrIj*7%>RQur}ok}qS-aUO!57+9Pk80LMGx-
z;S~4}C&MsJrx7#*W@<K#!2^(qv;f$JR7$7ge@kF?%AoNpV5%zdY^n;6z^d^;tA=g>
z_ExmF9d_UzT7kz!b+ivpoSvgbdXbvwS9sO-Dr&tAWA=AC2X9Z##mkcOI6&uf7G20a
z@Dyzbtw%U-15crid<tE{rz3Q<j4tC{w2AMd&Af-M;3p7Wc#*E+H|bh_pRVJ7(DnQc
zv}!8dsDiW=0po3I5Z$DT=@wN&x2luqHno6SR1Mv(YUvKuKzFJQbeFn<cB-v(H)0(3
zAck?TdWLqXm*{@=Dm|dyqX+dsdPo=0!@7tb(Ua*>J)fewjP~ei+N)R7V|pX)(^t{s
zdJ8?F@1Q63ZrZP(qNnxq^o;&3J*(fPU+B;2mzJUfR*-&U4W!>%Mf7`X0{y|7ORrj0
z^qRGXUbilxH>|DnrnQIuWc{B0V*Q2Q@+f-S(~sWu45hz&rqYL=+4PZT4t;FQ=OL^V
z3}eg!19Hr#;J$@#q)^_CzQby08sq8eLcQ@IwGB9nCVD!%&>%{MVP6LK;ABt0g+`EO
z2F^>R9_2uI2{I0G8!!1(gZirjA-bs$t?`my-KTas5PgN~Zwt5-)vE4yAiNAIMtsLh
z0rj3*=|GTy2KKTKt`X#i{eW!9(*{n#=+n^mxsZu$O4py`>MoVxpIVAbISr7_aI4hW
zbj+wWJhk=t2z49qcVYZLB7Yk~S{X+yA~?gF@E_(y;m&Pf)RCKLgNGG3Vhiw$0&P?v
zuZO?aHGD9qxZ9D7l@yQT8Mv~cAEp4)XC|d+lc&r_8iMqJ7LM8j7MMN5h7D`OHb3(G
z4^eLw_?8Nk3LK(t>i?rLW6&>C+7Ha!#~Juf7Un=3{KzC^3S@lRe?fbYPVJM5cJaK<
z@lqjY%J}KtzIo+ob@yXgm8eySI|K|*>DoPcZ*04wY_(hN#gkqyYA|QU{9dR|=KvFS
z)cDW0QA+;c+$eXBsrb0=hR(Lo$=3)<euL=tx0C~^ZtpN0?=T$G4-j{wA7l@q8}5Xj
zyTtweH_)8;{b$8{US=RMpd8-E-4^cQ?vCYjPz5mi#!7LI1VR_v66M}f&uOgGu|^z*
zHR5n9b%Hg@;yl+JIW(WmZ=YI!yyGV*ivWA6JC<`K`)L}KLM2qd3QnU{+?m#KcEV}m
ztoU@#!kGpK5;I9~_aIf;$l)oDvu04oeyB&{H~WP=a7MF3R>+Gq-3)0UhNO4(?FU34
zFJxW6l`{JpGCR*udGxN3r(c!)Eem-=R+af#R=#;J=a2S*v`YS#fw)Tk+=7&TeXH=_
zvXGTmC4VkDH9yCfpOcc48s%f~-{`cQw49V1wowGMPP?Xp^i{QabY@OwItnp@c=28y
z6{i4PzBwneesm}&b1xTl;o=)^Av-73g^$1SX6huBWB%kWy$e01qOocjtuVkDGB{$o
z%E-xZyJ{~-`!XX#;`EhKKRTF`k<eE#))#7b?8}F~D$KAkd1uIA2PT!3lNIX;T=k;V
z^aH+nK;ZO~RX;kMla<g<IMxs9CiG(#a4Z(E)3>{ffXhzYNWHPvy(xqHV1x9fuH2uF
zg)AJ$gXmPwr{z2tuE$WihKJKO9zhSn{dkN=(rY}5{>jJEH+&o&;?ZpJ7`#$Dp7Zzw
zyfPe%_jV_86`r0h<%ztKC-DY+W_3AF!ON4Wco;N|pXQVBNM$<SqRisg;mXLy+=Z(r
z$X!fQ`Ar_@XaYdvjV3@TPXL4v2B3+6u*CtD0P+}U5+E-|ei{0k0&BJ$&)TK}O2I4^
zq2DPms@I_JlK`dRq1p^S8Bhj2NYgQzDU`_@=wz6nDU^j)^I&SG;4SKFfMx*-!O_a&
z*?_`k|NMcnyV_~6CKpgTbS{hw{%QOZ{Q)OpBxQXcZOQ`U80Cm)9#(#c2Iw}pmYE&!
zXzZx9+7LbI)S-r3K}>P*NCii24*CEORvmpnbHQWqmh1t8M4ATR>^tZIGn}|4=eY@r
z)sC$noR-z#lxTW<oB>E1o_R<G#zDJ6kYZ+HE)=Uw(e9fkhq}J#B2SEk@xig2Xo461
zP!~?QbOA`UcOiD;6h76Nh3_-S0>WwfPA>L1`t;{ki{1(q?5ga!w^PPGUH~P&sMr(J
zz^AzyIP4Mq?r8Bd21mK9Aj*|EfP4?rvWFv4UfO|v$oJ^mF%Erg2l}Dkqi@GJ^!0KQ
z;)W<UyXhK9*SdM6CV#e@N4h4;=We5JhPv1adjtTw9*`B~T4x&PTP>>7KE4Pn*ih^Z
zd-w6ig@cFe;Y*^tX}*&kGPFZ>aC<h&R~GwQ`Gv6mF}{{*KW{AdS%oROFc9`dd8-uL
zt-L90yT#?jsfY(9F!7d+bubbwS6G#WX~DFc$*U1~awsIib4rwVv{R%9(+x$sG=7&;
ze9Oi4d-<L#yh{o*60kes*iON;U`AzOW-!xK&6Mnt!p=d*bKv{#Am=2__W_w6>{MBp
z70fcES(05+*d^G->FL2Z>4QLK76w~sXE3WUyOnN$JUtQ&76h{kibLVh3v^L9BvXe;
zuMdagQ_l(K7_R6j@4l1fx;d-_a#Qldso|VG{MhKOIbF>}V4ezsfo*PZqcAt$)D6Pv
z*}b339op_W-D9+1T#EFCuS>SIZC;<v!R%m{?QKif2RRrFcHZ7Le|>;u9faV!Rl$_4
zI0+jDKP^pQsj-Bntk6L}Cz~YfDaCP_OT|Gc#SZv6Wca0R<R6UmfaD>gCXe(0a6bo5
z@<WiCyjwm*%JCN~A1dXNciS5(?TMpfne%rKoVke?Lv@r<I+s%}S5QB$q=8&TBe)u-
zY8gd%IZn8>^gP$mA+Bc)gOdie-vy8Bdg8=25MSmU$7^5^*797uby<#A$#r}-D1HJn
zaSq?X=fWhNhZmaX!z5k6@A8HG4c<gCuU9F&L3QGdsvlphhVUh76kn>w@MUT?Z&LI5
za&;zeR?GMbRnJ$d4SbclmakUZ`5JXEU#p^goqC3^SFiFG^&ZMU2L0E(No&4Ed-*50
zW4lfF;dQv~*`bU14qd``=~>*W=kQLwnD5q=e2=c@dvz1<(&zDgdOhE-ujB{xb^M^d
zjUUo?@S~y=;R50wLEjluyMVsq-;2%!)CLGnE7aZ}0BM{<Gx=414cyiGb{O6_$ioAb
zh5h<R@`5va;6A=dKJe#J{uBS1QoyB$_%AqZ2EePI@LOml6&x$)x8*Dfo{i&o<SYuV
z_2It)$^h?deiu+DaL~i=0m@XJ=u5;RvZ=EgLT~Wj0A;B$^dkQqP!}}^A7_;S3aZoS
zR-ObXTP?$R_XCV7q&CnJ{t*4<sC%iHKY}6YidaNn#5J-h7tx4x{wHwV`CpJ4obKKE
zd`w=qjZa{<;nDNQ)V&Qi3tpH*AD27-VX6yYcMj5@+vp@pIlRb+N9R7iPE2_Z=eU$u
z5v4xfh;ke(T&khQ59rW*0+qpEhn2zkk-x)a81Heq;V<1yy-2-qC%RJCBMc?hncEC%
zJO2_!If=UccNLwsV0_1++r0m6w<#3*FS^Ak@Eb~LgHL8oph;NT?WoIw%eupRCK`|-
z{~!u@7w*`9gilh8i_tG13P()$W+!dg425IzPTI104}U7|O~OGHyQ2Nv*e|xvpohMI
zREm4kkN*uw0t<K$>vmX!V-yZ)6w2`osFuIwIle*F^0&MKhoQr}*k`&JWjw7=yo(S%
z+?ry#2*Hnr2PF-{zn<dI!LJq{m*q8<+wEiwLx$8TUqeyj2LVq&VNt2hl+3Z1pTfr9
zk4^nFHtaK|Z=3?9p4&Ie`$4zO6M>hW55Mu^pC#}m;l_)<M!ZoPV?30Vc$<j1J3vJ1
zeCUMKelaeoQU2CR6}hQ)Q?H~^mGT6a7kl;bt#sc$+P-j)N-dUa7?jxE;Dj|7SqZr{
zMV_!PWJMJ`fRHCD-b^{FWET6we%LnEIqdHiRoP*0x3Ir7<kk!$$Zsq^D)P4>$2(NH
zaV*-=G1{JT*&!WDClsUY6UTzqyPmn5JNE5uGY!P&TP>U|ptx6Vp=aqH)i0_BxY>&#
z6ypCBn&|~G+QCvHz_9$FFX($-jZnM!5r@2|lZ2~+KG!QM^c!-2R24X7eVimWfkf^!
zP6?(&)v;mk!s3i43)A6bwbJTvhFt2|xQ{biA?R=Sv;x6^@qus+X9`<_DeZ-+!BkU-
z>p-|Yfr4Oa!OsXzlACdTNjTWCQfXw<{Pk%J=PP}C+hzMy(ZYP*ql$}tVQ<*CSDhdu
zMC@KoG^3}_tQHF98<@{9iNf%w*hOZxQ5EOIr2M=P=00tbLlmF<<otdHKiO$Sg*WGI
z?xId!UVW9^eLKXtoBPFaMJ}$VOIHE9LKoM^r4w9ndobohTxJt2sUOy=6Rc+r|A~6R
zW)6X690B`R49hnaHg6uR-5LA=f;1n(%6>#muwZBLKM~#k9FhAkXbXQuJFw|?Vb?r{
z9rFw{@+&ajuc4jy@i_fc<z>I}aaj4e4?L5>D!|97R6a%7yhx>S6W*bpqcY)rbmmr-
z#Sf@1{2bn#zofGHbrs?dRhYj~naWb#Rfg)RvQ=;V_Eq^RPaUrYs1xz<dlqu@)et;@
z9jfZpaCMP7M%@6xyH^#cr&OWY@8+1U_PdH=n7T&Iz%FMsi&m+bat2e?v=BKtrcb47
z)oef(&7%$K6hIytg6ABI)v17saUasEN}&-};9jH#I@Hf$e4G0g+VdeO@CZDEY~Y%3
zO*|J+3b#_Jng=Mr&rzY84=9zdp`~g8>e?!U9#RX{BE;cOqzm9nAo_03gTJG+SS(l6
z63R~(lU`{o3ouFn<D=~`hD5>O*A#4n){@X~BKZU6h#kYg^coH4w$=CWLU9Soncd>t
z?-h#=;uga#>3n#3V%xY_=rEK+bevBWf#YYWGaVJ}X?C=#KHXJ4i?=%gJ5??x*j@eP
zZZkJzNfHcsBuNi>C2?*{3;o@m;BLjX`AyS>zE;}oMl_4l!|6kUz5<O9Tn`7d0QSbU
zyf2(y8l%bxXS7op(4k5LRfcoKrj0@0KH3C@T-lB&P`LOv+fa%nhcmg{XG%`vT>(Cq
z4EnllZ)+4Z^oNQVAT6qD1b{wwj;|`kvx92Q(B+yB2BID<i27_u%vzOBE@g?Eu8j5X
z(p#~DSPFuzW)N<L?QJ^{Ktm=HRjc!(>a3vOx{YS^bBe>)-$LVK<{}rFQ86pgbIVOM
zAmp00KFD;<?<YDaWXao`kVo`P2ybtS(a>12f}>8s&++Y$*sCJJO^8F|q_oiB;?OuL
zEf(C^I5bP|qY^PZ$LnL{*E(j8`iU&UEXysJU<xL*7kJ!)ai(Bgdx6(27;6f~#tY=M
zII1djSy2FhOrl6KsiHeag#zWf)j0wd;#PdOI#0l&P%5w&2v{6S1@<DGTwB4GM`>Zu
zm?{|gU`jz$ZJ4z_g=46c?QL&??U#TID{z^qvj`bP2+jbtfnxPw?AuFVzY+?$8E(Q4
z7OsKw(6P@J9S@o!&^`f5V+N%{-*the%Z4^9g0311EmZ=obQ11UOBEtk&_OlOH7l`C
z*Qv#{UM-<3RT=JLtDyI)X}4NR&*I+o0P4JfyVt*}74#2PPhY5&)TUOkM>TL4)yT)H
zCZ30UL^bnLwT|o6+1#kk=UwVTen?#e1G=7{!1?o8bqT+$F6CF%W&F0<#2=~6{BLyy
zx2Y>tin>Z=L01n^*W&Y%>(rU*dbLK~q}HpO)zzv6zuR#udAoX8?NCpso$6V2w|W)n
z`zoqFgzo=TJ*~b{&*)6`tRAMG(<iH^^&;hXfVjPYhj@C-ZPlk64G#UNPgj?#&CsO+
zT>*UzHxkg5fDpI^bQK^37Xe)j$V*dn&{z{673n;64fMMomgZ)4Eua*&o?bH+CIIRe
zjfF|YR_TG+T#xu)iOx}50Hxt3{#+`@DK{N4!3F9DKpDmk%%-&L9&*shGRHJ1=Nlzp
zYc#n}ZN+~?2kFvd4pM3QL0Z%X8zEucb~;3OV|3ZM2Vv7#ZBsWnIyhwx#@`)*i+8%+
zMCoxC(AC4Z2!bBgV_PZg3SoB<>~1aOZKcfhn!7t_NcTH2u*I!=t5dho(@G_vnicej
zluHs-E$yxGnySrl{PqNVbJga(>h`Om>dy5Z4tjjs+aAZ6K<(6Mkz+3`Ol$XaZ{cH6
zb87yhYG*;v6IJ(i$lV{$nda$5Q|lp<Q8s4ejsg1HDS9NKsC^hmY~_)t+I_@=hoUNq
z*pu3c*pu2BC;73X+mkQ^hePqvJ(f_EWOR@H(CGGHbcU^H>y_=_J-ScrGcN5D#kn%n
za4wu$U6`s1<=iki2v?b=2JM2<EVaJ~VZnKBKB}G$g{yF(13Zos{oBz+A}|RR*QfG&
z8;+1P542S&!XQmX)pJpGKgxpWO6}a<)|wwoHOq{Upr=)hHx+QcQ9GB28B{x0qR!I}
zRv@=~oP5k>pZb}RyCc@xUX*o2d`pqUNGAsm@8!9|v?JnwVV)I&9{q1GlBY-x+)^Zp
z+ku}e6g}<0zbG_e+}lXPx1I1hP(rgU!V9(2a|g~IE@k&2d(=x~Tlu8?P*$kR9`$P+
zt3tt0wm|-%?<UF)`foxbfGd4Vd@IH9NZ>S>vhDkgn8|or=p|`f3#W=g0$K*l3FU-B
zRYhHOq1B3awX!iyK`4ZE9GZ~N0b^xrPd385C??H9UfOCbX1pf61L1EhpM#dfEFP)m
zdW(Y=w)CY^?n)a5;&Q?&a5!P89I5!AmByK|hJ{(PaJ00*fJC|=l+gPfIq6C`r0Uzp
zgWh&aSVyP95`ID%>Qlt$K0{>g-_%omNyF7wcpdR?8iz>F$+%;lqYlwL)kdeo0Bl3L
z16O1_wMF-94?U&5^s@HRAMpi4Z=J%$I>4pc<}-9UFV`7}kapsybSA&1JM*X7;&1Wh
z-><_eQ+HEcbgl})0`${8Rle@6hUz}5ME6y*VLi^&{ZyImuPXHbRjmi9b9BBsA2gT3
zeqE`LQP=1Z>PB4vdp1(Nq(`Y=>EqP<x=4MeN9$}|tcU3__&r`v)+gvw^;mtT9;eUN
z<MpL_g1%gr=q-AZZqZZpJ$kC%t54GV^mM&n&(OcpGxY&ITfeSP(eI+>$GTL1spslL
zdY+Z5=UXH70;^CjwC3qW)(Sn>YSw33=jkQZ23=-di}W^KY2B`uT03=(wGZj@y4L!w
z9%21Ouaff@o+aRV-g+lyZLN3I?_eEaZ2|q>Sle9d1!FO_{u=+6L+em#S$EPf2cm`6
zrN+j3;0?@HxWa_wZ{ZUVNzEpoZsC#YH9&rZj<k9mP>SBiIS!<{;H#`RfJ;>&^`iPC
zAX{hie)T4xG(C)Wsy_ir*QX+O{%1fL`b=J{B!1jUz0aSRw^3Q@JATc)e(Hj__s!;Q
zR8UXmtIX@CY`hD5QoRLR8qy!*1o$?f9Gpt`s&@c|^_O^s_E$h%m0!Jq)84zd6Oicc
zAE<8z9^+WtSp{%>!;>o4a?9&&SoLw84)O#@UJ-RqEHLLR{KWskSMjNRM5A-sD3nNx
zRwSYoCj=0qJ+=-1mt_gfx}*}FmBS^T9K}h|>fjEfLgIvR4=0r~Xkw$%+L0+S-~4t`
zmnM<ajKP^!&urDDQyXr<e_YeT$vEW^T5g{i2GOOR)a6v-AlgX}pV<#{)(`gK8$QRw
zqHW-a1R`hlg(^D_Z{5YH;H39nE1e*ybGF<PL;by#^7DYYsGaJgRtgE~f_AEZ;ig%|
zwHc%ei=mqnqM9>fyNqU<IEJk3OcTd&Zkqk%$?Dv>^EiBOBi}2!<E+9c;onmB(A)w&
z7?$l60C;AvT29HemPmh2C^p^r!)IZKolTwfPfWl0PR)3~*;EeQD*a|dzd9c%WSf1C
zJ9PCq-kv(2IQ$iD`9L*SZtGk&a8!Mv<fw|X(cC9^!E}9slX-4ovG>VBk1+#TVJ|Gu
z%)z-sOV=wlh9c<M-u4fn#E`#`_S#uA43b0od?<<wu(>a!Oud0}@zk@2zL<{Fm(Un}
zDO~c4X{z2tv-RZ(Q;I#v%%#!lKk91?y9ZvGh-y&ybi#)#o;TbV0y(5J+i+ViQ4gQ`
zMx-7I5hD8X?V3B`WvD0b5;6u4y^B(Zgsr>CW8vuzPzmn_^wnkvPGCJF&eaU{Elvf(
z)eO-_XiA_qKq6lmU@h**%$WgT8a{$zEpc^xLW56PJqYa+?-6DSs{?~Ms<m<M`C6C1
z-SHU(oUZQH5_ko?%Ef}uh+ZSS$!q23Y`Jf3ke{>nXgD6D4=Xa|YfVv)!;03Lswmn@
z5_p&aIqSYxn}^>sa<PmBR?w0>>~<@?Zz`WHU7FsG++{<2NQqsx*ZQxzY&2b(CY^eR
z&$7Mfd$VjWO6XDox<{L3(Bm~nsSMZC;nMBjUG5yK1Y9n`^ch&D+;;hBmeZQPo|L{3
zJ8&zk);8*-Z=s;Rm3ryhsIP9J!FoHy`gXcR@1X1Oiun%QskZ97=pNll2lY<&>AN|k
z@8PccUhb}Uah<-8&(invW%>c$tRLcQ^~1acHuZLW3vO_C^KOK+<Syw{M}%VX2w}?9
zogrWf6j^3Vbmlt|MaYIc4n$N}BCHnfJTKH;0C^B!-k^inFkWn-a-9vxXQXuyr5!>L
zTI}F=6vV#a1&8Q#{PsRbv*oXc{~J>N|3KhbKAm*;k{r=RVfF8e6G$HZ$|swUAvRRs
zysCb6llx_9aYCJFVLJ<DD5RgHfPM<B+Ycr74CUx&6Lx+7*c7RM{9R{%=cx`JX6EWJ
zrr^8_!u{MK+z)4t!+w_!4&9+WkAcbeb_4J{4&RsHbs)YI!IM9H<|FS55p4?jLV;zW
z6nrTX)!k%lj&gOz_97kxzC@||WoW8jVQjxPV_WGo86VpK^QuhL!2t8BOw_>uTuEbW
z29j50!k+;wFVaNo3@|U!1n#4|11FEQb9E0ue!ODK);$5G;LElQ-3yR>M%i2Uai(Nx
zl-L;NI4+Lea(Q-8wuq>NEu$K?OrVrq`h->*ZZfnn7b*o?R1dUTC<g#y;<r(T09yc<
zD1u@+6iUtQZ7;>Z7Rr*Bf3QRJplGVTYL_%K6t6@~5-?5Rgo?iI%)QkdQDhjoZYZrj
z7e`Fcx5r6M$--b@SbJ>M=p6LDFqk?F@zP+x9W-u)FwhnX2U80>;I<T|wo+k7x-Cbb
zyGrQHaa5yWygdyDf+;O+PQXvq>+cUTcPt(q$z;yR&(Dn_NC}hMeI)=$2LiRj4R%xv
zJ4&$V*Wp`zFo4G~E}UCX8Vq#5jXE3l9f#h7ffIs(u~4tM-M6>h(cN<gHM)J_TSup_
zsE#)s?->}6GlUp`UPo{Hp-$cQ(ObOpG4ak5gd{<gy#u$F^dIo3<8`R9H{d4!k$USt
zQ-A#z8lm5!>H2M&h5Q+Cu9xcfXqA4Sn)Tmkt^SbC(;v}B{SVr#|3z2oPv{!`DQ(f8
zf!CkoBaJWUb-3Ig>96Qx{U7>Hf6c7F;VgX+YVQ#D*WdCW-3D_*JW7AUV=NEPwY)sv
z^7A4qg%?`^-ejfnb}Nlrt#p3S%HT(=P8>zqlU5gg)(Y|qRyMzAg`j|PRJN6^dRX05
zo|UVHTHVz#Ru47O>Z8V5ecRQh8W-EQY8;McW3j9H;z~<Yq{9F0;|Kagqc*iV0S|rT
z<KFZ5X*~|O6nr%EQ*(R?;KJ<@b9_lPYI7B3wNY=!;m~>5-q_EZ<ci3O;Y2qW+&~rR
zDj!DJ;+*KbI3AuZQFmzA0r>tQKVA%^sb-1~()cba^C05GVJHNArtRvu=}<GGa&nC1
zX$jQG4#Wkw9x9jI@)k1TJp#Uz5gX$8f;ll};FM(U;m|TZ_5N`!uQ|NsAxCXl>4`ED
eoP8%D?TS%9#u<7tBD1)S(o^7`?L#`1)c*jQVl1Bk

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Vert.class b/bin/plugins/ragini/voronoidiagram/Vert.class
new file mode 100644
index 0000000000000000000000000000000000000000..a7f2842be723e3e3eab46053af7e9d87e0479fe0
GIT binary patch
literal 569
zcmaJ;%SyvQ6g`uqt%<3v_5FUdi?#~`x>Vc<g+dWQ3AifLHq?=}Dd_|KCpUscaN!5|
zQR11j=tfG&oqNwc=iHmg*Z0RKfKwc#U<e%dJEOMh4ZKM5P~JF<!d|FaO12}}_52_j
zreF!==ksnt)f);}<GyMMh^j#Hf_B48fkd%VDf#SOg{{DWiA5JFxB_Oe<l7Kfa*;un
zswch`jpSUc#K^Nirlxwq^{CqjqC45>1nkzrrtJ7KQo5dj*6=|M1PZnJd+P5w7clCa
zWz=cUC8~Plu8Rbc0?utXikd-1=}ESxpFGO3#1T0r?~O7|WM(o?VS&+Rbx&OPGv#+U
z<@^Nca$$nyS3(9>8FR20d6$&fe3sx~jmY6thIMSPq5(FMrK!%gm>KaHcQ)pXr|u>6
rm_KueG{B{KIyTjGl4hp-2iTq&c)td3*m)sox?M6BWd9ZK#jO1wg~nSD

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VertTheta.class b/bin/plugins/ragini/voronoidiagram/VertTheta.class
new file mode 100644
index 0000000000000000000000000000000000000000..8c6215f50d340169bcd5217814409fafe38380f1
GIT binary patch
literal 1264
zcma)4%Wl&^6g}fOZ_^gH1ZZi2zVax<G%P{gAR<MIU_lkpRpq2s>MD(q<5ciZ2nmS@
zi3K0PM<LD~N2PLI!D8lKkMBA6+%xm*_m7_dTG-FSP^f+wO^5z?;)E`P?_307Fb@0^
z-yMeTxzqE)=<w8w+&oN$r8D=!bw=)Z=)CQpd4otnedKC$eNxCqQmJ5g`#k7K(o)F1
zByV)U-?etT-cvAN1t(q!87x__a9bf$tM`gfShkQwPO>`|^2jMHcKxyUW_sTD!b7(|
z@)YcDFmOjbH}vIuerQIg{zReP{m)@uP}(tt8^=`5?rrJ0VWA*B3llFMnM!L~u#!2C
zxZdmPj#TejD54};%|aO^jz`>U4sO;uGNqzeeMAdP{vuWaX-e;cX*lrOzRa_5>2Oob
z#bYvNct2SfVg@rqtk9A2bYx>4*_N?PgoRt&7x;C=dciL?zH@EOU^ljBSox{}749}n
z?gj2enSh`&?(*bO48uL#=NAdE%63X;Ys?Jh1w5FyaTw)aw($+?UzivW@))q739Yzb
zPN?vZEn<xatTv=t^sWDuR???7=U&zfmAL9sQjYFO2Zha4AuCBCl~f^HsbD(^UQGoT
zu|1#Sss%fr6BcZwg3GDkY7)Ge3a+DZ&A+u7c9Q<>(!Z)^xbEK`FI@b4lFn64ay7`c
s_Ybb8>Gx_Uxtip1Zs3ZannE+3>&o+u-$;vG&u`$8$0{>A`bwVt0VWZH_y7O^

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Vertex.class b/bin/plugins/ragini/voronoidiagram/Vertex.class
new file mode 100644
index 0000000000000000000000000000000000000000..83c1f0f44486d7afe0fa146caaa2a756c864e498
GIT binary patch
literal 6099
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class b/bin/plugins/ragini/voronoidiagram/Vonoroi$GLscomp.class
new file mode 100644
index 0000000000000000000000000000000000000000..2fc052d62cc3754d5bd33591508bd6009e2c3fd5
GIT binary patch
literal 1324
zcma)5O>fgc5PfSWF$qp;N`X>Z=tsVt)HFf}HB}`Psi<lwhoFcaH>nj|96MS&{U>lj
zoH+KvfmY&xIP;?rvyO|PMM@64>lx4Nd-G=Y=dW+y0W{FipfJ=&?s(vMfh9N{j&<q_
z-}9YghYtiFT3s@P@8n;!gT6l;X-F^_C;XIKF82o3tKNy-4>hD179#IBbX==NkzDZ5
z7YwQJtrO%QGnCphAvGywhlqr`4At_CIh8I$qU9gkX)t7UXt<Gqia8x=7z}Dz2F$e`
z&psRvd$xGZd#=qe-}d|5?Q-ErJ9Z`{VFqh9=u2UUwk8GQg6=(-%G(xUa~gn*sqAO4
zh$Rj88P=!hNAWryV3~m(MK$lq+=n_IMZPx-O0dO{p9NROHb}}&$oubJ@=>f!socKW
z`{s3zB+XFNaR+x9j;4w+8L_E){5y%wN>`#(WQ#KlnT|geeS6Q5ebwWs-IQb*(j8~u
z@o+3#b9kNZ#B*hEcV<y(m%6U+d!8*?E)N1b&_IJ;n9`?79W*cTo5Cv9q0&l%8HSu)
zdY%a=vM}=AB<l%T3Z0p%`4xKg0=X|_DY!*@iei9e%+sz%-x=J-0$EHpAim)<MXTi7
zHqUXdM(e{zB$cyE>-{Gr6Vh6te=C3fMb_k>dPdo5gjghIz&fFAAcs7bP$2vw$|#{q
z`%_f#3}(b=b%Gi*B7CZLEn>M%H>?q>4Z16ZL@t}n8qbMwK4x5}OvyM~HGg2SM(Z2}
wN#gIa=?zC77$8!mIJFoTo2r@@DF0t7DW^(w<$We<(OJhPol<mq|JZ`^8@{<js{jB1

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/Vonoroi.class b/bin/plugins/ragini/voronoidiagram/Vonoroi.class
new file mode 100644
index 0000000000000000000000000000000000000000..f73fed301a91ddbc16667025e9c358180f22dcbe
GIT binary patch
literal 7012
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..7d58e8aae4c5ca48f2bbef413d11c35e1bc5c0af
GIT binary patch
literal 4706
zcmb7H+jA4=75|;Jtd*tp9Ycg^LKBzRm>@8XGnNSiY?Im;Y%Vo{G$d<zD=)SsdnFkR
zC0D?KmLv_~9$Fx2oF*wPE*1m|A=8&Om+4IV(wRP`Y5UO0KhTH9J!e;vWlDU}jJ==E
zckY+pS$*>L^;-aH@UaSou(ZE75jG>SfTi=p3=BrCXe4TOnR?jL`vM)#*GA`S#c~xc
zLb(|l3iRt{ByL!NHJ!1zrHA6}&Ub=4-fhMzma*#A+32n(<PYk-6_G?=f0R|n2-M8l
zR<c*|RfL+#*{N%;>L9opqFqKFSha>+xaCx+L50VQ929HFLkS_LQdkRH&4{rv(bs8M
zTlLOfgHX~M4e7ldx@F4u6wxKo5thx$nTq8coz@pk#Ef>!h{cR9!urbAUHYIN(09iJ
z#-I_22R6uklN{?OuEIvNFVHRtscEclmBfei$e<nzG>3*7>{ESJhZpm)Kt(xW$!t=t
z;aj+u;L$@NcB-O=&@{^=S2>O*;%0APjb-UWt!6A<@5Msguj1Q;Qai-S*BTx`1zR<_
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
R{1z{K`Ay3&Z~WxX{{R{HhFkyu

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..7ee89814ccb6cf9482a2ab2d5ae2481605467144
GIT binary patch
literal 1640
zcmbtUTTc@~6#k|y-F97U1x2lhsH>E=uux2hDIuB)iAmK5NE3}O)9qM>EW2cPTVwx+
zKg7gad@wxwql{;^7X%wZrOoc1nK_s5d~?qE_4~(90A;Lch%qc5I_;Kp1Iy?1kygj^
zJ=c>>$y+`@u<E_#v)<AyYe+C;_j!j~4tHDDtH!>tLk&p=bKr?L+wZ)#Z;7tjv9`K(
z?$=}x3Rn0H$#72w<_blw4Ghi`x<Zy41TfrWSj~@Tx>#pORK2E1gJIHuhLnytG6vGf
zGQ{&rAybpCc-cN^2!EG19KkSE^K9-Ac&XO?&4hx_urd|`vrO<aoxZ2)9x*4H3~!F}
z7{ys-ycjP;xaT!@KOBmR$|t=eTP_dVK4tRp>_8j;9cc3+7<J?@tKk+yX`D(ha2q;9
zircmb0&|@TBcO7#DbKlKA|v@EBUikybEi$ZkB7SFDL?Zsb{S?)Rt8btua4J4r=tK|
zglC4evoEnyJKdF31{xkR%nsNcg-Ju6VSS)6CKWpMQ^CMB%rNLX(Isq4)jHEB=f<*v
z#t{4q@l3u3L*rt+Wwu<~@dD|#dUt4GMRmQdhKb~k>=It%xl6;T>hK^C)ZO~=ZDXEt
zjMFm#md&csLBlgnPZ}!wOC&u)jQ)ULD1L!a_=d}$Xcfa1dM8Oo9Zr#KD4DFLah1MI
z(MCttNsi%0<moN#D&MKXXBgjcQ~8NUestv|HUTY`jC{@a^!mQY0&}<%`A-qzyQF=O
zY<m&a*?mI)lp>m>qcAU#y^1thC?4TK=?Dv7v3LqLsVdkiwFHWhRO-WB!g92mgN0R+
QrbtUAr+y36*5xO;Kk#bSYybcN

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$MethodType.class
new file mode 100644
index 0000000000000000000000000000000000000000..2776a301b394ef1ff036df6a52a1d45750a99215
GIT binary patch
literal 1660
zcmbtUTW=Ck5dKcNEp%-w)oL#))mCAx#k;m(OKq_dxg@0}AwHeb6}B$B&9ad2uM{;l
z8ja8XDC3+13R-;-dEo5K&U`c9%y;(dw-28I+(tTp5rzjxX0vKojkv?<FybxSu`Sy;
zFnHDB^?0dkZgtItobJ}_gWdL#9)Oo&?2xy3+~ig@p0=8G24yRq-Pp@-lo?jCLn0>_
z0;R%EAz#Qacy{vJ3|@=Zb%t=ZU$5vohE=85(R6+<w@}*1?xl+itIz+VtdgvlGy`{y
z>PBNFs=H|)=n8xa!VHm3ZdRHmclF4YZt|wZ+mT(zAo9X#*j5M(XH=ZU6oWt61BymZ
zHk~=?ij{(teO`qRegy#qvkcSyg1t3FdV3JD7gPj9tfC;ou-K2?q2^qprAP9*QLXLU
zPR+ItBHIo>s)@YIDirv|(}Idos0`y-!_xE3`o8Y$@_kbd+OBZ3#EBi*(iwsWQ9&-o
zF!d)+T?W@x1QDXixizCfV`#`VkuY4lyD=J3G<K3dg|@ia)F~$!jSauV5boe!0CyQC
z2DH*{xO!d1eLP?Ya>wEAiha~(&<2SV_7C-nn;2Zq4_8KrAs`zpykN);ruBpv8(Mc_
zvI!Lrkz}|xh`ed?Mk8@@R)gac*N!ehsAxBxivGk9+nfCL(k_cZ5bvT<wYb}KDB{@w
zs6a>#-TWFAS2LESJF;875x^$H(!X4N>c0P3N!=u2dg%M)OHGTr0MJP~mnZ3#-h_q1
zfQcEQUJ*%pK7}#L8z<`}+2XhT5v&}Z@Ptpl$K)HFljgKHJR{9HX<qb&FG+LW|B0eK
z9h@tcy&cRI%f1fgi*In{H9?JFk^Vz;0(WtPKAl&kSG=Li-Yfi++V+xP)vnLI$2IN7
zJ81pvF-htn5m=?R6B1!cBC1%Dv?!CXg%}u?5$~ajlM$*<dkgKAEGwGvOXs?TQM&;>
zm>_QA7J0-h?$a#9ET=lSQhw&qK9`e%XU;QwjN41Uqp_c~f+WV39)?CuiUvYqrX6GT
c3)tWDJa|NrBUr<_JX6>ZnUv4)7+a~C@AtZu)&Kwi

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram$buttonlist.class
new file mode 100644
index 0000000000000000000000000000000000000000..ba7298c4d3b57d600e3f139943774c09590f65d6
GIT binary patch
literal 1537
zcmb_cZBG+H5PqhG7S2^FDEI>63qoIz14I#vDDsk!R4~yrA)1(NS=%GmJ92le_`#pR
zk1<gpn)n0!QO4P8p(QcJCN}Br%-qh-GtbQIuixK)0+_|~I3k4kJ-b@69N+XLZ<bke
zJ=bxq9ZQxxSuyi<b+xXJ6{<ntI=1BpadZ(9yRs%tTRJ6ktFWtzY>g2{LaY1`n5w3n
zz+5f{mh0r$Njb_R#DcQrk4+P%a-9Uvvgaa043-Ep$<AC;c|zBUyQ6wRI4=-KkAW!q
z1bUGmM3eeJU(RyWX0=jK-fLN~6`?=p7Nwn+o~8AMu}i}zEOdmRg*ncnPllAdRNi~n
ztEe5qXfpR#*48wG*;GD`D}+>gx|Z#|vV8Z#_4djJu3<Qi>x9YnKBwy|FoGL|9$73Z
zKP=I9r$nE@%8Kjwfph{tYv3ks$8n1=(H`Q7i@+U>5xRXVP+WjaGWF(+Xq(C^l?$#H
z1{)WcK$87y`xVOxi@vTwqy;i{`$x8G%RPaq<CAh<Tc!nOj?ZYz5bo>NnIlXm{~5$8
z|5ABfnuh}Oc+@0%hVZsSqR+^@r5Ct+xcQ}5;)xq>*JXs={|n-DbG43urh)K8b7&BZ
zS8mlSs&z}x+`wtCDLobhvElIBv0_W#*R?mA4-r>~Ysvp^P$Hoxn_ssmBKm5!o?~r}
zwFvJ<I`b7GeTWO6S&QHzuQ5IYY@nZ45y}PzaEUd-WehfM_{87z4QuHy5I-=qt@k5b
z{f5yK>F&Xam}-iXP0>6!#Ox6sG=m%ArJGpARtR9Q9;5+)!(joBIW2H9*#?wxJ`-gq
ev2^ATi_N=Q6VXs3SPIvtc*eV?g1GaR5%~iSQmYdH

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class b/bin/plugins/ragini/voronoidiagram/VoronoiDiagram.class
new file mode 100644
index 0000000000000000000000000000000000000000..32ea41cc352f2d4d6fddbfcbfb188c9348566b99
GIT binary patch
literal 16092
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

literal 0
HcmV?d00001

diff --git a/bin/plugins/ragini/voronoidiagram/dkmax.class b/bin/plugins/ragini/voronoidiagram/dkmax.class
new file mode 100644
index 0000000000000000000000000000000000000000..837754a7213db5c06f2aa413d6d777525679c0e7
GIT binary patch
literal 331
zcma)%K}y6x5Ji6_nM7lB#_<Fqg1WH5tuh-y5P~k0*;kS#_L!ulCmFn!E5U^a@K9o<
z^#IaPzy9Y_y#D(B_yll)g9HKL=%pEI)2)?b5u-NN+0L5EaP7EN)pN_Q2_nL5#T!-)
zceT1NR=Vs7fvE^|O9-Vzh_B>8zYu$Jx+Fx`w$dp=WEr-wO_=7U(|1E#X!poPqY3le
zmfS4anbH4+QU7GtgyZ}lWS4~W!49s}H)cGTdfxL96^9TK`Dq|;g4l0~SAiahWTuiT
gQ4*b;y<_Li*LG#bJ`AxZd-hwv6f<#zeczh@0M~y;z5oCK

literal 0
HcmV?d00001

diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..16157b0
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- Inherited Icy Parent POM -->
+    <parent>
+        <groupId>org.bioimageanalysis.icy</groupId>
+        <artifactId>parent-pom-plugin</artifactId>
+        <version>1.0.3</version>
+    </parent>
+
+    <!-- Project Information -->
+    <artifactId>voronoi</artifactId>
+    <version>1.0.0</version>
+
+    <packaging>jar</packaging>
+
+    <name>Voronoi</name>
+    <description></description>
+    <url></url>
+    <inceptionYear>2020</inceptionYear>
+
+    <organization>
+        <name>Institut Pasteur</name>
+        <url>https://pasteur.fr</url>
+    </organization>
+
+    <licenses>
+        <license>
+            <name>GNU GPLv3</name>
+            <url>https://www.gnu.org/licenses/gpl-3.0.en.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <id>sdallongeville</id>
+            <name>Stéphane Dallongeville</name>
+            <url>https://research.pasteur.fr/fr/member/stephane-dallongeville/</url>
+            <roles>
+                <role>founder</role>
+                <role>lead</role>
+                <role>architect</role>
+                <role>developer</role>
+                <role>debugger</role>
+                <role>tester</role>
+                <role>maintainer</role>
+                <role>support</role>
+            </roles>
+        </developer>
+    </developers>
+
+    <!-- Project properties -->
+    <properties>
+
+    </properties>
+
+    <!-- Project build configuration -->
+    <build>
+
+    </build>
+
+    <!-- List of project's dependencies -->
+    <dependencies>
+        <!-- The core of Icy -->
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>icy-kernel</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <!-- Icy Maven repository (to find parent POM) -->
+    <repositories>
+        <repository>
+            <id>icy</id>
+            <name>Icy's Nexus</name>
+            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+        </repository>
+    </repositories>
+</project>
\ No newline at end of file
diff --git a/src/main/java/plugins/ragini/voronoidiagram/AFL.java b/src/main/java/plugins/ragini/voronoidiagram/AFL.java
new file mode 100644
index 0000000..454d347
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/AFL.java
@@ -0,0 +1,89 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   AFL.java
+
+import java.io.PrintStream;
+import java.util.Vector;
+
+//Referenced classes of package delaunay:
+//         QuadEdge
+
+public class AFL
+{
+
+ public AFL()
+ {
+     list = new Vector();
+ }
+
+ public QuadEdge putTest(QuadEdge e)
+ {
+     int index = contains(e);
+     if(index >= 0)
+     {
+         return (QuadEdge)list.remove(index);
+     } else
+     {
+         list.add(e);
+         return null;
+     }
+ }
+
+ public void put(QuadEdge e)
+ {
+     list.add(e);
+ }
+
+ public void remove(QuadEdge e)
+ {
+     list.remove(e);
+ }
+
+ public int contains(QuadEdge e1)
+ {
+     int index;
+     for(index = 0; index < list.size(); index++)
+     {
+         QuadEdge e2 = get(index);
+         if(e1.equals(e2) || e1.equals(e2.sym()))
+             break;
+     }
+
+     if(index < list.size())
+         return index;
+     else
+         return -1;
+ }
+
+ public boolean isEmpty()
+ {
+     return list.isEmpty();
+ }
+
+ public QuadEdge extract()
+ {
+     return (QuadEdge)list.remove(0);
+ }
+
+ public int size()
+ {
+     return list.size();
+ }
+
+ QuadEdge get(int index)
+ {
+     return (QuadEdge)list.elementAt(index);
+ }
+
+ public void print()
+ {
+     for(int i = 0; i < list.size(); i++)
+         System.out.println((new StringBuilder("[")).append(get(i).orig()).append(",").append(get(i).dest()).append("]").toString());
+
+ }
+
+ private Vector list;
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java b/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java
new file mode 100644
index 0000000..4ecf47b
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Alpha_Morph.java
@@ -0,0 +1,1327 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   Alpha_Morph.java
+
+
+import ij.ImagePlus;
+import ij.WindowManager;
+import ij.gui.GUI;
+import ij.plugin.frame.PlugInFrame;
+import java.awt.*;
+import java.awt.event.*;
+import java.io.File;
+import java.io.PrintStream;
+import java.util.Vector;
+import javax.swing.*;
+
+//Referenced classes of package delaunay:
+//         DelaunayTriangulator, Display, DT, Vertex
+
+public class Alpha_Morph extends PlugInFrame
+ implements Runnable
+{
+
+ public Alpha_Morph(Neighbor[] data, double _minx, double _miny, double _maxx, double _maxy)
+ {
+     super("Alpha_Morph");
+     minx = _minx;
+     miny = _miny;
+     maxx = _maxx; 
+     maxy = _maxy; 
+     load = data; 
+     running = false;
+     waiting = true;
+     counter = 0;
+     canAddPoints = true;
+     fileImage = null;
+     rnd = 30;
+     rank = 0;
+     rank2 = 0;
+     toggle = 0;
+     toggle1 = 1;
+     toggle2 = 2;
+     toggle3 = 3;
+     toggleBin = 0;
+     angle = -1D;
+     epsilon = 0.39269908169872414D;
+     myThread = null;
+     sites = null;
+     sitesBin = null;
+     dt = new DelaunayTriangulator[4];
+     disp = new Display[4];
+     for(int i = 0; i < 4; i++)
+     {
+         dt[i] = new DelaunayTriangulator();
+         disp[i] = new Display(dt[i]);
+     }
+
+     slider = new JSlider(0, 360, 0);
+     slider_opacity = new JSlider(0, 100, 100);
+     b1 = new Button("  Process All  ");
+     b2 = new Button("  Seeds ");
+     b3 = new Button("   Dual   ");
+     bComp = new Button("   Comp  ");
+     b6 = new Button("   Binarize  ");
+     bE = new Button("   Erode   ");
+     tOrdre = new TextField((new StringBuilder(String.valueOf(rank))).toString(), 2);
+     tOrdre2 = new TextField((new StringBuilder(String.valueOf(rank2))).toString(), 2);
+     bD = new Button("   Dilation   ");
+     bDFuzzy = new Button("   Fuzzy Dilation   ");
+     b4 = new Button("    Clear    ");
+    // b5 = new Button("   Generate   ");
+     b7 = new Button("   Load Point Set  ");
+    // b8 = new Button("   Save Point Set  ");
+     //i7 = new Button("   Load Image  ");
+     i8 = new Button("   Save Image  ");
+     bC = new Button("Edges/Faces");
+    // bConv = new Button("Convert");
+     bInter = new Button(" Binary Op.");
+     t0 = new TextField("1", 2);
+     t1 = new TextField((new StringBuilder(String.valueOf(rnd))).toString(), 2);
+     t2 = new TextField((new StringBuilder(String.valueOf(DT.densityParameter))).toString(), 2);
+     t3 = new TextField((new StringBuilder(String.valueOf(DT.vertexAngle.x))).toString(), 2);
+     t4 = new TextField((new StringBuilder(String.valueOf(DT.jitter))).toString(), 2);
+     t8 = new TextField("22.5", 2);
+     tvoid = new TextField("", 2);
+     log = new TextArea(10, 20);
+     p1 = new Panel();
+     p2 = new Panel();
+     p3 = new Panel();
+     p4 = new Panel();
+     init();
+ }
+
+ public void init()
+ {
+     p1.setLayout(new FlowLayout());
+     p1.add(b1);
+     p1.add(b2);
+     p1.add(b4);
+     //p1.add(b5);
+     p1.add(b3);
+     p1.add(bComp);
+     p1.add(b6);
+     p1.add(bE);
+     p1.add(tOrdre);
+     p1.add(bD);
+     p1.add(bDFuzzy);
+     p1.add(tOrdre2);
+     p2.setLayout(new GridLayout(16, 2));
+     p2.add(b7);
+    // p2.add(b8);
+     //p2.add(i7);
+     p2.add(i8);
+     p2.add(new Label("Scale Factor "));
+     p2.add(t0);
+     p2.add(new Label("Random points "));
+     p2.add(t1);
+     p2.add(new Label("Density parameter "));
+     p2.add(t2);
+     p2.add(new Label("Jitter "));
+     p2.add(t4);
+     JRadioButton type1 = new JRadioButton("Size");
+     JRadioButton type2 = new JRadioButton("Radius", true);
+     ButtonGroup tbb = new ButtonGroup();
+     tbb.add(type1);
+     tbb.add(type2);
+     class _cls1SelectItemListenerTb
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("Radius"))
+                     DT.type = 1;
+                 else
+                 if(sel.getText().equals("Size"))
+                     DT.type = 0;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListenerTb()
+         {
+        	 super();
+             this$0 = Alpha_Morph.this;
+         }
+     }
+
+     type1.addItemListener(new _cls1SelectItemListenerTb());
+     type2.addItemListener(new _cls1SelectItemListenerTb());
+     JPanel pTb = new JPanel();
+     pTb.add(type1);
+     pTb.add(type2);
+     p2.add(new Label("Criterium: "));
+     p2.add(pTb);
+     p2.add(bC);
+    // p2.add(bConv);
+     p2.add(new Label("Opacity "));
+     p2.add(slider_opacity);
+     p2.add(new Label("Angle morpho "));
+     p2.add(slider);
+     p2.add(new Label("Angle"));
+     p2.add(new Label("Epsilon"));
+     p2.add(t3);
+     p2.add(t8);
+     p2.add(new Label("Binary Operators ..."));
+     p2.add(tvoid);
+     JRadioButton rbb1 = new JRadioButton("1");
+     JRadioButton rbb2 = new JRadioButton("2", true);
+     JRadioButton rbb3 = new JRadioButton("3");
+     JRadioButton rbb4 = new JRadioButton("4");
+     ButtonGroup bgg = new ButtonGroup();
+     bgg.add(rbb1);
+     bgg.add(rbb2);
+     bgg.add(rbb3);
+     bgg.add(rbb4);
+     class _cls1SelectItemListener1
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("1"))
+                     toggle1 = 0;
+                 else
+                 if(sel.getText().equals("2"))
+                     toggle1 = 1;
+                 else
+                 if(sel.getText().equals("3"))
+                     toggle1 = 2;
+                 else
+                 if(sel.getText().equals("4"))
+                     toggle1 = 3;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListener1()
+         {
+        	 super();
+             this$0 = Alpha_Morph.this;
+         }
+     }
+
+     rbb1.addItemListener(new _cls1SelectItemListener1());
+     rbb2.addItemListener(new _cls1SelectItemListener1());
+     rbb3.addItemListener(new _cls1SelectItemListener1());
+     rbb4.addItemListener(new _cls1SelectItemListener1());
+     JPanel p6 = new JPanel();
+     p6.add(rbb1);
+     p6.add(rbb2);
+     p6.add(rbb3);
+     p6.add(rbb4);
+     p2.add(new Label("Operand 1"));
+     p2.add(p6);
+     JRadioButton rbbb1 = new JRadioButton("1");
+     JRadioButton rbbb2 = new JRadioButton("2");
+     JRadioButton rbbb3 = new JRadioButton("3", true);
+     JRadioButton rbbb4 = new JRadioButton("4");
+     ButtonGroup bggg = new ButtonGroup();
+     bggg.add(rbbb1);
+     bggg.add(rbbb2);
+     bggg.add(rbbb3);
+     bggg.add(rbbb4);
+     class _cls1SelectItemListener2
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("1"))
+                     toggle2 = 0;
+                 else
+                 if(sel.getText().equals("2"))
+                     toggle2 = 1;
+                 else
+                 if(sel.getText().equals("3"))
+                     toggle2 = 2;
+                 else
+                 if(sel.getText().equals("4"))
+                     toggle2 = 3;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListener2()
+         {
+        	 super();
+             this$0 = Alpha_Morph.this;
+         }
+     }
+
+     rbbb1.addItemListener(new _cls1SelectItemListener2());
+     rbbb2.addItemListener(new _cls1SelectItemListener2());
+     rbbb3.addItemListener(new _cls1SelectItemListener2());
+     rbbb4.addItemListener(new _cls1SelectItemListener2());
+     JPanel p7 = new JPanel();
+     p7.add(rbbb1);
+     p7.add(rbbb2);
+     p7.add(rbbb3);
+     p7.add(rbbb4);
+     p2.add(new Label("Operand 2"));
+     p2.add(p7);
+     JRadioButton rbbbb1 = new JRadioButton("1");
+     JRadioButton rbbbb2 = new JRadioButton("2");
+     JRadioButton rbbbb3 = new JRadioButton("3");
+     JRadioButton rbbbb4 = new JRadioButton("4", true);
+     ButtonGroup bgggg = new ButtonGroup();
+     bgggg.add(rbbbb1);
+     bgggg.add(rbbbb2);
+     bgggg.add(rbbbb3);
+     bgggg.add(rbbbb4);
+     class _cls1SelectItemListener3
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("1"))
+                     toggle3 = 0;
+                 else
+                 if(sel.getText().equals("2"))
+                     toggle3 = 1;
+                 else
+                 if(sel.getText().equals("3"))
+                     toggle3 = 2;
+                 else
+                 if(sel.getText().equals("4"))
+                     toggle3 = 3;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListener3()
+         {
+        	 super();
+             this$0 = Alpha_Morph.this;
+         }
+     }
+
+     rbbbb1.addItemListener(new _cls1SelectItemListener3());
+     rbbbb2.addItemListener(new _cls1SelectItemListener3());
+     rbbbb3.addItemListener(new _cls1SelectItemListener3());
+     rbbbb4.addItemListener(new _cls1SelectItemListener3());
+     JPanel p8 = new JPanel();
+     p8.add(rbbbb1);
+     p8.add(rbbbb2);
+     p8.add(rbbbb3);
+     p8.add(rbbbb4);
+     p2.add(new Label("Result"));
+     p2.add(p8);
+     JRadioButton rb1 = new JRadioButton("1", true);
+     JRadioButton rb2 = new JRadioButton("2");
+     JRadioButton rb3 = new JRadioButton("3");
+     JRadioButton rb4 = new JRadioButton("4");
+     ButtonGroup bg = new ButtonGroup();
+     bg.add(rb1);
+     bg.add(rb2);
+     bg.add(rb3);
+     bg.add(rb4);
+     class _cls1SelectItemListener
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("1"))
+                     toggle = 0;
+                 else
+                 if(sel.getText().equals("2"))
+                     toggle = 1;
+                 else
+                 if(sel.getText().equals("3"))
+                     toggle = 2;
+                 else
+                 if(sel.getText().equals("4"))
+                     toggle = 3;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListener()
+         {
+        	 super();
+             this$0 = Alpha_Morph.this;
+         }
+     }
+
+     rb1.addItemListener(new _cls1SelectItemListener());
+     rb2.addItemListener(new _cls1SelectItemListener());
+     rb3.addItemListener(new _cls1SelectItemListener());
+     rb4.addItemListener(new _cls1SelectItemListener());
+     JPanel p5 = new JPanel();
+     p5.add(rb1);
+     p5.add(rb2);
+     p5.add(rb3);
+     p5.add(rb4);
+     p1.add(p5);
+     p1.add(bInter);
+     JRadioButton rbbin1 = new JRadioButton("Inter", true);
+     JRadioButton rbbin2 = new JRadioButton("Union");
+     ButtonGroup bgbin = new ButtonGroup();
+     bgbin.add(rbbin1);
+     bgbin.add(rbbin2);
+     class _cls1SelectItemListenerBin
+         implements ItemListener
+     {
+
+         public void itemStateChanged(ItemEvent e)
+         {
+             AbstractButton sel = (AbstractButton)e.getItemSelectable();
+             if(e.getStateChange() == 1)
+                 if(sel.getText().equals("Inter"))
+                     toggleBin = 0;
+                 else
+                 if(sel.getText().equals("Union"))
+                     toggleBin = 1;
+         }
+
+         final Alpha_Morph this$0;
+
+         _cls1SelectItemListenerBin()
+         {
+        	 super();
+        	 this$0 = Alpha_Morph.this;
+         }
+     }
+
+     rbbin1.addItemListener(new _cls1SelectItemListenerBin());
+     rbbin2.addItemListener(new _cls1SelectItemListenerBin());
+     JPanel p9 = new JPanel();
+     p9.add(rbbin1);
+     p9.add(rbbin2);
+     p1.add(p9);
+     p3.setLayout(new BorderLayout());
+     p3.add("Center", log);
+     p3.add("North", p2);
+     reset();
+     p4.setLayout(new GridLayout(2, 2));
+     for(int i = 0; i < 4; i++)
+         p4.add(disp[i]);
+
+     add("Center", p4);
+     add("East", p3);
+     add("South", p1);
+     pack();
+     GUI.center(this);
+     setVisible(true);
+     slider.setMajorTickSpacing(20);
+     slider.setMinorTickSpacing(10);
+     slider.setPaintTicks(false);
+     slider.setPaintLabels(false);
+     slider_opacity.setMajorTickSpacing(10);
+     slider_opacity.setMinorTickSpacing(5);
+     slider_opacity.setPaintTicks(false);
+     slider_opacity.setPaintLabels(false);
+     slider.addMouseListener(new MouseListener() {
+    	 {
+             //super();
+              this$0 = Alpha_Morph.this;
+          }
+
+         public void mousePressed(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseClicked(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseReleased(MouseEvent me)
+         {
+             angle = (360 * me.getX()) / slider.getWidth();
+             if(angle > 360D)
+                 angle = 360D;
+             if(angle < 0.0D)
+                 angle = 0.0D;
+             String angleS = (new StringBuilder()).append(angle).toString();
+             slider.setValue((int)angle / 1);
+             t3.setText(angleS);
+             try
+             {
+                 double angleRadian = ((360D - angle) * 3.1415926535897931D * 2D) / 360D;
+                 DT.vertexAngle.x = Math.cos(angleRadian);
+                 DT.vertexAngle.y = Math.sin(angleRadian);
+             }
+             catch(NumberFormatException nfe)
+             {
+                 DT.vertexAngle.x = -1D;
+                 DT.vertexAngle.y = -1D;
+             }
+         }
+
+         public void mouseEntered(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseExited(MouseEvent mouseevent)
+         {
+         }
+
+         final Alpha_Morph this$0;
+ 
+         
+     }
+);
+     slider_opacity.addMouseListener(new MouseListener() {
+
+         public void mousePressed(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseClicked(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseReleased(MouseEvent me)
+         {
+             DT.opacity = (float)me.getX() / (float)slider.getWidth();
+             disp[toggle].repaint();
+         }
+
+         public void mouseEntered(MouseEvent mouseevent)
+         {
+         }
+
+         public void mouseExited(MouseEvent mouseevent)
+         {
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     t0.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 DT.res = Float.valueOf(s).intValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 DT.res = 1.0D;
+             }
+             if(DT.res < 1.0D)
+                 DT.res = 1.0D;
+             t0.setText((new StringBuilder(String.valueOf(DT.res))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     t1.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 rnd = Integer.valueOf(s).intValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 rnd = 30;
+             }
+             if(rnd < 3)
+                 rnd = 3;
+             t1.setText((new StringBuilder(String.valueOf(rnd))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+           //  super();
+         }
+     }
+);
+     t2.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 DT.densityParameter = Double.valueOf(s).doubleValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 DT.densityParameter = 1.5D;
+             }
+             if(DT.densityParameter < 0.0D)
+                 DT.densityParameter = 1.0D;
+             t2.setText((new StringBuilder(String.valueOf(DT.densityParameter))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            /// super();
+         }
+     }
+);
+     t3.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             angle = -1D;
+             try
+             {
+                 angle = Double.valueOf(s).doubleValue();
+                 if(angle < 0.0D)
+                 {
+                     DT.vertexAngle.x = -1D;
+                     DT.vertexAngle.y = -1D;
+                 } else
+                 {
+                     double angleRadian = ((360D - angle) * 3.1415926535897931D * 2D) / 360D;
+                     DT.vertexAngle.x = Math.cos(angleRadian);
+                     DT.vertexAngle.y = Math.sin(angleRadian);
+                 }
+             }
+             catch(NumberFormatException nfe)
+             {
+                 DT.vertexAngle.x = -1D;
+                 DT.vertexAngle.y = -1D;
+             }
+             t3.setText((new StringBuilder(String.valueOf(angle))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+     t4.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 DT.jitter = Double.valueOf(s).doubleValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 DT.jitter = 0.0D;
+             }
+             if(DT.jitter > 0.10000000000000001D)
+                 DT.jitter = 0.0D;
+             if(DT.jitter < -0.10000000000000001D)
+                 DT.jitter = 0.0D;
+             t4.setText((new StringBuilder(String.valueOf(DT.jitter))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     t8.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             epsilon = 0.39269908169872414D;
+             try
+             {
+                 epsilon = Double.valueOf(s).doubleValue();
+                 if(epsilon < 0.0D)
+                     epsilon = 0.0D;
+                 else
+                     epsilon = (epsilon * 3.1415926535897931D) / 180D;
+             }
+             catch(NumberFormatException nfe)
+             {
+                 epsilon = 0.39269908169872414D;
+             }
+             t8.setText((new StringBuilder(String.valueOf((epsilon * 180D) / 3.1415926535897931D))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     tOrdre.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 rank = Integer.valueOf(s).intValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 rank = 0;
+             }
+             if(rank < 0)
+                 rank = 0;
+             tOrdre.setText((new StringBuilder(String.valueOf(rank))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+     tOrdre2.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             String s = e.getActionCommand();
+             try
+             {
+                 rank2 = Integer.valueOf(s).intValue();
+             }
+             catch(NumberFormatException nfe)
+             {
+                 rank2 = 0;
+             }
+             if(rank2 < 0)
+                 rank2 = 0;
+             tOrdre.setText((new StringBuilder(String.valueOf(rank2))).toString());
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     b1.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             if(waiting)
+                 waiting = false;
+             for(int i = 0; i < 4; i++)
+                 disp[i].run(0);
+
+             b6.setEnabled(true);
+             b3.setEnabled(true);
+             bE.setEnabled(true);
+             bD.setEnabled(true);
+             tOrdre.setEnabled(true);
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+     b2.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             disp[toggle].swap(18);
+             if(b2.getBackground() == Color.RED)
+                 b2.setBackground(Color.LIGHT_GRAY);
+             else
+                 b2.setBackground(Color.RED);
+             if(b6.isEnabled())
+                 b6.setEnabled(false);
+             else
+                 b6.setEnabled(true);
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     b3.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             disp[toggle].swap(13);
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     bComp.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             dt[toggle].constructComp();
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+           //  super();
+         }
+     }
+);
+     b4.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             reset();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+    /* b5.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             reset();
+             disp[toggle].resetAll(true);
+             disp[toggle].clearPoints();
+             disp[toggle].enableAdding(true);
+             disp[toggle].loadPoints(rnd, minx, miny, maxx, maxy, load);
+             disp[toggle].show(10);
+             disp[toggle].repaint();
+             b1.setEnabled(true);
+             b3.setEnabled(false);
+             b6.setEnabled(false);
+             bE.setEnabled(false);
+             bD.setEnabled(false);
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);*/
+     b6.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             rank = 0;
+             disp[toggle].setRank(rank);
+             rank2 = 0;
+             disp[toggle].setRank2(rank2);
+             tOrdre.setText((new Integer(rank)).toString());
+             tOrdre2.setText((new Integer(rank2)).toString());
+             dt[toggle].constructBin(sitesBin);
+             disp[toggle].hide(11);
+             disp[toggle].repaint();
+             b6.setEnabled(false);
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+     bE.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             rank++;
+             disp[toggle].setRank(rank);
+             tOrdre.setText((new Integer(rank)).toString());
+             dt[toggle].constructErode();
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+     bD.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             rank2++;
+             disp[toggle].setRank2(rank2);
+             tOrdre2.setText((new Integer(rank2)).toString());
+             dt[toggle].constructDilate(angle, epsilon);
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+           //  super();
+         }
+     }
+);
+     bDFuzzy.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             dt[toggle].constructFuzzyDilate(angle, epsilon);
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     bInter.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             disp[toggle].run(0);
+             disp[toggle3].hide(11);
+             if(toggleBin == 0)
+                 dt[toggle3].constructInter(dt[toggle1], dt[toggle2]);
+             else
+                 dt[toggle3].constructUnion(dt[toggle1], dt[toggle2]);
+             disp[toggle3].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+           //  super();
+         }
+     }
+);
+     bC.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             disp[toggle].swap(17);
+             disp[toggle].repaint();
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+ /*    bConv.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             final JFrame frame = new JFrame();
+             frame.setLocationRelativeTo(null);
+             frame.setVisible(true);
+             final Dialog d = new Dialog(frame, (new StringBuilder("The jitter parameter will be set to ")).append(DT.jitter).toString());
+             d.setVisible(true);
+             d.setSize(400, 100);
+             d.setLocationRelativeTo(frame);
+             Button dbtn;
+             d.add(dbtn = new Button("OK"), "South");
+             dbtn.addActionListener(new ActionListener() {
+
+                 public void actionPerformed(ActionEvent e)
+                 {
+                     d.dispose();
+                     frame.dispose();
+                     disp[toggle].convertImage();
+                 }
+
+                 final _cls23 this$1;
+                 private final Dialog val$d;
+                 private final JFrame val$frame;
+
+                 
+                 {
+                     this$1 = _cls23.this;
+                     d = dialog;
+                     frame = jframe;
+                     super();
+                 }
+             }
+);
+         }
+
+         final Alpha_Morph this$0;
+
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);*/
+     b7.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+        	   reset();
+               disp[toggle].resetAll(true);
+               disp[toggle].clearPoints();
+               disp[toggle].enableAdding(true);
+               disp[toggle].loadPoints(rnd, minx, miny, maxx, maxy, load);
+               disp[toggle].show(10);
+               disp[toggle].repaint();
+               b1.setEnabled(true);
+               b3.setEnabled(false);
+               b6.setEnabled(false);
+               bE.setEnabled(false);
+               bD.setEnabled(false);
+              
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);
+   /*  b8.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             JFrame frame = new JFrame("File");
+             FileDialog fd = new FileDialog(frame, "Quel fichier ?", 1);
+             fd.setVisible(true);
+             String selectedItem = fd.getFile();
+             if(selectedItem != null)
+             {
+                 File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString());
+                 System.out.println((new StringBuilder("saving file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString());
+                 disp[toggle].writePoints(file);
+             }
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);*/
+    /* i7.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             ImagePlus imp = WindowManager.getCurrentImage();
+             if(imp == null)
+             {
+                 JFrame frame = new JFrame();
+                 FileDialog fd = new FileDialog(frame, "Quel fichier ?", 0);
+                 fd.setVisible(true);
+                 String selectedItem = fd.getFile();
+                 if(selectedItem != null)
+                 {
+                     File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString());
+                     System.out.println((new StringBuilder("loading file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString());
+                     fileImage = file;
+                     disp[toggle].loadImage(file);
+                 }
+                 return;
+             } else
+             {
+                 java.awt.Image image = imp.getImage();
+                 disp[toggle].loadImage(image);
+                 return;
+             }
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+             //super();
+         }
+     }
+);*/
+     i8.addActionListener(new ActionListener() {
+
+         public void actionPerformed(ActionEvent e)
+         {
+             JFrame frame = new JFrame("File");
+             FileDialog fd = new FileDialog(frame, "Quel fichier ?", 1);
+             fd.setVisible(true);
+             String selectedItem = fd.getFile();
+             if(selectedItem != null)
+             {
+                 File file = new File((new StringBuilder(String.valueOf(fd.getDirectory()))).append(File.separator).append(fd.getFile()).toString());
+                 System.out.println((new StringBuilder("saving file ")).append(fd.getDirectory()).append(File.separator).append(fd.getFile()).toString());
+                 disp[toggle].writeImage(file);
+             }
+         }
+
+         final Alpha_Morph this$0;
+
+         
+         {
+             this$0 = Alpha_Morph.this;
+            // super();
+         }
+     }
+);
+     myThread = new Thread(this);
+     myThread.start();
+ }
+
+ public void reset()
+ {
+     for(int i = 0; i < 4; i++)
+     {
+         disp[i].resetAll(true);
+         disp[i].clearPoints();
+         disp[i].enableAdding(true);
+         disp[i].show(10);
+         disp[i].hide(17);
+         disp[i].hide(11);
+         disp[i].hide(18);
+         disp[i].repaint();
+         dt[i].resetAll();
+     }
+
+     running = false;
+     sites = null;
+     sitesBin = null;
+     counter = 0;
+     b1.setEnabled(false);
+     b2.setEnabled(false);
+     b3.setEnabled(false);
+     b4.setEnabled(true);
+     //b5.setEnabled(true);
+     b6.setEnabled(false);
+     bE.setEnabled(false);
+     bD.setEnabled(false);
+     bC.setEnabled(true);
+     b2.setBackground(Color.LIGHT_GRAY);
+ }
+
+ public void run()
+ {
+     do
+     {
+         b4.setEnabled(true);
+         //b5.setEnabled(true);
+         while(waiting) 
+             if(disp[toggle].numPoints() > 2)
+             {
+                 b1.setEnabled(true);
+                 b2.setEnabled(true);
+             }
+         b4.setEnabled(false);
+        // b5.setEnabled(false);
+         for(int i = 0; i < 4; i++)
+         {
+             disp[toggle].resetAll(false);
+             dt[toggle].resetAll();
+         }
+
+         b2.setBackground(Color.LIGHT_GRAY);
+         disp[toggle].enableAdding(true);
+         running = true;
+         sites = disp[toggle].getPoints();
+         disp[toggle].setSites(sites);
+         disp[toggle].show(8);
+         for(int i = 0; i < 4; i++)
+             if(i != toggle)
+             {
+                 disp[i].setPoints(sites);
+                 disp[i].setSites(sites);
+                 disp[i].show(8);
+                 disp[i].repaint();
+             }
+
+         sitesBin = disp[toggle].getPointsBin();
+         disp[toggle].show(11);
+         disp[toggle].show(5);
+         disp[toggle].show(6);
+         disp[toggle].show(1);
+         startTime = System.currentTimeMillis();
+         if(counter == 0)
+         {
+             for(int i = 0; i < 4; i++)
+             {
+                 dt[i].inCoDeTotal(disp[i], sites, sitesBin);
+                 dt[i].setMeasure();
+             }
+
+         } else
+         {
+             dt[toggle].inCoDeTotal(disp[toggle], sites, sitesBin);
+             dt[toggle].setMeasure();
+         }
+         counter++;
+         endTime = System.currentTimeMillis();
+         time = endTime - startTime;
+         time /= 4D;
+         log.append("Algorithm: Incremental construction\n");
+         log.append((new StringBuilder("Total vertices: ")).append(disp[toggle].numPoints()).append("\n").toString());
+         log.append((new StringBuilder("Total edges: ")).append(dt[toggle].getEdges().size()).append("\n").toString());
+         log.append((new StringBuilder("Total faces: ")).append(dt[toggle].getFaces().size()).append("\n").toString());
+         int eulerNumber = (dt[toggle].getFaces().size() - dt[toggle].getEdges().size()) + disp[toggle].numPoints();
+         log.append((new StringBuilder("Euler number: ")).append(eulerNumber).append("\n").toString());
+         log.append((new StringBuilder("No. of Delaunay tests: ")).append(DT.counter2).append("\n").toString());
+         log.append((new StringBuilder("Mesure Mean: ")).append(dt[toggle].getMeasureMean()).append(" \n").toString());
+         log.append((new StringBuilder("Mesure Median: ")).append(dt[toggle].getMeasureMedian()).append(" \n").toString());
+         log.append("\n");
+         log.append((new StringBuilder("Elapsed time: ")).append(time).append(" msec\n").toString());
+         log.append("\n");
+         for(int i = 0; i < 4; i++)
+             disp[i].enableAdding(true);
+
+         disp[toggle].repaint();
+         running = false;
+         waiting = true;
+     } while(true);
+ }
+
+ boolean running;
+ boolean waiting;
+ int counter;
+ boolean canAddPoints;
+ File fileImage;
+ int rnd;
+ int rank;
+ int rank2;
+ int toggle;
+ int toggle1;
+ int toggle2;
+ int toggle3;
+ int toggleBin;
+ long startTime;
+ long endTime;
+ long time;
+ double angle;
+ double epsilon;
+ private Thread myThread;
+ Neighbor[] load; 
+ Vertex sites[];
+ Vertex sitesBin[];
+ DelaunayTriangulator dt[];
+ Display disp[];
+ JSlider slider;
+ JSlider slider_opacity;
+ Button b1;
+ Button b2;
+ Button b3;
+ Button bComp;
+ Button b6;
+ Button bE;
+ TextField tOrdre;
+ TextField tOrdre2;
+ Button bD;
+ Button bDFuzzy;
+ Button b4;
+// Button b5;
+ Button b7;
+ //Button b8;
+ //Button i7;
+ Button i8;
+ Button bC;
+// Button bConv;
+ Button bInter;
+ TextField t0;
+ TextField t1;
+ TextField t2;
+ TextField t3;
+ TextField t4;
+ TextField t8;
+ TextField tvoid;
+ TextArea log;
+ Panel p1;
+ Panel p2;
+ Panel p3;
+ Panel p4;
+ double minx; 
+ double miny;
+ double maxx;
+ double maxy; 
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Arcs.java b/src/main/java/plugins/ragini/voronoidiagram/Arcs.java
new file mode 100644
index 0000000..6ed041f
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Arcs.java
@@ -0,0 +1,33 @@
+package plugins.ragini.voronoidiagram;
+
+public class Arcs {
+
+	private int id;
+	private float dist;
+	private Arcs next;
+	
+	public void setID(int i) {
+		id = i;
+	}
+	
+	public void setDist(float d) {
+		dist = d;
+	}
+	
+	public void setNext(Arcs a) {
+		next = a; 
+	}
+	
+	public Arcs next() {
+		return next; 
+	}
+	
+	public float dist() {
+		return dist; 
+	}
+	
+	public int id() {
+		return id; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java b/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java
new file mode 100644
index 0000000..9c8ae53
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/ArraySetter.java
@@ -0,0 +1,17 @@
+package plugins.ragini.voronoidiagram;
+
+public class ArraySetter implements Setter<NVert []> {
+
+	private NVert [] var; 
+	
+	@Override
+	public void set(NVert [] input) {
+		var = input; 
+	}
+
+	@Override
+	public NVert [] get() {
+		return var; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Circ.java b/src/main/java/plugins/ragini/voronoidiagram/Circ.java
new file mode 100644
index 0000000..77a21c1
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Circ.java
@@ -0,0 +1,33 @@
+package plugins.ragini.voronoidiagram;
+
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+public class Circ {
+	
+	private Point2D center;
+	private double radius; 
+	private Point2D corner; 
+	private double width; 
+	private Rectangle2D rec; 
+	
+	public Circ(Point2D c, double r) {
+		center = c;
+		radius = r; 
+		width = r*2; 
+		corner = new Point2D.Double(center.getX()-r, center.getY()-r); 
+		rec = new Rectangle2D.Double(corner.getX(), corner.getY(), width, width); 
+	}
+	
+	public double r() {
+		return radius; 
+	}
+	
+	public Rectangle2D rectangle() {
+		return rec; 
+	}
+	
+	//private float cx, cy, r; 
+	//private int nbr1, nbr2, nbr3;
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Constants.java b/src/main/java/plugins/ragini/voronoidiagram/Constants.java
new file mode 100644
index 0000000..8c296c9
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Constants.java
@@ -0,0 +1,377 @@
+package plugins.ragini.voronoidiagram;
+
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+
+public class Constants {
+	
+	private int maxSites;
+	private int le;
+	private int re; 
+	private int maxVerts;
+	private int maxEdges;
+	private int maxTris; 
+	private int triangulate; 
+	private int rng; 
+	private int vrdebug; 
+	
+	private float vxmin, vxmax, vymin, vymax, vdeltax, vdeltay;
+
+	private Vert[] GLsites, USites, verts;
+	private EdgeS[] vedges;
+	private Tri[] tris;
+	private Tri[] dtris; 
+	
+	private NVert[] chverts, uchverts;
+	private Neighbor [] _sites;
+	private int nsites;
+	private Point2D [][] lines; 
+	private int lineindex; 
+	
+	private int lbnd;       
+	private int bbnd;
+	private int rbnd;
+	private int tbnd;
+	private int PQhashsize;
+	private int nedges;
+	
+	private Site bottomsite;
+	private double sqrt_nsites; 
+	
+	private int edgex;
+	private int edgey; 
+	private int maxbinx;
+	private int maxbiny; 
+	
+	private ArrayList<EdgeRNG> relativeneighbors; 
+	
+	public Constants() {
+		maxSites = 2*4096; 
+		le = 0; 
+		re = 1; 
+		maxVerts = 3*maxSites;
+		maxEdges = 2*maxSites;
+		maxTris = maxEdges; 
+		verts = new Vert[maxVerts]; 
+		vedges = new EdgeS[maxEdges];
+		tris = new Tri[maxTris];
+		chverts = new NVert[maxVerts];
+		uchverts = new NVert[maxVerts]; 
+		lbnd = 0;
+		bbnd = 1;
+		rbnd = 2;
+		tbnd = 3; 
+		triangulate = 0;
+		rng = 0; 
+		vrdebug = 0;  
+		lineindex = 0; 
+	}
+
+	public Vert[] getGLSites() {
+		//System.out.println("retrieving GLsites");
+		return GLsites; 
+	}
+	
+	public int le() {
+		//System.out.println("retrieving le"); 
+		return le; 
+	}
+	
+	public int re() {
+		//System.out.println("retrieving re"); 
+		return re; 
+	}
+	
+	public int nsites() {
+		//System.out.println("retrieving nsites"); 
+		return nsites; 
+	}
+	
+	public void setNSites(int n) {
+		//System.out.println("setting nsites"); 
+		nsites = n; 
+		lines = new Point2D[n*3][2]; 
+	}
+	
+	public NVert[] chverts() {
+		//System.out.println("retrieving chverts"); 
+		return chverts; 
+	}
+	
+	public int triangulate() {
+		//System.out.println("retrieving triangulate"); 
+		return triangulate; 
+	}
+	
+	public EdgeS[] vedges() {
+		//System.out.println("retrieving vedges"); 
+		return vedges; 
+	}
+	
+	public int vrdebug() {
+		//System.out.println("retrieving vrdebug"); 
+		return vrdebug; 
+	}
+	
+	public int maxEdges() {
+		//System.out.println("retrieving maxedges"); 
+		return maxEdges; 
+	}
+	
+	public Vert[] verts() {
+		//System.out.println("retrieving verts"); 
+		return verts; 
+	}
+	
+	public int maxVerts() {
+		//System.out.println("retrieving maxverts"); 
+		return maxVerts; 
+	}
+	
+	public int maxTris() {
+		//System.out.println("retrieving maxtris"); 
+		return maxTris; 
+	}
+	
+	public Tri[] tris() {
+		//System.out.println("retrieving tris"); 
+		return tris; 
+	}
+	
+	public Tri[] dtris() {
+		//System.out.println("retrieving dtris"); 
+		return dtris; 
+	}
+	
+	public void setdtris(Tri [] _dtris) {
+		//System.out.println("setting dtris"); 
+		dtris = _dtris; 
+	}
+	
+	public Neighbor[] sites() {
+		//System.out.println("retrieving sites"); 
+		return _sites; 
+	}
+	
+	public int maxSites() {
+		//System.out.println("retrieving maxsites"); 
+		return maxSites;
+	}
+	
+	public Vert[] USites() {
+		//System.out.println("retrieving usites"); 
+		return USites; 
+	}
+	
+	public NVert[] uchverts() {
+		//System.out.println("retrieving uchverts"); 
+		return uchverts; 
+	}
+	
+	public void setTriangulate(int n) {
+		//System.out.println("setting triangulate"); 
+		triangulate = n; 
+	}
+	
+	public int lbnd() {
+		//System.out.println("retrieving lbnd"); 
+		return lbnd;
+	}
+	
+	public int bbnd() {
+		//System.out.println("retrieving bbnd"); 
+		return bbnd; 
+	}
+	
+	public int rbnd() {
+		//System.out.println("retrieving rbnd"); 
+		return rbnd; 
+	}
+	
+	public int tbnd() {
+		//System.out.println("retrieving tbnd"); 
+		return tbnd; 
+	}
+	
+	public void setvxmin(float m) {
+		//System.out.println("setting vxmin"); 
+		vxmin = m;
+	}
+	
+	public void setvxmax(float m) {
+		//System.out.println("setting vxmax"); 
+		vxmax = m;
+	}
+	
+	public void setvymin(float m) {
+		//System.out.println("setting vymin"); 
+		vymin = m;
+	}
+	
+	public void setvymax(float m) {
+		//System.out.println("setting vymax"); 
+		vymax = m; 
+	}
+	
+	public float vxmin() {
+		//System.out.println("retrieving vxmin"); 
+		return vxmin;
+	}
+	
+	public float vxmax() {
+		//System.out.println("retrieving vxmax"); 
+		return vxmax;
+	}
+	
+	public float vymin() {
+		//System.out.println("retrieving vymin"); 
+		return vymin;
+	}
+	
+	public float vymax() {
+		//System.out.println("retrieving vymax"); 
+		return vymax; 
+	}
+	
+	public float vdeltax() {
+		//System.out.println("retrieving vdeltax"); 
+		return vdeltax; 
+	}
+	
+	public void setBottomSite(Site s) {
+		//System.out.println("setting bottomsite"); 
+		bottomsite = s; 
+	}
+	
+	public Site bottomsite() {
+		//System.out.println("retrieving bottomsite"); 
+		return bottomsite; 
+	}
+	
+	public void setTris(Tri[] tri) {
+		//System.out.println("setting tris"); 
+		tris = tri; 
+	}
+	
+	public void setvdeltax(float d) {
+		//System.out.println("setting vdeltax"); 
+		vdeltax = d;
+	}
+	
+	public void setvdeltay(float d) {
+		//System.out.println("setting vdeltay"); 
+		vdeltay = d; 
+	}
+	
+	public int nedges() {
+		//System.out.println("retrieving nedges"); 
+		return nedges;
+	}
+	
+	public void setnedges(int n) {
+		//System.out.println("setting nedges"); 
+		nedges = n; 
+	}
+	
+	public int PQhashsize() {
+		//System.out.println("retrieving pqhashsize"); 
+		return PQhashsize; 
+	}
+	
+	public float vdeltay() {
+		//System.out.println("retrieving vdeltay"); 
+		return vdeltay; 
+	}
+	
+	public void setsqrtnsites(double n) {
+		//System.out.println("setting sqrtnsites"); 
+		sqrt_nsites = n; 
+	}
+	
+	public double sqrtnsites() {
+		//System.out.println("retrieving sqrtnsites"); 
+		return sqrt_nsites; 
+	}
+	
+	public void setPQhashsize(int n) {
+		PQhashsize = n; 
+	}
+	
+	public void setchverts (NVert[] varray) {
+		chverts = varray; 
+	}
+	
+	public void setUSites(Vert[] sites) {
+		USites = sites; 
+	}
+	
+	public void setGLsites(Vert[] sites) {
+		GLsites = sites; 
+	}
+	
+	public void setSites(Neighbor[] sites){
+		_sites = sites; 
+	}
+	
+	public Point2D[][] lines() {
+		return lines; 
+	}
+	
+	public void setlineindex(int n) {
+		lineindex = n; 
+	}
+	
+	public int lineindex() {
+		return lineindex; 
+	}
+	
+	public int rng() {
+		return rng; 
+	}
+	
+	public void setrng(int r) {
+		rng = r; 
+	}
+	
+	public int getedgex() {
+		return edgex; 
+	}
+	
+	public int getedgey() {
+		return edgey; 
+	}
+	
+	public void setedgex(int n) {
+		edgex = n;
+	}
+	
+	public void setedgey(int n) {
+		edgey = n; 
+	}
+	
+	public int maxbinx() {
+		return maxbinx;
+	}
+	
+	public int maxbiny() {
+		return maxbiny; 
+	}
+	
+	public void setmaxbinx(int b) {
+		maxbinx = b; 
+	}
+	
+	public void setmaxbiny(int b) {
+		maxbiny = b; 
+	}
+	
+	public ArrayList<EdgeRNG> relativeneighbors() {
+		return relativeneighbors; 
+	}
+	
+	public void setrelativeneighbors(ArrayList<EdgeRNG> l) {
+		relativeneighbors = l; 
+	}
+}
+
+
diff --git a/src/main/java/plugins/ragini/voronoidiagram/DT.java b/src/main/java/plugins/ragini/voronoidiagram/DT.java
new file mode 100644
index 0000000..1ccd14f
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/DT.java
@@ -0,0 +1,50 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   DT.java
+
+//Referenced classes of package delaunay:
+//         Vertex, Face
+
+public class DT
+{
+
+ public DT()
+ {
+ }
+
+ public static int nextCoord(int i)
+ {
+     return i != 0 ? 0 : 1;
+ }
+
+ public static final int XAXIS = 0;
+ public static final int YAXIS = 1;
+ public static final int ZAXIS = 2;
+ public static final int ALG_INCODE = 0;
+ public static final int ALG_DEWALL = 1;
+ public static final int ALG_GUIBAS = 2;
+ public static int counter1;
+ public static int counter2;
+ public static int counter3;
+ public static float opacity = 1.0F;
+ public static int type = 1;
+ public static int step = 40;
+ public static double res = 1.0D;
+ public static double jitter = 0.01D;
+ public static double MAX_VALUE;
+ public static double densityParameter = 0.5D;
+ public static Vertex vertexAngle = new Vertex(-1D, -1D);
+ public static int frame;
+ public static Face face_null = new Face();
+ public static Vertex vertex_null = new Vertex(0.0D, 0.0D);
+ public static Vertex vertex_infty;
+
+ static 
+ {
+     MAX_VALUE = 100000D;
+     vertex_infty = new Vertex(MAX_VALUE, MAX_VALUE);
+ }
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java b/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java
new file mode 100644
index 0000000..81c931c
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Delaunay.java
@@ -0,0 +1,121 @@
+package plugins.ragini.voronoidiagram;
+
+public class Delaunay {
+	
+	public Arcs InitArcD() {
+		Arcs item; 
+		
+		item = new Arcs(); 
+		item.setNext(null);
+		item.setID(-1);
+		item.setDist(-1); 
+		return item; 
+		
+	}
+	
+	public void AddArc(Arcs IVert, int v2, float dist, IntSetter nset) {
+		Arcs item = InitArcD();
+		Arcs courant; //does n always have to get set only to 1? 
+		
+		item.setID(v2);
+		item.setDist(dist);
+		
+		if (IVert.next() == null) {
+			IVert.setNext(item);
+			nset.set(1);
+		}
+		else {
+			courant = IVert.next(); 
+			if (courant.dist() > dist) {
+				IVert.setNext(item);
+				item.setNext(courant); 
+				nset.set(1); 
+			}
+			else {
+				while ((courant.next()!=null) && (courant.next().dist() <= dist) && (courant.id() != v2)) {
+					courant = courant.next();
+				}
+				if (courant.id() != v2) {
+					item.setNext(courant.next()); 
+					courant.setNext(item); 
+					nset.set(1); 
+				}
+			}
+		}
+	}
+	
+	public GraphD [] InitGDelaunay(int n) {
+		GraphD [] item;
+		int i; 
+		
+		item = new GraphD [n]; 
+		for(i = 0; i < n; i++) {
+			item[i].setArcs(null);
+			item[i].setNbArcs((short) 0); 
+		}
+		return item; 
+	}
+	
+	public void InsertArc(GraphD[] Graph, int Vertice1, int Vertice2) {
+		float dist;
+		float min;
+		Arcs IVert, Courant, Item; 
+		int n = 0;  
+		IntSetter nset = new IntSetter(n); 
+		
+		dist = (float) Math.sqrt((Graph[Vertice1].pt().X() - Graph[Vertice2].pt().X()) * (Graph[Vertice1].pt().X()-Graph[Vertice2].pt().X()) + (Graph[Vertice1].pt().Y() - Graph[Vertice2].pt().Y()) * (Graph[Vertice1].pt().Y()- Graph[Vertice2].pt().Y())); 
+		if (Graph[Vertice1].arcs() == null) {
+			IVert = InitArcD();
+			
+			AddArc(IVert, Vertice2, dist, nset);
+			n = nset.get(); 
+			Graph[Vertice1].setArcs(IVert); 
+			Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); //does this cast work?  
+		}
+		else {
+			IVert = Graph[Vertice1].arcs();
+			
+			if (IVert.next().dist() > dist) {
+				Item = InitArcD();
+				Item.setID(Vertice2); 
+				Item.setDist(dist);
+				Item.setNext(IVert.next()); 
+				Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + 1)); 
+				Graph[Vertice1].arcs().setNext(Item); 
+			}
+			else {
+				AddArc(IVert, Vertice2, dist, nset); //or, maybe could have it return the number of new arcs? 
+				n = nset.get();
+				Graph[Vertice1].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); 
+			}
+		}
+		
+		if(Graph[Vertice2].arcs() == null) {
+			IVert = InitArcD();
+			AddArc(IVert, Vertice1, dist, nset);
+			n = nset.get();
+			Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); 
+			Graph[Vertice2].setArcs(IVert); 
+		}
+		else {
+			IVert = Graph[Vertice2].arcs();
+			
+			if (IVert.next().dist() > dist) { 
+				Courant = IVert;
+				Item = InitArcD();
+				Item.setID(Vertice1);
+				Item.setDist(dist);
+				Item.setNext(IVert.next()); 
+				Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + 1));
+				Graph[Vertice2].arcs().setNext(Item);
+			}
+			else {
+				AddArc(IVert, Vertice1, dist, nset);
+				n = nset.get();
+				Graph[Vertice2].setNbArcs((short) (Graph[Vertice1].nbarcs() + n)); 
+			}
+		}
+		
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java b/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java
new file mode 100644
index 0000000..b35b7da
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/DelaunayTriangulator.java
@@ -0,0 +1,581 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   DelaunayTriangulator.java
+
+import java.io.PrintStream;
+import java.util.*;
+
+//Referenced classes of package delaunay:
+//         DT, Face, QuadEdge, AFL, 
+//         UniformGrid, Display, Vertex
+
+public class DelaunayTriangulator
+{
+
+ public DelaunayTriangulator()
+ {
+     faces = new Vector();
+     edges = new Vector();
+     radiusMean = 0.0D;
+     DT.counter1 = 0;
+     DT.counter2 = 0;
+     DT.counter3 = 0;
+ }
+
+ public void resetAll()
+ {
+     faces.clear();
+     edges.clear();
+     radiusMean = 0.0D;
+     DT.counter1 = 0;
+     DT.counter2 = 0;
+     DT.counter3 = 0;
+ }
+
+ private void ajouterFace(Face f)
+ {
+     faces.addElement(f);
+     DT.counter3++;
+ }
+
+ public Enumeration extractFaces()
+ {
+     return faces.elements();
+ }
+
+ public Vector getFaces()
+ {
+     return faces;
+ }
+
+ public void setMeasure()
+ {
+     Enumeration listing = extractFaces();
+     Vector auxV = new Vector();
+     double measureMean = 0.0D;
+     int count = 0;
+     while(listing.hasMoreElements()) 
+     {
+         Face f = (Face)listing.nextElement();
+         double rad = f.getMeasure();
+         if(rad < DT.MAX_VALUE)
+         {
+             count++;
+             auxV.add(new Double(rad));
+             measureMean += rad;
+         }
+     }
+     double aux[] = new double[auxV.size()];
+     for(int i = 0; i < count; i++)
+         aux[i] = ((Double)auxV.get(i)).doubleValue();
+
+     Arrays.sort(aux);
+     measureMedian = aux[count / 2];
+     this.measureMean = measureMean / (double)count;
+ }
+
+ public void setRadius()
+ {
+     Enumeration listing = extractFaces();
+     Vector auxV = new Vector();
+     double radiusMean = 0.0D;
+     int count = 0;
+     while(listing.hasMoreElements()) 
+     {
+         Face f = (Face)listing.nextElement();
+         double rad = f.getInvRadius();
+         if(rad < DT.MAX_VALUE)
+         {
+             count++;
+             auxV.add(new Double(rad));
+             radiusMean += rad;
+         }
+     }
+     double aux[] = new double[auxV.size()];
+     for(int i = 0; i < count; i++)
+         aux[i] = ((Double)auxV.get(i)).doubleValue();
+
+     Arrays.sort(aux);
+     radiusMedian = aux[count / 2];
+     this.radiusMean = radiusMean / (double)count;
+ }
+
+ public void setSize()
+ {
+     Enumeration listing = extractFaces();
+     Vector auxV = new Vector();
+     double sizeMean = 0.0D;
+     int count = 0;
+     while(listing.hasMoreElements()) 
+     {
+         Face f = (Face)listing.nextElement();
+         double size = f.getInvSize();
+         if(size < DT.MAX_VALUE)
+         {
+             count++;
+             auxV.add(new Double(size));
+             sizeMean += size;
+         }
+     }
+     double aux[] = new double[auxV.size()];
+     for(int i = 0; i < count; i++)
+         aux[i] = ((Double)auxV.get(i)).doubleValue();
+
+     Arrays.sort(aux);
+     sizeMedian = aux[count / 2];
+     this.sizeMean = sizeMean / (double)count;
+ }
+
+ public double getRadiusMean()
+ {
+     return radiusMean;
+ }
+
+ public double getRadiusMedian()
+ {
+     return radiusMedian;
+ }
+
+ public double getSizeMean()
+ {
+     return sizeMean;
+ }
+
+ public double getSizeMedian()
+ {
+     return sizeMedian;
+ }
+
+ public double getMeasureMean()
+ {
+     return measureMean;
+ }
+
+ public double getMeasureMedian()
+ {
+     return measureMedian;
+ }
+
+ public double getThresholdOpt()
+ {
+     return measureMedian * DT.densityParameter;
+ }
+
+ public Vector getEdges()
+ {
+     return edges;
+ }
+
+ public Enumeration extractEdges()
+ {
+     return edges.elements();
+ }
+
+ private void extractEdges(QuadEdge edge)
+ {
+     DT.counter1 = 0;
+     extractEdges(edge, 0x7fffffff);
+     edges.clear();
+     Stack stk = new Stack();
+     int counter = -1;
+     stk.push(edge);
+     while(!stk.isEmpty()) 
+     {
+         QuadEdge e = (QuadEdge)stk.pop();
+         if(e.getCounter() != counter)
+         {
+             DT.counter1++;
+             if(e.isCanonical())
+                 edges.add(e);
+             else
+                 edges.add(e.sym());
+         }
+         e.setCounter(counter);
+         e.sym().setCounter(counter);
+         if(e.onext().getCounter() != counter)
+             stk.push(e.onext());
+         if(e.sym().onext().getCounter() != counter)
+             stk.push(e.sym().onext());
+     }
+ }
+
+ public Enumeration extractEdges(QuadEdge edge, int counter)
+ {
+     Vector edges = new Vector();
+     Stack stk = new Stack();
+     stk.push(edge);
+     while(!stk.isEmpty()) 
+     {
+         QuadEdge e = (QuadEdge)stk.pop();
+         if(e.getCounter() < counter)
+             if(e.isCanonical())
+                 edges.add(e);
+             else
+                 edges.add(e.sym());
+         e.setCounter(counter);
+         e.sym().setCounter(counter);
+         if(e.onext().getCounter() < counter)
+             stk.push(e.onext());
+         if(e.sym().onext().getCounter() < counter)
+             stk.push(e.sym().onext());
+     }
+     return edges.elements();
+ }
+
+ private QuadEdge putEdge(QuadEdge e, double med, int coord, AFL left, AFL center, AFL right)
+ {
+     int i = e.type(med, coord);
+     QuadEdge qe;
+     if(i < 0)
+         qe = left.putTest(e);
+     else
+     if(i == 0)
+         qe = center.putTest(e);
+     else
+         qe = right.putTest(e);
+     return qe;
+ }
+
+ public QuadEdge inCoDeTotal(Display disp, Vertex sites[], Vertex sitesBin[])
+ {
+     QuadEdge tri = inCoDe(disp, sites);
+     extractEdges(tri);
+     constructDual();
+     return tri;
+ }
+
+ public QuadEdge inCoDe(Display disp, Vertex sites[])
+ {
+     UniformGrid grid = new UniformGrid(sites, sites.length);
+     AFL list = new AFL();
+     AFL list_aux = new AFL();
+     System.out.println("Debut inCode");
+     disp.setQuadEdge(null);
+     disp.setRange(0.0D, 0.0D, 1.0D, 1.0D);
+     disp.setCenterAFL(list);
+     disp.setTriangles(faces);
+     disp.setEdges(edges);
+     disp.breakBig();
+     int count = 0;
+     Vertex seed = new Vertex(grid.XMin() + grid.XSize() / 2D, grid.YMin() + grid.YSize() / 2D);
+     Vertex A = grid.findNearestPoint(seed);
+     Vertex B = grid.findNearestPoint(A);
+     Vertex C = grid.findDelaunayPoint(A, B);
+     if(C == null)
+         C = grid.findDelaunayPoint(B, A);
+     if(C == null)
+         return QuadEdge.makeEdge(A, B);
+     Vertex S = Vertex.findCenter(A, B, C);
+     double rad = Vertex.distance(S, A);
+     disp.setCircle(S, rad);
+     disp.setTriangle(A, B, C);
+     if(Vertex.ccw(A, B, C))
+     {
+         Vertex pom = B;
+         B = C;
+         C = pom;
+     }
+     QuadEdge a = QuadEdge.makeEdge(A, B);
+     QuadEdge b = QuadEdge.makeEdge(B, C);
+     a.sym().splice(b);
+     QuadEdge c = QuadEdge.connect(b, a);
+     QuadEdge tri = a;
+     disp.setQuadEdge(tri);
+     list.put(a);
+     list.put(b);
+     list.put(c);
+     Face f = new Face(a, b, c);
+     ajouterFace(f);
+     a.setFace(f);
+     b.setFace(f);
+     c.setFace(f);
+     disp.breakBig();
+     for(; !list.isEmpty(); disp.breakBig())
+     {
+         count++;
+         a = list.extract();
+         QuadEdge olda = list_aux.putTest(a);
+         if(olda != null)
+             System.out.println("InCode deja traite");
+         A = a.orig();
+         B = a.dest();
+         C = grid.findDelaunayPoint(A, B);
+         if(C != null && olda == null)
+         {
+             S = Vertex.findCenter(A, B, C);
+             rad = Vertex.distance(S, A);
+             disp.setCircle(S, rad);
+             disp.setTriangle(A, B, C);
+             b = QuadEdge.makeEdge(A, C);
+             c = QuadEdge.makeEdge(C, B);
+             f = null;
+             QuadEdge oldb = list.putTest(b);
+             QuadEdge oldc = list.putTest(c);
+             if(oldb == null && oldc == null)
+             {
+                 a.splice(b);
+                 a.lnext().splice(c.sym());
+                 b.sym().splice(c);
+                 f = new Face(a.sym(), b, c);
+                 b.setFace(f);
+                 c.setFace(f);
+             } else
+             if(oldb == null)
+             {
+                 a.splice(b);
+                 if(oldc.lnext() != b.sym())
+                     oldc.lnext().splice(b.sym());
+                 if(oldc.onext() != a.sym())
+                 {
+                     oldc.lnext().splice2(b.lnext());
+                     oldc.splice2(a.sym());
+                 }
+                 f = new Face(a.sym(), b, oldc.sym());
+                 b.setFace(f);
+                 oldc.sym().setFace(f);
+             } else
+             if(oldc == null)
+             {
+                 if(a.lnext() != c.sym())
+                     a.lnext().splice(c.sym());
+                 oldb.splice(c);
+                 if(a.onext() != oldb.sym())
+                 {
+                     oldb.lnext().splice2(a.sym().rprev());
+                     a.splice2(oldb.sym());
+                 }
+                 f = new Face(a.sym(), oldb.sym(), c);
+                 oldb.sym().setFace(f);
+                 c.setFace(f);
+             } else
+             {
+                 if(a.onext() != oldb.sym())
+                     a.splice2(oldb.sym());
+                 if(oldb.onext() != oldc.sym())
+                 {
+                     oldc.lnext().splice2(oldb.sym().rprev());
+                     oldb.splice2(oldc.sym());
+                 }
+                 f = new Face(a.sym(), oldb.sym(), oldc.sym());
+                 oldb.sym().setFace(f);
+                 oldc.sym().setFace(f);
+             }
+             a.sym().setFace(f);
+             ajouterFace(f);
+         }
+     }
+
+     disp.setCircle(null, 0.0D);
+     disp.setTriangle(null, null, null);
+     System.out.println((new StringBuilder("Fin inCode : ")).append(count).append(" passages\n").toString());
+     return tri;
+ }
+
+ private void constructDual()
+ {
+     for(Enumeration listing = extractEdges(); listing.hasMoreElements();)
+     {
+         QuadEdge e = (QuadEdge)listing.nextElement();
+         QuadEdge r = e.rot();
+         r.setData(e.rightFace().getBary());
+         if(e.sym().rightFace() != null)
+             r.sym().setData(e.sym().rightFace().getBary());
+     }
+
+ }
+
+ private void setFacesV8_bin(Vertex sitesBin[])
+ {
+     Enumeration listing = extractFaces();
+     if(sitesBin.length == 0)
+     {
+         double alpha = getThresholdOpt();
+         while(listing.hasMoreElements()) 
+         {
+             Face f = (Face)listing.nextElement();
+             if(f.getMeasure() > alpha)
+                 f.setVal(1.0F);
+             else
+                 f.setVal(0.0F);
+         }
+     } else
+     {
+         while(listing.hasMoreElements()) 
+         {
+             Face f = (Face)listing.nextElement();
+             f.setVal(0.0F);
+             for(int i = 0; i < sitesBin.length; i++)
+                 if(f.contains(sitesBin[i]) == 1)
+                     f.setVal(1.0F);
+
+         }
+     }
+ }
+
+ private void setFacesV8_erode()
+ {
+     float e;
+     Face f;
+     for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setValAux(e))
+     {
+         e = 1.0F;
+         f = (Face)listing.nextElement();
+         for(Iterator iter = f.extractFacesVoisines(); iter.hasNext();)
+         {
+             Face ff = (Face)iter.next();
+             e = Math.min(e, ff.getVal());
+         }
+
+     }
+
+     for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(f.getValAux()))
+         f = (Face)listing.nextElement();
+
+ }
+
+ private void setFacesV8_dilate(double angle, double epsilon, int ordre)
+ {
+     float e;
+     Face f;
+     for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setValAux(e))
+     {
+         e = 0.0F;
+         f = (Face)listing.nextElement();
+         for(Iterator iter = f.extractFacesVoisines(angle, epsilon); iter.hasNext();)
+         {
+             Face ff = (Face)iter.next();
+             e = Math.max(e, Math.max(f.getVal(), (ff.getVal() + (1.0F - (float)ordre / (float)DT.step)) - 1.0F));
+         }
+
+     }
+
+     for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(f.getValAux()))
+         f = (Face)listing.nextElement();
+
+ }
+
+ private void setEdgesV8()
+ {
+     for(Enumeration listing = extractEdges(); listing.hasMoreElements();)
+     {
+         QuadEdge e = (QuadEdge)listing.nextElement();
+         if(e.sym().rightFace() != null)
+         {
+             e.setLambda(Math.min(e.rightFace().getVal(), e.sym().rightFace().getVal()));
+             e.setMu(Math.max(e.rightFace().getVal(), e.sym().rightFace().getVal()));
+             e.sym().setLambda(Math.min(e.rightFace().getVal(), e.sym().rightFace().getVal()));
+             e.sym().setMu(Math.max(e.rightFace().getVal(), e.sym().rightFace().getVal()));
+         } else
+         {
+             e.setLambda(1.0F - e.rightFace().getVal());
+             e.setMu(e.rightFace().getVal());
+             e.sym().setLambda(1.0F - e.rightFace().getVal());
+             e.sym().setMu(e.rightFace().getVal());
+         }
+     }
+
+ }
+
+ public void constructBin(Vertex sitesBin[])
+ {
+     setFacesV8_bin(sitesBin);
+     setEdgesV8();
+ }
+
+ public void constructErode()
+ {
+     setFacesV8_erode();
+     setEdgesV8();
+ }
+
+ public void constructDilate(double angle, double epsilon)
+ {
+     setFacesV8_dilate(angle, epsilon, 0);
+     setEdgesV8();
+ }
+
+ public void constructFuzzyDilate(double angle, double epsilon)
+ {
+     for(int k = 0; k < DT.step + 1; k++)
+         setFacesV8_dilate(angle, epsilon, k);
+
+     setEdgesV8();
+ }
+
+ public void constructInter(DelaunayTriangulator dt1, DelaunayTriangulator dt2)
+ {
+     Enumeration listing = extractFaces();
+     Enumeration listing1 = dt1.extractFaces();
+     Face f;
+     Face f1;
+     Face f2;
+     for(Enumeration listing2 = dt2.extractFaces(); listing.hasMoreElements() && listing1.hasMoreElements() && listing2.hasMoreElements(); f.setVal(Math.min(f1.getVal(), f2.getVal())))
+     {
+         f = (Face)listing.nextElement();
+         f1 = (Face)listing1.nextElement();
+         f2 = (Face)listing2.nextElement();
+     }
+
+     setEdgesV8();
+ }
+
+ public void constructUnion(DelaunayTriangulator dt1, DelaunayTriangulator dt2)
+ {
+     Enumeration listing = extractFaces();
+     Enumeration listing1 = dt1.extractFaces();
+     Face f;
+     Face f1;
+     Face f2;
+     for(Enumeration listing2 = dt2.extractFaces(); listing.hasMoreElements() && listing1.hasMoreElements() && listing2.hasMoreElements(); f.setVal(Math.max(f1.getVal(), f2.getVal())))
+     {
+         f = (Face)listing.nextElement();
+         f1 = (Face)listing1.nextElement();
+         f2 = (Face)listing2.nextElement();
+     }
+
+     setEdgesV8();
+ }
+
+ public void constructComp()
+ {
+     Face f;
+     for(Enumeration listing = extractFaces(); listing.hasMoreElements(); f.setVal(1.0F - f.getVal()))
+         f = (Face)listing.nextElement();
+
+     setEdgesV8();
+ }
+
+ public void expliciter()
+ {
+     Enumeration listing = extractEdges();
+     System.out.println((new StringBuilder("Enumeration des ")).append(getEdges().size()).append(" edges ").toString());
+     QuadEdge e;
+     for(; listing.hasMoreElements(); e.expliciter())
+     {
+         e = (QuadEdge)listing.nextElement();
+         System.out.println((new StringBuilder()).append(e).append(" Associ\357\277\275 aux triangles ").append(e.rightFace()).append(" ").append(e.sym().rightFace()).toString());
+     }
+
+     listing = extractFaces();
+     System.out.println((new StringBuilder("Enumeration des ")).append(getFaces().size()).append(" faces").toString());
+     Face f;
+     for(; listing.hasMoreElements(); f.extractFacesVoisines())
+     {
+         f = (Face)listing.nextElement();
+         System.out.println(f);
+     }
+
+ }
+
+ private Vector faces;
+ private Vector edges;
+ private double radiusMean;
+ private double radiusMedian;
+ private double measureMean;
+ private double measureMedian;
+ private double sizeMean;
+ private double sizeMedian;
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Display.java b/src/main/java/plugins/ragini/voronoidiagram/Display.java
new file mode 100644
index 0000000..497769d
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Display.java
@@ -0,0 +1,791 @@
+package plugins.ragini.voronoidiagram;
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   Display.java
+
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+import java.io.*;
+import java.util.*;
+import javax.imageio.ImageIO;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+
+//Referenced classes of package delaunay:
+//         Vertex, QuadEdge, Face, DT, 
+//         UniformGrid, DelaunayTriangulator, AFL
+
+public class Display extends Canvas
+ implements MouseListener
+{
+
+ public void dimensionize()
+ {
+     w = getWidth();
+     h = getHeight();
+     ss = Math.min((double)w / xsize, (double)h / ysize);
+     ss_int = Math.min(w, h);
+     setSize(ss_int, ss_int);
+ }
+
+ synchronized void run(int mode)
+ {
+     playmode = mode;
+     stopped = false;
+ }
+
+ synchronized void stop()
+ {
+     stopped = true;
+ }
+
+ void breakSmall()
+ {
+     if(playmode == 1)
+         stopped = true;
+     if(stopped)
+     {
+         repaint();
+         while(stopped) ;
+     }
+ }
+
+ void breakBig()
+ {
+     if(playmode == 1 || playmode == 2)
+         stopped = true;
+     if(stopped)
+     {
+         repaint();
+         while(stopped) ;
+     }
+ }
+
+ Display(DelaunayTriangulator dt)
+ {
+     this.dt = null;
+     ug = null;
+     center = null;
+     left = null;
+     right = null;
+     tri = null;
+     triangles = null;
+     edges = null;
+     S = null;
+     A = null;
+     B = null;
+     C = null;
+     sites = null;
+     Q = null;
+     Q1 = null;
+     Q2 = null;
+     Q3 = null;
+     frame = 1;
+     coord = -1;
+     rank = 1;
+     rank2 = 1;
+     loadImage = false;
+     pts = new Vector();
+     ptsBin = new Vector();
+     canAdd = false;
+     xoff = 0.0D;
+     yoff = 0.0D;
+     xsize = 1.0D;
+     ysize = 1.0D;
+     ss = 1.0D;
+     sx = 1.0D;
+     ssy = 1.0D;
+     x0 = 0;
+     y0 = 0;
+     w = 400;
+     h = 400;
+     ss_int = 1;
+     stopped = false;
+     playmode = 0;
+     enabled = new boolean[19];
+     this.dt = dt;
+     resetAll(true);
+     setBackground(Color.white);
+     addMouseListener(this);
+     dimensionize();
+ }
+
+ public void setRank(int rank)
+ {
+     this.rank = rank;
+ }
+
+ public void setRank2(int rank2)
+ {
+     this.rank2 = rank2;
+ }
+
+ public void addPoint(Vertex v)
+ {
+     if(enabled[18])
+         ptsBin.add(v);
+     else
+         pts.add(v);
+ }
+
+ public void clearPoints()
+ {
+     pts.clear();
+     ptsBin.clear();
+     image = null;
+     loadImage = false;
+ }
+
+ public int numPoints()
+ {
+     return pts.size();
+ }
+
+ public Vertex[] getPoints()
+ {
+     Vertex sites[] = new Vertex[pts.size()];
+     pts.copyInto(sites);
+     return sites;
+ }
+
+ public void setPoints(Vertex sites[])
+ {
+     pts.clear();
+     for(int i = 0; i < sites.length; i++)
+         pts.add(sites[i]);
+
+ }
+
+ public Vertex[] getPointsBin()
+ {
+     Vertex sites[] = new Vertex[ptsBin.size()];
+     ptsBin.copyInto(sites);
+     return sites;
+ }
+
+ public void loadPoints(int n, double oldminx, double oldminy, double oldmaxx, 
+         double oldmaxy, Neighbor[] sites)
+ {
+     pts.clear();
+     for(Neighbor s: sites)  
+     {
+    	 double x = s.getCoord().X(); 
+    	 double newx = (((x - oldminx) * (1))/(oldmaxx - oldminx)); 
+    	 double y = s.getCoord().Y();
+    	 double newy = (((y - oldminy) * (1))/(oldmaxy - oldminy)); 
+         pts.add(new Vertex(newx, newy, pts.size()));
+     }
+
+ }
+
+ public void enableAdding(boolean flag)
+ {
+     canAdd = flag;
+ }
+
+ public void mouseClicked(MouseEvent mouseevent)
+ {
+ }
+
+ public void mouseReleased(MouseEvent mouseevent)
+ {
+ }
+
+ public void mouseEntered(MouseEvent mouseevent)
+ {
+ }
+
+ public void mouseExited(MouseEvent mouseevent)
+ {
+ }
+
+ public void mousePressed(MouseEvent e)
+ {
+     e.consume();
+     if(canAdd)
+     {
+         Vertex v = new Vertex((double)(e.getX() - x0) / ss + xoff, (double)(e.getY() - y0) / ss + yoff, pts.size());
+         addPoint(v);
+         setSites(getPoints());
+         repaint();
+     }
+ }
+
+ public void show(int flag)
+ {
+     enabled[flag] = true;
+ }
+
+ public void hide(int flag)
+ {
+     enabled[flag] = false;
+ }
+
+ public void swap(int flag)
+ {
+     if(!enabled[flag])
+         enabled[flag] = true;
+     else
+         enabled[flag] = false;
+ }
+
+ public void setRange(double xo, double yo, double xs, double ys)
+ {
+     xoff = xo;
+     yoff = yo;
+     xsize = xs;
+     ysize = ys;
+     ss = Math.min((double)w / xsize, (double)h / ysize);
+ }
+
+ public void setWindow(int xleft, int yleft, int width, int height)
+ {
+     x0 = xleft;
+     y0 = yleft;
+     w = width;
+     h = height;
+     ss = Math.min((double)w / xsize, (double)h / ysize);
+ }
+
+ int xconv(double x)
+ {
+     return (int)((x - xoff) * ss) + x0;
+ }
+
+ int yconv(double y)
+ {
+     return (int)((y - yoff) * ss) + y0;
+ }
+
+ int dconv(double x)
+ {
+     return (int)(x * ss);
+ }
+
+ public void setCenterAFL(AFL c)
+ {
+     center = c;
+ }
+
+ public void setLeftAFL(AFL l)
+ {
+     left = l;
+ }
+
+ public void setRightAFL(AFL r)
+ {
+     right = r;
+ }
+
+ public void setTriangulation(AFL t)
+ {
+     tri = t;
+ }
+
+ public void setGrid(UniformGrid u)
+ {
+     ug = u;
+ }
+
+ public void setCircle(Vertex c, double r)
+ {
+     S = c;
+     rad = r;
+ }
+
+ public void setTriangle(Vertex a, Vertex b, Vertex c)
+ {
+     A = a;
+     B = b;
+     C = c;
+ }
+
+ public void setSites(Vertex ss[])
+ {
+     sites = ss;
+ }
+
+ public void setSplittingLine(int c, double m)
+ {
+     coord = c;
+     med = m;
+ }
+
+ public void setQuadEdge(QuadEdge q)
+ {
+     Q = q;
+ }
+
+ public void setQuadEdge3(QuadEdge q1, QuadEdge q2, QuadEdge q3)
+ {
+     Q1 = q1;
+     Q2 = q2;
+     Q3 = q3;
+ }
+
+ public void setTriangles(Vector triangles)
+ {
+     this.triangles = triangles;
+ }
+
+ public void setEdges(Vector edges)
+ {
+     this.edges = edges;
+ }
+
+ public void resetAll(boolean flag)
+ {
+     ug = null;
+     center = left = right = null;
+     tri = null;
+     S = null;
+     A = B = C = null;
+     sites = null;
+     coord = -1;
+     Q = null;
+     Q1 = Q2 = Q3 = null;
+     rank = 1;
+     if(flag)
+     {
+         for(int i = 0; i < 19; i++)
+             enabled[i] = false;
+
+     }
+ }
+
+ private void dessineMesh(Graphics g)
+ {
+     float surface = 0.0F;
+     if(enabled[17])
+     {
+         System.out.println("Mode Contour");
+         g.setColor(Color.green);
+         for(Enumeration listing = edges.elements(); listing.hasMoreElements();)
+         {
+             QuadEdge e = (QuadEdge)listing.nextElement();
+             QuadEdge e_sym = e.sym();
+             if(e.getMu() >= 1.0F && e.getLambda() == 0.0F)
+             {
+                 float grey = (float)Math.min(1.0D, e.getMu());
+                 grey = 1.0F - grey;
+                 g.setColor(new Color(grey, grey, grey));
+                 Graphics2D g2 = (Graphics2D)g;
+                 g2.setStroke(new BasicStroke(3F));
+                 g2.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e_sym.orig().x), yconv(e_sym.orig().y));
+                 g2.setStroke(new BasicStroke(1.0F));
+             }
+         }
+
+     } else
+     {
+         System.out.println("Mode Region");
+         for(Enumeration listing = triangles.elements(); listing.hasMoreElements();)
+         {
+             Face f = (Face)listing.nextElement();
+             QuadEdge list_edges[] = new QuadEdge[3];
+             list_edges = f.getEdges();
+             int x[] = new int[3];
+             int y[] = new int[3];
+             for(int i = 0; i < 3; i++)
+             {
+                 x[i] = xconv(list_edges[i].orig().x);
+                 y[i] = yconv(list_edges[i].orig().y);
+             }
+
+             if(f.getVal() > 0.0F && f.getVal() <= 1.0F)
+             {
+                 float grey = f.getVal();
+                 surface = (float)((double)surface + 1.0D / f.getMeasure());
+                 g.setColor(new Color(grey, grey, grey, DT.opacity));
+                 g.fillPolygon(x, y, 3);
+                 g.setColor(Color.BLACK);
+                 g.drawPolygon(x, y, 3);
+             }
+         }
+
+     }
+     System.out.println(surface);
+ }
+
+ public void paint(Graphics g)
+ {
+     dimensionize();
+     getGraphics().setColor(Color.BLACK);
+     getGraphics().drawRect(1, 1, ss_int - 2, ss_int - 2);
+     setWindow(0, 0, w, h);
+     setVisible(true);
+     if(image != null)
+         g.drawImage(image, 0, 0, ss_int, ss_int, this);
+     
+     g.setPaintMode();
+     if(triangles != null)
+         dessineMesh(g);
+     if(ug != null && enabled[0])
+     {
+         g.setColor(Color.lightGray);
+         g.fillRect(xconv(ug.XMin()), yconv(ug.YMin()), dconv(ug.XSize()), dconv(ug.YSize()));
+     }
+     if(pts != null && enabled[10])
+     {
+         g.setColor(Color.BLACK);
+         for(int i = 0; i < pts.size(); i++)
+         {
+             Vertex v = (Vertex)pts.elementAt(i);
+             g.drawLine(xconv(v.x), yconv(v.y), xconv(v.x), yconv(v.y));
+         }
+
+     }
+     if(ptsBin != null && (enabled[10] || enabled[8]))
+     {
+         g.setColor(Color.BLACK);
+         for(int i = 0; i < ptsBin.size(); i++)
+         {
+             Vertex v = (Vertex)ptsBin.elementAt(i);
+             g.drawLine(xconv(v.x), yconv(v.y), xconv(v.x), yconv(v.y));
+         }
+
+     }
+     if(sites != null && enabled[8])
+     {
+         g.setColor(Color.BLACK);
+         for(int i = 0; i < sites.length; i++)
+             g.drawLine(xconv(sites[i].x), yconv(sites[i].y), xconv(sites[i].x), yconv(sites[i].y));
+
+     }
+     if(coord >= 0 && ug != null && enabled[9])
+     {
+         g.setColor(Color.blue);
+         if(coord == 0)
+             g.drawLine(xconv(med), yconv(ug.YMin()), xconv(med), yconv(ug.YMax()));
+         else
+             g.drawLine(xconv(ug.XMin()), yconv(med), xconv(ug.XMax()), yconv(med));
+     }
+     if(Q != null && enabled[11])
+     {
+         g.setColor(Color.BLACK);
+         QuadEdge qe;
+         for(Enumeration e = dt.extractEdges(Q, frame++); e.hasMoreElements(); g.drawLine(xconv(qe.orig().x), yconv(qe.orig().y), xconv(qe.dest().x), yconv(qe.dest().y)))
+             qe = (QuadEdge)e.nextElement();
+
+     }
+     if(Q != null && enabled[13])
+     {
+         g.setColor(Color.red);
+         for(Enumeration e = dt.extractEdges(Q, frame++); e.hasMoreElements();)
+         {
+             QuadEdge qr = (QuadEdge)e.nextElement();
+             QuadEdge qe = qr.rot();
+             if(qe.orig() != null && qe.dest() != null)
+                 g.drawLine(xconv(qe.orig().x), yconv(qe.orig().y), xconv(qe.dest().x), yconv(qe.dest().y));
+         }
+
+     }
+     if(center != null && enabled[1])
+     {
+         g.setColor(Color.black);
+         for(int i = 0; i < center.size(); i++)
+         {
+             QuadEdge e = center.get(i);
+             g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y));
+         }
+
+     }
+     if(left != null && enabled[2])
+     {
+         g.setColor(Color.green);
+         for(int i = 0; i < left.size(); i++)
+         {
+             QuadEdge e = left.get(i);
+             g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y));
+         }
+
+     }
+     if(right != null && enabled[3])
+     {
+         g.setColor(Color.green);
+         for(int i = 0; i < right.size(); i++)
+         {
+             QuadEdge e = right.get(i);
+             g.drawLine(xconv(e.orig().x), yconv(e.orig().y), xconv(e.dest().x), yconv(e.dest().y));
+         }
+
+     }
+     if(enabled[12])
+     {
+         System.out.println("OK EDGE3");
+         if(Q1 != null)
+         {
+             g.setColor(Color.green);
+             g.drawLine(xconv(Q1.orig().x), yconv(Q1.orig().y), xconv(Q1.dest().x), yconv(Q1.dest().y));
+             g.drawRect(xconv(0.20000000000000001D * Q1.orig().x + 0.80000000000000004D * Q1.dest().x) - 1, yconv(0.20000000000000001D * Q1.orig().y + 0.80000000000000004D * Q1.dest().y) - 1, 3, 3);
+         }
+         if(Q2 != null)
+         {
+             g.setColor(Color.blue);
+             g.drawLine(xconv(Q2.orig().x), yconv(Q2.orig().y), xconv(Q2.dest().x), yconv(Q2.dest().y));
+             g.drawRect(xconv(0.20000000000000001D * Q2.orig().x + 0.80000000000000004D * Q2.dest().x) - 1, yconv(0.20000000000000001D * Q2.orig().y + 0.80000000000000004D * Q2.dest().y) - 1, 3, 3);
+         }
+         if(Q3 != null)
+         {
+             g.setColor(Color.gray);
+             g.drawLine(xconv(Q3.orig().x), yconv(Q3.orig().y), xconv(Q3.dest().x), yconv(Q3.dest().y));
+             g.drawRect(xconv(0.20000000000000001D * Q3.orig().x + 0.80000000000000004D * Q3.dest().x) - 1, yconv(0.20000000000000001D * Q3.orig().y + 0.80000000000000004D * Q3.dest().y) - 1, 3, 3);
+         }
+     }
+     if(A != null && B != null && C != null && enabled[6])
+     {
+         g.setColor(Color.red);
+         g.drawLine(xconv(A.x), yconv(A.y), xconv(B.x), yconv(B.y));
+         g.drawString("A", xconv(A.x), yconv(A.y));
+         g.setColor(Color.pink);
+         g.drawLine(xconv(B.x), yconv(B.y), xconv(C.x), yconv(C.y));
+         g.drawLine(xconv(C.x), yconv(C.y), xconv(A.x), yconv(A.y));
+     }
+     if(S != null && enabled[5])
+     {
+         g.setColor(Color.red);
+         System.out.println((new StringBuilder("rad ")).append(rad).append(" et S ").append(S).toString());
+         g.drawOval(xconv(S.x - rad), yconv(S.y - rad), dconv(2D * rad), dconv(2D * rad));
+     }
+ }
+
+ public void writeImage(File file)
+ {
+     try
+     {
+         Rectangle r = getBounds();
+         Image image = createImage(r.width, r.height);
+         Graphics g = image.getGraphics();
+         paint(g);
+         ImageIO.write((RenderedImage)image, "png", file);
+     }
+     catch(IOException ioe)
+     {
+         ioe.printStackTrace();
+     }
+ }
+
+ public void writePoints(File file)
+ {
+     String filename = file.toString();
+     String ext = filename.substring(filename.lastIndexOf('.') + 1, filename.length());
+     try
+     {
+         if(ext.equals("txt"))
+         {
+             FileWriter fwriter = new FileWriter(filename);
+             BufferedWriter bw = new BufferedWriter(fwriter);
+             for(int i = 0; i < pts.size(); i++)
+             {
+                 bw.write((new StringBuilder(String.valueOf(sites[i].x))).append("\t").append(sites[i].y).toString());
+                 bw.newLine();
+             }
+
+             bw.close();
+         } else
+         {
+             ObjectOutputStream obj_out = new ObjectOutputStream(new FileOutputStream(file));
+             try
+             {
+                 obj_out.writeObject(pts);
+                 obj_out.close();
+             }
+             catch(IOException iox)
+             {
+                 System.out.println("File saving error...");
+                 iox.printStackTrace();
+             }
+         }
+     }
+     catch(FileNotFoundException fnf)
+     {
+         System.out.println("File not found...");
+         fnf.printStackTrace();
+     }
+     catch(Exception fnf)
+     {
+         System.out.println("Exception...");
+         fnf.printStackTrace();
+     }
+ }
+
+ public void loadImage(File file)
+ {
+     String name = file.getAbsolutePath();
+     image = Toolkit.getDefaultToolkit().getImage(name);
+     loadImage = true;
+     repaint();
+ }
+
+ public void loadImage(Image imp)
+ {
+     image = imp;
+     loadImage = true;
+     repaint();
+ }
+
+ public void convertImage()
+ {
+     Random rand = new Random();
+     if(image != null)
+     {
+         BufferedImage bimage = toBufferedImage(image);
+         int rgbs[] = (int[])null;
+         int w = bimage.getWidth();
+         int h = bimage.getHeight();
+         System.out.println((new StringBuilder("w ")).append(w).append(" h ").append(h).toString());
+         rgbs = new int[w * h];
+         bimage.getRGB(0, 0, w, h, rgbs, 0, w);
+         int mask = 255;
+         int count = 0;
+         for(int i = 0; i < h; i++)
+         {
+             for(int j = 0; j < w; j++)
+             {
+                 int rgb = bimage.getRGB(j, i);
+                 int rouge = rgb >> 16 & mask;
+                 int vert = rgb >> 8 & mask;
+                 int bleu = rgb & mask;
+                 if(rouge == 255 && bleu == 0 && vert == 0)
+                 {
+                     int x = (j * this.w) / w;
+                     int y = (i * this.h) / h;
+                     if(canAdd)
+                     {
+                         count++;
+                         Vertex v = new Vertex((double)(x - x0) / ss + xoff + DT.jitter * rand.nextDouble(), (double)(y - y0) / ss + yoff + DT.jitter * rand.nextDouble(), pts.size());
+                         pts.add(v);
+                         setSites(getPoints());
+                         repaint();
+                     }
+                 }
+             }
+
+         }
+
+         System.out.println((new StringBuilder(String.valueOf(count))).append(" points.").toString());
+     } else
+     {
+         JOptionPane.showMessageDialog(new JFrame(), "No loaded image. Please use Load Image", "Dialog", 0);
+     }
+ }
+
+ public void loadPoints(Neighbor[] sites)
+ {
+     //resetAll(true);
+     //clearPoints();
+     pts.clear(); 
+     
+             for(Neighbor s: sites)  
+             {
+            	 if (s == null) 
+            		 System.out.println("null");
+            	 else System.out.println("not null");
+                 pts.add(new Vertex(s.getCoord().X(), s.getCoord().Y(), pts.size()));
+             }
+             //setSites(getPoints());
+             //show(8);
+           
+            // repaint(); 
+        
+   //  enableAdding(true);
+ }
+
+ private BufferedImage toBufferedImage(Image image)
+ {
+     if(image instanceof BufferedImage)
+         return (BufferedImage)image;
+     BufferedImage bimage = null;
+     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+     try
+     {
+         int transparency = 1;
+         GraphicsDevice gs = ge.getDefaultScreenDevice();
+         GraphicsConfiguration gc = gs.getDefaultConfiguration();
+         bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
+     }
+     catch(HeadlessException headlessexception) { }
+     if(bimage == null)
+     {
+         int type = 1;
+         bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
+     }
+     Graphics g = bimage.createGraphics();
+     g.drawImage(image, 0, 0, null);
+     g.dispose();
+     return bimage;
+ }
+
+ Image image;
+ Graphics2D graphic;
+ DelaunayTriangulator dt;
+ UniformGrid ug;
+ AFL center;
+ AFL left;
+ AFL right;
+ AFL tri;
+ Vector triangles;
+ Vector edges;
+ Vertex S;
+ Vertex A;
+ Vertex B;
+ Vertex C;
+ Vertex sites[];
+ QuadEdge Q;
+ QuadEdge Q1;
+ QuadEdge Q2;
+ QuadEdge Q3;
+ int frame;
+ double rad;
+ double med;
+ int coord;
+ int rank;
+ int rank2;
+ boolean loadImage;
+ Vector pts;
+ Vector ptsBin;
+ boolean canAdd;
+ double xoff;
+ double yoff;
+ double xsize;
+ double ysize;
+ double ss;
+ double sx;
+ double ssy;
+ int x0;
+ int y0;
+ int w;
+ int h;
+ int ss_int;
+ boolean stopped;
+ int playmode;
+ public static final int CONTROL_PLAY = 0;
+ public static final int CONTROL_SHORTSTEP = 1;
+ public static final int CONTROL_LONGSTEP = 2;
+ public static final int GRID = 0;
+ public static final int AFLCENTER = 1;
+ public static final int AFLLEFT = 2;
+ public static final int AFLRIGHT = 3;
+ public static final int TRIANGULATION = 4;
+ public static final int CIRCLE = 5;
+ public static final int TRIANGLE = 6;
+ public static final int EDGE1 = 7;
+ public static final int SITES = 8;
+ public static final int SPLITLINE = 9;
+ public static final int POINTVEC = 10;
+ public static final int QUADEDGE = 11;
+ public static final int QUADEDGE3 = 12;
+ public static final int ROT = 13;
+ public static final int ALPHA = 14;
+ public static final int ERODE = 15;
+ public static final int DILATE = 16;
+ public static final int CONTOUR = 17;
+ public static final int BINARIZE = 18;
+ public static final int DUMMY = 19;
+ boolean enabled[];
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Edge.java b/src/main/java/plugins/ragini/voronoidiagram/Edge.java
new file mode 100644
index 0000000..8e522e4
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Edge.java
@@ -0,0 +1,51 @@
+package plugins.ragini.voronoidiagram;
+
+public class Edge {
+	
+	private float a, b, c;
+	private Site[] ep;
+	private Site[] reg;
+	private int edgenbr;
+	
+	public Edge() {
+		ep = new Site[2];
+		reg = new Site[2]; 
+	}
+	
+	public float a() {
+		return a;
+	}
+	
+	public float b() {
+		return b; 
+	}
+	
+	public float c() {
+		return c; 
+	}
+	
+	public Site[] ep() {
+		return ep;
+	}
+	
+	public Site[] reg() {
+		return reg; 
+	}
+	
+	public void seta(double d) {
+		a = (float) d; 
+	}
+	
+	public void setb(double d) {
+		b = (float) d; 
+	}
+	
+	public void setc(double d) {
+		c = (float) d; 
+	}
+	
+	public void setedgenbr(int n) {
+		edgenbr = n; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java
new file mode 100644
index 0000000..1ff58ba
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeL.java
@@ -0,0 +1,8 @@
+package plugins.ragini.voronoidiagram;
+
+public class EdgeL {
+
+	private int id1, id2; 
+	private dkmax maxk; 
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java
new file mode 100644
index 0000000..987e6c4
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeList.java
@@ -0,0 +1,318 @@
+package plugins.ragini.voronoidiagram;
+
+public class EdgeList {
+	
+	private HalfEdge ELleftend, ELrightend;
+	private int ELhashsize;
+	private HalfEdge[] ELhash;
+	
+	private Constants constants; 
+	private VRegion vregion; 
+	
+	public EdgeList(Constants _constants, VRegion reg) {
+		constants = _constants; 
+		vregion = reg; 
+	}
+	
+	public HalfEdge leftend() {
+		return ELleftend;
+	}
+	
+	public HalfEdge rightend() {
+		return ELrightend; 
+	}
+	
+	public void ELinitialize() {
+		//System.out.println("initializing edge list"); 
+		int i; 
+		ELhashsize = (int) (2 * constants.sqrtnsites()); 
+		ELhash = new HalfEdge[ELhashsize]; 
+		//System.out.println("hash size: " + ELhashsize); 
+		for (i = 0; i < ELhashsize; i ++) {
+			ELhash[i] = new HalfEdge(-1); 
+		}
+		
+		ELleftend = HEcreate(null, 0, -1);
+		ELrightend = HEcreate(null, 0, -1);
+		ELleftend.setLeft(null);
+		ELleftend.setRight(ELrightend);
+		ELrightend.setLeft(ELleftend);
+		ELrightend.setRight(null); 
+		ELhash[0] = ELleftend;
+		ELhash[ELhashsize - 1] = ELrightend; 
+	}
+	
+	public HalfEdge HEcreate(Edge e, int pm, int origin) {
+		//System.out.println("creating new halfedge"); 
+		HalfEdge answer;
+		
+		answer = new HalfEdge(origin); 
+		answer.setEdge(e);
+		answer.setPM(pm); 
+		answer.setNext(null);
+		answer.setVertex(null); 
+		answer.setNull(false);  
+		return answer; 
+	}
+	
+	public void ELinsert(HalfEdge lb, HalfEdge newhe) {
+		//if(lb == null) System.out.println("lb null"); 
+		//else if (newhe == null) System.out.println("newhe null"); 
+		//else if (lb.eledge() == null) {System.out.println("lb edge null"); System.out.println("newhe: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c()); }
+		//else System.out.println("inserting: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c() + ", " + "after " + lb.eledge().a() + ", " + lb.eledge().b() + ", " + lb.eledge().c()); 
+		//System.out.println("inserting halfedge"); 
+		newhe.setLeft(lb);
+		newhe.setRight(lb.right());
+		//if (lb.right().eledge() == null) System.out.println("the right of lb is null"); 
+		//else System.out.println(newhe.right().eledge().a() + ", " + newhe.right().eledge().b() + ", " + newhe.right().eledge().c() + " is to the right of: " + newhe.eledge().a() + ", " + newhe.eledge().b() + ", " + newhe.eledge().c());
+		lb.right().setLeft(newhe);
+		lb.setRight(newhe); 
+		if (lb == ELrightend) {ELrightend = newhe;}
+	}
+	
+	public HalfEdge ELgethash(int b) {
+		HalfEdge he; 
+		
+		if(b < 0 || b >= ELhashsize) {
+			return null;
+		}
+		
+		he = ELhash[b]; 
+		//System.out.println("trying bucket: " + b); 
+		//if (he == null) System.out.println("null at bucket: " + b); 
+		if (he.isNull() || !he.isDeleted()) { 
+			return he; 
+		}
+		/* Hash table points to deleted half edge.  Patch as necessary. */
+		ELhash[b] = new HalfEdge(-1); 
+		//some memory stuff, may return null 
+		return null; 
+	}
+	
+	public HalfEdge ELleftbnd(Point p) { 
+		 int i, bucket = 0;
+		 HalfEdge he; 
+		 
+		 bucket = (int) ((p.X() - constants.vxmin())/constants.vdeltax() * ELhashsize); 
+		 //System.out.println("bucket: " + bucket); 
+		 if (bucket < 0)
+			 bucket = 0;
+		 
+		 if (bucket >= ELhashsize) 
+			 bucket = ELhashsize -1; 
+		 
+		 he = ELgethash(bucket); 
+		 if (he.isNull()) {
+			 for (i = 1; true; i ++) {
+				 //fix this for loop 
+				 if (ELgethash(bucket - i) != null) {
+				 if (!(he = ELgethash(bucket - i)).isNull()) {
+					 break;
+				 }}
+				 if (ELgethash(bucket + i) != null) {
+				 if (!(he = ELgethash(bucket + 1)).isNull()) {
+					 break; 
+				 }}
+			 }
+			 
+		 }
+		 
+		 if (he == ELleftend) {
+			 he = he.right(); 
+			 while (he != ELrightend && right_of(he, p)) {
+				 he = he.right(); 
+			 }
+			 he = he.left(); 
+		 } 
+		 
+		 else if (he != ELrightend ) {
+			 if (right_of(he, p)) {
+				 he = he.right(); 
+			 while (he != ELrightend && right_of(he, p)) {
+				 he = he.right(); 
+			 }
+			 he = he.left(); }
+		 }
+		 
+		 else {
+			 he = he.left(); 
+			 while (he != ELleftend && !right_of(he,p)) {
+				 he = he.left(); 
+			 }
+		 }
+		 
+		 if (bucket > 0 && bucket < ELhashsize - 1) {
+			 if (!ELhash[bucket].isNull())
+				 //System.out.println("valid bucket"); 
+			 ELhash[bucket] = he;
+		 }
+		 return he; 
+		 
+	}
+	
+	public boolean right_of(HalfEdge el, Point p) {
+		//returns 1 if p is to the right of halfedge e
+		Edge e;
+		Site topsite;
+		int right_of_site; 
+		boolean above, fast;
+		float dxp, dyp, dxs, t1, t2, t3, y1; 
+		
+		e = el.eledge();
+		topsite = e.reg()[1];
+		right_of_site = (p.X() > topsite.getCoord().X()) ? 1: 0; 
+		if (right_of_site == 1 && el.elpm() == constants.le())
+			return true;
+		else if (right_of_site == 0 && el.elpm() == constants.re())
+			return false;
+		
+		if (e.a() == 1) {
+			dyp = p.Y() - topsite.getCoord().Y();
+			dxp = p.X() - topsite.getCoord().X();
+			fast = false;
+			if ((right_of_site == 0 & e.b()< 0) | (right_of_site == 1 & e.b()>=0)) {
+				above = (dyp >= e.b()*dxp); 
+				fast = above; 
+			}
+			else {
+				above = (p.X() + p.Y()*e.b() > e.c()); 
+				if (e.b() < 0) 
+					above = !above; 
+				if (!above) 
+					fast = true; 
+    			}
+			if (!fast) {
+				dxs = topsite.getCoord().X() - (e.reg()[0]).getCoord().X();
+				above = ((e.b() * (dxp * dxp - dyp * dyp)) < (dxs * dyp * (1 + 2*dxp/dxs + e.b()*e.b()))); 
+				if (e.b() < 0) 
+					above = !above;
+			}
+		}
+		else { //e.b() == 1
+			y1 = e.c() - e.a()*p.X();
+			t1 = p.Y() - y1; 
+			t2 = p.X() - topsite.getCoord().X();
+			t3 = y1 - topsite.getCoord().Y();
+			above = (t1*t1 > (t2*t2 + t3*t3)); 
+		}
+		return (el.elpm() == constants.le() ? above : !above);
+	}
+
+	public void ELdelete(HalfEdge he) {
+		he.left().setRight(he.right()); 
+		he.right().setLeft(he.left()); 
+		he.setEdge(null); 
+		he.setDeleted(true); 
+	}
+	
+	public HalfEdge ELright(HalfEdge he) {
+		return he.right();
+	}
+	
+	public HalfEdge ELleft(HalfEdge he) {
+		return he.left(); 
+	}
+	
+	public Neighbor leftReg(HalfEdge he) {
+		if (he.eledge() == null)
+			return (Neighbor) constants.bottomsite(); 
+		return (Neighbor) (he.elpm() == constants.le() ? he.eledge().reg()[constants.le()] : he.eledge().reg()[constants.re()]); 
+	}
+	
+	public Neighbor rightReg(HalfEdge he) {
+		if (he.eledge() == null) 
+			return (Neighbor) constants.bottomsite();
+		return (Neighbor) (he.elpm() == constants.le() ? he.eledge().reg()[constants.re()] : he.eledge().reg()[constants.le()]); 
+	}
+	
+	public Edge bisect(Site s1, Site s2) {
+		float dx, dy, adx, ady;
+		Edge newedge; 
+		//System.out.println("bisecting:"); 
+		//System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y());
+		//System.out.println("s2: " + s2.getCoord().X() + " " + s2.getCoord().Y()); 
+		
+		newedge = new Edge(); 
+		newedge.reg()[0] = s1;
+		newedge.reg()[1] = s2; 
+		newedge.ep()[0] = null;
+		newedge.ep()[1] = null; 
+		
+		dx = s2.getCoord().X() - s1.getCoord().X(); //System.out.println("dx: " + dx);
+		dy = s2.getCoord().Y() - s1.getCoord().Y(); //System.out.println("dy: " + dy); 
+		adx = dx > 0 ? dx : -dx; 
+		ady = dy > 0 ? dy : -dy; 
+		
+		newedge.setc(s1.getCoord().X() * dx + s1.getCoord().Y() * dy +(dx*dx + dy*dy)*0.5); 
+		//newedge.setc((dx*dx + dy*dy)*0.5); 
+		if (adx > ady) {
+			newedge.seta(1); //System.out.println("a: " + newedge.a()); 
+			newedge.setb(dy/dx); //System.out.println("b: " + newedge.b());
+			if (dx == 0) System.out.println("dividing by zero"); 
+			newedge.setc(newedge.c()/dx); //System.out.println("c: " + newedge.c()); 
+		}
+		else {
+			newedge.setb(1); //System.out.println("b: " + newedge.b()); 
+			newedge.seta(dx/dy); //System.out.println("a: " + newedge.a()); 
+			if (dy == 0) System.out.println("dividing by zero"); 
+			newedge.setc(newedge.c()/dy); //System.out.println("c: " + newedge.c()); 
+		}
+		newedge.setedgenbr(constants.nedges()); 
+		vregion.outBisector(newedge);
+		constants.setnedges(constants.nedges() +1); 
+		return newedge; 
+	}
+
+	public void v_endpoint(Edge e, int origin, int lr, Site s) {
+		e.ep()[lr] = s; 
+		if (e.ep()[constants.re() - lr] == null) 
+			return;
+		vregion.outEP(e, origin); 
+	}
+
+	public Site sintersect(HalfEdge el1, HalfEdge el2) {	
+		Edge e1, e2, e;
+		HalfEdge el;
+		
+		float d, xint, yint;
+		int right_of_site;
+		Neighbor v; 
+		
+		e1 = el1.eledge();
+		e2 = el2.eledge(); 
+		
+		if (e1 == null || e2 == null)
+			return null;
+		
+		if (e1.reg()[1] == e2.reg()[1]) 
+			return null; 
+		
+		d = e1.a() * e2.b() - e1.b()*e2.a(); 
+		if (d==0) return null; 
+		if ((-1 * (10 ^ -10)) < d && d < (10 ^ 10))
+			return null; 
+		
+		xint = (e1.c() * e2.b() - e2.c() * e1.b())/d;
+		yint = (e2.c() * e1.a() - e1.c() * e2.a())/d; 
+		
+		if ((e1.reg()[1].getCoord().Y() < e2.reg()[1].getCoord().Y()) || (e1.reg()[1].getCoord().Y() == e2.reg()[1].getCoord().Y() && e1.reg()[1].getCoord().X() < e2.reg()[1].getCoord().X())) {
+			el = el1; 
+			e = e1; 
+		}
+		else {
+			el = el2;
+			e = e2; 
+		}
+		right_of_site = (xint >= e.reg()[1].getCoord().X()) ? 1 : 0; 
+		if ((right_of_site == 1 && el.elpm() == constants.le()) || right_of_site == 0 && el.elpm() == constants.re())
+			return null; 
+		
+		v = new Neighbor(); 
+		v.setRefCnt(0);
+		v.setCoord(new Point()); 
+		v.getCoord().setX(xint);
+		v.getCoord().setY(yint); 
+		return v; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java
new file mode 100644
index 0000000..9740600
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeRNG.java
@@ -0,0 +1,34 @@
+package plugins.ragini.voronoidiagram;
+
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+
+public class EdgeRNG extends Line2D.Double {
+	
+	private Neighbor n1, n2; 
+	private ArrayList<Neighbor> endpoints; 
+	private double length; 
+	
+	public EdgeRNG(Neighbor g1, Neighbor g2) {
+		super(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); 
+		n1 = g1; 
+		n2 = g2; 
+		endpoints = new ArrayList<Neighbor>(2); 
+		endpoints.add(n1);
+		endpoints.add(n2);
+		length = distance(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); 
+	}
+	
+	public ArrayList<Neighbor> endpoints() {
+		return endpoints; 
+	}
+	
+	private double distance(double ax, double ay, double bx, double by) {
+		return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay)));
+	}
+	
+	public double length() {
+		return length; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java b/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java
new file mode 100644
index 0000000..08c1749
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/EdgeS.java
@@ -0,0 +1,65 @@
+package plugins.ragini.voronoidiagram;
+
+public class EdgeS {
+	
+	private float x1, y1, x2, y2;
+	private int nbr1, nbr2;
+	private float xm, ym; 
+	
+	public void setx1(float x) {
+		x1 = x;
+	}
+	
+	public void sety1(float y) {
+		y1 = y;
+	}
+	
+	public void setx2(float x) {
+		x2 = x;
+	}
+	
+	public void sety2(float y) {
+		y2 = y; 
+	}
+	
+	public void setnbr1(int n) {
+		nbr1 = n;
+	}
+	
+	public void setnbr2(int n) {
+		nbr2 = n;
+	}
+	
+	public void setxm(float x) {
+		xm = x;
+	}
+	
+	public void setym(float y) {
+		ym = y; 
+	}
+	
+	public float x1() {
+		return x1;
+	}
+	
+	public float y1() {
+		return y1;
+	}
+	
+	public float x2() {
+		return x2;
+	}
+	
+	public float y2() {
+		return y2; 
+	}
+	
+	public int nbr1() {
+		return nbr1;
+	}
+	
+	public int nbr2() {
+		return nbr2; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Face.java b/src/main/java/plugins/ragini/voronoidiagram/Face.java
new file mode 100644
index 0000000..64b1e1a
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Face.java
@@ -0,0 +1,291 @@
+package plugins.ragini.voronoidiagram;
+ 
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   Face.java
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+//Referenced classes of package delaunay:
+//         QuadEdge, DT, Vertex
+
+public class Face
+{
+
+ public Face()
+ {
+     id_f = id;
+     id++;
+     edges = new QuadEdge[3];
+     S = DT.vertex_infty;
+     B = DT.vertex_infty;
+     setVal(0.0F);
+     setInvRadius(0.0D);
+     setInvSize(0.0D);
+     setMeasure(0.0D);
+     counter = 0;
+ }
+
+ public Face(QuadEdge a, QuadEdge b, QuadEdge c)
+ {
+     this();
+     setEdges(a, b, c);
+     setCenter();
+     setBary();
+     setInvSize(Math.max(Math.max(Vertex.distance(B, a.orig()), Vertex.distance(B, b.orig())), Vertex.distance(B, c.orig())));
+     setInvRadius(Vertex.distance(S, a.orig()));
+     if(DT.type == 1)
+         setMeasure(getInvRadius());
+     else
+         setMeasure(getInvSize());
+ }
+
+ public Iterator extractFacesVoisines()
+ {
+     ArrayList f_liste = new ArrayList();
+     for(int i = 0; i < 3; i++)
+     {
+         QuadEdge e = edges[i];
+         QuadEdge ee = e;
+         int count = 0;
+         do
+         {
+             count++;
+             ee = ee.onext();
+             Face fff = ee.rightFace();
+             if(fff == null)
+                 fff = DT.face_null;
+             if(!f_liste.contains(fff))
+                 f_liste.add(fff);
+         } while(ee != e && count < 30);
+     }
+
+     return (Iterator)f_liste.listIterator();
+ }
+
+ public Iterator extractFacesVoisines2()
+ {
+     ArrayList f_liste = new ArrayList();
+     for(int i = 0; i < 3; i++)
+     {
+         QuadEdge e = edges[i];
+         Face fff = e.sym().rightFace();
+         if(fff == null)
+             fff = DT.face_null;
+         if(!f_liste.contains(fff))
+             f_liste.add(fff);
+     }
+
+     return (Iterator)f_liste.listIterator();
+ }
+
+ public Iterator extractFacesVoisines(double angle, double epsilon)
+ {
+     if(angle < 0.0D)
+         return extractFacesVoisines();
+     ArrayList f_liste = new ArrayList();
+     for(int i = 0; i < 3; i++)
+     {
+         QuadEdge e = edges[i];
+         QuadEdge ee = e;
+         int count = 0;
+         do
+         {
+             count++;
+             Face fff = ee.rightFace();
+             if(fff == null)
+                 fff = DT.face_null;
+             if(!f_liste.contains(fff))
+                 if(fff != DT.face_null)
+                 {
+                     if(ecartAngle(fff) < epsilon)
+                         f_liste.add(fff);
+                 } else
+                 {
+                     f_liste.add(fff);
+                 }
+             ee = ee.onext();
+         } while(ee != e && count < 30);
+     }
+
+     return (Iterator)f_liste.listIterator();
+ }
+
+ public Iterator extractFacesVoisines2(double angle, double epsilon)
+ {
+     if(angle < 0.0D)
+         return extractFacesVoisines2();
+     ArrayList f_liste = new ArrayList();
+     for(int i = 0; i < 3; i++)
+     {
+         QuadEdge e = edges[i];
+         Face fff = e.sym().rightFace();
+         if(fff == null)
+             fff = DT.face_null;
+         if(!f_liste.contains(fff))
+             if(fff != DT.face_null)
+             {
+                 if(ecartAngle(fff) < epsilon)
+                     f_liste.add(fff);
+             } else
+             {
+                 f_liste.add(fff);
+             }
+     }
+
+     return (Iterator)f_liste.listIterator();
+ }
+
+ public void setCenter()
+ {
+     S = Vertex.findCenter(edges[0].orig(), edges[1].orig(), edges[2].orig());
+ }
+
+ public void setBary()
+ {
+     B = Vertex.findBary(edges[0].orig(), edges[1].orig(), edges[2].orig());
+ }
+
+ public Vertex getCenter()
+ {
+     return S;
+ }
+
+ public Vertex getBary()
+ {
+     return B;
+ }
+
+ public float getVal()
+ {
+     return val;
+ }
+
+ public float getValAux()
+ {
+     return val_aux;
+ }
+
+ public void setValAux(float val)
+ {
+     val_aux = val;
+ }
+
+ public void setVal(float val)
+ {
+     this.val = val;
+ }
+
+ public QuadEdge[] getEdges()
+ {
+     return edges;
+ }
+
+ public void setEdges(QuadEdge a, QuadEdge b, QuadEdge c)
+ {
+     edges[0] = a;
+     edges[1] = b;
+     edges[2] = c;
+ }
+
+ public void setInvRadius(double radius)
+ {
+     if(radius == 0.0D)
+         invRadius = DT.MAX_VALUE;
+     else
+         invRadius = 1.0D / radius;
+ }
+
+ public void setInvSize(double size)
+ {
+     if(size == 0.0D)
+         invSize = DT.MAX_VALUE;
+     invSize = 1.0D / size;
+ }
+
+ public void setMeasure(double measure)
+ {
+     this.measure = measure;
+ }
+
+ public double getInvRadius()
+ {
+     return invRadius;
+ }
+
+ public double getInvSize()
+ {
+     return invSize;
+ }
+
+ public double getMeasure()
+ {
+     return measure;
+ }
+
+ public int contains(Vertex p)
+ {
+     if(invSize == 0.0D)
+         return 0;
+     double size = 1.0D / (double)(float)invSize;
+     return Vertex.distance(p, B) >= size / 3D ? 0 : 1;
+ }
+
+ public void setCounter(int counter)
+ {
+     this.counter = counter;
+ }
+
+ public int getCounter()
+ {
+     return counter;
+ }
+
+ public double ecartAngle(Face f)
+ {
+     double angle2 = 0.0D;
+     Vertex angle = new Vertex(0.0D, 0.0D);
+     if(DT.vertexAngle.x == -1D && DT.vertexAngle.y == -1D)
+         return 0.0D;
+     angle.x = getCenter().x - f.getCenter().x;
+     angle.y = getCenter().y - f.getCenter().y;
+     double norme = Vertex.distance(getCenter(), f.getCenter());
+     if(norme == 0.0D)
+     {
+         return 0.0D;
+     } else
+     {
+         double cosangle = angle.x * DT.vertexAngle.x + angle.y * DT.vertexAngle.y;
+         cosangle /= norme;
+         angle2 = Math.acos(cosangle);
+         return angle2;
+     }
+ }
+
+ public String toString()
+ {
+     if(edges[0] != null)
+         return (new StringBuilder()).append(edges[0].orig()).append(" ").append(edges[1].orig()).append(" ").append(edges[2].orig()).toString();
+     else
+         return null;
+ }
+
+ private QuadEdge edges[];
+ private int counter;
+ private double invRadius;
+ private double invSize;
+ private double measure;
+ private ArrayList e;
+ private ArrayList d;
+ private Vertex S;
+ private Vertex B;
+ float val;
+ float val_aux;
+ float val_aux_angle;
+ public int id_f;
+ static int id = 0;
+
+}
+
diff --git a/src/main/java/plugins/ragini/voronoidiagram/FreeList.java b/src/main/java/plugins/ragini/voronoidiagram/FreeList.java
new file mode 100644
index 0000000..2b292a1
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/FreeList.java
@@ -0,0 +1,8 @@
+package plugins.ragini.voronoidiagram;
+
+public class FreeList {
+	
+	private FreeNode head;
+	private int nodesize; 
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java b/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java
new file mode 100644
index 0000000..ccb74e3
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/FreeNode.java
@@ -0,0 +1,7 @@
+package plugins.ragini.voronoidiagram;
+
+public class FreeNode {
+
+	private FreeNode nextFree; 
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Geometry.java b/src/main/java/plugins/ragini/voronoidiagram/Geometry.java
new file mode 100644
index 0000000..3c31008
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Geometry.java
@@ -0,0 +1,98 @@
+package plugins.ragini.voronoidiagram;
+
+public class Geometry {
+	
+	private int PQcount, PQmin; 
+	private HalfEdge[] PQhash; 
+	private Constants constants; 
+	
+	public Geometry(Constants _constants) {
+		constants = _constants;
+	}
+	
+	public void PQinsert(HalfEdge he, Site v, double d) {
+		
+		 
+		
+		HalfEdge last, next; 
+		
+		he.setVertex(v);
+		he.setystar((float) (v.getCoord().Y() + d)); 
+		last = PQhash[PQbucket(he)]; 
+		while((next = last.PQnext()) != null && (he.ystar()>next.ystar() || (he.ystar() == next.ystar() && v.getCoord().X() > next.vertex().getCoord().X()))) {
+			last = next; 
+		}
+		he.setPQnext(last.PQnext());
+		last.setPQnext(he);
+		PQcount +=1; 
+		//System.out.println("inserting halfedge: " + he.vertex().getCoord().X() + ", " + he.ystar());
+	}
+	
+	public void PQdelete(HalfEdge he) {
+		HalfEdge last;
+		if (he.vertex() != null && he.vertex().getCoord() != null) 
+		//System.out.println("removing halfedge: " + he.vertex().getCoord().X() + ", " + he.ystar()); 
+		if (he.vertex() != null) {
+			last = PQhash[PQbucket(he)];                                                                                                             
+			while (last.PQnext() != he) {
+				last = last.PQnext(); 
+			}
+			last.setPQnext(he.PQnext());
+			PQcount -=1; 
+			he.setVertex(null); 
+		}
+	}
+	
+	public int PQbucket(HalfEdge he) {
+		int bucket;
+		
+		bucket = (int) ((he.ystar() - constants.vymin())/constants.vdeltay() * constants.PQhashsize()); ///////////will this cast work? 
+		if (bucket < 0) bucket = 0;
+		if (bucket >= constants.PQhashsize()) {
+			bucket = constants.PQhashsize() - 1; 
+		}
+		if (bucket < PQmin) {
+			PQmin = bucket;
+		}
+		return bucket; 
+	}
+	
+	public boolean PQempty() {
+		return (PQcount == 0); 
+	}
+	
+	public Point PQmin() {
+		Point answer = new Point();
+		
+		while(PQhash[PQmin].PQnext() == null) {
+			PQmin++; 
+		}
+		answer.setX(PQhash[PQmin].PQnext().vertex().getCoord().X()); 
+		answer.setY(PQhash[PQmin].PQnext().ystar()); 
+		return answer; 
+	}
+	
+	public HalfEdge PQextractmin() {
+		HalfEdge curr; 
+		
+		curr = PQhash[PQmin].PQnext();
+		PQhash[PQmin].setPQnext(curr.PQnext()); 
+		PQcount--; 
+		return curr; 
+	}
+	
+	public void PQinitialize() {
+		int i;
+		Point s; 
+		
+		PQcount = 0;
+		PQmin = 0;
+		constants.setPQhashsize((int) (4 * constants.sqrtnsites())); 
+		PQhash = new HalfEdge[constants.PQhashsize()]; 
+		for (i = 0; i < constants.PQhashsize(); i ++) {
+			PQhash[i] = new HalfEdge(-1); 
+			PQhash[i].setPQnext(null); 
+		}
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/GraphD.java b/src/main/java/plugins/ragini/voronoidiagram/GraphD.java
new file mode 100644
index 0000000..ebd2872
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/GraphD.java
@@ -0,0 +1,29 @@
+package plugins.ragini.voronoidiagram;
+
+public class GraphD {
+
+	private Point pt;
+	private Arcs arcs;
+	private short nbarcs; 
+	
+	public void setArcs(Arcs a) {
+		arcs = a;
+	}
+	
+	public void setNbArcs(short s) {
+		nbarcs = s; 
+	}
+	
+	public Point pt() {
+		return pt; 
+	}
+	
+	public Arcs arcs() {
+		return arcs; 
+	}
+	
+	public short nbarcs() {
+		return nbarcs; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java b/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java
new file mode 100644
index 0000000..212fc68
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/HalfEdge.java
@@ -0,0 +1,103 @@
+package plugins.ragini.voronoidiagram;
+
+public class HalfEdge {
+
+	private HalfEdge ELleft, ELRight;
+	private Edge ELedge;
+	private int ELrefcnt;
+	private int ELpm;
+	private Site vertex;
+	private float ystar;
+	private HalfEdge PQNext; 
+	private boolean isnull;
+	private boolean isdeleted; 
+	private int origin; 
+	
+	public HalfEdge(int i) {
+		isnull = true;
+		isdeleted = false; 
+		ELpm = -1; 
+		origin = i; 
+	}
+	
+	public Site vertex() {
+		return vertex; 
+	}
+	
+	public Edge eledge() {
+		return ELedge;
+	}
+	
+	public int elpm() {
+		return ELpm;  
+	}
+	
+	public void setLeft(HalfEdge l) {
+		ELleft = l;
+	}
+	
+	public void setRight(HalfEdge r) {
+		ELRight = r; 
+	}
+	
+	public void setEdge(Edge e) {
+		ELedge = e;                                      
+	}
+	
+	public void setPM(int p) {
+		ELpm = p; 
+	}
+	
+	public void setNext(HalfEdge n) {
+		PQNext = n; 
+	}
+	
+	public void setVertex(Site s) {
+		vertex = s; 
+	}
+	
+	public HalfEdge left() {
+		return ELleft;
+	}
+	
+	public HalfEdge right() {
+		return ELRight; 
+	}
+	
+	public void setystar(float d) {
+		ystar = d; 
+	}
+	
+	public HalfEdge PQnext() {
+		return PQNext; 
+	}
+	
+	public float ystar() {
+		return ystar; 
+	}
+	
+	public void setPQnext(HalfEdge h) {
+		PQNext = h; 
+	}
+	
+	public boolean isNull() {
+		return isnull;
+	}
+	
+	public boolean isDeleted() {
+		return isdeleted;
+	}
+	
+	public void setNull(boolean b) {
+		isnull = b; 
+	}
+	
+	public void setDeleted(boolean b) {
+		isdeleted = b; 
+	}
+	
+	public int origin() {
+		return origin; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java b/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java
new file mode 100644
index 0000000..8410708
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Image_Extract.java
@@ -0,0 +1,69 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   Image_Extract.java
+
+import ij.ImagePlus;
+import ij.WindowManager;
+import ij.plugin.filter.MaximumFinder;
+import ij.plugin.filter.PlugInFilter;
+import ij.process.ByteProcessor;
+import ij.process.ImageProcessor;
+import java.awt.Rectangle;
+import javax.swing.JOptionPane;
+
+public class Image_Extract
+ implements PlugInFilter
+{
+
+ public Image_Extract()
+ {
+ }
+
+ public int setup(String arg, ImagePlus imp)
+ {
+     return 127;
+ }
+
+ public void run(ImageProcessor ip)
+ {
+     imp = WindowManager.getCurrentImage();
+     ImageProcessor ip2 = imp.getProcessor().resize(imp.getWidth(), imp.getHeight());
+     (new ImagePlus("Init", ip2)).show();
+     ip = ip.convertToByte(true);
+     double tolerance = 30D;
+     double input = -1D;
+     String s = "30";
+     s = JOptionPane.showInputDialog("Input the tolerance parameter (30 by default):", "30");
+     input = Double.valueOf(s).doubleValue();
+     if(input > 0.0D)
+         tolerance = input;
+     Rectangle r = ip.getRoi();
+     ip.invert();
+     ByteProcessor bp = (new MaximumFinder()).findMaxima(ip, tolerance, -808080D, 0, true, false);
+     ip.setPixels(bp.getPixels());
+     ip.invertLut();
+     ip = ip.convertToRGB();
+     imp.setProcessor("RGB", ip);
+     imp.repaintWindow();
+     int mask = 255;
+     for(int y = r.y; y < r.y + r.height; y++)
+     {
+         for(int x = r.x; x < r.x + r.width; x++)
+         {
+             int rgb = ip.get(x, y);
+             int rouge = rgb >> 16 & mask;
+             int vert = rgb >> 8 & mask;
+             int bleu = rgb & mask;
+             if(rouge == 0 && bleu == 0 && vert == 0)
+                 ip.set(x, y, 0xff0000);
+         }
+
+     }
+
+ }
+
+ private ImagePlus imp;
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java b/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java
new file mode 100644
index 0000000..a4ad0bc
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/IntArraySetter.java
@@ -0,0 +1,17 @@
+package plugins.ragini.voronoidiagram;
+
+public class IntArraySetter implements Setter<Integer[][]> {
+
+	private Integer[][] var;
+	
+	@Override
+	public void set(Integer[][] input) {
+		var = input; 
+	}
+
+	@Override
+	public Integer[][] get() {
+		return var; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java b/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java
new file mode 100644
index 0000000..144fba8
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/IntSetter.java
@@ -0,0 +1,21 @@
+package plugins.ragini.voronoidiagram;
+
+public class IntSetter implements Setter<Integer> {
+
+	Integer n; 
+	
+	public IntSetter (int i) {
+		n = new Integer(i); 
+	}
+	
+	@Override
+	public void set(Integer input) {
+		n = input; 
+	}
+
+	@Override
+	public Integer get() {
+		return n; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java b/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java
new file mode 100644
index 0000000..926ba5d
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/MorphologicalOperators.java
@@ -0,0 +1,15 @@
+package plugins.ragini.voronoidiagram;
+
+import icy.gui.dialog.MessageDialog;
+import icy.plugin.abstract_.Plugin;
+import icy.plugin.interface_.PluginImageAnalysis;
+
+public class MorphologicalOperators extends Plugin implements PluginImageAnalysis {
+
+	@Override
+	public void compute() {
+		// TODO Auto-generated by Icy4Eclipse
+		MessageDialog.showDialog("MorphologicalOperators is working fine !");
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/NVert.java b/src/main/java/plugins/ragini/voronoidiagram/NVert.java
new file mode 100644
index 0000000..051af85
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/NVert.java
@@ -0,0 +1,39 @@
+package plugins.ragini.voronoidiagram;
+
+public class NVert {
+
+	private int nbr1, nbr2, onhull, vpid; 
+	
+	public int onhull() {
+		return onhull; 
+	}
+	
+	public void setOnHull(int o) {
+		onhull = o; 
+	}
+	
+	public int nbr1() {
+		return nbr1;
+	}
+	
+	public int nbr2() {
+		return nbr2; 
+	}
+	
+	public void setNbr1(int n) {
+		nbr1 = n;
+	}
+	
+	public void setNbr2(int n) {
+		nbr2 = n;
+	}
+	
+	public void setVPid(int v) {
+		vpid = v; 
+	}
+	
+	public int vpid() {
+		return vpid;
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java b/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java
new file mode 100644
index 0000000..3d13260
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Neighbor.java
@@ -0,0 +1,32 @@
+package plugins.ragini.voronoidiagram;
+
+import java.util.ArrayList;
+
+public class Neighbor extends Site implements PointType {
+	
+	private double dist; 
+	private Site site; 
+	private ArrayList<Neighbor> samedist; 
+	
+	public Neighbor() {
+		super(); 
+		samedist = new ArrayList<Neighbor>(); 
+	}
+	
+	public Site getSite() {
+		return site; 
+	}
+	
+	public void addNeighbor(Neighbor n) {
+		neighbors.add(n); 
+	}
+	
+	public void same(Neighbor n) {
+		samedist.add(n);
+	}
+	
+	public ArrayList<Neighbor> samedistpoints() {
+		return samedist; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Point.java b/src/main/java/plugins/ragini/voronoidiagram/Point.java
new file mode 100644
index 0000000..7895654
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Point.java
@@ -0,0 +1,23 @@
+package plugins.ragini.voronoidiagram;
+
+public class Point {
+
+	protected float x, y; 
+	
+	public float X(){
+		return x;
+	}
+	
+	public float Y() {
+		return y; 
+	}
+	
+	public void setX(float _x) {
+		x = _x;
+	}
+	
+	public void setY(float _y) {
+		y = _y; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/PointType.java b/src/main/java/plugins/ragini/voronoidiagram/PointType.java
new file mode 100644
index 0000000..614a81c
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/PointType.java
@@ -0,0 +1,5 @@
+package plugins.ragini.voronoidiagram;
+
+public interface PointType {
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/PointVor.java b/src/main/java/plugins/ragini/voronoidiagram/PointVor.java
new file mode 100644
index 0000000..cce2fe3
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/PointVor.java
@@ -0,0 +1,5 @@
+package plugins.ragini.voronoidiagram;
+
+public class PointVor {
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Provider.java b/src/main/java/plugins/ragini/voronoidiagram/Provider.java
new file mode 100644
index 0000000..dc34fc2
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Provider.java
@@ -0,0 +1,7 @@
+package plugins.ragini.voronoidiagram;
+
+public interface Provider<T> {
+
+	public T next();
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java b/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java
new file mode 100644
index 0000000..177d362
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/QuadEdge.java
@@ -0,0 +1,289 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   QuadEdge.java
+
+import java.io.PrintStream;
+
+//Referenced classes of package delaunay:
+//         Vertex, Face
+
+public class QuadEdge
+{
+
+ public QuadEdge(QuadEdge Onext, QuadEdge rot, Vertex data, boolean can)
+ {
+     this.Onext = Onext;
+     this.data = data;
+     this.rot = rot;
+     canonical = can;
+     counter = 0;
+     alpha = 0.0D;
+ }
+
+ public static QuadEdge makeEdge(Vertex orig, Vertex dest)
+ {
+     QuadEdge q0 = new QuadEdge(null, null, null, true);
+     QuadEdge q1 = new QuadEdge(null, null, null, false);
+     QuadEdge q2 = new QuadEdge(null, null, null, false);
+     QuadEdge q3 = new QuadEdge(null, null, null, true);
+     q0.rot = q1;
+     q1.rot = q2;
+     q2.rot = q3;
+     q3.rot = q0;
+     q0.Onext = q0;
+     q1.Onext = q3;
+     q2.Onext = q2;
+     q3.Onext = q1;
+     q0.setData(orig);
+     q0.sym().setData(dest);
+     return q0;
+ }
+
+ public static void splice(QuadEdge q1, QuadEdge q2)
+ {
+     QuadEdge alpha = q1.onext().rot();
+     QuadEdge beta = q2.onext().rot();
+     QuadEdge t1 = q2.onext();
+     QuadEdge t2 = q1.onext();
+     QuadEdge t3 = beta.onext();
+     QuadEdge t4 = alpha.onext();
+     q1.setOnext(t1);
+     q2.setOnext(t2);
+     alpha.setOnext(t3);
+     beta.setOnext(t4);
+ }
+
+ public void splice(QuadEdge q)
+ {
+     splice(this, q);
+ }
+
+ public static void splice2(QuadEdge q1, QuadEdge q2)
+ {
+     q2.rot().setOnext(q1.rotSym());
+     q1.setOnext(q2);
+ }
+
+ public void splice2(QuadEdge q)
+ {
+     splice2(this, q);
+ }
+
+ public static QuadEdge connect(QuadEdge a, QuadEdge b)
+ {
+     QuadEdge q = makeEdge(a.dest(), b.orig());
+     splice(q, a.lnext());
+     splice(q.sym(), b);
+     return q;
+ }
+
+ public static void deleteEdge(QuadEdge q)
+ {
+     splice(q, q.oprev());
+     splice(q.sym(), q.sym().oprev());
+ }
+
+ public int getCounter()
+ {
+     return counter;
+ }
+
+ public void setCounter(int c)
+ {
+     counter = c;
+ }
+
+ public void setFace(Face f)
+ {
+     rightF = f;
+ }
+
+ public void setFaces(Face f, Face g)
+ {
+     rightF = f;
+     sym().rightF = g;
+ }
+
+ public void setAlpha(double alpha)
+ {
+     this.alpha = alpha;
+ }
+
+ public double getAlpha()
+ {
+     return alpha;
+ }
+
+ public void setLambda(float lbd)
+ {
+     lambda_val = lbd;
+ }
+
+ public float getLambda()
+ {
+     return lambda_val;
+ }
+
+ public void setMu(float lbd)
+ {
+     mu_val = lbd;
+ }
+
+ public float getMu()
+ {
+     return mu_val;
+ }
+
+ public void setOnext(QuadEdge next)
+ {
+     Onext = next;
+ }
+
+ public void setRot(QuadEdge rot)
+ {
+     this.rot = rot;
+ }
+
+ public void setData(Vertex data)
+ {
+     this.data = data;
+ }
+
+ public QuadEdge onext()
+ {
+     return Onext;
+ }
+
+ public QuadEdge rot()
+ {
+     return rot;
+ }
+
+ public QuadEdge sym()
+ {
+     return rot.rot();
+ }
+
+ public Vertex orig()
+ {
+     return data;
+ }
+
+ public Vertex dest()
+ {
+     return sym().orig();
+ }
+
+ public Vertex right()
+ {
+     return rot.orig();
+ }
+
+ public Vertex left()
+ {
+     return rot.sym().orig();
+ }
+
+ public Face rightFace()
+ {
+     return rightF;
+ }
+
+ public QuadEdge rotSym()
+ {
+     return rot.sym();
+ }
+
+ public QuadEdge oprev()
+ {
+     return rot.onext().rot();
+ }
+
+ public QuadEdge lnext()
+ {
+     return rotSym().onext().rot();
+ }
+
+ public QuadEdge lprev()
+ {
+     return onext().sym();
+ }
+
+ public QuadEdge rnext()
+ {
+     return rot.onext().rotSym();
+ }
+
+ public QuadEdge rprev()
+ {
+     return sym().onext();
+ }
+
+ public boolean isCanonical()
+ {
+     return canonical;
+ }
+
+ public boolean rightOf(Vertex s)
+ {
+     return s.ccw(sym().data, data);
+ }
+
+ public static boolean rightOf(QuadEdge q, Vertex s)
+ {
+     return s.ccw(q.dest(), q.orig());
+ }
+
+ public boolean leftOf(Vertex s)
+ {
+     return s.ccw(data, dest());
+ }
+
+ public static boolean leftOf(Vertex s, QuadEdge q)
+ {
+     return s.ccw(q.orig(), q.dest());
+ }
+
+ boolean equals(QuadEdge e)
+ {
+     return orig() == e.orig() && dest() == e.dest();
+ }
+
+ boolean equivalent(QuadEdge e)
+ {
+     return orig() == e.orig() && dest() == e.dest() || orig() == e.dest() && dest() == e.orig();
+ }
+
+ public int type(double med, int axis)
+ {
+     if(!orig().test(med, axis))
+         return dest().test(med, axis) ? 0 : -1;
+     return !dest().test(med, axis) ? 0 : 1;
+ }
+
+ public String toString()
+ {
+     return (new StringBuilder()).append(data).append(" ").append(sym().data).toString();
+ }
+
+ public void expliciter()
+ {
+     QuadEdge sym = sym();
+     System.out.println((new StringBuilder(" Edge")).append(this).append(" onext()").append(onext()).append(" oprev").append(oprev()).append(" lnext").append(lnext()).append(" rprev").append(rprev()).toString());
+     System.out.println((new StringBuilder(" Edge inverse ")).append(sym).append(" onext()").append(sym.onext()).append(" oprev").append(sym.oprev()).append(" lnext").append(sym.lnext()).append(" rprev").append(sym.rprev()).toString());
+ }
+
+ private QuadEdge Onext;
+ private QuadEdge rot;
+ private Vertex data;
+ private int counter;
+ private Face rightF;
+ private double alpha;
+ private float lambda_val;
+ private float mu_val;
+ private boolean canonical;
+}
+
diff --git a/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java b/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java
new file mode 100644
index 0000000..5e4b0bc
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/ROI2DEdge.java
@@ -0,0 +1,13 @@
+package plugins.ragini.voronoidiagram;
+
+import icy.roi.ROI2DLine;
+
+import java.awt.geom.Line2D;
+
+public class ROI2DEdge extends ROI2DLine {
+	
+	public ROI2DEdge(Line2D line) {
+		super(line.getP1(), line.getP2()); 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java b/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java
new file mode 100644
index 0000000..f049367
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/ROI2DSite.java
@@ -0,0 +1,22 @@
+package plugins.ragini.voronoidiagram;
+import java.awt.geom.Point2D;
+
+import icy.roi.ROI2DPoint;
+
+public class ROI2DSite extends ROI2DPoint {
+	
+	private Site site; 
+	
+	public ROI2DSite(Point2D dp) {
+		super(dp); 
+	}
+
+	public void setSite(Site s) {
+		site = s;
+	}
+	
+	public Site getSite() {
+		return site; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Setter.java b/src/main/java/plugins/ragini/voronoidiagram/Setter.java
new file mode 100644
index 0000000..b2aa057
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Setter.java
@@ -0,0 +1,9 @@
+package plugins.ragini.voronoidiagram;
+
+public interface Setter<T> {
+	
+	public void set(T input); 
+	
+	public T get(); 
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Site.java b/src/main/java/plugins/ragini/voronoidiagram/Site.java
new file mode 100644
index 0000000..63d5eb5
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Site.java
@@ -0,0 +1,87 @@
+package plugins.ragini.voronoidiagram;
+
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
+public class Site {
+
+	protected PriorityQueue<Neighbor> neighbors; 
+	protected Point coord;
+	private int sitenbr, refcnt; 
+	private ROI2DSite point; 
+	
+	public Site() {
+		NeighborComp comp = new NeighborComp(); 
+		neighbors = new PriorityQueue<Neighbor>(5, comp); 
+	}
+	
+	public Point getCoord() {
+		return coord; 
+	}
+	
+	public int sitenbr() {
+		return sitenbr; 
+	}
+	
+	public void setRefCnt(int r) {
+		refcnt = r; 
+	}
+	
+	public void setSiteNbr(int n) {
+		sitenbr = n; 
+	}
+///>>>????
+	
+	public void setCoord(Point p) {
+		coord = p; 
+	}
+	
+	public PriorityQueue<Neighbor> neighbors() {
+		return neighbors; 
+	}
+	
+	private class NeighborComp implements Comparator<Neighbor> {
+
+		@Override
+		public int compare(Neighbor n1, Neighbor n2) {
+			if (distance(coord.X(), coord.Y(), n1.getCoord().X(), n1.getCoord().Y()) > distance(coord.X(), coord.Y(), n2.getCoord().X(), n2.getCoord().Y())) 
+				return 1;
+			else if (distance(coord.X(), coord.Y(), n1.getCoord().X(), n1.getCoord().Y()) < distance(coord.X(), coord.Y(), n2.getCoord().X(), n2.getCoord().Y())) 
+				return -1; 
+			else if (n1.getCoord().Y() > n2.getCoord().Y()) {
+				n2.same(n1); 
+				n1.same(n2); 
+				return 1; }
+			else if (n1.getCoord().Y() < n2.getCoord().Y()) {
+				n1.same(n2); 
+				n2.same(n1); 
+				return -1; }
+			else if (n1.getCoord().X() > n2.getCoord().X()) {
+				n2.same(n1); 
+				n1.same(n2); 
+				return 1; }
+			else if (n1.getCoord().X() < n2.getCoord().X()) {
+				n1.same(n2); 
+				n2.same(n1); 
+				return -1; }
+			else { 
+				System.out.println("here"); 
+				return 0;
+			}
+		}
+		
+		private double distance(double ax, double ay, double bx, double by) {
+			return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay)));
+		}
+		
+	}
+	
+	public void setPoint(ROI2DSite p) {
+		point = p; 
+	}
+	
+	public ROI2DSite getPoint() {
+		return point; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java b/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java
new file mode 100644
index 0000000..c86a081
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/SiteProvider.java
@@ -0,0 +1,26 @@
+package plugins.ragini.voronoidiagram;
+
+public class SiteProvider implements Provider<Neighbor> {
+
+	private int index; 
+	private int lim; 
+	private Constants cons; 
+	
+	public SiteProvider (Constants _cons) {
+		index = 0; 
+		cons = _cons; 
+		lim = cons.sites().length; 
+	}
+	
+	@Override
+	public Neighbor next() {
+		Neighbor out = null; 
+		if (index < lim) {
+			out = cons.sites()[index];
+			index++;
+		}
+		//System.out.println("newsite: " + out.getCoord().X() + " " + out.getCoord().Y()); 
+		return out; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Tri.java b/src/main/java/plugins/ragini/voronoidiagram/Tri.java
new file mode 100644
index 0000000..f05a078
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Tri.java
@@ -0,0 +1,31 @@
+package plugins.ragini.voronoidiagram;
+
+public class Tri {
+
+	private Vert v1, v2, v3; 
+	
+	public void setV1(Vert v) {
+		v1 = v;
+	}
+	
+	public void setV2(Vert v) {
+		v2 = v;
+	}
+	
+	public void setV3(Vert v) {
+		v3 = v; 
+	}
+	
+	public Vert v1() {
+		return v1;
+	}
+	
+	public Vert v2() {
+		return v2;
+	}
+	
+	public Vert v3() {
+		return v3; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java b/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java
new file mode 100644
index 0000000..18959ca
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/UniformGrid.java
@@ -0,0 +1,719 @@
+package plugins.ragini.voronoidiagram;
+
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   UniformGrid.java
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+//Referenced classes of package delaunay:
+//         Vertex, DT, QuadEdge
+
+public class UniformGrid
+{
+ class GridCell
+ {
+
+     PointItem points;
+     int mark;
+     final UniformGrid this$0;
+
+     GridCell()
+     {
+         super();
+         this$0 = UniformGrid.this;
+         points = null;
+         mark = -1;
+     }
+ }
+
+ class GridInterval
+ {
+
+     void set()
+     {
+         x1 = y1 = 0;
+         x2 = xsize;
+         y2 = ysize;
+     }
+
+     void set(int X1, int Y1, int X2, int Y2)
+     {
+         x1 = X1 < 0 ? 0 : X1;
+         y1 = Y1 < 0 ? 0 : Y1;
+         x2 = X2 > xsize ? xsize : X2;
+         y2 = Y2 > ysize ? ysize : Y2;
+     }
+
+     void set(Vertex v, double radius)
+     {
+         int X1 = (int)((v.x - radius - xoffset) / cellsize);
+         int Y1 = (int)((v.y - radius - yoffset) / cellsize);
+         int X2 = (int)(((v.x + radius) - xoffset) / cellsize) + 1;
+         int Y2 = (int)(((v.y + radius) - yoffset) / cellsize) + 1;
+         set(X1, Y1, X2, Y2);
+     }
+
+     public String toString()
+     {
+         if(x1 < x2 && y1 < y2)
+             return (new StringBuilder("[")).append(x1).append("..").append(x2 - 1).append("][").append(y1).append("..").append(y2 - 1).append("]").toString();
+         else
+             return "[empty]";
+     }
+
+     int x1;
+     int y1;
+     int x2;
+     int y2;
+     final UniformGrid this$0;
+
+     GridInterval(int X1, int Y1, int X2, int Y2)
+     {
+         super();
+         this$0 = UniformGrid.this;
+         set(X1, Y1, X2, Y2);
+     }
+
+     GridInterval(Vertex v, double radius)
+     {
+         super();
+         this$0 = UniformGrid.this;
+         set(v, radius);
+     }
+ }
+
+ class GridPosition
+ {
+
+     int x;
+     int y;
+     final UniformGrid this$0;
+
+     GridPosition(Vertex v)
+     {
+         super();
+         this$0 = UniformGrid.this;
+         x = (int)((v.x - xoffset) / cellsize);
+         y = (int)((v.y - yoffset) / cellsize);
+         if(x < 0)
+             x = 0;
+         if(x >= xsize)
+             x = xsize - 1;
+         if(y < 0)
+             y = 0;
+         if(y >= ysize)
+             y = ysize - 1;
+     }
+ }
+
+ class PointItem
+ {
+
+     Vertex point;
+     PointItem next;
+     final UniformGrid this$0;
+
+     PointItem()
+     {
+    	 super();
+         this$0 = UniformGrid.this;
+         point = null;
+         next = null;
+     }
+ }
+
+ class PointIterator
+     implements Iterator
+ {
+
+     public boolean hasNext()
+     {
+         return ptr != null;
+     }
+
+     public Object next()
+     {
+         if(ptr == null)
+         {
+             throw new NoSuchElementException();
+         } else
+         {
+             Vertex res = ptr.point;
+             ptr = ptr.next;
+             return res;
+         }
+     }
+
+     public void remove()
+     {
+         throw new UnsupportedOperationException();
+     }
+
+     PointItem ptr;
+     final UniformGrid this$0;
+
+     PointIterator(int x, int y)
+     {
+    	 super();
+         this$0 = UniformGrid.this;
+         ptr = null;
+         ptr = grid[x][y].points;
+     }
+ }
+
+
+ UniformGrid(Vertex verts[], int mincells)
+ {
+     grid = null;
+     array = null;
+     xsize = 0;
+     ysize = 0;
+     xoffset = 0.0D;
+     yoffset = 0.0D;
+     cellsize = 0.0D;
+     currentMark = 0;
+     array = new PointItem[verts.length];
+     for(int i = 0; i < array.length; i++)
+         array[i] = new PointItem();
+
+     double xmax;
+     double xmin = xmax = verts[0].x;
+     double ymax;
+     double ymin = ymax = verts[0].y;
+     for(int i = 1; i < verts.length; i++)
+     {
+         if(verts[i].x < xmin)
+             xmin = verts[i].x;
+         if(verts[i].x > xmax)
+             xmax = verts[i].x;
+         if(verts[i].y < ymin)
+             ymin = verts[i].y;
+         if(verts[i].y > ymax)
+             ymax = verts[i].y;
+     }
+
+     cellsize = Math.sqrt(((xmax - xmin) * (ymax - ymin)) / (double)mincells);
+     xsize = (int)Math.ceil((xmax - xmin) / cellsize);
+     ysize = (int)Math.ceil((ymax - ymin) / cellsize);
+     xoffset = xmin - (cellsize * (double)xsize - (xmax - xmin)) / 2D;
+     yoffset = ymin - (cellsize * (double)ysize - (ymax - ymin)) / 2D;
+     grid = new GridCell[xsize][ysize];
+     for(int i = 0; i < xsize; i++)
+     {
+         for(int j = 0; j < ysize; j++)
+             grid[i][j] = new GridCell();
+
+     }
+
+     for(int i = 0; i < verts.length; i++)
+     {
+         int x = (int)((verts[i].x - xoffset) / cellsize);
+         int y = (int)((verts[i].y - yoffset) / cellsize);
+         if(x < 0)
+             x = 0;
+         if(x >= xsize)
+             x = xsize - 1;
+         if(y < 0)
+             y = 0;
+         if(y >= ysize)
+             y = ysize - 1;
+         array[i].point = verts[i];
+         array[i].next = null;
+         if(grid[x][y].points == null)
+         {
+             grid[x][y].points = array[i];
+         } else
+         {
+             PointItem last;
+             for(last = grid[x][y].points; last.next != null; last = last.next);
+             last.next = array[i];
+         }
+     }
+
+ }
+
+ public int XCells()
+ {
+     return xsize;
+ }
+
+ public int YCells()
+ {
+     return ysize;
+ }
+
+ public double XMin()
+ {
+     return xoffset;
+ }
+
+ public double YMin()
+ {
+     return yoffset;
+ }
+
+ public double XMax()
+ {
+     return xoffset + (double)xsize * cellsize;
+ }
+
+ public double YMax()
+ {
+     return yoffset + (double)ysize * cellsize;
+ }
+
+ public double XSize()
+ {
+     return (double)xsize * cellsize;
+ }
+
+ public double YSize()
+ {
+     return (double)ysize * cellsize;
+ }
+
+ public double CellSize()
+ {
+     return cellsize;
+ }
+
+ public PointIterator cellIterator(int x, int y)
+ {
+     return new PointIterator(x, y);
+ }
+
+ void resetAllMarks()
+ {
+     currentMark++;
+ }
+
+ void setMark(int x, int y)
+ {
+     grid[x][y].mark = currentMark;
+ }
+
+ void unsetMark(int x, int y)
+ {
+     grid[x][y].mark = currentMark - 1;
+ }
+
+ boolean isMarked(int x, int y)
+ {
+     return grid[x][y].mark == currentMark;
+ }
+
+ public int numPoints(int x1, int y1, int x2, int y2)
+ {
+     int cnt = 0;
+     for(int i = x1; i < x2; i++)
+     {
+         for(int j = y1; j < y2; j++)
+         {
+             for(PointIterator pi = cellIterator(i, j); pi.hasNext();)
+             {
+                 pi.next();
+                 cnt++;
+             }
+
+         }
+
+     }
+
+     return cnt;
+ }
+
+ public double pseudoMedian(int axis)
+ {
+     int cfirst = 0;
+     int clast = 0;
+     int cnt = 0;
+     double med = 0.0D;
+     switch(axis)
+     {
+     default:
+         break;
+
+     case 0: // '\0'
+     {
+         int pfirst = 0;
+         for(int plast = xsize - 1; pfirst < plast;)
+             if(cfirst <= clast)
+             {
+                 cfirst += numPoints(pfirst, 0, pfirst + 1, ysize);
+                 pfirst++;
+             } else
+             {
+                 clast += numPoints(plast, 0, plast + 1, ysize);
+                 plast--;
+             }
+
+         for(int i = 0; i < ysize; i++)
+         {
+             for(PointIterator pi = cellIterator(pfirst, i); pi.hasNext();)
+             {
+                 med += ((Vertex)pi.next()).x;
+                 cnt++;
+             }
+
+         }
+
+         if(cnt > 0)
+             med /= cnt;
+         else
+             med = (double)pfirst * cellsize + xoffset;
+         break;
+     }
+
+     case 1: // '\001'
+     {
+         int pfirst = 0;
+         for(int plast = ysize - 1; pfirst < plast;)
+             if(cfirst <= clast)
+             {
+                 cfirst += numPoints(0, pfirst, xsize, pfirst + 1);
+                 pfirst++;
+             } else
+             {
+                 clast += numPoints(0, plast, xsize, plast + 1);
+                 plast--;
+             }
+
+         for(int i = 0; i < xsize; i++)
+         {
+             for(PointIterator pi = cellIterator(i, pfirst); pi.hasNext();)
+             {
+                 med += ((Vertex)pi.next()).y;
+                 cnt++;
+             }
+
+         }
+
+         if(cnt > 0)
+             med /= cnt;
+         else
+             med = (double)pfirst * cellsize + yoffset;
+         break;
+     }
+     }
+     return med;
+ }
+
+ public Vertex findNearestPointLinear(Vertex v)
+ {
+     double dist = 0.0D;
+     Vertex found = null;
+     for(int i = 0; i < array.length; i++)
+         if(array[i].point != v)
+         {
+             double pom = Vertex.sqrDistance(v, array[i].point);
+             if(found == null || pom < dist)
+             {
+                 found = array[i].point;
+                 dist = pom;
+             }
+         }
+
+     return found;
+ }
+
+ public Vertex findDelaunayPointLinear(Vertex a, Vertex b)
+ {
+     double dist = 0.0D;
+     Vertex found = null;
+     for(int i = 0; i < array.length; i++)
+         if(array[i].point != a && array[i].point != b && Vertex.ccw(a, b, array[i].point))
+         {
+             double pom = Vertex.delaunayDistance(a, b, array[i].point);
+             if(found == null || pom < dist)
+             {
+                 found = array[i].point;
+                 dist = pom;
+             }
+         }
+
+     return found;
+ }
+
+ public Vertex findFirst(Vertex v)
+ {
+     resetAllMarks();
+     Vertex found = null;
+     GridPosition gp = new GridPosition(v);
+     GridInterval gr = new GridInterval(gp.x, gp.y, gp.x + 1, gp.y + 1);
+label0:
+     while(found == null) 
+     {
+         for(int i = gr.x1; i < gr.x2; i++)
+         {
+             for(int j = gr.y1; j < gr.y2; j++)
+             {
+                 if(isMarked(i, j))
+                     continue;
+                 for(PointIterator pi = cellIterator(i, j); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     if(pom != v)
+                     {
+                         found = pom;
+                         break label0;
+                     }
+                 }
+
+                 setMark(i, j);
+             }
+
+         }
+
+         if(gr.x1 == 0 && gr.y1 == 0 && gr.x2 == xsize && gr.y2 == ysize)
+             break;
+         gr.set(gr.x1 - 1, gr.y1 - 1, gr.x2 + 1, gr.y2 + 1);
+     }
+     return found;
+ }
+
+ public Vertex findNearestPoint(Vertex v)
+ {
+     Vertex found = findFirst(v);
+     if(found == null)
+         return null;
+     double dist = Vertex.distance(v, found);
+     GridInterval gr = new GridInterval(v, dist);
+     for(int i = gr.x1; i < gr.x2; i++)
+     {
+         for(int j = gr.y1; j < gr.y2; j++)
+             if(!isMarked(i, j))
+             {
+                 for(PointIterator pi = cellIterator(i, j); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     if(pom != v)
+                     {
+                         double dd = Vertex.distance(pom, v);
+                         if(dd < dist)
+                         {
+                             dist = dd;
+                             found = pom;
+                             gr.set(v, dist);
+                         }
+                     }
+                 }
+
+                 setMark(i, j);
+             }
+
+     }
+
+     return found;
+ }
+
+ public Vertex findDelaunayPoint(Vertex a, Vertex b)
+ {
+     resetAllMarks();
+     Vertex found = null;
+     GridPosition gp = new GridPosition(new Vertex((a.x + b.x) / 2D, (a.y + b.y) / 2D));
+     GridInterval gr = new GridInterval(gp.x, gp.y, gp.x + 1, gp.y + 1);
+     Vertex S;
+label0:
+     while(found == null) 
+     {
+         for(int i = gr.x1; i < gr.x2; i++)
+         {
+             for(int j = gr.y1; j < gr.y2; j++)
+             {
+                 if(isMarked(i, j))
+                     continue;
+                 for(PointIterator pi = cellIterator(i, j); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     S = Vertex.findCenter(a, b, pom);
+                     double rad = Vertex.distance(S, a);
+                     if(pom != a && pom != b && Vertex.ccw(a, b, pom) && rad < DT.MAX_VALUE)
+                     {
+                         found = pom;
+                         break label0;
+                     }
+                 }
+
+                 setMark(i, j);
+             }
+
+         }
+
+         if(gr.x1 == 0 && gr.y1 == 0 && gr.x2 == xsize && gr.y2 == ysize)
+             break;
+         gr.set(gr.x1 - 1, gr.y1 - 1, gr.x2 + 1, gr.y2 + 1);
+     }
+     if(found == null)
+         return null;
+     S = Vertex.findCenter(a, b, found);
+     double dist = Vertex.distance(S, a);
+     if(!Vertex.ccw(a, b, S))
+         dist = -dist;
+     gr.set(S, Math.abs(dist));
+     for(int i = gr.x1; i < gr.x2; i++)
+     {
+label1:
+         for(int j = gr.y1; j < gr.y2; j++)
+         {
+             if(isMarked(i, j))
+                 continue;
+             for(PointIterator pi = cellIterator(i, j); pi.hasNext();)
+             {
+                 Vertex pom = (Vertex)pi.next();
+                 if(pom != a && pom != b && Vertex.ccw(a, b, pom))
+                 {
+                     S = Vertex.findCenter(a, b, pom);
+                     double dd = Vertex.distance(S, a);
+                     if(!Vertex.ccw(a, b, S))
+                         dd = -dd;
+                     if(dd < dist)
+                     {
+                         dist = dd;
+                         found = pom;
+                         int x1 = gr.x1;
+                         int y1 = gr.y1;
+                         int y2 = gr.y2;
+                         gr.set(S, Math.abs(dist));
+                         if(gr.x1 < x1 || gr.y1 < y1 || gr.y2 > y2)
+                         {
+                             i = gr.x1 - 1;
+                             break label1;
+                         }
+                     }
+                 }
+             }
+
+             setMark(i, j);
+         }
+
+     }
+
+     return found;
+ }
+
+ public QuadEdge findShortestCrossEdge(double med, int coord)
+ {
+     Vertex a = null;
+     Vertex b = null;
+     double d = 0.0D;
+     switch(coord)
+     {
+     case 0: // '\0'
+         for(int x = (int)((med - xoffset) / cellsize); a == null && x >= 0; x--)
+         {
+             for(int i = 0; i < ysize; i++)
+             {
+                 for(PointIterator pi = cellIterator(x, i); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     double dd = Math.abs(pom.x - med);
+                     if(pom.x < med && (a == null || dd < d))
+                     {
+                         a = pom;
+                         d = dd;
+                     }
+                 }
+
+             }
+
+         }
+
+         if(a == null)
+             return null;
+         int xmax = xsize;
+         for(int x = (int)((med - xoffset) / cellsize); b == null || x < xmax; x++)
+         {
+             for(int i = 0; i < ysize; i++)
+             {
+                 for(PointIterator pi = cellIterator(x, i); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     double dd = Vertex.distance(a, pom);
+                     if(pom.x >= med && (b == null || dd < d))
+                     {
+                         b = pom;
+                         d = dd;
+                         xmax = (int)(((med + d) - xoffset) / cellsize) + 1;
+                         if(xmax > xsize)
+                             xmax = xsize;
+                     }
+                 }
+
+             }
+
+         }
+
+         break;
+
+     case 1: // '\001'
+         for(int y = (int)((med - yoffset) / cellsize); a == null && y >= 0; y--)
+         {
+             for(int i = 0; i < xsize; i++)
+             {
+                 for(PointIterator pi = cellIterator(i, y); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     double dd = Math.abs(pom.y - med);
+                     if(pom.y < med && (a == null || dd < d))
+                     {
+                         a = pom;
+                         d = dd;
+                     }
+                 }
+
+             }
+
+         }
+
+         if(a == null)
+             return null;
+         int ymax = ysize;
+         for(int y = (int)((med - yoffset) / cellsize); b == null || y < ymax; y++)
+         {
+             for(int i = 0; i < xsize; i++)
+             {
+                 for(PointIterator pi = cellIterator(i, y); pi.hasNext();)
+                 {
+                     Vertex pom = (Vertex)pi.next();
+                     double dd = Vertex.distance(a, pom);
+                     if(pom.y >= med && (b == null || dd < d))
+                     {
+                         b = pom;
+                         d = dd;
+                         ymax = (int)(((med + d) - yoffset) / cellsize) + 1;
+                         if(ymax > ysize)
+                             ymax = ysize;
+                     }
+                 }
+
+             }
+
+         }
+
+         break;
+     }
+     if(b == null)
+         return null;
+     else
+         return QuadEdge.makeEdge(a, b);
+ }
+
+ private GridCell grid[][];
+ private PointItem array[];
+ private int xsize;
+ private int ysize;
+ private double xoffset;
+ private double yoffset;
+ private double cellsize;
+ private int currentMark;
+
+
+
+
+
+
+}
+
diff --git a/src/main/java/plugins/ragini/voronoidiagram/VRegion.java b/src/main/java/plugins/ragini/voronoidiagram/VRegion.java
new file mode 100644
index 0000000..e95a35d
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/VRegion.java
@@ -0,0 +1,1071 @@
+ package plugins.ragini.voronoidiagram;
+import java.awt.geom.Line2D;
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
+
+public class VRegion {
+	
+	private float pxmin = 10^10, pxmax = -1*(10^10), pymin = 10^10, pymax = -1 * (10^10); 
+	
+	private float[] xminymin, xminymax, xmaxymax, xmaxymin;
+	
+	private float Pxmin, Pxmax, Pymin, Pymax; 
+	
+	private VertTheta[] corner;
+	
+	private int numverts, numvedges, numtris;
+	
+	private int[] inverse;
+	
+	private VertTheta [] vtlist, slist;
+	private int vtnum; 
+	private Integer[][] adjlist; 
+	
+	private int MAXVERTS;
+	private Constants constants; 
+	private Vonoroi voronoi; 
+	private ArrayList<Neighbor>[][] bins; 
+	private VoronoiDiagram main; 
+
+	private static final int SAFE = -900000;
+	
+	public VRegion(Constants _constants, VoronoiDiagram v) {
+		xminymin = new float[3]; 
+		xminymax = new float[3]; 
+		xmaxymax = new float[3]; 
+		xmaxymin = new float[3]; 
+		vtlist = new VertTheta [1024];
+		slist = new VertTheta [1024]; 
+		adjlist = new Integer [MAXVERTS * 3][2]; 
+		corner = new VertTheta[4]; 
+		constants = _constants; 
+		inverse = new int[constants.maxVerts()];
+		main = v; 
+	}
+	
+	public void setVoronoi(Vonoroi v) {
+		voronoi = v; 
+	}
+	
+	public void outSite(Site s) {
+		
+	}
+	
+	public void outBisector(Edge e) {
+		//System.out.println("triangle line: " + "(" + e.reg()[0].getCoord().X() + "," + e.reg()[1].getCoord().Y() + ")" + " (" + e.reg()[0].getCoord().X() + "," + e.reg()[1].getCoord().Y() + ")");
+	}
+	
+	public void clipLine(Edge e, int origin) {
+		Site s1, s2;
+		Site r1, r2;
+		float x1, x2, y1, y2; 
+		
+		if (e.a() == 1 && e.b() >= 0) {
+			s1 = e.ep()[1];
+			//if (s1 == null) System.out.println("s1 null"); 
+			//else if (s1.getCoord() == null) System.out.println("s1 coord null");
+			//else System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y()); 
+			s2 = e.ep()[0];
+			//if (s2 == null) System.out.println("s2 null"); 
+			//else if (s2.getCoord() == null) System.out.println("s2 coord null"); 
+			//else System.out.println("s2: " + s2.getCoord().X() + " " + s1.getCoord().Y()); 
+			r1 = e.reg()[1];
+			r2 = e.reg()[0]; 
+		}
+		
+		else {
+			s1 = e.ep()[0];
+			//if (s1 == null) System.out.println("s1 null"); 
+			//else if (s1.getCoord() == null) System.out.println("s1 coord null"); 
+			//else System.out.println("s1: " + s1.getCoord().X() + " " + s1.getCoord().Y()); 
+			s2 = e.ep()[1];
+			//if (s2 == null) System.out.println("s2 null"); 
+			//else if (s2.getCoord() == null) System.out.println("s2 coord null"); 
+			//else System.out.println("s2: " + s2.getCoord().X() + " " + s2.getCoord().Y()); 
+			r1 = e.reg()[0];
+			r2 = e.reg()[1]; 
+		}
+		
+		if (s1 == null || s2 == null) {
+			NVert vA, vB; 
+			int A, B; 
+			
+			A = r1.sitenbr();
+			B = r2.sitenbr();
+			
+			vA = constants.chverts()[A]; 
+			vB = constants.chverts()[B]; 
+			
+			vA.setOnHull(1); 
+			vB.setOnHull(1); 
+			
+			if (vA.nbr1() == 1) {
+				vB.setNbr1(B); 
+			}
+			else if (vA.nbr2() == -1) {
+				if(vA.nbr1() != B) {
+					vA.setNbr2(B);
+				}
+			}
+			
+			if (vB.nbr1() == -1) {
+				vB.setNbr1(A);
+			}
+			else if (vB.nbr2() == -1) {
+				if (vB.nbr1() != A) {
+					vB.setNbr2(A); 
+				}
+			}
+			
+		}
+		
+		if(e.a() == 1) {
+			y1 = pymin; 
+			if (s1 != null && s1.getCoord().Y() > pymin) {
+				y1 = s1.getCoord().Y(); 
+			}
+			if (y1 > pymax) return;
+			x1 = e.c() - e.b()*y1; 
+			y2 = pymax;
+			if (s2 != null && s2.getCoord().Y() < pymax) {
+				y2 = s2.getCoord().Y();
+			}
+			if (y2 < pymin) return; 
+			x2 = e.c() - e.b()*y2; 
+			if ((x1 > pxmax & x2 > pxmax) | (x1 < pxmin & x2 <pxmin)) {
+				return;
+			}
+			if (x1 > pxmax) {
+				x1 = pxmax;
+				y1 = (e.c()-x1)/e.b();
+				if (e.b() == 0) System.out.println("dividing by zero"); 
+				
+			}
+			if (x1 < pxmin) {
+				x1 = pxmin;
+				y1 = (e.c() - x1)/e.b();
+				if (e.b() == 0) System.out.println("dividing by zero"); 
+			}
+			if (x2 > pxmax) {
+				x2 = pxmax;
+				y2 = (e.c() - x2)/e.b(); 
+				if (e.b() == 0) System.out.println("dividing by zero"); 
+			}
+			if (x2  < pxmin) {
+				x2 = pxmin;
+				y2 = (e.c() - x2)/e.b(); 
+				if (e.b() == 0) System.out.println("dividing by zero"); 
+			}
+		}
+		else {
+			x1 = pxmin;
+			if (s1 != null && s1.getCoord().X() > pxmin) {
+				x1 = s1.getCoord().X(); 
+			}
+			if (x1 > pxmax) return; 
+			y1 = e.c() - e.a() * x1; 
+			x2 = pxmax;
+			if (s2 != null && s2.getCoord().X() < pxmax) {
+				x2 = s2.getCoord().X();
+			}
+			if (x2 < pxmin) return; 
+			y2 = e.c() - e.a() * x2;
+			if ((y1 > pymax & y2 > pymax) | (y1 < pymin & y2 < pymin)) return;
+			if (y1> pymax) {
+				y1 = pymax;
+				x1 = (e.c() - y1)/e.a();
+				if(e.a() == 0) System.out.println("dividing by zero"); 
+			}
+			if(y1 < pymin) {
+				y1 = pymin;
+				x1 = (e.c() - y1) /e.a();
+				if(e.a() == 0) System.out.println("dividing by zero"); 
+			}
+			if(y2 > pymax) {
+				y2 = pymax;
+				x2 = (e.c() - y2) /e.a();
+				if(e.a() == 0) System.out.println("dividing by zero"); 
+			}
+			if(y2 < pymin) {
+				y2 = pymin;
+				x2 = (e.c() - y2) /e.a(); 
+				if(e.a() == 0) System.out.println("dividing by zero"); 
+			}
+		}
+		
+		//draw line(x1,y1,x2,y2) 
+		//System.out.println("line: " + "(" + x1 + "," + y1 + ")" + " (" + x2 + "," + y2 + ")"); 
+		Point2D p1 = new Point2D.Double(x1, y1); 
+		Point2D p2 = new Point2D.Double(x2, y2); 
+		/*try {
+			Thread.sleep(2000);
+		} catch (InterruptedException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}*/ 
+		constants.lines()[constants.lineindex()][0] =  p1; 
+		constants.lines()[constants.lineindex()][1] =  p2;
+		constants.setlineindex(constants.lineindex() + 1); 
+		
+		if (constants.triangulate() == 0) {
+			constants.vedges()[numvedges] = new EdgeS();  
+			constants.vedges()[numvedges].setx1(x1); 
+			constants.vedges()[numvedges].sety1(y1);
+			constants.vedges()[numvedges].setx2(x2);
+			constants.vedges()[numvedges].sety2(y2);                          
+			
+			constants.vedges()[numvedges].setnbr1(r1 != null ? r1.sitenbr() : SAFE);
+			constants.vedges()[numvedges].setnbr2(r2 != null ? r2.sitenbr() : SAFE-1); 
+			
+			if (r1 != null && r2 != null) {
+				constants.vedges()[numvedges].setxm(avg(r1.getCoord().X(), r2.getCoord().X()));
+				constants.vedges()[numvedges].setym(avg(r1.getCoord().Y(), r2.getCoord().Y())); 
+			}
+			
+			if(constants.vrdebug() == 1) {
+				///System.out.println...
+			}
+			
+			if (numvedges < constants.maxEdges()) numvedges++; 
+			else {
+				System.out.println("edge list overflow!"); 
+				System.exit(-1); 
+			}
+			
+		}
+		return;
+		
+	}
+	
+	public float avg(float a, float b) {
+		return (a + b)/2; 
+	}
+	
+	public void outEP(Edge e, int origin) {
+		
+		if(constants.triangulate() == 0) {
+			clipLine(e, origin); 
+		}
+		
+		if(constants.vrdebug() == 1) {
+			///System.out.println...
+		}
+		
+	}
+	
+	public void outVertex (Site v) {
+		
+		if(constants.triangulate() == 0) {
+			constants.verts()[numverts] = new Vert(); 
+			constants.verts()[numverts].setX(v.getCoord().X()); 
+			constants.verts()[numverts].setY(v.getCoord().Y()); 
+			
+			if (numverts < constants.maxVerts()) numverts++; 
+			else {
+				System.out.println("nvert list overflow");
+				System.exit(-1); //not sure if should use this 
+			}
+			
+		}
+		
+		if(constants.vrdebug() == 1) {
+			///System.out.println...
+		}
+		
+	}
+	
+	public int CHS_LEFTOF(float cx, float cy, float ax, float ay, float bx, float by) {
+		
+		/* predicate: true iff point c leftof directed line ab */
+		/* observation: we should use two shortest disp vectors */
+		
+		double dist_ab, dist_bc, dist_ca, max_dist;
+		double det_b, det_a, det_c;
+		double err_b, err_a, err_c; 
+		
+		if (ax == bx && ay == by) {
+			System.out.println("indeterminate line");
+			return 0; 
+		}
+		
+		if ((cx == ax && cy == ay) ||(cx == bx && cy == by))
+			return 0;
+		
+		dist_ab = Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay));
+		dist_bc = Math.sqrt((cx - bx)*(cx - bx) + (cy - by)*(cy - by));
+		dist_ca = Math.sqrt((ax - cx)*(ax - cx) + (ay - cy)*(ay - cy)); 
+		
+		max_dist = max(dist_ab, max(dist_bc, dist_ca)); 
+		
+		if(max_dist == dist_bc) {
+			/* use a as a pivot point [ie., form (c-a) x (b-a)] */
+			det_a = (ax - cx) * (by - ay) - (ay - cy) * (bx - ax);
+			if (det_a == 0) return 0; 
+			err_a = (Math.abs((ax - cx) * (by - ay)) + Math.abs((ay - cy) * (bx - ax)))/det_a; 
+			if ((Math.abs(det_a) > (10^-6)) || (err_a < (10^-7))) {
+				return ((det_a > 0) ? 1 : 0); 
+			}
+			else return 0;
+		}
+		else if (max_dist == dist_ca) {
+			/* use b as a pivot point [ie., form (a-b) x (c-b)] */
+			det_b = (cx - bx) * (ay - by) - (cy - by) * (ax - bx);
+			if (det_b == 0) return 0; 
+			err_b = (Math.abs((cx - bx) * (ay - by)) + Math.abs((cy - by) * (ax - bx)))/det_b; 
+			if ((Math.abs(det_b) > (10^-6)) || (err_b < (10^-7))) {
+				return ((det_b > 0) ? 1 : 0); 
+			}
+			else return 0;
+		}
+		else if (max_dist == dist_ab) {
+			/* use c as a pivot point [ie., form (b-c) x (a-c)] */
+			det_c = (ax - cx) * (by - cy) - (ay - cy) * (bx - cx);
+	        if (det_c == 0) {
+	        	return (0);}
+	        err_c = (Math.abs((cx - ax) * (by - cy)) + Math.abs((cy - ay) * (bx - cx))) / det_c;
+		if ((Math.abs(det_c) > (10^-6)) || (err_c < (10^-7))) {
+		    return ((det_c > 0)? 1 : 0); }
+		else {
+		    return (0); }
+		}
+		else {
+			System.out.println("error max distance"); 
+		}
+		return -3;
+	}
+	
+	public double max(double a, double b) {
+		return (a > b? a : b); 
+	}
+	
+	public float max(float a, float b) {
+		return (a > b? a : b); 
+	}
+	
+	public void outTriple(Neighbor s1, Neighbor s2, Neighbor s3) {
+		
+		Vert tmp;
+		Tri tri = null; 
+		
+		if (constants.triangulate() == 1) {
+			if (numtris < constants.maxTris()) {
+				tri = new Tri(); 
+			}
+			else {
+				System.out.println("triangle list overflow");
+				System.exit(-1); 
+			}
+			
+			tri.setV1(new Vert(constants.sites()[s1.sitenbr()].getCoord().X(), constants.sites()[s1.sitenbr()].getCoord().Y())); 
+			tri.setV2(new Vert(constants.sites()[s2.sitenbr()].getCoord().X(), constants.sites()[s2.sitenbr()].getCoord().Y()));  
+			tri.setV3(new Vert(constants.sites()[s3.sitenbr()].getCoord().X(), constants.sites()[s3.sitenbr()].getCoord().Y()));  
+			
+			if (CHS_LEFTOF(tri.v3().X(), tri.v3().Y(), tri.v1().X(), tri.v1().Y(), tri.v2().X(), tri.v2().Y()) == 0) {
+				tmp = tri.v3();
+				tri.setV3(tri.v2());
+				tri.setV2(tmp); 
+			}
+			
+			if(constants.rng() == 1) {
+				ArrayList<EdgeRNG> lines = new ArrayList<EdgeRNG>(); 
+				lines.add(new EdgeRNG(s1, s2)); 
+				lines.add(new EdgeRNG(s2, s3));
+				lines.add(new EdgeRNG(s1, s3));
+				for (EdgeRNG e: lines) {
+					boolean keep = true;
+					int i = 0; 
+					for(Neighbor n: e.endpoints()) {
+						int thisbinx = (int) (Math.floor(n.getCoord().X()/constants.getedgex())) -1; 
+						if (thisbinx < 0) thisbinx = 0; 
+						int thisbiny = (int) (Math.floor(n.getCoord().Y()/constants.getedgey())) -1; 
+						if (thisbiny < 0) thisbiny = 0; 
+						int numbinsx = (int) Math.ceil(e.length()/constants.getedgex()) + 3; 
+						int numbinsy = (int) Math.ceil(e.length()/constants.getedgey()) + 3; 
+						int bstartx = thisbinx - numbinsx;
+						if (bstartx < 0) bstartx = 0; 
+						int bendx = thisbinx + numbinsx; 
+						if (bendx > constants.maxbinx()) bendx = constants.maxbinx(); 
+						int bstarty = thisbiny - numbinsy; 
+						if (bstarty < 0) bstarty = 0; 
+						int bendy = thisbiny + numbinsy; 
+						if (bendy> constants.maxbiny()) bendy = constants.maxbiny(); 
+						for (int bx = bstartx; bx < bendx; bx++) {
+							for (int by = bstarty; by < bendy; by++) {
+								ArrayList<Neighbor> test = bins[bx][by]; 
+								if (test != null) {
+									for (Neighbor t : test) {
+										if (t != e.endpoints().get(0)
+												&& t != e.endpoints().get(1)) {
+											double dist = distance(n, t);
+											if (dist < e.length()) {
+												int otherend = (i == 0) ? 1: 0; 
+												double dist2 = distance(e.endpoints().get(otherend), t);
+												if (dist2 < e.length()) keep = false; 
+											}
+										}
+									}
+								}
+							}
+						}
+						i++; 
+					}
+					if (keep == true) constants.relativeneighbors().add(e); 
+				}
+			}
+		
+			constants.tris()[numtris] = tri; 
+			numtris++; 
+			
+			if (!s1.neighbors().contains(s2))
+				s1.addNeighbor(s2); 
+			if (!s1.neighbors().contains(s3))
+				s1.addNeighbor(s3);  
+			if (!s2.neighbors().contains(s1))
+				s2.addNeighbor(s1); 
+			if (!s2.neighbors().contains(s3))
+				s2.addNeighbor(s3); 
+			if (!s3.neighbors().contains(s1))
+				s3.addNeighbor(s1); 
+			if (!s3.neighbors().contains(s2))
+				s3.addNeighbor(s2);   		
+			
+		}
+	}
+	
+	private double distance(Neighbor g1, Neighbor g2) {
+		return distance(g1.getCoord().X(), g1.getCoord().Y(), g2.getCoord().X(), g2.getCoord().Y()); 
+	}
+	
+	private double distance(double ax, double ay, double bx, double by) {
+		return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay)));
+	}
+	
+	public void vdInit() {
+		numtris = 0;
+		numvedges = 0;
+		numverts = 0; 
+	}
+	
+	public void emitSites(Site[] vsites, int nsites) {
+		//Printing some stuff...
+		//opening files 
+	}
+	
+	private class scomp implements Comparator<Neighbor> {
+
+		@Override
+		public int compare(Neighbor s1, Neighbor s2) {
+			if(s1.getCoord().Y() < s2.getCoord().Y()) return -1;
+			else if (s1.getCoord().Y() > s2.getCoord().Y()) return 1;
+			else if (s1.getCoord().X() < s2.getCoord().X()) return -1;
+			else if (s1.getCoord().X() > s2.getCoord().X()) return 1;
+			else return 0; 
+		}
+		
+	}
+	
+	public void bBoxInit() {
+		int k;
+		float dx, dy, x, y; 
+		
+		constants.setvxmin(10^10);
+		constants.setvxmax(-1*(10^10));
+		constants.setvymin(10^10);
+		constants.setvymax(-1*(10^10)); 
+		
+		Neighbor [] sites = new Neighbor[constants.nsites()]; 
+		
+		//System.out.println("numsites: " + constants.nsites()); 
+		for (k = 0; k < constants.nsites(); k++) {
+			//set sites all the same as GLsites (right now, the data read directly from the image) 
+			
+			Point c = new Point(); 
+			x = constants.getGLSites()[k].X(); //System.out.println("glsitex: " + x); 
+			y = constants.getGLSites()[k].Y(); //System.out.println("glsitey: " + y); 
+			c.setX(x);
+			c.setY(y);
+			Neighbor s = new Neighbor(); 
+			s.setCoord(c);
+			s.setSiteNbr(k); 
+			sites[k] = s; 
+			
+			//System.out.println("setting site: " + s.getCoord().X() + " " + s.getCoord().Y()); 
+		
+			//find the current bounds 
+			
+			if(x < constants.vxmin()) {
+				constants.setvxmin(x);
+			}
+			
+			if (y < constants.vymin()) {
+				constants.setvymin(y); 
+			}
+			
+			if (x > constants.vxmax()) {
+				constants.setvxmax(x);
+			}
+			
+			if (y > constants.vymax()) {
+				constants.setvymax(y);  
+			}
+			
+		}
+		
+		if(constants.rng() == 1) {
+			constants.setrelativeneighbors(new ArrayList<EdgeRNG>(constants.nsites() * 2)); 
+			int n = (int) Math.floor(Math.sqrt(constants.nsites())); 
+			constants.setmaxbinx(n);
+			constants.setmaxbiny(n); 
+			bins = new ArrayList[n][n]; 
+			int edgex = (int) Math.floor((constants.vxmax()-constants.vxmin())/n);
+			constants.setedgex(edgex);
+			int edgey = (int) Math.floor((constants.vymax()-constants.vymin())/n); 
+			constants.setedgey(edgey); 
+			int binx;
+			int biny; 
+			for(Neighbor j: sites) {
+				binx = (int) (Math.floor(j.getCoord().X()/edgex)) -1; 
+				if (binx < 0) binx = 0; 
+				biny = (int) (Math.floor(j.getCoord().Y()/edgey)) -1; 
+				if (biny < 0) biny = 0; 
+				if (bins[binx][biny] == null) {
+					bins[binx][biny] = new ArrayList<Neighbor>(); 
+				}
+				bins[binx][biny].add(j); 
+			}
+		}
+		
+		scomp comp = new scomp(); 
+		
+		Arrays.sort(sites, comp);
+		
+		constants.setSites(sites); 
+		
+		if (constants.vrdebug() == 1) {
+			emitSites(constants.sites(), constants.nsites()); //print some stuff...
+		}
+		
+		float epsilon = 1; 
+		
+		dx = constants.vxmax() - constants.vxmin();
+		dx = max(dx, epsilon); 
+		
+		dy = constants.vymax() - constants.vymin();
+		dy = max(dy, epsilon); 
+		
+		pxmin = (float) (constants.vxmin() - (dx*0.25));
+		pymin = (float) (constants.vymin() - (dy*0.25));
+		pxmax = (float) (constants.vxmax() + (dx*0.25));
+		pymax = (float) (constants.vymax() + (dy*0.25));
+		
+		//Some more printing...
+		
+	}
+	
+	/* load_vsites(): 
+    accept the n voronoi sites (x_n, y_n)
+    calculate and store the voronoi diagram over the n sites,
+    clipping all infinite edges to bbox: [xmin, ymin, xmax, ymax].
+    
+    note: if (xmin,ymin,xmax,ymax are all == 0.0), OR
+	if these do not enclose the data, a bounding box
+	 will be computed over the input.
+
+    returns:
+	-1 if error
+	 0 otherwise
+*/
+	
+	//usites = data from image 
+	//n = number of data points? 
+	
+	public int loadVSites (int n, float[][] usites, float uxmin, float uymin, float uxmax, float uymax) {
+		int k, compute_bbox, sid; //tid;
+		float dx, dy; //x, y; 
+		
+		if (n >= constants.maxSites()) {
+			System.out.println("error too many sites"); 
+			return -1; 
+		}
+		
+		compute_bbox = ((uxmin == 0) && (uymin == 0) && (uxmax == 0) && (uymax == 0)) ? 1 : 0; 
+		
+		Vert[] USites = new Vert[n];
+		Vert[] GLSites = new Vert[n]; 
+		//NVert[] chverts = new NVert[constants.maxVerts()];
+		for (k = 0; k < n; k++) {
+			Vert v = new Vert();
+			v.setX(usites[k][0]);
+			//System.out.println("getting usites: " + usites[k][0] + " " + usites[k][1]); 
+			v.setY(usites[k][1]);
+			USites[k] = v; 
+			//System.out.println("set v: " + v.X()  + " " + v.Y()); 
+			Vert r = new Vert();
+			r.setX(usites[k][0]);
+			r.setY(usites[k][1]);
+			GLSites[k] = r; 
+			
+			//System.out.println("setting glsite: " + r.X() + " " + r.Y()); 
+			
+			//here, GLsites is the same as USites, which is just data read directly from the image 
+			constants.chverts()[k] = new NVert(); 
+			constants.chverts()[k].setNbr1(-1); 
+			constants.chverts()[k].setNbr2(-1); //what is the purpose of this? 
+			constants.chverts()[k].setOnHull(0); 
+		}
+		
+		constants.setUSites(USites);
+		constants.setGLsites(GLSites); 
+		
+		constants.setNSites(n); 
+		if (constants.nsites() <=2) {
+			for(k = 0; k < constants.nsites(); k++) {
+				constants.uchverts()[k].setVPid(k);
+				constants.uchverts()[k].setNbr1((k-1+constants.nsites()) % constants.nsites()); //what is the purpose of this? 
+				constants.uchverts()[k].setNbr2((k+1+constants.nsites()) % constants.nsites()); 
+			}
+			return -3; 	
+		}
+		
+		voronoi.sortGLSites(); //sort by data points and remove coincident sites 
+		
+		bBoxInit(); //set some bounds 
+		
+		/* now, if user punted on bbox calculation, OR if user bbox does not truly enclose
+	       user data, we use our bbox (computed in initbbox).  otherwise we take the user's. */
+		
+		if (!(compute_bbox == 1 || uxmin > constants.vxmin() || uymin > constants.vymin() || uxmax < constants.vxmax() || uymax < constants.vymax())) {
+			//if we did not want to compute bbox or what the user gave (?) is larger than what was computed? 
+			pxmin = uxmin;
+			pymin = uymin;
+			pxmax = uxmax;
+			pymax = uymax; 
+		}
+		
+		xminymax[0] = pxmin;
+		xminymin[0] = pxmin;
+		xminymin[1] = pymin;
+		xmaxymin[1] = pymin;
+		
+		xmaxymax[0] = pxmax;
+		xmaxymin[0] = pxmax;
+		xmaxymax[1] = pymax;
+		xminymax[1] = pymax; 
+		
+		corner[0] = new VertTheta(xminymin[0], xminymin[1]);
+		corner[1] = new VertTheta(xmaxymin[0], xmaxymin[1]);
+		corner[2] = new VertTheta(xmaxymax[0], xmaxymax[1]);
+		corner[3] = new VertTheta(xminymax[0], xminymax[1]); 
+		
+		/* now: set the floating point tolerance values P*** to be 1 or 2 significant bits inside the p*** */
+	    /* be careful to use RELATIVE error; that is, to scale the tolerance to the bbox values themselves */
+	    /* now, if some user puts points way out in left field, our technique handles the ranges correctly */
+		
+		dx = (pxmax - pxmin) * (1/4096);
+		dy = (pymax - pymin) * (1/4096); 
+		
+		//cut a little off the edges? 
+		
+		Pxmin = pxmin + dx;
+		Pxmax = pxmax - dx;
+		Pymin = pymin + dy;
+		Pymax = pymax - dy;    
+		
+		/* compute inverse of external->internal sid mapping */
+	    /* given an internal site number, returns user index */
+		
+		for (sid = 0; sid < constants.nsites(); sid++) {
+			inverse[sid] = constants.getGLSites()[sid].vpid(); //when did vpid get set and what is it? 
+		}
+		
+		
+		//creating an inverse of some sort...? 
+		/*for (sid = 0; sid < constants.nsites(); sid ++) {
+			if (constants.sites()[sid].getCoord().X() != constants.USites()[inverse[sid]].X()) 
+				System.out.println("inverse error");
+			if (constants.sites()[sid].getCoord().Y() != constants.USites()[inverse[sid]].Y()) 
+				System.out.println("inverse error"); 
+		}
+		*/
+		
+		vdInit(); //initialize counting numbers 
+		
+		/* run the voronoi code, no triangulate */
+		//constants.setTriangulate(0); 
+		//voronoi.voronoi();
+		
+		//bBoxInit();
+		//constants.setTriangulate(1); 
+		//System.out.println("triangulate: " + constants.triangulate()); 
+		voronoi.voronoi(); 
+		
+		for (sid = 0; sid < constants.nsites(); sid++) {
+			constants.sites()[sid].setSiteNbr(constants.getGLSites()[sid].vpid());
+			constants.sites()[sid].getCoord().setX(constants.getGLSites()[sid].X());
+			constants.sites()[sid].getCoord().setY(constants.getGLSites()[sid].Y()); 
+		}
+		
+		return 0; 
+		
+	}
+	
+	private class vtcomp implements Comparator<VertTheta> {
+
+		@Override
+		public int compare(VertTheta v1, VertTheta v2) {
+			if (v1.theta() < v2.theta()) {
+				return -1;
+			}
+			else if (v1.theta() > v2.theta()) {
+				return 1;
+			}
+			else return 0; 
+		}
+		 
+	}
+	
+	/*
+    find_vregion(sid, plen, pverts)
+	given a site id 'sid' from 0..nsites-1 inclusive, 
+	returns the voronoi polygon associated with that site
+	in the array 'pverts', and its length on call stack.
+
+	the vertices are returned in counterclockwise order.
+
+    returns:
+	-1 if error condition
+	plen > 2 [i.e., the # of verts in the voronoi polygon] otherwise
+*/
+	
+	public int findVRegion (int vsid, float[][] pverts) {
+		
+		//given a site id, returns the voronoi polygon associated with that site, with the vertices returned in counterclockwise order 
+		
+		int sid, b, k, vnum, bnd1, bnd2, bdiff, sleft, lag, lead, p1a, p1b, p2a, p2b;
+		float x, y, x1, y1, x2, y2, theta1, theta2, lasttheta, dtheta, h; 
+		
+		//ifdef statement here - but the identifier is never actually defined in the code, so perhaps it is not needed? 
+		
+		if (vsid < 0 || vsid >= constants.nsites()){
+			System.out.println("error site bounds");
+			return -1; 
+		}
+		
+		for (sid = 0; sid < constants.nsites(); sid++) {
+			if (constants.getGLSites()[sid].vpid() == vsid)
+				break;
+		}
+		
+		if (sid == constants.nsites()) {
+			System.out.println("can't find requested site");
+			return -1; 
+		}
+		
+		for (k = 0; k < 4; k++) {
+			corner[k].setTheta((float) Math.atan2((double) (corner[k].Y() - constants.getGLSites()[sid].Y()), (double) (corner[k].X() - constants.getGLSites()[sid].X()))); 
+		}
+		
+		vtnum = 0;
+		for (k = 0; k < numvedges; k++) {
+			if (constants.vedges()[k].nbr1() == sid) {
+				slist[vtnum].setE1(k);
+				slist[vtnum].setE2(k); 
+				slist[vtnum].setTheta((float) Math.atan2((double) (constants.vedges()[k].y1() - constants.getGLSites()[sid].Y()), (double) (constants.vedges()[k].x1() - constants.getGLSites()[sid].X()))); 
+				slist[vtnum].setX(constants.vedges()[k].x1());
+				slist[vtnum].setY(constants.vedges()[k].y1()); 
+				
+				vtnum ++;
+				
+				slist[vtnum].setE1(k);
+				slist[vtnum].setE2(k); 
+				slist[vtnum].setTheta((float) Math.atan2((double) (constants.vedges()[k].y2() - constants.getGLSites()[sid].Y()), (double) (constants.vedges()[k].x2() - constants.getGLSites()[sid].X()))); 
+				slist[vtnum].setX(constants.vedges()[k].x2());
+				slist[vtnum].setY(constants.vedges()[k].y2());
+				
+			}
+		}
+		
+		vtcomp comp = new vtcomp(); 
+		
+		Arrays.sort(slist, comp);  
+		
+		lag = 0;
+		lead = 0;
+		
+		vtlist[lag] = slist[lead]; 
+		lasttheta = -10; 
+		
+		while (lead < vtnum) {
+			if (Math.abs((slist[lead].theta()- lasttheta)) > (10^-4)) {
+				lasttheta = slist[lead].theta();
+				vtlist[lag] = slist[lead];
+				lag++;
+				lead++; 
+			}
+			else {
+				vtlist[lag-1].setE2(slist[lead].e1());
+				lead++; 
+			}
+		}
+		
+		vtnum = lag; 
+		
+		vnum = 0; 
+		for(k = 0; k < vtnum; k++) {
+			if (Math.abs(vtlist[(k + vtnum - 1) % vtnum].theta() - vtlist[k].theta()) < (10^-4)){
+				System.out.println("region identical"); 
+				return -1; 
+			}
+			
+			x1 = vtlist[(k + vtnum - 1) % vtnum].X();
+			y1 = vtlist[(k + vtnum - 1) % vtnum].Y();
+			p1a = vtlist[(k + vtnum - 1) % vtnum].e1();
+			p1b = vtlist[(k + vtnum - 1) % vtnum].e2(); 
+			x2 = vtlist[k].X();
+			y2 = vtlist[k].Y();
+			p2a = vtlist[k].e1(); 
+			p2b = vtlist[k].e2(); 
+			
+			if (((p1a == p2a) || (p1a == p2b) || (p1b == p2b)) && (vtnum > 2)) {
+				sid = PUTV(vtlist[k], sid, pverts); 
+			}
+			else {
+			bnd1 = NBOUND(x1, y1); 
+			bnd2 = NBOUND(x2, y2);
+			
+			if (bnd1 >= 0 && bnd2 >=0) 
+				bdiff = ((bnd2 - bnd1) + 4) % 4;
+			else 
+				bdiff = 0; 
+			
+			if (bdiff == 0) {
+				sid = PUTV(vtlist[k], sid, pverts);
+			}
+			else {
+			if (vtnum == 2) {
+				theta1 = vtlist[0].theta();
+				theta2 = vtlist[1].theta();
+				dtheta = theta2 - theta1; 
+				
+				for(b = 0; b < 4; b++){
+					if ( /*dtheta >= M_PI*/ (corner[b].theta() > theta1) && (corner[b].theta() < theta2)) { //theta is the angle measure? 
+						vtlist[vtnum++] = corner[b]; 
+					}
+					else if ( /*dtheta < M_PI*/ ((corner[b].theta() < theta1) || corner[b].theta() > theta2)) {
+						vtlist[vtnum++] = corner[b]; 
+					}
+				}
+				
+				Arrays.sort(vtlist, comp); 
+				
+				for(b = 0; b < vtnum; b++) {
+					sid = PUTV(vtlist[b], sid, pverts); 
+				}
+				
+				break; 
+				
+			}
+			
+			for (b = 0; b < bdiff; b++) {
+				sid = PUTV(corner[(bnd1 + b) % 4], sid, pverts);
+			}
+			
+			sid = PUTV(vtlist[k], sid, pverts); 
+			}
+		}
+		}
+		
+		return vnum; 
+		
+	}
+	
+	private int NBOUND(float x, float y) {
+		return (x >= Pxmax ? constants.rbnd() : (x <= Pxmin ? constants.lbnd() : (y >= Pymax ? constants.tbnd() : (y <= Pymin ? constants.bbnd() : -1))));
+	}
+	
+	private int PUTV(VertTheta v, int vid, float[][] pverts) {//////////////////
+		pverts[vid][0] = v.X();
+		pverts[vid][1] = v.Y(); 
+		return (vid + 1); 
+	}
+	
+	public int findDTriangles () {///////////////////
+		if (numtris <= 0){
+			constants.setdtris(null); 
+			return -1;
+		}
+		else {
+			Tri[] dtris = new Tri[constants.maxTris()];
+			int i = 0; 
+			for (Tri t: constants.tris()) {
+				dtris[i] = t; 
+				i++; 
+			}
+			constants.setdtris(dtris);  
+			return numtris; 
+		}
+	}
+	
+	private boolean EMATCH(Vert Ap, Vert Aq, Vert Bp, Vert Bq) {
+		return (Ap == Bp && Aq == Bq); 
+	}
+	
+	public int findDTAdjacencies (IntArraySetter dtadjset) {
+		int nadj = 0, j, k, nematched;
+		Tri trij, trik; 
+		
+		if (numtris <= 0) {
+			dtadjset.set(null); 
+			return -1;
+		}
+		else {
+			for (j = 0; j < numtris; j++) {
+				trij = constants.tris()[j];
+				nematched = 0; 
+				for (k = j + 1; k < numtris; k++) {
+					trik = constants.tris()[k]; 
+					if (EMATCH(trij.v1(), trij.v2(), trik.v3(), trik.v2()) || EMATCH(trij.v1(), trij.v2(), trik.v2(), trik.v1()) || EMATCH(trij.v1(), trij.v2(), trik.v1(), trik.v3())) {
+						adjlist[nadj][0] = j;
+						adjlist[nadj++][1] = k;
+						nematched++; 
+					}
+					else if (EMATCH(trij.v2(), trij.v3(), trik.v3(), trik.v2()) || EMATCH(trij.v1(), trij.v3(), trij.v2(), trik.v1()) || EMATCH(trij.v2(), trij.v3(), trik.v1(), trik.v3())) {
+						adjlist[nadj][0] = j;
+						adjlist[nadj++][1] = k; //what does the ++ denote? 
+						nematched++;
+					}
+					else if (EMATCH(trij.v3(), trij.v1(), trik.v3(), trik.v2()) || EMATCH(trij.v3(), trij.v1(), trik.v2(), trik.v1()) || EMATCH(trij.v3(), trij.v1(), trik.v1(), trik.v3())) {
+						adjlist[nadj][0] = j;
+						adjlist[nadj++][1] = k;
+						nematched++; 
+					}
+					if (nematched == 3)
+						break; 
+				}
+			}
+			dtadjset.set(adjlist); //this should maybe be the other way around? 
+			return nadj; 
+		}
+		
+	}
+	
+	public int fident(float a, float b) {
+		float sum;
+		
+		sum = Math.abs(a) + Math.abs(b); 
+		if (sum == 0) 
+			return 1; 
+		else {
+			sum = (a-b)/sum;
+			return ((sum > (2*(10^-7)) ? 1 : 0)); 
+		}
+			 
+	}
+	
+	public int xycollinear (float ax, float ay, float bx, float by, float cx, float cy) {
+		float AX, AY, BX, BY; 
+		
+		AX = bx - ax;
+		AY = by - ay;
+		BX = cx - bx;
+		BY = cy - by;
+		
+		return fident(AX*BY, BX*AY); 
+		
+	}
+	
+	public int findConvexHull(ArraySetter chvertset) {  //type of chvertices??
+		int k, nchverts, nbr1, nbr2; 
+		NVert v1 = null, v2, T;
+		int start, lag, lead;
+		
+		if (constants.nsites() <= 2) {
+			chvertset.set(constants.uchverts()); 
+			return constants.nsites(); 
+		}
+		
+		for(k = 0; k < constants.nsites(); k++) {
+			v1 = constants.chverts()[k];
+			if (v1.onhull() == 1 && v1.nbr1() != -1 && v1.nbr2() != -1) {
+				break; 
+			}
+		}
+			if (k == constants.nsites()) {
+				System.out.println("no hull edge found");
+				chvertset.set(null);  
+				return -1; 
+			}
+			
+			start = v1.vpid();
+			lag = v1.vpid();
+			lead = v1.nbr2();
+			
+			k = 0;
+			
+			while(lag != start) {
+				if (k>0) 
+					constants.uchverts()[k].setNbr1(constants.uchverts()[k-1].vpid()); 
+				constants.uchverts()[k].setVPid(inverse[lag]); 
+				constants.uchverts()[k++].setNbr2(inverse[lead]); 
+				
+				if (lag == constants.chverts()[lead].nbr1()) {
+					lag = lead;
+					lead = constants.chverts()[lead].nbr2(); 
+				}
+				else if (lag == constants.chverts()[lead].nbr2()) {
+					lag = lead;
+					lead = constants.chverts()[lead].nbr1(); 
+				}
+				else {
+					System.out.println("inconsistent convex hull");
+					return 0;
+				}
+				
+			}
+			
+			constants.uchverts()[0].setNbr1(constants.uchverts()[k-1].vpid()); 
+			nchverts = k; 
+		
+		lag = 0; 
+		for (k = 0; k < nchverts; k++) {
+			if ((fident(UX(k), UX((k + 1) % nchverts)) != 1 && fident(UY(k), UY((k + 1) % nchverts)) == 1)) {
+				constants.uchverts()[lag++] = constants.uchverts()[k]; 
+			}
+			if (lag != nchverts) {
+				System.out.println("excised coincident convex hull vertices");
+				k = lag;
+				nchverts = lag;
+			}
+		}
+		
+		if (nchverts > 2) {
+			lag = 0; 
+			for (k = 0; k < nchverts; k++) {
+				if (xycollinear(UX(k), UY(k), UX((k + 1) % nchverts), UY((k + 1) % nchverts), UX((k + 2) % nchverts), UY((k + 2) % nchverts)) == 0) {
+					constants.uchverts()[lag++] = constants.uchverts()[k]; 
+				}
+			}
+			if (lag != nchverts) {
+				System.out.println ("excised dgenerate convex hull edges");
+				k = lag;
+				nchverts = lag; 
+			}
+		}
+			
+		chvertset.set(constants.uchverts()); 
+		return k; 
+		
+	}
+	
+	public float UX(int k) {
+		return constants.USites()[constants.uchverts()[k].vpid()].X(); 
+	}
+	
+	public float UY(int k) {
+		return constants.USites()[constants.uchverts()[k].vpid()].Y(); 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vert.java b/src/main/java/plugins/ragini/voronoidiagram/Vert.java
new file mode 100644
index 0000000..72a1807
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Vert.java
@@ -0,0 +1,19 @@
+package plugins.ragini.voronoidiagram;
+
+public class Vert extends Point {
+	
+	private int vpid; 
+	
+	public Vert(float _x, float _y) {
+		x = _x; 
+		y = _y; 
+	}
+	
+	public Vert() {
+	}
+	
+	public int vpid() {
+		return vpid; 
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java b/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java
new file mode 100644
index 0000000..199945d
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/VertTheta.java
@@ -0,0 +1,53 @@
+package plugins.ragini.voronoidiagram;
+
+public class VertTheta {
+	
+	private float x, y, theta;
+	private int e1, e2; 
+
+	public VertTheta(float _x, float _y) {
+		x = _x;
+		y = _y; 
+	}
+	
+	public float theta() {
+		return theta; 
+	}
+	
+	public void setTheta(float t) {
+		theta = t; 
+	}
+	
+	public float Y() {
+		return y;
+	}
+
+	public float X() {
+		return x; 
+	}
+	
+	public int e1() {
+		return e1;
+	}
+	
+	public int e2() {
+		return e2; 
+	}
+	
+	public void setE1(int e) {
+		e1 = e;
+	}
+	
+	public void setE2(int e) {
+		e2 = e; 
+	}
+	
+	public void setX(float _x) {
+		x = _x;
+	}
+	
+	public void setY(float _y) {
+		y = _y; 
+	}
+	
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vertex.java b/src/main/java/plugins/ragini/voronoidiagram/Vertex.java
new file mode 100644
index 0000000..2e586b2
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Vertex.java
@@ -0,0 +1,218 @@
+package plugins.ragini.voronoidiagram;
+//Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+//Jad home page: http://www.kpdus.com/jad.html
+//Decompiler options: packimports(3) 
+//Source File Name:   Vertex.java
+
+
+import java.io.Serializable;
+
+//Referenced classes of package delaunay:
+//         DT
+
+public class Vertex
+ implements Serializable
+{
+
+ public Vertex(double x, double y)
+ {
+     visit = false;
+     this.x = x;
+     this.y = y;
+ }
+
+ public Vertex(double x, double y, int indice)
+ {
+     this(x, y);
+     setIndice(indice);
+ }
+
+ public void setIndice(int indice)
+ {
+     this.indice = indice;
+ }
+
+ public static double distance(Vertex a, Vertex b)
+ {
+     if(a == DT.vertex_infty || b == DT.vertex_infty)
+         return DT.MAX_VALUE;
+     else
+         return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
+ }
+
+ public static double sqrDistance(Vertex a, Vertex b)
+ {
+     if(a == DT.vertex_infty || b == DT.vertex_infty)
+         return DT.MAX_VALUE;
+     else
+         return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
+ }
+
+ public static boolean colinear(Vertex a, Vertex b, Vertex c)
+ {
+     return (a.x * (b.y - c.y) - a.y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) == 0.0D;
+ }
+
+ public boolean test(double med, int coord)
+ {
+     if(coord == 0)
+         return x >= med;
+     return y >= med;
+ }
+
+ public static boolean ccw(Vertex a, Vertex b, Vertex c)
+ {
+     return (a.x * (b.y - c.y) - a.y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) > 0.0D;
+ }
+
+ public boolean ccw(Vertex b, Vertex c)
+ {
+     return (x * (b.y - c.y) - y * (b.x - c.x)) + (b.x * c.y - b.y * c.x) > 0.0D;
+ }
+
+ public static Vertex findCenter(Vertex A, Vertex B, Vertex C)
+ {
+     DT.counter2++;
+     double aux = (((-B.x * C.y + B.x * A.y + A.x * C.y) - A.x * B.y) + B.y * C.x) - A.y * C.x;
+     if(aux == 0.0D)
+     {
+         return DT.vertex_infty;
+     } else
+     {
+         double ss = ((((-B.x * A.x - B.x * C.x) + A.x * C.x) - B.y * A.y - B.y * C.y) + A.y * C.y + B.x * B.x + B.y * B.y) / aux;
+         return new Vertex(((A.x + C.x) - ss * (C.y - A.y)) / 2D, ((A.y + C.y) - ss * (A.x - C.x)) / 2D);
+     }
+ }
+
+ public static Vertex findBary(Vertex A, Vertex B, Vertex C)
+ {
+     return new Vertex((A.x + C.x + B.x) / 3D, (A.y + C.y + B.y) / 3D);
+ }
+
+ public static double delaunayDistance(Vertex A, Vertex B, Vertex C)
+ {
+     Vertex S = findCenter(A, B, C);
+     double ss = sqrDistance(S, A);
+     if(ccw(A, B, C))
+     {
+         if(!ccw(A, B, S))
+             ss = -ss;
+     } else
+     if(ccw(A, B, S))
+         ss = -ss;
+     return ss;
+ }
+
+ public boolean inCircle(Vertex a, Vertex b, Vertex c, Vertex d)
+ {
+     if(a == d || b == d || c == d)
+         return false;
+     DT.counter2++;
+     double d02 = a.x * a.x + a.y * a.y;
+     double d12 = b.x * b.x + b.y * b.y;
+     double d22 = c.x * c.x + c.y * c.y;
+     double d32 = d.x * d.x + d.y * d.y;
+     double det = a.x * det3x3(b.y, d12, 1.0D, c.y, d22, 1.0D, d.y, d32, 1.0D);
+     det -= a.y * det3x3(b.x, d12, 1.0D, c.x, d22, 1.0D, d.x, d32, 1.0D);
+     det += d02 * det3x3(b.x, b.y, 1.0D, c.x, c.y, 1.0D, d.x, d.y, 1.0D);
+     det -= det3x3(b.x, b.y, d12, c.x, c.y, d22, d.x, d.y, d32);
+     return det > 0.0D;
+ }
+
+ public boolean inCircle(Vertex b, Vertex c, Vertex d)
+ {
+     if(this == d || b == d || c == d)
+         return false;
+     DT.counter2++;
+     double d02 = x * x + y * y;
+     double d12 = b.x * b.x + b.y * b.y;
+     double d22 = c.x * c.x + c.y * c.y;
+     double d32 = d.x * d.x + d.y * d.y;
+     double det = x * det3x3(b.y, d12, 1.0D, c.y, d22, 1.0D, d.y, d32, 1.0D);
+     det -= y * det3x3(b.x, d12, 1.0D, c.x, d22, 1.0D, d.x, d32, 1.0D);
+     det += d02 * det3x3(b.x, b.y, 1.0D, c.x, c.y, 1.0D, d.x, d.y, 1.0D);
+     det -= det3x3(b.x, b.y, d12, c.x, c.y, d22, d.x, d.y, d32);
+     return det > 0.0D;
+ }
+
+ public static double det3x3(double d00, double d01, double d02, double d10, 
+         double d11, double d12, double d20, double d21, double d22)
+ {
+     return (d00 * (d11 * d22 - d12 * d21) - d01 * (d10 * d22 - d12 * d20)) + d02 * (d10 * d21 - d11 * d20);
+ }
+
+ public static void mergeSort(Vertex s[])
+ {
+     mergeSort(s, 0, s.length);
+ }
+
+ public static void mergeSort(Vertex s[], int a, int b)
+ {
+     int size = b - a;
+     if(size > 1)
+         if(size == 2)
+         {
+             if(compare(s[a], s[a + 1]))
+             {
+                 Vertex tmp = s[a];
+                 s[a] = s[a + 1];
+                 s[a + 1] = tmp;
+             }
+         } else
+         {
+             int mid = size / 2;
+             mergeSort(s, a, a + mid);
+             mergeSort(s, a + mid, b);
+             Vertex ascend[] = new Vertex[size];
+             int i = a;
+             int j = a + mid;
+             for(int k = 0; k < size; k++)
+                 if(i >= a + mid)
+                     ascend[k] = s[j++];
+                 else
+                 if(j >= b)
+                     ascend[k] = s[i++];
+                 else
+                 if(compare(s[i], s[j]))
+                     ascend[k] = s[j++];
+                 else
+                     ascend[k] = s[i++];
+
+             for(int k = 0; k < size; k++)
+                 s[a + k] = ascend[k];
+
+         }
+ }
+
+ public void setVisit()
+ {
+     visit = true;
+ }
+
+ public void setVisit(boolean visit)
+ {
+     this.visit = visit;
+ }
+
+ public boolean getVisit()
+ {
+     return visit;
+ }
+
+ public static boolean compare(Vertex s1, Vertex s2)
+ {
+     if(s1.x != s2.x)
+         return s1.x > s2.x;
+     return s1.y > s2.y;
+ }
+
+ public String toString()
+ {
+     return (new StringBuilder(" ")).append(indice).append(" ").toString();
+ }
+
+ double x;
+ double y;
+ int indice;
+ boolean visit;
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java b/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java
new file mode 100644
index 0000000..a825c69
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/Vonoroi.java
@@ -0,0 +1,295 @@
+package plugins.ragini.voronoidiagram;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+public class Vonoroi
+{
+
+    private int siteidx, nvertices;
+
+    HalfEdge PQHash;
+
+    private Constants constants;
+
+    private EdgeList edgelist;
+    private VRegion vregion;
+    private Geometry events;
+
+    public Vonoroi(EdgeList _edgelist, Constants _constants, VRegion _vregion, Geometry geometry)
+    {
+        siteidx = 0;
+        constants = _constants;
+        edgelist = _edgelist;
+        vregion = _vregion;
+        events = geometry;
+    }
+
+    private class GLscomp implements Comparator<Vert>
+    {
+
+        @Override
+        public int compare(Vert s1, Vert s2)
+        {
+            if (s1.Y() < s2.Y())
+                return -1;
+            else if (s1.Y() > s2.Y())
+                return 1;
+            else if (s1.X() < s2.X())
+                return -1;
+            else if (s1.X() > s2.X())
+                return 1;
+            else
+                return 0;
+        }
+
+    }
+
+    public void sortGLSites()
+    {
+
+        float vx, vy;
+        int k, sid;
+        char a;
+        float dx, dy;
+
+        GLscomp comp = new GLscomp();
+
+        Arrays.sort(constants.getGLSites(), comp);
+
+        // excise();
+
+    }
+
+    // private void excise() {
+    //
+    // int sid = 0;
+    // Vert[] GLSites = constants.getGLSites();
+    //
+    // for(int k = 0; k < constants.nsites(); k++) {
+    // if (k ==0 || (GLSites[k-1].Y() != GLSites[k].Y()) || (GLSites[k-1].X() != GLSites[k].X())) {
+    //
+    // dx = GLSites[k].x * (1.0 / 4096.0);
+    // dy = GLSites[k].y * (1.0 / 4096.0);
+    //
+    // /* GLSites[sid].setX(GLSites[k].X());
+    // GLSites[sid].setY(GLSites[k].Y()); */
+    // }
+    // }
+    //
+    // if (sid != constants.nsites()) {
+    // System.out.printf("voronoi: excised %d coincident sites\n", constants.nsites()-sid);
+    // }
+    //
+    // }
+
+    public void voronoi()
+    {
+        SiteProvider sp = new SiteProvider(constants);
+
+        Neighbor newsite, temp, p, v;
+        Neighbor bot, top;
+        Point newintstar = new Point();
+        int pm;
+        HalfEdge lbnd, rbnd, llbnd, rrbnd, bisector;
+        Edge e;
+
+        if (constants.nsites() <= 1)
+            return;
+        geominit();
+        events.PQinitialize();
+
+        constants.setBottomSite(sp.next());
+        vregion.outSite(constants.bottomsite()); // print some stuff and draw a circle
+        // circle(...s)
+        edgelist.ELinitialize();
+
+        newsite = sp.next();
+
+        // System.out.println("initialized");
+
+        // when do values get added to the hash table?
+        while (true)
+        {
+            if (!events.PQempty())
+                newintstar = events.PQmin();
+
+            // newsite is above (greater priority) than the minimum event in the queue
+            if (newsite != null
+                    && (events.PQempty() || (newsite.getCoord().Y() < newintstar.Y()) || (newsite.getCoord().Y() == newintstar
+                            .Y() && newsite.getCoord().X() < newintstar.X())))
+            {
+                // System.out.println("newsite is smallest");
+                vregion.outSite(newsite); // print some stuff and draw a circle with pre-defined
+                                          // radius
+                lbnd = edgelist.ELleftbnd(newsite.getCoord()); // retrieve the halfedge from the
+                                                               // hash table
+                rbnd = edgelist.ELright(lbnd);
+                bot = edgelist.rightReg(lbnd); // ?
+                e = edgelist.bisect(bot, newsite);
+
+                bisector = edgelist.HEcreate(e, constants.le(), 0); // create a new half edge from
+                                                                    // the bisector?
+                edgelist.ELinsert(lbnd, bisector); // insert it into the hash table? or the linear
+                                                   // list?
+                if ((p = (Neighbor) edgelist.sintersect(lbnd, bisector)) != null)
+                {
+                    events.PQdelete(lbnd);
+                    events.PQinsert(lbnd, p, dist(p, newsite));
+                }
+                lbnd = bisector;
+                bisector = edgelist.HEcreate(e, constants.re(), 0);
+                edgelist.ELinsert(lbnd, bisector);
+                if ((p = (Neighbor) edgelist.sintersect(bisector, rbnd)) != null)
+                {
+                    events.PQinsert(bisector, p, dist(p, newsite));
+                }
+                newsite = sp.next();
+            }
+            else if (!events.PQempty())
+            {
+                // System.out.println("newintstar is smallest");
+                lbnd = events.PQextractmin();
+                /*
+                 * if (lbnd.eledge() == null) System.out.println("lbnd: null edge");
+                 * else System.out.println("lbnd: " + lbnd.eledge().a() + ", " + lbnd.eledge().b() +
+                 * ", " + lbnd.eledge().c());
+                 */
+                llbnd = edgelist.ELleft(lbnd);
+                // if (llbnd.eledge() == null) System.out.println("llbnd: null edge");
+                // else System.out.println("llbnd: " + llbnd.eledge().a() + ", " +
+                // llbnd.eledge().b() + ", " + llbnd.eledge().c());
+                rbnd = edgelist.ELright(lbnd);
+                // if (rbnd.eledge() == null) System.out.println("rbnd: null edge");
+                // else System.out.println("rbnd: " + rbnd.eledge().a() + ", " + rbnd.eledge().b() +
+                // ", " + rbnd.eledge().c());
+                rrbnd = edgelist.ELright(rbnd);
+                // if (rrbnd.eledge() == null) System.out.println("rrbnd: null edge");
+                // else System.out.println("rrbnd: " + rrbnd.eledge().a() + ", " +
+                // rrbnd.eledge().b() + ", " + rrbnd.eledge().c());
+                bot = edgelist.leftReg(lbnd);
+                top = edgelist.rightReg(rbnd);
+                // System.out.println("bot: " + bot.getCoord().X() + " " + bot.getCoord().Y());
+                // System.out.println("top: " + top.getCoord().X() + " " + top.getCoord().Y());
+                vregion.outTriple(bot, top, edgelist.rightReg(lbnd)); // this is where the
+                                                                      // triangulate variable is
+                                                                      // used, just printing some
+                                                                      // stuff
+                v = (Neighbor) lbnd.vertex();
+                // if (v == null)
+                // System.out.println("vertex null");
+                // else System.out.println("vertex: " + v.getCoord().X() + " " + v.getCoord().Y());
+                makevertex(v);
+                // System.out.println("made vertex");
+                edgelist.v_endpoint(lbnd.eledge(), 1, lbnd.elpm(), v);
+                edgelist.v_endpoint(rbnd.eledge(), 1, rbnd.elpm(), v);
+                // System.out.println("called vendpoint");
+                edgelist.ELdelete(lbnd);
+                //
+                events.PQdelete(rbnd);
+                edgelist.ELdelete(rbnd);
+                /*
+                 * System.out.println("printing list");
+                 * for(HalfEdge cur = edgelist.leftend(); cur != edgelist.rightend(); cur =
+                 * edgelist.ELright(cur)) {
+                 * e = cur.eledge();
+                 * if (e == null) System.out.println("null edge");
+                 * else System.out.println("edge: " + e.a() + " " + e.b() + " " + e.c());
+                 * if (cur.right() == edgelist.rightend()) {
+                 * System.out.println("reached right end"); e = cur.right().eledge(); if (e != null)
+                 * System.out.println("right end: " + e.a() + " " + e.b() + " " + e.c());}
+                 * }
+                 * System.out.println("done printing list");
+                 * if (rbnd.eledge() == null) System.out.println("deleted null edge");
+                 * else System.out.println("deleted: " + rbnd.eledge().a() + ", " +
+                 * rbnd.eledge().b() + ", " + rbnd.eledge().c());
+                 */
+                pm = constants.le();
+
+                if ((bot.getCoord().Y() > top.getCoord().Y())
+                        || ((bot.getCoord().Y() == top.getCoord().Y()) && (bot.getCoord().X() > top.getCoord().X())))
+                {
+                    temp = bot;
+                    bot = top;
+                    top = temp;
+                    pm = constants.re();
+                }
+
+                //
+
+                e = edgelist.bisect(bot, top);
+
+                bisector = edgelist.HEcreate(e, pm, 1);
+                edgelist.ELinsert(llbnd, bisector);
+                /*
+                 * System.out.println("right : " + bisector.right().eledge().a() + ", " +
+                 * bisector.right().eledge().b() + ", " + bisector.right().eledge().c());
+                 * if (bisector.right().right().eledge() == null) System.out.println("rright null");
+                 * else System.out.println("rright: " + bisector.right().right().eledge().a() + ", "
+                 * + bisector.right().right().eledge().b() + ", " +
+                 * bisector.right().right().eledge().c());
+                 */
+                edgelist.v_endpoint(e, 1, constants.re() - pm, v);
+                if ((p = (Neighbor) edgelist.sintersect(llbnd, bisector)) != null)
+                {
+                    events.PQdelete(llbnd);
+                    // if (lbnd.eledge() == null) System.out.println("deleted null edge");
+                    // else System.out.println("deleted: " + lbnd.eledge().a() + ", " +
+                    // lbnd.eledge().b() + ", " + lbnd.eledge().c());
+                    events.PQinsert(llbnd, p, dist(p, bot));
+                }
+
+                if ((p = (Neighbor) edgelist.sintersect(bisector, rrbnd)) != null)
+                {
+                    events.PQinsert(bisector, p, dist(p, bot));
+                }
+            }
+            else
+            { // System.out.println("break voronoi");
+                break;
+            }
+        }
+
+        for (lbnd = edgelist.ELright(edgelist.leftend()); lbnd != edgelist.rightend(); lbnd = edgelist.ELright(lbnd))
+        {
+            e = lbnd.eledge();
+            // System.out.println("printing edge: " + e.a() + " " + e.b() + " " + e.c());
+            vregion.outEP(e, lbnd.origin());// calls clipline, which draws the appropriate line
+            // if (lbnd.right() == edgelist.rightend()) System.out.println("reached right end");
+        }
+
+    }
+
+    public void makevertex(Site v)
+    {
+        v.setSiteNbr(nvertices);
+        nvertices += 1;
+        vregion.outVertex(v); // /print some stuff
+    }
+
+    private void geominit()
+    {
+        nvertices = 0;
+        constants.setnedges(0);
+        float sn = constants.nsites() + 4;
+        constants.setsqrtnsites(Math.sqrt(sn));
+        // System.out.println("setting sqrt" + constants.sqrtnsites());
+        constants.setvdeltay(constants.vymax() - constants.vymin());
+        constants.setvdeltax(constants.vxmax() - constants.vxmin());
+    }
+
+    public float dist(Site a, Site b)
+    {
+        float ax, bx, ay, by;
+
+        ax = a.getCoord().X();
+        ay = a.getCoord().Y();
+
+        bx = b.getCoord().X();
+        by = b.getCoord().Y();
+
+        return (float) Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
+
+    }
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java b/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java
new file mode 100644
index 0000000..51fffad
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/VoronoiDiagram.java
@@ -0,0 +1,561 @@
+package plugins.ragini.voronoidiagram;
+
+import icy.canvas.IcyCanvas;
+import icy.image.IcyBufferedImage;
+import icy.painter.AbstractPainter;
+import icy.painter.Painter;
+import icy.painter.PainterListener;
+import icy.roi.BooleanMask2D;
+import icy.roi.ROI2DEllipse;
+import icy.roi.ROI2DLine;
+import icy.roi.ROI2DPoint;
+import icy.roi.ROI2DPolygon;
+import icy.sequence.Sequence;
+import icy.type.DataType;
+import icy.type.collection.array.Array1DUtil;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Point2D;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import jxl.NumberCell;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.read.biff.BiffException;
+
+import plugins.adufour.blocks.lang.Block;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.ezplug.EzButton;
+import plugins.adufour.ezplug.EzPlug;
+import plugins.adufour.ezplug.EzVar;
+import plugins.adufour.ezplug.EzVarEnum;
+import plugins.adufour.ezplug.EzVarFile;
+import plugins.adufour.ezplug.EzVarInteger;
+import plugins.adufour.ezplug.EzVarListener;
+import plugins.adufour.ezplug.EzVarSequence;
+import plugins.adufour.vars.lang.VarSequence;
+
+public class VoronoiDiagram extends EzPlug implements Block {
+	
+	private enum MethodType
+	{
+		DELAUNAY("Calculate Delaunay Triangulation"), VORONOI("Calculate Voronoi Diagram"), RNG("Calculate Relative Neighborhood Graph");
+		
+		private final String	name;
+		
+		private MethodType(String string)
+		{
+			this.name = string;
+		}
+		
+		public String toString()
+		{
+			return this.name;
+		}
+	}
+	
+	private Constants constants; 
+	private EzVarFile input = new EzVarFile("Input", "/Users"); 
+	private EzVarSequence img = new EzVarSequence("Image"); 
+	private EzVarInteger numPoints = new EzVarInteger("Display Closest Points", 2, 1, 7, 1); 
+	private EzButton morphbutton = new EzButton("Calculate Morphological Operators", new buttonlist()); 
+	
+	private class buttonlist implements ActionListener {
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			
+			a = new Alpha_Morph(constants.sites(), constants.vxmin(), constants.vymin(), constants.vxmax(), constants.vymax());
+		}
+		
+	}
+	
+	float[][] points; 
+	VarSequence out = new VarSequence("Out", null);
+	Point2D[] dpoints; 
+	private EzVarEnum<MethodType> method = new EzVarEnum<MethodType>("Method:", MethodType.values()); ;
+
+	private ArrayList<ROI2DSite> imgpoints = new ArrayList<ROI2DSite>(); 
+	private ArrayList<ROI2DSite> allpoints = new ArrayList<ROI2DSite>(); 
+	private ArrayList<ROI2DLine> alltris = new ArrayList<ROI2DLine>(); 
+	private ArrayList<ROI2DLine> imgedges = new ArrayList<ROI2DLine>(); 
+	private Sequence seqOut; 
+	private Alpha_Morph a; 
+	
+	@Override
+	public void clean() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	protected void execute() {
+		 String data = input.getValue().getPath(); 
+		 MethodType _method = method.getValue();
+		 Sequence seqIn = img.getValue(); 
+		 final int numpoints = numPoints.getValue(); 
+		 IcyBufferedImage imgIn = null; 
+		 if (seqIn != null) {
+			 imgIn = seqIn.getImage(0, 0, 0); }
+		 System.out.println(_method.toString()); 
+		 points = new float[5000][2];
+		 dpoints = new Point2D[5000]; 
+		 double xmin = 0;
+		 double xmax = 0;
+		 double ymin = 0;
+		 double ymax = 0; 
+		 int x = 0;
+		 try {
+			Workbook wb = Workbook.getWorkbook(new File(data)); 
+			Sheet s = wb.getSheet(0);
+			NumberCell c = (NumberCell) s.getCell(0,0);  
+			while (x < s.getRows()) {
+				c = (NumberCell) s.getCell(0,x);
+				points[x][0] = (float) c.getValue();
+				c = (NumberCell) s.getCell(1,x);
+				points[x][1] = (float) c.getValue();
+				dpoints[x] = new Point2D.Double(points[x][0], points[x][1]);
+				//System.out.println("x: " + points[x][0] + "y: " + points[x][1]); 
+				if (x == 0 ){
+					xmin = points[x][0]; 
+					xmax = points[x][0]; 
+					ymin = points[x][1];
+					ymax = points[x][1]; 
+				}
+				else {
+					if (points[x][0] > xmax)
+						xmax = points[x][0];
+					if (points[x][0] < xmin)
+						xmin = points[x][0];
+					if (points[x][1] > ymax) 
+						ymax = points[x][1];
+					if (points[x][1] < ymin) 
+						ymin = points[x][1]; 
+				}
+				x++; 
+			}
+			//System.out.println("done reading data points"); 
+		} catch (BiffException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}   
+		 
+		constants= new Constants(); 
+	if(_method.toString() == "Calculate Delaunay Triangulation") {
+		constants.setTriangulate(1);
+	}
+	else if(_method.toString() == "Calculate Relative Neighborhood Graph") {
+		constants.setTriangulate(1);
+		constants.setrng(1); 
+	}
+			VRegion vregion = new VRegion(constants, this);
+			EdgeList EL = new EdgeList(constants, vregion); 
+			Geometry events = new Geometry(constants); 
+			Vonoroi voronoi = new Vonoroi(EL, constants, vregion, events); 
+			vregion.setVoronoi(voronoi); 
+			seqOut = new Sequence();
+			if (seqIn == null) {
+				int width = (int) Math.ceil(xmax - xmin + 1); 
+				int height = (int) Math.ceil(ymax - ymin + 1);
+				IcyBufferedImage imgOut = new IcyBufferedImage(width,height, 1, DataType.UBYTE ); 
+				seqOut.addImage(imgOut); 
+				double[] _out = Array1DUtil.arrayToDoubleArray(imgOut.getDataXY(0), imgOut.isSignedDataType());
+				for (int p = 0; p < width; p++) {
+					for (int q = 0; q < height; q++) {
+						_out[p + q*width] = 255; 
+					}
+				}
+				imgOut.setDataXY(0,Array1DUtil.doubleArrayToArray(_out, imgOut.getDataXY(0))); 
+				seqOut.setImage(0, 0, imgOut);}
+				else {seqOut.setImage(0, 0, imgIn);seqOut.dataChanged(); }
+for(int k= 0; k < x; k++) {
+				
+				Point2D dp = new Point2D.Double(points[k][0], points[k][1]); 
+				ROI2DSite point = new ROI2DSite(dp); 
+				allpoints.add(point);
+				point.setEditable(false);  
+				point.setColor(Color.ORANGE); 
+				point.attachTo(seqOut); 
+				
+			} 
+			vregion.loadVSites(x, points, 0, 0, 0, 0);
+			
+			
+			//System.out.println("done running"); 
+			
+			
+			
+			int i = 0; 
+			Point2D p1; 
+			while((p1 = constants.lines()[i][0]) != null) {
+				Point2D p2 = constants.lines()[i][1];  
+				ROI2DLine line = new ROI2DLine(p1, p2); 
+				line.setEditable(false); 
+				line.setColor(Color.CYAN);
+				line.attachTo(seqIn); 
+				i++; 
+			}
+			
+			i= 0;  
+			Vert v; 
+			while ((v = constants.verts()[i]) != null) {
+				Point2D p = new Point2D.Double(v.X(), v.Y()); 
+				ROI2DPoint point = new ROI2DPoint(p); 
+				point.setEditable(false); 
+				point.setColor(Color.RED); 
+				point.attachTo(seqOut);
+				i++; 
+			}
+			
+			long dist[]=new long[1000]; //VMY
+			
+			if (constants.triangulate() == 1 && constants.rng() != 1) {
+				alltris.clear(); 
+				i = 0;
+				Tri t;
+				while ((t = constants.tris()[i]) != null) {
+					Point2D t1 = new Point2D.Double(t.v1().X(), t.v1().Y());
+					Point2D t2 = new Point2D.Double(t.v2().X(), t.v2().Y());
+					Point2D t3 = new Point2D.Double(t.v3().X(), t.v3().Y());
+
+					ROI2DLine l1 = new ROI2DLine(t1, t2);
+					ROI2DLine l2 = new ROI2DLine(t2, t3);
+					ROI2DLine l3 = new ROI2DLine(t1, t3);
+
+					l1.setEditable(false);
+					l1.setColor(Color.GREEN);
+					l1.attachTo(seqIn);
+					l2.setEditable(false);
+					l2.setColor(Color.GREEN);
+					l2.attachTo(seqIn);
+					l3.setEditable(false);
+					l3.setColor(Color.GREEN);
+					l3.attachTo(seqIn);
+
+					double d1 = t1.distance(t2);
+					int d = (int) (Math.round(Math.floor(d1)));
+				//	System.out.println(" "+d1+" d:"+d+" t1x:"+t1.getX()+" t1y:"+t1.getY());
+				//	dist[d]++;
+					double d2 = t1.distance(t3);
+					 d = (int) (Math.round(Math.floor(d2))); // d1 ??
+					//	System.out.println(" "+d2+" d:"+d +" t2x:"+t2.getX()+" t2y:"+t2.getY());
+			//		dist[d]++;
+					double d3 = t2.distance(t3);
+					 d = (int) (Math.round(Math.floor(d3))); // d3?
+					//	System.out.println(" "+d3+" d:"+d+" t3x:"+t3.getX()+" t3y:"+t3.getY());
+			//		dist[d]++;
+						
+						//MYV
+						Polygon polygon = new Polygon();
+						polygon.addPoint( 
+								(int) t1.getX(),
+								(int) t1.getY()
+						);
+						polygon.addPoint( 
+								(int) t2.getX(),
+								(int) t2.getY()
+						);
+						polygon.addPoint( 
+								(int) t3.getX(),
+								(int) t3.getY()
+						);
+						
+						
+						ROI2DPolygon poly = new ROI2DPolygon();
+						poly.setPolygon(polygon);
+						
+						BooleanMask2D roiMask = poly.getAsBooleanMask();
+						
+						int minx = Math.max(0, roiMask.bounds.x);
+						int maxx = Math.min(4000, roiMask.bounds.x+roiMask.bounds.width);
+						int miny = Math.max(0, roiMask.bounds.y);
+						int maxy = Math.min(4000, roiMask.bounds.y+roiMask.bounds.height);
+						double intensitySpot=0.;
+						int areaC=0;//size Cell
+						for (int ix = minx; ix < maxx;ix++)
+							for (int y = miny; y < maxy;y++){
+								if(roiMask.contains(ix, y)) {
+									areaC++;
+								}			
+								
+							}
+						System.out.println(" "+areaC); // triangle Size
+						
+						
+						
+						
+					alltris.add(l1);
+					alltris.add(l2);
+					alltris.add(l3);
+					
+					/*Circ c = makeCirc(t1, t2, t3);
+					ROI2DEllipse circ = new ROI2DEllipse(c.rectangle()); 
+					circ.setEditable(false);
+					circ.setColor(Color.ORANGE);
+					circ.attachTo(seqOut);*/ 
+
+					//System.out.println("tri: " + "(" + t1.getX() + "," + t1.getY() + ") (" + t2.getX() + "," + t2.getY() + ") (" + t3.getX() + "," + t3.getY() + ")"); 
+					/*ArrayList<Point2D> plist = new ArrayList<Point2D>();
+					plist.add(t1);
+					plist.add(t2);
+					plist.add(t3); 
+					ROI2DPolygon tri = new ROI2DPolygon(); 
+					alltris.add(tri); 
+					tri.setPoints(plist); 
+					tri.setColor(Color.GREEN);
+					tri.setEditable(false); 
+					tri.attachTo(seqOut); */
+					/*Circ c = makeCirc(t1, t2, t3); 
+					Point2D ref; 
+					if (t1.getX() > t2.getX()) {
+						ref = t1; 
+					}
+					else ref = t2; 
+					if (t3.getX() > ref.getX()) ref = t3; 
+					Ellipse2D e = new Ellipse2D.Double(ref.getX(), ref.getY(), c.r()*2, c.r()*2); 
+					ROI2DEllipse re = new ROI2DEllipse(e.getFrame()); 
+					re.setColor(Color.BLUE); 
+					re.setEditable(false); 
+					re.attachTo(seqOut); */
+					i++;
+				}
+			}
+			
+			else if (constants.rng() == 1) {
+				i = 0; 
+				for (EdgeRNG e: constants.relativeneighbors()) {
+					ROI2DEdge edge = new ROI2DEdge(e); 
+					edge.setEditable(false);
+					edge.setColor(Color.YELLOW);
+					edge.attachTo(seqOut); 
+				}
+				
+			}
+			allpoints.clear(); 
+			for(Neighbor site : constants.sites()) {
+				
+				Point2D dp = new Point2D.Double(site.getCoord().X(), site.getCoord().Y()); 
+				ROI2DSite point = new ROI2DSite(dp);
+				point.setSite(site); 
+				site.setPoint(point); 
+				allpoints.add(point);
+				point.setEditable(false);  
+				point.setColor(Color.ORANGE); 
+				point.attachTo(seqOut); 
+			}
+			
+			
+			
+			if (_method.toString() == "Calculate Delaunay Triangulation") {
+				Painter painter = new AbstractPainter() {
+				@Override
+				public void mousePressed(MouseEvent e, Point2D imagePoint,
+						IcyCanvas canvas) {
+					//super.mouseClick(e, imagePoint, canvas);
+					//System.out.println("mouse pressed"); 
+					for(ROI2DSite p : allpoints) {
+						if ((p.getPoint().getX() <= imagePoint.getX() + 3 && p.getPoint().getX() >= imagePoint.getX() -3) && ((p.getPoint().getY() <= imagePoint.getY() + 3) && p.getPoint().getY() >= imagePoint.getY() -3)) {
+							//System.out.println("on site"); 
+							p.setColor(Color.RED);  
+							Neighbor sp = (Neighbor) p.getSite(); 
+							int size = sp.neighbors().size(); 
+							//System.out.println(size); 
+							int count = 0; 
+							Neighbor cur = null; 
+							ArrayList<Neighbor> temp = new ArrayList<Neighbor>(); 
+							//System.out.println("size: " + size); 
+							//System.out.println("numpoints: " + numpoints); 
+							while (count < numpoints && count < size) {
+								cur = sp.neighbors().remove(); 
+								temp.add(cur); 
+								ROI2DSite curpoint = cur.getPoint(); 
+								curpoint.setColor(Color.YELLOW); 
+								imgpoints.add(curpoint); 
+								count++; 
+								if (count == 1) {
+									for (Neighbor s : cur.samedistpoints()) {
+										if (sp.neighbors().remove(s)) {
+											s.getPoint().setColor(Color.YELLOW);
+											imgpoints.add(s.getPoint());
+											temp.add(s);
+											count++;
+										}
+									}
+								}
+							}
+							for (Neighbor t : temp) {
+								sp.addNeighbor(t);  
+							}
+							temp.clear(); 
+							boolean incident = false; 
+							boolean keep = false; 
+							for(ROI2DLine edge: alltris) {
+								Point2D tp = edge.getLine().getP1();
+									if (tp.getX() == p.getPoint().getX() && tp.getY() == p.getPoint().getY()){
+										incident = true; //System.out.println("incident"); 
+									}
+									
+								tp = edge.getLine().getP2();
+									if (tp.getX() == p.getPoint().getX() && tp.getY() == p.getPoint().getY()){
+										incident = true; //System.out.println("incident"); 
+									}
+								
+								for (ROI2DSite n: imgpoints) {
+									tp = edge.getLine().getP1(); 
+										
+											if (tp.getX() == n.getPoint().getX() && tp.getY() == n.getPoint().getY()) {
+												if (incident == true) {keep = true; }
+											}
+										
+									 
+										tp = edge.getLine().getP2(); 
+						
+											if (tp.getX() == n.getPoint().getX() && tp.getY() == n.getPoint().getY()) {
+												if (incident == true) {keep = true;}
+											}
+										
+										
+									
+								}
+								for (Neighbor t : temp) {
+									sp.addNeighbor(t);  
+								}
+								temp.clear(); 
+								//System.out.println("keep: " + keep); 
+								if (keep == false) {
+									edge.detachFrom(seqOut); 
+									imgedges.add(edge);
+								}
+								keep = false; 
+								incident = false; 
+							}
+
+							imgpoints.add(p);
+						}
+					}
+					
+					
+				}
+				
+				@Override
+					public void mouseReleased(MouseEvent e, Point2D imagePoint,
+							IcyCanvas canvas) {
+							for(ROI2DSite rp : imgpoints) {
+								rp.setColor(Color.BLACK); 
+							}
+							imgpoints.clear(); 
+							for(ROI2DLine edge: imgedges) {
+								edge.attachTo(seqOut); 
+							}
+							imgedges.clear(); 
+						
+	
+					}
+				
+				}; 
+				
+				
+				seqOut.addPainter(painter); 
+				seqOut.painterChanged(painter); 
+			}
+			
+			if (isHeadLess())  {
+				out.setValue(seqOut);
+			}
+			
+			else {addSequence(seqOut);} 
+			
+	}
+	
+	private Circ makeCirc(Point2D p1, Point2D p2, Point2D p3) {
+		double x = (p3.getX()*p3.getX() * (p1.getY() - p2.getY()) 
+			    + (p1.getX()*p1.getX() + (p1.getY() - p2.getY())*(p1.getY() - p3.getY())) 
+			    * (p2.getY() - p3.getY()) + p2.getX()*p2.getX() * (-p1.getY() + p3.getY())) 
+		    / (2 * (p3.getX() * (p1.getY() - p2.getY()) + p1.getX() * (p2.getY() - p3.getY()) + p2.getX() 
+			    * (-p1.getY() + p3.getY())));
+
+		double y = (p2.getY() + p3.getY())/2 - (p3.getX() - p2.getX())/(p3.getY() - p2.getY()) 
+		    * (x - (p2.getX() + p3.getX())/2);
+
+		Point2D c = new Point2D.Double(x,y); 
+		double r = distance(c.getX(), c.getY(), p1.getX(), p1.getY());
+
+		return (new Circ(c, r)); 
+
+	}
+	
+	private double distance(double ax, double ay, double bx, double by) {
+		return (Math.sqrt((bx - ax)*(bx - ax) + (by - ay)*(by - ay)));
+	}
+
+	@Override
+	protected void initialize() {
+		
+		super.addEzComponent(input);
+		super.addEzComponent(img);
+		super.addEzComponent(method);
+		super.addEzComponent(numPoints); 
+		super.addEzComponent(morphbutton); 
+		method.addVarChangeListener(new EzVarListener<MethodType>()
+				{
+					@Override
+					public void variableChanged(EzVar<MethodType> source, MethodType newValue)
+					{
+						updateDefaultParams();
+					}
+					
+				});
+		 
+		
+	}
+
+	@Override
+	public void declareInput(VarList inputMap) {
+		inputMap.add(input.getVariable()); 
+		inputMap.add(method.getVariable()); 
+		inputMap.add(img.getVariable()); 
+		inputMap.add(numPoints.getVariable()); 
+	}
+
+	@Override
+	public void declareOutput(VarList outputMap) {
+		outputMap.add(out);
+	}
+	
+	private void updateDefaultParams()
+	{
+		if (true)
+		{
+			/*if (input.getValue(false) != null)
+		{*/
+			MethodType _method = method.getValue();
+			switch(_method)
+			{
+			case DELAUNAY:
+				
+				break;
+			case VORONOI:
+				
+				break;						
+			default:
+				break;
+			}
+
+			//}
+	}
+	}
+
+}
diff --git a/src/main/java/plugins/ragini/voronoidiagram/dkmax.java b/src/main/java/plugins/ragini/voronoidiagram/dkmax.java
new file mode 100644
index 0000000..300b59d
--- /dev/null
+++ b/src/main/java/plugins/ragini/voronoidiagram/dkmax.java
@@ -0,0 +1,8 @@
+package plugins.ragini.voronoidiagram;
+
+public class dkmax {
+
+	private int id;
+	private int max; 
+	
+}
-- 
GitLab