contrek 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +84 -0
  6. data/LICENSE.md +9 -0
  7. data/README.md +118 -0
  8. data/Rakefile +19 -0
  9. data/contrek.gemspec +23 -0
  10. data/contrek.png +0 -0
  11. data/ext/cpp_polygon_finder/PolygonFinder/.cproject +136 -0
  12. data/ext/cpp_polygon_finder/PolygonFinder/.project +27 -0
  13. data/ext/cpp_polygon_finder/PolygonFinder/.settings/org.eclipse.ltk.core.refactoring.prefs +2 -0
  14. data/ext/cpp_polygon_finder/PolygonFinder/images/labyrinth.png +0 -0
  15. data/ext/cpp_polygon_finder/PolygonFinder/src/Main.cpp +41 -0
  16. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp +69 -0
  17. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.h +19 -0
  18. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/Bitmap.cpp +52 -0
  19. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/Bitmap.h +32 -0
  20. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/FastPngBitmap.cpp +656 -0
  21. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/FastPngBitmap.h +42 -0
  22. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/PngBitmap.cpp +48 -0
  23. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/PngBitmap.h +32 -0
  24. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/RemoteFastPngBitmap.cpp +30 -0
  25. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/RemoteFastPngBitmap.h +26 -0
  26. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/X_picopng.cpp +576 -0
  27. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/List.cpp +120 -0
  28. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/List.h +40 -0
  29. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Lists.cpp +36 -0
  30. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Lists.h +30 -0
  31. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp +111 -0
  32. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h +80 -0
  33. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp +325 -0
  34. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.h +59 -0
  35. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp +206 -0
  36. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h +69 -0
  37. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/optionparser.h +2858 -0
  38. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/Matcher.cpp +23 -0
  39. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/Matcher.h +23 -0
  40. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBMatcher.cpp +20 -0
  41. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBMatcher.h +23 -0
  42. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBNotMatcher.cpp +20 -0
  43. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBNotMatcher.h +23 -0
  44. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/ValueNotMatcher.cpp +20 -0
  45. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/ValueNotMatcher.h +21 -0
  46. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.cpp +40 -0
  47. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.h +23 -0
  48. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.cpp +19 -0
  49. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.h +25 -0
  50. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.cpp +30 -0
  51. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.h +21 -0
  52. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.cpp +50 -0
  53. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.h +121 -0
  54. data/ext/cpp_polygon_finder/cpp_polygon_finder.cpp +260 -0
  55. data/ext/cpp_polygon_finder/extconf.rb +2 -0
  56. data/lib/contrek/bitmaps/bitmap.rb +21 -0
  57. data/lib/contrek/bitmaps/chunky_bitmap.rb +33 -0
  58. data/lib/contrek/bitmaps/painting.rb +40 -0
  59. data/lib/contrek/bitmaps/png_bitmap.rb +62 -0
  60. data/lib/contrek/bitmaps/rgb_color.rb +25 -0
  61. data/lib/contrek/finder/list.rb +132 -0
  62. data/lib/contrek/finder/list_entry.rb +11 -0
  63. data/lib/contrek/finder/listable.rb +8 -0
  64. data/lib/contrek/finder/lists.rb +25 -0
  65. data/lib/contrek/finder/node.rb +126 -0
  66. data/lib/contrek/finder/node_cluster.rb +294 -0
  67. data/lib/contrek/finder/polygon_finder.rb +121 -0
  68. data/lib/contrek/map/mercator_projection.rb +76 -0
  69. data/lib/contrek/matchers/matcher.rb +20 -0
  70. data/lib/contrek/matchers/matcher_hsb.rb +24 -0
  71. data/lib/contrek/matchers/value_not_matcher.rb +9 -0
  72. data/lib/contrek/reducers/linear_reducer.rb +25 -0
  73. data/lib/contrek/reducers/reducer.rb +14 -0
  74. data/lib/contrek/reducers/uniq_reducer.rb +9 -0
  75. data/lib/contrek/reducers/visvalingam_reducer.rb +139 -0
  76. data/lib/contrek/version.rb +3 -0
  77. data/lib/contrek.rb +58 -0
  78. metadata +175 -0
