lookout-ahoy 0.1.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 (223) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +99 -0
  4. data/Rakefile +24 -0
  5. data/app/assets/images/lookout/apple-touch-icon.png +0 -0
  6. data/app/assets/images/lookout/favicon-16x16.png +0 -0
  7. data/app/assets/images/lookout/favicon-32x32.png +0 -0
  8. data/app/assets/images/lookout/logo.png +0 -0
  9. data/app/assets/images/lookout/safari-pinned-tab.png +0 -0
  10. data/app/assets/images/lookout/safari-pinned-tab.svg +199 -0
  11. data/app/assets/javascript/lookout/application.js +2 -0
  12. data/app/assets/javascript/lookout/controllers/application.js +9 -0
  13. data/app/assets/javascript/lookout/controllers/application_controller.js +33 -0
  14. data/app/assets/javascript/lookout/controllers/combobox_controller.js +371 -0
  15. data/app/assets/javascript/lookout/controllers/details_modal_controller.js +18 -0
  16. data/app/assets/javascript/lookout/controllers/dropdown_label_controller.js +39 -0
  17. data/app/assets/javascript/lookout/controllers/filter/item_controller.js +12 -0
  18. data/app/assets/javascript/lookout/controllers/filter_form_controller.js +13 -0
  19. data/app/assets/javascript/lookout/controllers/filter_modal_controller.js +45 -0
  20. data/app/assets/javascript/lookout/controllers/frame_link_controller.js +20 -0
  21. data/app/assets/javascript/lookout/controllers/funnel_chart_controller.js +159 -0
  22. data/app/assets/javascript/lookout/controllers/index.js +4 -0
  23. data/app/assets/javascript/lookout/controllers/interval_controller.js +15 -0
  24. data/app/assets/javascript/lookout/controllers/line_chart_controller.js +251 -0
  25. data/app/assets/javascript/lookout/controllers/predicate_select_controller.js +10 -0
  26. data/app/assets/javascript/lookout/controllers/properties_controller.js +8 -0
  27. data/app/assets/javascript/lookout/controllers/property_filter_controller.js +45 -0
  28. data/app/assets/javascript/lookout/controllers/realtime_controller.js +30 -0
  29. data/app/assets/javascript/lookout/controllers/sparkline_controller.js +64 -0
  30. data/app/assets/javascript/lookout/controllers/tile_controller.js +33 -0
  31. data/app/assets/javascript/lookout/controllers/toggle_controller.js +17 -0
  32. data/app/assets/javascript/lookout/helpers/chart_utils.js +156 -0
  33. data/app/assets/javascript/lookout/helpers/countries.js +2261 -0
  34. data/app/assets/javascript/lookout/helpers/number_formatters.js +55 -0
  35. data/app/assets/manifest/lookout/manifest.js +2 -0
  36. data/app/components/lookout/combobox_component.html.erb +33 -0
  37. data/app/components/lookout/combobox_component.rb +13 -0
  38. data/app/components/lookout/comparison_link_component.html.erb +17 -0
  39. data/app/components/lookout/comparison_link_component.rb +44 -0
  40. data/app/components/lookout/dropdown_button_component.html.erb +16 -0
  41. data/app/components/lookout/dropdown_button_component.rb +14 -0
  42. data/app/components/lookout/dropdown_link_component.html.erb +17 -0
  43. data/app/components/lookout/dropdown_link_component.rb +19 -0
  44. data/app/components/lookout/filter/dropdown_component.html.erb +50 -0
  45. data/app/components/lookout/filter/dropdown_component.rb +51 -0
  46. data/app/components/lookout/filter/modal_component.html.erb +16 -0
  47. data/app/components/lookout/filter/modal_component.rb +13 -0
  48. data/app/components/lookout/filter/select_component.html.erb +25 -0
  49. data/app/components/lookout/filter/select_component.rb +64 -0
  50. data/app/components/lookout/filter/tag_component.html.erb +13 -0
  51. data/app/components/lookout/filter/tag_component.rb +14 -0
  52. data/app/components/lookout/filter/tag_container_component.html.erb +4 -0
  53. data/app/components/lookout/filter/tag_container_component.rb +6 -0
  54. data/app/components/lookout/previous_next_component.html.erb +8 -0
  55. data/app/components/lookout/previous_next_component.rb +11 -0
  56. data/app/components/lookout/stats/comparable_container_component.html.erb +25 -0
  57. data/app/components/lookout/stats/comparable_container_component.rb +103 -0
  58. data/app/components/lookout/stats/container_component.html.erb +23 -0
  59. data/app/components/lookout/stats/container_component.rb +28 -0
  60. data/app/components/lookout/sticky_nav_component.html.erb +32 -0
  61. data/app/components/lookout/sticky_nav_component.rb +24 -0
  62. data/app/components/lookout/table_component.html.erb +16 -0
  63. data/app/components/lookout/table_component.rb +48 -0
  64. data/app/components/lookout/tables/devices_table_component.rb +11 -0
  65. data/app/components/lookout/tables/dynamic_table.rb +13 -0
  66. data/app/components/lookout/tables/dynamic_table_component.rb +207 -0
  67. data/app/components/lookout/tables/goals_table_component.rb +17 -0
  68. data/app/components/lookout/tables/header_component.html.erb +6 -0
  69. data/app/components/lookout/tables/header_component.rb +18 -0
  70. data/app/components/lookout/tables/headers/header_component.html.erb +5 -0
  71. data/app/components/lookout/tables/headers/header_component.rb +16 -0
  72. data/app/components/lookout/tables/properties_table_component.rb +27 -0
  73. data/app/components/lookout/tables/row_component.html.erb +4 -0
  74. data/app/components/lookout/tables/rows/row_component.html.erb +6 -0
  75. data/app/components/lookout/tables/rows/row_component.rb +40 -0
  76. data/app/components/lookout/tile_component.html.erb +24 -0
  77. data/app/components/lookout/tile_component.rb +24 -0
  78. data/app/components/lookout/tooltip_component.html.erb +3 -0
  79. data/app/components/lookout/tooltip_component.rb +18 -0
  80. data/app/controllers/lookout/application_controller.rb +83 -0
  81. data/app/controllers/lookout/campaigns_controller.rb +19 -0
  82. data/app/controllers/lookout/devices_controller.rb +20 -0
  83. data/app/controllers/lookout/entry_pages_controller.rb +19 -0
  84. data/app/controllers/lookout/exit_pages_controller.rb +19 -0
  85. data/app/controllers/lookout/exports_controller.rb +14 -0
  86. data/app/controllers/lookout/filters/base_controller.rb +15 -0
  87. data/app/controllers/lookout/filters/goals_controller.rb +9 -0
  88. data/app/controllers/lookout/filters/locations_controller.rb +11 -0
  89. data/app/controllers/lookout/filters/operating_systems/names_controller.rb +13 -0
  90. data/app/controllers/lookout/filters/operating_systems/versions_controller.rb +13 -0
  91. data/app/controllers/lookout/filters/pages/actions_controller.rb +13 -0
  92. data/app/controllers/lookout/filters/pages/entry_pages_controller.rb +14 -0
  93. data/app/controllers/lookout/filters/pages/exit_pages_controller.rb +15 -0
  94. data/app/controllers/lookout/filters/properties/names_controller.rb +29 -0
  95. data/app/controllers/lookout/filters/properties/values_controller.rb +15 -0
  96. data/app/controllers/lookout/filters/screens_controller.rb +11 -0
  97. data/app/controllers/lookout/filters/sources_controller.rb +11 -0
  98. data/app/controllers/lookout/filters/utms_controller.rb +10 -0
  99. data/app/controllers/lookout/funnels_controller.rb +8 -0
  100. data/app/controllers/lookout/goals_controller.rb +7 -0
  101. data/app/controllers/lookout/locations/cities_controller.rb +22 -0
  102. data/app/controllers/lookout/locations/countries_controller.rb +22 -0
  103. data/app/controllers/lookout/locations/maps_controller.rb +24 -0
  104. data/app/controllers/lookout/locations/regions_controller.rb +22 -0
  105. data/app/controllers/lookout/properties_controller.rb +73 -0
  106. data/app/controllers/lookout/realtimes_controller.rb +7 -0
  107. data/app/controllers/lookout/roots_controller.rb +6 -0
  108. data/app/controllers/lookout/sources_controller.rb +21 -0
  109. data/app/controllers/lookout/stats/base_controller.rb +148 -0
  110. data/app/controllers/lookout/stats/bounce_rates_controller.rb +12 -0
  111. data/app/controllers/lookout/stats/total_pageviews_controller.rb +10 -0
  112. data/app/controllers/lookout/stats/total_visits_controller.rb +10 -0
  113. data/app/controllers/lookout/stats/unique_visitors_controller.rb +11 -0
  114. data/app/controllers/lookout/stats/views_per_visits_controller.rb +11 -0
  115. data/app/controllers/lookout/stats/visit_durations_controller.rb +10 -0
  116. data/app/controllers/lookout/stats_controller.rb +7 -0
  117. data/app/controllers/lookout/top_pages_controller.rb +20 -0
  118. data/app/decorators/lookout/application_decorator.rb +58 -0
  119. data/app/decorators/lookout/campaign_decorator.rb +27 -0
  120. data/app/decorators/lookout/city_decorator.rb +24 -0
  121. data/app/decorators/lookout/country_decorator.rb +38 -0
  122. data/app/decorators/lookout/device_decorator.rb +27 -0
  123. data/app/decorators/lookout/entry_page_decorator.rb +7 -0
  124. data/app/decorators/lookout/exit_page_decorator.rb +7 -0
  125. data/app/decorators/lookout/page_decorator.rb +27 -0
  126. data/app/decorators/lookout/region_decorator.rb +28 -0
  127. data/app/decorators/lookout/source_decorator.rb +27 -0
  128. data/app/decorators/lookout/top_page_decorator.rb +7 -0
  129. data/app/helpers/lookout/application_helper.rb +124 -0
  130. data/app/models/concerns/lookout/compare_mode.rb +19 -0
  131. data/app/models/concerns/lookout/limitable.rb +17 -0
  132. data/app/models/concerns/lookout/range_options.rb +8 -0
  133. data/app/models/lookout/comparison_mode.rb +72 -0
  134. data/app/models/lookout/export.rb +48 -0
  135. data/app/models/lookout/filter_parser.rb +82 -0
  136. data/app/models/lookout/range_from_params.rb +78 -0
  137. data/app/models/lookout/rangeable.rb +7 -0
  138. data/app/models/lookout/widget.rb +15 -0
  139. data/app/presenters/lookout/dashboard_presenter.rb +53 -0
  140. data/app/presenters/lookout/funnel_presenter.rb +75 -0
  141. data/app/presenters/lookout/goals_presenter.rb +72 -0
  142. data/app/queries/concerns/lookout/comparable_queries.rb +25 -0
  143. data/app/queries/concerns/lookout/comparable_query.rb +152 -0
  144. data/app/queries/concerns/lookout/lazy_comparable_query.rb +42 -0
  145. data/app/queries/lookout/application_query.rb +186 -0
  146. data/app/queries/lookout/campaign_query.rb +14 -0
  147. data/app/queries/lookout/city_query.rb +14 -0
  148. data/app/queries/lookout/country_query.rb +10 -0
  149. data/app/queries/lookout/device_query.rb +10 -0
  150. data/app/queries/lookout/entry_pages_query.rb +18 -0
  151. data/app/queries/lookout/event_query.rb +42 -0
  152. data/app/queries/lookout/exit_pages_query.rb +19 -0
  153. data/app/queries/lookout/region_query.rb +14 -0
  154. data/app/queries/lookout/source_query.rb +11 -0
  155. data/app/queries/lookout/stats/average_views_per_visit_query.rb +20 -0
  156. data/app/queries/lookout/stats/average_visit_duration_query.rb +34 -0
  157. data/app/queries/lookout/stats/base_query.rb +18 -0
  158. data/app/queries/lookout/stats/bounce_rates_query.rb +33 -0
  159. data/app/queries/lookout/stats/total_pageviews_query.rb +9 -0
  160. data/app/queries/lookout/stats/total_visitors_query.rb +9 -0
  161. data/app/queries/lookout/stats/unique_visitors_query.rb +9 -0
  162. data/app/queries/lookout/stats/views_per_visit_query.rb +17 -0
  163. data/app/queries/lookout/stats/visit_duration_query.rb +19 -0
  164. data/app/queries/lookout/top_page_query.rb +13 -0
  165. data/app/queries/lookout/visit_query.rb +42 -0
  166. data/app/views/lookout/campaigns/index.html+details.erb +4 -0
  167. data/app/views/lookout/campaigns/index.html.erb +3 -0
  168. data/app/views/lookout/devices/_table.html.erb +2 -0
  169. data/app/views/lookout/devices/index.html+details.erb +4 -0
  170. data/app/views/lookout/devices/index.html.erb +3 -0
  171. data/app/views/lookout/entry_pages/index.html+details.erb +4 -0
  172. data/app/views/lookout/entry_pages/index.html.erb +3 -0
  173. data/app/views/lookout/exit_pages/index.html+details.erb +4 -0
  174. data/app/views/lookout/exit_pages/index.html.erb +3 -0
  175. data/app/views/lookout/funnels/index.html.erb +7 -0
  176. data/app/views/lookout/funnels/show.html.erb +15 -0
  177. data/app/views/lookout/goals/index.html.erb +4 -0
  178. data/app/views/lookout/layouts/application.html.erb +144 -0
  179. data/app/views/lookout/layouts/shared/_tile_loader.html.erb +5 -0
  180. data/app/views/lookout/layouts/shared/_widget_disabled.html+details.erb +3 -0
  181. data/app/views/lookout/layouts/shared/_widget_disabled.html.erb +3 -0
  182. data/app/views/lookout/locations/cities/index.html+details.erb +4 -0
  183. data/app/views/lookout/locations/cities/index.html.erb +3 -0
  184. data/app/views/lookout/locations/countries/index.html+details.erb +5 -0
  185. data/app/views/lookout/locations/countries/index.html.erb +3 -0
  186. data/app/views/lookout/locations/maps/_simple_map.html.erb +26 -0
  187. data/app/views/lookout/locations/maps/show.html.erb +106 -0
  188. data/app/views/lookout/locations/regions/index.html+details.erb +4 -0
  189. data/app/views/lookout/locations/regions/index.html.erb +3 -0
  190. data/app/views/lookout/properties/_form.html.erb +6 -0
  191. data/app/views/lookout/properties/index.html.erb +3 -0
  192. data/app/views/lookout/properties/show.html.erb +6 -0
  193. data/app/views/lookout/realtimes/show.html.erb +9 -0
  194. data/app/views/lookout/roots/_filters.html.erb +80 -0
  195. data/app/views/lookout/roots/show.html.erb +191 -0
  196. data/app/views/lookout/sources/index.html+details.erb +4 -0
  197. data/app/views/lookout/sources/index.html.erb +3 -0
  198. data/app/views/lookout/stats/base/index.html.erb +40 -0
  199. data/app/views/lookout/stats/show.html.erb +15 -0
  200. data/app/views/lookout/top_pages/index.html+details.erb +4 -0
  201. data/app/views/lookout/top_pages/index.html.erb +3 -0
  202. data/config/routes.rb +69 -0
  203. data/lib/generators/lookout/install_generator.rb +31 -0
  204. data/lib/generators/lookout/migration_generator.rb +21 -0
  205. data/lib/generators/lookout/templates/config.rb.tt +185 -0
  206. data/lib/generators/lookout/templates/migration.rb.tt +7 -0
  207. data/lib/lookout/active_record.rb +108 -0
  208. data/lib/lookout/ahoy/event_methods.rb +75 -0
  209. data/lib/lookout/ahoy/visit_methods.rb +24 -0
  210. data/lib/lookout/configuration.rb +58 -0
  211. data/lib/lookout/database_adapter.rb +168 -0
  212. data/lib/lookout/engine.rb +47 -0
  213. data/lib/lookout/filter_configuration/filter.rb +16 -0
  214. data/lib/lookout/filter_configuration/filter_collection.rb +48 -0
  215. data/lib/lookout/filters_configuration.rb +77 -0
  216. data/lib/lookout/funnels.rb +44 -0
  217. data/lib/lookout/goals.rb +51 -0
  218. data/lib/lookout/period_collection.rb +115 -0
  219. data/lib/lookout/predicate_label.rb +7 -0
  220. data/lib/lookout/railtie.rb +9 -0
  221. data/lib/lookout/version.rb +3 -0
  222. data/lib/lookout.rb +78 -0
  223. metadata +673 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '09732b73be290a847dc49ab5ac90061eec63c5702559800f9b561201312b3f2c'