@@ -0,0 +1,14 @@
1
+ module Contrek
2
+ module Reducers
3
+ class Reducer
4
+ def initialize(points: list_of_points, options: {})
5
+ @points = points
6
+ @opts = options
7
+ end
8
+
9
+ def reduce!
10
+ @points
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module Contrek
2
+ module Reducers
3
+ class UniqReducer < Reducer
4
+ def reduce!
5
+ @points.replace @points.reject.with_index { |e, i| i < (@points.size - 1) and e[:x] == @points[i + 1][:x] && e[:y] == @points[i + 1][:y] }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,139 @@
1
+ # https://bost.ocks.org/mike/simplify/
2
+ # https://github.com/metteo/jts/blob/master/jts-core/src/main/java/com/vividsolutions/jts/simplify/VWLineSimplifier.java
3
+
4
+ module Contrek
5
+ module Reducers
6
+ class VisvalingamReducer < Reducer
7
+ def initialize(points: list_of_points, options: {})
8
+ @pts = points
9
+ @tolerance = options[:tolerance] * options[:tolerance]
10
+ end
11
+
12
+ def reduce!
13
+ @pts.replace simplify
14
+ end
15
+
16
+ def self.simplify(pts, distance_tolerance)
17
+ simp = Polygon::Reducers::VisvalingamReducer.new(pts, distance_tolerance)
18
+ simp.simplify
19
+ end
20
+
21
+ def simplify
22
+ vw_line = Vertex.build_line(@pts)
23
+ min_area = @tolerance
24
+ loop do
25
+ min_area = simplify_vertex(vw_line)
26
+ break if min_area >= @tolerance
27
+ end
28
+ vw_line.get_coordinates
29
+ end
30
+
31
+ private
32
+
33
+ def simplify_vertex(vw_line)
34
+ curr = vw_line
35
+ min_area = curr.get_area
36
+ min_vertex = nil
37
+ until curr.nil?
38
+ area = curr.get_area
39
+ if area < min_area
40
+ min_area = area
41
+ min_vertex = curr
42
+ end
43
+ curr = curr.next
44
+ end
45
+ min_vertex.remove if !min_vertex.nil? && min_area < @tolerance
46
+ return -1 if !vw_line.is_live
47
+ min_area
48
+ end
49
+ end
50
+
51
+ class Triangle
52
+ def self.area(a, b, c)
53
+ (((c[:x] - a[:x]) * (b[:y] - a[:y]) - (b[:x] - a[:x]) * (c[:y] - a[:y])) / 2).abs
54
+ end
55
+ end
56
+
57
+ class Vertex
58
+ attr_reader :pt, :next, :prev
59
+ MAX_AREA = Float::MAX
60
+ def initialize(pt)
61
+ @pt = pt
62
+ @prev = nil
63
+ @next = nil
64
+ @area = MAX_AREA
65
+ @is_live = true
66
+ end
67
+
68
+ def self.build_line(pts)
69
+ first = nil
70
+ prev = nil
71
+ pts.each_with_index do |pt, i|
72
+ v = Vertex.new(pts[i])
73
+ first = v if first.nil?
74
+
75
+ v.setPrev(prev)
76
+ if !prev.nil?
77
+ prev.setNext(v)
78
+ prev.updateArea
79
+ end
80
+ prev = v
81
+ end
82
+ first
83
+ end
84
+
85
+ def setPrev(prev)
86
+ @prev = prev
87
+ end
88
+
89
+ def setNext(nextp)
90
+ @next = nextp
91
+ end
92
+
93
+ def updateArea
94
+ if @prev.nil? || @next.nil?
95
+ @area = MAX_AREA
96
+
97
+ return
98
+ end
99
+ @area = Triangle.area(@prev.pt, pt, @next.pt).abs
100
+ end
101
+
102
+ def get_area
103
+ @area
104
+ end
105
+
106
+ attr_reader :is_live
107
+
108
+ def remove
109
+ tmp_prev = @prev
110
+ tmp_next = @next
111
+ result = nil
112
+ if !prev.nil?
113
+ @prev.setNext(tmp_next)
114
+ @prev.updateArea
115
+ result = prev
116
+ end
117
+ if !@next.nil?
118
+ @next.setPrev(tmp_prev)
119
+ @next.updateArea
120
+ result = @next if result.nil?
121
+ end
122
+
123
+ @is_live = false
124
+ result
125
+ end
126
+
127
+ def get_coordinates
128
+ coords = []
129
+ curr = self
130
+ loop do
131
+ coords << curr.pt
132
+ curr = curr.next
133
+ break if curr.nil?
134
+ end
135
+ coords
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,3 @@
1
+ module Contrek
2
+ VERSION = "1.0.0"
3
+ end
data/lib/contrek.rb ADDED
@@ -0,0 +1,58 @@
1
+ require "contrek/version"
2
+ require "contrek/bitmaps/painting"
3
+ require "contrek/bitmaps/bitmap"
4
+ require "contrek/bitmaps/chunky_bitmap"
5
+ require "contrek/bitmaps/png_bitmap"
6
+ require "contrek/bitmaps/rgb_color"
7
+ require "contrek/finder/list"
8
+ require "contrek/finder/list_entry"
9
+ require "contrek/finder/listable"
10
+ require "contrek/finder/lists"
11
+ require "contrek/finder/node"
12
+ require "contrek/finder/node_cluster"
13
+ require "contrek/finder/polygon_finder"
14
+ require "contrek/map/mercator_projection"
15
+ require "contrek/matchers/matcher"
16
+ require "contrek/matchers/matcher_hsb"
17
+ require "contrek/matchers/value_not_matcher"
18
+ require "contrek/reducers/reducer"
19
+ require "contrek/reducers/linear_reducer"
20
+ require "contrek/reducers/uniq_reducer"
21
+ require "contrek/reducers/visvalingam_reducer"
22
+ require "cpp_polygon_finder"
23
+
24
+ module Contrek
25
+ class << self
26
+ def contour!(png_file_path:, options: {})
27
+ default_options = {native: true, class: "value_not_matcher", color: {r: 0, g: 0, b: 0, a: 255}}.merge(options)
28
+ default_options[:native] ? compute_cpp(png_file_path, default_options) : compute_ruby_pure(png_file_path, default_options)
29
+ end
30
+
31
+ private
32
+
33
+ def compute_cpp(png_file_path, options)
34
+ color = Bitmaps::RgbColor.new(**options[:color])
35
+ png_bitmap = CPPPngBitMap.new(png_file_path)
36
+ rgb_matcher_klass = (options[:class] == "value_not_matcher") ? CPPRGBNotMatcher : CPPRGBMatcher
37
+ rgb_matcher = rgb_matcher_klass.new(color.to_rgb_raw)
38
+ CPPPolygonFinder.new(png_bitmap,
39
+ rgb_matcher,
40
+ nil,
41
+ {versus: :a, compress: {uniq: true, linear: true}}).process_info
42
+ end
43
+
44
+ def compute_ruby_pure(png_file_path, options)
45
+ color = Bitmaps::RgbColor.new(**options[:color])
46
+ png_bitmap = Bitmaps::PngBitmap.new(png_file_path)
47
+ rgb_matcher = const_get("Contrek::Matchers::" + camelize("value_not_matcher")).new(color.raw)
48
+ Contrek::Finder::PolygonFinder.new(png_bitmap,
49
+ rgb_matcher,
50
+ nil,
51
+ {versus: :a, compress: {uniq: true, linear: true}}).process_info
52
+ end
53
+
54
+ def camelize(str)
55
+ str.split("_").map { |e| e.capitalize }.join
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: contrek
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Emanuele Cesaroni
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-05-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: standard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.49'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.49'
41
+ - !ruby/object:Gem::Dependency
42
+ name: chunky_png
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rice
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.5'
69
+ description: Shape contour finder
70
+ email: cesaroni.emanuele77@gmail.com
71
+ executables: []
72
+ extensions:
73
+ - ext/cpp_polygon_finder/extconf.rb
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - LICENSE.md
81
+ - README.md
82
+ - Rakefile
83
+ - contrek.gemspec
84
+ - contrek.png
85
+ - ext/cpp_polygon_finder/PolygonFinder/.cproject
86
+ - ext/cpp_polygon_finder/PolygonFinder/.project
87
+ - ext/cpp_polygon_finder/PolygonFinder/.settings/org.eclipse.ltk.core.refactoring.prefs
88
+ - ext/cpp_polygon_finder/PolygonFinder/images/labyrinth.png
89
+ - ext/cpp_polygon_finder/PolygonFinder/src/Main.cpp
90
+ - ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp
91
+ - ext/cpp_polygon_finder/PolygonFinder/src/Tests.h
92
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/Bitmap.cpp
93
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/Bitmap.h
94
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/FastPngBitmap.cpp
95
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/FastPngBitmap.h
96
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/PngBitmap.cpp
97
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/PngBitmap.h
98
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/RemoteFastPngBitmap.cpp
99
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/RemoteFastPngBitmap.h
100
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/bitmaps/X_picopng.cpp
101
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/List.cpp
102
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/List.h
103
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Lists.cpp
104
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Lists.h
105
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp
106
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h
107
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp
108
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.h
109
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp
110
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h
111
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/optionparser.h
112
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/Matcher.cpp
113
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/Matcher.h
114
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBMatcher.cpp
115
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBMatcher.h
116
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBNotMatcher.cpp
117
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/RGBNotMatcher.h
118
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/ValueNotMatcher.cpp
119
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/matchers/ValueNotMatcher.h
120
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.cpp
121
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.h
122
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.cpp
123
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.h
124
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.cpp
125
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.h
126
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.cpp
127
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.h
128
+ - ext/cpp_polygon_finder/cpp_polygon_finder.cpp
129
+ - ext/cpp_polygon_finder/extconf.rb
130
+ - lib/contrek.rb
131
+ - lib/contrek/bitmaps/bitmap.rb
132
+ - lib/contrek/bitmaps/chunky_bitmap.rb
133
+ - lib/contrek/bitmaps/painting.rb
134
+ - lib/contrek/bitmaps/png_bitmap.rb
135
+ - lib/contrek/bitmaps/rgb_color.rb
136
+ - lib/contrek/finder/list.rb
137
+ - lib/contrek/finder/list_entry.rb
138
+ - lib/contrek/finder/listable.rb
139
+ - lib/contrek/finder/lists.rb
140
+ - lib/contrek/finder/node.rb
141
+ - lib/contrek/finder/node_cluster.rb
142
+ - lib/contrek/finder/polygon_finder.rb
143
+ - lib/contrek/map/mercator_projection.rb
144
+ - lib/contrek/matchers/matcher.rb
145
+ - lib/contrek/matchers/matcher_hsb.rb
146
+ - lib/contrek/matchers/value_not_matcher.rb
147
+ - lib/contrek/reducers/linear_reducer.rb
148
+ - lib/contrek/reducers/reducer.rb
149
+ - lib/contrek/reducers/uniq_reducer.rb
150
+ - lib/contrek/reducers/visvalingam_reducer.rb
151
+ - lib/contrek/version.rb
152
+ homepage: https://rubygems.org/gems/hola
153
+ licenses:
154
+ - MIT
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubygems_version: 3.5.22
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: Contour finder
175
+ test_files: []