4
+ data.tar.gz: 924b2e532d384108b238caa4e015fbc5582c25ee9a082476da6ff6e8a78d2828
5
+ SHA512:
6
+ metadata.gz: 5d600f3b4ed18feeffee889a87daf5b29db4fbaede5bedd2e72c871bcf300b916e467e6c394e3fe0497d7544016accaf53e35a13a338e7af284d8274616befc9
7
+ data.tar.gz: 81f588c659786ee8638374bde83adddefe3ce7238ed6a83187c44b67b7a2744d907898630ba839a85e9c9052a22fe7c3202a3447594ff0b7e755d33d3e42ebc9
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2023 Partytray
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # Lookout
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/lookout.svg)](https://badge.fury.io/rb/lookout)
4
+ [![Test Coverage](https://img.shields.io/badge/coverage-4.05%25-brightgreen.svg)](coverage/index.html)
5
+ [![RSpec Tests](https://img.shields.io/badge/tests-86%20passing-brightgreen.svg)](spec/)
6
+ [![Rails 6-8 Ready](https://img.shields.io/badge/Rails%206--8-Ready-brightgreen.svg)](#rails-compatibility)
7
+
8
+ A full-featured, mountable analytics dashboard for your Rails app, powered by Ahoy.
9
+
10
+ Fork of [Ahoy Captain](https://github.com/joshmn/ahoy_captain) with **SQLite support added** (PG already supported), and **Rails 8 compatibility**.
11
+
12
+ <a href="https://github.com/RubyOnVibes/lookout/blob/main/ss.png"><img src="ss.png" style="max-width:300px" /></a>
13
+
14
+ ## Database Support
15
+
16
+ Lookout supports **PostgreSQL** and **SQLite**.
17
+
18
+ ## Installation
19
+
20
+ ### 1. Do the bundle
21
+
22
+ Drop it in:
23
+
24
+ ```bash
25
+ $ bundle add lookout-ahoy
26
+ ```
27
+
28
+ ### 2. Install it
29
+
30
+ ```bash
31
+ $ rails g lookout:install
32
+ ```
33
+
34
+ ### 2.5. Rails 8+ Importmap
35
+
36
+ In your host app’s `config/importmap.rb`, add a single line to pull in Lookout’s pins:
37
+
38
+ ```ruby
39
+ # your app’s pins…
40
+ pin "application"
41
+ pin "@hotwired/turbo-rails", to: "turbo.min.js"
42
+ pin "@hotwired/stimulus", to: "stimulus.min.js"
43
+ pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
44
+ pin_all_from "app/javascript/controllers", under: "controllers"
45
+
46
+ # Lookout Analytics
47
+ Lookout.importmap(self)
48
+ ```
49
+
50
+ This avoids referencing `Lookout::Engine.root` from your app. For older importmap-rails, Lookout also inlines its own importmap via `lookout_importmap_tags`.
51
+
52
+ ### 3. Make sure your events are setup correctly
53
+
54
+ Lookout doesn't do any tracking for you; it merely provides a dashboard for your data from the Ahoy gem.
55
+
56
+ By default, Lookout assumes you're tracking `controller` and `action` in your `Ahoy::Event` properties, and a page view event is named `$view`. See this section for more information: https://github.com/ankane/ahoy#events
57
+
58
+ For a quick sanity check:
59
+
60
+ ```ruby
61
+ Lookout.event.where(name: Lookout.config.event[:view_name]).count
62
+ Lookout.event.with_routes.count
63
+ ```
64
+
65
+ This can be fully-customized. See the initializer `config/initializers/lookout.rb` for more.
66
+
67
+ ### 4. Add Migration (Optional)
68
+
69
+ If you have a large dataset (> 1GB) you probably want some indexes. `rails g lookout:migration`
70
+
71
+ ## Features
72
+
73
+ * Top sources
74
+ * Top pages, landing pages, and exit pages
75
+ * UTM reporting
76
+ * Top locations, by countries, regions, and cities
77
+ * Top devices, by browser, OS, and device type
78
+ * Goal tracking
79
+ * Funnels
80
+ * Filter by:
81
+ * Page
82
+ * Location
83
+ * Device type
84
+ * OS
85
+ * UTM tags
86
+ * Goal
87
+ * Event Property
88
+ * CSV exports
89
+ * Date comparison
90
+
91
+ ## Contributions
92
+
93
+ All are welcome to contribute.
94
+
95
+ ## License
96
+
97
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
98
+
99
+ <img src="logo.png" style="max-height:100px" />
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rdoc/task'
10
+
11
+ RDoc::Task.new(:rdoc) do |rdoc|
12
+ rdoc.rdoc_dir = 'rdoc'
13
+ rdoc.title = 'Lookout'
14
+ rdoc.options << '--line-numbers'
15
+ rdoc.rdoc_files.include('README.md')
16
+ rdoc.rdoc_files.include('lib/**/*.rb')
17
+ end
18
+
19
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
20
+ load 'rails/tasks/engine.rake'
21
+
22
+ load 'rails/tasks/statistics.rake'
23
+
24
+ require 'bundler/gem_tasks'
Binary file
@@ -0,0 +1,199 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5
+ width="819.000000pt" height="819.000000pt" viewBox="0 0 819.000000 819.000000"
6
+ preserveAspectRatio="xMidYMid meet">
7
+ <metadata>
8
+ Created by potrace 1.14, written by Peter Selinger 2001-2017
9
+ </metadata>
10
+ <g transform="translate(0.000000,819.000000) scale(0.100000,-0.100000)"
11
+ fill="#000000" stroke="none">
12
+ <path d="M3933 8112 c-7 -5 -35 -7 -63 -6 -27 1 -50 -2 -50 -7 0 -4 -12 -7
13
+ -27 -7 -16 0 -39 -4 -53 -9 -14 -5 -37 -9 -52 -8 -16 0 -28 -3 -28 -8 0 -4 -4
14
+ -5 -10 -2 -5 3 -10 1 -10 -5 0 -6 -5 -8 -10 -5 -6 4 -18 1 -27 -7 -14 -11 -16
15
+ -11 -8 2 5 9 0 8 -13 -4 -12 -11 -22 -16 -22 -11 0 4 -6 2 -14 -4 -11 -9 -15
16
+ -9 -19 1 -4 11 -6 10 -6 0 -1 -7 -5 -10 -11 -7 -5 3 -10 1 -10 -5 0 -6 -4 -9
17
+ -9 -5 -5 3 -12 1 -16 -5 -4 -6 -11 -8 -16 -5 -5 4 -9 1 -9 -6 0 -6 -8 -9 -20
18
+ -6 -11 3 -20 1 -20 -4 0 -5 -9 -9 -20 -9 -11 0 -20 -4 -20 -10 0 -5 -9 -10
19
+ -19 -10 -11 0 -23 -5 -26 -10 -4 -6 -11 -8 -16 -5 -5 4 -9 1 -9 -5 0 -6 -4 -9
20
+ -9 -5 -5 3 -17 -2 -25 -11 -12 -11 -16 -12 -16 -2 0 9 -2 10 -8 2 -4 -7 -26
21
+ -20 -49 -30 -24 -10 -43 -22 -43 -26 0 -4 -6 -5 -13 -2 -7 2 -23 -5 -35 -16
22
+ -12 -11 -24 -20 -27 -20 -29 1 -35 -1 -29 -12 5 -7 2 -9 -9 -5 -8 3 -21 -1
23
+ -27 -8 -7 -8 -16 -12 -21 -9 -5 3 -9 0 -9 -6 0 -6 -4 -9 -8 -6 -5 3 -19 -4
24
+ -30 -15 -12 -10 -24 -19 -27 -19 -28 1 -35 -1 -30 -10 3 -5 -1 -11 -9 -11 -33
25
+ -3 -37 -4 -45 -17 -5 -8 -11 -13 -15 -13 -20 3 -26 0 -21 -9 3 -6 -1 -7 -9 -4
26
+ -9 3 -23 -1 -31 -10 -9 -9 -23 -16 -31 -16 -8 0 -14 -4 -14 -9 0 -7 -36 -22
27
+ -49 -20 -2 0 -7 -3 -10 -8 -11 -16 -64 -46 -56 -32 5 8 -4 3 -18 -10 -15 -14
28
+ -27 -21 -27 -17 0 4 -12 -2 -26 -13 -15 -11 -31 -18 -37 -14 -6 4 -8 0 -4 -11
29
+ 5 -13 3 -16 -11 -12 -12 4 -29 -3 -47 -18 -16 -14 -32 -23 -37 -20 -4 3 -8 0
30
+ -8 -6 0 -6 -4 -9 -8 -6 -5 3 -19 -4 -31 -15 -12 -12 -25 -19 -28 -16 -3 3 -14
31
+ -3 -26 -13 -11 -11 -24 -17 -29 -14 -4 3 -8 1 -8 -4 0 -4 -16 -14 -35 -22 -19
32
+ -8 -35 -17 -35 -21 0 -4 -13 -12 -30 -18 -16 -5 -30 -15 -30 -20 0 -6 -7 -8
33
+ -15 -5 -8 4 -15 1 -15 -5 0 -6 -9 -11 -20 -11 -10 0 -23 -7 -28 -16 -5 -9 -13
34
+ -17 -18 -17 -5 -1 -8 -6 -6 -10 1 -5 -2 -6 -7 -3 -5 4 -12 2 -16 -4 -3 -5 -15
35
+ -10 -26 -10 -10 0 -19 -5 -19 -11 0 -5 -5 -7 -10 -4 -5 3 -10 2 -10 -4 0 -5
36
+ -16 -15 -34 -22 -19 -7 -32 -17 -29 -23 4 -5 -1 -7 -10 -3 -10 3 -17 2 -17 -3
37
+ 0 -5 -11 -12 -25 -16 -14 -3 -22 -10 -19 -15 3 -5 -4 -9 -16 -9 -11 0 -23 -7
38
+ -26 -15 -4 -8 -14 -15 -24 -15 -10 0 -21 -7 -24 -16 -4 -9 -9 -14 -13 -11 -3
39
+ 4 -15 -4 -27 -16 -12 -12 -25 -25 -31 -27 -5 -3 -9 -9 -7 -13 1 -5 -2 -6 -8
40
+ -2 -5 3 -13 -1 -16 -9 -3 -9 -9 -14 -14 -11 -4 2 -13 -7 -20 -20 -7 -13 -17
41
+ -22 -21 -20 -4 3 -10 -4 -14 -15 -3 -11 -11 -20 -16 -20 -5 0 -9 -7 -9 -16 0
42
+ -8 -4 -13 -9 -10 -5 3 -14 -8 -21 -24 -7 -16 -17 -27 -23 -23 -5 3 -7 2 -4 -4
43
+ 4 -5 -5 -25 -18 -43 -13 -18 -22 -36 -20 -40 3 -5 -2 -10 -10 -14 -8 -3 -12
44
+ -11 -9 -19 3 -8 -2 -20 -11 -27 -13 -11 -13 -15 -3 -21 10 -7 9 -9 -3 -9 -11
45
+ 0 -15 -8 -14 -25 2 -14 0 -25 -4 -25 -6 0 -12 -38 -13 -80 -1 -8 -5 -21 -11
46
+ -27 -6 -9 -6 -13 2 -13 7 0 10 -4 6 -9 -11 -19 -13 -91 -3 -84 7 4 8 1 3 -8
47
+ -11 -17 -16 -59 -6 -59 4 0 7 -9 8 -20 1 -13 -2 -18 -10 -13 -9 5 -9 3 -1 -8
48
+ 6 -8 12 -21 12 -29 1 -24 7 -44 16 -59 6 -10 5 -12 -3 -7 -8 6 -8 1 1 -18 6
49
+ -14 15 -26 19 -26 4 0 6 -9 4 -20 -2 -11 1 -20 6 -20 6 0 7 -4 4 -10 -3 -5 -1
50
+ -10 4 -10 6 0 11 -9 11 -20 0 -11 5 -20 10 -20 6 0 10 -7 10 -15 0 -8 5 -15
51
+ 10 -15 6 0 10 -7 10 -15 0 -8 5 -15 10 -15 6 0 10 -7 10 -15 0 -8 4 -15 8 -15
52
+ 5 0 15 -11 22 -25 7 -14 20 -25 27 -25 8 0 12 -3 10 -7 -3 -5 8 -19 25 -33 16
53
+ -14 38 -33 49 -42 10 -10 22 -18 25 -18 10 0 33 -27 29 -34 -3 -3 -2 -4 1 -1
54
+ 4 2 16 -1 28 -7 11 -7 24 -11 29 -10 4 1 7 -2 7 -7 0 -10 27 -21 44 -20 5 0
55
+ 12 -3 15 -8 9 -12 54 -36 47 -25 -3 6 12 2 33 -9 22 -10 46 -19 54 -19 7 0 17
56
+ -3 21 -7 6 -7 29 -13 54 -15 6 -1 12 -4 12 -7 0 -3 14 -12 30 -19 17 -8 28
57
+ -17 25 -22 -3 -4 2 -13 9 -19 8 -7 17 -30 21 -52 4 -21 12 -39 18 -39 7 0 5
58
+ -5 -3 -10 -9 -6 -10 -10 -3 -10 7 0 10 -13 9 -35 -2 -19 1 -32 5 -29 5 3 9 -6
59
+ 9 -20 0 -32 1 -35 17 -66 10 -19 10 -26 0 -32 -9 -6 -9 -8 1 -8 7 0 10 -4 7
60
+ -10 -3 -5 -2 -10 2 -10 8 0 12 -15 15 -57 1 -7 5 -13 9 -13 4 0 10 -12 14 -27
61
+ 6 -26 56 -83 72 -83 20 0 43 -12 43 -22 0 -6 3 -9 6 -5 14 14 41 -26 39 -59
62
+ -1 -19 3 -34 9 -34 6 0 6 -4 -1 -11 -14 -14 -5 -42 10 -32 6 4 7 1 2 -8 -12
63
+ -19 -12 -63 0 -71 6 -5 5 -8 -2 -8 -7 0 -10 -6 -7 -14 3 -8 0 -17 -5 -21 -6
64
+ -3 -9 -11 -5 -16 11 -18 -5 -54 -29 -65 -13 -6 -40 -10 -60 -9 -20 0 -37 -2
65
+ -37 -6 0 -4 -12 -6 -26 -6 -15 0 -29 -5 -33 -10 -3 -4 -18 -8 -33 -8 -15 1
66
+ -25 -2 -23 -6 3 -3 -14 -11 -36 -18 -26 -8 -37 -16 -33 -24 4 -7 4 -9 -1 -5
67
+ -4 4 -14 3 -22 -3 -7 -6 -13 -8 -13 -3 -1 5 -7 -2 -15 -16 -8 -14 -14 -19 -15
68
+ -12 0 7 -10 2 -22 -10 -13 -13 -22 -26 -21 -30 2 -5 -2 -8 -8 -8 -12 0 -69
69
+ -60 -69 -73 0 -4 -5 -5 -12 -1 -6 4 -8 3 -4 -4 3 -6 -1 -17 -9 -25 -8 -9 -15
70
+ -20 -15 -26 0 -6 -5 -11 -11 -11 -5 0 -7 -4 -4 -10 3 -6 1 -10 -5 -10 -6 0 -8
71
+ -4 -5 -10 3 -5 1 -10 -6 -10 -7 0 -9 -3 -6 -7 4 -3 -1 -15 -10 -26 -13 -15
72
+ -14 -18 -3 -12 13 8 13 7 0 -10 -8 -10 -15 -21 -15 -24 0 -3 -2 -5 -5 -4 -5 1
73
+ -11 -51 -14 -119 0 -16 -4 -28 -7 -28 -3 0 -4 -16 -2 -36 3 -27 1 -34 -9 -28
74
+ -10 6 -10 4 -2 -7 5 -8 11 -27 13 -44 3 -47 6 -59 15 -74 7 -10 5 -12 -3 -6
75
+ -8 4 -7 -4 3 -24 9 -17 14 -31 10 -31 -4 0 -2 -6 4 -12 11 -14 12 -17 12 -49
76
+ 0 -11 4 -18 9 -15 11 7 23 -22 15 -35 -3 -5 0 -9 5 -9 6 0 11 -6 11 -14 0 -8
77
+ 4 -16 8 -18 4 -1 18 -20 31 -40 12 -21 27 -38 32 -38 5 0 9 -7 9 -17 0 -9 2
78
+ -14 5 -11 3 3 28 -17 54 -43 27 -27 54 -49 59 -49 5 0 13 -7 16 -16 3 -8 10
79
+ -12 16 -9 5 3 10 1 10 -4 0 -6 9 -20 20 -31 12 -12 18 -25 15 -30 -3 -4 -1
80
+ -10 4 -12 9 -3 18 -50 26 -128 2 -14 3 -29 4 -33 1 -5 6 -5 13 -1 6 4 8 3 4
81
+ -4 -9 -15 16 -102 27 -95 6 3 7 1 3 -6 -4 -6 -2 -18 4 -26 7 -8 9 -15 6 -15
82
+ -4 0 0 -7 8 -16 9 -8 14 -20 11 -25 -4 -5 -1 -9 4 -9 6 0 11 -7 11 -15 0 -8 5
83
+ -15 11 -15 5 0 7 -5 4 -10 -3 -6 1 -13 9 -16 9 -3 13 -10 10 -15 -3 -5 -1 -9
84
+ 5 -9 5 0 13 -10 17 -22 4 -13 14 -34 23 -48 18 -27 24 -166 9 -187 -5 -7 -5
85
+ -14 2 -18 8 -5 8 -11 -1 -21 -9 -11 -9 -14 0 -14 8 0 9 -5 2 -19 -6 -10 -7
86
+ -21 -4 -25 11 -10 12 -37 2 -30 -5 3 -4 -7 1 -21 13 -34 13 -38 -2 -29 -7 5
87
+ -8 3 -2 -7 4 -8 9 -32 11 -54 1 -22 3 -57 4 -77 1 -24 6 -35 13 -31 6 4 5 -1
88
+ -3 -10 -9 -12 -10 -17 -2 -17 7 0 10 -4 7 -8 -3 -4 0 -26 5 -48 6 -21 10 -47
89
+ 10 -57 0 -9 4 -17 9 -17 4 0 7 -8 6 -17 -3 -17 33 -132 44 -143 3 -3 6 -14 8
90
+ -24 2 -11 10 -29 17 -40 8 -12 14 -25 15 -31 3 -32 13 -54 23 -48 6 4 8 0 4
91
+ -10 -3 -9 -2 -19 3 -22 6 -3 15 -15 21 -27 9 -16 8 -19 -3 -12 -7 4 -5 -2 5
92
+ -13 9 -11 17 -24 17 -30 0 -6 7 -14 16 -17 8 -3 12 -10 9 -16 -3 -5 -1 -10 4
93
+ -10 6 0 11 -6 11 -13 0 -7 9 -23 20 -35 12 -12 17 -22 13 -22 -4 0 4 -10 18
94
+ -23 14 -12 24 -28 22 -34 -3 -7 2 -13 11 -13 9 0 15 -6 14 -12 -2 -7 3 -12 10
95
+ -10 8 1 11 -2 8 -6 -3 -5 4 -20 15 -33 62 -72 109 -119 119 -119 6 0 9 -4 6
96
+ -8 -3 -5 4 -15 16 -23 11 -8 31 -23 43 -34 58 -51 75 -64 75 -58 0 3 8 -3 17
97
+ -13 22 -24 73 -57 73 -47 0 4 7 -2 15 -13 8 -10 15 -15 15 -10 0 5 9 -1 19
98
+ -13 11 -13 24 -20 30 -17 5 3 17 -2 27 -11 10 -10 20 -18 23 -18 3 -1 33 -14
99
+ 66 -30 33 -16 65 -29 70 -30 6 0 13 -3 16 -8 3 -4 19 -9 36 -10 17 -1 29 -5
100
+ 26 -9 -2 -5 4 -8 15 -8 10 0 22 -3 26 -7 4 -4 19 -9 34 -11 15 -2 29 -7 32
101
+ -11 3 -4 20 -7 38 -5 18 1 30 -1 27 -6 -2 -4 5 -8 18 -8 23 -1 62 -9 62 -13 0
102
+ -1 11 -2 25 -3 14 -1 31 -5 38 -10 7 -4 19 -5 27 -2 8 3 15 1 15 -5 0 -6 4 -8
103
+ 9 -5 11 7 72 -54 65 -66 -3 -4 -1 -8 4 -8 11 0 13 -10 16 -105 2 -44 -1 -88
104
+ -6 -99 -8 -14 -7 -17 3 -11 8 6 10 4 4 -6 -11 -18 -13 -79 -2 -79 4 0 3 -10
105
+ -4 -21 -8 -15 -8 -19 0 -15 7 5 11 -4 11 -23 0 -17 4 -31 10 -31 5 0 7 -7 4
106
+ -15 -4 -8 -1 -15 5 -15 6 0 11 -3 10 -7 -2 -16 14 -53 22 -53 5 0 9 -9 9 -20
107
+ 0 -10 8 -24 18 -29 9 -6 14 -11 10 -11 -12 0 65 -80 97 -100 52 -31 127 -52
108
+ 212 -56 73 -4 85 -2 103 16 18 18 20 29 15 78 -4 31 -2 94 4 139 21 148 74
109
+ 274 193 458 115 177 133 270 89 440 l-23 90 22 57 c12 32 26 58 32 58 6 0 87
110
+ -24 182 -54 283 -90 672 -194 683 -182 3 3 23 69 44 148 172 629 215 761 320
111
+ 994 l60 131 -16 129 c-22 186 -21 196 20 253 38 53 102 196 82 184 -9 -5 -9
112
+ -3 0 9 7 8 10 18 6 21 -3 4 -1 7 5 7 6 0 14 25 17 55 4 30 10 53 14 51 4 -3 7
113
+ 20 7 50 -1 30 3 54 7 54 5 0 5 5 2 10 -3 6 -1 10 4 10 6 0 11 6 11 14 0 15 62
114
+ 66 80 66 6 0 9 4 5 9 -3 5 3 12 13 15 23 8 113 92 105 100 -3 3 2 8 11 12 9 3
115
+ 13 10 10 15 -3 5 2 9 10 9 9 0 15 3 14 8 -3 14 22 62 32 62 6 0 9 4 5 9 -3 5
116
+ 1 16 9 24 8 8 12 17 9 21 -3 3 -1 12 5 19 7 8 9 17 5 20 -3 4 -1 7 6 7 8 0 11
117
+ 7 7 15 -3 8 -2 15 2 15 7 0 12 24 15 68 0 6 4 12 8 12 4 0 6 8 4 18 -1 9 2 27
118
+ 6 40 6 15 5 22 -3 22 -7 0 -3 7 8 16 10 8 13 12 5 8 -11 -5 -13 -2 -9 14 3 12
119
+ 1 23 -6 26 -8 3 -8 5 0 5 8 1 9 12 4 35 -4 19 -5 37 -2 40 2 3 -1 12 -8 21 -7
120
+ 8 -9 15 -5 15 4 0 1 10 -7 23 -8 12 -13 32 -12 45 1 12 -3 22 -8 22 -6 0 -8 7
121
+ -4 15 3 8 1 15 -4 15 -6 0 -10 6 -10 14 0 7 -7 19 -15 26 -9 7 -13 15 -11 18
122
+ 3 2 -2 11 -10 19 -8 8 -11 20 -7 26 3 7 3 9 -2 5 -10 -9 -41 32 -37 47 2 6 1
123
+ 7 -3 3 -9 -8 -35 14 -28 25 2 4 -1 7 -7 7 -7 0 -25 14 -41 31 -16 17 -29 29
124
+ -29 26 0 -4 -12 5 -26 18 -15 14 -33 25 -40 25 -8 0 -14 5 -14 11 0 5 -4 8 -9
125
+ 5 -4 -3 -17 1 -27 9 -10 8 -27 15 -36 15 -10 0 -18 5 -18 11 0 6 -9 9 -20 6
126
+ -11 -3 -20 -1 -20 5 0 5 -4 7 -9 3 -5 -3 -12 -2 -15 3 -2 4 -25 8 -50 7 -25 0
127
+ -46 3 -46 8 0 4 -4 6 -8 3 -15 -9 -32 10 -34 37 -1 15 -5 27 -9 27 -8 0 -5 42
128
+ 4 58 5 6 4 12 -1 12 -5 0 -9 7 -9 15 0 8 5 15 11 15 6 0 4 5 -4 10 -8 5 -10
129
+ 10 -4 10 6 0 9 18 8 43 -3 67 5 94 35 107 14 6 27 11 29 11 1 -1 8 3 15 9 6 6
130
+ 24 20 40 31 15 11 25 24 22 29 -3 5 -1 10 5 12 10 3 19 31 24 71 1 10 9 23 17
131
+ 28 12 7 12 9 -1 9 -9 0 -11 3 -5 8 9 7 12 18 17 67 1 11 7 23 13 27 6 5 5 8
132
+ -4 8 -10 0 -10 6 4 26 9 15 12 23 5 19 -9 -5 -9 -2 -1 14 6 12 16 30 22 42 8
133
+ 17 8 19 -3 13 -10 -6 -10 -5 -2 7 6 8 10 24 9 36 -1 12 3 20 8 16 5 -3 7 8 5
134
+ 23 -2 19 1 28 10 27 6 -2 12 3 12 10 0 30 52 57 150 79 8 1 17 6 20 10 3 3 19
135
+ 8 35 12 55 9 75 18 68 29 -4 6 2 8 15 5 12 -4 22 -3 22 1 0 3 9 12 21 19 17
136
+ 11 20 11 14 0 -3 -7 3 -3 14 10 11 13 25 21 30 18 5 -3 12 1 15 10 3 8 11 12
137
+ 17 8 7 -4 10 -3 7 2 -3 5 0 15 8 22 8 7 14 10 14 6 0 -4 10 5 23 19 12 15 28
138
+ 27 35 27 7 0 12 4 12 9 0 6 11 23 25 38 36 40 37 43 73 101 17 28 29 52 25 52
139
+ -4 0 2 7 13 15 10 8 15 15 11 15 -5 0 1 13 12 28 15 22 17 32 9 40 -9 9 -9 12
140
+ 0 12 7 0 12 9 12 20 0 11 3 20 8 20 4 0 7 15 6 32 -1 18 4 37 10 41 8 6 7 10
141
+ -2 14 -10 4 -10 8 -1 19 7 9 8 19 2 27 -8 11 -10 29 -3 42 7 14 5 31 -5 37 -7
142
+ 5 -6 8 1 8 12 0 12 29 -1 49 -6 10 -4 12 5 6 9 -6 11 -4 5 4 -4 7 -9 29 -12
143
+ 49 -3 21 -6 45 -7 55 -1 10 -7 22 -12 25 -5 4 -9 17 -8 29 1 12 -3 20 -7 17
144
+ -5 -3 -9 3 -9 13 0 10 -7 26 -15 36 -7 11 -11 25 -8 33 3 8 -2 17 -11 20 -9 3
145
+ -16 12 -16 20 0 8 -5 14 -12 14 -6 0 -9 3 -5 6 6 7 4 10 -42 63 -17 19 -27 39
146
+ -24 44 3 6 1 7 -5 3 -6 -3 -16 3 -22 15 -7 11 -14 19 -16 16 -3 -3 -20 10 -39
147
+ 28 -18 19 -36 31 -39 28 -3 -4 -6 1 -6 10 0 10 -3 17 -7 16 -18 -3 -52 14 -47
148
+ 22 3 5 -1 9 -9 9 -8 0 -26 11 -41 25 -29 27 -41 32 -30 13 4 -7 -6 -1 -23 15
149
+ -16 15 -37 27 -46 27 -9 0 -17 5 -17 10 0 6 -7 10 -16 10 -9 0 -12 5 -8 12 4
150
+ 7 3 8 -5 4 -6 -4 -25 2 -41 14 -17 12 -30 18 -30 13 0 -4 -4 -3 -8 2 -13 19
151
+ -76 60 -68 44 4 -7 1 -6 -7 3 -8 10 -17 15 -20 11 -4 -3 -9 2 -13 11 -3 9 -10
152
+ 14 -14 11 -5 -3 -11 -1 -15 5 -3 5 -15 10 -26 10 -11 0 -18 4 -15 9 5 8 -11
153
+ 19 -36 26 -5 2 -11 4 -15 5 -5 1 -12 2 -16 1 -4 -1 -10 6 -13 14 -3 8 -10 12
154
+ -15 9 -5 -3 -9 0 -9 6 0 6 -5 8 -10 5 -6 -3 -13 1 -16 9 -3 9 -15 16 -25 16
155
+ -10 0 -19 5 -19 10 0 6 -8 10 -18 10 -11 0 -29 9 -42 20 -13 11 -28 20 -35 20
156
+ -6 0 -20 8 -31 18 -10 9 -28 19 -39 20 -11 2 -21 8 -23 13 -2 5 -10 9 -18 9
157
+ -8 0 -14 5 -14 10 0 6 -9 10 -20 10 -11 0 -20 5 -20 10 0 6 -7 10 -16 10 -9 0
158
+ -12 5 -8 12 4 7 3 8 -4 4 -6 -4 -28 4 -49 16 -21 13 -51 30 -68 38 -16 8 -33
159
+ 19 -37 25 -4 5 -8 6 -8 1 0 -5 -9 -1 -20 9 -11 10 -20 14 -20 10 0 -4 -8 -1
160
+ -17 7 -10 8 -33 21 -50 29 -18 8 -33 18 -33 22 0 5 -4 6 -9 2 -5 -3 -12 -1
161
+ -16 5 -4 6 -11 8 -16 5 -5 -4 -9 1 -9 10 0 10 -5 13 -12 9 -6 -4 -17 1 -24 10
162
+ -7 10 -14 16 -16 15 -6 -4 -48 13 -48 20 0 4 -10 8 -22 8 -13 1 -24 7 -26 13
163
+ -2 5 -12 10 -23 10 -10 0 -19 5 -19 12 0 6 -3 8 -7 5 -3 -4 -15 0 -25 10 -10
164
+ 9 -21 13 -24 10 -4 -3 -13 1 -21 9 -8 8 -19 12 -24 9 -5 -4 -9 -1 -9 5 0 7 -7
165
+ 10 -15 6 -8 -3 -15 -1 -15 4 0 6 -7 10 -15 10 -8 0 -15 5 -15 10 0 6 -13 10
166
+ -29 10 -16 0 -34 7 -41 15 -7 8 -16 12 -21 9 -5 -2 -21 3 -36 13 -15 10 -28
167
+ 17 -30 16 -10 -9 -33 -1 -27 9 5 7 2 9 -8 5 -9 -3 -21 0 -28 6 -10 9 -11 9 -5
168
+ -3 7 -12 6 -13 -6 -4 -8 6 -27 15 -44 19 -16 5 -37 10 -45 12 -8 2 -21 5 -27
169
+ 5 -7 1 -13 4 -13 8 0 4 -22 6 -49 6 -27 -1 -47 2 -45 6 2 4 0 9 -5 12 -5 4
170
+ -13 1 -17 -5 -5 -8 -9 -8 -14 1 -4 7 -28 14 -52 14 -24 1 -49 5 -56 10 -7 4
171
+ -12 2 -12 -6 0 -10 -2 -10 -9 1 -6 9 -10 10 -16 2 -5 -9 -10 -9 -21 0 -11 9
172
+ -14 9 -14 -1 0 -10 -3 -10 -15 0 -12 10 -15 10 -15 0 0 -9 -3 -10 -13 -1 -10
173
+ 8 -17 7 -27 -2 -10 -9 -11 -9 -6 1 8 13 -19 13 -41 -1 -6 -4 -15 -3 -18 3 -5
174
+ 8 -11 7 -21 -1 -11 -9 -14 -9 -14 1 0 10 -3 10 -15 0 -11 -9 -15 -9 -15 -1 0
175
+ 9 -5 9 -21 0 -15 -8 -19 -8 -15 0 8 13 6 14 -11 3z m-139 -5820 c3 -5 -1 -9
176
+ -9 -9 -8 0 -12 4 -9 9 3 4 7 8 9 8 2 0 6 -4 9 -8z m14 -32 c-7 -10 -14 -17
177
+ -17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m62 8 c0 -11 -12 -10 -30 2 -12 7
178
+ -10 9 8 7 12 0 22 -5 22 -9z m-17 -22 c15 2 16 0 6 -12 -7 -8 -7 -14 -1 -14 5
179
+ 0 17 10 26 23 13 16 14 17 7 2 -6 -13 -5 -28 5 -47 8 -15 12 -28 8 -28 -4 0 0
180
+ -8 7 -17 12 -16 12 -17 -2 -6 -12 10 -20 9 -37 -3 -12 -8 -22 -20 -22 -26 0
181
+ -6 8 -4 18 5 12 11 22 13 32 7 8 -5 10 -10 4 -10 -6 0 -16 -10 -23 -22 -11
182
+ -23 -11 -23 -5 2 7 25 6 25 -14 7 -12 -11 -26 -16 -33 -11 -9 5 -10 2 -5 -12
183
+ 5 -14 4 -16 -4 -8 -9 9 -9 17 -1 32 15 27 14 39 -1 24 -17 -17 -31 -15 -24 3
184
+ 3 8 -2 19 -12 24 -11 7 -12 11 -4 11 7 0 10 5 7 10 -4 6 -10 8 -15 5 -5 -3
185
+ -12 -1 -15 5 -4 6 -1 9 6 8 16 -4 19 24 4 35 -6 5 -4 7 5 4 8 -2 14 -10 13
186
+ -16 -2 -6 5 -11 14 -11 9 0 13 3 10 6 -3 4 -1 16 4 27 6 11 14 15 18 10 3 -6
187
+ 14 -9 24 -7z m-73 -101 c0 -2 -9 -3 -19 -2 -11 0 -18 5 -15 9 4 6 34 0 34 -7z
188
+ m86 -88 c1 -9 -2 -15 -7 -11 -5 3 -7 9 -4 14 3 4 0 11 -5 13 -6 3 -5 4 1 3 7
189
+ -1 13 -10 15 -19z"/>
190
+ <path d="M3815 2231 c-3 -3 5 -11 17 -18 13 -7 16 -13 8 -12 -8 1 -26 1 -39 0
191
+ -38 -2 -14 -16 30 -17 22 -1 38 1 35 4 -3 3 -1 11 4 18 8 9 6 12 -7 10 -10 0
192
+ -17 4 -16 10 2 11 -23 15 -32 5z"/>
193
+ <path d="M3871 2193 c5 -28 -1 -35 -18 -22 -10 8 -14 9 -10 2 4 -6 3 -14 -2
194
+ -17 -5 -3 -11 1 -15 9 -3 8 -12 12 -21 9 -11 -5 -13 -10 -5 -19 5 -6 6 -16 2
195
+ -21 -4 -4 0 -3 10 4 11 9 18 10 23 3 9 -15 65 28 58 45 -5 14 -24 20 -22 7z"/>
196
+ <path d="M3830 2110 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0
197
+ -4 -4 -4 -10z"/>
198
+ </g>
199
+ </svg>
@@ -0,0 +1,2 @@
1
+ import '@hotwired/turbo-rails';
2
+ import 'controllers';
@@ -0,0 +1,9 @@
1
+ import { Application } from '@hotwired/stimulus';
2
+
3
+ const application = Application.start();
4
+
5
+ // Configure Stimulus development experience
6
+ application.debug = false;
7
+ window.Stimulus = application;
8
+
9
+ export { application };
@@ -0,0 +1,33 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+
3
+ export default class extends Controller {
4
+ connect() {
5
+ window.comboboxConnected = 0;
6
+ if (new URLSearchParams(window.location.search).get('period') === 'realtime') {
7
+ this.element.querySelectorAll('turbo-frame').forEach((frame) => {
8
+ setInterval(() => {
9
+ frame.reload();
10
+ }, 1000 * 30);
11
+ });
12
+ }
13
+
14
+ document.querySelectorAll('a[data-turbo-frame]').forEach(link => {
15
+ const frameSelector = link.dataset.turboFrame;
16
+ const frame = document.querySelector(`turbo-frame#${frameSelector}`);
17
+ if(frame) {
18
+ const src = frame.src;
19
+ if(link.href.includes(src)) {
20
+ link.classList.add('text-primary', 'font-semibold')
21
+ }
22
+ }
23
+
24
+ })
25
+ }
26
+
27
+ comboboxInit(event) {
28
+ if(event.detail.combobox.selectTarget.id === "property-name" || event.detail.combobox.selectTarget.id === "property-value") {
29
+ window.comboboxConnected += 1;
30
+ }
31
+ }
32
+
33
+ }