diff --git a/.github/workflows/test-postgis.yml b/.github/workflows/test-postgis.yml index 268255a4..717d388b 100644 --- a/.github/workflows/test-postgis.yml +++ b/.github/workflows/test-postgis.yml @@ -7,9 +7,11 @@ on: push: branches: - main + - next pull_request: branches: - main + - next jobs: test: @@ -22,18 +24,9 @@ jobs: strategy: fail-fast: false matrix: - redmine_version: [4.2-stable, 5.0-stable, master] - ruby_version: ['2.7', '3.0', '3.1', '3.2'] - db_version: [11-2.5, 15-3.3] - exclude: - - redmine_version: 4.2-stable - ruby_version: 3.0 - - redmine_version: 4.2-stable - ruby_version: 3.1 - - redmine_version: 4.2-stable - ruby_version: 3.2 - - redmine_version: 5.0-stable - ruby_version: 3.2 + redmine_version: [5.0-stable, master] + ruby_version: ['3.0', '3.1'] + db_version: [12-3.0, 15-3.3] services: postgres: @@ -94,17 +87,14 @@ jobs: encoding: utf8 EOF - - name: Adjust Gem environment - run: | - case "${{ matrix.redmine_version }}" in - 4.2-stable) - echo "GEM_RGEO_ACTIVERECORD_VERSION=6.2.2" >> ${GITHUB_ENV} - echo "GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION=5.2.3" >> ${GITHUB_ENV} - ;; - master) - echo "GEM_PG_VERSION=1.4.5" >> ${GITHUB_ENV} - ;; - esac + # - name: Adjust Gem environment + # run: | + # case "${{ matrix.redmine_version }}" in + # 4.2-stable) + # echo "GEM_RGEO_ACTIVERECORD_VERSION=6.2.2" >> ${GITHUB_ENV} + # echo "GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION=5.2.3" >> ${GITHUB_ENV} + # ;; + # esac - name: Install Ruby dependencies working-directory: redmine diff --git a/.gitignore b/.gitignore index 351b9ab2..a0d9f986 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ +# Ignore commonly generated/ignored files .DS_Store -node_modules -# webpack generate files -assets/javascripts/main.js -assets/javascripts/main.js.* -assets/javascripts/*.png -assets/javascripts/*.svg -assets/javascripts/*.ttf -assets/javascripts/*.eot -assets/javascripts/*.woff2 -assets/javascripts/*.woff - +node_modules/ +# Ignore webpack generated files +assets/* +!assets/.keep diff --git a/Gemfile b/Gemfile index 37706324..bf86fd38 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,18 @@ source 'https://rubygems.org' +# Define gem versions with environment variables or default versions +gem_versions = { + pg: ENV['GEM_PG_VERSION'] || '1.5.3', + rgeo: ENV['GEM_RGEO_VERSION'] || '3.0.0', + rgeo_activerecord: ENV['GEM_RGEO_ACTIVERECORD_VERSION'] || '7.0.1', + activerecord_postgis_adapter: ENV['GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION'] || '7.1.1' +} + gem 'deface' gem 'immutable-struct' -gem "rgeo", "~> 2.4.0" +gem "rgeo", "~> #{gem_versions[:rgeo]}" gem "rgeo-geojson" -gem "pg", (ENV['GEM_PG_VERSION'] ? "~> #{ENV['GEM_PG_VERSION']}" : "~> 1.2.2") # make sure we use a version compatible with AR -gem "rgeo-activerecord", (ENV['GEM_RGEO_ACTIVERECORD_VERSION'] ? "~> #{ENV['GEM_RGEO_ACTIVERECORD_VERSION']}" : "~> 7.0.1") # same as above -gem 'activerecord-postgis-adapter', (ENV['GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION'] ? "~> #{ENV['GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION']}" : "~> 7.1.1") # same as above +gem "pg", "~> #{gem_versions[:pg]}" +gem "rgeo-activerecord", "~> #{gem_versions[:rgeo_activerecord]}" +gem 'activerecord-postgis-adapter', "~> #{gem_versions[:activerecord_postgis_adapter]}" gem 'rails-controller-testing' # This gem brings back assigns to your controller tests as well as assert_template to both controller and integration tests. diff --git a/README.md b/README.md index f0ae5dbd..3c71c629 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ The Geo-Task-Tracker (GTT) plugin adds spatial capabilities to Redmine: Redmine GTT plugins **require PostgreSQL/PostGIS** and will not work with SQLite or MariaDB/MySQL!!! -- Redmine >= 4.2.0 -- PostgreSQL >= 10 -- PostGIS >= 2.5 -- NodeJS v14 +- Redmine >= 5.0.0 +- PostgreSQL >= 12 +- PostGIS >= 3.0 +- NodeJS v18 - yarn ## Installation @@ -43,12 +43,17 @@ yarn npx webpack ``` +Optionally export to override the [default GEM version](./Gemfile) + +```sh +export GEM_PG_VERSION=your-pg-version +export GEM_RGEO_ACTIVERECORD_VERSION=your-rgeo-activerecord-version +export GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION=your-activerecord-postgis-adapter-version +``` + Then run ```sh -export GEM_PG_VERSION=your-pg-version # skip this line if redmine use pg 1.2.2. -export GEM_RGEO_ACTIVERECORD_VERSION=your-rgeo-activerecord-version # skip this line if using rgeo-activerecord 6.2.2. -export GEM_ACTIVERECORD_POSTGIS_ADAPTER_VERSION=your-activerecord-postgis-adapter-version # skip this line if using activerecord-postgis-adapter 5.2.3. bundle install bundle exec rake redmine:plugins:migrate ``` @@ -91,7 +96,7 @@ Help us to translate GTT Project using [OSGeo Weblate](https://weblate.osgeo.org You can debug frontend by running the following command on another console: ```sh -npx webpack --watch --mode=development +npx webpack --watch --mode=development --devtool=source-map ``` ### How to run test diff --git a/app/controllers/gtt_configuration_controller.rb b/app/controllers/gtt_configuration_controller.rb index 540436e6..3819dd59 100644 --- a/app/controllers/gtt_configuration_controller.rb +++ b/app/controllers/gtt_configuration_controller.rb @@ -1,74 +1,73 @@ class GttConfigurationController < ApplicationController - before_action :find_optional_project_and_authorize + before_action :find_optional_project_and_authorize - accept_api_auth :default_setting_configuration + accept_api_auth :default_setting_configuration - def default_setting_configuration - gtt_map_config = build_default_setting_config - respond_to do |format| - format.api { render json: build_default_setting_config} - end + def default_setting_configuration + gtt_map_config = build_default_setting_config + respond_to do |format| + format.api { render json: build_default_setting_config} end + end - def build_default_setting_config - default_tracker_icon = [] - default_status_color = [] - gtt_tile_source = [] + def build_default_setting_config + default_tracker_icon = [] + default_status_color = [] + gtt_map_layer = [] - Tracker.all.sort.each {|tracker| - default_tracker_icon.append({ - trackerID: tracker.id, - trackerName: tracker.name, - icon: Setting.plugin_redmine_gtt['tracker_'+tracker.id.to_s] - }) - } - IssueStatus.all.sort.each {|status| - default_status_color.append({ - statusID: status.id, - statusName: status.name, - color: Setting.plugin_redmine_gtt['status_'+status.id.to_s] - }) - } - GttTileSource.where(global: true).sort.each {|tileSource| - gtt_tile_source.append({ - id: tileSource.id, - name: tileSource.name, - type: tileSource.type, - options: tileSource.options - }) - } + Tracker.all.sort.each {|tracker| + default_tracker_icon.append({ + trackerID: tracker.id, + trackerName: tracker.name, + icon: Setting.plugin_redmine_gtt['tracker_'+tracker.id.to_s] + }) + } - mapConfig = { - gttDefaultSetting: { - defaultTrackerIcon: default_tracker_icon, - defaultStatusColor: default_status_color, - defaultMapSetting: { - centerLng: Setting.plugin_redmine_gtt['default_map_center_longitude'], - centerLat: Setting.plugin_redmine_gtt['default_map_center_latitude'] - }, - geometrySetting: { - geometryTypes: Setting.plugin_redmine_gtt['editable_geometry_types_on_issue_map'], - GeoJsonUpload: (Setting.plugin_redmine_gtt['enable_geojson_upload_on_issue_map'] == 'true'), - }, - geocoderSetting: { - enableGeocodingOnMap: (Setting.plugin_redmine_gtt['enable_geocoding_on_map'] == 'true'), - geocoderOptions: Setting.plugin_redmine_gtt['default_geocoder_options'] - }, - }, - gttLayer: gtt_tile_source, - } - return mapConfig - end + IssueStatus.all.sort.each {|status| + default_status_color.append({ + statusID: status.id, + statusName: status.name, + color: Setting.plugin_redmine_gtt['status_'+status.id.to_s] + }) + } + + GttMapLayer.where(global: true).sort.each {|mapLayer| + gtt_map_layer.append( + mapLayer.as_json.except("created_at", "updated_at","position","global") + ) + } + + mapConfig = { + gttDefaultSetting: { + defaultTrackerIcon: default_tracker_icon, + defaultStatusColor: default_status_color, + defaultMapSetting: { + centerLng: Setting.plugin_redmine_gtt['default_map_center_longitude'], + centerLat: Setting.plugin_redmine_gtt['default_map_center_latitude'] + }, + geometrySetting: { + geometryTypes: Setting.plugin_redmine_gtt['editable_geometry_types_on_issue_map'], + GeoJsonUpload: (Setting.plugin_redmine_gtt['enable_geojson_upload_on_issue_map'] == 'true'), + }, + geocoderSetting: { + enableGeocodingOnMap: (Setting.plugin_redmine_gtt['enable_geocoding_on_map'] == 'true'), + geocoderOptions: Setting.plugin_redmine_gtt['default_geocoder_options'] + }, + }, + gttLayer: gtt_map_layer, + } + return mapConfig + end - private + private - def find_optional_project_and_authorize - if params[:project_id] - @project = Project.find params[:project_id] - authorize - else - authorize_global - end + def find_optional_project_and_authorize + if params[:project_id] + @project = Project.find(params[:project_id]) + authorize + else + authorize_global end + end end diff --git a/app/controllers/gtt_controller.rb b/app/controllers/gtt_controller.rb new file mode 100644 index 00000000..f17bfb9b --- /dev/null +++ b/app/controllers/gtt_controller.rb @@ -0,0 +1,6 @@ +class GttController < ApplicationController + def map + path = Rails.root.join('public', 'plugin_assets', 'redmine_gtt', 'javascripts', 'main.js.map') + send_file path, type: 'application/json', disposition: 'inline' + end +end diff --git a/app/controllers/gtt_map_layers_controller.rb b/app/controllers/gtt_map_layers_controller.rb new file mode 100644 index 00000000..8066265e --- /dev/null +++ b/app/controllers/gtt_map_layers_controller.rb @@ -0,0 +1,71 @@ +class GttMapLayersController < ApplicationController + layout 'admin' + + before_action :require_admin + + self.main_menu = false + + def index + @map_layers = GttMapLayer.sorted + end + + def new + @map_layer = GttMapLayer.new + end + + def create + r = RedmineGtt::Actions::CreateMapLayer.(map_layer_params) + if r.map_layer_created? + redirect_to(params[:continue] ? new_gtt_map_layer_path : gtt_map_layers_path) + else + @map_layer = r.map_layer + render 'new' + end + end + + def edit + @map_layer = GttMapLayer.find(params[:id]) + end + + def update + ml = GttMapLayer.find(params[:id]) + r = RedmineGtt::Actions::UpdateMapLayer.(ml, map_layer_params) + if r.map_layer_updated? + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to gtt_map_layers_path + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { + @map_layer = r.map_layer + render 'edit' + } + format.js { head 422 } + end + end + end + + def destroy + ml = GttMapLayer.find(params[:id]) + ml.destroy + redirect_to gtt_map_layers_path + end + + private + + def map_layer_params + return {} unless params[:map_layer] + + params[:map_layer].permit( + :name, :default, :global, :baselayer, :position, + :layer, :layer_options_string, + :source, :source_options_string, + :format, :format_options_string, + :styles + ) + end + end diff --git a/app/controllers/gtt_tile_sources_controller.rb b/app/controllers/gtt_tile_sources_controller.rb deleted file mode 100644 index e75539ce..00000000 --- a/app/controllers/gtt_tile_sources_controller.rb +++ /dev/null @@ -1,67 +0,0 @@ -class GttTileSourcesController < ApplicationController - layout 'admin' - - before_action :require_admin - - self.main_menu = false - - def index - @tile_sources = GttTileSource.sorted - end - - def new - @tile_source = GttTileSource.new - end - - def create - r = RedmineGtt::Actions::CreateTileSource.(tile_source_params) - if r.tile_source_created? - redirect_to(params[:continue] ? new_gtt_tile_source_path : gtt_tile_sources_path) - else - @tile_source = r.tile_source - render 'new' - end - end - - def edit - @tile_source = GttTileSource.find params[:id] - end - - def update - ts = GttTileSource.find params[:id] - r = RedmineGtt::Actions::UpdateTileSource.(ts, tile_source_params) - if r.tile_source_updated? - respond_to do |format| - format.html { - flash[:notice] = l(:notice_successful_update) - redirect_to gtt_tile_sources_path - } - format.js { head 200 } - end - else - respond_to do |format| - format.html { - @tile_source = r.tile_source - render 'edit' - } - format.js { head 422 } - end - end - end - - def destroy - ts = GttTileSource.find params[:id] - ts.destroy - redirect_to gtt_tile_sources_path - end - - - private - - def tile_source_params - return {} unless params[:tile_source] - - params[:tile_source].permit( :name, :type, :baselayer, :global, :position, - :default, :options_string ) - end -end diff --git a/app/helpers/gtt_map_layers_helper.rb b/app/helpers/gtt_map_layers_helper.rb new file mode 100644 index 00000000..13d87718 --- /dev/null +++ b/app/helpers/gtt_map_layers_helper.rb @@ -0,0 +1,13 @@ +module GttMapLayersHelper + def pretty_map_layer_layer_options(map_layer) + JSON.pretty_generate map_layer.layer_options if Hash === map_layer.layer_options + end + + def map_layer_layer_options(map_layer) + safe_join map_layer.layer_options.to_a.select{ + |k,v| v.present? + }.map{|k,v| + "#{k}: #{v}" + }, "
".html_safe + end +end diff --git a/app/helpers/gtt_tile_sources_helper.rb b/app/helpers/gtt_tile_sources_helper.rb deleted file mode 100644 index adfbdd65..00000000 --- a/app/helpers/gtt_tile_sources_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -module GttTileSourcesHelper - def pretty_tile_source_options(tile_source) - JSON.pretty_generate tile_source.options if Hash === tile_source.options - end - - def tile_source_options(tile_source) - safe_join tile_source.options.to_a.select{ - |k,v| v.present? - }.map{|k,v| - "#{k}: #{v}" - }, "
".html_safe - end -end diff --git a/app/models/gtt_configuration.rb b/app/models/gtt_configuration.rb index bdfca763..f369748e 100644 --- a/app/models/gtt_configuration.rb +++ b/app/models/gtt_configuration.rb @@ -1,25 +1,25 @@ class GttConfiguration include ActiveModel::Model - attr_accessor :project, :geojson, :gtt_tile_source_ids, :map_rotation + attr_accessor :project, :geojson, :gtt_map_layer_ids, :map_rotation def self.for(project) new( project: project, geojson: project.geojson, map_rotation: project.map_rotation, - gtt_tile_source_ids: project.gtt_tile_source_ids + gtt_map_layer_ids: project.gtt_map_layer_ids ) end def self.from_params(params) new geojson: params[:geojson], map_rotation: params[:map_rotation], - gtt_tile_source_ids: params[:gtt_tile_source_ids] + gtt_map_layer_ids: params[:gtt_map_layer_ids] end def map - GttMap.new json: geojson, layers: project.gtt_tile_sources.sorted, rotation: project.map_rotation + GttMap.new json: geojson, layers: project.gtt_map_layers.sorted, rotation: project.map_rotation end end diff --git a/app/models/gtt_map_layer.rb b/app/models/gtt_map_layer.rb new file mode 100644 index 00000000..fad7056e --- /dev/null +++ b/app/models/gtt_map_layer.rb @@ -0,0 +1,59 @@ +# Map layer model +# +# Configuration is stored as json +class GttMapLayer < ActiveRecord::Base + self.inheritance_column = 'none' + + validates :name, presence: true + validates :layer, presence: true + + validate :take_json_layer_options + validate :take_json_source_options + validate :take_json_format_options + + acts_as_positioned + scope :sorted, ->{ order :position } + + # globally available map layers + scope :global, ->{ where global: true } + + # default map layers for new projects + scope :default, ->{ where default: true } + + attr_writer :layer_options_string + def layer_options_string + @layer_options_string ||= JSON.pretty_generate(layer_options || {}) + end + + attr_writer :source_options_string + def source_options_string + @source_options_string ||= JSON.pretty_generate(source_options || {}) + end + + attr_writer :format_options_string + def format_options_string + @format_options_string ||= JSON.pretty_generate(format_options || {}) + end + + private + + def take_json_layer_options + self.layer_options = JSON.parse(layer_options_string) + rescue JSON::ParserError + errors.add :layer_options_string, I18n.t(:error_invalid_json) + end + + def take_json_source_options + self.source_options = JSON.parse(source_options_string) + rescue JSON::ParserError + errors.add :source_options_string, I18n.t(:error_invalid_json) + end + + def take_json_format_options + self.format_options = JSON.parse(format_options_string) + rescue JSON::ParserError + errors.add :format_options_string, I18n.t(:error_invalid_json) + end + +end + diff --git a/app/models/gtt_tile_source.rb b/app/models/gtt_tile_source.rb deleted file mode 100644 index cf133422..00000000 --- a/app/models/gtt_tile_source.rb +++ /dev/null @@ -1,34 +0,0 @@ -# Tile source model -# -# Configuration is stored as json -class GttTileSource < ActiveRecord::Base - self.inheritance_column = 'none' - - validates :name, presence: true - validates :type, presence: true - validate :take_json_options - - acts_as_positioned - scope :sorted, ->{ order :position } - - # globally available tile sources - scope :global, ->{ where global: true } - - # default tile sources for new projects - scope :default, ->{ where default: true } - - attr_writer :options_string - def options_string - @options_string ||= JSON.pretty_generate(options || {}) - end - - private - - def take_json_options - self.options = JSON.parse options_string - rescue JSON::ParserError - errors.add :options_string, I18n.t(:error_invalid_json) - end - -end - diff --git a/app/overrides/issues.rb b/app/overrides/issues.rb index ed7595a0..83475e82 100644 --- a/app/overrides/issues.rb +++ b/app/overrides/issues.rb @@ -19,7 +19,7 @@ module Issues :virtual_path => "issues/show", :name => "deface_view_issues_show_map", :insert_before => "div.attributes", - :original => '2042e7171bb2eaa98259e9ccbff8209910565e7a', + :original => 'c56981aa84b0fee66ff43ea773cf1444193a2862', :partial => "issues/show/map" ) diff --git a/app/overrides/projects.rb b/app/overrides/projects.rb index 5c3a6c67..2ec8baa1 100644 --- a/app/overrides/projects.rb +++ b/app/overrides/projects.rb @@ -11,7 +11,7 @@ module Projects :virtual_path => "projects/show", :name => "deface_view_projects_show_other_formats", :insert_bottom => "div.splitcontentright", - :original => '868cdb34ed1c52af47076776295dcba1311914f9', + :original => '1d2f0cb0b1439dddc34ac9c50b6b1b111fe702ce', :partial => "projects/show/other_formats" ) end diff --git a/app/overrides/users.rb b/app/overrides/users.rb index de3b5836..824cd4c1 100644 --- a/app/overrides/users.rb +++ b/app/overrides/users.rb @@ -3,6 +3,7 @@ module Users :virtual_path => "users/show", :name => "deface_view_users_show_other_formats", :insert_bottom => "div.splitcontentleft", + :original => 'abe916df0691ebe8848cfc0dde536abd3bfe39b8', :partial => "users/show/other_formats" ) end diff --git a/app/views/gtt_map_layers/_form.html.erb b/app/views/gtt_map_layers/_form.html.erb new file mode 100644 index 00000000..d1282b41 --- /dev/null +++ b/app/views/gtt_map_layers/_form.html.erb @@ -0,0 +1,215 @@ +<%= error_messages_for 'map_layer' %> + +
+

+ <%= f.text_field :name, required: true, size: 25 %> + <%= t('map_layer.load_example') %> +

+

<%= f.check_box :baselayer %>

+

<%= f.check_box :global %>

+

<%= f.check_box :default %>

+

+ <%= f.select :layer, + options_for_select( + ['Image','Tile','MapboxVector','Vector','VectorTile'], + selected: f.object.layer ), + { include_blank: t('map_layer.layer_options_select'), required: true } + %> +

+

+ <%= f.text_area :layer_options_string, rows: 4, cols: 80 %> +

+

+ <%= f.select :source, + options_for_select( + ['BingMaps','CartoDB','ImageStatic','ImageWMS','OSM','Raster','Stamen', + 'TileJSON','TileWMS','UTFGrid','Vector','VectorTile','WMTS','XYZ'], + selected: f.object.source ), + { include_blank: t('map_layer.source_options_select') } + %> +

+

+ <%= f.text_area :source_options_string, rows: 8, cols: 80 %> +

+

+ <%= f.select :format, + options_for_select( + ['GeoJSON','GPX','KML','MVT','TopoJSON','WFS','WKB','WKT'], + selected: f.object.format ), + { include_blank: t('map_layer.format_options_select') } + %> +

+

+ <%= f.text_area :format_options_string, rows: 4, cols: 80 %> +

+ +
+ + diff --git a/app/views/gtt_map_layers/_map_layer.html.erb b/app/views/gtt_map_layers/_map_layer.html.erb new file mode 100644 index 00000000..3b63d438 --- /dev/null +++ b/app/views/gtt_map_layers/_map_layer.html.erb @@ -0,0 +1,13 @@ +"> + <%= link_to map_layer.name, edit_gtt_map_layer_path(map_layer) %> + <%= map_layer.layer %> + <%= map_layer.source %> + <%= checked_image map_layer.baselayer? %> + <%= checked_image map_layer.global? %> + <%= checked_image map_layer.default? %> + + <%= reorder_handle(map_layer, url: gtt_map_layer_path(map_layer), param: 'map_layer') %> + <%= delete_link gtt_map_layer_path(map_layer) %> + + + diff --git a/app/views/gtt_map_layers/edit.html.erb b/app/views/gtt_map_layers/edit.html.erb new file mode 100644 index 00000000..0a9c9a6a --- /dev/null +++ b/app/views/gtt_map_layers/edit.html.erb @@ -0,0 +1,10 @@ +<%= title [t('map_layer.plural'), gtt_map_layers_path], @map_layer.name %> + +<%= labelled_form_for :map_layer, @map_layer, url: gtt_map_layer_path(@map_layer), method: :patch do |f| %> + <%= render partial: 'form', locals: { f: f } %> +

+ <%= submit_tag l :button_save %> +

+<% end %> + + diff --git a/app/views/gtt_map_layers/index.html.erb b/app/views/gtt_map_layers/index.html.erb new file mode 100644 index 00000000..b839220f --- /dev/null +++ b/app/views/gtt_map_layers/index.html.erb @@ -0,0 +1,31 @@ +
+<%= link_to t('map_layer.new'), new_gtt_map_layer_path, :class => 'icon icon-add' %> +
+ +<%= title t('map_layer.plural') %> + +<% if @map_layers.any? %> + + + + + + + + + + + + + + <%= render collection: @map_layers, partial: 'map_layer' %> + +
<%= l :label_name %><%= l :label_layer %><%= l :label_source %><%= l :label_baselayer %><%= l :label_global %><%= l :label_default %>
+ +<% else %> +

<%= l :label_no_data %>

+<% end %> + +<%= javascript_tag do %> + $(function() { $("table.map_layers tbody").positionedItems(); }); +<% end %> diff --git a/app/views/gtt_map_layers/new.html.erb b/app/views/gtt_map_layers/new.html.erb new file mode 100644 index 00000000..d0162b7d --- /dev/null +++ b/app/views/gtt_map_layers/new.html.erb @@ -0,0 +1,10 @@ +<%= title [t('map_layer.plural'), gtt_map_layers_path], t('map_layer.new') %> + +<%= labelled_form_for :map_layer, @map_layer, url: gtt_map_layers_path do |f| %> + <%= render partial: 'form', locals: { f: f } %> +

+ <%= submit_tag t(:button_create) %> + <%= submit_tag t(:button_create_and_continue), name: 'continue' %> +

+<% end %> + diff --git a/app/views/gtt_map_layers/new.js.erb b/app/views/gtt_map_layers/new.js.erb new file mode 100644 index 00000000..5a611017 --- /dev/null +++ b/app/views/gtt_map_layers/new.js.erb @@ -0,0 +1 @@ +$('#content').html('<%= j render template: 'gtt_map_layers/new', formats: [:html] %>'); diff --git a/app/views/gtt_tile_sources/_form.html.erb b/app/views/gtt_tile_sources/_form.html.erb deleted file mode 100644 index 2e2c72e1..00000000 --- a/app/views/gtt_tile_sources/_form.html.erb +++ /dev/null @@ -1,62 +0,0 @@ -<%= error_messages_for 'tile_source' %> - -
-

<%= f.text_field :name, required: true, size: 25 %>

-

- <%= f.select :type, - options_for_select([ - [l(:gtt_tile_sources_select_imagewms), 'ol.source.ImageWMS'], - [l(:gtt_tile_sources_select_osm), 'ol.source.OSM'], - [l(:gtt_tile_sources_select_tilewms), 'ol.source.TileWMS'], - [l(:gtt_tile_sources_select_xyz), 'ol.source.XYZ'] - ], selected: f.object.type ), - { include_blank: l(:gtt_tile_sources_select), required: true } - %> -

-

<%= f.check_box :baselayer %>

-

<%= f.check_box :global %>

-

<%= f.check_box :default %>

-

- <%= f.text_area :options_string, rows: 10, cols: 80 %> - <%= l(:gtt_tile_sources_load_example) %> -

-
- - diff --git a/app/views/gtt_tile_sources/_tile_source.html.erb b/app/views/gtt_tile_sources/_tile_source.html.erb deleted file mode 100644 index 2c2fc0f3..00000000 --- a/app/views/gtt_tile_sources/_tile_source.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -"> - <%= tile_source.type %> - <%= link_to tile_source.name, edit_gtt_tile_source_path(tile_source) %> - <%= checked_image tile_source.baselayer? %> - <%= checked_image tile_source.global? %> - <%= checked_image tile_source.default? %> - <%= tile_source_options tile_source %> - - <%= reorder_handle(tile_source, url: gtt_tile_source_path(tile_source), param: 'tile_source') %> - <%= delete_link gtt_tile_source_path(tile_source) %> - - - diff --git a/app/views/gtt_tile_sources/edit.html.erb b/app/views/gtt_tile_sources/edit.html.erb deleted file mode 100644 index 424251b4..00000000 --- a/app/views/gtt_tile_sources/edit.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<%= title [l(:label_gtt_tile_source_plural), gtt_tile_sources_path], @tile_source.name %> - -<%= labelled_form_for :tile_source, @tile_source, url: gtt_tile_source_path(@tile_source), method: :patch do |f| %> - <%= render partial: 'form', locals: { f: f } %> -

- <%= submit_tag l :button_save %> -

-<% end %> - - diff --git a/app/views/gtt_tile_sources/index.html.erb b/app/views/gtt_tile_sources/index.html.erb deleted file mode 100644 index 7427e3c2..00000000 --- a/app/views/gtt_tile_sources/index.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -
-<%= link_to l(:label_gtt_tile_source_new), new_gtt_tile_source_path, :class => 'icon icon-add' %> -
- -<%= title l :label_gtt_tile_source_plural %> - -<% if @tile_sources.any? %> - - - - - - - - - - - - - - <%= render collection: @tile_sources, partial: 'tile_source' %> - -
<%= l :label_type %><%= l :label_name %><%= l :label_baselayer %><%= l :label_global %><%= l :label_default %><%= l :label_config %>
- -<% else %> -

<%= l :label_no_data %>

-<% end %> - -<%= javascript_tag do %> - $(function() { $("table.tile_sources tbody").positionedItems(); }); -<% end %> diff --git a/app/views/gtt_tile_sources/new.html.erb b/app/views/gtt_tile_sources/new.html.erb deleted file mode 100644 index 25417995..00000000 --- a/app/views/gtt_tile_sources/new.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<%= title [l(:label_gtt_tile_source_plural), gtt_tile_sources_path], l(:label_gtt_tile_source_new) %> - -<%= labelled_form_for :tile_source, @tile_source, url: gtt_tile_sources_path do |f| %> - <%= render partial: 'form', locals: { f: f } %> -

- <%= submit_tag l :button_create %> - <%= submit_tag l(:button_create_and_continue), name: 'continue' %> -

-<% end %> - diff --git a/app/views/gtt_tile_sources/new.js.erb b/app/views/gtt_tile_sources/new.js.erb deleted file mode 100644 index 38046d35..00000000 --- a/app/views/gtt_tile_sources/new.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#content').html('<%= j render template: 'gtt_tile_sources/new', formats: [:html] %>'); - diff --git a/app/views/issues/index.api.rsb b/app/views/issues/index.api.rsb index f44e805b..83fd0c4e 100644 --- a/app/views/issues/index.api.rsb +++ b/app/views/issues/index.api.rsb @@ -4,7 +4,7 @@ api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :l api.id issue.id api.project(:id => issue.project_id, :name => issue.project.name) unless issue.project.nil? api.tracker(:id => issue.tracker_id, :name => issue.tracker.name) unless issue.tracker.nil? - api.status(:id => issue.status_id, :name => issue.status.name) unless issue.status.nil? + api.status(:id => issue.status_id, :name => issue.status.name, :is_closed => issue.status.is_closed) unless issue.status.nil? api.priority(:id => issue.priority_id, :name => issue.priority.name) unless issue.priority.nil? api.author(:id => issue.author_id, :name => issue.author.name) unless issue.author.nil? api.assigned_to(:id => issue.assigned_to_id, :name => issue.assigned_to.name) unless issue.assigned_to.nil? @@ -19,6 +19,11 @@ api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :l api.done_ratio issue.done_ratio api.is_private issue.is_private api.estimated_hours issue.estimated_hours + api.total_estimated_hours issue.total_estimated_hours + if User.current.allowed_to?(:view_time_entries, issue.project) + api.spent_hours(issue.spent_hours) + api.total_spent_hours(issue.total_spent_hours) + end if issue.geom api.geojson (params[:format] == "json") ? issue.geojson : issue.geojson.to_json diff --git a/app/views/issues/index/_map.html.erb b/app/views/issues/index/_map.html.erb index 70b667fc..80c5f35c 100644 --- a/app/views/issues/index/_map.html.erb +++ b/app/views/issues/index/_map.html.erb @@ -1,7 +1,7 @@ <% if @project and @project.module_enabled?(:gtt) %> <% collapsed = Setting.plugin_redmine_gtt['default_collapsed_issues_page_map'] == 'true' %>
"> - "><%= l(:field_location) %> + "><%= l(:field_location) %> <%= map_tag map: @project.map, geom: (Issue.array_to_geojson(@issues, include_properties: { only: %i(id subject tracker_id status_id) }) if @issues), popup: { href: '/issues/[id]' }, collapsed: collapsed, rotation: @project.map_rotation %> diff --git a/app/views/issues/show.api.rsb b/app/views/issues/show.api.rsb index da68ee6c..c0da42fb 100644 --- a/app/views/issues/show.api.rsb +++ b/app/views/issues/show.api.rsb @@ -2,7 +2,7 @@ api.issue do api.id @issue.id api.project(:id => @issue.project_id, :name => @issue.project.name) unless @issue.project.nil? api.tracker(:id => @issue.tracker_id, :name => @issue.tracker.name) unless @issue.tracker.nil? - api.status(:id => @issue.status_id, :name => @issue.status.name) unless @issue.status.nil? + api.status(:id => @issue.status_id, :name => @issue.status.name, :is_closed => @issue.status.is_closed) unless @issue.status.nil? api.priority(:id => @issue.priority_id, :name => @issue.priority.name) unless @issue.priority.nil? api.author(:id => @issue.author_id, :name => @issue.author.name) unless @issue.author.nil? api.assigned_to(:id => @issue.assigned_to_id, :name => @issue.assigned_to.name) unless @issue.assigned_to.nil? @@ -36,6 +36,7 @@ api.issue do api.closed_on @issue.closed_on render_api_issue_children(@issue, api) if include_in_api_response?('children') + api.array :attachments do @issue.attachments.each do |attachment| render_api_attachment(attachment, api) @@ -82,4 +83,10 @@ api.issue do api.user :id => user.id, :name => user.name end end if include_in_api_response?('watchers') && User.current.allowed_to?(:view_issue_watchers, @issue.project) + + api.array :allowed_statuses do + @allowed_statuses.each do |status| + api.status :id => status.id, :name => status.name, :is_closed => status.is_closed + end + end if include_in_api_response?('allowed_statuses') end diff --git a/app/views/projects/index.api.rsb b/app/views/projects/index.api.rsb index a57ac6e6..9d517f5a 100644 --- a/app/views/projects/index.api.rsb +++ b/app/views/projects/index.api.rsb @@ -8,6 +8,7 @@ api.array :projects, api_meta(:total_count => @project_count, :offset => @offset api.parent(:id => project.parent.id, :name => project.parent.name) if project.parent && project.parent.visible? api.status project.status api.is_public project.is_public? + api.inherit_members project.inherit_members? api.rotation project.map_rotation if @include_geometry diff --git a/app/views/projects/settings/_gtt.html.erb b/app/views/projects/settings/_gtt.html.erb index 19529095..ed705218 100644 --- a/app/views/projects/settings/_gtt.html.erb +++ b/app/views/projects/settings/_gtt.html.erb @@ -7,10 +7,10 @@

- <%= f.select :gtt_tile_source_ids, - options_from_collection_for_select(GttTileSource.sorted, :id, :name, selected: @form.gtt_tile_source_ids), - {}, { multiple: true, size: 5 } %> -
<%= t :gtt_tile_sources_info %> + <%= f.select :gtt_map_layer_ids, + options_from_collection_for_select(GttMapLayer.sorted, :id, :name, selected: @form.gtt_map_layer_ids), + { :label => t('map_layer.ids') }, { multiple: true, size: 5 } %> +
<%= t('map_layer.project.info') %>

<%= content_tag(:label, l(:gtt_map_rotate_label)) %> diff --git a/app/views/projects/show.api.rsb b/app/views/projects/show.api.rsb index 89a6e1ad..332e7e33 100644 --- a/app/views/projects/show.api.rsb +++ b/app/views/projects/show.api.rsb @@ -7,13 +7,16 @@ api.project do api.parent(:id => @project.parent.id, :name => @project.parent.name) if @project.parent && @project.parent.visible? api.status @project.status api.is_public @project.is_public? - api.rotation @project.map_rotation + api.inherit_members @project.inherit_members? + api.default_version(:id => @project.default_version.id, :name => @project.default_version.name) if @project.default_version + api.default_assignee(:id => @project.project.default_assigned_to.id, :name => @project.project.default_assigned_to.name) if @project.default_assigned_to if @project.geom api.geojson (params[:format] == "json") ? @project.geojson : @project.geojson.to_json else api.geojson nil end + api.rotation @project.map_rotation render_api_custom_values @project.visible_custom_field_values, api render_api_includes(@project, api) diff --git a/app/views/redmine_gtt/hooks/_user_map.html.erb b/app/views/redmine_gtt/hooks/_user_map.html.erb index 00ad4f00..30060015 100644 --- a/app/views/redmine_gtt/hooks/_user_map.html.erb +++ b/app/views/redmine_gtt/hooks/_user_map.html.erb @@ -2,4 +2,3 @@

<%= l(:label_user_map) %> <%= map_form_field form, user.map, bounds: nil, edit_mode: 'Point' %> - diff --git a/app/views/redmine_gtt/hooks/_view_account_left_bottom.html.erb b/app/views/redmine_gtt/hooks/_view_account_left_bottom.html.erb index ef104777..55ab31df 100644 --- a/app/views/redmine_gtt/hooks/_view_account_left_bottom.html.erb +++ b/app/views/redmine_gtt/hooks/_view_account_left_bottom.html.erb @@ -1,5 +1,4 @@ <% if @user.geom %>

<%= l(:label_user_map) %>

- <%= map_tag map: @user.map %> + <%= map_tag map: @user.map, bounds: nil %> <% end %> - diff --git a/app/views/redmine_gtt/hooks/_view_my_account.html.erb b/app/views/redmine_gtt/hooks/_view_my_account.html.erb index 62d239e2..c928462e 100644 --- a/app/views/redmine_gtt/hooks/_view_my_account.html.erb +++ b/app/views/redmine_gtt/hooks/_view_my_account.html.erb @@ -1,2 +1 @@ <%= render partial: 'redmine_gtt/hooks/user_map', locals: { user: user, form: form } %> - diff --git a/app/views/redmine_gtt/hooks/_view_users_form.html.erb b/app/views/redmine_gtt/hooks/_view_users_form.html.erb index 62d239e2..c928462e 100644 --- a/app/views/redmine_gtt/hooks/_view_users_form.html.erb +++ b/app/views/redmine_gtt/hooks/_view_users_form.html.erb @@ -1,2 +1 @@ <%= render partial: 'redmine_gtt/hooks/user_map', locals: { user: user, form: form } %> - diff --git a/app/views/settings/gtt/_general.html.erb b/app/views/settings/gtt/_general.html.erb index e6ebf742..e1f015c7 100644 --- a/app/views/settings/gtt/_general.html.erb +++ b/app/views/settings/gtt/_general.html.erb @@ -1,17 +1,15 @@ -

<%= content_tag(:label, l(:gtt_settings_general_center_lon)) %> <%= text_field_tag('settings[default_map_center_longitude]', @settings['default_map_center_longitude'], - #:readonly => true, :size => 10) %>

@@ -19,7 +17,6 @@ <%= content_tag(:label, l(:gtt_settings_general_center_lat)) %> <%= text_field_tag('settings[default_map_center_latitude]', @settings['default_map_center_latitude'], - #:readonly => true, :size => 10) %>

@@ -27,6 +24,41 @@ <%= content_tag(:label, l(:gtt_settings_general_zoom_level)) %> <%= text_field_tag('settings[default_map_zoom_level]', @settings['default_map_zoom_level'], - #:readonly => true, :size => 10) %>

+ +

+ <%= content_tag(:label, l(:gtt_settings_general_maxzoom_level)) %> + <%= text_field_tag('settings[default_map_maxzoom_level]', + @settings['default_map_maxzoom_level'], + :size => 10) %> +

+ +

+ <%= content_tag(:label, l(:gtt_settings_general_fit_maxzoom_level)) %> + <%= text_field_tag('settings[default_map_fit_maxzoom_level]', + @settings['default_map_fit_maxzoom_level'], + :size => 10) %> +

+
+ +
+

<%= l(:select_edit_geometry_settings) %>

+ +

+ <%= content_tag(:label, l(:label_editable_geometry_types_on_issue_map)) %> + + <% ["Point", "LineString", "Polygon"].each do |g| %> + + <% end %> +

+ +

+ <%= content_tag(:label, l(:label_enable_geojson_upload_on_issue_map)) %> + <%= check_box_tag 'settings[enable_geojson_upload_on_issue_map]', true, @settings[:enable_geojson_upload_on_issue_map] %> +

+
diff --git a/app/views/settings/gtt/_geocoder.html.erb b/app/views/settings/gtt/_geocoder.html.erb new file mode 100644 index 00000000..c0c6c6db --- /dev/null +++ b/app/views/settings/gtt/_geocoder.html.erb @@ -0,0 +1,17 @@ +
+

<%= l(:select_default_geocoder_settings) %>

+ +

+ <%= content_tag(:label, l(:label_enable_geocoding_on_map)) %> + <%= check_box_tag 'settings[enable_geocoding_on_map]', true, @settings[:enable_geocoding_on_map] %> +

+ +

+ <%= content_tag(:label, l(:geocoder_options)) %> + <%= text_area_tag('settings[default_geocoder_options]', + @settings['default_geocoder_options'], + :escape => false, + :rows => 10, + :cols => 100) %> +

+
diff --git a/app/views/settings/gtt/_main.html.erb b/app/views/settings/gtt/_main.html.erb deleted file mode 100644 index 6df63ce1..00000000 --- a/app/views/settings/gtt/_main.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= render_tabs RedmineGtt::SETTINGS %> - -<% html_title(l(:label_settings), l(:label_gtt)) -%> diff --git a/app/views/settings/gtt/_map.html.erb b/app/views/settings/gtt/_map.html.erb deleted file mode 100644 index 55fe9080..00000000 --- a/app/views/settings/gtt/_map.html.erb +++ /dev/null @@ -1,58 +0,0 @@ -
-<%= link_to l(:label_gtt_basemap_new), new_gtt_basemap_path, :class => 'icon icon-add' %> -
- -

<%=l(:label_gtt_basemap_plural)%>

- - - - - - - - -<% for basemap in GttBasemap.all %> - "> - - - - -<% end %> - -
<%=l(:label_gtt_basemap)%><%=l(:label_gtt_basemap_url)%>
<%= basemap.name %><%= basemap.url %> - <%= delete_link gtt_basemap_path(status) %> -
- - - -

- <%= content_tag(:label, l(:gtt_settings_map_url)) %> - <%= text_field_tag('settings[default_map_url]', - @settings['default_map_url'], - :size => 80) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_map_apikey)) %> - <%= text_field_tag('settings[default_map_apikey]', - @settings['default_map_apikey'], - :size => 80) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_map_maxzoom_level)) %> - <%= text_field_tag('settings[default_map_maxzoom_level]', - @settings['default_map_maxzoom_level'], - :size => 5) %> -

diff --git a/app/views/settings/gtt/_settings.html.erb b/app/views/settings/gtt/_settings.html.erb index 28707e71..8f24cee3 100644 --- a/app/views/settings/gtt/_settings.html.erb +++ b/app/views/settings/gtt/_settings.html.erb @@ -1,106 +1,11 @@ -

<%= l(:select_default_tracker_icon) %>

+<% plugin_tabs = [ + { :name => :general, :partial => 'settings/gtt/general', :label => :gtt_settings_label_general }, + { :name => :styling, :partial => 'settings/gtt/styling', :label => :gtt_settings_label_styling }, + { :name => :geocoder, :partial => 'settings/gtt/geocoder', :label => :gtt_settings_label_geocoder } +] %> -<% Tracker.sorted.each do |t| %> -

- <%= content_tag :label, t.name %> - <%= select_tag "settings[tracker_#{t.id}]", "".html_safe %> - -

-<% end %> - -
-

<%= l(:select_default_status_color) %>

- -<% IssueStatus.sorted.each do |t| %> -

- <%= content_tag :label, t.name %> - <%= color_field_tag "settings[status_#{t.id}]", @settings["status_#{t.id}"] %> -

-<% end %> -
- -
-

<%= l(:select_default_map_settings) %>

- -

- <%= content_tag(:label, l(:label_default_collapsed_issues_page_map)) %> - <%= check_box_tag 'settings[default_collapsed_issues_page_map]', true, @settings[:default_collapsed_issues_page_map] %> -

- -

- <%= content_tag(:label, l(:gtt_settings_general_center_lon)) %> - <%= text_field_tag('settings[default_map_center_longitude]', - @settings['default_map_center_longitude'], - :size => 10) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_general_center_lat)) %> - <%= text_field_tag('settings[default_map_center_latitude]', - @settings['default_map_center_latitude'], - :size => 10) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_general_zoom_level)) %> - <%= text_field_tag('settings[default_map_zoom_level]', - @settings['default_map_zoom_level'], - :size => 10) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_general_maxzoom_level)) %> - <%= text_field_tag('settings[default_map_maxzoom_level]', - @settings['default_map_maxzoom_level'], - :size => 10) %> -

- -

- <%= content_tag(:label, l(:gtt_settings_general_fit_maxzoom_level)) %> - <%= text_field_tag('settings[default_map_fit_maxzoom_level]', - @settings['default_map_fit_maxzoom_level'], - :size => 10) %> -

-
- -
-

<%= l(:select_edit_geometry_settings) %>

- -

- <%= content_tag(:label, l(:label_editable_geometry_types_on_issue_map)) %> - - <% ["Point", "LineString", "Polygon"].each do |g| %> - - <% end %> -

- -

- <%= content_tag(:label, l(:label_enable_geojson_upload_on_issue_map)) %> - <%= check_box_tag 'settings[enable_geojson_upload_on_issue_map]', true, @settings[:enable_geojson_upload_on_issue_map] %> -

-
- -
-

<%= l(:select_default_geocoder_settings) %>

- -

- <%= content_tag(:label, l(:label_enable_geocoding_on_map)) %> - <%= check_box_tag 'settings[enable_geocoding_on_map]', true, @settings[:enable_geocoding_on_map] %> -

-

- <%= content_tag(:label, l(:geocoder_options)) %> - <%= text_area_tag('settings[default_geocoder_options]', - @settings['default_geocoder_options'], - :escape => false, - :rows => 10, - :cols => 100) %> -

-
+<%= render_tabs plugin_tabs %> <%= javascript_tag do %> window.gtt_setting() diff --git a/app/views/settings/gtt/_styling.html.erb b/app/views/settings/gtt/_styling.html.erb new file mode 100644 index 00000000..4e7b70c1 --- /dev/null +++ b/app/views/settings/gtt/_styling.html.erb @@ -0,0 +1,31 @@ +
+

<%= l(:select_default_tracker_icon) %>

+ +<% Tracker.sorted.each do |t| %> +

+ <%= content_tag :label, t.name %> + <%= select_tag "settings[tracker_#{t.id}]", "".html_safe %> + +

+<% end %> +
+ +
+

<%= l(:select_default_status_color) %>

+ +<% IssueStatus.sorted.each do |t| %> +

+ <%= content_tag :label, t.name %> + <%= color_field_tag "settings[status_#{t.id}]", @settings["status_#{t.id}"] %> +

+<% end %> +
+ +
+

+ <%= content_tag(:label, l(:gtt_settings_vector_minzoom_level)) %> + <%= text_field_tag('settings[vector_minzoom_level]', + @settings['vector_minzoom_level'], + :size => 10 ) %> +

+
diff --git a/app/views/users/form/_map.html.erb b/app/views/users/form/_map.html.erb deleted file mode 100644 index 8f215d41..00000000 --- a/app/views/users/form/_map.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -<% if @project.nil? or @project.module_enabled?(:gtt) %> -
- <%= l(:label_user_map) %> - <%= f.hidden_field(:geom, :value => @user.geojson, :id => 'geom') %> - - <%= content_tag(:div, "", :data => { - :geom => @user.geojson, - :layers => GttTileSource.default, - :edit => 'Point' - }, :id => 'ol-' + rand(36**8).to_s(36), :class => 'ol-map') - %> -
-<% end %> diff --git a/app/views/users/index.api.rsb b/app/views/users/index.api.rsb index d6da6195..2145332e 100644 --- a/app/views/users/index.api.rsb +++ b/app/views/users/index.api.rsb @@ -3,11 +3,16 @@ api.array :users, api_meta(:total_count => @user_count, :offset => @offset, :lim api.user do api.id user.id api.login user.login + api.admin user.admin? api.firstname user.firstname api.lastname user.lastname api.mail user.mail api.created_on user.created_on - api.last_login_on user.last_login_on + api.updated_on user.updated_on + api.last_login_on user.last_login_on + api.passwd_changed_on user.passwd_changed_on + api.avatar_url gravatar_url(user.mail, {rating: nil, size: nil, default: Setting.gravatar_default}) if Setting.gravatar_enabled? + api.twofa_scheme user.twofa_scheme if user.geom api.geojson (params[:format] == "json") ? user.geojson : user.geojson.to_json diff --git a/app/views/users/show.api.rsb b/app/views/users/show.api.rsb index 7941549a..f4f0d564 100644 --- a/app/views/users/show.api.rsb +++ b/app/views/users/show.api.rsb @@ -1,11 +1,16 @@ api.user do api.id @user.id - api.login @user.login if User.current.admin? || (User.current == @user) + api.login @user.login + api.admin @user.admin? if User.current.admin? || (User.current == @user) api.firstname @user.firstname api.lastname @user.lastname api.mail @user.mail if User.current.admin? || !@user.pref.hide_mail api.created_on @user.created_on - api.last_login_on @user.last_login_on + api.updated_on @user.updated_on + api.last_login_on @user.last_login_on + api.passwd_changed_on @user.passwd_changed_on + api.avatar_url gravatar_url(@user.mail, {rating: nil, size: nil, default: Setting.gravatar_default}) if @user.mail && Setting.gravatar_enabled? + api.twofa_scheme @user.twofa_scheme if User.current.admin? || (User.current == @user) api.api_key @user.api_key if User.current.admin? || (User.current == @user) api.status @user.status if User.current.admin? diff --git a/lib/tasks/.keep b/assets/.keep similarity index 100% rename from lib/tasks/.keep rename to assets/.keep diff --git a/assets/images/line.svg b/assets/images/line.svg deleted file mode 100644 index 8f9312f6..00000000 --- a/assets/images/line.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/assets/images/point.svg b/assets/images/point.svg deleted file mode 100644 index 8ae70041..00000000 --- a/assets/images/point.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/assets/images/poly.svg b/assets/images/poly.svg deleted file mode 100644 index 500d8dad..00000000 --- a/assets/images/poly.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/assets/images/preview_gsi.png b/assets/images/preview_gsi.png deleted file mode 100644 index f9bd0c12..00000000 Binary files a/assets/images/preview_gsi.png and /dev/null differ diff --git a/assets/images/preview_osm.jpg b/assets/images/preview_osm.jpg deleted file mode 100644 index 872e4cf8..00000000 Binary files a/assets/images/preview_osm.jpg and /dev/null differ diff --git a/assets/stylesheets/gtt.css b/assets/stylesheets/gtt.css deleted file mode 100644 index bb3cf8a6..00000000 --- a/assets/stylesheets/gtt.css +++ /dev/null @@ -1,5 +0,0 @@ -/**************************************************************/ -/* ICONS -/**************************************************************/ - -#admin-menu a.gtt-tile-sources { background-image: url(../images/map.png);} diff --git a/config/locales/de.yml b/config/locales/de.yml index 1eafb144..dd74f6ce 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -2,23 +2,16 @@ de: error_unable_to_update_project_gtt_settings: Die GTT-Einstellungen des Projekts können nicht aktualisiert werden (%{value}) - field_gtt_tile_source_ids: Tile-Resourcen label_nearby: in der Nähe (lat,lng) - label_type: Typ label_config: Konfiguration label_gtt_settings_headline: GTT-Einstellungen label_gtt: GTT label_gtt_bbox_filter: Standort label_gtt_distance: Distanz label_gtt_select_icon: Icon auswählen - label_gtt_tile_source: Tile-Resource - label_gtt_tile_source_new: Neue Tile-Resource - label_gtt_tile_source_plural: Tile-Resourcen label_parameters: Parameter label_tab_geocoder: Geocoder geocoder_options: Geocoder Optionen - gtt_tile_sources_info: Wählen Sie die Tile Resourcen aus, die in diesem Projekt - verfügbar sein sollen. gtt_settings_general_maxzoom_level: Standardwert für die maximale Zoomstufe der Karte label_default_collapsed_issues_page_map: Standardmäßig ausgeblendete Karte für Tickets @@ -27,7 +20,6 @@ de: field_location: Standort field_geom: Geomtrie field_global: Allgemein verfügbar - field_options_string: Optionen label_geotask_map: GTT Karte label_global: Allgemein label_project_map: Projektkarte @@ -35,11 +27,11 @@ de: label_name: Name label_gtt_settings: GTT label_tab_general: Allgemein - label_tab_map: Tile Resources gtt_settings_general_center_lon: Standard-Längengrad des Kartenmittelpunkts gtt_settings_general_center_lat: Standard-Breitengrad des Kartenmittelpunkts gtt_settings_general_zoom_level: Standard-Zoomstufe der Karte gtt_settings_general_fit_maxzoom_level: Standardmäßig maximale Zoomstufe des Kartenausschnitts + gtt_settings_vector_minzoom_level: "Kleinste Zoomstufe" label_gtt_point: Punkt label_gtt_linestring: Linie label_gtt_polygon: Polygon @@ -56,13 +48,7 @@ de: project_module_gtt: GTT permission_manage_gtt_settings: Konfiguration der GTT-Einstellungen field_baselayer: Basislayer - gtt_tile_sources_select: -- Typ auswählen -- - gtt_tile_sources_select_osm: OpenStreetMap - gtt_tile_sources_select_tilewms: Tiled WMS - gtt_tile_sources_load_example: Beispielkonfiguration laden. label_baselayer: Basislayer - gtt_tile_sources_select_imagewms: Image WMS - gtt_tile_sources_select_xyz: XYZ Tiles title_geojson_upload: GeoJSON importieren placeholder_geojson_upload: Bitte fügen Sie hier eine GeoJSON-Geometrie ein, oder importieren Sie die GeoJSON-Daten aus einer Datei. @@ -82,3 +68,34 @@ de: modal: load: Laden cancel: Abbrechen + messages: + baselayer_missing: "There is no baselayer available!" + zoom_in_more: "Zoom in to view objects." + gtt_map_rotate_label: Kartenrotation + gtt_map_rotate_info_html: Hold down Shift+Alt and drag the map to rotate. + gtt_settings_label_general: "General" + gtt_settings_label_styling: "Styling" + gtt_settings_label_geocoder: "Geocoder" + label_layer: Layer-Typ + map_layer: + plural: Karten-Layer + project: + info: Wählen Sie die Karten-Layer aus, die in diesem Projekt verfügbar sein + sollen. + layer_options_select: -- Layer-Typ auswählen -- + source_options_select: -- Source-Typ auswählen -- + title: Karten-Layer + new: Neues Karten-Layer + ids: Karten-Layer + format_options_select: -- Format-Typ auswählen -- + load_example: 'Beispiele: ' + field_format_options_string: Formatoptionen + field_styles: Style-Einstellungen + label_source: Source-Typ + permission_view_gtt_settings: GTT-Einstellungen anzeigen + field_name: Name + field_layer: Layer-Typ + field_layer_options_string: Layer-Optionen + field_source: Source-Typ + field_source_options_string: Source-Optionen + field_format: Format-Typ diff --git a/config/locales/en.yml b/config/locales/en.yml index e20864ad..a20bdc3f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,17 +1,11 @@ # English strings go here for Rails i18n en: error_invalid_json: Must be valid JSON - error_unable_to_update_project_gtt_settings: "Unable to update project GTT settings\ - \ (%{value})" + error_unable_to_update_project_gtt_settings: "Unable to update project GTT settings (%{value})" - field_default: Default for new projects field_geometry: "Geometry" field_location: "Location" field_geom: "Geometry" - field_global: Globally available - field_baselayer: BaseLayer - field_options_string: Options - field_gtt_tile_source_ids: Tile Sources label_geotask_map: "Geotask Map" label_global: Global @@ -20,38 +14,22 @@ en: label_name: Name label_baselayer: BaseLayer label_nearby: "nearby(lat,lng)" - label_type: Type + label_layer: "Layer Type" + label_source: "Source Type" label_config: Configuration label_gtt_settings: GTT label_gtt_settings_headline: GTT Settings - # gtt_label_geometry: "API Key" - # gtt_text_settings_help: "Enter the API key. Leave empty if no key is required." - # gtt_text_settings_geometry_example: "2747491302261fbc47967ba62621af22" - label_gtt: "GTT" label_gtt_bbox_filter: Location label_gtt_distance: Distance label_gtt_select_icon: Select icon - label_gtt_tile_source: Tile Source - label_gtt_tile_source_new: New Tile Source - label_gtt_tile_source_plural: Tile Sources label_parameters: Parameters label_tab_general: "General" label_tab_geocoder: "Geocoder" - label_tab_map: "Tile Sources" geocoder_options: "Geocoder Options" - gtt_tile_sources_info: "Select the tile sources that should be available in this\ - \ project." - gtt_tile_sources_select: "-- Select type --" - gtt_tile_sources_select_imagewms: "Image WMS" - gtt_tile_sources_select_osm: "OpenStreetMap" - gtt_tile_sources_select_tilewms: "Tiled WMS" - gtt_tile_sources_select_xyz: "XYZ Tiles" - gtt_tile_sources_load_example: "Load example configuration." - gtt_map_rotate_label: "Map rotation" gtt_map_rotate_info_html: "Hold down Shift+Alt and drag the map to rotate." @@ -60,16 +38,11 @@ en: gtt_settings_general_zoom_level: "Default map zoom level" gtt_settings_general_maxzoom_level: "Default map maximum zoom level" gtt_settings_general_fit_maxzoom_level: "Default map fit maximum zoom level" + gtt_settings_vector_minzoom_level: "Minimum zoom level" - # gtt_settings_map_url: "API Service URL" - # gtt_settings_map_apikey: "API Key" - # gtt_settings_map_maxzoom_level: "Maximum map zoom level" - - # gtt_settings_geocoder_url: "API Service URL" - # gtt_settings_geocoder_apikey: "API Key" - # gtt_settings_geocoder_address_field_name: "Address field name" - # gtt_settings_geocoder_district_field_name: "District field name" - # gtt_park_search_field_name: "Park search field name" + gtt_settings_label_general: "General" + gtt_settings_label_styling: "Styling" + gtt_settings_label_geocoder: "Geocoder" label_default_collapsed_issues_page_map: "Default collapsed issues page map" label_gtt_point: "Point" @@ -85,15 +58,40 @@ en: select_edit_geometry_settings: "Set edit geometry settings:" select_default_geocoder_settings: "Set Geocoder settings:" - # text_osm_url_sample: For example https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png - project_module_gtt: "GTT" permission_manage_gtt_settings: "Manage GTT settings" + permission_view_gtt_settings: "View GTT settings" title_geojson_upload: "Import GeoJSON" placeholder_geojson_upload: "Please paste a GeoJSON geometry here, or import the GeoJSON data from a file." + map_layer: + title: "Map Layers" + plural: "Map Layers" + new: "New Map Layer" + ids: "Map Layers" + project: + info: "Select the map layers that should be available in this project." + layer_options_select: "-- Select layer type --" + source_options_select: "-- Select source type --" + format_options_select: "-- Select format type --" + load_example: "Examples: " + + # Workaround to easily customize field labels + field_name: "Name" + field_layer: "Layer type" + field_layer_options_string: "Layer options" + field_baselayer: "BaseLayer" + field_global: "Globally available" + field_default: "Default for new projects" + field_source: "Source type" + field_source_options_string: "Source options" + field_format: "Format type" + field_format_options_string: "Format options" + field_styles: "Style settings" + # Localize for use in Javascript + gtt_js: control: geocoding: "Location search" @@ -110,3 +108,6 @@ en: modal: load: "Load" cancel: "Cancel" + messages: + baselayer_missing: "There is no baselayer available!" + zoom_in_more: "Zoom in to view objects." diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 63e70ac7..b8d2a711 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -3,14 +3,9 @@ ja: error_invalid_json: "正しいJSONにしてください" error_unable_to_update_project_gtt_settings: "プロジェクトのGTTの設定を更新できません (%{value})" - field_default: "新規プロジェクトのデフォルト" field_geometry: "所在地" field_location: "場所" field_geom: "所在地" - field_global: 世界的に利用可能 - field_baselayer: 背景レイヤー - field_options_string: オプション - field_gtt_tile_source_ids: タイルソース label_geotask_map: "ジオタスク 地図" label_global: グローバル @@ -19,52 +14,35 @@ ja: label_name: タイトル label_baselayer: 背景レイヤー label_nearby: "近く(緯度,経度)" - label_type: タイプ + label_layer: "レイヤー種別" + label_source: "ソース種別" label_config: 構成 label_gtt_settings: GTT label_gtt_settings_headline: GTTの設定 - # gtt_label_geometry: "APIキー" - # gtt_text_settings_help: "APIキーを入力してください。キーが不要の場合は空白にしてください。" - # gtt_text_settings_geometry_example: "2747491302261fbc47967ba62621af22" - label_gtt: "GTT" label_gtt_bbox_filter: 場所 label_gtt_distance: 距離 label_gtt_select_icon: アイコン選択 - label_gtt_tile_source: タイルソース - label_gtt_tile_source_new: 新しいタイルソース - label_gtt_tile_source_plural: タイルソース label_parameters: パラメータ label_tab_general: "一般" label_tab_geocoder: "ジオコーダ" - label_tab_map: "タイルソース" geocoder_options: "ジオコーダのオプション" - gtt_tile_sources_info: このプロジェクトで使用できるタイルソースを選択します。 - gtt_tile_sources_select: "-- タイプを選択 --" - gtt_tile_sources_select_imagewms: "Image WMS" - gtt_tile_sources_select_osm: "OpenStreetMap" - gtt_tile_sources_select_tilewms: "Tiled WMS" - gtt_tile_sources_select_xyz: "XYZ Tiles" - gtt_tile_sources_load_example: "サンプル設定をロード。" + gtt_map_rotate_label: "地図の回転" + gtt_map_rotate_info_html: "Shift+Alt を押しながらドラッグして地図を回転します。" gtt_settings_general_center_lon: "既定の地図中心経度" gtt_settings_general_center_lat: "既定の地図中心緯度" gtt_settings_general_zoom_level: "既定の地図ズームレベル" gtt_settings_general_maxzoom_level: "既定の最大地図ズームレベル" gtt_settings_general_fit_maxzoom_level: "フィット時最大地図ズームレベル" + gtt_settings_vector_minzoom_level: "最小ズームレベル" - # gtt_settings_map_url: "地図APIサービスのURL" - # gtt_settings_map_apikey: "地図APIキー" - # gtt_settings_map_maxzoom_level: "最大地図ズームレベル" - - # gtt_settings_geocoder_url: "ジオコーダAPIサービスのURL" - # gtt_settings_geocoder_apikey: "ジオコーダAPIキー" - # gtt_settings_geocoder_address_field_name: "住所フィールド名" - # gtt_settings_geocoder_district_field_name: "区フィールド名" - # gtt_park_search_field_name: "公園検索フィールド名" + gtt_settings_label_general: "一般" + gtt_settings_label_styling: "スタイル" + gtt_settings_label_geocoder: "ジオコーダ" label_default_collapsed_issues_page_map: "チケット一覧の地図を既定で非表示" label_gtt_point: "ポイント" @@ -80,11 +58,40 @@ ja: select_edit_geometry_settings: "ジオメトリ編集時の設定:" select_default_geocoder_settings: "ジオコーダの設定:" - # text_osm_url_sample: "例: https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png" - project_module_gtt: "GTT" permission_manage_gtt_settings: "GTT設定の管理" + permission_view_gtt_settings: "GTT設定の閲覧" + + title_geojson_upload: GeoJSONのインポート placeholder_geojson_upload: GeoJSONのジオメトリをここにペーストするか、ファイルからGeoJSONデータをインポートしてください。 + + map_layer: + title: "地図レイヤー" + plural: "地図レイヤー" + new: "新しい地図レイヤー" + ids: "地図レイヤー" + project: + info: "このプロジェクトで利用可能な地図レイヤーを選択してください。" + layer_options_select: "-- レイヤー種別を選択 --" + source_options_select: "-- ソース種別を選択 --" + format_options_select: "-- フォーマット種別を選択 --" + load_example: "例: " + + # Workaround to easily customize field labels + field_name: "名称" + field_layer: "レイヤー種別" + field_layer_options_string: "レイヤーオプション" + field_baselayer: 背景レイヤー + field_global: 世界的に利用可能 + field_default: "新規プロジェクトのデフォルト" + field_source: "ソース種別" + field_source_options_string: "ソースオプション" + field_format: "フォーマット種別" + field_format_options_string: "フォーマットオプション" + field_styles: "スタイル設定" + + # Localize for use in Javascript + gtt_js: control: geocoding: 住所検索 @@ -101,4 +108,6 @@ ja: modal: load: 読み込み cancel: キャンセル - title_geojson_upload: GeoJSONのインポート + messages: + baselayer_missing: "背景レイヤーが存在しません!" + zoom_in_more: "地物表示のためズームします。" diff --git a/config/routes.rb b/config/routes.rb index 6d4b87c5..712bf47e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,11 +1,13 @@ # Plugin's routes # See: http://guides.rubyonrails.org/routing.html -resources :gtt_tile_sources +resources :gtt_map_layers put 'projects/:id/settings/gtt', to: 'projects#update_gtt_configuration', as: :update_gtt_configuration +get '/plugin_assets/redmine_gtt/javascripts/index.js.map', to: 'gtt#map' + scope 'gtt' do get 'settings', to: 'gtt_configuration#default_setting_configuration', as: :default_setting_configuration end diff --git a/db/migrate/20230411003927_create_gtt_map_layers.rb b/db/migrate/20230411003927_create_gtt_map_layers.rb new file mode 100644 index 00000000..4a26ede8 --- /dev/null +++ b/db/migrate/20230411003927_create_gtt_map_layers.rb @@ -0,0 +1,22 @@ +class CreateGttMapLayers < ActiveRecord::Migration[5.2] + def change + create_table :gtt_map_layers do |t| + t.string :name, null: false + + t.string :layer, null: false + t.jsonb :layer_options + t.string :source + t.jsonb :source_options + t.string :format + t.jsonb :format_options + t.text :styles + + t.boolean :global, default: false + t.boolean :default, default: false + t.boolean :baselayer, default: true + + t.integer :position, default: 0 + t.timestamps null: false + end + end +end diff --git a/db/migrate/20230411004231_create_gtt_map_layers_projects_table.rb b/db/migrate/20230411004231_create_gtt_map_layers_projects_table.rb new file mode 100644 index 00000000..8067d2d7 --- /dev/null +++ b/db/migrate/20230411004231_create_gtt_map_layers_projects_table.rb @@ -0,0 +1,8 @@ +class CreateGttMapLayersProjectsTable < ActiveRecord::Migration[5.2] + def change + create_join_table :gtt_map_layers, :projects do |t| + t.index :project_id + t.index :gtt_map_layer_id + end + end +end diff --git a/db/migrate/20230415003248_update_geom_dimensions.rb b/db/migrate/20230415003248_update_geom_dimensions.rb new file mode 100644 index 00000000..1ce8c5e7 --- /dev/null +++ b/db/migrate/20230415003248_update_geom_dimensions.rb @@ -0,0 +1,43 @@ +class UpdateGeomDimensions < ActiveRecord::Migration[5.2] + def up + # Modify the geom column to include the Z dimension + execute <<-SQL + ALTER TABLE issues + ALTER COLUMN geom TYPE geometry(GeometryZ, 4326) + USING ST_Force3D(geom) + SQL + + execute <<-SQL + ALTER TABLE projects + ALTER COLUMN geom TYPE geometry(GeometryZ, 4326) + USING ST_Force3D(geom) + SQL + + execute <<-SQL + ALTER TABLE users + ALTER COLUMN geom TYPE geometry(GeometryZ, 4326) + USING ST_Force3D(geom) + SQL + end + + def down + # Modify the geom column to remove the Z dimension + execute <<-SQL + ALTER TABLE issues + ALTER COLUMN geom TYPE geometry(Geometry, 4326) + USING ST_Force2D(geom) + SQL + + execute <<-SQL + ALTER TABLE projects + ALTER COLUMN geom TYPE geometry(Geometry, 4326) + USING ST_Force2D(geom) + SQL + + execute <<-SQL + ALTER TABLE users + ALTER COLUMN geom TYPE geometry(Geometry, 4326) + USING ST_Force2D(geom) + SQL + end +end diff --git a/doc/New Map Layer - Map Layers - Redmine.png b/doc/New Map Layer - Map Layers - Redmine.png new file mode 100644 index 00000000..ebed1513 Binary files /dev/null and b/doc/New Map Layer - Map Layers - Redmine.png differ diff --git a/doc/New Tile Source - Tile Sources - Redmine.png b/doc/New Tile Source - Tile Sources - Redmine.png deleted file mode 100644 index 7a20e2dc..00000000 Binary files a/doc/New Tile Source - Tile Sources - Redmine.png and /dev/null differ diff --git a/doc/Redmine GTT plugin - Plugins - Redmine.png b/doc/Redmine GTT plugin - Plugins - Redmine.png index bfcf9d7d..50973b62 100644 Binary files a/doc/Redmine GTT plugin - Plugins - Redmine.png and b/doc/Redmine GTT plugin - Plugins - Redmine.png differ diff --git a/doc/Settings - GTT Project - Redmine.png b/doc/Settings - GTT Project - Redmine.png index 7a1a26ba..f3bcb594 100644 Binary files a/doc/Settings - GTT Project - Redmine.png and b/doc/Settings - GTT Project - Redmine.png differ diff --git a/doc/getting-started.md b/doc/getting-started.md index 9cde64f0..ae681060 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -10,23 +10,25 @@ Global settings can be specified in the plugin configuration `/settings/plugin/r **Note:** Geocoder options missing. TBD. -## Tile Source +## Map Layers -At least one tile source needs to be configured to be used as a base map. The GTT plugin uses [OpenLayers](https://openlayers.org/) and accepts common OpenLayers layer types and layer options. +At least one map layer needs to be configured to be used as a base map. The GTT plugin uses [OpenLayers](https://openlayers.org/) and accepts common OpenLayers layer types and layer options. -![Tile Source](New%20Tile%20Source%20-%20Tile%20Sources%20-%20Redmine.png) +![Map Layer](New%20Map%20Layer%20-%20Map%20Layers%20-%20Redmine.png) ### Example OSM base map -* **Type**: `ol.source.OSM` -* **Options**: +* **Layer type**: `Tile` +* **Layer options string**: `{}` +* **Source type**: `OSM` +* **Source options string**: ``` { "url": "https://tile.openstreetmap.jp/{z}/{x}/{y}.png", "custom": "19/34.74701/135.35740", "crossOrigin": null, - "attributions": "OpenStreetMap" + "attributions": "OpenStreetMap contributors" } ``` diff --git a/init.rb b/init.rb index 30aa72ab..1053767d 100644 --- a/init.rb +++ b/init.rb @@ -8,9 +8,9 @@ author_url 'https://github.com/georepublic' url 'https://github.com/gtt-project/redmine_gtt' description 'Adds location-based task management and maps' - version '4.3.1' + version '5.0.0' - requires_redmine :version_or_higher => '4.2.0' + requires_redmine :version_or_higher => '5.0.0' project_module :gtt do permission :manage_gtt_settings, { @@ -29,6 +29,7 @@ 'default_map_zoom_level' => 13, 'default_map_maxzoom_level' => 19, 'default_map_fit_maxzoom_level' => 17, + 'vector_minzoom_level' => 0, 'default_geocoder_options' => '{}', 'editable_geometry_types_on_issue_map' => ["Point"], 'enable_geojson_upload_on_issue_map' => false, @@ -38,9 +39,9 @@ ) menu :admin_menu, - :gtt_tile_sources, - { controller: 'gtt_tile_sources', action: 'index' }, - caption: :label_gtt_tile_source_plural, :html => {:class => 'icon icon-gtt-map'} + :gtt_map_layers, + { controller: 'gtt_map_layers', action: 'index' }, + caption: :'map_layer.plural', html: { class: 'icon icon-gtt-map' } end # Register MIME Types @@ -50,13 +51,7 @@ RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson) RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| - # By default, use the GEOS implementation for spatial columns. - # config.default = RGeo::Geos.factory_generator - - config.register RGeo::Cartesian.preferred_factory(srid: 4326), geo_type: 'geometry', sql_type: "geometry", srid: 4326 - - # But use a geographic implementation for point columns. - # config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point") + config.register RGeo::Cartesian.preferred_factory(has_z_coordinate: true, srid: 4326), geo_type: 'geometry', sql_type: "geometry", srid: 4326 end if Rails.version > '6.0' && Rails.autoloaders.zeitwerk_enabled? @@ -92,10 +87,3 @@ RedmineGtt.setup_controller_patches end end - -#class GttListener < Redmine::Hook::ViewListener -Class.new(Redmine::Hook::ViewListener) do |c| - render_on :view_layouts_base_html_head, inline: <<-END - <%= stylesheet_link_tag 'gtt', :plugin => 'redmine_gtt' %> - END -end diff --git a/lib/redmine_gtt/actions/create_map_layer.rb b/lib/redmine_gtt/actions/create_map_layer.rb new file mode 100644 index 00000000..f21ed8a9 --- /dev/null +++ b/lib/redmine_gtt/actions/create_map_layer.rb @@ -0,0 +1,18 @@ +module RedmineGtt + module Actions + class CreateMapLayer < Base + + Result = ImmutableStruct.new(:map_layer_created?, :map_layer) + + def initialize(parameters) + @params = parameters + end + + def call + ml = GttMapLayer.new @params + Result.new map_layer_created: ml.save, map_layer: ml + end + + end + end +end diff --git a/lib/redmine_gtt/actions/create_tile_source.rb b/lib/redmine_gtt/actions/create_tile_source.rb deleted file mode 100644 index fcd44482..00000000 --- a/lib/redmine_gtt/actions/create_tile_source.rb +++ /dev/null @@ -1,18 +0,0 @@ -module RedmineGtt - module Actions - class CreateTileSource < Base - - Result = ImmutableStruct.new(:tile_source_created?, :tile_source) - - def initialize(parameters) - @params = parameters - end - - def call - ts = GttTileSource.new @params - Result.new tile_source_created: ts.save, tile_source: ts - end - - end - end -end diff --git a/lib/redmine_gtt/actions/update_map_layer.rb b/lib/redmine_gtt/actions/update_map_layer.rb new file mode 100644 index 00000000..4a08bb43 --- /dev/null +++ b/lib/redmine_gtt/actions/update_map_layer.rb @@ -0,0 +1,20 @@ +module RedmineGtt + module Actions + class UpdateMapLayer < Base + + Result = ImmutableStruct.new(:map_layer_updated?, :map_layer) + + def initialize(map_layer, parameters) + @ml = map_layer + @params = parameters + end + + def call + @ml.attributes = @params + Result.new map_layer_updated: @ml.save, map_layer: @ml + end + + end + end +end + diff --git a/lib/redmine_gtt/actions/update_project_settings.rb b/lib/redmine_gtt/actions/update_project_settings.rb index dc11021f..650238f1 100644 --- a/lib/redmine_gtt/actions/update_project_settings.rb +++ b/lib/redmine_gtt/actions/update_project_settings.rb @@ -23,8 +23,8 @@ def call private def update_project - if tile_source_ids = @form.gtt_tile_source_ids - @project.gtt_tile_source_ids = tile_source_ids + if map_layer_ids = @form.gtt_map_layer_ids + @project.gtt_map_layer_ids = map_layer_ids end begin diff --git a/lib/redmine_gtt/actions/update_tile_source.rb b/lib/redmine_gtt/actions/update_tile_source.rb deleted file mode 100644 index 1e3628e9..00000000 --- a/lib/redmine_gtt/actions/update_tile_source.rb +++ /dev/null @@ -1,20 +0,0 @@ -module RedmineGtt - module Actions - class UpdateTileSource < Base - - Result = ImmutableStruct.new(:tile_source_updated?, :tile_source) - - def initialize(tile_source, parameters) - @ts = tile_source - @params = parameters - end - - def call - @ts.attributes = @params - Result.new tile_source_updated: @ts.save, tile_source: @ts - end - - end - end -end - diff --git a/lib/redmine_gtt/conversions.rb b/lib/redmine_gtt/conversions.rb index 09934bbb..077f09f9 100644 --- a/lib/redmine_gtt/conversions.rb +++ b/lib/redmine_gtt/conversions.rb @@ -20,7 +20,7 @@ def to_json(object, id: nil, properties: nil) def collection_to_json(data) RGeo::GeoJSON.encode @factory.feature_collection( - data.map{|object, id, props| feature object, id, props} + data.map{|object, id, properties| feature(object, id, properties)} ) end @@ -74,9 +74,9 @@ def self.to_geom(geometry) RGeo::GeoJSON.decode( geojson, json_parser: :json, - geo_factory: RGeo::Cartesian.preferred_factory(srid: 4326) + geo_factory: RGeo::Cartesian.preferred_factory(has_z_coordinate: true, srid: 4326) ).geometry - end + end # Turn geometry attribute string into WKB for database use def self.to_wkb(geometry) diff --git a/lib/redmine_gtt/hooks/view_layouts_base_html_head_hook.rb b/lib/redmine_gtt/hooks/view_layouts_base_html_head_hook.rb index 89119aa2..f06ac494 100644 --- a/lib/redmine_gtt/hooks/view_layouts_base_html_head_hook.rb +++ b/lib/redmine_gtt/hooks/view_layouts_base_html_head_hook.rb @@ -7,7 +7,7 @@ class ViewLayoutsBaseHtmlHeadHook < Redmine::Hook::ViewListener def view_layouts_base_html_head(context={}) tags = []; - tags << javascript_include_tag('main.js', :plugin => 'redmine_gtt') + tags << javascript_include_tag('../main.js', :plugin => 'redmine_gtt') return tags.join("\n") end @@ -27,6 +27,7 @@ def view_layouts_base_body_bottom(context={}) :lat => Setting.plugin_redmine_gtt['default_map_center_latitude'], :zoom => Setting.plugin_redmine_gtt['default_map_zoom_level'], :maxzoom => Setting.plugin_redmine_gtt['default_map_maxzoom_level'], + :vector_minzoom => Setting.plugin_redmine_gtt['vector_minzoom_level'], :fit_maxzoom => Setting.plugin_redmine_gtt['default_map_fit_maxzoom_level'], :geocoder => geocoder, :plugin_settings => Setting.plugin_redmine_gtt.select{ |key, value| key.to_s.match(/^(?!default).+/) }, diff --git a/lib/redmine_gtt/patches/issue_patch.rb b/lib/redmine_gtt/patches/issue_patch.rb index 128189df..8b67a38a 100644 --- a/lib/redmine_gtt/patches/issue_patch.rb +++ b/lib/redmine_gtt/patches/issue_patch.rb @@ -22,8 +22,7 @@ def self.apply def map json = as_geojson - GttMap.new json: json, layers: project.gtt_tile_sources.sorted, - bounds: project.map.json + GttMap.new json: json, layers: project.gtt_map_layers.sorted, bounds: project.map.json end # Check if geometry change aren't small and ignore it diff --git a/lib/redmine_gtt/patches/project_patch.rb b/lib/redmine_gtt/patches/project_patch.rb index 53ee307a..86009264 100644 --- a/lib/redmine_gtt/patches/project_patch.rb +++ b/lib/redmine_gtt/patches/project_patch.rb @@ -9,27 +9,27 @@ def self.apply Project.prepend self Project.class_eval do safe_attributes :geojson, :map_rotation - has_and_belongs_to_many :gtt_tile_sources - after_create :set_default_tile_sources + has_and_belongs_to_many :gtt_map_layers + after_create :set_default_map_layers end end end def map - GttMap.new json: as_geojson, layers: gtt_tile_sources.sorted + GttMap.new json: as_geojson, layers: gtt_map_layers.sorted end def enabled_module_names=(*_) super - set_default_tile_sources + set_default_map_layers end - def set_default_tile_sources - if gtt_tile_sources.none? and module_enabled?(:gtt) - self.gtt_tile_sources = GttTileSource.default.sorted.to_a + def set_default_map_layers + if gtt_map_layers.none? and module_enabled?(:gtt) + self.gtt_map_layers = GttMapLayer.default.sorted.to_a end end - private :set_default_tile_sources + private :set_default_map_layers end diff --git a/lib/redmine_gtt/patches/projects_helper_patch.rb b/lib/redmine_gtt/patches/projects_helper_patch.rb index e5c4346f..c62cecd6 100644 --- a/lib/redmine_gtt/patches/projects_helper_patch.rb +++ b/lib/redmine_gtt/patches/projects_helper_patch.rb @@ -17,8 +17,8 @@ def self.apply def render_api_includes(project, api) super api.array :layers do - project.gtt_tile_sources.each do |gtt_tile_source| - api.layer(gtt_tile_source.attributes) + project.gtt_map_layers.each do |gtt_map_layer| + api.layer(gtt_map_layer.attributes.except("created_at", "updated_at","position","global")) end end if include_in_api_response?('layers') end diff --git a/lib/redmine_gtt/patches/user_patch.rb b/lib/redmine_gtt/patches/user_patch.rb index ec331eb3..db13dd3b 100644 --- a/lib/redmine_gtt/patches/user_patch.rb +++ b/lib/redmine_gtt/patches/user_patch.rb @@ -13,7 +13,7 @@ def self.apply end def map - GttMap.new json: as_geojson, layers: GttTileSource.global.sorted + GttMap.new json: as_geojson, layers: GttMapLayer.global.sorted end def geojson_additional_properties(include_properties) diff --git a/package.json b/package.json index d5b19bf7..af7b3fed 100644 --- a/package.json +++ b/package.json @@ -21,23 +21,26 @@ "homepage": "https://github.com/gtt-project/redmine_gtt#readme", "dependencies": { "@juggle/resize-observer": "^3.4.0", - "@material-design-icons/font": "^0.14.2", + "@mdi/font": "^7.2.96", + "fontfaceobserver": "^2.3.0", "geojson": "^0.5.0", - "ol": "^7.2.2", - "ol-ext": "4.0.4" + "ol": "^7.4.0", + "ol-ext": "^4.0.8", + "ol-mapbox-style": "^10.6.0" }, "devDependencies": { + "@types/fontfaceobserver": "^2.1.0", "@types/geojson": "^7946.0.10", "@types/jquery": "^3.5.16", - "@types/jqueryui": "^1.12.16", + "@types/jqueryui": "^1.12.17", "@types/ol-ext": "npm:@siedlerchr/types-ol-ext", - "css-loader": "^6.7.3", - "sass": "^1.58.0", - "sass-loader": "^13.2.0", - "style-loader": "^3.3.1", - "ts-loader": "^9.4.2", - "typescript": "^4.9.5", - "webpack": "^5.75.0", - "webpack-cli": "^5.0.1" + "css-loader": "^6.8.1", + "sass": "^1.63.5", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "ts-loader": "^9.4.3", + "typescript": "^5.1.3", + "webpack": "^5.87.0", + "webpack-cli": "^5.1.4" } } diff --git a/src/@types/custom-fontface-set.d.ts b/src/@types/custom-fontface-set.d.ts new file mode 100644 index 00000000..47c8d111 --- /dev/null +++ b/src/@types/custom-fontface-set.d.ts @@ -0,0 +1,7 @@ +declare global { + interface FontFaceSet { + add(font: FontFace): void; + } +} + +export {}; // This ensures this file is treated as a module diff --git a/src/@types/window.d.ts b/src/@types/window.d.ts index 7af2aa74..6bfc3879 100644 --- a/src/@types/window.d.ts +++ b/src/@types/window.d.ts @@ -1,12 +1,77 @@ -// Redmine function -interface Window { - availableFilters: any - operatorByType: any - operatorLabels: any - toggleOperator(filed: any): void - showModal(id: string, width: string, title?: string): void - buildFilterRowWithoutDistanceFilter(field: any, operator: any, values: any): void - buildFilterRow(field: any, operator: any, values: any): void - replaceIssueFormWith(html: any): void - replaceIssueFormWithInitMap(html: any): void +declare global { + interface Window { + /** + * Redmine functions + */ + + /** An object containing available filters */ + availableFilters: any; + + /** An object containing operators by type */ + operatorByType: any; + + /** An object containing operator labels */ + operatorLabels: any; + + /** + * Toggles the operator for a given field. + * @param {any} field - The field for which the operator will be toggled. + */ + toggleOperator(field: any): void; + + /** + * Shows a modal with the given ID, width, and optional title. + * @param {string} id - The ID of the modal to be shown. + * @param {string} width - The width of the modal. + * @param {string} [title] - The optional title of the modal. + */ + showModal(id: string, width: string, title?: string): void; + + /** + * Builds a filter row without distance filter. + * @param {any} field - The field for the filter row. + * @param {any} operator - The operator for the filter row. + * @param {any} values - The values for the filter row. + */ + buildFilterRowWithoutDistanceFilter( + field: any, + operator: any, + values: any + ): void; + + /** + * Builds a filter row. + * @param {any} field - The field for the filter row. + * @param {any} operator - The operator for the filter row. + * @param {any} values - The values for the filter row. + */ + buildFilterRow(field: any, operator: any, values: any): void; + + /** + * Replaces the issue form with the given HTML. + * @param {any} html - The HTML to replace the issue form with. + */ + replaceIssueFormWith(html: any): void; + + /** + * Replaces the issue form with the given HTML and initializes the map. + * @param {any} html - The HTML to replace the issue form with. + */ + replaceIssueFormWithInitMap(html: any): void; + + /** + * Gtt functions + */ + + /** + * Creates a GttClient instance for the given target. + * @param {HTMLDivElement} target - The HTMLDivElement for which the GttClient will be created. + */ + createGttClient(target: HTMLDivElement): void; + + /** A function to handle GTT settings */ + gtt_setting(): void; + } } + +export {}; // This ensures this file is treated as a module diff --git a/src/components/gtt-client.ts b/src/components/gtt-client.ts deleted file mode 100644 index 49256661..00000000 --- a/src/components/gtt-client.ts +++ /dev/null @@ -1,1538 +0,0 @@ -import 'ol/ol.css' -import 'ol-ext/dist/ol-ext.min.css' -import { Map, Feature, View, Geolocation, Collection } from 'ol' -import 'ol-ext/filter/Base' -import { Geometry, GeometryCollection, Point } from 'ol/geom' -import { GeoJSON, WKT } from 'ol/format' -import { Layer, Tile, Image } from 'ol/layer' -import VectorLayer from 'ol/layer/Vector' -import { OSM, XYZ, TileWMS, ImageWMS } from 'ol/source' -import { Style, Fill, Stroke, Circle } from 'ol/style' -import { OrderFunction } from 'ol/render' -import { - defaults as interactions_defaults, - MouseWheelZoom, - Modify, - Draw, - Select, -} from 'ol/interaction' -import { focus as events_condifition_focus } from 'ol/events/condition' -import { defaults as control_defaults, FullScreen, Rotate } from 'ol/control' -import { transform, fromLonLat, transformExtent } from 'ol/proj' -import { createEmpty, extend, getCenter, containsCoordinate } from 'ol/extent' -import { FeatureCollection } from 'geojson' -import { quick_hack } from './quick_hack' -import Vector from 'ol/source/Vector' -import Ordering from 'ol-ext/render/Ordering' -import Shadow from 'ol-ext/style/Shadow' -import FontSymbol from 'ol-ext/style/FontSymbol' -import Mask from 'ol-ext/filter/Mask' -import Bar from 'ol-ext/control/Bar' -import Toggle from 'ol-ext/control/Toggle' -import Button from 'ol-ext/control/Button' -import TextButton from 'ol-ext/control/TextButton' -import LayerPopup from 'ol-ext/control/LayerPopup' -import LayerSwitcher from 'ol-ext/control/LayerSwitcher' -import Popup from 'ol-ext/overlay/Popup' -import { position } from 'ol-ext/control/control' -import { ResizeObserver } from '@juggle/resize-observer' -import VectorSource from 'ol/source/Vector' -import { FeatureLike } from 'ol/Feature' -import TileSource from 'ol/source/Tile' -import ImageSource from 'ol/source/Image' -import { Options as ImageWMSOptions } from 'ol/source/ImageWMS' -import JSONFeature from 'ol/format/JSONFeature' -import BaseEvent from 'ol/events/Event' -import { CollectionEvent } from 'ol/Collection' - -interface GttClientOption { - target: HTMLDivElement | null -} - -interface LayerObject { - type: string - id: number - name: string - baselayer: boolean - options: object -} - -interface FilterOption { - location: boolean - distance: boolean -} - -interface TileLayerSource { - layer: typeof Tile - source: typeof OSM | typeof XYZ | typeof TileWMS -} - -interface ImageLayerSource { - layer: typeof Image - source: typeof ImageWMS -} - -export class GttClient { - readonly map: Map - maps: Array - layerArray: Layer[] - defaults: DOMStringMap - contents: DOMStringMap - i18n: any - toolbar: Bar - filters: FilterOption - vector: VectorLayer> - bounds: VectorLayer> - geolocations: Array - - constructor(options: GttClientOption) { - this.filters = { - location: false, - distance: false - } - this.maps = [] - this.geolocations = [] - - // needs target - if (!options.target) { - return - } - - const gtt_defaults = document.querySelector('#gtt-defaults') as HTMLDivElement - if (!gtt_defaults) { - return - } - - this.defaults = gtt_defaults.dataset - - if (this.defaults.lon === null || this.defaults.lon === undefined) { - this.defaults.lon = quick_hack.lon.toString() - } - if (this.defaults.lat === null || this.defaults.lat === undefined) { - this.defaults.lat = quick_hack.lat.toString() - } - if (this.defaults.zoom === null || this.defaults.zoom === undefined) { - this.defaults.zoom = quick_hack.zoom.toString() - } - if (this.defaults.maxzoom === null || this.defaults.maxzoom === undefined) { - this.defaults.maxzoom = quick_hack.maxzoom.toString() - } - if (this.defaults.fitMaxzoom === null || this.defaults.fitMaxzoom === undefined) { - this.defaults.fitMaxzoom = quick_hack.fitMaxzoom.toString() - } - if (this.defaults.geocoder === null || this.defaults.geocoder === undefined) { - this.defaults.geocoder = JSON.stringify(quick_hack.geocoder) - } - - this.contents = options.target.dataset - this.i18n = JSON.parse(this.defaults.i18n) - - // create map at first - this.map = new Map({ - target: options.target, - //layers: this.layerArray, - interactions: interactions_defaults({mouseWheelZoom: false}).extend([ - new MouseWheelZoom({ - constrainResolution: true, // force zooming to a integer zoom - condition: events_condifition_focus // only wheel/trackpad zoom when the map has the focus - }) - ]), - controls: control_defaults({ - rotateOptions: {}, - attributionOptions: { - collapsible: false - }, - zoomOptions: { - zoomInTipLabel: this.i18n.control.zoom_in, - zoomOutTipLabel: this.i18n.control.zoom_out - } - }) - }) - - let features: Feature[] | null = null - if (this.contents.geom && this.contents.geom !== null && this.contents.geom !== 'null') { - features = new GeoJSON().readFeatures( - JSON.parse(this.contents.geom), { - featureProjection: 'EPSG:3857' - } - ) - } - - // Fix FireFox unloaded font issue - this.reloadFontSymbol() - - // TODO: this is only necessary because setting the initial form value - // through the template causes encoding problems - this.updateForm(features) - this.layerArray = [] - - if (this.contents.layers) { - const layers = JSON.parse(this.contents.layers) as [LayerObject] - layers.forEach((layer) => { - const s = layer.type.split('.') - const layerSource = getLayerSource(s[1], s[2]) - const tileLayerSource = layerSource as TileLayerSource - if (tileLayerSource) { - const l = new (tileLayerSource.layer)({ - visible: false, - source: new (tileLayerSource.source)(layer.options as any) - }) - - l.set('lid', layer.id) - l.set('title', layer.name) - l.set('baseLayer', layer.baselayer) - if( layer.baselayer ) { - l.on('change:visible', e => { - const target = e.target as Tile - if (target.getVisible()) { - const lid = target.get('lid') - document.cookie = `_redmine_gtt_basemap=${lid};path=/` - } - }) - } - this.layerArray.push(l) - } else if (layerSource as ImageLayerSource) { - const imageLayerSource = layerSource as ImageLayerSource - const l = new (imageLayerSource.layer)({ - visible: false, - source: new (imageLayerSource.source)(layer.options as ImageWMSOptions) - }) - - l.set('lid', layer.id) - l.set('title', layer.name) - l.set('baseLayer', layer.baselayer) - if( layer.baselayer ) { - l.on('change:visible', e => { - const target = e.target as Image - if (target.getVisible()) { - const lid = target.get('lid') - document.cookie = `_redmine_gtt_basemap=${lid};path=/` - } - }) - } - this.layerArray.push(l) - } - }, this) - - /** - * Ordering the Layers for the LayerSwitcher Control. - * BaseLayers are added first. - */ - this.layerArray.forEach( (l:Layer) => { - if( l.get("baseLayer") ) { - this.map.addLayer(l) - } - } - ) - - var containsOverlay = false; - - this.layerArray.forEach( (l:Layer) => { - if( !l.get("baseLayer") ) { - this.map.addLayer(l) - containsOverlay = true - } - } - ) - } - - this.setBasemap() - - // Layer for project boundary - this.bounds = new VectorLayer({ - source: new Vector(), - style: new Style({ - fill: new Fill({ - color: 'rgba(255,255,255,0.0)' - }), - stroke: new Stroke({ - color: 'rgba(220,26,26,0.7)', - // lineDash: [12,1,12], - width: 1 - }) - }) - }) - this.bounds.set('title', 'Boundaries') - this.bounds.set('displayInLayerSwitcher', false) - this.layerArray.push(this.bounds) - this.map.addLayer(this.bounds) - - const yOrdering: unknown = Ordering.yOrdering() - - this.vector = new VectorLayer>({ - source: new Vector({ - 'features': features, - 'useSpatialIndex': false - }), - renderOrder: yOrdering as OrderFunction, - style: this.getStyle.bind(this) - }) - this.vector.set('title', 'Features') - this.vector.set('displayInLayerSwitcher', false) - this.layerArray.push(this.vector) - this.map.addLayer(this.vector) - - // Render project boundary if bounds are available - if (this.contents.bounds && this.contents.bounds !== null) { - const boundary = new GeoJSON().readFeature( - this.contents.bounds, { - featureProjection: 'EPSG:3857' - } - ) - this.bounds.getSource().addFeature(boundary) - if (this.contents.bounds === this.contents.geom) { - this.vector.setVisible(false) - } - this.layerArray.forEach((layer:Layer) => { - if (layer.get('baseLayer')) { - layer.addFilter(new Mask({ - feature: boundary, - inner: false, - fill: new Fill({ - color: [220,26,26,.1] - }) - })) - } - }) - } - - // For map div focus settings - if (options.target) { - if (options.target.getAttribute('tabindex') == null) { - options.target.setAttribute('tabindex', '0') - } - } - - // Fix empty map issue - this.map.once('postrender', e => { - this.zoomToExtent(true); - }) - - // Add Toolbar - this.toolbar = new Bar() - this.toolbar.setPosition('bottom-left' as position) - this.map.addControl(this.toolbar) - this.setView() - this.setGeocoding(this.map) - this.setGeolocation(this.map) - this.parseHistory() - - this.map.addControl (new FullScreen({ - tipLabel: this.i18n.control.fullscreen - })) - this.map.addControl (new Rotate({ - tipLabel: this.i18n.control.rotate - })) - - // Control button - const maximizeCtrl = new Button({ - html: 'zoom_out_map', - title: this.i18n.control.maximize, - handleClick: () => { - this.zoomToExtent(true); - } - }) - this.toolbar.addControl(maximizeCtrl) - - // Map rotation - const rotation_field = document.querySelector('#gtt_configuration_map_rotation') as HTMLInputElement - if (rotation_field !== null) { - this.map.getView().on('change:rotation', (evt) => { - rotation_field.value = String(Math.round(radiansToDegrees(evt.target.getRotation()))) - }) - - rotation_field.addEventListener("input", (evt) => { - const { target } = evt; - if (!(target instanceof HTMLInputElement)) { - return; - } - const value = target.value; - this.map.getView().setRotation(degreesToRadians(parseInt(value))) - }) - } - - if (this.contents.edit) { - this.setControls(this.contents.edit.split(' ')) - } else if (this.contents.popup) { - this.setPopover() - } - - // Zoom to extent when map collapsed => expended - if (this.contents.collapsed) { - const self = this - const collapsedObserver = new MutationObserver((mutations) => { - // const currentMap = this.map - mutations.forEach(function(mutation) { - if (mutation.attributeName !== 'style') { - return - } - const mapDiv = mutation.target as HTMLDivElement - if (mapDiv && mapDiv.style.display === 'block') { - self.zoomToExtent(true) - collapsedObserver.disconnect() - } - }) - }) - collapsedObserver.observe(self.map.getTargetElement(), { attributes: true, attributeFilter: ['style'] }) - } - - // Sidebar hack - const resizeObserver = new ResizeObserver((entries, observer) => { - this.maps.forEach(m => { - m.updateSize() - }) - }) - resizeObserver.observe(this.map.getTargetElement()) - - // When one or more issues is selected, zoom to selected map features - document.querySelectorAll('table.issues tbody tr').forEach((element: HTMLTableRowElement) => { - element.addEventListener('click', (evt) => { - const currentTarget = evt.currentTarget as HTMLTableRowElement - const id = currentTarget.id.split('-')[1] - const feature = this.vector.getSource().getFeatureById(id) - this.map.getView().fit(feature.getGeometry().getExtent(), { - size: this.map.getSize() - }) - }) - }) - - // Need to update size of an invisible map, when the editable form is made - // visible. This doesn't look like a good way to do it, but this is more of - // a Redmine problem - document.querySelectorAll('div.contextual a.icon-edit').forEach((element: HTMLAnchorElement) => { - element.addEventListener('click', () => { - setTimeout(() => { - this.maps.forEach(m => { - m.updateSize() - }) - this.zoomToExtent() - }, 200) - }) - }) - - // Redraw the map, when a GTT Tab gets activated - document.querySelectorAll('#tab-gtt').forEach((element) => { - element.addEventListener('click', () => { - this.maps.forEach(m => { - m.updateSize() - }) - this.zoomToExtent() - }) - }) - - // Add LayerSwitcher Image Toolbar - if( containsOverlay) { - this.map.addControl(new LayerSwitcher({ - reordering: false - })) - } - else { - this.map.addControl(new LayerPopup()) - } - - - // Because Redmine filter functions are applied later, the Window onload - // event provides a workaround to have filters loaded before executing - // the following code - window.addEventListener('load', () => { - if (document.querySelectorAll('tr#tr_bbox').length > 0) { - this.filters.location = true - } - if (document.querySelectorAll('tr#tr_distance').length > 0) { - this.filters.distance = true - } - const legend = document.querySelector('fieldset#location legend') as HTMLLegendElement - if (legend) { - legend.addEventListener('click', (evt) => { - const element = evt.currentTarget as HTMLLegendElement - this.toggleAndLoadMap(element) - }) - } - this.zoomToExtent() - this.map.on('moveend', this.updateFilter.bind(this)) - }) - - // Handle multiple maps per page - this.maps.push(this.map) - } - - /** - * Add editing tools - */ - setControls(types: Array) { - // Make vector features editable - const modify = new Modify({ - features: this.vector.getSource().getFeaturesCollection() - }) - - modify.on('modifyend', evt => { - this.updateForm(evt.features.getArray(), true) - }) - - this.map.addInteraction(modify) - - const mainbar = new Bar() - mainbar.setPosition("top-left" as position) - this.map.addControl(mainbar) - - const editbar = new Bar({ - toggleOne: true, // one control active at the same time - group: true // group controls together - }) - mainbar.addControl(editbar) - - types.forEach((type: any, idx) => { - const draw = new Draw({ - type: type, - source: this.vector.getSource() - }) - - draw.on('drawend', evt => { - this.vector.getSource().clear() - this.updateForm([evt.feature], true) - }) - - // Material design icon - let mdi = 'place' - - switch (type.toLowerCase()) { - case 'linestring': - mdi = 'polyline' - break; - - case 'polygon': - mdi = 'format_shapes' - break; - } - - const control = new Toggle({ - html: `${mdi}`, - title: this.i18n.control[type.toLowerCase()], - interaction: draw, - active: (idx === 0) - }) - editbar.addControl(control) - }) - - // Uses jQuery UI for GeoJSON Upload modal window - const mapObj = this - const dialog = $("#dialog-geojson-upload").dialog({ - autoOpen: false, - resizable: true, - height: 'auto', - width: 380, - modal: true, - buttons: { - [mapObj.i18n.modal.load]: function() { - const geojson_input = document.querySelector('#dialog-geojson-upload textarea') as HTMLInputElement - const data = geojson_input.value - if (data !== null) { - const features = new GeoJSON().readFeatures( - JSON.parse(data), { - featureProjection: 'EPSG:3857' - } - ) - mapObj.vector.getSource().clear() - mapObj.vector.getSource().addFeatures(features) - mapObj.updateForm(features) - mapObj.zoomToExtent() - } - $(this).dialog('close') - }, - [mapObj.i18n.modal.cancel]: function() { - $(this).dialog('close') - } - } - }); - - // Upload button - if (this.contents.upload === "true") { - - const fileSelector = document.getElementById('file-selector') - fileSelector.addEventListener('change', (event: any) => { - const file = event.target.files[0] - // Check if the file is GeoJSON. - if (file.type && !file.type.startsWith('application/geo')) { - console.log('File is not a GeoJSON document.', file.type, file); - return; - } - const fileReader = new FileReader(); - fileReader.addEventListener('load', (event: any) => { - const geojson_input = document.querySelector('#dialog-geojson-upload textarea') as HTMLInputElement - geojson_input.value = JSON.stringify(event.target.result, null, 2) - }); - fileReader.readAsText(file); - }); - - editbar.addControl(new Button({ - html: 'file_upload', - title: this.i18n.control.upload, - handleClick: () => { - dialog.dialog('open') - } - })) - } - } - - setPopover() { - const popup = new Popup({ - popupClass: 'default', - closeBox: false, - onclose: () => {}, - positioning: 'auto', - anim: true - }) - this.map.addOverlay(popup) - - // Control Select - const select = new Select({ - layers: [this.vector], - style: null, - multi: false - }) - this.map.addInteraction(select) - - // On selected => show/hide popup - select.getFeatures().on(['add'], (evt: any) => { - const feature = evt.element - - const content: Array = [] - content.push(`${feature.get('subject')}
`) - // content.push('Starts at: ' + feature.get("start_date") + ' |'); - - const popup_contents = JSON.parse(this.contents.popup) - const url = popup_contents.href.replace(/\[(.+?)\]/g, feature.get('id')) - content.push(`Edit`) - - popup.show(feature.getGeometry().getFirstCoordinate(), content.join('') as any) - }) - - select.getFeatures().on(['remove'], _ => { - popup.hide() - }) - - // change mouse cursor when over marker - this.map.on('pointermove', evt => { - if (evt.dragging) return - const hit = this.map.hasFeatureAtPixel(evt.pixel, { - layerFilter: (layer) => { - return layer === this.vector - } - }) - this.map.getTargetElement().style.cursor = hit ? 'pointer' : '' - }) - } - - updateForm(features: FeatureLike[] | null, updateAddressFlag: boolean = false):void { - if (features == null) { - return - } - const geom = document.querySelector('#geom') as HTMLInputElement - if (!geom) { - return - } - - const writer = new GeoJSON() - // Convert to Feature type for GeoJSON writer - const new_features: Feature[] = features.map((feature => { - return new Feature({geometry: feature.getGeometry() as Geometry}) - })) - const geojson_str = writer.writeFeatures(new_features, { - featureProjection: 'EPSG:3857', - dataProjection: 'EPSG:4326' - }) - const geojson = JSON.parse(geojson_str) as FeatureCollection - geom.value = JSON.stringify(geojson.features[0]) - - const geocoder = JSON.parse(this.defaults.geocoder) - if (updateAddressFlag && geocoder.address_field_name && features && features.length > 0) { - let addressInput: HTMLInputElement = null - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.innerHTML.includes(geocoder.address_field_name)) { - addressInput = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement - } - }) - if (addressInput) { - // Todo: only works with point geometries for now for the last geometry - const geom = features[features.length - 1].getGeometry() as Point - if (geom === null) { - return - } - let coords = geom.getCoordinates() - coords = transform(coords, 'EPSG:3857', 'EPSG:4326') - const reverse_geocode_url = geocoder.reverse_geocode_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString()) - fetch(reverse_geocode_url) - .then(response => response.json()) - .then(data => { - const check = evaluateComparison(getObjectPathValue(data, geocoder.reverse_geocode_result_check_path), - geocoder.reverse_geocode_result_check_operator, - geocoder.reverse_geocode_result_check_value) - let districtInput: HTMLInputElement = null - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.innerHTML.includes(geocoder.district_field_name)) { - districtInput = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement - } - }) - const address = getObjectPathValue(data, geocoder.reverse_geocode_result_address_path) - let foundDistrict = false - if (check && address) { - addressInput.value = address - if (districtInput) { - const district = getObjectPathValue(data, geocoder.reverse_geocode_result_district_path) - if (district) { - const regexp = new RegExp(geocoder.reverse_geocode_result_district_regexp) - const match = regexp.exec(district) - if (match && match.length === 2) { - districtInput.value = match[1] - foundDistrict = true - } - } - } - } else { - addressInput.value = geocoder.empty_field_value - } - if (!foundDistrict) { - if (districtInput) { - districtInput.value = '' - } - } - }) - } - } - - } - - /** - * Decide which baselayer to show - */ - setBasemap(): void { - if (this.layerArray.length == 0) { - console.error("There is no baselayer available!") - return - } - - let index = 0 - const cookie = parseInt(getCookie('_redmine_gtt_basemap')) - if (cookie) { - let lid = 0 - // Check if layer ID exists in available layers - this.layerArray.forEach((layer) => { - if (cookie === layer.get("lid")) { - lid = cookie - } - }) - - // Set selected layer visible - this.layerArray.forEach((layer, idx) => { - if (lid === layer.get("lid")) { - index = idx - } - }) - } - - // Set layer visible - this.layerArray[index].setVisible(true) - } - - getColor(feature: Feature, isFill: boolean = false): string { - let color = '#000000' - if (feature.getGeometry().getType() !== 'Point') { - color = '#FFD700' - } - const plugin_settings = JSON.parse(this.defaults.pluginSettings) - const status = document.querySelector('#issue_status_id') as HTMLInputElement - - let status_id = feature.get('status_id') - if (!status_id && status) { - status_id = status.value - } - if (status_id) { - const key = `status_${status_id}` - if (key in plugin_settings) { - color = plugin_settings[key] - } - } - if (isFill && color !== null && color.length === 7) { - color = color + '33' // Add alpha: 0.2 - } - return color - } - - getFontColor(_: unknown): string { - const color = "#FFFFFF" - return color - } - - getSymbol(feature: Feature) { - let symbol = 'home' - - const plugin_settings = JSON.parse(this.defaults.pluginSettings) - const issue_tracker = document.querySelector('#issue_tracker_id') as HTMLInputElement - let tracker_id = feature.get('tracker_id') - if (!tracker_id && issue_tracker) { - tracker_id = issue_tracker.value - } - if (tracker_id) { - const key = `tracker_${tracker_id}` - if (key in plugin_settings) { - symbol = plugin_settings[key] - } - } - return symbol - } - - getStyle(feature: Feature, _: unknown):Style[] { - const styles: Style[] = [] - - // Apply Shadow - styles.push( - new Style({ - image: new Shadow({ - radius: 15, - blur: 5, - offsetX: 0, - offsetY: 0, - fill: new Fill({ - color: 'rgba(0,0,0,0.5)' - }) - }) - }) - ) - - const self = this - - // Apply Font Style - styles.push( - new Style({ - image: new FontSymbol({ - form: 'blazon', - gradient: false, - glyph: self.getSymbol(feature), - fontSize: 0.7, - radius: 18, - offsetY: -18, - rotation: 0, - rotateWithView: false, - color: self.getFontColor(feature), - fill: new Fill({ - color: self.getColor(feature) - }), - stroke: new Stroke({ - color: '#333333', - width: 1 - }), - opacity: 1, - }), - stroke: new Stroke({ - width: 4, - color: self.getColor(feature) - }), - fill: new Fill({ - color: self.getColor(feature, true), - }) - }) - ) - - return styles - } - - /** - * - */ - setView() { - const center = fromLonLat([parseFloat(this.defaults.lon), parseFloat(this.defaults.lat)]) - const view = new View({ - // Avoid flicker (map move) - center: center, - zoom: parseInt(this.defaults.zoom), - maxZoom: parseInt(this.defaults.maxzoom), // applies for Mierune Tiles - rotation: degreesToRadians(parseInt(this.map.getTargetElement().getAttribute("data-rotation"))) - }) - this.map.setView(view) - } - - /** - * - */ - zoomToExtent(force: boolean = true) { - if (!force && (this.filters.distance || this.filters.location)) { - // Do not zoom to extent but show the previous extent stored as cookie - const parts = (getCookie("_redmine_gtt_permalink")).split("/"); - this.maps.forEach(m => { - m.getView().setZoom(parseInt(parts[0], 10)) - m.getView().setCenter(transform([ - parseFloat(parts[1]), - parseFloat(parts[2]) - ],'EPSG:4326','EPSG:3857')) - m.getView().setRotation(parseFloat(parts[3])) - }) - } else if (this.vector.getSource().getFeatures().length > 0) { - let extent = createEmpty() - // Because the vector layer is set to "useSpatialIndex": false, we cannot - // make use of "vector.getSource().getExtent()" - this.vector.getSource().getFeatures().forEach(feature => { - extend(extent, feature.getGeometry().getExtent()) - }) - this.maps.forEach(m => { - m.getView().fit(extent, { - size: getMapSize(m), - maxZoom: parseInt(this.defaults.fitMaxzoom) - }) - }) - } else if (this.bounds.getSource().getFeatures().length > 0) { - this.maps.forEach(m => { - m.getView().fit(this.bounds.getSource().getExtent(), { - size: getMapSize(m), - maxZoom: parseInt(this.defaults.fitMaxzoom) - }) - }) - } else { - // Set default center, once - this.maps.forEach(m => { - m.getView().setCenter(transform([parseFloat(this.defaults.lon), parseFloat(this.defaults.lat)], - 'EPSG:4326', 'EPSG:3857')); - }) - this.geolocations.forEach(g => { - g.once('change:position', (evt) => { - this.maps.forEach(m => { - m.getView().setCenter(g.getPosition()) - }) - }) - }) - } - } - - /** - * Updates map settings for Redmine filter - */ - updateFilter() { - let center = this.map.getView().getCenter() - let extent = this.map.getView().calculateExtent(this.map.getSize()) - - center = transform(center,'EPSG:3857','EPSG:4326') - // console.log("Map Center (WGS84): ", center); - const fieldset = document.querySelector('fieldset#location') as HTMLFieldSetElement - if (fieldset) { - fieldset.dataset.center = JSON.stringify(center) - } - const value_distance_3 = document.querySelector('#tr_distance #values_distance_3') as HTMLInputElement - if (value_distance_3) { - value_distance_3.value = center[0].toString() - } - const value_distance_4 = document.querySelector('#tr_distance #values_distance_4') as HTMLInputElement - if (value_distance_4) { - value_distance_4.value = center[1].toString() - } - - // Set Permalink as Cookie - const cookie = [] - const hash = this.map.getView().getZoom() + '/' + - Math.round(center[0] * 1000000) / 1000000 + '/' + - Math.round(center[1] * 1000000) / 1000000 + '/' + - this.map.getView().getRotation() - cookie.push("_redmine_gtt_permalink=" + hash) - cookie.push("path=" + window.location.pathname) - document.cookie = cookie.join(";") - - const extent_str = transformExtent(extent,'EPSG:3857','EPSG:4326').join('|') - // console.log("Map Extent (WGS84): ",extent); - const bbox = document.querySelector('select[name="v[bbox][]"]') - if (bbox) { - const option = bbox.querySelector('option') as HTMLOptionElement - option.value = extent_str - } - // adjust the value of the 'On map' option tag - // Also adjust the JSON data that's the basis for building the filter row - // html (this is relevant if the map is moved first and then the filter is - // added.) - if(window.availableFilters && window.availableFilters.bbox) { - window.availableFilters.bbox.values = [['On map', extent]] - } - } - - - /** - * Parse page for WKT strings in history - */ - parseHistory() { - document.querySelectorAll('div#history ul.details i').forEach((item: Element) => { - const regex = new RegExp(/\b(?:POINT|LINESTRING|POLYGON)\b\s?(\({1,}[-]?\d+([,. ]\s?[-]?\d+)*\){1,})/gi) - const match = item.innerHTML.match(regex) - if (match !== null) { - const feature = new WKT().readFeature( - match.join(''), { - dataProjection: 'EPSG:4326', - featureProjection: 'EPSG:3857' - } - ) - let wkt = new WKT().writeFeature( - feature, { - dataProjection: 'EPSG:4326', - featureProjection: 'EPSG:3857', - decimals: 5 - } - ) - // Shorten long WKT's - if (wkt.length > 30) { - const parts = wkt.split(' ') - wkt = parts[0] + '...' + parts[parts.length - 1] - } - item.innerHTML = `${wkt}` - } - }) - } - - /** - * Add Geolocation functionality - */ - setGeolocation(currentMap: Map) { - const geolocation = new Geolocation({ - tracking: false, - projection: currentMap.getView().getProjection() - }) - this.geolocations.push(geolocation) - - geolocation.on('change', (evt) => { - // console.log({ - // accuracy: geolocation.getAccuracy(), - // altitude: geolocation.getAltitude(), - // altitudeAccuracy: geolocation.getAltitudeAccuracy(), - // heading: geolocation.getHeading(), - // speed: geolocation.getSpeed() - // }) - }) - geolocation.on('error', (error) => { - // TBD - console.error(error) - }) - - const accuracyFeature = new Feature() - geolocation.on('change:accuracyGeometry', (evt) => { - accuracyFeature.setGeometry(geolocation.getAccuracyGeometry()) - }) - - const positionFeature = new Feature() - positionFeature.setStyle(new Style({ - image: new Circle({ - radius: 6, - fill: new Fill({ - color: '#3399CC' - }), - stroke: new Stroke({ - color: '#fff', - width: 2 - }) - }) - })) - - geolocation.on('change:position', (evt) => { - const position = geolocation.getPosition() - positionFeature.setGeometry(position ? new Point(position) : null) - - const extent = currentMap.getView().calculateExtent(currentMap.getSize()) - if (!containsCoordinate(extent, position)) { - currentMap.getView().setCenter(position) - } - }) - - const geolocationLayer = new VectorLayer({ - source: new Vector({ - features: [accuracyFeature, positionFeature] - }) - }) - geolocationLayer.set('displayInLayerSwitcher', false) - currentMap.addLayer(geolocationLayer) - - // Control button - const geolocationCtrl = new Toggle({ - html: 'my_location', - title: this.i18n.control.geolocation, - active: false, - onToggle: (active: boolean) => { - geolocation.setTracking(active) - geolocationLayer.setVisible(active) - } - }) - this.toolbar.addControl(geolocationCtrl) - } - - /** - * Add Geocoding functionality - */ - setGeocoding(currentMap: Map):void { - - // Hack to add Geocoding buttons to text fields - // There should be a better way to do this - const geocoder = JSON.parse(this.defaults.geocoder) - if (geocoder.geocode_url && - geocoder.address_field_name && - document.querySelectorAll("#issue-form #attributes button.btn-geocode").length == 0) - { - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.textContent.includes(geocoder.address_field_name)) { - element.querySelectorAll('p').forEach(p_element => { - const button = document.createElement('button') as HTMLButtonElement - button.name = 'button' - button.type = 'button' - button.className = 'btn-geocode' - button.appendChild(document.createTextNode(geocoder.address_field_name)) - p_element.appendChild(button) - }) - } - }) - - document.querySelectorAll('button.btn-geocode').forEach(element => { - element.addEventListener('click', (evt) => { - // Geocode address and add/update icon on map - const button = evt.currentTarget as HTMLButtonElement - if (button.previousElementSibling.querySelector('input').value != '') { - const address = button.previousElementSibling.querySelector('input').value - const geocode_url = geocoder.geocode_url.replace("{address}", encodeURIComponent(address)) - fetch(geocode_url) - .then(response => response.json()) - .then(data => { - const check = evaluateComparison(getObjectPathValue(data, geocoder.geocode_result_check_path), - geocoder.geocode_result_check_operator, - geocoder.geocode_result_check_value - ) - if (check) { - const lon = getObjectPathValue(data, geocoder.geocode_result_lon_path) - const lat = getObjectPathValue(data, geocoder.geocode_result_lat_path) - const coords = [lon, lat] - const geom = new Point(fromLonLat(coords, 'EPSG:3857')) - const features = this.vector.getSource().getFeatures() - if (features.length > 0) { - features[features.length - 1].setGeometry(geom) - } else { - const feature = new Feature(geom) - this.vector.getSource().addFeatures([feature]) - } - this.updateForm(this.vector.getSource().getFeatures()) - this.zoomToExtent(true) - - const _districtInput = document.querySelectorAll(`#issue-form #attributes label`) - let districtInput: HTMLInputElement = null - _districtInput.forEach(element => { - if (element.innerHTML.includes(geocoder.district_field_name)) { - districtInput = element.parentNode.querySelector('p').querySelector('input') - } - }) - let foundDistrict = false - if (districtInput) { - const district = getObjectPathValue(data, geocoder.geocode_result_district_path) - if (district) { - const regexp = new RegExp(geocoder.geocode_result_district_regexp) - const match = regexp.exec(district) - if (match && match.length === 2) { - districtInput.value = match[1] - foundDistrict = true - } - } - if (!foundDistrict) { - if (districtInput) { - districtInput.value = "" - } - } - } - } - }) - } - }) - }) - } - - if (geocoder.place_search_url && - geocoder.place_search_field_name && - document.querySelectorAll("#issue-form #attributes button.btn-placesearch").length == 0 ) - { - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.innerHTML.includes(geocoder.place_search_field_name)) { - element.querySelectorAll('p').forEach(p_element => { - const button = document.createElement('button') as HTMLButtonElement - button.name = 'button' - button.type = 'button' - button.className = 'btn-placesearch' - button.appendChild(document.createTextNode(geocoder.place_search_field_name)) - p_element.appendChild(button) - }) - } - }) - - document.querySelectorAll("button.btn-placesearch").forEach(element => { - element.addEventListener('click', () => { - if (this.vector.getSource().getFeatures().length > 0) { - let coords = null - this.vector.getSource().getFeatures().forEach((feature) => { - // Todo: only works with point geometries for now for the last geometry - coords = getCenter(feature.getGeometry().getExtent()) - }) - coords = transform(coords, 'EPSG:3857', 'EPSG:4326') - const place_search_url = geocoder.place_search_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString()) - fetch(place_search_url) - .then(response => response.json()) - .then(data => { - const list:Array = getObjectPathValue(data, geocoder.place_search_result_list_path) - if (list.length > 0) { - const modal = document.querySelector('#ajax-modal') as HTMLDivElement - modal.innerHTML = ` -

${geocoder.place_search_result_ui_title}

-
-

- -

- ` - modal.classList.add('place_search_results') - list.forEach(item => { - const display = getObjectPathValue(item, geocoder.place_search_result_display_path) - const value = getObjectPathValue(item, geocoder.place_search_result_value_path) - if (display && value) { - const places = document.querySelector('div#places') as HTMLDivElement - const input = document.createElement('input') as HTMLInputElement - input.type = 'radio' - input.name = 'places' - input.value = value - input.appendChild(document.createTextNode(display)) - places.appendChild(input) - places.appendChild(document.createElement('br')) - } - }) - window.showModal('ajax-model', '400px') - document.querySelector("p.buttons input[type='submit']").addEventListener('click', () => { - let input: HTMLInputElement = null - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.innerHTML.includes(geocoder.place_search_field_name)) { - input = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement - } - }) - if (input) { - input.value = (document.querySelector("div#places input[type='radio']:checked") as HTMLInputElement).value - } - }) - } else { - let input: HTMLInputElement = null - document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { - if (element.innerHTML.includes(geocoder.place_search_field_name)) { - input = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement - } - }) - if (input) { - input.value = geocoder.empty_field_value - } - } - }) - } - }) - }) - } - - // disable geocoding control if plugin setting is not true - if (this.contents.geocoding !== "true") { - return - } - - const mapId = currentMap.getTargetElement().getAttribute("id") - - // Control button - const geocodingCtrl = new Toggle({ - html: 'manage_search', - title: this.i18n.control.geocoding, - className: "ctl-geocoding", - onToggle: (active: boolean) => { - const text = (document.querySelector("div#" + mapId + " .ctl-geocoding div input") as HTMLInputElement) - if (active) { - text.focus() - } else { - text.blur() - const button = document.querySelector("div#" + mapId + " .ctl-geocoding button") - button.blur() - } - }, - bar: new Bar({ - controls: [ - new TextButton({ - html: '
' - }) - ] - }) - }) - this.toolbar.addControl(geocodingCtrl) - - // Make Geocoding API request - document.querySelector("div#" + mapId + " .ctl-geocoding div input").addEventListener('keydown', (evt) => { - if (evt.keyCode === 13) { - evt.preventDefault() - evt.stopPropagation() - } else { - return true - } - - if (!geocoder.geocode_url) { - throw new Error ("No Geocoding service configured!") - } - - const url = geocoder.geocode_url.replace("{address}", encodeURIComponent( - (document.querySelector("div#" + mapId + " .ctl-geocoding form input[name=address]") as HTMLInputElement).value) - ) - - fetch(url) - .then(response => response.json()) - .then(data => { - const check = evaluateComparison(getObjectPathValue(data, geocoder.geocode_result_check_path), - geocoder.geocode_result_check_operator, - geocoder.geocode_result_check_value - ) - if (check) { - const lon = getObjectPathValue(data, geocoder.geocode_result_lon_path) - const lat = getObjectPathValue(data, geocoder.geocode_result_lat_path) - const coords = [lon, lat] - const geom = new Point(fromLonLat(coords, 'EPSG:3857')) - currentMap.getView().fit(geom.getExtent(), { - size: currentMap.getSize(), - maxZoom: parseInt(this.defaults.fitMaxzoom) - }) - } - }) - - return false - }) - } - - reloadFontSymbol() { - if ('fonts' in document) { - const symbolFonts: Array = [] - for (const font in FontSymbol.defs.fonts) { - symbolFonts.push(font) - } - if (symbolFonts.length > 0) { - (document as any).fonts.addEventListener('loadingdone', (e: any) => { - const fontIndex = e.fontfaces.findIndex((font: any) => { - return symbolFonts.indexOf(font.family) >= 0 - }) - if (fontIndex >= 0) { - this.maps.forEach(m => { - const layers = m.getLayers() - layers.forEach(layer => { - if (layer instanceof VectorLayer && - layer.getKeys().indexOf("title") >= 0 && - layer.get("title") === "Features") { - const features = layer.getSource().getFeatures() - const pointIndex = features.findIndex((feature: Feature) => { - return feature.getGeometry().getType() === "Point" - }) - if (pointIndex >= 0) { - // console.log("Reloading Features layer") - layer.changed() - } - } - }) - }) - } - }) - } - } - } - - toggleAndLoadMap(el: HTMLLegendElement) { - const fieldset = el.parentElement - fieldset.classList.toggle('collapsed') - el.classList.toggle('icon-expended') - el.classList.toggle('icon-collapsed') - const div = fieldset.querySelector('div') - if (div.style.display === 'none') { - div.style.display = 'block' - } else { - div.style.display = 'none' - } - this.maps.forEach(function (m) { - m.updateSize() - }) - } -} - -const getLayerSource = (source: string, class_name: string): TileLayerSource | ImageLayerSource | undefined => { - if (source === 'source') { - if (class_name === 'OSM') { - return { layer: Tile, source: OSM } - } else if (class_name === 'XYZ') { - return { layer: Tile, source: XYZ } - } else if (class_name === 'TileWMS') { - return { layer: Tile, source: TileWMS } - } else if (class_name === 'ImageWMS') { - return { layer: Image, source: ImageWMS } - } - } - return undefined -} - -const getCookie = (cname:string):string => { - var name = cname + '=' - var ca = document.cookie.split(';') - for(var i = 0; i < ca.length; i++) { - var c = ca[i] - while (c.charAt(0) == ' ') { - c = c.substring(1) - } - if (c.indexOf(name) == 0) { - return c.substring(name.length, c.length) - } - } - return '' -} - -const radiansToDegrees = (radians: number) => { - let degrees = radians * (180 / Math.PI) - degrees = (degrees % 360 + 360) % 360 - return degrees -} - -const degreesToRadians = (degrees: number) => { - return degrees * (Math.PI / 180) -} - -const getMapSize = (map: Map) => { - let size = map.getSize() - if (size.length === 2 && size[0] <= 0 && size[1] <= 0) { - const target = map.getTarget() as HTMLElement - const target_obj = document.querySelector(`div#${target.id}`) - size = [ - target_obj.clientWidth, - target_obj.clientHeight - ] - } - return size -} - -const evaluateComparison = (left: any, operator: any, right: any): any => { - if (typeof left == 'object') { - left = JSON.stringify(left) - return Function('"use strict";return (JSON.parse(\'' + left + '\')' + operator + right + ')')() - } else { - return Function('"use strict";return (' + left + operator + right + ')')() - } -} - -const getObjectPathValue = (obj: any, path: any, def: any = null) => { - const stringToPath = function (path: any) { - if (typeof path !== 'string') { - return path - } - var output: Array = [] - path.split('.').forEach(item => { - item.split(/\[([^}]+)\]/g).forEach(key => { - if (key.length > 0) { - output.push(key) - } - }) - }) - return output - } - - path = stringToPath(path) - let current = obj - for (var i = 0; i < path.length; i++) { - if (!current[path[i]]) { - return def - } - current = current[path[i]] - } - - return current -} - -/** - * Extend core Redmine's buildFilterRow method - */ -window.buildFilterRowWithoutDistanceFilter = window.buildFilterRow; -window.buildFilterRow = function(field, operator, values) { - if (field == 'distance') { - buildDistanceFilterRow(operator, values) - } else { - window.buildFilterRowWithoutDistanceFilter(field, operator, values) - } -} - -const buildDistanceFilterRow = (operator: any, values: any):void => { - const field = 'distance' - const fieldId = field - const filterTable = document.querySelector('#filters-table') as HTMLTableElement - const filterOptions = window.availableFilters[field] - if (!filterOptions) { - return - } - const operators = window.operatorByType[filterOptions['type']] - const filterValues = filterOptions['values'] - - const tr = document.createElement('tr') as HTMLTableRowElement - tr.className = 'filter' - tr.id = `tr_${fieldId}` - tr.innerHTML = ` - - - - - - - - - - - - - `; - (document.querySelector(`#values_${fieldId}_1`) as HTMLInputElement).value = values[0] - let base_idx = 1 - if (values.length == 2 || values.length == 4) { - // upper bound for 'between' operator - (document.querySelector(`#values_${fieldId}_2`) as HTMLInputElement).value = values[1] - base_idx = 2 - } - let x, y - if (values.length > 2) { - // console.log('distance center point from values: ', values[base_idx], values[base_idx+1]); - x = values[base_idx] - y = values[base_idx+1] - } else { - // console.log('taking distance from map fieldset: ', $('fieldset#location').data('center')); - const fieldset = document.querySelector('fieldset#location') as HTMLFieldSetElement - if (!fieldset.dataset.center) { - return - } - const xy = JSON.parse(fieldset.dataset.center) - x = xy[0] - y = xy[1] - } - (document.querySelector(`#values_${fieldId}_3`) as HTMLInputElement).value = x; - (document.querySelector(`#values_${fieldId}_4`) as HTMLInputElement).value = y; -} - -window.replaceIssueFormWithInitMap = window.replaceIssueFormWith -window.replaceIssueFormWith = (html) => { - window.replaceIssueFormWithInitMap(html) - const ol_maps = document.querySelector("form[class$='_issue'] div.ol-map") as HTMLDivElement - if (ol_maps) { - new GttClient({target: ol_maps}) - } -} diff --git a/src/components/gtt-client/GttClient.ts b/src/components/gtt-client/GttClient.ts new file mode 100644 index 00000000..184ed5f5 --- /dev/null +++ b/src/components/gtt-client/GttClient.ts @@ -0,0 +1,58 @@ +import { Map, Geolocation } from 'ol'; +import { Geometry } from 'ol/geom'; +import { Vector as VectorLayer } from 'ol/layer'; +import { Vector as VectorSource } from 'ol/source'; + +import { IGttClientOption, IFilterOption } from './interfaces'; + +import { initDefaults, initFilters } from './init/defaults'; +import { initContents, setTabIndex } from './init/contents'; +import { initMap } from './init/map'; +import { initLayers } from './init/layers'; +import { initControls } from './init/controls'; +import { initEventListeners } from './init/events'; + +/** + * GttClient is a class representing a geospatial application client. + * It initializes and manages map instances, map-related settings, + * layers, controls, and event listeners. + */ +export default class GttClient { + readonly map: Map; + maps: Array; + defaults: DOMStringMap; + contents: DOMStringMap; + i18n: any; + filters: IFilterOption; + vector: VectorLayer>; + bounds: VectorLayer>; + geolocations: Array; + + /** + * Constructs a new GttClient instance. + * @param target - The HTMLElement where the map will be rendered. + */ + constructor({ target }: IGttClientOption) { + if (!target) return; + + // Set tabindex for map div focus settings + setTabIndex(target); + + // Initialize class properties + this.maps = []; + this.geolocations = []; + this.defaults = initDefaults(); + this.filters = initFilters(); + this.contents = initContents(target); + this.i18n = JSON.parse(this.defaults.i18n); + + // Initialize map, layers, controls, and event listeners + this.map = initMap(target, this.i18n); + initLayers.call(this); + initControls.call(this); + initEventListeners.call(this); + + // Add the initialized map to the maps array + this.maps.push(this.map); + } +} diff --git a/src/components/gtt-client/constants.ts b/src/components/gtt-client/constants.ts new file mode 100644 index 00000000..87a9013a --- /dev/null +++ b/src/components/gtt-client/constants.ts @@ -0,0 +1,23 @@ +// Define an interface named Constants which enforces readonly properties for +// lon, lat, zoom, maxzoom, fitMaxzoom, and geocoder. This interface is used to +// ensure that the 'constants' object conforms to a specific structure. +export interface Constants { + readonly lon: number; + readonly lat: number; + readonly zoom: number; + readonly maxzoom: number; + readonly fitMaxzoom: number; + readonly geocoder: Record; +} + +// Define a constant object named 'constants' of type Constants and specify its values. +// This object holds default values for map-related settings, such as longitude, +// latitude, zoom levels, and geocoder settings. +export const constants: Constants = { + lon: 139.691706, + lat: 35.689524, + zoom: 13, + maxzoom: 19, + fitMaxzoom: 17, + geocoder: {}, +}; diff --git a/src/components/gtt-client/geocoding/index.ts b/src/components/gtt-client/geocoding/index.ts new file mode 100644 index 00000000..c6bd1906 --- /dev/null +++ b/src/components/gtt-client/geocoding/index.ts @@ -0,0 +1,250 @@ +import { Map, Feature } from 'ol'; +import { Point } from 'ol/geom'; +import { transform, fromLonLat } from 'ol/proj'; +import { getCenter } from 'ol/extent'; +import Bar from 'ol-ext/control/Bar'; +import Toggle from 'ol-ext/control/Toggle'; +import TextButton from 'ol-ext/control/TextButton'; + +import { evaluateComparison, getObjectPathValue } from '../helpers'; + +/** + * Add Geocoding functionality + */ +export function setGeocoding(currentMap: Map):void { + + // Hack to add Geocoding buttons to text fields + // There should be a better way to do this + const geocoder = JSON.parse(this.defaults.geocoder) + if (geocoder.geocode_url && + geocoder.address_field_name && + document.querySelectorAll("#issue-form #attributes button.btn-geocode").length == 0) + { + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.textContent.includes(geocoder.address_field_name)) { + element.querySelectorAll('p').forEach(p_element => { + const button = document.createElement('button') as HTMLButtonElement + button.name = 'button' + button.type = 'button' + button.className = 'btn-geocode' + button.appendChild(document.createTextNode(geocoder.address_field_name)) + p_element.appendChild(button) + }) + } + }) + + document.querySelectorAll('button.btn-geocode').forEach(element => { + element.addEventListener('click', (evt) => { + // Geocode address and add/update icon on map + const button = evt.currentTarget as HTMLButtonElement + if (button.previousElementSibling.querySelector('input').value != '') { + const address = button.previousElementSibling.querySelector('input').value + const geocode_url = geocoder.geocode_url.replace("{address}", encodeURIComponent(address)) + fetch(geocode_url) + .then(response => response.json()) + .then(data => { + const check = evaluateComparison(getObjectPathValue(data, geocoder.geocode_result_check_path), + geocoder.geocode_result_check_operator, + geocoder.geocode_result_check_value + ) + if (check) { + const lon = getObjectPathValue(data, geocoder.geocode_result_lon_path) + const lat = getObjectPathValue(data, geocoder.geocode_result_lat_path) + const coords = [lon, lat] + const geom = new Point(fromLonLat(coords, 'EPSG:3857')) + const features = this.vector.getSource().getFeatures() + if (features.length > 0) { + features[features.length - 1].setGeometry(geom) + } else { + const feature = new Feature(geom) + this.vector.getSource().addFeatures([feature]) + } + this.updateForm(this.vector.getSource().getFeatures()) + this.zoomToExtent(true) + + const _districtInput = document.querySelectorAll(`#issue-form #attributes label`) + let districtInput: HTMLInputElement = null + _districtInput.forEach(element => { + if (element.innerHTML.includes(geocoder.district_field_name)) { + districtInput = element.parentNode.querySelector('p').querySelector('input') + } + }) + let foundDistrict = false + if (districtInput) { + const district = getObjectPathValue(data, geocoder.geocode_result_district_path) + if (district) { + const regexp = new RegExp(geocoder.geocode_result_district_regexp) + const match = regexp.exec(district) + if (match && match.length === 2) { + districtInput.value = match[1] + foundDistrict = true + } + } + if (!foundDistrict) { + if (districtInput) { + districtInput.value = "" + } + } + } + } + }) + } + }) + }) + } + + if (geocoder.place_search_url && + geocoder.place_search_field_name && + document.querySelectorAll("#issue-form #attributes button.btn-placesearch").length == 0 ) + { + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.innerHTML.includes(geocoder.place_search_field_name)) { + element.querySelectorAll('p').forEach(p_element => { + const button = document.createElement('button') as HTMLButtonElement + button.name = 'button' + button.type = 'button' + button.className = 'btn-placesearch' + button.appendChild(document.createTextNode(geocoder.place_search_field_name)) + p_element.appendChild(button) + }) + } + }) + + document.querySelectorAll("button.btn-placesearch").forEach(element => { + element.addEventListener('click', () => { + if (this.vector.getSource().getFeatures().length > 0) { + let coords = null + this.vector.getSource().getFeatures().forEach((feature: any) => { + // Todo: only works with point geometries for now for the last geometry + coords = getCenter(feature.getGeometry().getExtent()) + }) + coords = transform(coords, 'EPSG:3857', 'EPSG:4326') + const place_search_url = geocoder.place_search_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString()) + fetch(place_search_url) + .then(response => response.json()) + .then(data => { + const list:Array = getObjectPathValue(data, geocoder.place_search_result_list_path) + if (list.length > 0) { + const modal = document.querySelector('#ajax-modal') as HTMLDivElement + modal.innerHTML = ` +

${geocoder.place_search_result_ui_title}

+
+

+ +

+ ` + modal.classList.add('place_search_results') + list.forEach(item => { + const display = getObjectPathValue(item, geocoder.place_search_result_display_path) + const value = getObjectPathValue(item, geocoder.place_search_result_value_path) + if (display && value) { + const places = document.querySelector('div#places') as HTMLDivElement + const input = document.createElement('input') as HTMLInputElement + input.type = 'radio' + input.name = 'places' + input.value = value + input.appendChild(document.createTextNode(display)) + places.appendChild(input) + places.appendChild(document.createElement('br')) + } + }) + window.showModal('ajax-model', '400px') + document.querySelector("p.buttons input[type='submit']").addEventListener('click', () => { + let input: HTMLInputElement = null + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.innerHTML.includes(geocoder.place_search_field_name)) { + input = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement + } + }) + if (input) { + input.value = (document.querySelector("div#places input[type='radio']:checked") as HTMLInputElement).value + } + }) + } else { + let input: HTMLInputElement = null + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.innerHTML.includes(geocoder.place_search_field_name)) { + input = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement + } + }) + if (input) { + input.value = geocoder.empty_field_value + } + } + }) + } + }) + }) + } + + // disable geocoding control if plugin setting is not true + if (this.contents.geocoding !== "true") { + return + } + + const mapId = currentMap.getTargetElement().getAttribute("id") + + // Control button + const geocodingCtrl = new Toggle({ + html: '', + title: this.i18n.control.geocoding, + className: "ctl-geocoding", + onToggle: (active: boolean) => { + const text = (document.querySelector("div#" + mapId + " .ctl-geocoding div input") as HTMLInputElement) + if (active) { + text.focus() + } else { + text.blur() + const button = document.querySelector("div#" + mapId + " .ctl-geocoding button") + button.blur() + } + }, + bar: new Bar({ + controls: [ + new TextButton({ + html: '
' + }) + ] + }) + }) + this.toolbar.addControl(geocodingCtrl) + + // Make Geocoding API request + document.querySelector("div#" + mapId + " .ctl-geocoding div input").addEventListener('keydown', (evt) => { + if (evt.keyCode === 13) { + evt.preventDefault() + evt.stopPropagation() + } else { + return true + } + + if (!geocoder.geocode_url) { + throw new Error ("No Geocoding service configured!") + } + + const url = geocoder.geocode_url.replace("{address}", encodeURIComponent( + (document.querySelector("div#" + mapId + " .ctl-geocoding form input[name=address]") as HTMLInputElement).value) + ) + + fetch(url) + .then(response => response.json()) + .then(data => { + const check = evaluateComparison(getObjectPathValue(data, geocoder.geocode_result_check_path), + geocoder.geocode_result_check_operator, + geocoder.geocode_result_check_value + ) + if (check) { + const lon = getObjectPathValue(data, geocoder.geocode_result_lon_path) + const lat = getObjectPathValue(data, geocoder.geocode_result_lat_path) + const coords = [lon, lat] + const geom = new Point(fromLonLat(coords, 'EPSG:3857')) + currentMap.getView().fit(geom.getExtent(), { + size: currentMap.getSize(), + maxZoom: parseInt(this.defaults.fitMaxzoom) + }) + } + }) + + return false + }) +} diff --git a/src/components/gtt-client/helpers/index.ts b/src/components/gtt-client/helpers/index.ts new file mode 100644 index 00000000..52d8ee28 --- /dev/null +++ b/src/components/gtt-client/helpers/index.ts @@ -0,0 +1,272 @@ +import { Map, Feature } from 'ol'; +import { Geometry, Point } from 'ol/geom'; +import { GeoJSON, WKT } from 'ol/format'; +import { FeatureCollection } from 'geojson'; +import { FeatureLike } from 'ol/Feature'; +import { transform, transformExtent } from 'ol/proj'; + +/** + * Get the value of a cookie by its name. + * + * @param cname - The name of the cookie. + * @returns The value of the cookie or an empty string if not found. + */ +export const getCookie = (cname: string): string => { + const name = cname + '='; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + return ''; +}; + +/** + * Convert radians to degrees. + * + * @param radians - The value in radians to convert. + * @returns The value in degrees. + */ +export const radiansToDegrees = (radians: number): number => { + const degrees = radians * (180 / Math.PI); + return (degrees + 360) % 360; +}; + +/** + * Convert degrees to radians. + * + * @param degrees - The value in degrees to convert. + * @returns The value in radians. + */ +export const degreesToRadians = (degrees: number): number => degrees * (Math.PI / 180); + +/** + * Get the map size, taking into account the possibility of width or height being 0. + * + * @param map - The OpenLayers Map object. + * @returns An array containing the width and height of the map. + */ +export const getMapSize = (map: Map): number[] => { + const [width, height] = map.getSize(); + + if (width <= 0 || height <= 0) { + const target = map.getTarget() as HTMLElement; + return [target.clientWidth, target.clientHeight]; + } + + return [width, height]; +}; + +/** + * Evaluate a comparison between two values with a specified operator. + * + * @param left - The left-hand side value of the comparison. + * @param operator - The operator to use in the comparison. + * @param right - The right-hand side value of the comparison. + * @returns The result of the comparison. + */ +export const evaluateComparison = (left: any, operator: any, right: any): any => { + if (typeof left == 'object') { + left = JSON.stringify(left); + return Function('"use strict";return (JSON.parse(\'' + left + '\')' + operator + right + ')')(); + } else { + return Function('"use strict";return (' + left + operator + right + ')')(); + } +}; + +/** + * Get the value of a nested property in an object using a path. + * + * @param obj - The object to get the value from. + * @param path - The path to the property in the object, either as a string or an array of strings. + * @param def - An optional default value to return if the property is not found. + * @returns The value of the property or the default value if not found. + */ +export const getObjectPathValue = (obj: any, path: string | Array, def: any = null) => { + const pathArr = Array.isArray(path) + ? path + : path.split('.').flatMap((key) => key.split(/\[([^}]+)\]/g).filter(Boolean)); + return pathArr.reduce((acc, key) => acc?.[key], obj) ?? def; +}; + +/** + * Update the form with the provided feature data. + * + * @param mapObj - The map object containing settings. + * @param features - The features to update the form with. + * @param updateAddressFlag - A flag to update the address field with reverse geocoding, default is false. + */ +export function updateForm(mapObj: any, features: FeatureLike[] | null, updateAddressFlag: boolean = false):void { + if (features == null) { + return + } + const geom = document.querySelector('#geom') as HTMLInputElement + if (!geom) { + return + } + + const writer = new GeoJSON() + // Convert to Feature type for GeoJSON writer + const new_features: Feature[] = features.map((feature => { + return new Feature({geometry: feature.getGeometry() as Geometry}) + })) + const geojson_str = writer.writeFeatures(new_features, { + featureProjection: 'EPSG:3857', + dataProjection: 'EPSG:4326' + }) + const geojson = JSON.parse(geojson_str) as FeatureCollection + geom.value = JSON.stringify(geojson.features[0]) + + const geocoder = JSON.parse(mapObj.defaults.geocoder) + if (updateAddressFlag && geocoder.address_field_name && features && features.length > 0) { + let addressInput: HTMLInputElement = null + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.innerHTML.includes(geocoder.address_field_name)) { + addressInput = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement + } + }) + if (addressInput) { + // Todo: only works with point geometries for now for the last geometry + const geom = features[features.length - 1].getGeometry() as Point + if (geom === null) { + return + } + let coords = geom.getCoordinates() + coords = transform(coords, 'EPSG:3857', 'EPSG:4326') + const reverse_geocode_url = geocoder.reverse_geocode_url.replace("{lon}", coords[0].toString()).replace("{lat}", coords[1].toString()) + fetch(reverse_geocode_url) + .then(response => response.json()) + .then(data => { + const check = evaluateComparison(getObjectPathValue(data, geocoder.reverse_geocode_result_check_path), + geocoder.reverse_geocode_result_check_operator, + geocoder.reverse_geocode_result_check_value) + let districtInput: HTMLInputElement = null + document.querySelectorAll(`#issue-form #attributes label`).forEach(element => { + if (element.innerHTML.includes(geocoder.district_field_name)) { + districtInput = element.parentNode.querySelector('p').querySelector('input') as HTMLInputElement + } + }) + const address = getObjectPathValue(data, geocoder.reverse_geocode_result_address_path) + let foundDistrict = false + if (check && address) { + addressInput.value = address + if (districtInput) { + const district = getObjectPathValue(data, geocoder.reverse_geocode_result_district_path) + if (district) { + const regexp = new RegExp(geocoder.reverse_geocode_result_district_regexp) + const match = regexp.exec(district) + if (match && match.length === 2) { + districtInput.value = match[1] + foundDistrict = true + } + } + } + } else { + addressInput.value = geocoder.empty_field_value + } + if (!foundDistrict) { + if (districtInput) { + districtInput.value = '' + } + } + }) + } + } + +} + +/** + * Update the map settings for the Redmine filter. + */ +export function updateFilter() { + let center = this.map.getView().getCenter() + let extent = this.map.getView().calculateExtent(this.map.getSize()) + + center = transform(center,'EPSG:3857','EPSG:4326') + // console.log("Map Center (WGS84): ", center); + const fieldset = document.querySelector('fieldset#location') as HTMLFieldSetElement + if (fieldset) { + fieldset.dataset.center = JSON.stringify(center) + } + const value_distance_3 = document.querySelector('#tr_distance #values_distance_3') as HTMLInputElement + if (value_distance_3) { + value_distance_3.value = center[0].toString() + } + const value_distance_4 = document.querySelector('#tr_distance #values_distance_4') as HTMLInputElement + if (value_distance_4) { + value_distance_4.value = center[1].toString() + } + + // Set Permalink as Cookie + const cookie = [] + const hash = this.map.getView().getZoom() + '/' + + Math.round(center[0] * 1000000) / 1000000 + '/' + + Math.round(center[1] * 1000000) / 1000000 + '/' + + this.map.getView().getRotation() + cookie.push("_redmine_gtt_permalink=" + hash) + cookie.push("path=" + window.location.pathname) + document.cookie = cookie.join(";") + + const extent_str = transformExtent(extent,'EPSG:3857','EPSG:4326').join('|') + // console.log("Map Extent (WGS84): ",extent); + const bbox = document.querySelector('select[name="v[bbox][]"]') + if (bbox) { + const option = bbox.querySelector('option') as HTMLOptionElement + option.value = extent_str + } + // adjust the value of the 'On map' option tag + // Also adjust the JSON data that's the basis for building the filter row + // html (this is relevant if the map is moved first and then the filter is + // added.) + if(window.availableFilters && window.availableFilters.bbox) { + window.availableFilters.bbox.values = [['On map', extent]] + } +} + +/** + * Parse the history of the page for WKT strings and replace them with formatted links. + */ +export function parseHistory() { + const historyItems = document.querySelectorAll('div#history ul.details i'); + + const regex = /\b(?:POINT|LINESTRING|POLYGON)\b\s?\({1,}[-]?\d+([,. ]\s?[-]?\d+)*\){1,}/gi; + const dataProjection = 'EPSG:4326'; + const featureProjection = 'EPSG:3857'; + + const parseAndFormatWKT = (wkt: string) => { + const feature = new WKT().readFeature(wkt, { dataProjection, featureProjection }); + let formattedWKT = new WKT().writeFeature(feature, { dataProjection, featureProjection, decimals: 5 }); + + if (formattedWKT.length > 30) { + const parts = formattedWKT.split(' '); + formattedWKT = `${parts[0]}...${parts[parts.length - 1]}`; + } + + return formattedWKT; + }; + + historyItems.forEach((item: Element) => { + const match = item.innerHTML.match(regex); + + if (match !== null) { + const wkt = parseAndFormatWKT(match.join('')); + + const link = document.createElement('a'); + link.href = '#'; + link.classList.add('wkt'); + link.dataset.feature = match.join(''); + link.textContent = wkt; + + // Replace current node with new link. + item.replaceWith(link); + } + }); +} + diff --git a/src/components/gtt-client/index.ts b/src/components/gtt-client/index.ts new file mode 100644 index 00000000..66a5ce0d --- /dev/null +++ b/src/components/gtt-client/index.ts @@ -0,0 +1,12 @@ +// Export all members from the 'redmine' module file. +export * from './redmine'; + +// Import OpenLayers and OpenLayers-Extensions styles +import 'ol/ol.css'; +import 'ol-ext/dist/ol-ext.min.css'; + +// Import the GttClient class from the 'GttClient' module file and re-export +// it as the default export of this module file. This allows other modules +// to import the GttClient class directly from this file. +import GttClient from './GttClient'; +export { GttClient }; diff --git a/src/components/gtt-client/init/contents.ts b/src/components/gtt-client/init/contents.ts new file mode 100644 index 00000000..15d6b1d8 --- /dev/null +++ b/src/components/gtt-client/init/contents.ts @@ -0,0 +1,18 @@ +/** + * Retrieves the dataset of the given target HTMLElement. + * @param target - The HTMLElement for which the dataset will be returned. + * @returns - The dataset of the given target HTMLElement. + */ +export function initContents(target: HTMLElement): DOMStringMap { + return target.dataset; +} + +/** + * Sets the tabindex attribute of the given target HTMLElement to '0' if it's not already set. + * @param target - The HTMLElement for which the tabindex attribute will be set. + */ +export function setTabIndex(target: HTMLElement): void { + if (target.getAttribute('tabindex') === null) { + target.setAttribute('tabindex', '0'); + } +} diff --git a/src/components/gtt-client/init/controls.ts b/src/components/gtt-client/init/controls.ts new file mode 100644 index 00000000..66412323 --- /dev/null +++ b/src/components/gtt-client/init/controls.ts @@ -0,0 +1,111 @@ +import { FullScreen, Rotate } from 'ol/control'; +import Bar from 'ol-ext/control/Bar'; +import Button from 'ol-ext/control/Button'; +import LayerPopup from 'ol-ext/control/LayerPopup'; +import LayerSwitcher from 'ol-ext/control/LayerSwitcher'; +import { position } from 'ol-ext/control/control'; + +import { setGeocoding } from "../geocoding"; +import { radiansToDegrees, degreesToRadians, parseHistory } from "../helpers"; +import { zoomToExtent, setGeolocation, setView, setControls, setPopover } from "../openlayers"; + +/** + * Adds the toolbar and basic controls to the map instance. + * @param {any} instance - The GttClient instance. + */ +function addToolbarAndControls(instance: any): void { + instance.toolbar = new Bar(); + instance.toolbar.setPosition('bottom-left' as position); + instance.map.addControl(instance.toolbar); + + setView.call(instance); + setGeocoding.call(instance, instance.map); + setGeolocation.call(instance, instance.map); + parseHistory.call(instance); +} + +/** + * Adds the FullScreen and Rotate controls to the map instance. + * @param {any} instance - The GttClient instance. + */ +function addFullScreenAndRotateControls(instance: any): void { + instance.map.addControl(new FullScreen({ + tipLabel: instance.i18n.control.fullscreen + })); + + instance.map.addControl(new Rotate({ + tipLabel: instance.i18n.control.rotate + })); +} + +/** + * Adds the maximize control button to the toolbar. + * @param {any} instance - The GttClient instance. + */ +function addMaximizeControl(instance: any): void { + const maximizeCtrl = new Button({ + html: '', + title: instance.i18n.control.maximize, + handleClick: () => { + zoomToExtent.call(instance, true); + } + }); + + instance.toolbar.addControl(maximizeCtrl); +} + +/** + * Handles the map rotation functionality. + * @param {any} instance - The GttClient instance. + */ +function handleMapRotation(instance: any): void { + const rotationField = document.querySelector('#gtt_configuration_map_rotation') as HTMLInputElement; + + if (rotationField !== null) { + instance.map.getView().on('change:rotation', (evt: any) => { + rotationField.value = String(Math.round(radiansToDegrees(evt.target.getRotation()))); + }); + + rotationField.addEventListener("input", (evt: any) => { + const { target } = evt; + if (!(target instanceof HTMLInputElement)) { + return; + } + const value = target.value; + instance.map.getView().setRotation(degreesToRadians(parseInt(value))); + }); + } +} + +/** + * Adds either a LayerSwitcher or LayerPopup control to the map instance. + * @param {any} instance - The GttClient instance. + */ +function addLayerSwitcherOrPopup(instance: any): void { + if (instance.containsOverlay) { + instance.map.addControl(new LayerSwitcher({ + reordering: false + })); + } else { + instance.map.addControl(new LayerPopup()); + } +} + +/** + * Initializes the controls for the GttClient instance. + * @this {any} - The GttClient instance. + */ +export function initControls(this: any): void { + addToolbarAndControls(this); + addFullScreenAndRotateControls(this); + addMaximizeControl(this); + handleMapRotation(this); + + if (this.contents.edit) { + setControls.call(this, this.contents.edit.split(' ')); + } else if (this.contents.popup) { + setPopover.call(this); + } + + addLayerSwitcherOrPopup(this); +} diff --git a/src/components/gtt-client/init/defaults.ts b/src/components/gtt-client/init/defaults.ts new file mode 100644 index 00000000..64a4fb9c --- /dev/null +++ b/src/components/gtt-client/init/defaults.ts @@ -0,0 +1,34 @@ +import { constants } from '../constants'; +import { IFilterOption } from '../interfaces'; + +/** + * Initializes default settings by retrieving the dataset from the element with the + * ID 'gtt-defaults'. If the dataset doesn't have a value for a property, a default + * value from the 'constants' object is used. + * @returns - An object containing the initialized default settings. + */ +export function initDefaults(): DOMStringMap { + const gtt_defaults = document.querySelector('#gtt-defaults') as HTMLDivElement; + if (!gtt_defaults) { + return {}; + } + + const defaults = gtt_defaults.dataset; + + // Set default values for missing properties + Object.entries(constants).forEach(([key, value]) => { + if (!defaults[key]) { + defaults[key] = value.toString(); + } + }); + + return defaults; +} + +/** + * Initializes filter options with default values. + * @returns - An object containing the initialized filter options. + */ +export function initFilters(): IFilterOption { + return { location: false, distance: false }; +} diff --git a/src/components/gtt-client/init/events.ts b/src/components/gtt-client/init/events.ts new file mode 100644 index 00000000..37fb3e17 --- /dev/null +++ b/src/components/gtt-client/init/events.ts @@ -0,0 +1,131 @@ +import { ResizeObserver } from '@juggle/resize-observer'; + +import { updateFilter } from "../helpers"; +import { zoomToExtent } from "../openlayers"; + +/** + * Initialize event listeners for the GttClient instance. + */ +export function initEventListeners(this: any): void { + handlePostRender.call(this); + handleCollapsed.call(this); + handleResize.call(this); + handleIssueSelection.call(this); + handleEditIcon.call(this); + handleGttTabActivation.call(this); + handleFilters.call(this); +} + +/** + * Handles 'postrender' event to fix empty map issue by zooming to extent. + */ +function handlePostRender(this: any): void { + this.map.once('postrender', (evt: any) => { + zoomToExtent.call(this, true); + }); +} + +/** + * Observes map element to zoom to extent when map is expanded from a collapsed state. + */ +function handleCollapsed(this: any): void { + if (this.contents.collapsed) { + const collapsedObserver = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.attributeName !== 'style') { + return; + } + const mapDiv = mutation.target as HTMLDivElement; + if (mapDiv && (mapDiv.style.display === 'block' || mapDiv.style.display === '')) { + zoomToExtent.call(this, true); + collapsedObserver.disconnect(); + } + }); + }); + collapsedObserver.observe(this.map.getTargetElement(), { attributes: true, attributeFilter: ['style'] }); + } +} + +/** + * Handles map resizing for multiple maps by observing the map target element. + */ +function handleResize(this: any): void { + const resizeObserver = new ResizeObserver((entries, observer) => { + this.maps.forEach((m: any) => { + m.updateSize(); + }); + }); + resizeObserver.observe(this.map.getTargetElement()); +} + +/** + * Handles issue selection to zoom to selected map features when a table row is clicked. + */ +function handleIssueSelection(this: any): void { + document.querySelectorAll('table.issues tbody tr').forEach((element: HTMLTableRowElement) => { + element.addEventListener('click', (evt) => { + const currentTarget = evt.currentTarget as HTMLTableRowElement; + const id = currentTarget.id.split('-')[1]; + const feature = this.vector.getSource().getFeatureById(id); + + // Skip the click handler when there is no vector feature + if (!feature) { + return; + } + + this.map.getView().fit(feature.getGeometry().getExtent(), { + size: this.map.getSize(), + }); + }); + }); +} + + +/** + * Handles the click event on the edit icon to update the map size when the editable form is made visible. + */ +function handleEditIcon(this: any): void { + document.querySelectorAll('div.contextual a.icon-edit').forEach((element: HTMLAnchorElement) => { + element.addEventListener('click', () => { + setTimeout(() => { + this.maps.forEach((m: any) => { + m.updateSize(); + }); + zoomToExtent.call(this); + }, 200); + }); + }); +} + +/** + * Handles GTT tab activation to redraw the map when the tab is clicked. + */ +function handleGttTabActivation(this: any): void { + document.querySelectorAll('#tab-gtt').forEach((element) => { + element.addEventListener('click', () => { + this.maps.forEach((m: any) => { + m.updateSize(); + }); + zoomToExtent.call(this); + }); + }); +} + +/** + * Handles map filters and load event listeners for updating the map view. + */ +function handleFilters(this: any): void { + window.addEventListener('load', () => { + // Check if location filter is available + if (document.querySelectorAll('tr#tr_bbox').length > 0) { + this.filters.location = true; + } + // Check if distance filter is available + if (document.querySelectorAll('tr#tr_distance').length > 0) { + this.filters.distance = true; + } + // Call zoomToExtent and updateFilter functions + zoomToExtent.call(this); + this.map.on('moveend', updateFilter.bind(this)); + }); +} diff --git a/src/components/gtt-client/init/layers.ts b/src/components/gtt-client/init/layers.ts new file mode 100644 index 00000000..e078f82f --- /dev/null +++ b/src/components/gtt-client/init/layers.ts @@ -0,0 +1,241 @@ +import { Feature } from 'ol'; +import * as olLayer from 'ol/layer'; +import * as olSource from 'ol/source'; +import * as olFormat from 'ol/format'; +import { Layer, Vector as VectorLayer } from 'ol/layer'; +import { Vector as VectorSource } from 'ol/source'; +import { GeoJSON } from 'ol/format'; +import { Geometry } from 'ol/geom'; +import { Style, Fill, Stroke } from 'ol/style'; +import { OrderFunction } from 'ol/render'; + +import Ordering from 'ol-ext/render/Ordering'; +import Mask from 'ol-ext/filter/Mask'; +import { applyStyle } from 'ol-mapbox-style'; + +import { ILayerObject } from '../interfaces'; +import { updateForm } from "../helpers"; +import { setBasemap } from "../openlayers"; +import { getStyle } from "../openlayers/styles"; + +/** + * Initializes layers for the OpenLayers map and adds them to the layerArray. + * @returns {Layer[]} Array of layers added to the map. + */ +export function initLayers(this: any): Layer[] { + this.layerArray = []; + + const features = readGeoJSONFeatures.call(this); + updateForm(this, features); + + if (this.contents.layers) { + createLayers.call(this); + addLayersToMap.call(this); + } + else { + return; + } + + setBasemap.call(this); + addBoundsLayer.call(this); + addVectorLayer.call(this, features); + renderProjectBoundary.call(this); + + return this.layerArray; +} + +/** + * Reads GeoJSON features from the provided input. + * @returns {Feature[] | null} Array of GeoJSON features or null if no features found. + */ +function readGeoJSONFeatures(this: any): Feature[] | null { + if (this.contents.geom && this.contents.geom !== null && this.contents.geom !== 'null') { + return new GeoJSON().readFeatures( + JSON.parse(this.contents.geom), { + featureProjection: 'EPSG:3857' + } + ); + } + return null; +} + +/** + * Creates layers based on the input data and adds them to the layerArray. + */ +function createLayers(this: any): void { + const layers = JSON.parse(this.contents.layers) as [ILayerObject]; + layers.forEach((config) => { + + const LayerClass = olLayer[config.layer as keyof typeof olLayer] as typeof olLayer.Layer; + const layerOptions = config.layer_options as any; + layerOptions['visible'] = false; + + if (config.source) { + const SourceClass = olSource[config.source as keyof typeof olSource] as typeof olSource.Source; + const sourceOptions = config.source_options; + layerOptions['source'] = new SourceClass(sourceOptions); + } + + if (config.format) { + const FormatClass = olFormat[config.format as keyof typeof olFormat] as any; + const formatOptions = config.format_options; + layerOptions['format'] = new FormatClass(formatOptions); + } + + const layer = new LayerClass(layerOptions); + + if (layer) { + // Apply style URL if provided + if ("styleUrl" in layerOptions) { + applyStyle(layer as any, layerOptions.styleUrl); + } + + setLayerProperties(layer, config); + handleLayerVisibilityChange(layer, config); + this.layerArray.push(layer); + } + }, this); +} + +/** + * Sets properties for a layer based on the input layer object. + * @param {Layer} layer - Layer object. + * @param {ILayerObject} layerObject - Input layer object data. + */ +function setLayerProperties(layer: Layer, layerObject: ILayerObject): void { + layer.set('lid', layerObject.id); + layer.set('title', layerObject.name); + layer.set('baseLayer', layerObject.baselayer); +} + +/** + * Handles visibility change for a layer and updates the cookie accordingly. + * @param {Layer} layer - Layer object. + * @param {ILayerObject} layerObject - Input layer object data. + */ +function handleLayerVisibilityChange(layer: Layer, layerObject: ILayerObject): void { + if (layerObject.baselayer) { + layer.on('change:visible', e => { + const target = e.target as Layer; + if (target.getVisible()) { + const lid = target.get('lid'); + document.cookie = `_redmine_gtt_basemap=${lid};path=/`; + } + }); + } +} + +/** + * Adds layers to the map based on their properties. + */ +function addLayersToMap(this: any): void { + let hasOverlay = false; + + this.layerArray.forEach((l: Layer) => { + if (l.get("baseLayer")) { + this.map.addLayer(l); + } else { + this.map.addLayer(l); + hasOverlay = true; + } + }); + + this.containsOverlay = hasOverlay; +} + +/** + * Adds a bounds layer to the map for rendering boundaries. + */ +function addBoundsLayer(this: any): void { + this.bounds = new VectorLayer({ + source: new VectorSource(), + style: new Style({ + fill: new Fill({ + color: 'rgba(255,255,255,0.0)' + }), + stroke: new Stroke({ + color: 'rgba(220,26,26,0.7)', + width: 1 + }) + }) + }); + this.bounds.set('title', 'Boundaries'); + this.bounds.set('displayInLayerSwitcher', false); + this.map.addLayer(this.bounds); +} + +/** + * Adds a vector layer to the map for rendering GeoJSON features. + * @param {Feature[] | null} features - Array of GeoJSON features or null if no features found. + */ +function addVectorLayer(this: any, features: Feature[] | null): void { + const yOrdering: unknown = Ordering.yOrdering(); + this.vector = new VectorLayer>({ + source: new VectorSource({ + 'features': features, + 'useSpatialIndex': false + }), + renderOrder: yOrdering as OrderFunction, + style: getStyle.bind(this), + minZoom: this.defaults.vectorMinzoom || 0 + }); + this.vector.set('title', 'Features'); + this.vector.set('displayInLayerSwitcher', false); + + // Listen to the moveend event and show message when zoom level is too low + let previousZoom = this.map.getView().getZoom(); + + const notification = document.createElement('div'); + notification.className = 'gtt-map-notification'; + notification.innerText = this.i18n.messages.zoom_in_more; + + const mapContainer = this.map.getTargetElement(); + Object.assign(mapContainer.style, { + position: 'relative', + }); + + this.map.on('moveend', () => { + const currentZoom = this.map.getView().getZoom(); + if (previousZoom !== currentZoom) { + if (currentZoom <= Number(this.defaults.vectorMinzoom || 0)) { + mapContainer.appendChild(notification); + } + else { + try { + mapContainer.removeChild(notification); + } catch (error) {} + } + previousZoom = currentZoom; + } + }); + + this.map.addLayer(this.vector); +} + +/** + * Renders the project boundary on the map by adding a boundary feature and applying a mask to the base layers. + */ +function renderProjectBoundary(this: any): void { + if (this.contents.bounds && this.contents.bounds !== null) { + const boundary = new GeoJSON().readFeature( + this.contents.bounds, { + featureProjection: 'EPSG:3857' + } + ); + this.bounds.getSource().addFeature(boundary); + if (this.contents.bounds === this.contents.geom) { + this.vector.setVisible(false); + } + this.layerArray.forEach((layer: Layer) => { + if (layer.get('baseLayer')) { + layer.addFilter(new Mask({ + feature: boundary, + inner: false, + fill: new Fill({ + color: [220, 26, 26, 0.1] + }) + })); + } + }); + } +} diff --git a/src/components/gtt-client/init/map.ts b/src/components/gtt-client/init/map.ts new file mode 100644 index 00000000..5594d06e --- /dev/null +++ b/src/components/gtt-client/init/map.ts @@ -0,0 +1,41 @@ +import { Map } from 'ol'; +import { defaults as interactionsDefaults, MouseWheelZoom } from 'ol/interaction'; +import { focus as eventsConditionFocus } from 'ol/events/condition'; +import { defaults as controlDefaults } from 'ol/control'; + +/** + * Initializes a new OpenLayers Map instance with custom interactions and controls. + * @param target - The HTMLElement where the map will be rendered. + * @param i18n - An object containing translations for user interface elements. + * @returns - The initialized OpenLayers Map instance. + */ +export function initMap(target: HTMLElement, i18n: any): Map { + // Define custom interactions + const interactions = interactionsDefaults({ mouseWheelZoom: false }).extend([ + new MouseWheelZoom({ + constrainResolution: true, // force zooming to an integer zoom + condition: eventsConditionFocus, // only wheel/trackpad zoom when the map has the focus + }), + ]); + + // Define custom controls + const controls = controlDefaults({ + rotateOptions: {}, + attributionOptions: { + collapsible: false, + }, + zoomOptions: { + zoomInTipLabel: i18n.control.zoom_in, + zoomOutTipLabel: i18n.control.zoom_out, + }, + }); + + // Initialize the map with custom interactions and controls + const map = new Map({ + target, + interactions, + controls, + }); + + return map; +} diff --git a/src/components/gtt-client/interfaces.ts b/src/components/gtt-client/interfaces.ts new file mode 100644 index 00000000..801de6d3 --- /dev/null +++ b/src/components/gtt-client/interfaces.ts @@ -0,0 +1,74 @@ +/** + * Interface for options used when creating a new instance of GttClient. + */ +export interface IGttClientOption { + /** + * Specifies the target HTML element for the map. + */ + target: HTMLDivElement | null; +} + +/** + * Interface describing a layer object used in GttClient. + */ +export interface ILayerObject { + /** + * A unique identifier for the layer. + */ + id: number; + + /** + * The name of the layer. + */ + name: string; + + /** + * The type of the layer. + */ + layer: string; + + /** + * Additional options for configuring the layer. + */ + layer_options: object; + + /** + * The type of the source for the layer. + */ + source: string; + + /** + * Additional options for configuring the source. + */ + source_options: object; + + /** + * The format of the data for the layer. + */ + format: string; + + /** + * Additional options for configuring the format. + */ + format_options: object; + + /** + * Indicates whether the layer is a base layer. + */ + baselayer: boolean; +} + +/** + * Interface for filtering options used in GttClient. + */ +export interface IFilterOption { + /** + * Specifies whether the location filter is enabled. + */ + location: boolean; + + /** + * Specifies whether the distance filter is enabled. + */ + distance: boolean; +} diff --git a/src/components/gtt-client/openlayers/index.ts b/src/components/gtt-client/openlayers/index.ts new file mode 100644 index 00000000..34aaf0bb --- /dev/null +++ b/src/components/gtt-client/openlayers/index.ts @@ -0,0 +1,489 @@ +import { Map, Feature, View, Geolocation } from 'ol'; +import { Point } from 'ol/geom'; +import Vector from 'ol/source/Vector' +import VectorLayer from 'ol/layer/Vector'; +import { Style, Fill, Stroke, Circle } from 'ol/style'; +import { createEmpty, extend, containsCoordinate } from 'ol/extent'; +import { transform, fromLonLat } from 'ol/proj'; + +import { Modify, Draw, Select } from 'ol/interaction' +import Bar from 'ol-ext/control/Bar'; +import Button from 'ol-ext/control/Button'; +import Toggle from 'ol-ext/control/Toggle'; +import Popup from 'ol-ext/overlay/Popup'; +import { position } from 'ol-ext/control/control'; +import { GeoJSON } from 'ol/format'; + +import { getCookie, getMapSize, degreesToRadians, updateForm } from "../helpers"; + +/** + * Get the z-value for a given geometry. + * If the geometry is a Point, return the z-coordinate of the Point. + * If the geometry is not a Point, return the average z-coordinate of all the coordinates in the geometry. + * If no z-coordinate is found, return 0. + * + * @param {ol/geom/Geometry} geometry - The geometry to get the z-value for. + * + * @returns {number} The z-value of the geometry. + */ +function getZValueForGeometry(geometry: any): number { + const geometryType = geometry.getType(); + let zValue = 0; + + if (geometryType === 'Point') { + const coordinates = geometry.getCoordinates(); + zValue = coordinates.length >= 3 ? coordinates[2] : 0; + } else { + const coordinates = geometry.getCoordinates(); + let totalZ = 0; + let numCoordinates = 0; + + if (geometryType === 'LineString' || geometryType === 'LinearRing') { + coordinates.forEach((coordinate: any) => { + if (coordinate.length >= 3) { + totalZ += coordinate[2]; + numCoordinates += 1; + } + }); + } else if (geometryType === 'Polygon') { + coordinates.forEach((ring: any) => { + ring.forEach((coordinate: any) => { + if (coordinate.length >= 3) { + totalZ += coordinate[2]; + numCoordinates += 1; + } + }); + }); + } else if (geometryType === 'MultiPoint' || geometryType === 'MultiLineString' || geometryType === 'MultiPolygon') { + coordinates.forEach((subGeometry: any) => { + subGeometry.forEach((subCoordinate: any) => { + if (subCoordinate.length >= 3) { + totalZ += subCoordinate[2]; + numCoordinates += 1; + } + }); + }); + } + + if (numCoordinates > 0) { + zValue = totalZ / numCoordinates; + } + } + + return zValue; +} + +/** + * Set the z-value for a given feature's geometry. + * If the geometry is a Point, set the z-coordinate of the Point to the given z-value. + * If the geometry is not a Point, set the z-coordinate of all the coordinates in the geometry to the given z-value. + * + * @param {ol/Feature} feature - The feature whose geometry's z-value needs to be set. + * @param {number} zValue - The z-value to set for the geometry. + * + * @returns {ol/Feature} The updated feature object. + */ +function setZValueForGeometry(feature: any, zValue: number): any { + const geometry = feature.getGeometry(); + const geometryType = geometry.getType(); + + if (geometryType === 'Point') { + const coordinates = geometry.getCoordinates(); + if (coordinates.length >= 3) { + coordinates[2] = zValue; + geometry.setCoordinates(coordinates); + } else { + geometry.setCoordinates([coordinates[0], coordinates[1], zValue]); + } + } else { + const coordinates = geometry.getCoordinates(); + + if (geometryType === 'LineString' || geometryType === 'LinearRing') { + geometry.setCoordinates(coordinates.map((coordinate: any) => { + if (coordinate.length >= 3) { + return [coordinate[0], coordinate[1], zValue]; + } else { + return [coordinate[0], coordinate[1], 0]; + } + })); + } else if (geometryType === 'Polygon') { + geometry.setCoordinates(coordinates.map((ring: any) => { + return ring.map((coordinate: any) => { + if (coordinate.length >= 3) { + return [coordinate[0], coordinate[1], zValue]; + } else { + return [coordinate[0], coordinate[1], 0]; + } + }); + })); + } else if (geometryType === 'MultiPoint' || geometryType === 'MultiLineString' || geometryType === 'MultiPolygon') { + geometry.setCoordinates(coordinates.map((subGeometry: any) => { + return subGeometry.map((subCoordinate: any) => { + if (subCoordinate.length >= 3) { + return [subCoordinate[0], subCoordinate[1], zValue]; + } else { + return [subCoordinate[0], subCoordinate[1], 0]; + } + }); + })); + } + } + + feature.setGeometry(geometry); + return feature; +} + +/** + * Add editing tools + */ +export function setControls(types: Array) { + // Make vector features editable + const modify = new Modify({ + features: this.vector.getSource().getFeaturesCollection() + }) + + modify.on('modifyend', evt => { + updateForm(this, evt.features.getArray(), true) + }) + + this.map.addInteraction(modify) + + const mainbar = new Bar() + mainbar.setPosition("top-left" as position) + this.map.addControl(mainbar) + + const editbar = new Bar({ + toggleOne: true, // one control active at the same time + group: true // group controls together + }) + mainbar.addControl(editbar) + + let zValue = 0; + let geometryType = 'Point'; + this.vector.getSource().forEachFeature((ftr: any) => { + geometryType = ftr.getGeometry().getType(); + zValue = getZValueForGeometry(ftr.getGeometry()); + }); + + types.forEach((type: any, idx) => { + + const draw = new Draw({ + type: type, + source: this.vector.getSource(), + geometryLayout: 'XYZ' + }) + + draw.on('drawend', evt => { + this.vector.getSource().clear() + const feature = setZValueForGeometry(evt.feature, zValue); + updateForm(this, [feature], true) + }) + + // Material design icon + let mdi = 'mdi-map-marker-outline' + + switch (type.toLowerCase()) { + case 'linestring': + mdi = 'mdi-vector-polyline' + break; + + case 'polygon': + mdi = 'mdi-vector-polygon' + break; + } + + const control = new Toggle({ + html: ``, + title: this.i18n.control[type.toLowerCase()], + interaction: draw, + active: (type === geometryType) + }) + editbar.addControl(control) + }) + + // Uses jQuery UI for GeoJSON Upload modal window + const mapObj = this + const dialog = $("#dialog-geojson-upload").dialog({ + autoOpen: false, + resizable: true, + height: 'auto', + width: 380, + modal: true, + buttons: { + [mapObj.i18n.modal.load]: function() { + const geojson_input = document.querySelector('#dialog-geojson-upload textarea') as HTMLInputElement + const data = geojson_input.value + if (data !== null) { + const features = new GeoJSON().readFeatures( + JSON.parse(data), { + featureProjection: 'EPSG:3857' + } + ) + mapObj.vector.getSource().clear() + mapObj.vector.getSource().addFeatures(features) + updateForm(mapObj, features) + zoomToExtent.call(mapObj) + } + $(this).dialog('close') + }, + [mapObj.i18n.modal.cancel]: function() { + $(this).dialog('close') + } + } + }); + + // Upload button + if (this.contents.upload === "true") { + + const fileSelector = document.getElementById('file-selector') + fileSelector.addEventListener('change', (event: any) => { + const file = event.target.files[0] + // Check if the file is GeoJSON. + if (file.type && !file.type.startsWith('application/geo')) { + console.log('File is not a GeoJSON document.', file.type, file); + return; + } + const fileReader = new FileReader(); + fileReader.addEventListener('load', (event: any) => { + const geojson_input = document.querySelector('#dialog-geojson-upload textarea') as HTMLInputElement + geojson_input.value = JSON.stringify(event.target.result, null, 2) + }); + fileReader.readAsText(file); + }); + + editbar.addControl(new Button({ + html: '', + title: this.i18n.control.upload, + handleClick: () => { + dialog.dialog('open') + } + })) + } +} + +/** + * Add popup + */ +export function setPopover() { + const popup = new Popup({ + popupClass: 'default', + closeBox: false, + onclose: () => {}, + positioning: 'auto', + anim: true + }) + this.map.addOverlay(popup) + + // Control Select + const select = new Select({ + layers: [this.vector], + style: null, + multi: false + }) + this.map.addInteraction(select) + + // On selected => show/hide popup + select.getFeatures().on(['add'], (evt: any) => { + const feature = evt.element + + const content: Array = [] + content.push(`${feature.get('subject')}
`) + // content.push('Starts at: ' + feature.get("start_date") + ' |'); + + const popup_contents = JSON.parse(this.contents.popup) + const url = popup_contents.href.replace(/\[(.+?)\]/g, feature.get('id')) + content.push(`Edit`) + + popup.show(feature.getGeometry().getFirstCoordinate(), content.join('') as any) + }) + + select.getFeatures().on(['remove'], _ => { + popup.hide() + }) + + // change mouse cursor when over marker + this.map.on('pointermove', (evt: any) => { + if (evt.dragging) return + const hit = this.map.hasFeatureAtPixel(evt.pixel, { + layerFilter: (layer: any) => { + return layer === this.vector + } + }) + this.map.getTargetElement().style.cursor = hit ? 'pointer' : '' + }) +} + +/** +* Decide which baselayer to show +*/ +export function setBasemap(): void { + if (this.layerArray.length == 0) { + const notification = document.createElement('div'); + notification.className = 'gtt-map-notification'; + notification.innerText = this.i18n.messages.baselayer_missing; + + const mapContainer = this.map.getTargetElement(); + Object.assign(mapContainer.style, { + position: 'relative', + }); + + mapContainer.appendChild(notification); + return + } + + let index = 0 + const cookie = parseInt(getCookie('_redmine_gtt_basemap')) + if (cookie) { + let lid = 0 + // Check if layer ID exists in available layers + this.layerArray.forEach((layer: any) => { + if (cookie === layer.get("lid")) { + lid = cookie + } + }) + + // Set selected layer visible + this.layerArray.forEach((layer: any, idx: number) => { + if (lid === layer.get("lid")) { + index = idx + } + }) + } + + // Set layer visible + this.layerArray[index].setVisible(true) +} + +export function zoomToExtent(force: boolean = true) { + if (!force && (this.filters.distance || this.filters.location)) { + // Do not zoom to extent but show the previous extent stored as cookie + const parts = (getCookie("_redmine_gtt_permalink")).split("/"); + this.maps.forEach((m: any) => { + m.getView().setZoom(parseInt(parts[0], 10)) + m.getView().setCenter(transform([ + parseFloat(parts[1]), + parseFloat(parts[2]) + ],'EPSG:4326','EPSG:3857')) + m.getView().setRotation(parseFloat(parts[3])) + }) + } else if (this.vector.getSource().getFeatures().length > 0) { + let extent = createEmpty() + // Because the vector layer is set to "useSpatialIndex": false, we cannot + // make use of "vector.getSource().getExtent()" + this.vector.getSource().getFeatures().forEach((feature: any) => { + extend(extent, feature.getGeometry().getExtent()) + }) + this.maps.forEach((m: any) => { + m.getView().fit(extent, { + size: getMapSize(m), + maxZoom: parseInt(this.defaults.fitMaxzoom) + }) + }) + } else if (this.bounds.getSource().getFeatures().length > 0) { + this.maps.forEach((m: any) => { + m.getView().fit(this.bounds.getSource().getExtent(), { + size: getMapSize(m), + maxZoom: parseInt(this.defaults.fitMaxzoom) + }) + }) + } else { + // Set default center, once + this.maps.forEach((m: any) => { + m.getView().setCenter(transform([parseFloat(this.defaults.lon), parseFloat(this.defaults.lat)], + 'EPSG:4326', 'EPSG:3857')); + }) + this.geolocations.forEach((g: any) => { + g.once('change:position', (evt: any) => { + this.maps.forEach((m: any) => { + m.getView().setCenter(g.getPosition()) + }) + }) + }) + } +} + +/** + * Add Geolocation functionality + */ +export function setGeolocation(currentMap: Map) { + const geolocation = new Geolocation({ + tracking: false, + projection: currentMap.getView().getProjection() + }) + this.geolocations.push(geolocation) + + geolocation.on('change', (evt) => { + // console.log({ + // accuracy: geolocation.getAccuracy(), + // altitude: geolocation.getAltitude(), + // altitudeAccuracy: geolocation.getAltitudeAccuracy(), + // heading: geolocation.getHeading(), + // speed: geolocation.getSpeed() + // }) + }) + geolocation.on('error', (error) => { + // TBD + console.error(error) + }) + + const accuracyFeature = new Feature() + geolocation.on('change:accuracyGeometry', (evt) => { + accuracyFeature.setGeometry(geolocation.getAccuracyGeometry()) + }) + + const positionFeature = new Feature() + positionFeature.setStyle(new Style({ + image: new Circle({ + radius: 6, + fill: new Fill({ + color: '#3399CC' + }), + stroke: new Stroke({ + color: '#fff', + width: 2 + }) + }) + })) + + geolocation.on('change:position', (evt) => { + const position = geolocation.getPosition() + positionFeature.setGeometry(position ? new Point(position) : null) + + const extent = currentMap.getView().calculateExtent(currentMap.getSize()) + if (!containsCoordinate(extent, position)) { + currentMap.getView().setCenter(position) + } + }) + + const geolocationLayer = new VectorLayer({ + source: new Vector({ + features: [accuracyFeature, positionFeature] + }) + }) + geolocationLayer.set('displayInLayerSwitcher', false) + currentMap.addLayer(geolocationLayer) + + // Control button + const geolocationCtrl = new Toggle({ + html: '', + title: this.i18n.control.geolocation, + active: false, + onToggle: (active: boolean) => { + geolocation.setTracking(active) + geolocationLayer.setVisible(active) + } + }) + this.toolbar.addControl(geolocationCtrl) +} + +export function setView() { + const center = fromLonLat([parseFloat(this.defaults.lon), parseFloat(this.defaults.lat)]) + const view = new View({ + // Avoid flicker (map move) + center: center, + zoom: parseInt(this.defaults.zoom), + maxZoom: parseInt(this.defaults.maxzoom), // applies for Mierune Tiles + rotation: degreesToRadians(parseInt(this.map.getTargetElement().getAttribute("data-rotation"))) + }) + this.map.setView(view) +} diff --git a/src/components/gtt-client/openlayers/styles.ts b/src/components/gtt-client/openlayers/styles.ts new file mode 100644 index 00000000..cceb016d --- /dev/null +++ b/src/components/gtt-client/openlayers/styles.ts @@ -0,0 +1,145 @@ +import { Feature } from 'ol'; +import { Geometry } from 'ol/geom'; +import { Style, Fill, Stroke } from 'ol/style'; +import FontSymbol from 'ol-ext/style/FontSymbol'; +import Shadow from 'ol-ext/style/Shadow'; + +/** + * Creates and returns a shadow style. + * + * @returns {Style} - The shadow style. + */ +function applyShadow(): Style { + return new Style({ + image: new Shadow({ + radius: 15, + blur: 5, + offsetX: 0, + offsetY: 0, + fill: new Fill({ + color: 'rgba(0,0,0,0.5)', + }), + }), + }); +} + +/** + * Creates and returns a font style for a given feature. + * + * @param {any} mapObj - The map object containing default settings. + * @param {Feature} feature - The map feature for which the font style is being generated. + * @returns {Style} - The font style. + */ +function applyFontStyle(mapObj: any, feature: Feature): Style { + + const fontStyle = new Style({ + image: new FontSymbol({ + form: 'blazon', + gradient: false, + glyph: getSymbol(mapObj, feature), + fontSize: 0.7, + radius: 18, + offsetY: -18, + rotation: 0, + rotateWithView: false, + color: getFontColor(), + fill: new Fill({ + color: getColor(mapObj, feature), + }), + stroke: new Stroke({ + color: '#333333', + width: 1, + }), + opacity: 1, + }), + stroke: new Stroke({ + width: 4, + color: getColor(mapObj, feature), + }), + fill: new Fill({ + color: getColor(mapObj, feature, true), + }), + }); + + return fontStyle; +} + +/** + * Get an array of styles to be applied to a given feature. + * + * @param {Feature} feature - The map feature for which the styles are being generated. + * @param {unknown} _ - Unused parameter. + * @returns {Style[]} - An array of styles to be applied on the feature. + */ +export function getStyle(feature: Feature, _: unknown): Style[] { + return [applyShadow(), applyFontStyle(this, feature)]; +} + +/** + * Get color for a map feature based on its geometry type and status. + * The default color is applied if no specific settings are found. + * + * @param {any} mapObj - The map object containing default settings. + * @param {Feature} feature - The map feature to get color for. + * @param {boolean} isFill - Determines if the color should include an alpha value. Default is false. + * @returns {string} - The calculated color value in hexadecimal format (with optional alpha). + */ +export function getColor(mapObj: any, feature: Feature, isFill: boolean = false): string { + const DEFAULT_COLOR = '#000000'; + const LINE_AND_POLYGON_COLOR = '#FFD700'; + + let color = feature.getGeometry().getType() !== 'Point' ? LINE_AND_POLYGON_COLOR : DEFAULT_COLOR; + const pluginSettings = JSON.parse(mapObj.defaults.pluginSettings); + const statusInput = document.querySelector('#issue_status_id') as HTMLInputElement; + + let statusId = feature.get('status_id') || (statusInput && statusInput.value); + + if (statusId) { + const key = `status_${statusId}`; + if (key in pluginSettings) { + color = pluginSettings[key]; + } + } + + if (isFill && color.length === 7) { + color = color + '33'; // Add alpha: 0.2 + } + + return color; +} + +/** + * Get the default font color. + * + * @returns {string} - The default font color in hexadecimal format (#FFFFFF). + */ +export function getFontColor(): string { + const DEFAULT_FONT_COLOR = "#FFFFFF"; + return DEFAULT_FONT_COLOR; +} + +/** + * Get the appropriate symbol based on tracker ID present in mapObj or feature. + * + * @param {any} mapObj - The map object containing default settings. + * @param {Feature} feature - The map feature for which we are getting the symbol. + * @returns {string} - The symbol name. + */ +export function getSymbol(mapObj: any, feature: Feature): string { + let symbol = 'home'; + + const pluginSettings = JSON.parse(mapObj.defaults.pluginSettings); + const issueTracker = document.querySelector('#issue_tracker_id') as HTMLInputElement; + + let trackerId = feature.get('tracker_id') || (issueTracker && issueTracker.value); + + if (trackerId) { + const key = `tracker_${trackerId}`; + + if (key in pluginSettings) { + symbol = pluginSettings[key]; + } + } + + return symbol; +} diff --git a/src/components/gtt-client/redmine/index.ts b/src/components/gtt-client/redmine/index.ts new file mode 100644 index 00000000..8c7c345e --- /dev/null +++ b/src/components/gtt-client/redmine/index.ts @@ -0,0 +1,103 @@ +import GttClient from '../GttClient'; + +/** + * Extend core Redmine's buildFilterRow method + */ +window.buildFilterRowWithoutDistanceFilter = window.buildFilterRow; +window.buildFilterRow = function (field, operator, values) { + if (field == 'distance') { + buildDistanceFilterRow(operator, values); + } else { + window.buildFilterRowWithoutDistanceFilter(field, operator, values); + } +}; + +export const buildDistanceFilterRow = (operator: any, values: any): void => { + const field = 'distance' + const fieldId = field + const filterTable = document.querySelector('#filters-table') as HTMLTableElement + const filterOptions = window.availableFilters[field] + if (!filterOptions) { + return + } + const operators = window.operatorByType[filterOptions['type']] + // const filterValues = filterOptions['values'] + + const tr = document.createElement('tr') as HTMLTableRowElement + tr.className = 'filter' + tr.id = `tr_${fieldId}` + tr.innerHTML = ` + + + + + + + + + + + + + `; + (document.querySelector(`#values_${fieldId}_1`) as HTMLInputElement).value = values[0] + let base_idx = 1 + if (values.length == 2 || values.length == 4) { + // upper bound for 'between' operator + (document.querySelector(`#values_${fieldId}_2`) as HTMLInputElement).value = values[1] + base_idx = 2 + } + let x, y + if (values.length > 2) { + // console.log('distance center point from values: ', values[base_idx], values[base_idx+1]); + x = values[base_idx] + y = values[base_idx+1] + } else { + // console.log('taking distance from map fieldset: ', $('fieldset#location').data('center')); + const fieldset = document.querySelector('fieldset#location') as HTMLFieldSetElement + if (!fieldset.dataset.center) { + return + } + const xy = JSON.parse(fieldset.dataset.center) + x = xy[0] + y = xy[1] + } + (document.querySelector(`#values_${fieldId}_3`) as HTMLInputElement).value = x; + (document.querySelector(`#values_${fieldId}_4`) as HTMLInputElement).value = y; +}; + +window.replaceIssueFormWithInitMap = window.replaceIssueFormWith; +export const replaceIssueFormWithInitMap = window.replaceIssueFormWith; + +export const replaceIssueFormWith = (html: any): void => { + window.replaceIssueFormWithInitMap(html); + const ol_maps = document.querySelector( + "form[class$='_issue'] div.ol-map" + ) as HTMLDivElement; + if (ol_maps) { + new GttClient({ target: ol_maps }); + } +}; diff --git a/src/components/gtt-setting.ts b/src/components/gtt-setting.ts deleted file mode 100644 index b02e9bd3..00000000 --- a/src/components/gtt-setting.ts +++ /dev/null @@ -1,95 +0,0 @@ -import 'ol/ol.css' -import 'ol-ext/dist/ol-ext.min.css' -import FontSymbol from 'ol-ext/style/FontSymbol' - -export const gtt_setting = ():void => { - - // Override jQuery UI select menu - $.widget("ui.selectmenu", $.ui.selectmenu, { - _renderItem: function( ul: any, item: any ) { - const li = $('
  • ') - const wrapper = $('
    ', { - text: '' - }) - const style = item.optgroup.toLowerCase().split(' ').join('-') - switch (style) { - case 'material-icons': - $('', { - class: 'ui-icons ' + style, - title: item.label, - text: item.value - }).prependTo(wrapper) - break; - - default: - $('', { - class: 'ui-icons ' + style + ' icon-' + item.value, - title: item.label, - text: '' - }).prependTo(wrapper) - break; - } - return li.append(wrapper).appendTo(ul) - } - }); - - const glyph = FontSymbol.defs.glyphs - document.querySelectorAll("[id^='settings_tracker_']").forEach((element: HTMLSelectElement) => { - const selectedValue = element.value - if (element.length === 1 && selectedValue !== "") { - element.remove(0) - // element.append(new Option("", "", false, false)) - } - for (let font in FontSymbol.defs.fonts) { - const optgroup = document.createElement('optgroup') - optgroup.label = FontSymbol.defs.fonts[font].name - for (let i in glyph) { - if (glyph[i].font == font) { - const selected = selectedValue === i - const words = i.split('_') - const text = words.map((word) => { - return word[0].toUpperCase() + word.substring(1) - }).join(' ') - optgroup.appendChild(new Option(text, i, selected, selected)) - if (selected) { - const style = font.toLowerCase().split(' ').join('-') - switch (style) { - case 'material-icons': - element.nextElementSibling.className = style - element.nextElementSibling.textContent = i - break; - - default: - element.nextElementSibling.className = style + ' icon-' + i - element.nextElementSibling.textContent = '' - break; - } - } - } - } - element.append(optgroup) - } - - // Apply better Selector styling with jQuery UI (available in Redmine) - $(element) - .selectmenu({ - change: function(event: any, data: any) { - const style = data.item.optgroup.toLowerCase().split(' ').join('-') - switch (style) { - case 'material-icons': - document.querySelector(`#icon_${element.id}`).className = style - document.querySelector(`#icon_${element.id}`).textContent = data.item.value - break; - - default: - document.querySelector(`#icon_${element.id}`).className = style + ' icon-' + data.item.value - document.querySelector(`#icon_${element.id}`).textContent = '' - break; - } - } - }) - .selectmenu('menuWidget') - .addClass('select-overflow') - .addClass('ui-menu-icons customicons') - }) -} diff --git a/src/components/gtt-settings/index.ts b/src/components/gtt-settings/index.ts new file mode 100644 index 00000000..8eac3778 --- /dev/null +++ b/src/components/gtt-settings/index.ts @@ -0,0 +1,37 @@ +/** + * GTT Settings Management + * + * This module handles the initialization and configuration of the GTT settings + * interface, including applying custom behavior to select menus and processing + * tracker elements. + */ + +// Import OpenLayers core CSS for default styling +import 'ol/ol.css'; + +// Import OpenLayers extended CSS for additional components and styling +import 'ol-ext/dist/ol-ext.min.css'; + +// Import the function to override the select menu behavior +import { overrideSelectMenu } from './selectMenuOverride'; + +// Import the function to process tracker elements +import { processElement } from './processElement'; + +/** + * Initializes the GTT settings interface and applies necessary configurations. + * Overrides the default behavior of HTML select menus and processes tracker elements. + * + * @function gtt_setting + * @returns {void} + */ +export const gtt_setting = (): void => { + // Call the overrideSelectMenu function to override the default behavior of the HTML select menu + overrideSelectMenu(); + + // Get all tracker elements with an ID starting with "settings_tracker_" + const trackerElements = document.querySelectorAll("[id^='settings_tracker_']"); + + // Call processElement function on each of the tracker elements to apply necessary changes + trackerElements.forEach(processElement); +}; diff --git a/src/components/gtt-settings/processElement.ts b/src/components/gtt-settings/processElement.ts new file mode 100644 index 00000000..901179de --- /dev/null +++ b/src/components/gtt-settings/processElement.ts @@ -0,0 +1,53 @@ +// import * as $ from 'jquery'; +import FontSymbol from 'ol-ext/style/FontSymbol'; + +const { glyphs, fonts } = FontSymbol.defs; + +/** + * Processes an HTMLSelectElement by populating optgroups with font icons and applying styling using jQuery UI. + * + * @param {HTMLSelectElement} element - The select element to be processed. + */ +export const processElement = (element: HTMLSelectElement): void => { + const selectedValue = element.value; + + if (element.length === 1 && selectedValue !== '') { + element.remove(0); + } + + for (const fontKey in fonts) { + const optgroup = document.createElement('optgroup'); + optgroup.label = fonts[fontKey].name; + + for (const glyphKey in glyphs) { + if (glyphs[glyphKey].font === fonts[fontKey].font) { + const selected = selectedValue === glyphKey; + const words = glyphKey.split('_'); + const text = words.map((word) => word[0].toUpperCase() + word.substring(1)).join(' '); + + optgroup.appendChild(new Option(text, glyphKey, selected, selected)); + + if (selected) { + const style = fonts[fontKey].font.toLowerCase().replace(/\s+/g, '-'); + const icon = element.nextElementSibling; + icon.className = `${style}${style === 'material-design-icons' ? ' mdi mdi-' + glyphKey : ' icon-' + glyphKey}`; + } + } + } + + element.append(optgroup); + } + + // Apply better Selector styling with jQuery UI (available in Redmine) + $(element) + .selectmenu({ + change: function (event: any, data: any) { + const style = data.item.optgroup.toLowerCase().replace(/\s+/g, '-'); + const icon = document.querySelector(`#icon_${element.id}`); + icon.className = `${style}${style === 'material-design-icons' ? ' mdi mdi-' + data.item.value : ' icon-' + data.item.value}`; + }, + }) + .selectmenu('menuWidget') + .addClass('select-overflow') + .addClass('ui-menu-icons customicons'); +}; diff --git a/src/components/gtt-settings/selectMenuOverride.ts b/src/components/gtt-settings/selectMenuOverride.ts new file mode 100644 index 00000000..f5c7a46f --- /dev/null +++ b/src/components/gtt-settings/selectMenuOverride.ts @@ -0,0 +1,31 @@ +/** + * Overrides jQuery UI's selectmenu with a custom _renderItem method for rendering the list item. + */ +export const overrideSelectMenu = (): void => { + $.widget('ui.selectmenu', $.ui.selectmenu, { + /** + * Custom function to render each item in the select menu with an accompanying icon. + * + * @param {JQuery} ul - The unordered list representing the select menu. + * @param {any} item - The item to be rendered in the select menu. + * @return {JQuery} - The list item (li) element with the appended wrapper containing the icon and text. + */ + _renderItem: function (ul: JQuery, item: any): JQuery { + const li = $('
  • '); + const wrapper = $('
    ', { text: '' }); + const style = item.optgroup.toLowerCase().replace(/\s+/g, '-'); + + const isMaterialIconsStyle = style === 'material-design-icons'; + const iconClass = `ui-icons ${style}${isMaterialIconsStyle ? ' mdi mdi-' + item.value : ' icon-' + item.value}`; + + const iconConfig = { + class: iconClass, + title: item.label, + }; + + $('', iconConfig).prependTo(wrapper); + + return li.append(wrapper).appendTo(ul); + }, + }); +}; diff --git a/src/components/quick_hack.ts b/src/components/quick_hack.ts deleted file mode 100644 index 931c9bca..00000000 --- a/src/components/quick_hack.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const quick_hack = { - lon: 139.691706, - lat: 35.689524, - zoom: 13, - maxzoom: 19, - fitMaxzoom: 17, - geocoder: {} -} diff --git a/src/images/map.png b/src/images/map.png deleted file mode 100644 index f90ef25e..00000000 Binary files a/src/images/map.png and /dev/null differ diff --git a/src/index.ts b/src/index.ts index 92050e76..e9752b07 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,27 +1,44 @@ -import 'ol/ol.css' -import 'ol-ext/dist/ol-ext.min.css' -import './stylesheets/app.scss' +/** + * =========================================== + * GTT Application Main Module + * =========================================== + * + * This module is responsible for managing + * the GTT application. Its main tasks include: + * - Importing required stylesheets + * - Importing components (GttClient and gtt_setting) + * - Attaching essential functions to the global window object + */ -// Custom Icons -import './stylesheets/custom-icons.css' -import './stylesheets/CustomIconsDef.js' +// Import application styles from the 'styles' module +import './styles'; -// Material Design Icons -// https://github.com/marella/material-design-icons/tree/main/font#readme -import '@material-design-icons/font/filled.css' -import './stylesheets/MaterialDesignDef.js' +// Import necessary iconfonts +import { fontPromise as customIcons } from './styles/icons/custom/custom-icons-def'; +import { fontPromise as materialIcons } from './styles/icons/material-design/material-design-def'; -import { GttClient } from './components/gtt-client' -import { gtt_setting } from './components/gtt-setting' +// Import GttClient and gtt_setting components from corresponding modules +import { GttClient } from './components/gtt-client'; +import { gtt_setting } from './components/gtt-settings'; -interface Window { - createGttClient(target: HTMLDivElement): void - gtt_setting(): void +/** + * Creates a GttClient instance for the given target. + * @param target - The HTMLDivElement for which the GttClient will be created. + */ +async function createGttClient(target: HTMLDivElement) { + await Promise.all([customIcons, materialIcons]); + new GttClient({ target }); } -declare var window: Window -window.createGttClient = (target: HTMLDivElement):void => { - new GttClient({target: target}) -} -window.gtt_setting = (): void => { - gtt_setting() + +/** + * Attaches GTT settings. + */ +async function attachGttSetting() { + await Promise.all([customIcons, materialIcons]); + gtt_setting(); } + +// Attach the 'createGttClient' and 'attachGttSetting' functions to the global window object +// This enables them to be called from other parts of the application or directly from the browser console +(window as any).createGttClient = createGttClient; +(window as any).gtt_setting = attachGttSetting; diff --git a/src/styles/icons/custom/custom-icons-def.ts b/src/styles/icons/custom/custom-icons-def.ts new file mode 100644 index 00000000..c16e2690 --- /dev/null +++ b/src/styles/icons/custom/custom-icons-def.ts @@ -0,0 +1,40 @@ +import * as FontFaceObserver from 'fontfaceobserver'; +import FontSymbol from 'ol-ext/style/FontSymbol'; + +const iconMappings: { [key: string]: any } = { + 'lobsta': '\uf101', + 'park_bench': '\uf102', + 'lobsta_road': '\uf103', + 'waste': '\uf104' +}; + +// Define the font face +let customFont = new FontFace('custom-icons', 'url(/plugin_assets/redmine_gtt/custom-icons.woff2)'); + +// Load the font +const fontPromise = customFont.load().then((font) => { + // Add the loaded font to the document + document.fonts.add(font); + + // Add the definitions + FontSymbol.addDefs( + { + font: 'custom-icons', + name: 'Custom Icons', + copyright: 'Apache-2.0', + prefix: 'gtt', + }, + iconMappings + ); + + // Create a FontFaceObserver instance + const observer = new FontFaceObserver('custom-icons'); + + // Use the observer to wait for the font to be loaded + return observer.load(); +}).catch((error) => { + console.error('Error loading font:', error); +}); + +export { fontPromise }; +export default FontSymbol; diff --git a/src/stylesheets/custom-icons.css b/src/styles/icons/custom/custom-icons.css similarity index 90% rename from src/stylesheets/custom-icons.css rename to src/styles/icons/custom/custom-icons.css index cee773c9..fb9e08fd 100644 --- a/src/stylesheets/custom-icons.css +++ b/src/styles/icons/custom/custom-icons.css @@ -11,7 +11,6 @@ font-style: normal; font-size: 24px; line-height: 1; - letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; @@ -23,7 +22,8 @@ font-feature-settings: "liga"; } -i[class^="icon-"]:before, i[class*=" icon-"]:before { +i[class^="icon-"]:before, +i[class*=" icon-"]:before { font-family: custom-icons !important; font-style: normal; font-weight: normal !important; @@ -40,7 +40,7 @@ i[class^="icon-"]:before, i[class*=" icon-"]:before { .icon-park_bench:before { content: "\f102"; } -.icon-road:before { +.icon-lobsta_road:before { content: "\f103"; } .icon-waste:before { diff --git a/src/stylesheets/custom-icons.woff2 b/src/styles/icons/custom/custom-icons.woff2 similarity index 100% rename from src/stylesheets/custom-icons.woff2 rename to src/styles/icons/custom/custom-icons.woff2 diff --git a/src/styles/icons/material-design/material-design-def.ts b/src/styles/icons/material-design/material-design-def.ts new file mode 100644 index 00000000..cc571ce7 --- /dev/null +++ b/src/styles/icons/material-design/material-design-def.ts @@ -0,0 +1,7332 @@ +import * as FontFaceObserver from 'fontfaceobserver'; +import FontSymbol from 'ol-ext/style/FontSymbol'; + +const iconMappings: { [key: string]: any } = { + "ab-testing": "\u{F01C9}", + "abacus": "\u{F16E0}", + "abjad-arabic": "\u{F1328}", + "abjad-hebrew": "\u{F1329}", + "abugida-devanagari": "\u{F132A}", + "abugida-thai": "\u{F132B}", + "access-point": "\u{F0003}", + "access-point-check": "\u{F1538}", + "access-point-minus": "\u{F1539}", + "access-point-network": "\u{F0002}", + "access-point-network-off": "\u{F0BE1}", + "access-point-off": "\u{F1511}", + "access-point-plus": "\u{F153A}", + "access-point-remove": "\u{F153B}", + "account": "\u{F0004}", + "account-alert": "\u{F0005}", + "account-alert-outline": "\u{F0B50}", + "account-arrow-down": "\u{F1868}", + "account-arrow-down-outline": "\u{F1869}", + "account-arrow-left": "\u{F0B51}", + "account-arrow-left-outline": "\u{F0B52}", + "account-arrow-right": "\u{F0B53}", + "account-arrow-right-outline": "\u{F0B54}", + "account-arrow-up": "\u{F1867}", + "account-arrow-up-outline": "\u{F186A}", + "account-badge": "\u{F1B0A}", + "account-badge-outline": "\u{F1B0B}", + "account-box": "\u{F0006}", + "account-box-multiple": "\u{F0934}", + "account-box-multiple-outline": "\u{F100A}", + "account-box-outline": "\u{F0007}", + "account-cancel": "\u{F12DF}", + "account-cancel-outline": "\u{F12E0}", + "account-card": "\u{F1BA4}", + "account-card-outline": "\u{F1BA5}", + "account-cash": "\u{F1097}", + "account-cash-outline": "\u{F1098}", + "account-check": "\u{F0008}", + "account-check-outline": "\u{F0BE2}", + "account-child": "\u{F0A89}", + "account-child-circle": "\u{F0A8A}", + "account-child-outline": "\u{F10C8}", + "account-circle": "\u{F0009}", + "account-circle-outline": "\u{F0B55}", + "account-clock": "\u{F0B56}", + "account-clock-outline": "\u{F0B57}", + "account-cog": "\u{F1370}", + "account-cog-outline": "\u{F1371}", + "account-convert": "\u{F000A}", + "account-convert-outline": "\u{F1301}", + "account-cowboy-hat": "\u{F0E9B}", + "account-cowboy-hat-outline": "\u{F17F3}", + "account-credit-card": "\u{F1BA6}", + "account-credit-card-outline": "\u{F1BA7}", + "account-details": "\u{F0631}", + "account-details-outline": "\u{F1372}", + "account-edit": "\u{F06BC}", + "account-edit-outline": "\u{F0FFB}", + "account-eye": "\u{F0420}", + "account-eye-outline": "\u{F127B}", + "account-filter": "\u{F0936}", + "account-filter-outline": "\u{F0F9D}", + "account-group": "\u{F0849}", + "account-group-outline": "\u{F0B58}", + "account-hard-hat": "\u{F05B5}", + "account-hard-hat-outline": "\u{F1A1F}", + "account-heart": "\u{F0899}", + "account-heart-outline": "\u{F0BE3}", + "account-injury": "\u{F1815}", + "account-injury-outline": "\u{F1816}", + "account-key": "\u{F000B}", + "account-key-outline": "\u{F0BE4}", + "account-lock": "\u{F115E}", + "account-lock-open": "\u{F1960}", + "account-lock-open-outline": "\u{F1961}", + "account-lock-outline": "\u{F115F}", + "account-minus": "\u{F000D}", + "account-minus-outline": "\u{F0AEC}", + "account-multiple": "\u{F000E}", + "account-multiple-check": "\u{F08C5}", + "account-multiple-check-outline": "\u{F11FE}", + "account-multiple-minus": "\u{F05D3}", + "account-multiple-minus-outline": "\u{F0BE5}", + "account-multiple-outline": "\u{F000F}", + "account-multiple-plus": "\u{F0010}", + "account-multiple-plus-outline": "\u{F0800}", + "account-multiple-remove": "\u{F120A}", + "account-multiple-remove-outline": "\u{F120B}", + "account-music": "\u{F0803}", + "account-music-outline": "\u{F0CE9}", + "account-network": "\u{F0011}", + "account-network-off": "\u{F1AF1}", + "account-network-off-outline": "\u{F1AF2}", + "account-network-outline": "\u{F0BE6}", + "account-off": "\u{F0012}", + "account-off-outline": "\u{F0BE7}", + "account-outline": "\u{F0013}", + "account-plus": "\u{F0014}", + "account-plus-outline": "\u{F0801}", + "account-question": "\u{F0B59}", + "account-question-outline": "\u{F0B5A}", + "account-reactivate": "\u{F152B}", + "account-reactivate-outline": "\u{F152C}", + "account-remove": "\u{F0015}", + "account-remove-outline": "\u{F0AED}", + "account-school": "\u{F1A20}", + "account-school-outline": "\u{F1A21}", + "account-search": "\u{F0016}", + "account-search-outline": "\u{F0935}", + "account-settings": "\u{F0630}", + "account-settings-outline": "\u{F10C9}", + "account-star": "\u{F0017}", + "account-star-outline": "\u{F0BE8}", + "account-supervisor": "\u{F0A8B}", + "account-supervisor-circle": "\u{F0A8C}", + "account-supervisor-circle-outline": "\u{F14EC}", + "account-supervisor-outline": "\u{F112D}", + "account-switch": "\u{F0019}", + "account-switch-outline": "\u{F04CB}", + "account-sync": "\u{F191B}", + "account-sync-outline": "\u{F191C}", + "account-tag": "\u{F1C1B}", + "account-tag-outline": "\u{F1C1C}", + "account-tie": "\u{F0CE3}", + "account-tie-hat": "\u{F1898}", + "account-tie-hat-outline": "\u{F1899}", + "account-tie-outline": "\u{F10CA}", + "account-tie-voice": "\u{F1308}", + "account-tie-voice-off": "\u{F130A}", + "account-tie-voice-off-outline": "\u{F130B}", + "account-tie-voice-outline": "\u{F1309}", + "account-tie-woman": "\u{F1A8C}", + "account-voice": "\u{F05CB}", + "account-voice-off": "\u{F0ED4}", + "account-wrench": "\u{F189A}", + "account-wrench-outline": "\u{F189B}", + "adjust": "\u{F001A}", + "advertisements": "\u{F192A}", + "advertisements-off": "\u{F192B}", + "air-conditioner": "\u{F001B}", + "air-filter": "\u{F0D43}", + "air-horn": "\u{F0DAC}", + "air-humidifier": "\u{F1099}", + "air-humidifier-off": "\u{F1466}", + "air-purifier": "\u{F0D44}", + "air-purifier-off": "\u{F1B57}", + "airbag": "\u{F0BE9}", + "airballoon": "\u{F001C}", + "airballoon-outline": "\u{F100B}", + "airplane": "\u{F001D}", + "airplane-alert": "\u{F187A}", + "airplane-check": "\u{F187B}", + "airplane-clock": "\u{F187C}", + "airplane-cog": "\u{F187D}", + "airplane-edit": "\u{F187E}", + "airplane-landing": "\u{F05D4}", + "airplane-marker": "\u{F187F}", + "airplane-minus": "\u{F1880}", + "airplane-off": "\u{F001E}", + "airplane-plus": "\u{F1881}", + "airplane-remove": "\u{F1882}", + "airplane-search": "\u{F1883}", + "airplane-settings": "\u{F1884}", + "airplane-takeoff": "\u{F05D5}", + "airport": "\u{F084B}", + "alarm": "\u{F0020}", + "alarm-bell": "\u{F078E}", + "alarm-check": "\u{F0021}", + "alarm-light": "\u{F078F}", + "alarm-light-off": "\u{F171E}", + "alarm-light-off-outline": "\u{F171F}", + "alarm-light-outline": "\u{F0BEA}", + "alarm-multiple": "\u{F0022}", + "alarm-note": "\u{F0E71}", + "alarm-note-off": "\u{F0E72}", + "alarm-off": "\u{F0023}", + "alarm-panel": "\u{F15C4}", + "alarm-panel-outline": "\u{F15C5}", + "alarm-plus": "\u{F0024}", + "alarm-snooze": "\u{F068E}", + "album": "\u{F0025}", + "alert": "\u{F0026}", + "alert-box": "\u{F0027}", + "alert-box-outline": "\u{F0CE4}", + "alert-circle": "\u{F0028}", + "alert-circle-check": "\u{F11ED}", + "alert-circle-check-outline": "\u{F11EE}", + "alert-circle-outline": "\u{F05D6}", + "alert-decagram": "\u{F06BD}", + "alert-decagram-outline": "\u{F0CE5}", + "alert-minus": "\u{F14BB}", + "alert-minus-outline": "\u{F14BE}", + "alert-octagon": "\u{F0029}", + "alert-octagon-outline": "\u{F0CE6}", + "alert-octagram": "\u{F0767}", + "alert-octagram-outline": "\u{F0CE7}", + "alert-outline": "\u{F002A}", + "alert-plus": "\u{F14BA}", + "alert-plus-outline": "\u{F14BD}", + "alert-remove": "\u{F14BC}", + "alert-remove-outline": "\u{F14BF}", + "alert-rhombus": "\u{F11CE}", + "alert-rhombus-outline": "\u{F11CF}", + "alien": "\u{F089A}", + "alien-outline": "\u{F10CB}", + "align-horizontal-center": "\u{F11C3}", + "align-horizontal-distribute": "\u{F1962}", + "align-horizontal-left": "\u{F11C2}", + "align-horizontal-right": "\u{F11C4}", + "align-vertical-bottom": "\u{F11C5}", + "align-vertical-center": "\u{F11C6}", + "align-vertical-distribute": "\u{F1963}", + "align-vertical-top": "\u{F11C7}", + "all-inclusive": "\u{F06BE}", + "all-inclusive-box": "\u{F188D}", + "all-inclusive-box-outline": "\u{F188E}", + "allergy": "\u{F1258}", + "alpha": "\u{F002B}", + "alpha-a": "\u{F0AEE}", + "alpha-a-box": "\u{F0B08}", + "alpha-a-box-outline": "\u{F0BEB}", + "alpha-a-circle": "\u{F0BEC}", + "alpha-a-circle-outline": "\u{F0BED}", + "alpha-b": "\u{F0AEF}", + "alpha-b-box": "\u{F0B09}", + "alpha-b-box-outline": "\u{F0BEE}", + "alpha-b-circle": "\u{F0BEF}", + "alpha-b-circle-outline": "\u{F0BF0}", + "alpha-c": "\u{F0AF0}", + "alpha-c-box": "\u{F0B0A}", + "alpha-c-box-outline": "\u{F0BF1}", + "alpha-c-circle": "\u{F0BF2}", + "alpha-c-circle-outline": "\u{F0BF3}", + "alpha-d": "\u{F0AF1}", + "alpha-d-box": "\u{F0B0B}", + "alpha-d-box-outline": "\u{F0BF4}", + "alpha-d-circle": "\u{F0BF5}", + "alpha-d-circle-outline": "\u{F0BF6}", + "alpha-e": "\u{F0AF2}", + "alpha-e-box": "\u{F0B0C}", + "alpha-e-box-outline": "\u{F0BF7}", + "alpha-e-circle": "\u{F0BF8}", + "alpha-e-circle-outline": "\u{F0BF9}", + "alpha-f": "\u{F0AF3}", + "alpha-f-box": "\u{F0B0D}", + "alpha-f-box-outline": "\u{F0BFA}", + "alpha-f-circle": "\u{F0BFB}", + "alpha-f-circle-outline": "\u{F0BFC}", + "alpha-g": "\u{F0AF4}", + "alpha-g-box": "\u{F0B0E}", + "alpha-g-box-outline": "\u{F0BFD}", + "alpha-g-circle": "\u{F0BFE}", + "alpha-g-circle-outline": "\u{F0BFF}", + "alpha-h": "\u{F0AF5}", + "alpha-h-box": "\u{F0B0F}", + "alpha-h-box-outline": "\u{F0C00}", + "alpha-h-circle": "\u{F0C01}", + "alpha-h-circle-outline": "\u{F0C02}", + "alpha-i": "\u{F0AF6}", + "alpha-i-box": "\u{F0B10}", + "alpha-i-box-outline": "\u{F0C03}", + "alpha-i-circle": "\u{F0C04}", + "alpha-i-circle-outline": "\u{F0C05}", + "alpha-j": "\u{F0AF7}", + "alpha-j-box": "\u{F0B11}", + "alpha-j-box-outline": "\u{F0C06}", + "alpha-j-circle": "\u{F0C07}", + "alpha-j-circle-outline": "\u{F0C08}", + "alpha-k": "\u{F0AF8}", + "alpha-k-box": "\u{F0B12}", + "alpha-k-box-outline": "\u{F0C09}", + "alpha-k-circle": "\u{F0C0A}", + "alpha-k-circle-outline": "\u{F0C0B}", + "alpha-l": "\u{F0AF9}", + "alpha-l-box": "\u{F0B13}", + "alpha-l-box-outline": "\u{F0C0C}", + "alpha-l-circle": "\u{F0C0D}", + "alpha-l-circle-outline": "\u{F0C0E}", + "alpha-m": "\u{F0AFA}", + "alpha-m-box": "\u{F0B14}", + "alpha-m-box-outline": "\u{F0C0F}", + "alpha-m-circle": "\u{F0C10}", + "alpha-m-circle-outline": "\u{F0C11}", + "alpha-n": "\u{F0AFB}", + "alpha-n-box": "\u{F0B15}", + "alpha-n-box-outline": "\u{F0C12}", + "alpha-n-circle": "\u{F0C13}", + "alpha-n-circle-outline": "\u{F0C14}", + "alpha-o": "\u{F0AFC}", + "alpha-o-box": "\u{F0B16}", + "alpha-o-box-outline": "\u{F0C15}", + "alpha-o-circle": "\u{F0C16}", + "alpha-o-circle-outline": "\u{F0C17}", + "alpha-p": "\u{F0AFD}", + "alpha-p-box": "\u{F0B17}", + "alpha-p-box-outline": "\u{F0C18}", + "alpha-p-circle": "\u{F0C19}", + "alpha-p-circle-outline": "\u{F0C1A}", + "alpha-q": "\u{F0AFE}", + "alpha-q-box": "\u{F0B18}", + "alpha-q-box-outline": "\u{F0C1B}", + "alpha-q-circle": "\u{F0C1C}", + "alpha-q-circle-outline": "\u{F0C1D}", + "alpha-r": "\u{F0AFF}", + "alpha-r-box": "\u{F0B19}", + "alpha-r-box-outline": "\u{F0C1E}", + "alpha-r-circle": "\u{F0C1F}", + "alpha-r-circle-outline": "\u{F0C20}", + "alpha-s": "\u{F0B00}", + "alpha-s-box": "\u{F0B1A}", + "alpha-s-box-outline": "\u{F0C21}", + "alpha-s-circle": "\u{F0C22}", + "alpha-s-circle-outline": "\u{F0C23}", + "alpha-t": "\u{F0B01}", + "alpha-t-box": "\u{F0B1B}", + "alpha-t-box-outline": "\u{F0C24}", + "alpha-t-circle": "\u{F0C25}", + "alpha-t-circle-outline": "\u{F0C26}", + "alpha-u": "\u{F0B02}", + "alpha-u-box": "\u{F0B1C}", + "alpha-u-box-outline": "\u{F0C27}", + "alpha-u-circle": "\u{F0C28}", + "alpha-u-circle-outline": "\u{F0C29}", + "alpha-v": "\u{F0B03}", + "alpha-v-box": "\u{F0B1D}", + "alpha-v-box-outline": "\u{F0C2A}", + "alpha-v-circle": "\u{F0C2B}", + "alpha-v-circle-outline": "\u{F0C2C}", + "alpha-w": "\u{F0B04}", + "alpha-w-box": "\u{F0B1E}", + "alpha-w-box-outline": "\u{F0C2D}", + "alpha-w-circle": "\u{F0C2E}", + "alpha-w-circle-outline": "\u{F0C2F}", + "alpha-x": "\u{F0B05}", + "alpha-x-box": "\u{F0B1F}", + "alpha-x-box-outline": "\u{F0C30}", + "alpha-x-circle": "\u{F0C31}", + "alpha-x-circle-outline": "\u{F0C32}", + "alpha-y": "\u{F0B06}", + "alpha-y-box": "\u{F0B20}", + "alpha-y-box-outline": "\u{F0C33}", + "alpha-y-circle": "\u{F0C34}", + "alpha-y-circle-outline": "\u{F0C35}", + "alpha-z": "\u{F0B07}", + "alpha-z-box": "\u{F0B21}", + "alpha-z-box-outline": "\u{F0C36}", + "alpha-z-circle": "\u{F0C37}", + "alpha-z-circle-outline": "\u{F0C38}", + "alphabet-aurebesh": "\u{F132C}", + "alphabet-cyrillic": "\u{F132D}", + "alphabet-greek": "\u{F132E}", + "alphabet-latin": "\u{F132F}", + "alphabet-piqad": "\u{F1330}", + "alphabet-tengwar": "\u{F1337}", + "alphabetical": "\u{F002C}", + "alphabetical-off": "\u{F100C}", + "alphabetical-variant": "\u{F100D}", + "alphabetical-variant-off": "\u{F100E}", + "altimeter": "\u{F05D7}", + "ambulance": "\u{F002F}", + "ammunition": "\u{F0CE8}", + "ampersand": "\u{F0A8D}", + "amplifier": "\u{F0030}", + "amplifier-off": "\u{F11B5}", + "anchor": "\u{F0031}", + "android": "\u{F0032}", + "android-studio": "\u{F0034}", + "angle-acute": "\u{F0937}", + "angle-obtuse": "\u{F0938}", + "angle-right": "\u{F0939}", + "angular": "\u{F06B2}", + "angularjs": "\u{F06BF}", + "animation": "\u{F05D8}", + "animation-outline": "\u{F0A8F}", + "animation-play": "\u{F093A}", + "animation-play-outline": "\u{F0A90}", + "ansible": "\u{F109A}", + "antenna": "\u{F1119}", + "anvil": "\u{F089B}", + "apache-kafka": "\u{F100F}", + "api": "\u{F109B}", + "api-off": "\u{F1257}", + "apple": "\u{F0035}", + "apple-finder": "\u{F0036}", + "apple-icloud": "\u{F0038}", + "apple-ios": "\u{F0037}", + "apple-keyboard-caps": "\u{F0632}", + "apple-keyboard-command": "\u{F0633}", + "apple-keyboard-control": "\u{F0634}", + "apple-keyboard-option": "\u{F0635}", + "apple-keyboard-shift": "\u{F0636}", + "apple-safari": "\u{F0039}", + "application": "\u{F08C6}", + "application-array": "\u{F10F5}", + "application-array-outline": "\u{F10F6}", + "application-braces": "\u{F10F7}", + "application-braces-outline": "\u{F10F8}", + "application-brackets": "\u{F0C8B}", + "application-brackets-outline": "\u{F0C8C}", + "application-cog": "\u{F0675}", + "application-cog-outline": "\u{F1577}", + "application-edit": "\u{F00AE}", + "application-edit-outline": "\u{F0619}", + "application-export": "\u{F0DAD}", + "application-import": "\u{F0DAE}", + "application-outline": "\u{F0614}", + "application-parentheses": "\u{F10F9}", + "application-parentheses-outline": "\u{F10FA}", + "application-settings": "\u{F0B60}", + "application-settings-outline": "\u{F1555}", + "application-variable": "\u{F10FB}", + "application-variable-outline": "\u{F10FC}", + "approximately-equal": "\u{F0F9E}", + "approximately-equal-box": "\u{F0F9F}", + "apps": "\u{F003B}", + "apps-box": "\u{F0D46}", + "arch": "\u{F08C7}", + "archive": "\u{F003C}", + "archive-alert": "\u{F14FD}", + "archive-alert-outline": "\u{F14FE}", + "archive-arrow-down": "\u{F1259}", + "archive-arrow-down-outline": "\u{F125A}", + "archive-arrow-up": "\u{F125B}", + "archive-arrow-up-outline": "\u{F125C}", + "archive-cancel": "\u{F174B}", + "archive-cancel-outline": "\u{F174C}", + "archive-check": "\u{F174D}", + "archive-check-outline": "\u{F174E}", + "archive-clock": "\u{F174F}", + "archive-clock-outline": "\u{F1750}", + "archive-cog": "\u{F1751}", + "archive-cog-outline": "\u{F1752}", + "archive-edit": "\u{F1753}", + "archive-edit-outline": "\u{F1754}", + "archive-eye": "\u{F1755}", + "archive-eye-outline": "\u{F1756}", + "archive-lock": "\u{F1757}", + "archive-lock-open": "\u{F1758}", + "archive-lock-open-outline": "\u{F1759}", + "archive-lock-outline": "\u{F175A}", + "archive-marker": "\u{F175B}", + "archive-marker-outline": "\u{F175C}", + "archive-minus": "\u{F175D}", + "archive-minus-outline": "\u{F175E}", + "archive-music": "\u{F175F}", + "archive-music-outline": "\u{F1760}", + "archive-off": "\u{F1761}", + "archive-off-outline": "\u{F1762}", + "archive-outline": "\u{F120E}", + "archive-plus": "\u{F1763}", + "archive-plus-outline": "\u{F1764}", + "archive-refresh": "\u{F1765}", + "archive-refresh-outline": "\u{F1766}", + "archive-remove": "\u{F1767}", + "archive-remove-outline": "\u{F1768}", + "archive-search": "\u{F1769}", + "archive-search-outline": "\u{F176A}", + "archive-settings": "\u{F176B}", + "archive-settings-outline": "\u{F176C}", + "archive-star": "\u{F176D}", + "archive-star-outline": "\u{F176E}", + "archive-sync": "\u{F176F}", + "archive-sync-outline": "\u{F1770}", + "arm-flex": "\u{F0FD7}", + "arm-flex-outline": "\u{F0FD6}", + "arrange-bring-forward": "\u{F003D}", + "arrange-bring-to-front": "\u{F003E}", + "arrange-send-backward": "\u{F003F}", + "arrange-send-to-back": "\u{F0040}", + "arrow-all": "\u{F0041}", + "arrow-bottom-left": "\u{F0042}", + "arrow-bottom-left-bold-box": "\u{F1964}", + "arrow-bottom-left-bold-box-outline": "\u{F1965}", + "arrow-bottom-left-bold-outline": "\u{F09B7}", + "arrow-bottom-left-thick": "\u{F09B8}", + "arrow-bottom-left-thin": "\u{F19B6}", + "arrow-bottom-left-thin-circle-outline": "\u{F1596}", + "arrow-bottom-right": "\u{F0043}", + "arrow-bottom-right-bold-box": "\u{F1966}", + "arrow-bottom-right-bold-box-outline": "\u{F1967}", + "arrow-bottom-right-bold-outline": "\u{F09B9}", + "arrow-bottom-right-thick": "\u{F09BA}", + "arrow-bottom-right-thin": "\u{F19B7}", + "arrow-bottom-right-thin-circle-outline": "\u{F1595}", + "arrow-collapse": "\u{F0615}", + "arrow-collapse-all": "\u{F0044}", + "arrow-collapse-down": "\u{F0792}", + "arrow-collapse-horizontal": "\u{F084C}", + "arrow-collapse-left": "\u{F0793}", + "arrow-collapse-right": "\u{F0794}", + "arrow-collapse-up": "\u{F0795}", + "arrow-collapse-vertical": "\u{F084D}", + "arrow-decision": "\u{F09BB}", + "arrow-decision-auto": "\u{F09BC}", + "arrow-decision-auto-outline": "\u{F09BD}", + "arrow-decision-outline": "\u{F09BE}", + "arrow-down": "\u{F0045}", + "arrow-down-bold": "\u{F072E}", + "arrow-down-bold-box": "\u{F072F}", + "arrow-down-bold-box-outline": "\u{F0730}", + "arrow-down-bold-circle": "\u{F0047}", + "arrow-down-bold-circle-outline": "\u{F0048}", + "arrow-down-bold-hexagon-outline": "\u{F0049}", + "arrow-down-bold-outline": "\u{F09BF}", + "arrow-down-box": "\u{F06C0}", + "arrow-down-circle": "\u{F0CDB}", + "arrow-down-circle-outline": "\u{F0CDC}", + "arrow-down-drop-circle": "\u{F004A}", + "arrow-down-drop-circle-outline": "\u{F004B}", + "arrow-down-left": "\u{F17A1}", + "arrow-down-left-bold": "\u{F17A2}", + "arrow-down-right": "\u{F17A3}", + "arrow-down-right-bold": "\u{F17A4}", + "arrow-down-thick": "\u{F0046}", + "arrow-down-thin": "\u{F19B3}", + "arrow-down-thin-circle-outline": "\u{F1599}", + "arrow-expand": "\u{F0616}", + "arrow-expand-all": "\u{F004C}", + "arrow-expand-down": "\u{F0796}", + "arrow-expand-horizontal": "\u{F084E}", + "arrow-expand-left": "\u{F0797}", + "arrow-expand-right": "\u{F0798}", + "arrow-expand-up": "\u{F0799}", + "arrow-expand-vertical": "\u{F084F}", + "arrow-horizontal-lock": "\u{F115B}", + "arrow-left": "\u{F004D}", + "arrow-left-bold": "\u{F0731}", + "arrow-left-bold-box": "\u{F0732}", + "arrow-left-bold-box-outline": "\u{F0733}", + "arrow-left-bold-circle": "\u{F004F}", + "arrow-left-bold-circle-outline": "\u{F0050}", + "arrow-left-bold-hexagon-outline": "\u{F0051}", + "arrow-left-bold-outline": "\u{F09C0}", + "arrow-left-bottom": "\u{F17A5}", + "arrow-left-bottom-bold": "\u{F17A6}", + "arrow-left-box": "\u{F06C1}", + "arrow-left-circle": "\u{F0CDD}", + "arrow-left-circle-outline": "\u{F0CDE}", + "arrow-left-drop-circle": "\u{F0052}", + "arrow-left-drop-circle-outline": "\u{F0053}", + "arrow-left-right": "\u{F0E73}", + "arrow-left-right-bold": "\u{F0E74}", + "arrow-left-right-bold-outline": "\u{F09C1}", + "arrow-left-thick": "\u{F004E}", + "arrow-left-thin": "\u{F19B1}", + "arrow-left-thin-circle-outline": "\u{F159A}", + "arrow-left-top": "\u{F17A7}", + "arrow-left-top-bold": "\u{F17A8}", + "arrow-projectile": "\u{F1840}", + "arrow-projectile-multiple": "\u{F183F}", + "arrow-right": "\u{F0054}", + "arrow-right-bold": "\u{F0734}", + "arrow-right-bold-box": "\u{F0735}", + "arrow-right-bold-box-outline": "\u{F0736}", + "arrow-right-bold-circle": "\u{F0056}", + "arrow-right-bold-circle-outline": "\u{F0057}", + "arrow-right-bold-hexagon-outline": "\u{F0058}", + "arrow-right-bold-outline": "\u{F09C2}", + "arrow-right-bottom": "\u{F17A9}", + "arrow-right-bottom-bold": "\u{F17AA}", + "arrow-right-box": "\u{F06C2}", + "arrow-right-circle": "\u{F0CDF}", + "arrow-right-circle-outline": "\u{F0CE0}", + "arrow-right-drop-circle": "\u{F0059}", + "arrow-right-drop-circle-outline": "\u{F005A}", + "arrow-right-thick": "\u{F0055}", + "arrow-right-thin": "\u{F19B0}", + "arrow-right-thin-circle-outline": "\u{F1598}", + "arrow-right-top": "\u{F17AB}", + "arrow-right-top-bold": "\u{F17AC}", + "arrow-split-horizontal": "\u{F093B}", + "arrow-split-vertical": "\u{F093C}", + "arrow-top-left": "\u{F005B}", + "arrow-top-left-bold-box": "\u{F1968}", + "arrow-top-left-bold-box-outline": "\u{F1969}", + "arrow-top-left-bold-outline": "\u{F09C3}", + "arrow-top-left-bottom-right": "\u{F0E75}", + "arrow-top-left-bottom-right-bold": "\u{F0E76}", + "arrow-top-left-thick": "\u{F09C4}", + "arrow-top-left-thin": "\u{F19B5}", + "arrow-top-left-thin-circle-outline": "\u{F1593}", + "arrow-top-right": "\u{F005C}", + "arrow-top-right-bold-box": "\u{F196A}", + "arrow-top-right-bold-box-outline": "\u{F196B}", + "arrow-top-right-bold-outline": "\u{F09C5}", + "arrow-top-right-bottom-left": "\u{F0E77}", + "arrow-top-right-bottom-left-bold": "\u{F0E78}", + "arrow-top-right-thick": "\u{F09C6}", + "arrow-top-right-thin": "\u{F19B4}", + "arrow-top-right-thin-circle-outline": "\u{F1594}", + "arrow-u-down-left": "\u{F17AD}", + "arrow-u-down-left-bold": "\u{F17AE}", + "arrow-u-down-right": "\u{F17AF}", + "arrow-u-down-right-bold": "\u{F17B0}", + "arrow-u-left-bottom": "\u{F17B1}", + "arrow-u-left-bottom-bold": "\u{F17B2}", + "arrow-u-left-top": "\u{F17B3}", + "arrow-u-left-top-bold": "\u{F17B4}", + "arrow-u-right-bottom": "\u{F17B5}", + "arrow-u-right-bottom-bold": "\u{F17B6}", + "arrow-u-right-top": "\u{F17B7}", + "arrow-u-right-top-bold": "\u{F17B8}", + "arrow-u-up-left": "\u{F17B9}", + "arrow-u-up-left-bold": "\u{F17BA}", + "arrow-u-up-right": "\u{F17BB}", + "arrow-u-up-right-bold": "\u{F17BC}", + "arrow-up": "\u{F005D}", + "arrow-up-bold": "\u{F0737}", + "arrow-up-bold-box": "\u{F0738}", + "arrow-up-bold-box-outline": "\u{F0739}", + "arrow-up-bold-circle": "\u{F005F}", + "arrow-up-bold-circle-outline": "\u{F0060}", + "arrow-up-bold-hexagon-outline": "\u{F0061}", + "arrow-up-bold-outline": "\u{F09C7}", + "arrow-up-box": "\u{F06C3}", + "arrow-up-circle": "\u{F0CE1}", + "arrow-up-circle-outline": "\u{F0CE2}", + "arrow-up-down": "\u{F0E79}", + "arrow-up-down-bold": "\u{F0E7A}", + "arrow-up-down-bold-outline": "\u{F09C8}", + "arrow-up-drop-circle": "\u{F0062}", + "arrow-up-drop-circle-outline": "\u{F0063}", + "arrow-up-left": "\u{F17BD}", + "arrow-up-left-bold": "\u{F17BE}", + "arrow-up-right": "\u{F17BF}", + "arrow-up-right-bold": "\u{F17C0}", + "arrow-up-thick": "\u{F005E}", + "arrow-up-thin": "\u{F19B2}", + "arrow-up-thin-circle-outline": "\u{F1597}", + "arrow-vertical-lock": "\u{F115C}", + "artboard": "\u{F1B9A}", + "artstation": "\u{F0B5B}", + "aspect-ratio": "\u{F0A24}", + "assistant": "\u{F0064}", + "asterisk": "\u{F06C4}", + "asterisk-circle-outline": "\u{F1A27}", + "at": "\u{F0065}", + "atlassian": "\u{F0804}", + "atm": "\u{F0D47}", + "atom": "\u{F0768}", + "atom-variant": "\u{F0E7B}", + "attachment": "\u{F0066}", + "attachment-check": "\u{F1AC1}", + "attachment-lock": "\u{F19C4}", + "attachment-minus": "\u{F1AC2}", + "attachment-off": "\u{F1AC3}", + "attachment-plus": "\u{F1AC4}", + "attachment-remove": "\u{F1AC5}", + "atv": "\u{F1B70}", + "audio-input-rca": "\u{F186B}", + "audio-input-stereo-minijack": "\u{F186C}", + "audio-input-xlr": "\u{F186D}", + "audio-video": "\u{F093D}", + "audio-video-off": "\u{F11B6}", + "augmented-reality": "\u{F0850}", + "aurora": "\u{F1BB9}", + "auto-download": "\u{F137E}", + "auto-fix": "\u{F0068}", + "auto-mode": "\u{F1C20}", + "auto-upload": "\u{F0069}", + "autorenew": "\u{F006A}", + "autorenew-off": "\u{F19E7}", + "av-timer": "\u{F006B}", + "awning": "\u{F1B87}", + "awning-outline": "\u{F1B88}", + "aws": "\u{F0E0F}", + "axe": "\u{F08C8}", + "axe-battle": "\u{F1842}", + "axis": "\u{F0D48}", + "axis-arrow": "\u{F0D49}", + "axis-arrow-info": "\u{F140E}", + "axis-arrow-lock": "\u{F0D4A}", + "axis-lock": "\u{F0D4B}", + "axis-x-arrow": "\u{F0D4C}", + "axis-x-arrow-lock": "\u{F0D4D}", + "axis-x-rotate-clockwise": "\u{F0D4E}", + "axis-x-rotate-counterclockwise": "\u{F0D4F}", + "axis-x-y-arrow-lock": "\u{F0D50}", + "axis-y-arrow": "\u{F0D51}", + "axis-y-arrow-lock": "\u{F0D52}", + "axis-y-rotate-clockwise": "\u{F0D53}", + "axis-y-rotate-counterclockwise": "\u{F0D54}", + "axis-z-arrow": "\u{F0D55}", + "axis-z-arrow-lock": "\u{F0D56}", + "axis-z-rotate-clockwise": "\u{F0D57}", + "axis-z-rotate-counterclockwise": "\u{F0D58}", + "babel": "\u{F0A25}", + "baby": "\u{F006C}", + "baby-bottle": "\u{F0F39}", + "baby-bottle-outline": "\u{F0F3A}", + "baby-buggy": "\u{F13E0}", + "baby-buggy-off": "\u{F1AF3}", + "baby-carriage": "\u{F068F}", + "baby-carriage-off": "\u{F0FA0}", + "baby-face": "\u{F0E7C}", + "baby-face-outline": "\u{F0E7D}", + "backburger": "\u{F006D}", + "backspace": "\u{F006E}", + "backspace-outline": "\u{F0B5C}", + "backspace-reverse": "\u{F0E7E}", + "backspace-reverse-outline": "\u{F0E7F}", + "backup-restore": "\u{F006F}", + "bacteria": "\u{F0ED5}", + "bacteria-outline": "\u{F0ED6}", + "badge-account": "\u{F0DA7}", + "badge-account-alert": "\u{F0DA8}", + "badge-account-alert-outline": "\u{F0DA9}", + "badge-account-horizontal": "\u{F0E0D}", + "badge-account-horizontal-outline": "\u{F0E0E}", + "badge-account-outline": "\u{F0DAA}", + "badminton": "\u{F0851}", + "bag-carry-on": "\u{F0F3B}", + "bag-carry-on-check": "\u{F0D65}", + "bag-carry-on-off": "\u{F0F3C}", + "bag-checked": "\u{F0F3D}", + "bag-personal": "\u{F0E10}", + "bag-personal-off": "\u{F0E11}", + "bag-personal-off-outline": "\u{F0E12}", + "bag-personal-outline": "\u{F0E13}", + "bag-personal-tag": "\u{F1B0C}", + "bag-personal-tag-outline": "\u{F1B0D}", + "bag-suitcase": "\u{F158B}", + "bag-suitcase-off": "\u{F158D}", + "bag-suitcase-off-outline": "\u{F158E}", + "bag-suitcase-outline": "\u{F158C}", + "baguette": "\u{F0F3E}", + "balcony": "\u{F1817}", + "balloon": "\u{F0A26}", + "ballot": "\u{F09C9}", + "ballot-outline": "\u{F09CA}", + "ballot-recount": "\u{F0C39}", + "ballot-recount-outline": "\u{F0C3A}", + "bandage": "\u{F0DAF}", + "bank": "\u{F0070}", + "bank-check": "\u{F1655}", + "bank-circle": "\u{F1C03}", + "bank-circle-outline": "\u{F1C04}", + "bank-minus": "\u{F0DB0}", + "bank-off": "\u{F1656}", + "bank-off-outline": "\u{F1657}", + "bank-outline": "\u{F0E80}", + "bank-plus": "\u{F0DB1}", + "bank-remove": "\u{F0DB2}", + "bank-transfer": "\u{F0A27}", + "bank-transfer-in": "\u{F0A28}", + "bank-transfer-out": "\u{F0A29}", + "barcode": "\u{F0071}", + "barcode-off": "\u{F1236}", + "barcode-scan": "\u{F0072}", + "barley": "\u{F0073}", + "barley-off": "\u{F0B5D}", + "barn": "\u{F0B5E}", + "barrel": "\u{F0074}", + "barrel-outline": "\u{F1A28}", + "baseball": "\u{F0852}", + "baseball-bat": "\u{F0853}", + "baseball-diamond": "\u{F15EC}", + "baseball-diamond-outline": "\u{F15ED}", + "baseball-outline": "\u{F1C5A}", + "bash": "\u{F1183}", + "basket": "\u{F0076}", + "basket-check": "\u{F18E5}", + "basket-check-outline": "\u{F18E6}", + "basket-fill": "\u{F0077}", + "basket-minus": "\u{F1523}", + "basket-minus-outline": "\u{F1524}", + "basket-off": "\u{F1525}", + "basket-off-outline": "\u{F1526}", + "basket-outline": "\u{F1181}", + "basket-plus": "\u{F1527}", + "basket-plus-outline": "\u{F1528}", + "basket-remove": "\u{F1529}", + "basket-remove-outline": "\u{F152A}", + "basket-unfill": "\u{F0078}", + "basketball": "\u{F0806}", + "basketball-hoop": "\u{F0C3B}", + "basketball-hoop-outline": "\u{F0C3C}", + "bat": "\u{F0B5F}", + "bathtub": "\u{F1818}", + "bathtub-outline": "\u{F1819}", + "battery": "\u{F0079}", + "battery-10": "\u{F007A}", + "battery-10-bluetooth": "\u{F093E}", + "battery-20": "\u{F007B}", + "battery-20-bluetooth": "\u{F093F}", + "battery-30": "\u{F007C}", + "battery-30-bluetooth": "\u{F0940}", + "battery-40": "\u{F007D}", + "battery-40-bluetooth": "\u{F0941}", + "battery-50": "\u{F007E}", + "battery-50-bluetooth": "\u{F0942}", + "battery-60": "\u{F007F}", + "battery-60-bluetooth": "\u{F0943}", + "battery-70": "\u{F0080}", + "battery-70-bluetooth": "\u{F0944}", + "battery-80": "\u{F0081}", + "battery-80-bluetooth": "\u{F0945}", + "battery-90": "\u{F0082}", + "battery-90-bluetooth": "\u{F0946}", + "battery-alert": "\u{F0083}", + "battery-alert-bluetooth": "\u{F0947}", + "battery-alert-variant": "\u{F10CC}", + "battery-alert-variant-outline": "\u{F10CD}", + "battery-arrow-down": "\u{F17DE}", + "battery-arrow-down-outline": "\u{F17DF}", + "battery-arrow-up": "\u{F17E0}", + "battery-arrow-up-outline": "\u{F17E1}", + "battery-bluetooth": "\u{F0948}", + "battery-bluetooth-variant": "\u{F0949}", + "battery-charging": "\u{F0084}", + "battery-charging-10": "\u{F089C}", + "battery-charging-100": "\u{F0085}", + "battery-charging-20": "\u{F0086}", + "battery-charging-30": "\u{F0087}", + "battery-charging-40": "\u{F0088}", + "battery-charging-50": "\u{F089D}", + "battery-charging-60": "\u{F0089}", + "battery-charging-70": "\u{F089E}", + "battery-charging-80": "\u{F008A}", + "battery-charging-90": "\u{F008B}", + "battery-charging-high": "\u{F12A6}", + "battery-charging-low": "\u{F12A4}", + "battery-charging-medium": "\u{F12A5}", + "battery-charging-outline": "\u{F089F}", + "battery-charging-wireless": "\u{F0807}", + "battery-charging-wireless-10": "\u{F0808}", + "battery-charging-wireless-20": "\u{F0809}", + "battery-charging-wireless-30": "\u{F080A}", + "battery-charging-wireless-40": "\u{F080B}", + "battery-charging-wireless-50": "\u{F080C}", + "battery-charging-wireless-60": "\u{F080D}", + "battery-charging-wireless-70": "\u{F080E}", + "battery-charging-wireless-80": "\u{F080F}", + "battery-charging-wireless-90": "\u{F0810}", + "battery-charging-wireless-alert": "\u{F0811}", + "battery-charging-wireless-outline": "\u{F0812}", + "battery-check": "\u{F17E2}", + "battery-check-outline": "\u{F17E3}", + "battery-clock": "\u{F19E5}", + "battery-clock-outline": "\u{F19E6}", + "battery-heart": "\u{F120F}", + "battery-heart-outline": "\u{F1210}", + "battery-heart-variant": "\u{F1211}", + "battery-high": "\u{F12A3}", + "battery-lock": "\u{F179C}", + "battery-lock-open": "\u{F179D}", + "battery-low": "\u{F12A1}", + "battery-medium": "\u{F12A2}", + "battery-minus": "\u{F17E4}", + "battery-minus-outline": "\u{F17E5}", + "battery-minus-variant": "\u{F008C}", + "battery-negative": "\u{F008D}", + "battery-off": "\u{F125D}", + "battery-off-outline": "\u{F125E}", + "battery-outline": "\u{F008E}", + "battery-plus": "\u{F17E6}", + "battery-plus-outline": "\u{F17E7}", + "battery-plus-variant": "\u{F008F}", + "battery-positive": "\u{F0090}", + "battery-remove": "\u{F17E8}", + "battery-remove-outline": "\u{F17E9}", + "battery-sync": "\u{F1834}", + "battery-sync-outline": "\u{F1835}", + "battery-unknown": "\u{F0091}", + "battery-unknown-bluetooth": "\u{F094A}", + "beach": "\u{F0092}", + "beaker": "\u{F0CEA}", + "beaker-alert": "\u{F1229}", + "beaker-alert-outline": "\u{F122A}", + "beaker-check": "\u{F122B}", + "beaker-check-outline": "\u{F122C}", + "beaker-minus": "\u{F122D}", + "beaker-minus-outline": "\u{F122E}", + "beaker-outline": "\u{F0690}", + "beaker-plus": "\u{F122F}", + "beaker-plus-outline": "\u{F1230}", + "beaker-question": "\u{F1231}", + "beaker-question-outline": "\u{F1232}", + "beaker-remove": "\u{F1233}", + "beaker-remove-outline": "\u{F1234}", + "bed": "\u{F02E3}", + "bed-clock": "\u{F1B94}", + "bed-double": "\u{F0FD4}", + "bed-double-outline": "\u{F0FD3}", + "bed-empty": "\u{F08A0}", + "bed-king": "\u{F0FD2}", + "bed-king-outline": "\u{F0FD1}", + "bed-outline": "\u{F0099}", + "bed-queen": "\u{F0FD0}", + "bed-queen-outline": "\u{F0FDB}", + "bed-single": "\u{F106D}", + "bed-single-outline": "\u{F106E}", + "bee": "\u{F0FA1}", + "bee-flower": "\u{F0FA2}", + "beehive-off-outline": "\u{F13ED}", + "beehive-outline": "\u{F10CE}", + "beekeeper": "\u{F14E2}", + "beer": "\u{F0098}", + "beer-outline": "\u{F130C}", + "bell": "\u{F009A}", + "bell-alert": "\u{F0D59}", + "bell-alert-outline": "\u{F0E81}", + "bell-badge": "\u{F116B}", + "bell-badge-outline": "\u{F0178}", + "bell-cancel": "\u{F13E7}", + "bell-cancel-outline": "\u{F13E8}", + "bell-check": "\u{F11E5}", + "bell-check-outline": "\u{F11E6}", + "bell-circle": "\u{F0D5A}", + "bell-circle-outline": "\u{F0D5B}", + "bell-cog": "\u{F1A29}", + "bell-cog-outline": "\u{F1A2A}", + "bell-minus": "\u{F13E9}", + "bell-minus-outline": "\u{F13EA}", + "bell-off": "\u{F009B}", + "bell-off-outline": "\u{F0A91}", + "bell-outline": "\u{F009C}", + "bell-plus": "\u{F009D}", + "bell-plus-outline": "\u{F0A92}", + "bell-remove": "\u{F13EB}", + "bell-remove-outline": "\u{F13EC}", + "bell-ring": "\u{F009E}", + "bell-ring-outline": "\u{F009F}", + "bell-sleep": "\u{F00A0}", + "bell-sleep-outline": "\u{F0A93}", + "bench": "\u{F1C21}", + "bench-back": "\u{F1C22}", + "beta": "\u{F00A1}", + "betamax": "\u{F09CB}", + "biathlon": "\u{F0E14}", + "bicycle": "\u{F109C}", + "bicycle-basket": "\u{F1235}", + "bicycle-cargo": "\u{F189C}", + "bicycle-electric": "\u{F15B4}", + "bicycle-penny-farthing": "\u{F15E9}", + "bike": "\u{F00A3}", + "bike-fast": "\u{F111F}", + "bike-pedal": "\u{F1C23}", + "bike-pedal-clipless": "\u{F1C24}", + "bike-pedal-mountain": "\u{F1C25}", + "billboard": "\u{F1010}", + "billiards": "\u{F0B61}", + "billiards-rack": "\u{F0B62}", + "binoculars": "\u{F00A5}", + "bio": "\u{F00A6}", + "biohazard": "\u{F00A7}", + "bird": "\u{F15C6}", + "bitbucket": "\u{F00A8}", + "bitcoin": "\u{F0813}", + "black-mesa": "\u{F00A9}", + "blender": "\u{F0CEB}", + "blender-outline": "\u{F181A}", + "blender-software": "\u{F00AB}", + "blinds": "\u{F00AC}", + "blinds-horizontal": "\u{F1A2B}", + "blinds-horizontal-closed": "\u{F1A2C}", + "blinds-open": "\u{F1011}", + "blinds-vertical": "\u{F1A2D}", + "blinds-vertical-closed": "\u{F1A2E}", + "block-helper": "\u{F00AD}", + "blood-bag": "\u{F0CEC}", + "bluetooth": "\u{F00AF}", + "bluetooth-audio": "\u{F00B0}", + "bluetooth-connect": "\u{F00B1}", + "bluetooth-off": "\u{F00B2}", + "bluetooth-settings": "\u{F00B3}", + "bluetooth-transfer": "\u{F00B4}", + "blur": "\u{F00B5}", + "blur-linear": "\u{F00B6}", + "blur-off": "\u{F00B7}", + "blur-radial": "\u{F00B8}", + "bolt": "\u{F0DB3}", + "bomb": "\u{F0691}", + "bomb-off": "\u{F06C5}", + "bone": "\u{F00B9}", + "bone-off": "\u{F19E0}", + "book": "\u{F00BA}", + "book-account": "\u{F13AD}", + "book-account-outline": "\u{F13AE}", + "book-alert": "\u{F167C}", + "book-alert-outline": "\u{F167D}", + "book-alphabet": "\u{F061D}", + "book-arrow-down": "\u{F167E}", + "book-arrow-down-outline": "\u{F167F}", + "book-arrow-left": "\u{F1680}", + "book-arrow-left-outline": "\u{F1681}", + "book-arrow-right": "\u{F1682}", + "book-arrow-right-outline": "\u{F1683}", + "book-arrow-up": "\u{F1684}", + "book-arrow-up-outline": "\u{F1685}", + "book-cancel": "\u{F1686}", + "book-cancel-outline": "\u{F1687}", + "book-check": "\u{F14F3}", + "book-check-outline": "\u{F14F4}", + "book-clock": "\u{F1688}", + "book-clock-outline": "\u{F1689}", + "book-cog": "\u{F168A}", + "book-cog-outline": "\u{F168B}", + "book-cross": "\u{F00A2}", + "book-edit": "\u{F168C}", + "book-edit-outline": "\u{F168D}", + "book-education": "\u{F16C9}", + "book-education-outline": "\u{F16CA}", + "book-heart": "\u{F1A1D}", + "book-heart-outline": "\u{F1A1E}", + "book-information-variant": "\u{F106F}", + "book-lock": "\u{F079A}", + "book-lock-open": "\u{F079B}", + "book-lock-open-outline": "\u{F168E}", + "book-lock-outline": "\u{F168F}", + "book-marker": "\u{F1690}", + "book-marker-outline": "\u{F1691}", + "book-minus": "\u{F05D9}", + "book-minus-multiple": "\u{F0A94}", + "book-minus-multiple-outline": "\u{F090B}", + "book-minus-outline": "\u{F1692}", + "book-multiple": "\u{F00BB}", + "book-multiple-outline": "\u{F0436}", + "book-music": "\u{F0067}", + "book-music-outline": "\u{F1693}", + "book-off": "\u{F1694}", + "book-off-outline": "\u{F1695}", + "book-open": "\u{F00BD}", + "book-open-blank-variant": "\u{F00BE}", + "book-open-outline": "\u{F0B63}", + "book-open-page-variant": "\u{F05DA}", + "book-open-page-variant-outline": "\u{F15D6}", + "book-open-variant": "\u{F14F7}", + "book-outline": "\u{F0B64}", + "book-play": "\u{F0E82}", + "book-play-outline": "\u{F0E83}", + "book-plus": "\u{F05DB}", + "book-plus-multiple": "\u{F0A95}", + "book-plus-multiple-outline": "\u{F0ADE}", + "book-plus-outline": "\u{F1696}", + "book-refresh": "\u{F1697}", + "book-refresh-outline": "\u{F1698}", + "book-remove": "\u{F0A97}", + "book-remove-multiple": "\u{F0A96}", + "book-remove-multiple-outline": "\u{F04CA}", + "book-remove-outline": "\u{F1699}", + "book-search": "\u{F0E84}", + "book-search-outline": "\u{F0E85}", + "book-settings": "\u{F169A}", + "book-settings-outline": "\u{F169B}", + "book-sync": "\u{F169C}", + "book-sync-outline": "\u{F16C8}", + "book-variant": "\u{F00BF}", + "bookmark": "\u{F00C0}", + "bookmark-box": "\u{F1B75}", + "bookmark-box-multiple": "\u{F196C}", + "bookmark-box-multiple-outline": "\u{F196D}", + "bookmark-box-outline": "\u{F1B76}", + "bookmark-check": "\u{F00C1}", + "bookmark-check-outline": "\u{F137B}", + "bookmark-minus": "\u{F09CC}", + "bookmark-minus-outline": "\u{F09CD}", + "bookmark-multiple": "\u{F0E15}", + "bookmark-multiple-outline": "\u{F0E16}", + "bookmark-music": "\u{F00C2}", + "bookmark-music-outline": "\u{F1379}", + "bookmark-off": "\u{F09CE}", + "bookmark-off-outline": "\u{F09CF}", + "bookmark-outline": "\u{F00C3}", + "bookmark-plus": "\u{F00C5}", + "bookmark-plus-outline": "\u{F00C4}", + "bookmark-remove": "\u{F00C6}", + "bookmark-remove-outline": "\u{F137A}", + "bookshelf": "\u{F125F}", + "boom-gate": "\u{F0E86}", + "boom-gate-alert": "\u{F0E87}", + "boom-gate-alert-outline": "\u{F0E88}", + "boom-gate-arrow-down": "\u{F0E89}", + "boom-gate-arrow-down-outline": "\u{F0E8A}", + "boom-gate-arrow-up": "\u{F0E8C}", + "boom-gate-arrow-up-outline": "\u{F0E8D}", + "boom-gate-outline": "\u{F0E8B}", + "boom-gate-up": "\u{F17F9}", + "boom-gate-up-outline": "\u{F17FA}", + "boombox": "\u{F05DC}", + "boomerang": "\u{F10CF}", + "bootstrap": "\u{F06C6}", + "border-all": "\u{F00C7}", + "border-all-variant": "\u{F08A1}", + "border-bottom": "\u{F00C8}", + "border-bottom-variant": "\u{F08A2}", + "border-color": "\u{F00C9}", + "border-horizontal": "\u{F00CA}", + "border-inside": "\u{F00CB}", + "border-left": "\u{F00CC}", + "border-left-variant": "\u{F08A3}", + "border-none": "\u{F00CD}", + "border-none-variant": "\u{F08A4}", + "border-outside": "\u{F00CE}", + "border-radius": "\u{F1AF4}", + "border-right": "\u{F00CF}", + "border-right-variant": "\u{F08A5}", + "border-style": "\u{F00D0}", + "border-top": "\u{F00D1}", + "border-top-variant": "\u{F08A6}", + "border-vertical": "\u{F00D2}", + "bottle-soda": "\u{F1070}", + "bottle-soda-classic": "\u{F1071}", + "bottle-soda-classic-outline": "\u{F1363}", + "bottle-soda-outline": "\u{F1072}", + "bottle-tonic": "\u{F112E}", + "bottle-tonic-outline": "\u{F112F}", + "bottle-tonic-plus": "\u{F1130}", + "bottle-tonic-plus-outline": "\u{F1131}", + "bottle-tonic-skull": "\u{F1132}", + "bottle-tonic-skull-outline": "\u{F1133}", + "bottle-wine": "\u{F0854}", + "bottle-wine-outline": "\u{F1310}", + "bow-arrow": "\u{F1841}", + "bow-tie": "\u{F0678}", + "bowl": "\u{F028E}", + "bowl-mix": "\u{F0617}", + "bowl-mix-outline": "\u{F02E4}", + "bowl-outline": "\u{F02A9}", + "bowling": "\u{F00D3}", + "box": "\u{F00D4}", + "box-cutter": "\u{F00D5}", + "box-cutter-off": "\u{F0B4A}", + "box-shadow": "\u{F0637}", + "boxing-glove": "\u{F0B65}", + "braille": "\u{F09D0}", + "brain": "\u{F09D1}", + "bread-slice": "\u{F0CEE}", + "bread-slice-outline": "\u{F0CEF}", + "bridge": "\u{F0618}", + "briefcase": "\u{F00D6}", + "briefcase-account": "\u{F0CF0}", + "briefcase-account-outline": "\u{F0CF1}", + "briefcase-arrow-left-right": "\u{F1A8D}", + "briefcase-arrow-left-right-outline": "\u{F1A8E}", + "briefcase-arrow-up-down": "\u{F1A8F}", + "briefcase-arrow-up-down-outline": "\u{F1A90}", + "briefcase-check": "\u{F00D7}", + "briefcase-check-outline": "\u{F131E}", + "briefcase-clock": "\u{F10D0}", + "briefcase-clock-outline": "\u{F10D1}", + "briefcase-download": "\u{F00D8}", + "briefcase-download-outline": "\u{F0C3D}", + "briefcase-edit": "\u{F0A98}", + "briefcase-edit-outline": "\u{F0C3E}", + "briefcase-eye": "\u{F17D9}", + "briefcase-eye-outline": "\u{F17DA}", + "briefcase-minus": "\u{F0A2A}", + "briefcase-minus-outline": "\u{F0C3F}", + "briefcase-off": "\u{F1658}", + "briefcase-off-outline": "\u{F1659}", + "briefcase-outline": "\u{F0814}", + "briefcase-plus": "\u{F0A2B}", + "briefcase-plus-outline": "\u{F0C40}", + "briefcase-remove": "\u{F0A2C}", + "briefcase-remove-outline": "\u{F0C41}", + "briefcase-search": "\u{F0A2D}", + "briefcase-search-outline": "\u{F0C42}", + "briefcase-upload": "\u{F00D9}", + "briefcase-upload-outline": "\u{F0C43}", + "briefcase-variant": "\u{F1494}", + "briefcase-variant-off": "\u{F165A}", + "briefcase-variant-off-outline": "\u{F165B}", + "briefcase-variant-outline": "\u{F1495}", + "brightness-1": "\u{F00DA}", + "brightness-2": "\u{F00DB}", + "brightness-3": "\u{F00DC}", + "brightness-4": "\u{F00DD}", + "brightness-5": "\u{F00DE}", + "brightness-6": "\u{F00DF}", + "brightness-7": "\u{F00E0}", + "brightness-auto": "\u{F00E1}", + "brightness-percent": "\u{F0CF2}", + "broadcast": "\u{F1720}", + "broadcast-off": "\u{F1721}", + "broom": "\u{F00E2}", + "brush": "\u{F00E3}", + "brush-off": "\u{F1771}", + "brush-outline": "\u{F1A0D}", + "brush-variant": "\u{F1813}", + "bucket": "\u{F1415}", + "bucket-outline": "\u{F1416}", + "buffet": "\u{F0578}", + "bug": "\u{F00E4}", + "bug-check": "\u{F0A2E}", + "bug-check-outline": "\u{F0A2F}", + "bug-outline": "\u{F0A30}", + "bug-pause": "\u{F1AF5}", + "bug-pause-outline": "\u{F1AF6}", + "bug-play": "\u{F1AF7}", + "bug-play-outline": "\u{F1AF8}", + "bug-stop": "\u{F1AF9}", + "bug-stop-outline": "\u{F1AFA}", + "bugle": "\u{F0DB4}", + "bulkhead-light": "\u{F1A2F}", + "bulldozer": "\u{F0B22}", + "bullet": "\u{F0CF3}", + "bulletin-board": "\u{F00E5}", + "bullhorn": "\u{F00E6}", + "bullhorn-outline": "\u{F0B23}", + "bullhorn-variant": "\u{F196E}", + "bullhorn-variant-outline": "\u{F196F}", + "bullseye": "\u{F05DD}", + "bullseye-arrow": "\u{F08C9}", + "bulma": "\u{F12E7}", + "bunk-bed": "\u{F1302}", + "bunk-bed-outline": "\u{F0097}", + "bus": "\u{F00E7}", + "bus-alert": "\u{F0A99}", + "bus-articulated-end": "\u{F079C}", + "bus-articulated-front": "\u{F079D}", + "bus-clock": "\u{F08CA}", + "bus-double-decker": "\u{F079E}", + "bus-electric": "\u{F191D}", + "bus-marker": "\u{F1212}", + "bus-multiple": "\u{F0F3F}", + "bus-school": "\u{F079F}", + "bus-side": "\u{F07A0}", + "bus-stop": "\u{F1012}", + "bus-stop-covered": "\u{F1013}", + "bus-stop-uncovered": "\u{F1014}", + "butterfly": "\u{F1589}", + "butterfly-outline": "\u{F158A}", + "button-cursor": "\u{F1B4F}", + "button-pointer": "\u{F1B50}", + "cabin-a-frame": "\u{F188C}", + "cable-data": "\u{F1394}", + "cached": "\u{F00E8}", + "cactus": "\u{F0DB5}", + "cake": "\u{F00E9}", + "cake-layered": "\u{F00EA}", + "cake-variant": "\u{F00EB}", + "cake-variant-outline": "\u{F17F0}", + "calculator": "\u{F00EC}", + "calculator-variant": "\u{F0A9A}", + "calculator-variant-outline": "\u{F15A6}", + "calendar": "\u{F00ED}", + "calendar-account": "\u{F0ED7}", + "calendar-account-outline": "\u{F0ED8}", + "calendar-alert": "\u{F0A31}", + "calendar-alert-outline": "\u{F1B62}", + "calendar-arrow-left": "\u{F1134}", + "calendar-arrow-right": "\u{F1135}", + "calendar-badge": "\u{F1B9D}", + "calendar-badge-outline": "\u{F1B9E}", + "calendar-blank": "\u{F00EE}", + "calendar-blank-multiple": "\u{F1073}", + "calendar-blank-outline": "\u{F0B66}", + "calendar-check": "\u{F00EF}", + "calendar-check-outline": "\u{F0C44}", + "calendar-clock": "\u{F00F0}", + "calendar-clock-outline": "\u{F16E1}", + "calendar-collapse-horizontal": "\u{F189D}", + "calendar-collapse-horizontal-outline": "\u{F1B63}", + "calendar-cursor": "\u{F157B}", + "calendar-cursor-outline": "\u{F1B64}", + "calendar-edit": "\u{F08A7}", + "calendar-edit-outline": "\u{F1B65}", + "calendar-end": "\u{F166C}", + "calendar-end-outline": "\u{F1B66}", + "calendar-expand-horizontal": "\u{F189E}", + "calendar-expand-horizontal-outline": "\u{F1B67}", + "calendar-export": "\u{F0B24}", + "calendar-export-outline": "\u{F1B68}", + "calendar-filter": "\u{F1A32}", + "calendar-filter-outline": "\u{F1A33}", + "calendar-heart": "\u{F09D2}", + "calendar-heart-outline": "\u{F1B69}", + "calendar-import": "\u{F0B25}", + "calendar-import-outline": "\u{F1B6A}", + "calendar-lock": "\u{F1641}", + "calendar-lock-open": "\u{F1B5B}", + "calendar-lock-open-outline": "\u{F1B5C}", + "calendar-lock-outline": "\u{F1642}", + "calendar-minus": "\u{F0D5C}", + "calendar-minus-outline": "\u{F1B6B}", + "calendar-month": "\u{F0E17}", + "calendar-month-outline": "\u{F0E18}", + "calendar-multiple": "\u{F00F1}", + "calendar-multiple-check": "\u{F00F2}", + "calendar-multiselect": "\u{F0A32}", + "calendar-multiselect-outline": "\u{F1B55}", + "calendar-outline": "\u{F0B67}", + "calendar-plus": "\u{F00F3}", + "calendar-plus-outline": "\u{F1B6C}", + "calendar-question": "\u{F0692}", + "calendar-question-outline": "\u{F1B6D}", + "calendar-range": "\u{F0679}", + "calendar-range-outline": "\u{F0B68}", + "calendar-refresh": "\u{F01E1}", + "calendar-refresh-outline": "\u{F0203}", + "calendar-remove": "\u{F00F4}", + "calendar-remove-outline": "\u{F0C45}", + "calendar-search": "\u{F094C}", + "calendar-search-outline": "\u{F1B6E}", + "calendar-star": "\u{F09D3}", + "calendar-star-four-points": "\u{F1C1F}", + "calendar-star-outline": "\u{F1B53}", + "calendar-start": "\u{F166D}", + "calendar-start-outline": "\u{F1B6F}", + "calendar-sync": "\u{F0E8E}", + "calendar-sync-outline": "\u{F0E8F}", + "calendar-text": "\u{F00F5}", + "calendar-text-outline": "\u{F0C46}", + "calendar-today": "\u{F00F6}", + "calendar-today-outline": "\u{F1A30}", + "calendar-week": "\u{F0A33}", + "calendar-week-begin": "\u{F0A34}", + "calendar-week-begin-outline": "\u{F1A31}", + "calendar-week-outline": "\u{F1A34}", + "calendar-weekend": "\u{F0ED9}", + "calendar-weekend-outline": "\u{F0EDA}", + "call-made": "\u{F00F7}", + "call-merge": "\u{F00F8}", + "call-missed": "\u{F00F9}", + "call-received": "\u{F00FA}", + "call-split": "\u{F00FB}", + "camcorder": "\u{F00FC}", + "camcorder-off": "\u{F00FF}", + "camera": "\u{F0100}", + "camera-account": "\u{F08CB}", + "camera-burst": "\u{F0693}", + "camera-control": "\u{F0B69}", + "camera-document": "\u{F1871}", + "camera-document-off": "\u{F1872}", + "camera-enhance": "\u{F0101}", + "camera-enhance-outline": "\u{F0B6A}", + "camera-flip": "\u{F15D9}", + "camera-flip-outline": "\u{F15DA}", + "camera-front": "\u{F0102}", + "camera-front-variant": "\u{F0103}", + "camera-gopro": "\u{F07A1}", + "camera-image": "\u{F08CC}", + "camera-iris": "\u{F0104}", + "camera-lock": "\u{F1A14}", + "camera-lock-open": "\u{F1C0D}", + "camera-lock-open-outline": "\u{F1C0E}", + "camera-lock-outline": "\u{F1A15}", + "camera-marker": "\u{F19A7}", + "camera-marker-outline": "\u{F19A8}", + "camera-metering-center": "\u{F07A2}", + "camera-metering-matrix": "\u{F07A3}", + "camera-metering-partial": "\u{F07A4}", + "camera-metering-spot": "\u{F07A5}", + "camera-off": "\u{F05DF}", + "camera-off-outline": "\u{F19BF}", + "camera-outline": "\u{F0D5D}", + "camera-party-mode": "\u{F0105}", + "camera-plus": "\u{F0EDB}", + "camera-plus-outline": "\u{F0EDC}", + "camera-rear": "\u{F0106}", + "camera-rear-variant": "\u{F0107}", + "camera-retake": "\u{F0E19}", + "camera-retake-outline": "\u{F0E1A}", + "camera-switch": "\u{F0108}", + "camera-switch-outline": "\u{F084A}", + "camera-timer": "\u{F0109}", + "camera-wireless": "\u{F0DB6}", + "camera-wireless-outline": "\u{F0DB7}", + "campfire": "\u{F0EDD}", + "cancel": "\u{F073A}", + "candelabra": "\u{F17D2}", + "candelabra-fire": "\u{F17D3}", + "candle": "\u{F05E2}", + "candy": "\u{F1970}", + "candy-off": "\u{F1971}", + "candy-off-outline": "\u{F1972}", + "candy-outline": "\u{F1973}", + "candycane": "\u{F010A}", + "cannabis": "\u{F07A6}", + "cannabis-off": "\u{F166E}", + "caps-lock": "\u{F0A9B}", + "car": "\u{F010B}", + "car-2-plus": "\u{F1015}", + "car-3-plus": "\u{F1016}", + "car-arrow-left": "\u{F13B2}", + "car-arrow-right": "\u{F13B3}", + "car-back": "\u{F0E1B}", + "car-battery": "\u{F010C}", + "car-brake-abs": "\u{F0C47}", + "car-brake-alert": "\u{F0C48}", + "car-brake-fluid-level": "\u{F1909}", + "car-brake-hold": "\u{F0D5E}", + "car-brake-low-pressure": "\u{F190A}", + "car-brake-parking": "\u{F0D5F}", + "car-brake-retarder": "\u{F1017}", + "car-brake-temperature": "\u{F190B}", + "car-brake-worn-linings": "\u{F190C}", + "car-child-seat": "\u{F0FA3}", + "car-clock": "\u{F1974}", + "car-clutch": "\u{F1018}", + "car-cog": "\u{F13CC}", + "car-connected": "\u{F010D}", + "car-convertible": "\u{F07A7}", + "car-coolant-level": "\u{F1019}", + "car-cruise-control": "\u{F0D60}", + "car-defrost-front": "\u{F0D61}", + "car-defrost-rear": "\u{F0D62}", + "car-door": "\u{F0B6B}", + "car-door-lock": "\u{F109D}", + "car-electric": "\u{F0B6C}", + "car-electric-outline": "\u{F15B5}", + "car-emergency": "\u{F160F}", + "car-esp": "\u{F0C49}", + "car-estate": "\u{F07A8}", + "car-hatchback": "\u{F07A9}", + "car-info": "\u{F11BE}", + "car-key": "\u{F0B6D}", + "car-lifted-pickup": "\u{F152D}", + "car-light-alert": "\u{F190D}", + "car-light-dimmed": "\u{F0C4A}", + "car-light-fog": "\u{F0C4B}", + "car-light-high": "\u{F0C4C}", + "car-limousine": "\u{F08CD}", + "car-multiple": "\u{F0B6E}", + "car-off": "\u{F0E1C}", + "car-outline": "\u{F14ED}", + "car-parking-lights": "\u{F0D63}", + "car-pickup": "\u{F07AA}", + "car-search": "\u{F1B8D}", + "car-search-outline": "\u{F1B8E}", + "car-seat": "\u{F0FA4}", + "car-seat-cooler": "\u{F0FA5}", + "car-seat-heater": "\u{F0FA6}", + "car-select": "\u{F1879}", + "car-settings": "\u{F13CD}", + "car-shift-pattern": "\u{F0F40}", + "car-side": "\u{F07AB}", + "car-speed-limiter": "\u{F190E}", + "car-sports": "\u{F07AC}", + "car-tire-alert": "\u{F0C4D}", + "car-traction-control": "\u{F0D64}", + "car-turbocharger": "\u{F101A}", + "car-wash": "\u{F010E}", + "car-windshield": "\u{F101B}", + "car-windshield-outline": "\u{F101C}", + "car-wireless": "\u{F1878}", + "car-wrench": "\u{F1814}", + "carabiner": "\u{F14C0}", + "caravan": "\u{F07AD}", + "card": "\u{F0B6F}", + "card-account-details": "\u{F05D2}", + "card-account-details-outline": "\u{F0DAB}", + "card-account-details-star": "\u{F02A3}", + "card-account-details-star-outline": "\u{F06DB}", + "card-account-mail": "\u{F018E}", + "card-account-mail-outline": "\u{F0E98}", + "card-account-phone": "\u{F0E99}", + "card-account-phone-outline": "\u{F0E9A}", + "card-bulleted": "\u{F0B70}", + "card-bulleted-off": "\u{F0B71}", + "card-bulleted-off-outline": "\u{F0B72}", + "card-bulleted-outline": "\u{F0B73}", + "card-bulleted-settings": "\u{F0B74}", + "card-bulleted-settings-outline": "\u{F0B75}", + "card-minus": "\u{F1600}", + "card-minus-outline": "\u{F1601}", + "card-multiple": "\u{F17F1}", + "card-multiple-outline": "\u{F17F2}", + "card-off": "\u{F1602}", + "card-off-outline": "\u{F1603}", + "card-outline": "\u{F0B76}", + "card-plus": "\u{F11FF}", + "card-plus-outline": "\u{F1200}", + "card-remove": "\u{F1604}", + "card-remove-outline": "\u{F1605}", + "card-search": "\u{F1074}", + "card-search-outline": "\u{F1075}", + "card-text": "\u{F0B77}", + "card-text-outline": "\u{F0B78}", + "cards": "\u{F0638}", + "cards-club": "\u{F08CE}", + "cards-club-outline": "\u{F189F}", + "cards-diamond": "\u{F08CF}", + "cards-diamond-outline": "\u{F101D}", + "cards-heart": "\u{F08D0}", + "cards-heart-outline": "\u{F18A0}", + "cards-outline": "\u{F0639}", + "cards-playing": "\u{F18A1}", + "cards-playing-club": "\u{F18A2}", + "cards-playing-club-multiple": "\u{F18A3}", + "cards-playing-club-multiple-outline": "\u{F18A4}", + "cards-playing-club-outline": "\u{F18A5}", + "cards-playing-diamond": "\u{F18A6}", + "cards-playing-diamond-multiple": "\u{F18A7}", + "cards-playing-diamond-multiple-outline": "\u{F18A8}", + "cards-playing-diamond-outline": "\u{F18A9}", + "cards-playing-heart": "\u{F18AA}", + "cards-playing-heart-multiple": "\u{F18AB}", + "cards-playing-heart-multiple-outline": "\u{F18AC}", + "cards-playing-heart-outline": "\u{F18AD}", + "cards-playing-outline": "\u{F063A}", + "cards-playing-spade": "\u{F18AE}", + "cards-playing-spade-multiple": "\u{F18AF}", + "cards-playing-spade-multiple-outline": "\u{F18B0}", + "cards-playing-spade-outline": "\u{F18B1}", + "cards-spade": "\u{F08D1}", + "cards-spade-outline": "\u{F18B2}", + "cards-variant": "\u{F06C7}", + "carrot": "\u{F010F}", + "cart": "\u{F0110}", + "cart-arrow-down": "\u{F0D66}", + "cart-arrow-right": "\u{F0C4E}", + "cart-arrow-up": "\u{F0D67}", + "cart-check": "\u{F15EA}", + "cart-heart": "\u{F18E0}", + "cart-minus": "\u{F0D68}", + "cart-off": "\u{F066B}", + "cart-outline": "\u{F0111}", + "cart-percent": "\u{F1BAE}", + "cart-plus": "\u{F0112}", + "cart-remove": "\u{F0D69}", + "cart-variant": "\u{F15EB}", + "case-sensitive-alt": "\u{F0113}", + "cash": "\u{F0114}", + "cash-100": "\u{F0115}", + "cash-check": "\u{F14EE}", + "cash-clock": "\u{F1A91}", + "cash-fast": "\u{F185C}", + "cash-lock": "\u{F14EA}", + "cash-lock-open": "\u{F14EB}", + "cash-marker": "\u{F0DB8}", + "cash-minus": "\u{F1260}", + "cash-multiple": "\u{F0116}", + "cash-off": "\u{F1C79}", + "cash-plus": "\u{F1261}", + "cash-refund": "\u{F0A9C}", + "cash-register": "\u{F0CF4}", + "cash-remove": "\u{F1262}", + "cash-sync": "\u{F1A92}", + "cassette": "\u{F09D4}", + "cast": "\u{F0118}", + "cast-audio": "\u{F101E}", + "cast-audio-variant": "\u{F1749}", + "cast-connected": "\u{F0119}", + "cast-education": "\u{F0E1D}", + "cast-off": "\u{F078A}", + "cast-variant": "\u{F001F}", + "castle": "\u{F011A}", + "cat": "\u{F011B}", + "cctv": "\u{F07AE}", + "cctv-off": "\u{F185F}", + "ceiling-fan": "\u{F1797}", + "ceiling-fan-light": "\u{F1798}", + "ceiling-light": "\u{F0769}", + "ceiling-light-multiple": "\u{F18DD}", + "ceiling-light-multiple-outline": "\u{F18DE}", + "ceiling-light-outline": "\u{F17C7}", + "cellphone": "\u{F011C}", + "cellphone-arrow-down": "\u{F09D5}", + "cellphone-arrow-down-variant": "\u{F19C5}", + "cellphone-basic": "\u{F011E}", + "cellphone-charging": "\u{F1397}", + "cellphone-check": "\u{F17FD}", + "cellphone-cog": "\u{F0951}", + "cellphone-dock": "\u{F011F}", + "cellphone-information": "\u{F0F41}", + "cellphone-key": "\u{F094E}", + "cellphone-link": "\u{F0121}", + "cellphone-link-off": "\u{F0122}", + "cellphone-lock": "\u{F094F}", + "cellphone-marker": "\u{F183A}", + "cellphone-message": "\u{F08D3}", + "cellphone-message-off": "\u{F10D2}", + "cellphone-nfc": "\u{F0E90}", + "cellphone-nfc-off": "\u{F12D8}", + "cellphone-off": "\u{F0950}", + "cellphone-play": "\u{F101F}", + "cellphone-remove": "\u{F094D}", + "cellphone-screenshot": "\u{F0A35}", + "cellphone-settings": "\u{F0123}", + "cellphone-sound": "\u{F0952}", + "cellphone-text": "\u{F08D2}", + "cellphone-wireless": "\u{F0815}", + "centos": "\u{F111A}", + "certificate": "\u{F0124}", + "certificate-outline": "\u{F1188}", + "chair-rolling": "\u{F0F48}", + "chair-school": "\u{F0125}", + "chandelier": "\u{F1793}", + "charity": "\u{F0C4F}", + "chart-arc": "\u{F0126}", + "chart-areaspline": "\u{F0127}", + "chart-areaspline-variant": "\u{F0E91}", + "chart-bar": "\u{F0128}", + "chart-bar-stacked": "\u{F076A}", + "chart-bell-curve": "\u{F0C50}", + "chart-bell-curve-cumulative": "\u{F0FA7}", + "chart-box": "\u{F154D}", + "chart-box-outline": "\u{F154E}", + "chart-box-plus-outline": "\u{F154F}", + "chart-bubble": "\u{F05E3}", + "chart-donut": "\u{F07AF}", + "chart-donut-variant": "\u{F07B0}", + "chart-gantt": "\u{F066C}", + "chart-histogram": "\u{F0129}", + "chart-line": "\u{F012A}", + "chart-line-stacked": "\u{F076B}", + "chart-line-variant": "\u{F07B1}", + "chart-multiline": "\u{F08D4}", + "chart-multiple": "\u{F1213}", + "chart-pie": "\u{F012B}", + "chart-pie-outline": "\u{F1BDF}", + "chart-ppf": "\u{F1380}", + "chart-sankey": "\u{F11DF}", + "chart-sankey-variant": "\u{F11E0}", + "chart-scatter-plot": "\u{F0E92}", + "chart-scatter-plot-hexbin": "\u{F066D}", + "chart-timeline": "\u{F066E}", + "chart-timeline-variant": "\u{F0E93}", + "chart-timeline-variant-shimmer": "\u{F15B6}", + "chart-tree": "\u{F0E94}", + "chart-waterfall": "\u{F1918}", + "chat": "\u{F0B79}", + "chat-alert": "\u{F0B7A}", + "chat-alert-outline": "\u{F12C9}", + "chat-minus": "\u{F1410}", + "chat-minus-outline": "\u{F1413}", + "chat-outline": "\u{F0EDE}", + "chat-plus": "\u{F140F}", + "chat-plus-outline": "\u{F1412}", + "chat-processing": "\u{F0B7B}", + "chat-processing-outline": "\u{F12CA}", + "chat-question": "\u{F1738}", + "chat-question-outline": "\u{F1739}", + "chat-remove": "\u{F1411}", + "chat-remove-outline": "\u{F1414}", + "chat-sleep": "\u{F12D1}", + "chat-sleep-outline": "\u{F12D2}", + "check": "\u{F012C}", + "check-all": "\u{F012D}", + "check-bold": "\u{F0E1E}", + "check-circle": "\u{F05E0}", + "check-circle-outline": "\u{F05E1}", + "check-decagram": "\u{F0791}", + "check-decagram-outline": "\u{F1740}", + "check-network": "\u{F0C53}", + "check-network-outline": "\u{F0C54}", + "check-outline": "\u{F0855}", + "check-underline": "\u{F0E1F}", + "check-underline-circle": "\u{F0E20}", + "check-underline-circle-outline": "\u{F0E21}", + "checkbook": "\u{F0A9D}", + "checkbook-arrow-left": "\u{F1C1D}", + "checkbook-arrow-right": "\u{F1C1E}", + "checkbox-blank": "\u{F012E}", + "checkbox-blank-badge": "\u{F1176}", + "checkbox-blank-badge-outline": "\u{F0117}", + "checkbox-blank-circle": "\u{F012F}", + "checkbox-blank-circle-outline": "\u{F0130}", + "checkbox-blank-off": "\u{F12EC}", + "checkbox-blank-off-outline": "\u{F12ED}", + "checkbox-blank-outline": "\u{F0131}", + "checkbox-intermediate": "\u{F0856}", + "checkbox-intermediate-variant": "\u{F1B54}", + "checkbox-marked": "\u{F0132}", + "checkbox-marked-circle": "\u{F0133}", + "checkbox-marked-circle-auto-outline": "\u{F1C26}", + "checkbox-marked-circle-minus-outline": "\u{F1C27}", + "checkbox-marked-circle-outline": "\u{F0134}", + "checkbox-marked-circle-plus-outline": "\u{F1927}", + "checkbox-marked-outline": "\u{F0135}", + "checkbox-multiple-blank": "\u{F0136}", + "checkbox-multiple-blank-circle": "\u{F063B}", + "checkbox-multiple-blank-circle-outline": "\u{F063C}", + "checkbox-multiple-blank-outline": "\u{F0137}", + "checkbox-multiple-marked": "\u{F0138}", + "checkbox-multiple-marked-circle": "\u{F063D}", + "checkbox-multiple-marked-circle-outline": "\u{F063E}", + "checkbox-multiple-marked-outline": "\u{F0139}", + "checkbox-multiple-outline": "\u{F0C51}", + "checkbox-outline": "\u{F0C52}", + "checkerboard": "\u{F013A}", + "checkerboard-minus": "\u{F1202}", + "checkerboard-plus": "\u{F1201}", + "checkerboard-remove": "\u{F1203}", + "cheese": "\u{F12B9}", + "cheese-off": "\u{F13EE}", + "chef-hat": "\u{F0B7C}", + "chemical-weapon": "\u{F013B}", + "chess-bishop": "\u{F085C}", + "chess-king": "\u{F0857}", + "chess-knight": "\u{F0858}", + "chess-pawn": "\u{F0859}", + "chess-queen": "\u{F085A}", + "chess-rook": "\u{F085B}", + "chevron-double-down": "\u{F013C}", + "chevron-double-left": "\u{F013D}", + "chevron-double-right": "\u{F013E}", + "chevron-double-up": "\u{F013F}", + "chevron-down": "\u{F0140}", + "chevron-down-box": "\u{F09D6}", + "chevron-down-box-outline": "\u{F09D7}", + "chevron-down-circle": "\u{F0B26}", + "chevron-down-circle-outline": "\u{F0B27}", + "chevron-left": "\u{F0141}", + "chevron-left-box": "\u{F09D8}", + "chevron-left-box-outline": "\u{F09D9}", + "chevron-left-circle": "\u{F0B28}", + "chevron-left-circle-outline": "\u{F0B29}", + "chevron-right": "\u{F0142}", + "chevron-right-box": "\u{F09DA}", + "chevron-right-box-outline": "\u{F09DB}", + "chevron-right-circle": "\u{F0B2A}", + "chevron-right-circle-outline": "\u{F0B2B}", + "chevron-triple-down": "\u{F0DB9}", + "chevron-triple-left": "\u{F0DBA}", + "chevron-triple-right": "\u{F0DBB}", + "chevron-triple-up": "\u{F0DBC}", + "chevron-up": "\u{F0143}", + "chevron-up-box": "\u{F09DC}", + "chevron-up-box-outline": "\u{F09DD}", + "chevron-up-circle": "\u{F0B2C}", + "chevron-up-circle-outline": "\u{F0B2D}", + "chili-alert": "\u{F17EA}", + "chili-alert-outline": "\u{F17EB}", + "chili-hot": "\u{F07B2}", + "chili-hot-outline": "\u{F17EC}", + "chili-medium": "\u{F07B3}", + "chili-medium-outline": "\u{F17ED}", + "chili-mild": "\u{F07B4}", + "chili-mild-outline": "\u{F17EE}", + "chili-off": "\u{F1467}", + "chili-off-outline": "\u{F17EF}", + "chip": "\u{F061A}", + "church": "\u{F0144}", + "church-outline": "\u{F1B02}", + "cigar": "\u{F1189}", + "cigar-off": "\u{F141B}", + "circle": "\u{F0765}", + "circle-box": "\u{F15DC}", + "circle-box-outline": "\u{F15DD}", + "circle-double": "\u{F0E95}", + "circle-edit-outline": "\u{F08D5}", + "circle-expand": "\u{F0E96}", + "circle-half": "\u{F1395}", + "circle-half-full": "\u{F1396}", + "circle-medium": "\u{F09DE}", + "circle-multiple": "\u{F0B38}", + "circle-multiple-outline": "\u{F0695}", + "circle-off-outline": "\u{F10D3}", + "circle-opacity": "\u{F1853}", + "circle-outline": "\u{F0766}", + "circle-slice-1": "\u{F0A9E}", + "circle-slice-2": "\u{F0A9F}", + "circle-slice-3": "\u{F0AA0}", + "circle-slice-4": "\u{F0AA1}", + "circle-slice-5": "\u{F0AA2}", + "circle-slice-6": "\u{F0AA3}", + "circle-slice-7": "\u{F0AA4}", + "circle-slice-8": "\u{F0AA5}", + "circle-small": "\u{F09DF}", + "circular-saw": "\u{F0E22}", + "city": "\u{F0146}", + "city-switch": "\u{F1C28}", + "city-variant": "\u{F0A36}", + "city-variant-outline": "\u{F0A37}", + "clipboard": "\u{F0147}", + "clipboard-account": "\u{F0148}", + "clipboard-account-outline": "\u{F0C55}", + "clipboard-alert": "\u{F0149}", + "clipboard-alert-outline": "\u{F0CF7}", + "clipboard-arrow-down": "\u{F014A}", + "clipboard-arrow-down-outline": "\u{F0C56}", + "clipboard-arrow-left": "\u{F014B}", + "clipboard-arrow-left-outline": "\u{F0CF8}", + "clipboard-arrow-right": "\u{F0CF9}", + "clipboard-arrow-right-outline": "\u{F0CFA}", + "clipboard-arrow-up": "\u{F0C57}", + "clipboard-arrow-up-outline": "\u{F0C58}", + "clipboard-check": "\u{F014E}", + "clipboard-check-multiple": "\u{F1263}", + "clipboard-check-multiple-outline": "\u{F1264}", + "clipboard-check-outline": "\u{F08A8}", + "clipboard-clock": "\u{F16E2}", + "clipboard-clock-outline": "\u{F16E3}", + "clipboard-edit": "\u{F14E5}", + "clipboard-edit-outline": "\u{F14E6}", + "clipboard-file": "\u{F1265}", + "clipboard-file-outline": "\u{F1266}", + "clipboard-flow": "\u{F06C8}", + "clipboard-flow-outline": "\u{F1117}", + "clipboard-list": "\u{F10D4}", + "clipboard-list-outline": "\u{F10D5}", + "clipboard-minus": "\u{F1618}", + "clipboard-minus-outline": "\u{F1619}", + "clipboard-multiple": "\u{F1267}", + "clipboard-multiple-outline": "\u{F1268}", + "clipboard-off": "\u{F161A}", + "clipboard-off-outline": "\u{F161B}", + "clipboard-outline": "\u{F014C}", + "clipboard-play": "\u{F0C59}", + "clipboard-play-multiple": "\u{F1269}", + "clipboard-play-multiple-outline": "\u{F126A}", + "clipboard-play-outline": "\u{F0C5A}", + "clipboard-plus": "\u{F0751}", + "clipboard-plus-outline": "\u{F131F}", + "clipboard-pulse": "\u{F085D}", + "clipboard-pulse-outline": "\u{F085E}", + "clipboard-remove": "\u{F161C}", + "clipboard-remove-outline": "\u{F161D}", + "clipboard-search": "\u{F161E}", + "clipboard-search-outline": "\u{F161F}", + "clipboard-text": "\u{F014D}", + "clipboard-text-clock": "\u{F18F9}", + "clipboard-text-clock-outline": "\u{F18FA}", + "clipboard-text-multiple": "\u{F126B}", + "clipboard-text-multiple-outline": "\u{F126C}", + "clipboard-text-off": "\u{F1620}", + "clipboard-text-off-outline": "\u{F1621}", + "clipboard-text-outline": "\u{F0A38}", + "clipboard-text-play": "\u{F0C5B}", + "clipboard-text-play-outline": "\u{F0C5C}", + "clipboard-text-search": "\u{F1622}", + "clipboard-text-search-outline": "\u{F1623}", + "clippy": "\u{F014F}", + "clock": "\u{F0954}", + "clock-alert": "\u{F0955}", + "clock-alert-outline": "\u{F05CE}", + "clock-check": "\u{F0FA8}", + "clock-check-outline": "\u{F0FA9}", + "clock-digital": "\u{F0E97}", + "clock-edit": "\u{F19BA}", + "clock-edit-outline": "\u{F19BB}", + "clock-end": "\u{F0151}", + "clock-fast": "\u{F0152}", + "clock-in": "\u{F0153}", + "clock-minus": "\u{F1863}", + "clock-minus-outline": "\u{F1864}", + "clock-out": "\u{F0154}", + "clock-outline": "\u{F0150}", + "clock-plus": "\u{F1861}", + "clock-plus-outline": "\u{F1862}", + "clock-remove": "\u{F1865}", + "clock-remove-outline": "\u{F1866}", + "clock-star-four-points": "\u{F1C29}", + "clock-star-four-points-outline": "\u{F1C2A}", + "clock-start": "\u{F0155}", + "clock-time-eight": "\u{F1446}", + "clock-time-eight-outline": "\u{F1452}", + "clock-time-eleven": "\u{F1449}", + "clock-time-eleven-outline": "\u{F1455}", + "clock-time-five": "\u{F1443}", + "clock-time-five-outline": "\u{F144F}", + "clock-time-four": "\u{F1442}", + "clock-time-four-outline": "\u{F144E}", + "clock-time-nine": "\u{F1447}", + "clock-time-nine-outline": "\u{F1453}", + "clock-time-one": "\u{F143F}", + "clock-time-one-outline": "\u{F144B}", + "clock-time-seven": "\u{F1445}", + "clock-time-seven-outline": "\u{F1451}", + "clock-time-six": "\u{F1444}", + "clock-time-six-outline": "\u{F1450}", + "clock-time-ten": "\u{F1448}", + "clock-time-ten-outline": "\u{F1454}", + "clock-time-three": "\u{F1441}", + "clock-time-three-outline": "\u{F144D}", + "clock-time-twelve": "\u{F144A}", + "clock-time-twelve-outline": "\u{F1456}", + "clock-time-two": "\u{F1440}", + "clock-time-two-outline": "\u{F144C}", + "close": "\u{F0156}", + "close-box": "\u{F0157}", + "close-box-multiple": "\u{F0C5D}", + "close-box-multiple-outline": "\u{F0C5E}", + "close-box-outline": "\u{F0158}", + "close-circle": "\u{F0159}", + "close-circle-multiple": "\u{F062A}", + "close-circle-multiple-outline": "\u{F0883}", + "close-circle-outline": "\u{F015A}", + "close-network": "\u{F015B}", + "close-network-outline": "\u{F0C5F}", + "close-octagon": "\u{F015C}", + "close-octagon-outline": "\u{F015D}", + "close-outline": "\u{F06C9}", + "close-thick": "\u{F1398}", + "closed-caption": "\u{F015E}", + "closed-caption-outline": "\u{F0DBD}", + "cloud": "\u{F015F}", + "cloud-alert": "\u{F09E0}", + "cloud-alert-outline": "\u{F1BE0}", + "cloud-arrow-down": "\u{F1BE1}", + "cloud-arrow-down-outline": "\u{F1BE2}", + "cloud-arrow-left": "\u{F1BE3}", + "cloud-arrow-left-outline": "\u{F1BE4}", + "cloud-arrow-right": "\u{F1BE5}", + "cloud-arrow-right-outline": "\u{F1BE6}", + "cloud-arrow-up": "\u{F1BE7}", + "cloud-arrow-up-outline": "\u{F1BE8}", + "cloud-braces": "\u{F07B5}", + "cloud-cancel": "\u{F1BE9}", + "cloud-cancel-outline": "\u{F1BEA}", + "cloud-check": "\u{F1BEB}", + "cloud-check-outline": "\u{F1BEC}", + "cloud-check-variant": "\u{F0160}", + "cloud-check-variant-outline": "\u{F12CC}", + "cloud-circle": "\u{F0161}", + "cloud-circle-outline": "\u{F1BED}", + "cloud-clock": "\u{F1BEE}", + "cloud-clock-outline": "\u{F1BEF}", + "cloud-cog": "\u{F1BF0}", + "cloud-cog-outline": "\u{F1BF1}", + "cloud-download": "\u{F0162}", + "cloud-download-outline": "\u{F0B7D}", + "cloud-lock": "\u{F11F1}", + "cloud-lock-open": "\u{F1BF2}", + "cloud-lock-open-outline": "\u{F1BF3}", + "cloud-lock-outline": "\u{F11F2}", + "cloud-minus": "\u{F1BF4}", + "cloud-minus-outline": "\u{F1BF5}", + "cloud-off": "\u{F1BF6}", + "cloud-off-outline": "\u{F0164}", + "cloud-outline": "\u{F0163}", + "cloud-percent": "\u{F1A35}", + "cloud-percent-outline": "\u{F1A36}", + "cloud-plus": "\u{F1BF7}", + "cloud-plus-outline": "\u{F1BF8}", + "cloud-print": "\u{F0165}", + "cloud-print-outline": "\u{F0166}", + "cloud-question": "\u{F0A39}", + "cloud-question-outline": "\u{F1BF9}", + "cloud-refresh": "\u{F1BFA}", + "cloud-refresh-outline": "\u{F1BFB}", + "cloud-refresh-variant": "\u{F052A}", + "cloud-refresh-variant-outline": "\u{F1BFC}", + "cloud-remove": "\u{F1BFD}", + "cloud-remove-outline": "\u{F1BFE}", + "cloud-search": "\u{F0956}", + "cloud-search-outline": "\u{F0957}", + "cloud-sync": "\u{F063F}", + "cloud-sync-outline": "\u{F12D6}", + "cloud-tags": "\u{F07B6}", + "cloud-upload": "\u{F0167}", + "cloud-upload-outline": "\u{F0B7E}", + "clouds": "\u{F1B95}", + "clover": "\u{F0816}", + "clover-outline": "\u{F1C62}", + "coach-lamp": "\u{F1020}", + "coach-lamp-variant": "\u{F1A37}", + "coat-rack": "\u{F109E}", + "code-array": "\u{F0168}", + "code-braces": "\u{F0169}", + "code-braces-box": "\u{F10D6}", + "code-brackets": "\u{F016A}", + "code-equal": "\u{F016B}", + "code-greater-than": "\u{F016C}", + "code-greater-than-or-equal": "\u{F016D}", + "code-json": "\u{F0626}", + "code-less-than": "\u{F016E}", + "code-less-than-or-equal": "\u{F016F}", + "code-not-equal": "\u{F0170}", + "code-not-equal-variant": "\u{F0171}", + "code-parentheses": "\u{F0172}", + "code-parentheses-box": "\u{F10D7}", + "code-string": "\u{F0173}", + "code-tags": "\u{F0174}", + "code-tags-check": "\u{F0694}", + "codepen": "\u{F0175}", + "coffee": "\u{F0176}", + "coffee-maker": "\u{F109F}", + "coffee-maker-check": "\u{F1931}", + "coffee-maker-check-outline": "\u{F1932}", + "coffee-maker-outline": "\u{F181B}", + "coffee-off": "\u{F0FAA}", + "coffee-off-outline": "\u{F0FAB}", + "coffee-outline": "\u{F06CA}", + "coffee-to-go": "\u{F0177}", + "coffee-to-go-outline": "\u{F130E}", + "coffin": "\u{F0B7F}", + "cog": "\u{F0493}", + "cog-box": "\u{F0494}", + "cog-clockwise": "\u{F11DD}", + "cog-counterclockwise": "\u{F11DE}", + "cog-off": "\u{F13CE}", + "cog-off-outline": "\u{F13CF}", + "cog-outline": "\u{F08BB}", + "cog-pause": "\u{F1933}", + "cog-pause-outline": "\u{F1934}", + "cog-play": "\u{F1935}", + "cog-play-outline": "\u{F1936}", + "cog-refresh": "\u{F145E}", + "cog-refresh-outline": "\u{F145F}", + "cog-stop": "\u{F1937}", + "cog-stop-outline": "\u{F1938}", + "cog-sync": "\u{F1460}", + "cog-sync-outline": "\u{F1461}", + "cog-transfer": "\u{F105B}", + "cog-transfer-outline": "\u{F105C}", + "cogs": "\u{F08D6}", + "collage": "\u{F0640}", + "collapse-all": "\u{F0AA6}", + "collapse-all-outline": "\u{F0AA7}", + "color-helper": "\u{F0179}", + "comma": "\u{F0E23}", + "comma-box": "\u{F0E2B}", + "comma-box-outline": "\u{F0E24}", + "comma-circle": "\u{F0E25}", + "comma-circle-outline": "\u{F0E26}", + "comment": "\u{F017A}", + "comment-account": "\u{F017B}", + "comment-account-outline": "\u{F017C}", + "comment-alert": "\u{F017D}", + "comment-alert-outline": "\u{F017E}", + "comment-arrow-left": "\u{F09E1}", + "comment-arrow-left-outline": "\u{F09E2}", + "comment-arrow-right": "\u{F09E3}", + "comment-arrow-right-outline": "\u{F09E4}", + "comment-bookmark": "\u{F15AE}", + "comment-bookmark-outline": "\u{F15AF}", + "comment-check": "\u{F017F}", + "comment-check-outline": "\u{F0180}", + "comment-edit": "\u{F11BF}", + "comment-edit-outline": "\u{F12C4}", + "comment-eye": "\u{F0A3A}", + "comment-eye-outline": "\u{F0A3B}", + "comment-flash": "\u{F15B0}", + "comment-flash-outline": "\u{F15B1}", + "comment-minus": "\u{F15DF}", + "comment-minus-outline": "\u{F15E0}", + "comment-multiple": "\u{F085F}", + "comment-multiple-outline": "\u{F0181}", + "comment-off": "\u{F15E1}", + "comment-off-outline": "\u{F15E2}", + "comment-outline": "\u{F0182}", + "comment-plus": "\u{F09E5}", + "comment-plus-outline": "\u{F0183}", + "comment-processing": "\u{F0184}", + "comment-processing-outline": "\u{F0185}", + "comment-question": "\u{F0817}", + "comment-question-outline": "\u{F0186}", + "comment-quote": "\u{F1021}", + "comment-quote-outline": "\u{F1022}", + "comment-remove": "\u{F05DE}", + "comment-remove-outline": "\u{F0187}", + "comment-search": "\u{F0A3C}", + "comment-search-outline": "\u{F0A3D}", + "comment-text": "\u{F0188}", + "comment-text-multiple": "\u{F0860}", + "comment-text-multiple-outline": "\u{F0861}", + "comment-text-outline": "\u{F0189}", + "compare": "\u{F018A}", + "compare-horizontal": "\u{F1492}", + "compare-remove": "\u{F18B3}", + "compare-vertical": "\u{F1493}", + "compass": "\u{F018B}", + "compass-off": "\u{F0B80}", + "compass-off-outline": "\u{F0B81}", + "compass-outline": "\u{F018C}", + "compass-rose": "\u{F1382}", + "compost": "\u{F1A38}", + "cone": "\u{F194C}", + "cone-off": "\u{F194D}", + "connection": "\u{F1616}", + "console": "\u{F018D}", + "console-line": "\u{F07B7}", + "console-network": "\u{F08A9}", + "console-network-outline": "\u{F0C60}", + "consolidate": "\u{F10D8}", + "contactless-payment": "\u{F0D6A}", + "contactless-payment-circle": "\u{F0321}", + "contactless-payment-circle-outline": "\u{F0408}", + "contacts": "\u{F06CB}", + "contacts-outline": "\u{F05B8}", + "contain": "\u{F0A3E}", + "contain-end": "\u{F0A3F}", + "contain-start": "\u{F0A40}", + "content-copy": "\u{F018F}", + "content-cut": "\u{F0190}", + "content-duplicate": "\u{F0191}", + "content-paste": "\u{F0192}", + "content-save": "\u{F0193}", + "content-save-alert": "\u{F0F42}", + "content-save-alert-outline": "\u{F0F43}", + "content-save-all": "\u{F0194}", + "content-save-all-outline": "\u{F0F44}", + "content-save-check": "\u{F18EA}", + "content-save-check-outline": "\u{F18EB}", + "content-save-cog": "\u{F145B}", + "content-save-cog-outline": "\u{F145C}", + "content-save-edit": "\u{F0CFB}", + "content-save-edit-outline": "\u{F0CFC}", + "content-save-minus": "\u{F1B43}", + "content-save-minus-outline": "\u{F1B44}", + "content-save-move": "\u{F0E27}", + "content-save-move-outline": "\u{F0E28}", + "content-save-off": "\u{F1643}", + "content-save-off-outline": "\u{F1644}", + "content-save-outline": "\u{F0818}", + "content-save-plus": "\u{F1B41}", + "content-save-plus-outline": "\u{F1B42}", + "content-save-settings": "\u{F061B}", + "content-save-settings-outline": "\u{F0B2E}", + "contrast": "\u{F0195}", + "contrast-box": "\u{F0196}", + "contrast-circle": "\u{F0197}", + "controller": "\u{F02B4}", + "controller-classic": "\u{F0B82}", + "controller-classic-outline": "\u{F0B83}", + "controller-off": "\u{F02B5}", + "cookie": "\u{F0198}", + "cookie-alert": "\u{F16D0}", + "cookie-alert-outline": "\u{F16D1}", + "cookie-check": "\u{F16D2}", + "cookie-check-outline": "\u{F16D3}", + "cookie-clock": "\u{F16E4}", + "cookie-clock-outline": "\u{F16E5}", + "cookie-cog": "\u{F16D4}", + "cookie-cog-outline": "\u{F16D5}", + "cookie-edit": "\u{F16E6}", + "cookie-edit-outline": "\u{F16E7}", + "cookie-lock": "\u{F16E8}", + "cookie-lock-outline": "\u{F16E9}", + "cookie-minus": "\u{F16DA}", + "cookie-minus-outline": "\u{F16DB}", + "cookie-off": "\u{F16EA}", + "cookie-off-outline": "\u{F16EB}", + "cookie-outline": "\u{F16DE}", + "cookie-plus": "\u{F16D6}", + "cookie-plus-outline": "\u{F16D7}", + "cookie-refresh": "\u{F16EC}", + "cookie-refresh-outline": "\u{F16ED}", + "cookie-remove": "\u{F16D8}", + "cookie-remove-outline": "\u{F16D9}", + "cookie-settings": "\u{F16DC}", + "cookie-settings-outline": "\u{F16DD}", + "coolant-temperature": "\u{F03C8}", + "copyleft": "\u{F1939}", + "copyright": "\u{F05E6}", + "cordova": "\u{F0958}", + "corn": "\u{F07B8}", + "corn-off": "\u{F13EF}", + "cosine-wave": "\u{F1479}", + "counter": "\u{F0199}", + "countertop": "\u{F181C}", + "countertop-outline": "\u{F181D}", + "cow": "\u{F019A}", + "cow-off": "\u{F18FC}", + "cpu-32-bit": "\u{F0EDF}", + "cpu-64-bit": "\u{F0EE0}", + "cradle": "\u{F198B}", + "cradle-outline": "\u{F1991}", + "crane": "\u{F0862}", + "creation": "\u{F0674}", + "creation-outline": "\u{F1C2B}", + "creative-commons": "\u{F0D6B}", + "credit-card": "\u{F0FEF}", + "credit-card-check": "\u{F13D0}", + "credit-card-check-outline": "\u{F13D1}", + "credit-card-chip": "\u{F190F}", + "credit-card-chip-outline": "\u{F1910}", + "credit-card-clock": "\u{F0EE1}", + "credit-card-clock-outline": "\u{F0EE2}", + "credit-card-edit": "\u{F17D7}", + "credit-card-edit-outline": "\u{F17D8}", + "credit-card-fast": "\u{F1911}", + "credit-card-fast-outline": "\u{F1912}", + "credit-card-lock": "\u{F18E7}", + "credit-card-lock-outline": "\u{F18E8}", + "credit-card-marker": "\u{F06A8}", + "credit-card-marker-outline": "\u{F0DBE}", + "credit-card-minus": "\u{F0FAC}", + "credit-card-minus-outline": "\u{F0FAD}", + "credit-card-multiple": "\u{F0FF0}", + "credit-card-multiple-outline": "\u{F019C}", + "credit-card-off": "\u{F0FF1}", + "credit-card-off-outline": "\u{F05E4}", + "credit-card-outline": "\u{F019B}", + "credit-card-plus": "\u{F0FF2}", + "credit-card-plus-outline": "\u{F0676}", + "credit-card-refresh": "\u{F1645}", + "credit-card-refresh-outline": "\u{F1646}", + "credit-card-refund": "\u{F0FF3}", + "credit-card-refund-outline": "\u{F0AA8}", + "credit-card-remove": "\u{F0FAE}", + "credit-card-remove-outline": "\u{F0FAF}", + "credit-card-scan": "\u{F0FF4}", + "credit-card-scan-outline": "\u{F019D}", + "credit-card-search": "\u{F1647}", + "credit-card-search-outline": "\u{F1648}", + "credit-card-settings": "\u{F0FF5}", + "credit-card-settings-outline": "\u{F08D7}", + "credit-card-sync": "\u{F1649}", + "credit-card-sync-outline": "\u{F164A}", + "credit-card-wireless": "\u{F0802}", + "credit-card-wireless-off": "\u{F057A}", + "credit-card-wireless-off-outline": "\u{F057B}", + "credit-card-wireless-outline": "\u{F0D6C}", + "cricket": "\u{F0D6D}", + "crop": "\u{F019E}", + "crop-free": "\u{F019F}", + "crop-landscape": "\u{F01A0}", + "crop-portrait": "\u{F01A1}", + "crop-rotate": "\u{F0696}", + "crop-square": "\u{F01A2}", + "cross": "\u{F0953}", + "cross-bolnisi": "\u{F0CED}", + "cross-celtic": "\u{F0CF5}", + "cross-outline": "\u{F0CF6}", + "crosshairs": "\u{F01A3}", + "crosshairs-gps": "\u{F01A4}", + "crosshairs-off": "\u{F0F45}", + "crosshairs-question": "\u{F1136}", + "crowd": "\u{F1975}", + "crown": "\u{F01A5}", + "crown-circle": "\u{F17DC}", + "crown-circle-outline": "\u{F17DD}", + "crown-outline": "\u{F11D0}", + "cryengine": "\u{F0959}", + "crystal-ball": "\u{F0B2F}", + "cube": "\u{F01A6}", + "cube-off": "\u{F141C}", + "cube-off-outline": "\u{F141D}", + "cube-outline": "\u{F01A7}", + "cube-scan": "\u{F0B84}", + "cube-send": "\u{F01A8}", + "cube-unfolded": "\u{F01A9}", + "cup": "\u{F01AA}", + "cup-off": "\u{F05E5}", + "cup-off-outline": "\u{F137D}", + "cup-outline": "\u{F130F}", + "cup-water": "\u{F01AB}", + "cupboard": "\u{F0F46}", + "cupboard-outline": "\u{F0F47}", + "cupcake": "\u{F095A}", + "curling": "\u{F0863}", + "currency-bdt": "\u{F0864}", + "currency-brl": "\u{F0B85}", + "currency-btc": "\u{F01AC}", + "currency-cny": "\u{F07BA}", + "currency-eth": "\u{F07BB}", + "currency-eur": "\u{F01AD}", + "currency-eur-off": "\u{F1315}", + "currency-fra": "\u{F1A39}", + "currency-gbp": "\u{F01AE}", + "currency-ils": "\u{F0C61}", + "currency-inr": "\u{F01AF}", + "currency-jpy": "\u{F07BC}", + "currency-krw": "\u{F07BD}", + "currency-kzt": "\u{F0865}", + "currency-mnt": "\u{F1512}", + "currency-ngn": "\u{F01B0}", + "currency-php": "\u{F09E6}", + "currency-rial": "\u{F0E9C}", + "currency-rub": "\u{F01B1}", + "currency-rupee": "\u{F1976}", + "currency-sign": "\u{F07BE}", + "currency-thb": "\u{F1C05}", + "currency-try": "\u{F01B2}", + "currency-twd": "\u{F07BF}", + "currency-uah": "\u{F1B9B}", + "currency-usd": "\u{F01C1}", + "currency-usd-off": "\u{F067A}", + "current-ac": "\u{F1480}", + "current-dc": "\u{F095C}", + "cursor-default": "\u{F01C0}", + "cursor-default-click": "\u{F0CFD}", + "cursor-default-click-outline": "\u{F0CFE}", + "cursor-default-gesture": "\u{F1127}", + "cursor-default-gesture-outline": "\u{F1128}", + "cursor-default-outline": "\u{F01BF}", + "cursor-move": "\u{F01BE}", + "cursor-pointer": "\u{F01BD}", + "cursor-text": "\u{F05E7}", + "curtains": "\u{F1846}", + "curtains-closed": "\u{F1847}", + "cylinder": "\u{F194E}", + "cylinder-off": "\u{F194F}", + "dance-ballroom": "\u{F15FB}", + "dance-pole": "\u{F1578}", + "data-matrix": "\u{F153C}", + "data-matrix-edit": "\u{F153D}", + "data-matrix-minus": "\u{F153E}", + "data-matrix-plus": "\u{F153F}", + "data-matrix-remove": "\u{F1540}", + "data-matrix-scan": "\u{F1541}", + "database": "\u{F01BC}", + "database-alert": "\u{F163A}", + "database-alert-outline": "\u{F1624}", + "database-arrow-down": "\u{F163B}", + "database-arrow-down-outline": "\u{F1625}", + "database-arrow-left": "\u{F163C}", + "database-arrow-left-outline": "\u{F1626}", + "database-arrow-right": "\u{F163D}", + "database-arrow-right-outline": "\u{F1627}", + "database-arrow-up": "\u{F163E}", + "database-arrow-up-outline": "\u{F1628}", + "database-check": "\u{F0AA9}", + "database-check-outline": "\u{F1629}", + "database-clock": "\u{F163F}", + "database-clock-outline": "\u{F162A}", + "database-cog": "\u{F164B}", + "database-cog-outline": "\u{F164C}", + "database-edit": "\u{F0B86}", + "database-edit-outline": "\u{F162B}", + "database-export": "\u{F095E}", + "database-export-outline": "\u{F162C}", + "database-eye": "\u{F191F}", + "database-eye-off": "\u{F1920}", + "database-eye-off-outline": "\u{F1921}", + "database-eye-outline": "\u{F1922}", + "database-import": "\u{F095D}", + "database-import-outline": "\u{F162D}", + "database-lock": "\u{F0AAA}", + "database-lock-outline": "\u{F162E}", + "database-marker": "\u{F12F6}", + "database-marker-outline": "\u{F162F}", + "database-minus": "\u{F01BB}", + "database-minus-outline": "\u{F1630}", + "database-off": "\u{F1640}", + "database-off-outline": "\u{F1631}", + "database-outline": "\u{F1632}", + "database-plus": "\u{F01BA}", + "database-plus-outline": "\u{F1633}", + "database-refresh": "\u{F05C2}", + "database-refresh-outline": "\u{F1634}", + "database-remove": "\u{F0D00}", + "database-remove-outline": "\u{F1635}", + "database-search": "\u{F0866}", + "database-search-outline": "\u{F1636}", + "database-settings": "\u{F0D01}", + "database-settings-outline": "\u{F1637}", + "database-sync": "\u{F0CFF}", + "database-sync-outline": "\u{F1638}", + "death-star": "\u{F08D8}", + "death-star-variant": "\u{F08D9}", + "deathly-hallows": "\u{F0B87}", + "debian": "\u{F08DA}", + "debug-step-into": "\u{F01B9}", + "debug-step-out": "\u{F01B8}", + "debug-step-over": "\u{F01B7}", + "decagram": "\u{F076C}", + "decagram-outline": "\u{F076D}", + "decimal": "\u{F10A1}", + "decimal-comma": "\u{F10A2}", + "decimal-comma-decrease": "\u{F10A3}", + "decimal-comma-increase": "\u{F10A4}", + "decimal-decrease": "\u{F01B6}", + "decimal-increase": "\u{F01B5}", + "delete": "\u{F01B4}", + "delete-alert": "\u{F10A5}", + "delete-alert-outline": "\u{F10A6}", + "delete-circle": "\u{F0683}", + "delete-circle-outline": "\u{F0B88}", + "delete-clock": "\u{F1556}", + "delete-clock-outline": "\u{F1557}", + "delete-empty": "\u{F06CC}", + "delete-empty-outline": "\u{F0E9D}", + "delete-forever": "\u{F05E8}", + "delete-forever-outline": "\u{F0B89}", + "delete-off": "\u{F10A7}", + "delete-off-outline": "\u{F10A8}", + "delete-outline": "\u{F09E7}", + "delete-restore": "\u{F0819}", + "delete-sweep": "\u{F05E9}", + "delete-sweep-outline": "\u{F0C62}", + "delete-variant": "\u{F01B3}", + "delta": "\u{F01C2}", + "desk": "\u{F1239}", + "desk-lamp": "\u{F095F}", + "desk-lamp-off": "\u{F1B1F}", + "desk-lamp-on": "\u{F1B20}", + "deskphone": "\u{F01C3}", + "desktop-classic": "\u{F07C0}", + "desktop-tower": "\u{F01C5}", + "desktop-tower-monitor": "\u{F0AAB}", + "details": "\u{F01C6}", + "dev-to": "\u{F0D6E}", + "developer-board": "\u{F0697}", + "deviantart": "\u{F01C7}", + "devices": "\u{F0FB0}", + "dharmachakra": "\u{F094B}", + "diabetes": "\u{F1126}", + "dialpad": "\u{F061C}", + "diameter": "\u{F0C63}", + "diameter-outline": "\u{F0C64}", + "diameter-variant": "\u{F0C65}", + "diamond": "\u{F0B8A}", + "diamond-outline": "\u{F0B8B}", + "diamond-stone": "\u{F01C8}", + "dice-1": "\u{F01CA}", + "dice-1-outline": "\u{F114A}", + "dice-2": "\u{F01CB}", + "dice-2-outline": "\u{F114B}", + "dice-3": "\u{F01CC}", + "dice-3-outline": "\u{F114C}", + "dice-4": "\u{F01CD}", + "dice-4-outline": "\u{F114D}", + "dice-5": "\u{F01CE}", + "dice-5-outline": "\u{F114E}", + "dice-6": "\u{F01CF}", + "dice-6-outline": "\u{F114F}", + "dice-d10": "\u{F1153}", + "dice-d10-outline": "\u{F076F}", + "dice-d12": "\u{F1154}", + "dice-d12-outline": "\u{F0867}", + "dice-d20": "\u{F1155}", + "dice-d20-outline": "\u{F05EA}", + "dice-d4": "\u{F1150}", + "dice-d4-outline": "\u{F05EB}", + "dice-d6": "\u{F1151}", + "dice-d6-outline": "\u{F05ED}", + "dice-d8": "\u{F1152}", + "dice-d8-outline": "\u{F05EC}", + "dice-multiple": "\u{F076E}", + "dice-multiple-outline": "\u{F1156}", + "digital-ocean": "\u{F1237}", + "dip-switch": "\u{F07C1}", + "directions": "\u{F01D0}", + "directions-fork": "\u{F0641}", + "disc": "\u{F05EE}", + "disc-alert": "\u{F01D1}", + "disc-player": "\u{F0960}", + "dishwasher": "\u{F0AAC}", + "dishwasher-alert": "\u{F11B8}", + "dishwasher-off": "\u{F11B9}", + "disqus": "\u{F01D2}", + "distribute-horizontal-center": "\u{F11C9}", + "distribute-horizontal-left": "\u{F11C8}", + "distribute-horizontal-right": "\u{F11CA}", + "distribute-vertical-bottom": "\u{F11CB}", + "distribute-vertical-center": "\u{F11CC}", + "distribute-vertical-top": "\u{F11CD}", + "diversify": "\u{F1877}", + "diving": "\u{F1977}", + "diving-flippers": "\u{F0DBF}", + "diving-helmet": "\u{F0DC0}", + "diving-scuba": "\u{F1B77}", + "diving-scuba-flag": "\u{F0DC2}", + "diving-scuba-mask": "\u{F0DC1}", + "diving-scuba-tank": "\u{F0DC3}", + "diving-scuba-tank-multiple": "\u{F0DC4}", + "diving-snorkel": "\u{F0DC5}", + "division": "\u{F01D4}", + "division-box": "\u{F01D5}", + "dlna": "\u{F0A41}", + "dna": "\u{F0684}", + "dns": "\u{F01D6}", + "dns-outline": "\u{F0B8C}", + "dock-bottom": "\u{F10A9}", + "dock-left": "\u{F10AA}", + "dock-right": "\u{F10AB}", + "dock-top": "\u{F1513}", + "dock-window": "\u{F10AC}", + "docker": "\u{F0868}", + "doctor": "\u{F0A42}", + "dog": "\u{F0A43}", + "dog-service": "\u{F0AAD}", + "dog-side": "\u{F0A44}", + "dog-side-off": "\u{F16EE}", + "dolby": "\u{F06B3}", + "dolly": "\u{F0E9E}", + "dolphin": "\u{F18B4}", + "domain": "\u{F01D7}", + "domain-off": "\u{F0D6F}", + "domain-plus": "\u{F10AD}", + "domain-remove": "\u{F10AE}", + "domain-switch": "\u{F1C2C}", + "dome-light": "\u{F141E}", + "domino-mask": "\u{F1023}", + "donkey": "\u{F07C2}", + "door": "\u{F081A}", + "door-closed": "\u{F081B}", + "door-closed-lock": "\u{F10AF}", + "door-open": "\u{F081C}", + "door-sliding": "\u{F181E}", + "door-sliding-lock": "\u{F181F}", + "door-sliding-open": "\u{F1820}", + "doorbell": "\u{F12E6}", + "doorbell-video": "\u{F0869}", + "dot-net": "\u{F0AAE}", + "dots-circle": "\u{F1978}", + "dots-grid": "\u{F15FC}", + "dots-hexagon": "\u{F15FF}", + "dots-horizontal": "\u{F01D8}", + "dots-horizontal-circle": "\u{F07C3}", + "dots-horizontal-circle-outline": "\u{F0B8D}", + "dots-square": "\u{F15FD}", + "dots-triangle": "\u{F15FE}", + "dots-vertical": "\u{F01D9}", + "dots-vertical-circle": "\u{F07C4}", + "dots-vertical-circle-outline": "\u{F0B8E}", + "download": "\u{F01DA}", + "download-box": "\u{F1462}", + "download-box-outline": "\u{F1463}", + "download-circle": "\u{F1464}", + "download-circle-outline": "\u{F1465}", + "download-lock": "\u{F1320}", + "download-lock-outline": "\u{F1321}", + "download-multiple": "\u{F09E9}", + "download-network": "\u{F06F4}", + "download-network-outline": "\u{F0C66}", + "download-off": "\u{F10B0}", + "download-off-outline": "\u{F10B1}", + "download-outline": "\u{F0B8F}", + "drag": "\u{F01DB}", + "drag-horizontal": "\u{F01DC}", + "drag-horizontal-variant": "\u{F12F0}", + "drag-variant": "\u{F0B90}", + "drag-vertical": "\u{F01DD}", + "drag-vertical-variant": "\u{F12F1}", + "drama-masks": "\u{F0D02}", + "draw": "\u{F0F49}", + "draw-pen": "\u{F19B9}", + "drawing": "\u{F01DE}", + "drawing-box": "\u{F01DF}", + "dresser": "\u{F0F4A}", + "dresser-outline": "\u{F0F4B}", + "drone": "\u{F01E2}", + "dropbox": "\u{F01E3}", + "drupal": "\u{F01E4}", + "duck": "\u{F01E5}", + "dumbbell": "\u{F01E6}", + "dump-truck": "\u{F0C67}", + "ear-hearing": "\u{F07C5}", + "ear-hearing-loop": "\u{F1AEE}", + "ear-hearing-off": "\u{F0A45}", + "earbuds": "\u{F184F}", + "earbuds-off": "\u{F1850}", + "earbuds-off-outline": "\u{F1851}", + "earbuds-outline": "\u{F1852}", + "earth": "\u{F01E7}", + "earth-arrow-right": "\u{F1311}", + "earth-box": "\u{F06CD}", + "earth-box-minus": "\u{F1407}", + "earth-box-off": "\u{F06CE}", + "earth-box-plus": "\u{F1406}", + "earth-box-remove": "\u{F1408}", + "earth-minus": "\u{F1404}", + "earth-off": "\u{F01E8}", + "earth-plus": "\u{F1403}", + "earth-remove": "\u{F1405}", + "egg": "\u{F0AAF}", + "egg-easter": "\u{F0AB0}", + "egg-fried": "\u{F184A}", + "egg-off": "\u{F13F0}", + "egg-off-outline": "\u{F13F1}", + "egg-outline": "\u{F13F2}", + "eiffel-tower": "\u{F156B}", + "eight-track": "\u{F09EA}", + "eject": "\u{F01EA}", + "eject-circle": "\u{F1B23}", + "eject-circle-outline": "\u{F1B24}", + "eject-outline": "\u{F0B91}", + "electric-switch": "\u{F0E9F}", + "electric-switch-closed": "\u{F10D9}", + "electron-framework": "\u{F1024}", + "elephant": "\u{F07C6}", + "elevation-decline": "\u{F01EB}", + "elevation-rise": "\u{F01EC}", + "elevator": "\u{F01ED}", + "elevator-down": "\u{F12C2}", + "elevator-passenger": "\u{F1381}", + "elevator-passenger-off": "\u{F1979}", + "elevator-passenger-off-outline": "\u{F197A}", + "elevator-passenger-outline": "\u{F197B}", + "elevator-up": "\u{F12C1}", + "ellipse": "\u{F0EA0}", + "ellipse-outline": "\u{F0EA1}", + "email": "\u{F01EE}", + "email-alert": "\u{F06CF}", + "email-alert-outline": "\u{F0D42}", + "email-arrow-left": "\u{F10DA}", + "email-arrow-left-outline": "\u{F10DB}", + "email-arrow-right": "\u{F10DC}", + "email-arrow-right-outline": "\u{F10DD}", + "email-box": "\u{F0D03}", + "email-check": "\u{F0AB1}", + "email-check-outline": "\u{F0AB2}", + "email-edit": "\u{F0EE3}", + "email-edit-outline": "\u{F0EE4}", + "email-fast": "\u{F186F}", + "email-fast-outline": "\u{F1870}", + "email-heart-outline": "\u{F1C5B}", + "email-lock": "\u{F01F1}", + "email-lock-outline": "\u{F1B61}", + "email-mark-as-unread": "\u{F0B92}", + "email-minus": "\u{F0EE5}", + "email-minus-outline": "\u{F0EE6}", + "email-multiple": "\u{F0EE7}", + "email-multiple-outline": "\u{F0EE8}", + "email-newsletter": "\u{F0FB1}", + "email-off": "\u{F13E3}", + "email-off-outline": "\u{F13E4}", + "email-open": "\u{F01EF}", + "email-open-heart-outline": "\u{F1C5C}", + "email-open-multiple": "\u{F0EE9}", + "email-open-multiple-outline": "\u{F0EEA}", + "email-open-outline": "\u{F05EF}", + "email-outline": "\u{F01F0}", + "email-plus": "\u{F09EB}", + "email-plus-outline": "\u{F09EC}", + "email-remove": "\u{F1661}", + "email-remove-outline": "\u{F1662}", + "email-seal": "\u{F195B}", + "email-seal-outline": "\u{F195C}", + "email-search": "\u{F0961}", + "email-search-outline": "\u{F0962}", + "email-sync": "\u{F12C7}", + "email-sync-outline": "\u{F12C8}", + "email-variant": "\u{F05F0}", + "ember": "\u{F0B30}", + "emby": "\u{F06B4}", + "emoticon": "\u{F0C68}", + "emoticon-angry": "\u{F0C69}", + "emoticon-angry-outline": "\u{F0C6A}", + "emoticon-confused": "\u{F10DE}", + "emoticon-confused-outline": "\u{F10DF}", + "emoticon-cool": "\u{F0C6B}", + "emoticon-cool-outline": "\u{F01F3}", + "emoticon-cry": "\u{F0C6C}", + "emoticon-cry-outline": "\u{F0C6D}", + "emoticon-dead": "\u{F0C6E}", + "emoticon-dead-outline": "\u{F069B}", + "emoticon-devil": "\u{F0C6F}", + "emoticon-devil-outline": "\u{F01F4}", + "emoticon-excited": "\u{F0C70}", + "emoticon-excited-outline": "\u{F069C}", + "emoticon-frown": "\u{F0F4C}", + "emoticon-frown-outline": "\u{F0F4D}", + "emoticon-happy": "\u{F0C71}", + "emoticon-happy-outline": "\u{F01F5}", + "emoticon-kiss": "\u{F0C72}", + "emoticon-kiss-outline": "\u{F0C73}", + "emoticon-lol": "\u{F1214}", + "emoticon-lol-outline": "\u{F1215}", + "emoticon-neutral": "\u{F0C74}", + "emoticon-neutral-outline": "\u{F01F6}", + "emoticon-outline": "\u{F01F2}", + "emoticon-poop": "\u{F01F7}", + "emoticon-poop-outline": "\u{F0C75}", + "emoticon-sad": "\u{F0C76}", + "emoticon-sad-outline": "\u{F01F8}", + "emoticon-sick": "\u{F157C}", + "emoticon-sick-outline": "\u{F157D}", + "emoticon-tongue": "\u{F01F9}", + "emoticon-tongue-outline": "\u{F0C77}", + "emoticon-wink": "\u{F0C78}", + "emoticon-wink-outline": "\u{F0C79}", + "engine": "\u{F01FA}", + "engine-off": "\u{F0A46}", + "engine-off-outline": "\u{F0A47}", + "engine-outline": "\u{F01FB}", + "epsilon": "\u{F10E0}", + "equal": "\u{F01FC}", + "equal-box": "\u{F01FD}", + "equalizer": "\u{F0EA2}", + "equalizer-outline": "\u{F0EA3}", + "eraser": "\u{F01FE}", + "eraser-variant": "\u{F0642}", + "escalator": "\u{F01FF}", + "escalator-box": "\u{F1399}", + "escalator-down": "\u{F12C0}", + "escalator-up": "\u{F12BF}", + "eslint": "\u{F0C7A}", + "et": "\u{F0AB3}", + "ethereum": "\u{F086A}", + "ethernet": "\u{F0200}", + "ethernet-cable": "\u{F0201}", + "ethernet-cable-off": "\u{F0202}", + "ev-plug-ccs1": "\u{F1519}", + "ev-plug-ccs2": "\u{F151A}", + "ev-plug-chademo": "\u{F151B}", + "ev-plug-tesla": "\u{F151C}", + "ev-plug-type1": "\u{F151D}", + "ev-plug-type2": "\u{F151E}", + "ev-station": "\u{F05F1}", + "evernote": "\u{F0204}", + "excavator": "\u{F1025}", + "exclamation": "\u{F0205}", + "exclamation-thick": "\u{F1238}", + "exit-run": "\u{F0A48}", + "exit-to-app": "\u{F0206}", + "expand-all": "\u{F0AB4}", + "expand-all-outline": "\u{F0AB5}", + "expansion-card": "\u{F08AE}", + "expansion-card-variant": "\u{F0FB2}", + "exponent": "\u{F0963}", + "exponent-box": "\u{F0964}", + "export": "\u{F0207}", + "export-variant": "\u{F0B93}", + "eye": "\u{F0208}", + "eye-arrow-left": "\u{F18FD}", + "eye-arrow-left-outline": "\u{F18FE}", + "eye-arrow-right": "\u{F18FF}", + "eye-arrow-right-outline": "\u{F1900}", + "eye-check": "\u{F0D04}", + "eye-check-outline": "\u{F0D05}", + "eye-circle": "\u{F0B94}", + "eye-circle-outline": "\u{F0B95}", + "eye-lock": "\u{F1C06}", + "eye-lock-open": "\u{F1C07}", + "eye-lock-open-outline": "\u{F1C08}", + "eye-lock-outline": "\u{F1C09}", + "eye-minus": "\u{F1026}", + "eye-minus-outline": "\u{F1027}", + "eye-off": "\u{F0209}", + "eye-off-outline": "\u{F06D1}", + "eye-outline": "\u{F06D0}", + "eye-plus": "\u{F086B}", + "eye-plus-outline": "\u{F086C}", + "eye-refresh": "\u{F197C}", + "eye-refresh-outline": "\u{F197D}", + "eye-remove": "\u{F15E3}", + "eye-remove-outline": "\u{F15E4}", + "eye-settings": "\u{F086D}", + "eye-settings-outline": "\u{F086E}", + "eyedropper": "\u{F020A}", + "eyedropper-minus": "\u{F13DD}", + "eyedropper-off": "\u{F13DF}", + "eyedropper-plus": "\u{F13DC}", + "eyedropper-remove": "\u{F13DE}", + "eyedropper-variant": "\u{F020B}", + "face-agent": "\u{F0D70}", + "face-man": "\u{F0643}", + "face-man-outline": "\u{F0B96}", + "face-man-profile": "\u{F0644}", + "face-man-shimmer": "\u{F15CC}", + "face-man-shimmer-outline": "\u{F15CD}", + "face-mask": "\u{F1586}", + "face-mask-outline": "\u{F1587}", + "face-recognition": "\u{F0C7B}", + "face-woman": "\u{F1077}", + "face-woman-outline": "\u{F1078}", + "face-woman-profile": "\u{F1076}", + "face-woman-shimmer": "\u{F15CE}", + "face-woman-shimmer-outline": "\u{F15CF}", + "facebook": "\u{F020C}", + "facebook-gaming": "\u{F07DD}", + "facebook-messenger": "\u{F020E}", + "facebook-workplace": "\u{F0B31}", + "factory": "\u{F020F}", + "family-tree": "\u{F160E}", + "fan": "\u{F0210}", + "fan-alert": "\u{F146C}", + "fan-auto": "\u{F171D}", + "fan-chevron-down": "\u{F146D}", + "fan-chevron-up": "\u{F146E}", + "fan-clock": "\u{F1A3A}", + "fan-minus": "\u{F1470}", + "fan-off": "\u{F081D}", + "fan-plus": "\u{F146F}", + "fan-remove": "\u{F1471}", + "fan-speed-1": "\u{F1472}", + "fan-speed-2": "\u{F1473}", + "fan-speed-3": "\u{F1474}", + "fast-forward": "\u{F0211}", + "fast-forward-10": "\u{F0D71}", + "fast-forward-15": "\u{F193A}", + "fast-forward-30": "\u{F0D06}", + "fast-forward-45": "\u{F1B12}", + "fast-forward-5": "\u{F11F8}", + "fast-forward-60": "\u{F160B}", + "fast-forward-outline": "\u{F06D2}", + "faucet": "\u{F1B29}", + "faucet-variant": "\u{F1B2A}", + "fax": "\u{F0212}", + "feather": "\u{F06D3}", + "feature-search": "\u{F0A49}", + "feature-search-outline": "\u{F0A4A}", + "fedora": "\u{F08DB}", + "fence": "\u{F179A}", + "fence-electric": "\u{F17F6}", + "fencing": "\u{F14C1}", + "ferris-wheel": "\u{F0EA4}", + "ferry": "\u{F0213}", + "file": "\u{F0214}", + "file-account": "\u{F073B}", + "file-account-outline": "\u{F1028}", + "file-alert": "\u{F0A4B}", + "file-alert-outline": "\u{F0A4C}", + "file-arrow-left-right": "\u{F1A93}", + "file-arrow-left-right-outline": "\u{F1A94}", + "file-arrow-up-down": "\u{F1A95}", + "file-arrow-up-down-outline": "\u{F1A96}", + "file-cabinet": "\u{F0AB6}", + "file-cad": "\u{F0EEB}", + "file-cad-box": "\u{F0EEC}", + "file-cancel": "\u{F0DC6}", + "file-cancel-outline": "\u{F0DC7}", + "file-certificate": "\u{F1186}", + "file-certificate-outline": "\u{F1187}", + "file-chart": "\u{F0215}", + "file-chart-check": "\u{F19C6}", + "file-chart-check-outline": "\u{F19C7}", + "file-chart-outline": "\u{F1029}", + "file-check": "\u{F0216}", + "file-check-outline": "\u{F0E29}", + "file-clock": "\u{F12E1}", + "file-clock-outline": "\u{F12E2}", + "file-cloud": "\u{F0217}", + "file-cloud-outline": "\u{F102A}", + "file-code": "\u{F022E}", + "file-code-outline": "\u{F102B}", + "file-cog": "\u{F107B}", + "file-cog-outline": "\u{F107C}", + "file-compare": "\u{F08AA}", + "file-delimited": "\u{F0218}", + "file-delimited-outline": "\u{F0EA5}", + "file-document": "\u{F0219}", + "file-document-alert": "\u{F1A97}", + "file-document-alert-outline": "\u{F1A98}", + "file-document-arrow-right": "\u{F1C0F}", + "file-document-arrow-right-outline": "\u{F1C10}", + "file-document-check": "\u{F1A99}", + "file-document-check-outline": "\u{F1A9A}", + "file-document-edit": "\u{F0DC8}", + "file-document-edit-outline": "\u{F0DC9}", + "file-document-minus": "\u{F1A9B}", + "file-document-minus-outline": "\u{F1A9C}", + "file-document-multiple": "\u{F1517}", + "file-document-multiple-outline": "\u{F1518}", + "file-document-outline": "\u{F09EE}", + "file-document-plus": "\u{F1A9D}", + "file-document-plus-outline": "\u{F1A9E}", + "file-document-refresh": "\u{F1C7A}", + "file-document-refresh-outline": "\u{F1C7B}", + "file-document-remove": "\u{F1A9F}", + "file-document-remove-outline": "\u{F1AA0}", + "file-download": "\u{F0965}", + "file-download-outline": "\u{F0966}", + "file-edit": "\u{F11E7}", + "file-edit-outline": "\u{F11E8}", + "file-excel": "\u{F021B}", + "file-excel-box": "\u{F021C}", + "file-excel-box-outline": "\u{F102C}", + "file-excel-outline": "\u{F102D}", + "file-export": "\u{F021D}", + "file-export-outline": "\u{F102E}", + "file-eye": "\u{F0DCA}", + "file-eye-outline": "\u{F0DCB}", + "file-find": "\u{F021E}", + "file-find-outline": "\u{F0B97}", + "file-gif-box": "\u{F0D78}", + "file-hidden": "\u{F0613}", + "file-image": "\u{F021F}", + "file-image-marker": "\u{F1772}", + "file-image-marker-outline": "\u{F1773}", + "file-image-minus": "\u{F193B}", + "file-image-minus-outline": "\u{F193C}", + "file-image-outline": "\u{F0EB0}", + "file-image-plus": "\u{F193D}", + "file-image-plus-outline": "\u{F193E}", + "file-image-remove": "\u{F193F}", + "file-image-remove-outline": "\u{F1940}", + "file-import": "\u{F0220}", + "file-import-outline": "\u{F102F}", + "file-jpg-box": "\u{F0225}", + "file-key": "\u{F1184}", + "file-key-outline": "\u{F1185}", + "file-link": "\u{F1177}", + "file-link-outline": "\u{F1178}", + "file-lock": "\u{F0221}", + "file-lock-open": "\u{F19C8}", + "file-lock-open-outline": "\u{F19C9}", + "file-lock-outline": "\u{F1030}", + "file-marker": "\u{F1774}", + "file-marker-outline": "\u{F1775}", + "file-minus": "\u{F1AA1}", + "file-minus-outline": "\u{F1AA2}", + "file-move": "\u{F0AB9}", + "file-move-outline": "\u{F1031}", + "file-multiple": "\u{F0222}", + "file-multiple-outline": "\u{F1032}", + "file-music": "\u{F0223}", + "file-music-outline": "\u{F0E2A}", + "file-outline": "\u{F0224}", + "file-pdf-box": "\u{F0226}", + "file-percent": "\u{F081E}", + "file-percent-outline": "\u{F1033}", + "file-phone": "\u{F1179}", + "file-phone-outline": "\u{F117A}", + "file-plus": "\u{F0752}", + "file-plus-outline": "\u{F0EED}", + "file-png-box": "\u{F0E2D}", + "file-powerpoint": "\u{F0227}", + "file-powerpoint-box": "\u{F0228}", + "file-powerpoint-box-outline": "\u{F1034}", + "file-powerpoint-outline": "\u{F1035}", + "file-presentation-box": "\u{F0229}", + "file-question": "\u{F086F}", + "file-question-outline": "\u{F1036}", + "file-refresh": "\u{F0918}", + "file-refresh-outline": "\u{F0541}", + "file-remove": "\u{F0B98}", + "file-remove-outline": "\u{F1037}", + "file-replace": "\u{F0B32}", + "file-replace-outline": "\u{F0B33}", + "file-restore": "\u{F0670}", + "file-restore-outline": "\u{F1038}", + "file-rotate-left": "\u{F1A3B}", + "file-rotate-left-outline": "\u{F1A3C}", + "file-rotate-right": "\u{F1A3D}", + "file-rotate-right-outline": "\u{F1A3E}", + "file-search": "\u{F0C7C}", + "file-search-outline": "\u{F0C7D}", + "file-send": "\u{F022A}", + "file-send-outline": "\u{F1039}", + "file-settings": "\u{F1079}", + "file-settings-outline": "\u{F107A}", + "file-sign": "\u{F19C3}", + "file-star": "\u{F103A}", + "file-star-four-points": "\u{F1C2D}", + "file-star-four-points-outline": "\u{F1C2E}", + "file-star-outline": "\u{F103B}", + "file-swap": "\u{F0FB4}", + "file-swap-outline": "\u{F0FB5}", + "file-sync": "\u{F1216}", + "file-sync-outline": "\u{F1217}", + "file-table": "\u{F0C7E}", + "file-table-box": "\u{F10E1}", + "file-table-box-multiple": "\u{F10E2}", + "file-table-box-multiple-outline": "\u{F10E3}", + "file-table-box-outline": "\u{F10E4}", + "file-table-outline": "\u{F0C7F}", + "file-tree": "\u{F0645}", + "file-tree-outline": "\u{F13D2}", + "file-undo": "\u{F08DC}", + "file-undo-outline": "\u{F103C}", + "file-upload": "\u{F0A4D}", + "file-upload-outline": "\u{F0A4E}", + "file-video": "\u{F022B}", + "file-video-outline": "\u{F0E2C}", + "file-word": "\u{F022C}", + "file-word-box": "\u{F022D}", + "file-word-box-outline": "\u{F103D}", + "file-word-outline": "\u{F103E}", + "file-xml-box": "\u{F1B4B}", + "film": "\u{F022F}", + "filmstrip": "\u{F0230}", + "filmstrip-box": "\u{F0332}", + "filmstrip-box-multiple": "\u{F0D18}", + "filmstrip-off": "\u{F0231}", + "filter": "\u{F0232}", + "filter-check": "\u{F18EC}", + "filter-check-outline": "\u{F18ED}", + "filter-cog": "\u{F1AA3}", + "filter-cog-outline": "\u{F1AA4}", + "filter-menu": "\u{F10E5}", + "filter-menu-outline": "\u{F10E6}", + "filter-minus": "\u{F0EEE}", + "filter-minus-outline": "\u{F0EEF}", + "filter-multiple": "\u{F1A3F}", + "filter-multiple-outline": "\u{F1A40}", + "filter-off": "\u{F14EF}", + "filter-off-outline": "\u{F14F0}", + "filter-outline": "\u{F0233}", + "filter-plus": "\u{F0EF0}", + "filter-plus-outline": "\u{F0EF1}", + "filter-remove": "\u{F0234}", + "filter-remove-outline": "\u{F0235}", + "filter-settings": "\u{F1AA5}", + "filter-settings-outline": "\u{F1AA6}", + "filter-variant": "\u{F0236}", + "filter-variant-minus": "\u{F1112}", + "filter-variant-plus": "\u{F1113}", + "filter-variant-remove": "\u{F103F}", + "finance": "\u{F081F}", + "find-replace": "\u{F06D4}", + "fingerprint": "\u{F0237}", + "fingerprint-off": "\u{F0EB1}", + "fire": "\u{F0238}", + "fire-alert": "\u{F15D7}", + "fire-circle": "\u{F1807}", + "fire-extinguisher": "\u{F0EF2}", + "fire-hydrant": "\u{F1137}", + "fire-hydrant-alert": "\u{F1138}", + "fire-hydrant-off": "\u{F1139}", + "fire-off": "\u{F1722}", + "fire-truck": "\u{F08AB}", + "firebase": "\u{F0967}", + "firefox": "\u{F0239}", + "fireplace": "\u{F0E2E}", + "fireplace-off": "\u{F0E2F}", + "firewire": "\u{F05BE}", + "firework": "\u{F0E30}", + "firework-off": "\u{F1723}", + "fish": "\u{F023A}", + "fish-off": "\u{F13F3}", + "fishbowl": "\u{F0EF3}", + "fishbowl-outline": "\u{F0EF4}", + "fit-to-page": "\u{F0EF5}", + "fit-to-page-outline": "\u{F0EF6}", + "fit-to-screen": "\u{F18F4}", + "fit-to-screen-outline": "\u{F18F5}", + "flag": "\u{F023B}", + "flag-checkered": "\u{F023C}", + "flag-minus": "\u{F0B99}", + "flag-minus-outline": "\u{F10B2}", + "flag-off": "\u{F18EE}", + "flag-off-outline": "\u{F18EF}", + "flag-outline": "\u{F023D}", + "flag-plus": "\u{F0B9A}", + "flag-plus-outline": "\u{F10B3}", + "flag-remove": "\u{F0B9B}", + "flag-remove-outline": "\u{F10B4}", + "flag-triangle": "\u{F023F}", + "flag-variant": "\u{F0240}", + "flag-variant-minus": "\u{F1BB4}", + "flag-variant-minus-outline": "\u{F1BB5}", + "flag-variant-off": "\u{F1BB0}", + "flag-variant-off-outline": "\u{F1BB1}", + "flag-variant-outline": "\u{F023E}", + "flag-variant-plus": "\u{F1BB2}", + "flag-variant-plus-outline": "\u{F1BB3}", + "flag-variant-remove": "\u{F1BB6}", + "flag-variant-remove-outline": "\u{F1BB7}", + "flare": "\u{F0D72}", + "flash": "\u{F0241}", + "flash-alert": "\u{F0EF7}", + "flash-alert-outline": "\u{F0EF8}", + "flash-auto": "\u{F0242}", + "flash-off": "\u{F0243}", + "flash-off-outline": "\u{F1B45}", + "flash-outline": "\u{F06D5}", + "flash-red-eye": "\u{F067B}", + "flash-triangle": "\u{F1B1D}", + "flash-triangle-outline": "\u{F1B1E}", + "flashlight": "\u{F0244}", + "flashlight-off": "\u{F0245}", + "flask": "\u{F0093}", + "flask-empty": "\u{F0094}", + "flask-empty-minus": "\u{F123A}", + "flask-empty-minus-outline": "\u{F123B}", + "flask-empty-off": "\u{F13F4}", + "flask-empty-off-outline": "\u{F13F5}", + "flask-empty-outline": "\u{F0095}", + "flask-empty-plus": "\u{F123C}", + "flask-empty-plus-outline": "\u{F123D}", + "flask-empty-remove": "\u{F123E}", + "flask-empty-remove-outline": "\u{F123F}", + "flask-minus": "\u{F1240}", + "flask-minus-outline": "\u{F1241}", + "flask-off": "\u{F13F6}", + "flask-off-outline": "\u{F13F7}", + "flask-outline": "\u{F0096}", + "flask-plus": "\u{F1242}", + "flask-plus-outline": "\u{F1243}", + "flask-remove": "\u{F1244}", + "flask-remove-outline": "\u{F1245}", + "flask-round-bottom": "\u{F124B}", + "flask-round-bottom-empty": "\u{F124C}", + "flask-round-bottom-empty-outline": "\u{F124D}", + "flask-round-bottom-outline": "\u{F124E}", + "fleur-de-lis": "\u{F1303}", + "flip-horizontal": "\u{F10E7}", + "flip-to-back": "\u{F0247}", + "flip-to-front": "\u{F0248}", + "flip-vertical": "\u{F10E8}", + "floor-lamp": "\u{F08DD}", + "floor-lamp-dual": "\u{F1040}", + "floor-lamp-dual-outline": "\u{F17CE}", + "floor-lamp-outline": "\u{F17C8}", + "floor-lamp-torchiere": "\u{F1747}", + "floor-lamp-torchiere-outline": "\u{F17D6}", + "floor-lamp-torchiere-variant": "\u{F1041}", + "floor-lamp-torchiere-variant-outline": "\u{F17CF}", + "floor-plan": "\u{F0821}", + "floppy": "\u{F0249}", + "floppy-variant": "\u{F09EF}", + "flower": "\u{F024A}", + "flower-outline": "\u{F09F0}", + "flower-pollen": "\u{F1885}", + "flower-pollen-outline": "\u{F1886}", + "flower-poppy": "\u{F0D08}", + "flower-tulip": "\u{F09F1}", + "flower-tulip-outline": "\u{F09F2}", + "focus-auto": "\u{F0F4E}", + "focus-field": "\u{F0F4F}", + "focus-field-horizontal": "\u{F0F50}", + "focus-field-vertical": "\u{F0F51}", + "folder": "\u{F024B}", + "folder-account": "\u{F024C}", + "folder-account-outline": "\u{F0B9C}", + "folder-alert": "\u{F0DCC}", + "folder-alert-outline": "\u{F0DCD}", + "folder-arrow-down": "\u{F19E8}", + "folder-arrow-down-outline": "\u{F19E9}", + "folder-arrow-left": "\u{F19EA}", + "folder-arrow-left-outline": "\u{F19EB}", + "folder-arrow-left-right": "\u{F19EC}", + "folder-arrow-left-right-outline": "\u{F19ED}", + "folder-arrow-right": "\u{F19EE}", + "folder-arrow-right-outline": "\u{F19EF}", + "folder-arrow-up": "\u{F19F0}", + "folder-arrow-up-down": "\u{F19F1}", + "folder-arrow-up-down-outline": "\u{F19F2}", + "folder-arrow-up-outline": "\u{F19F3}", + "folder-cancel": "\u{F19F4}", + "folder-cancel-outline": "\u{F19F5}", + "folder-check": "\u{F197E}", + "folder-check-outline": "\u{F197F}", + "folder-clock": "\u{F0ABA}", + "folder-clock-outline": "\u{F0ABB}", + "folder-cog": "\u{F107F}", + "folder-cog-outline": "\u{F1080}", + "folder-download": "\u{F024D}", + "folder-download-outline": "\u{F10E9}", + "folder-edit": "\u{F08DE}", + "folder-edit-outline": "\u{F0DCE}", + "folder-eye": "\u{F178A}", + "folder-eye-outline": "\u{F178B}", + "folder-file": "\u{F19F6}", + "folder-file-outline": "\u{F19F7}", + "folder-google-drive": "\u{F024E}", + "folder-heart": "\u{F10EA}", + "folder-heart-outline": "\u{F10EB}", + "folder-hidden": "\u{F179E}", + "folder-home": "\u{F10B5}", + "folder-home-outline": "\u{F10B6}", + "folder-image": "\u{F024F}", + "folder-information": "\u{F10B7}", + "folder-information-outline": "\u{F10B8}", + "folder-key": "\u{F08AC}", + "folder-key-network": "\u{F08AD}", + "folder-key-network-outline": "\u{F0C80}", + "folder-key-outline": "\u{F10EC}", + "folder-lock": "\u{F0250}", + "folder-lock-open": "\u{F0251}", + "folder-lock-open-outline": "\u{F1AA7}", + "folder-lock-outline": "\u{F1AA8}", + "folder-marker": "\u{F126D}", + "folder-marker-outline": "\u{F126E}", + "folder-minus": "\u{F1B49}", + "folder-minus-outline": "\u{F1B4A}", + "folder-move": "\u{F0252}", + "folder-move-outline": "\u{F1246}", + "folder-multiple": "\u{F0253}", + "folder-multiple-image": "\u{F0254}", + "folder-multiple-outline": "\u{F0255}", + "folder-multiple-plus": "\u{F147E}", + "folder-multiple-plus-outline": "\u{F147F}", + "folder-music": "\u{F1359}", + "folder-music-outline": "\u{F135A}", + "folder-network": "\u{F0870}", + "folder-network-outline": "\u{F0C81}", + "folder-off": "\u{F19F8}", + "folder-off-outline": "\u{F19F9}", + "folder-open": "\u{F0770}", + "folder-open-outline": "\u{F0DCF}", + "folder-outline": "\u{F0256}", + "folder-play": "\u{F19FA}", + "folder-play-outline": "\u{F19FB}", + "folder-plus": "\u{F0257}", + "folder-plus-outline": "\u{F0B9D}", + "folder-pound": "\u{F0D09}", + "folder-pound-outline": "\u{F0D0A}", + "folder-question": "\u{F19CA}", + "folder-question-outline": "\u{F19CB}", + "folder-refresh": "\u{F0749}", + "folder-refresh-outline": "\u{F0542}", + "folder-remove": "\u{F0258}", + "folder-remove-outline": "\u{F0B9E}", + "folder-search": "\u{F0968}", + "folder-search-outline": "\u{F0969}", + "folder-settings": "\u{F107D}", + "folder-settings-outline": "\u{F107E}", + "folder-star": "\u{F069D}", + "folder-star-multiple": "\u{F13D3}", + "folder-star-multiple-outline": "\u{F13D4}", + "folder-star-outline": "\u{F0B9F}", + "folder-swap": "\u{F0FB6}", + "folder-swap-outline": "\u{F0FB7}", + "folder-sync": "\u{F0D0B}", + "folder-sync-outline": "\u{F0D0C}", + "folder-table": "\u{F12E3}", + "folder-table-outline": "\u{F12E4}", + "folder-text": "\u{F0C82}", + "folder-text-outline": "\u{F0C83}", + "folder-upload": "\u{F0259}", + "folder-upload-outline": "\u{F10ED}", + "folder-wrench": "\u{F19FC}", + "folder-wrench-outline": "\u{F19FD}", + "folder-zip": "\u{F06EB}", + "folder-zip-outline": "\u{F07B9}", + "font-awesome": "\u{F003A}", + "food": "\u{F025A}", + "food-apple": "\u{F025B}", + "food-apple-outline": "\u{F0C84}", + "food-croissant": "\u{F07C8}", + "food-drumstick": "\u{F141F}", + "food-drumstick-off": "\u{F1468}", + "food-drumstick-off-outline": "\u{F1469}", + "food-drumstick-outline": "\u{F1420}", + "food-fork-drink": "\u{F05F2}", + "food-halal": "\u{F1572}", + "food-hot-dog": "\u{F184B}", + "food-kosher": "\u{F1573}", + "food-off": "\u{F05F3}", + "food-off-outline": "\u{F1915}", + "food-outline": "\u{F1916}", + "food-steak": "\u{F146A}", + "food-steak-off": "\u{F146B}", + "food-takeout-box": "\u{F1836}", + "food-takeout-box-outline": "\u{F1837}", + "food-turkey": "\u{F171C}", + "food-variant": "\u{F025C}", + "food-variant-off": "\u{F13E5}", + "foot-print": "\u{F0F52}", + "football": "\u{F025D}", + "football-australian": "\u{F025E}", + "football-helmet": "\u{F025F}", + "forest": "\u{F1897}", + "forest-outline": "\u{F1C63}", + "forklift": "\u{F07C9}", + "form-dropdown": "\u{F1400}", + "form-select": "\u{F1401}", + "form-textarea": "\u{F1095}", + "form-textbox": "\u{F060E}", + "form-textbox-lock": "\u{F135D}", + "form-textbox-password": "\u{F07F5}", + "format-align-bottom": "\u{F0753}", + "format-align-center": "\u{F0260}", + "format-align-justify": "\u{F0261}", + "format-align-left": "\u{F0262}", + "format-align-middle": "\u{F0754}", + "format-align-right": "\u{F0263}", + "format-align-top": "\u{F0755}", + "format-annotation-minus": "\u{F0ABC}", + "format-annotation-plus": "\u{F0646}", + "format-bold": "\u{F0264}", + "format-clear": "\u{F0265}", + "format-color-fill": "\u{F0266}", + "format-color-highlight": "\u{F0E31}", + "format-color-marker-cancel": "\u{F1313}", + "format-color-text": "\u{F069E}", + "format-columns": "\u{F08DF}", + "format-float-center": "\u{F0267}", + "format-float-left": "\u{F0268}", + "format-float-none": "\u{F0269}", + "format-float-right": "\u{F026A}", + "format-font": "\u{F06D6}", + "format-font-size-decrease": "\u{F09F3}", + "format-font-size-increase": "\u{F09F4}", + "format-header-1": "\u{F026B}", + "format-header-2": "\u{F026C}", + "format-header-3": "\u{F026D}", + "format-header-4": "\u{F026E}", + "format-header-5": "\u{F026F}", + "format-header-6": "\u{F0270}", + "format-header-decrease": "\u{F0271}", + "format-header-equal": "\u{F0272}", + "format-header-increase": "\u{F0273}", + "format-header-pound": "\u{F0274}", + "format-horizontal-align-center": "\u{F061E}", + "format-horizontal-align-left": "\u{F061F}", + "format-horizontal-align-right": "\u{F0620}", + "format-indent-decrease": "\u{F0275}", + "format-indent-increase": "\u{F0276}", + "format-italic": "\u{F0277}", + "format-letter-case": "\u{F0B34}", + "format-letter-case-lower": "\u{F0B35}", + "format-letter-case-upper": "\u{F0B36}", + "format-letter-ends-with": "\u{F0FB8}", + "format-letter-matches": "\u{F0FB9}", + "format-letter-spacing": "\u{F1956}", + "format-letter-spacing-variant": "\u{F1AFB}", + "format-letter-starts-with": "\u{F0FBA}", + "format-line-height": "\u{F1AFC}", + "format-line-spacing": "\u{F0278}", + "format-line-style": "\u{F05C8}", + "format-line-weight": "\u{F05C9}", + "format-list-bulleted": "\u{F0279}", + "format-list-bulleted-square": "\u{F0DD0}", + "format-list-bulleted-triangle": "\u{F0EB2}", + "format-list-bulleted-type": "\u{F027A}", + "format-list-checkbox": "\u{F096A}", + "format-list-checks": "\u{F0756}", + "format-list-group": "\u{F1860}", + "format-list-group-plus": "\u{F1B56}", + "format-list-numbered": "\u{F027B}", + "format-list-numbered-rtl": "\u{F0D0D}", + "format-list-text": "\u{F126F}", + "format-overline": "\u{F0EB3}", + "format-page-break": "\u{F06D7}", + "format-page-split": "\u{F1917}", + "format-paint": "\u{F027C}", + "format-paragraph": "\u{F027D}", + "format-paragraph-spacing": "\u{F1AFD}", + "format-pilcrow": "\u{F06D8}", + "format-pilcrow-arrow-left": "\u{F0286}", + "format-pilcrow-arrow-right": "\u{F0285}", + "format-quote-close": "\u{F027E}", + "format-quote-close-outline": "\u{F11A8}", + "format-quote-open": "\u{F0757}", + "format-quote-open-outline": "\u{F11A7}", + "format-rotate-90": "\u{F06AA}", + "format-section": "\u{F069F}", + "format-size": "\u{F027F}", + "format-strikethrough": "\u{F0280}", + "format-strikethrough-variant": "\u{F0281}", + "format-subscript": "\u{F0282}", + "format-superscript": "\u{F0283}", + "format-text": "\u{F0284}", + "format-text-rotation-angle-down": "\u{F0FBB}", + "format-text-rotation-angle-up": "\u{F0FBC}", + "format-text-rotation-down": "\u{F0D73}", + "format-text-rotation-down-vertical": "\u{F0FBD}", + "format-text-rotation-none": "\u{F0D74}", + "format-text-rotation-up": "\u{F0FBE}", + "format-text-rotation-vertical": "\u{F0FBF}", + "format-text-variant": "\u{F0E32}", + "format-text-variant-outline": "\u{F150F}", + "format-text-wrapping-clip": "\u{F0D0E}", + "format-text-wrapping-overflow": "\u{F0D0F}", + "format-text-wrapping-wrap": "\u{F0D10}", + "format-textbox": "\u{F0D11}", + "format-title": "\u{F05F4}", + "format-underline": "\u{F0287}", + "format-underline-wavy": "\u{F18E9}", + "format-vertical-align-bottom": "\u{F0621}", + "format-vertical-align-center": "\u{F0622}", + "format-vertical-align-top": "\u{F0623}", + "format-wrap-inline": "\u{F0288}", + "format-wrap-square": "\u{F0289}", + "format-wrap-tight": "\u{F028A}", + "format-wrap-top-bottom": "\u{F028B}", + "forum": "\u{F028C}", + "forum-minus": "\u{F1AA9}", + "forum-minus-outline": "\u{F1AAA}", + "forum-outline": "\u{F0822}", + "forum-plus": "\u{F1AAB}", + "forum-plus-outline": "\u{F1AAC}", + "forum-remove": "\u{F1AAD}", + "forum-remove-outline": "\u{F1AAE}", + "forward": "\u{F028D}", + "forwardburger": "\u{F0D75}", + "fountain": "\u{F096B}", + "fountain-pen": "\u{F0D12}", + "fountain-pen-tip": "\u{F0D13}", + "fraction-one-half": "\u{F1992}", + "freebsd": "\u{F08E0}", + "french-fries": "\u{F1957}", + "frequently-asked-questions": "\u{F0EB4}", + "fridge": "\u{F0290}", + "fridge-alert": "\u{F11B1}", + "fridge-alert-outline": "\u{F11B2}", + "fridge-bottom": "\u{F0292}", + "fridge-industrial": "\u{F15EE}", + "fridge-industrial-alert": "\u{F15EF}", + "fridge-industrial-alert-outline": "\u{F15F0}", + "fridge-industrial-off": "\u{F15F1}", + "fridge-industrial-off-outline": "\u{F15F2}", + "fridge-industrial-outline": "\u{F15F3}", + "fridge-off": "\u{F11AF}", + "fridge-off-outline": "\u{F11B0}", + "fridge-outline": "\u{F028F}", + "fridge-top": "\u{F0291}", + "fridge-variant": "\u{F15F4}", + "fridge-variant-alert": "\u{F15F5}", + "fridge-variant-alert-outline": "\u{F15F6}", + "fridge-variant-off": "\u{F15F7}", + "fridge-variant-off-outline": "\u{F15F8}", + "fridge-variant-outline": "\u{F15F9}", + "fruit-cherries": "\u{F1042}", + "fruit-cherries-off": "\u{F13F8}", + "fruit-citrus": "\u{F1043}", + "fruit-citrus-off": "\u{F13F9}", + "fruit-grapes": "\u{F1044}", + "fruit-grapes-outline": "\u{F1045}", + "fruit-pear": "\u{F1A0E}", + "fruit-pineapple": "\u{F1046}", + "fruit-watermelon": "\u{F1047}", + "fuel": "\u{F07CA}", + "fuel-cell": "\u{F18B5}", + "fullscreen": "\u{F0293}", + "fullscreen-exit": "\u{F0294}", + "function": "\u{F0295}", + "function-variant": "\u{F0871}", + "furigana-horizontal": "\u{F1081}", + "furigana-vertical": "\u{F1082}", + "fuse": "\u{F0C85}", + "fuse-alert": "\u{F142D}", + "fuse-blade": "\u{F0C86}", + "fuse-off": "\u{F142C}", + "gamepad": "\u{F0296}", + "gamepad-circle": "\u{F0E33}", + "gamepad-circle-down": "\u{F0E34}", + "gamepad-circle-left": "\u{F0E35}", + "gamepad-circle-outline": "\u{F0E36}", + "gamepad-circle-right": "\u{F0E37}", + "gamepad-circle-up": "\u{F0E38}", + "gamepad-down": "\u{F0E39}", + "gamepad-left": "\u{F0E3A}", + "gamepad-outline": "\u{F1919}", + "gamepad-right": "\u{F0E3B}", + "gamepad-round": "\u{F0E3C}", + "gamepad-round-down": "\u{F0E3D}", + "gamepad-round-left": "\u{F0E3E}", + "gamepad-round-outline": "\u{F0E3F}", + "gamepad-round-right": "\u{F0E40}", + "gamepad-round-up": "\u{F0E41}", + "gamepad-square": "\u{F0EB5}", + "gamepad-square-outline": "\u{F0EB6}", + "gamepad-up": "\u{F0E42}", + "gamepad-variant": "\u{F0297}", + "gamepad-variant-outline": "\u{F0EB7}", + "gamma": "\u{F10EE}", + "gantry-crane": "\u{F0DD1}", + "garage": "\u{F06D9}", + "garage-alert": "\u{F0872}", + "garage-alert-variant": "\u{F12D5}", + "garage-lock": "\u{F17FB}", + "garage-open": "\u{F06DA}", + "garage-open-variant": "\u{F12D4}", + "garage-variant": "\u{F12D3}", + "garage-variant-lock": "\u{F17FC}", + "gas-burner": "\u{F1A1B}", + "gas-cylinder": "\u{F0647}", + "gas-station": "\u{F0298}", + "gas-station-off": "\u{F1409}", + "gas-station-off-outline": "\u{F140A}", + "gas-station-outline": "\u{F0EB8}", + "gate": "\u{F0299}", + "gate-alert": "\u{F17F8}", + "gate-and": "\u{F08E1}", + "gate-arrow-left": "\u{F17F7}", + "gate-arrow-right": "\u{F1169}", + "gate-buffer": "\u{F1AFE}", + "gate-nand": "\u{F08E2}", + "gate-nor": "\u{F08E3}", + "gate-not": "\u{F08E4}", + "gate-open": "\u{F116A}", + "gate-or": "\u{F08E5}", + "gate-xnor": "\u{F08E6}", + "gate-xor": "\u{F08E7}", + "gatsby": "\u{F0E43}", + "gauge": "\u{F029A}", + "gauge-empty": "\u{F0873}", + "gauge-full": "\u{F0874}", + "gauge-low": "\u{F0875}", + "gavel": "\u{F029B}", + "gender-female": "\u{F029C}", + "gender-male": "\u{F029D}", + "gender-male-female": "\u{F029E}", + "gender-male-female-variant": "\u{F113F}", + "gender-non-binary": "\u{F1140}", + "gender-transgender": "\u{F029F}", + "gentoo": "\u{F08E8}", + "gesture": "\u{F07CB}", + "gesture-double-tap": "\u{F073C}", + "gesture-pinch": "\u{F0ABD}", + "gesture-spread": "\u{F0ABE}", + "gesture-swipe": "\u{F0D76}", + "gesture-swipe-down": "\u{F073D}", + "gesture-swipe-horizontal": "\u{F0ABF}", + "gesture-swipe-left": "\u{F073E}", + "gesture-swipe-right": "\u{F073F}", + "gesture-swipe-up": "\u{F0740}", + "gesture-swipe-vertical": "\u{F0AC0}", + "gesture-tap": "\u{F0741}", + "gesture-tap-box": "\u{F12A9}", + "gesture-tap-button": "\u{F12A8}", + "gesture-tap-hold": "\u{F0D77}", + "gesture-two-double-tap": "\u{F0742}", + "gesture-two-tap": "\u{F0743}", + "ghost": "\u{F02A0}", + "ghost-off": "\u{F09F5}", + "ghost-off-outline": "\u{F165C}", + "ghost-outline": "\u{F165D}", + "gift": "\u{F0E44}", + "gift-off": "\u{F16EF}", + "gift-off-outline": "\u{F16F0}", + "gift-open": "\u{F16F1}", + "gift-open-outline": "\u{F16F2}", + "gift-outline": "\u{F02A1}", + "git": "\u{F02A2}", + "github": "\u{F02A4}", + "gitlab": "\u{F0BA0}", + "glass-cocktail": "\u{F0356}", + "glass-cocktail-off": "\u{F15E6}", + "glass-flute": "\u{F02A5}", + "glass-fragile": "\u{F1873}", + "glass-mug": "\u{F02A6}", + "glass-mug-off": "\u{F15E7}", + "glass-mug-variant": "\u{F1116}", + "glass-mug-variant-off": "\u{F15E8}", + "glass-pint-outline": "\u{F130D}", + "glass-stange": "\u{F02A7}", + "glass-tulip": "\u{F02A8}", + "glass-wine": "\u{F0876}", + "glasses": "\u{F02AA}", + "globe-light": "\u{F066F}", + "globe-light-outline": "\u{F12D7}", + "globe-model": "\u{F08E9}", + "gmail": "\u{F02AB}", + "gnome": "\u{F02AC}", + "go-kart": "\u{F0D79}", + "go-kart-track": "\u{F0D7A}", + "gog": "\u{F0BA1}", + "gold": "\u{F124F}", + "golf": "\u{F0823}", + "golf-cart": "\u{F11A4}", + "golf-tee": "\u{F1083}", + "gondola": "\u{F0686}", + "goodreads": "\u{F0D7B}", + "google": "\u{F02AD}", + "google-ads": "\u{F0C87}", + "google-analytics": "\u{F07CC}", + "google-assistant": "\u{F07CD}", + "google-cardboard": "\u{F02AE}", + "google-chrome": "\u{F02AF}", + "google-circles": "\u{F02B0}", + "google-circles-communities": "\u{F02B1}", + "google-circles-extended": "\u{F02B2}", + "google-circles-group": "\u{F02B3}", + "google-classroom": "\u{F02C0}", + "google-cloud": "\u{F11F6}", + "google-downasaur": "\u{F1362}", + "google-drive": "\u{F02B6}", + "google-earth": "\u{F02B7}", + "google-fit": "\u{F096C}", + "google-glass": "\u{F02B8}", + "google-hangouts": "\u{F02C9}", + "google-keep": "\u{F06DC}", + "google-lens": "\u{F09F6}", + "google-maps": "\u{F05F5}", + "google-my-business": "\u{F1048}", + "google-nearby": "\u{F02B9}", + "google-play": "\u{F02BC}", + "google-plus": "\u{F02BD}", + "google-podcast": "\u{F0EB9}", + "google-spreadsheet": "\u{F09F7}", + "google-street-view": "\u{F0C88}", + "google-translate": "\u{F02BF}", + "gradient-horizontal": "\u{F174A}", + "gradient-vertical": "\u{F06A0}", + "grain": "\u{F0D7C}", + "graph": "\u{F1049}", + "graph-outline": "\u{F104A}", + "graphql": "\u{F0877}", + "grass": "\u{F1510}", + "grave-stone": "\u{F0BA2}", + "grease-pencil": "\u{F0648}", + "greater-than": "\u{F096D}", + "greater-than-or-equal": "\u{F096E}", + "greenhouse": "\u{F002D}", + "grid": "\u{F02C1}", + "grid-large": "\u{F0758}", + "grid-off": "\u{F02C2}", + "grill": "\u{F0E45}", + "grill-outline": "\u{F118A}", + "group": "\u{F02C3}", + "guitar-acoustic": "\u{F0771}", + "guitar-electric": "\u{F02C4}", + "guitar-pick": "\u{F02C5}", + "guitar-pick-outline": "\u{F02C6}", + "guy-fawkes-mask": "\u{F0825}", + "gymnastics": "\u{F1A41}", + "hail": "\u{F0AC1}", + "hair-dryer": "\u{F10EF}", + "hair-dryer-outline": "\u{F10F0}", + "halloween": "\u{F0BA3}", + "hamburger": "\u{F0685}", + "hamburger-check": "\u{F1776}", + "hamburger-minus": "\u{F1777}", + "hamburger-off": "\u{F1778}", + "hamburger-plus": "\u{F1779}", + "hamburger-remove": "\u{F177A}", + "hammer": "\u{F08EA}", + "hammer-screwdriver": "\u{F1322}", + "hammer-sickle": "\u{F1887}", + "hammer-wrench": "\u{F1323}", + "hand-back-left": "\u{F0E46}", + "hand-back-left-off": "\u{F1830}", + "hand-back-left-off-outline": "\u{F1832}", + "hand-back-left-outline": "\u{F182C}", + "hand-back-right": "\u{F0E47}", + "hand-back-right-off": "\u{F1831}", + "hand-back-right-off-outline": "\u{F1833}", + "hand-back-right-outline": "\u{F182D}", + "hand-clap": "\u{F194B}", + "hand-clap-off": "\u{F1A42}", + "hand-coin": "\u{F188F}", + "hand-coin-outline": "\u{F1890}", + "hand-cycle": "\u{F1B9C}", + "hand-extended": "\u{F18B6}", + "hand-extended-outline": "\u{F18B7}", + "hand-front-left": "\u{F182B}", + "hand-front-left-outline": "\u{F182E}", + "hand-front-right": "\u{F0A4F}", + "hand-front-right-outline": "\u{F182F}", + "hand-heart": "\u{F10F1}", + "hand-heart-outline": "\u{F157E}", + "hand-okay": "\u{F0A50}", + "hand-peace": "\u{F0A51}", + "hand-peace-variant": "\u{F0A52}", + "hand-pointing-down": "\u{F0A53}", + "hand-pointing-left": "\u{F0A54}", + "hand-pointing-right": "\u{F02C7}", + "hand-pointing-up": "\u{F0A55}", + "hand-saw": "\u{F0E48}", + "hand-wash": "\u{F157F}", + "hand-wash-outline": "\u{F1580}", + "hand-water": "\u{F139F}", + "hand-wave": "\u{F1821}", + "hand-wave-outline": "\u{F1822}", + "handball": "\u{F0F53}", + "handcuffs": "\u{F113E}", + "hands-pray": "\u{F0579}", + "handshake": "\u{F1218}", + "handshake-outline": "\u{F15A1}", + "hanger": "\u{F02C8}", + "hard-hat": "\u{F096F}", + "harddisk": "\u{F02CA}", + "harddisk-plus": "\u{F104B}", + "harddisk-remove": "\u{F104C}", + "hat-fedora": "\u{F0BA4}", + "hazard-lights": "\u{F0C89}", + "hdmi-port": "\u{F1BB8}", + "hdr": "\u{F0D7D}", + "hdr-off": "\u{F0D7E}", + "head": "\u{F135E}", + "head-alert": "\u{F1338}", + "head-alert-outline": "\u{F1339}", + "head-check": "\u{F133A}", + "head-check-outline": "\u{F133B}", + "head-cog": "\u{F133C}", + "head-cog-outline": "\u{F133D}", + "head-dots-horizontal": "\u{F133E}", + "head-dots-horizontal-outline": "\u{F133F}", + "head-flash": "\u{F1340}", + "head-flash-outline": "\u{F1341}", + "head-heart": "\u{F1342}", + "head-heart-outline": "\u{F1343}", + "head-lightbulb": "\u{F1344}", + "head-lightbulb-outline": "\u{F1345}", + "head-minus": "\u{F1346}", + "head-minus-outline": "\u{F1347}", + "head-outline": "\u{F135F}", + "head-plus": "\u{F1348}", + "head-plus-outline": "\u{F1349}", + "head-question": "\u{F134A}", + "head-question-outline": "\u{F134B}", + "head-remove": "\u{F134C}", + "head-remove-outline": "\u{F134D}", + "head-snowflake": "\u{F134E}", + "head-snowflake-outline": "\u{F134F}", + "head-sync": "\u{F1350}", + "head-sync-outline": "\u{F1351}", + "headphones": "\u{F02CB}", + "headphones-bluetooth": "\u{F0970}", + "headphones-box": "\u{F02CC}", + "headphones-off": "\u{F07CE}", + "headphones-settings": "\u{F02CD}", + "headset": "\u{F02CE}", + "headset-dock": "\u{F02CF}", + "headset-off": "\u{F02D0}", + "heart": "\u{F02D1}", + "heart-box": "\u{F02D2}", + "heart-box-outline": "\u{F02D3}", + "heart-broken": "\u{F02D4}", + "heart-broken-outline": "\u{F0D14}", + "heart-circle": "\u{F0971}", + "heart-circle-outline": "\u{F0972}", + "heart-cog": "\u{F1663}", + "heart-cog-outline": "\u{F1664}", + "heart-flash": "\u{F0EF9}", + "heart-half": "\u{F06DF}", + "heart-half-full": "\u{F06DE}", + "heart-half-outline": "\u{F06E0}", + "heart-minus": "\u{F142F}", + "heart-minus-outline": "\u{F1432}", + "heart-multiple": "\u{F0A56}", + "heart-multiple-outline": "\u{F0A57}", + "heart-off": "\u{F0759}", + "heart-off-outline": "\u{F1434}", + "heart-outline": "\u{F02D5}", + "heart-plus": "\u{F142E}", + "heart-plus-outline": "\u{F1431}", + "heart-pulse": "\u{F05F6}", + "heart-remove": "\u{F1430}", + "heart-remove-outline": "\u{F1433}", + "heart-settings": "\u{F1665}", + "heart-settings-outline": "\u{F1666}", + "heat-pump": "\u{F1A43}", + "heat-pump-outline": "\u{F1A44}", + "heat-wave": "\u{F1A45}", + "heating-coil": "\u{F1AAF}", + "helicopter": "\u{F0AC2}", + "help": "\u{F02D6}", + "help-box": "\u{F078B}", + "help-box-multiple": "\u{F1C0A}", + "help-box-multiple-outline": "\u{F1C0B}", + "help-box-outline": "\u{F1C0C}", + "help-circle": "\u{F02D7}", + "help-circle-outline": "\u{F0625}", + "help-network": "\u{F06F5}", + "help-network-outline": "\u{F0C8A}", + "help-rhombus": "\u{F0BA5}", + "help-rhombus-outline": "\u{F0BA6}", + "hexadecimal": "\u{F12A7}", + "hexagon": "\u{F02D8}", + "hexagon-multiple": "\u{F06E1}", + "hexagon-multiple-outline": "\u{F10F2}", + "hexagon-outline": "\u{F02D9}", + "hexagon-slice-1": "\u{F0AC3}", + "hexagon-slice-2": "\u{F0AC4}", + "hexagon-slice-3": "\u{F0AC5}", + "hexagon-slice-4": "\u{F0AC6}", + "hexagon-slice-5": "\u{F0AC7}", + "hexagon-slice-6": "\u{F0AC8}", + "hexagram": "\u{F0AC9}", + "hexagram-outline": "\u{F0ACA}", + "high-definition": "\u{F07CF}", + "high-definition-box": "\u{F0878}", + "highway": "\u{F05F7}", + "hiking": "\u{F0D7F}", + "history": "\u{F02DA}", + "hockey-puck": "\u{F0879}", + "hockey-sticks": "\u{F087A}", + "hololens": "\u{F02DB}", + "home": "\u{F02DC}", + "home-account": "\u{F0826}", + "home-alert": "\u{F087B}", + "home-alert-outline": "\u{F15D0}", + "home-analytics": "\u{F0EBA}", + "home-assistant": "\u{F07D0}", + "home-automation": "\u{F07D1}", + "home-battery": "\u{F1901}", + "home-battery-outline": "\u{F1902}", + "home-circle": "\u{F07D2}", + "home-circle-outline": "\u{F104D}", + "home-city": "\u{F0D15}", + "home-city-outline": "\u{F0D16}", + "home-clock": "\u{F1A12}", + "home-clock-outline": "\u{F1A13}", + "home-edit": "\u{F1159}", + "home-edit-outline": "\u{F115A}", + "home-export-outline": "\u{F0F9B}", + "home-flood": "\u{F0EFA}", + "home-floor-0": "\u{F0DD2}", + "home-floor-1": "\u{F0D80}", + "home-floor-2": "\u{F0D81}", + "home-floor-3": "\u{F0D82}", + "home-floor-a": "\u{F0D83}", + "home-floor-b": "\u{F0D84}", + "home-floor-g": "\u{F0D85}", + "home-floor-l": "\u{F0D86}", + "home-floor-negative-1": "\u{F0DD3}", + "home-group": "\u{F0DD4}", + "home-group-minus": "\u{F19C1}", + "home-group-plus": "\u{F19C0}", + "home-group-remove": "\u{F19C2}", + "home-heart": "\u{F0827}", + "home-import-outline": "\u{F0F9C}", + "home-lightbulb": "\u{F1251}", + "home-lightbulb-outline": "\u{F1252}", + "home-lightning-bolt": "\u{F1903}", + "home-lightning-bolt-outline": "\u{F1904}", + "home-lock": "\u{F08EB}", + "home-lock-open": "\u{F08EC}", + "home-map-marker": "\u{F05F8}", + "home-minus": "\u{F0974}", + "home-minus-outline": "\u{F13D5}", + "home-modern": "\u{F02DD}", + "home-off": "\u{F1A46}", + "home-off-outline": "\u{F1A47}", + "home-outline": "\u{F06A1}", + "home-percent": "\u{F1C7C}", + "home-percent-outline": "\u{F1C7D}", + "home-plus": "\u{F0975}", + "home-plus-outline": "\u{F13D6}", + "home-remove": "\u{F1247}", + "home-remove-outline": "\u{F13D7}", + "home-roof": "\u{F112B}", + "home-search": "\u{F13B0}", + "home-search-outline": "\u{F13B1}", + "home-silo": "\u{F1BA0}", + "home-silo-outline": "\u{F1BA1}", + "home-sound-in": "\u{F1C2F}", + "home-sound-in-outline": "\u{F1C30}", + "home-sound-out": "\u{F1C31}", + "home-sound-out-outline": "\u{F1C32}", + "home-switch": "\u{F1794}", + "home-switch-outline": "\u{F1795}", + "home-thermometer": "\u{F0F54}", + "home-thermometer-outline": "\u{F0F55}", + "home-variant": "\u{F02DE}", + "home-variant-outline": "\u{F0BA7}", + "hook": "\u{F06E2}", + "hook-off": "\u{F06E3}", + "hoop-house": "\u{F0E56}", + "hops": "\u{F02DF}", + "horizontal-rotate-clockwise": "\u{F10F3}", + "horizontal-rotate-counterclockwise": "\u{F10F4}", + "horse": "\u{F15BF}", + "horse-human": "\u{F15C0}", + "horse-variant": "\u{F15C1}", + "horse-variant-fast": "\u{F186E}", + "horseshoe": "\u{F0A58}", + "hospital": "\u{F0FF6}", + "hospital-box": "\u{F02E0}", + "hospital-box-outline": "\u{F0FF7}", + "hospital-building": "\u{F02E1}", + "hospital-marker": "\u{F02E2}", + "hot-tub": "\u{F0828}", + "hours-24": "\u{F1478}", + "hubspot": "\u{F0D17}", + "hulu": "\u{F0829}", + "human": "\u{F02E6}", + "human-baby-changing-table": "\u{F138B}", + "human-cane": "\u{F1581}", + "human-capacity-decrease": "\u{F159B}", + "human-capacity-increase": "\u{F159C}", + "human-child": "\u{F02E7}", + "human-dolly": "\u{F1980}", + "human-edit": "\u{F14E8}", + "human-female": "\u{F0649}", + "human-female-boy": "\u{F0A59}", + "human-female-dance": "\u{F15C9}", + "human-female-female": "\u{F0A5A}", + "human-female-girl": "\u{F0A5B}", + "human-greeting": "\u{F17C4}", + "human-greeting-proximity": "\u{F159D}", + "human-greeting-variant": "\u{F064A}", + "human-handsdown": "\u{F064B}", + "human-handsup": "\u{F064C}", + "human-male": "\u{F064D}", + "human-male-board": "\u{F0890}", + "human-male-board-poll": "\u{F0846}", + "human-male-boy": "\u{F0A5C}", + "human-male-child": "\u{F138C}", + "human-male-female": "\u{F02E8}", + "human-male-female-child": "\u{F1823}", + "human-male-girl": "\u{F0A5D}", + "human-male-height": "\u{F0EFB}", + "human-male-height-variant": "\u{F0EFC}", + "human-male-male": "\u{F0A5E}", + "human-non-binary": "\u{F1848}", + "human-pregnant": "\u{F05CF}", + "human-queue": "\u{F1571}", + "human-scooter": "\u{F11E9}", + "human-walker": "\u{F1B71}", + "human-wheelchair": "\u{F138D}", + "human-white-cane": "\u{F1981}", + "humble-bundle": "\u{F0744}", + "hvac": "\u{F1352}", + "hvac-off": "\u{F159E}", + "hydraulic-oil-level": "\u{F1324}", + "hydraulic-oil-temperature": "\u{F1325}", + "hydro-power": "\u{F12E5}", + "hydrogen-station": "\u{F1894}", + "ice-cream": "\u{F082A}", + "ice-cream-off": "\u{F0E52}", + "ice-pop": "\u{F0EFD}", + "id-card": "\u{F0FC0}", + "identifier": "\u{F0EFE}", + "ideogram-cjk": "\u{F1331}", + "ideogram-cjk-variant": "\u{F1332}", + "image": "\u{F02E9}", + "image-album": "\u{F02EA}", + "image-area": "\u{F02EB}", + "image-area-close": "\u{F02EC}", + "image-auto-adjust": "\u{F0FC1}", + "image-broken": "\u{F02ED}", + "image-broken-variant": "\u{F02EE}", + "image-check": "\u{F1B25}", + "image-check-outline": "\u{F1B26}", + "image-edit": "\u{F11E3}", + "image-edit-outline": "\u{F11E4}", + "image-filter-black-white": "\u{F02F0}", + "image-filter-center-focus": "\u{F02F1}", + "image-filter-center-focus-strong": "\u{F0EFF}", + "image-filter-center-focus-strong-outline": "\u{F0F00}", + "image-filter-center-focus-weak": "\u{F02F2}", + "image-filter-drama": "\u{F02F3}", + "image-filter-drama-outline": "\u{F1BFF}", + "image-filter-frames": "\u{F02F4}", + "image-filter-hdr": "\u{F02F5}", + "image-filter-hdr-outline": "\u{F1C64}", + "image-filter-none": "\u{F02F6}", + "image-filter-tilt-shift": "\u{F02F7}", + "image-filter-vintage": "\u{F02F8}", + "image-frame": "\u{F0E49}", + "image-lock": "\u{F1AB0}", + "image-lock-outline": "\u{F1AB1}", + "image-marker": "\u{F177B}", + "image-marker-outline": "\u{F177C}", + "image-minus": "\u{F1419}", + "image-minus-outline": "\u{F1B47}", + "image-move": "\u{F09F8}", + "image-multiple": "\u{F02F9}", + "image-multiple-outline": "\u{F02EF}", + "image-off": "\u{F082B}", + "image-off-outline": "\u{F11D1}", + "image-outline": "\u{F0976}", + "image-plus": "\u{F087C}", + "image-plus-outline": "\u{F1B46}", + "image-refresh": "\u{F19FE}", + "image-refresh-outline": "\u{F19FF}", + "image-remove": "\u{F1418}", + "image-remove-outline": "\u{F1B48}", + "image-search": "\u{F0977}", + "image-search-outline": "\u{F0978}", + "image-size-select-actual": "\u{F0C8D}", + "image-size-select-large": "\u{F0C8E}", + "image-size-select-small": "\u{F0C8F}", + "image-sync": "\u{F1A00}", + "image-sync-outline": "\u{F1A01}", + "image-text": "\u{F160D}", + "import": "\u{F02FA}", + "inbox": "\u{F0687}", + "inbox-arrow-down": "\u{F02FB}", + "inbox-arrow-down-outline": "\u{F1270}", + "inbox-arrow-up": "\u{F03D1}", + "inbox-arrow-up-outline": "\u{F1271}", + "inbox-full": "\u{F1272}", + "inbox-full-outline": "\u{F1273}", + "inbox-multiple": "\u{F08B0}", + "inbox-multiple-outline": "\u{F0BA8}", + "inbox-outline": "\u{F1274}", + "inbox-remove": "\u{F159F}", + "inbox-remove-outline": "\u{F15A0}", + "incognito": "\u{F05F9}", + "incognito-circle": "\u{F1421}", + "incognito-circle-off": "\u{F1422}", + "incognito-off": "\u{F0075}", + "induction": "\u{F184C}", + "infinity": "\u{F06E4}", + "information": "\u{F02FC}", + "information-box": "\u{F1C65}", + "information-box-outline": "\u{F1C66}", + "information-off": "\u{F178C}", + "information-off-outline": "\u{F178D}", + "information-outline": "\u{F02FD}", + "information-slab-box": "\u{F1C67}", + "information-slab-box-outline": "\u{F1C68}", + "information-slab-circle": "\u{F1C69}", + "information-slab-circle-outline": "\u{F1C6A}", + "information-slab-symbol": "\u{F1C6B}", + "information-symbol": "\u{F1C6C}", + "information-variant": "\u{F064E}", + "information-variant-box": "\u{F1C6D}", + "information-variant-box-outline": "\u{F1C6E}", + "information-variant-circle": "\u{F1C6F}", + "information-variant-circle-outline": "\u{F1C70}", + "instagram": "\u{F02FE}", + "instrument-triangle": "\u{F104E}", + "integrated-circuit-chip": "\u{F1913}", + "invert-colors": "\u{F0301}", + "invert-colors-off": "\u{F0E4A}", + "iobroker": "\u{F12E8}", + "ip": "\u{F0A5F}", + "ip-network": "\u{F0A60}", + "ip-network-outline": "\u{F0C90}", + "ip-outline": "\u{F1982}", + "ipod": "\u{F0C91}", + "iron": "\u{F1824}", + "iron-board": "\u{F1838}", + "iron-outline": "\u{F1825}", + "island": "\u{F104F}", + "iv-bag": "\u{F10B9}", + "jabber": "\u{F0DD5}", + "jeepney": "\u{F0302}", + "jellyfish": "\u{F0F01}", + "jellyfish-outline": "\u{F0F02}", + "jira": "\u{F0303}", + "jquery": "\u{F087D}", + "jsfiddle": "\u{F0304}", + "jump-rope": "\u{F12FF}", + "kabaddi": "\u{F0D87}", + "kangaroo": "\u{F1558}", + "karate": "\u{F082C}", + "kayaking": "\u{F08AF}", + "keg": "\u{F0305}", + "kettle": "\u{F05FA}", + "kettle-alert": "\u{F1317}", + "kettle-alert-outline": "\u{F1318}", + "kettle-off": "\u{F131B}", + "kettle-off-outline": "\u{F131C}", + "kettle-outline": "\u{F0F56}", + "kettle-pour-over": "\u{F173C}", + "kettle-steam": "\u{F1319}", + "kettle-steam-outline": "\u{F131A}", + "kettlebell": "\u{F1300}", + "key": "\u{F0306}", + "key-alert": "\u{F1983}", + "key-alert-outline": "\u{F1984}", + "key-arrow-right": "\u{F1312}", + "key-chain": "\u{F1574}", + "key-chain-variant": "\u{F1575}", + "key-change": "\u{F0307}", + "key-link": "\u{F119F}", + "key-minus": "\u{F0308}", + "key-outline": "\u{F0DD6}", + "key-plus": "\u{F0309}", + "key-remove": "\u{F030A}", + "key-star": "\u{F119E}", + "key-variant": "\u{F030B}", + "key-wireless": "\u{F0FC2}", + "keyboard": "\u{F030C}", + "keyboard-backspace": "\u{F030D}", + "keyboard-caps": "\u{F030E}", + "keyboard-close": "\u{F030F}", + "keyboard-close-outline": "\u{F1C00}", + "keyboard-esc": "\u{F12B7}", + "keyboard-f1": "\u{F12AB}", + "keyboard-f10": "\u{F12B4}", + "keyboard-f11": "\u{F12B5}", + "keyboard-f12": "\u{F12B6}", + "keyboard-f2": "\u{F12AC}", + "keyboard-f3": "\u{F12AD}", + "keyboard-f4": "\u{F12AE}", + "keyboard-f5": "\u{F12AF}", + "keyboard-f6": "\u{F12B0}", + "keyboard-f7": "\u{F12B1}", + "keyboard-f8": "\u{F12B2}", + "keyboard-f9": "\u{F12B3}", + "keyboard-off": "\u{F0310}", + "keyboard-off-outline": "\u{F0E4B}", + "keyboard-outline": "\u{F097B}", + "keyboard-return": "\u{F0311}", + "keyboard-settings": "\u{F09F9}", + "keyboard-settings-outline": "\u{F09FA}", + "keyboard-space": "\u{F1050}", + "keyboard-tab": "\u{F0312}", + "keyboard-tab-reverse": "\u{F0325}", + "keyboard-variant": "\u{F0313}", + "khanda": "\u{F10FD}", + "kickstarter": "\u{F0745}", + "kite": "\u{F1985}", + "kite-outline": "\u{F1986}", + "kitesurfing": "\u{F1744}", + "klingon": "\u{F135B}", + "knife": "\u{F09FB}", + "knife-military": "\u{F09FC}", + "knob": "\u{F1B96}", + "koala": "\u{F173F}", + "kodi": "\u{F0314}", + "kubernetes": "\u{F10FE}", + "label": "\u{F0315}", + "label-multiple": "\u{F1375}", + "label-multiple-outline": "\u{F1376}", + "label-off": "\u{F0ACB}", + "label-off-outline": "\u{F0ACC}", + "label-outline": "\u{F0316}", + "label-percent": "\u{F12EA}", + "label-percent-outline": "\u{F12EB}", + "label-variant": "\u{F0ACD}", + "label-variant-outline": "\u{F0ACE}", + "ladder": "\u{F15A2}", + "ladybug": "\u{F082D}", + "lambda": "\u{F0627}", + "lamp": "\u{F06B5}", + "lamp-outline": "\u{F17D0}", + "lamps": "\u{F1576}", + "lamps-outline": "\u{F17D1}", + "lan": "\u{F0317}", + "lan-check": "\u{F12AA}", + "lan-connect": "\u{F0318}", + "lan-disconnect": "\u{F0319}", + "lan-pending": "\u{F031A}", + "land-fields": "\u{F1AB2}", + "land-plots": "\u{F1AB3}", + "land-plots-circle": "\u{F1AB4}", + "land-plots-circle-variant": "\u{F1AB5}", + "land-plots-marker": "\u{F1C5D}", + "land-rows-horizontal": "\u{F1AB6}", + "land-rows-vertical": "\u{F1AB7}", + "landslide": "\u{F1A48}", + "landslide-outline": "\u{F1A49}", + "language-c": "\u{F0671}", + "language-cpp": "\u{F0672}", + "language-csharp": "\u{F031B}", + "language-css3": "\u{F031C}", + "language-fortran": "\u{F121A}", + "language-go": "\u{F07D3}", + "language-haskell": "\u{F0C92}", + "language-html5": "\u{F031D}", + "language-java": "\u{F0B37}", + "language-javascript": "\u{F031E}", + "language-kotlin": "\u{F1219}", + "language-lua": "\u{F08B1}", + "language-markdown": "\u{F0354}", + "language-markdown-outline": "\u{F0F5B}", + "language-php": "\u{F031F}", + "language-python": "\u{F0320}", + "language-r": "\u{F07D4}", + "language-ruby": "\u{F0D2D}", + "language-ruby-on-rails": "\u{F0ACF}", + "language-rust": "\u{F1617}", + "language-swift": "\u{F06E5}", + "language-typescript": "\u{F06E6}", + "language-xaml": "\u{F0673}", + "laptop": "\u{F0322}", + "laptop-account": "\u{F1A4A}", + "laptop-off": "\u{F06E7}", + "laravel": "\u{F0AD0}", + "laser-pointer": "\u{F1484}", + "lasso": "\u{F0F03}", + "lastpass": "\u{F0446}", + "latitude": "\u{F0F57}", + "launch": "\u{F0327}", + "lava-lamp": "\u{F07D5}", + "layers": "\u{F0328}", + "layers-edit": "\u{F1892}", + "layers-minus": "\u{F0E4C}", + "layers-off": "\u{F0329}", + "layers-off-outline": "\u{F09FD}", + "layers-outline": "\u{F09FE}", + "layers-plus": "\u{F0E4D}", + "layers-remove": "\u{F0E4E}", + "layers-search": "\u{F1206}", + "layers-search-outline": "\u{F1207}", + "layers-triple": "\u{F0F58}", + "layers-triple-outline": "\u{F0F59}", + "lead-pencil": "\u{F064F}", + "leaf": "\u{F032A}", + "leaf-circle": "\u{F1905}", + "leaf-circle-outline": "\u{F1906}", + "leaf-maple": "\u{F0C93}", + "leaf-maple-off": "\u{F12DA}", + "leaf-off": "\u{F12D9}", + "leak": "\u{F0DD7}", + "leak-off": "\u{F0DD8}", + "lectern": "\u{F1AF0}", + "led-off": "\u{F032B}", + "led-on": "\u{F032C}", + "led-outline": "\u{F032D}", + "led-strip": "\u{F07D6}", + "led-strip-variant": "\u{F1051}", + "led-strip-variant-off": "\u{F1A4B}", + "led-variant-off": "\u{F032E}", + "led-variant-on": "\u{F032F}", + "led-variant-outline": "\u{F0330}", + "leek": "\u{F117D}", + "less-than": "\u{F097C}", + "less-than-or-equal": "\u{F097D}", + "library": "\u{F0331}", + "library-outline": "\u{F1A22}", + "library-shelves": "\u{F0BA9}", + "license": "\u{F0FC3}", + "lifebuoy": "\u{F087E}", + "light-flood-down": "\u{F1987}", + "light-flood-up": "\u{F1988}", + "light-recessed": "\u{F179B}", + "light-switch": "\u{F097E}", + "light-switch-off": "\u{F1A24}", + "lightbulb": "\u{F0335}", + "lightbulb-alert": "\u{F19E1}", + "lightbulb-alert-outline": "\u{F19E2}", + "lightbulb-auto": "\u{F1800}", + "lightbulb-auto-outline": "\u{F1801}", + "lightbulb-cfl": "\u{F1208}", + "lightbulb-cfl-off": "\u{F1209}", + "lightbulb-cfl-spiral": "\u{F1275}", + "lightbulb-cfl-spiral-off": "\u{F12C3}", + "lightbulb-fluorescent-tube": "\u{F1804}", + "lightbulb-fluorescent-tube-outline": "\u{F1805}", + "lightbulb-group": "\u{F1253}", + "lightbulb-group-off": "\u{F12CD}", + "lightbulb-group-off-outline": "\u{F12CE}", + "lightbulb-group-outline": "\u{F1254}", + "lightbulb-multiple": "\u{F1255}", + "lightbulb-multiple-off": "\u{F12CF}", + "lightbulb-multiple-off-outline": "\u{F12D0}", + "lightbulb-multiple-outline": "\u{F1256}", + "lightbulb-night": "\u{F1A4C}", + "lightbulb-night-outline": "\u{F1A4D}", + "lightbulb-off": "\u{F0E4F}", + "lightbulb-off-outline": "\u{F0E50}", + "lightbulb-on": "\u{F06E8}", + "lightbulb-on-10": "\u{F1A4E}", + "lightbulb-on-20": "\u{F1A4F}", + "lightbulb-on-30": "\u{F1A50}", + "lightbulb-on-40": "\u{F1A51}", + "lightbulb-on-50": "\u{F1A52}", + "lightbulb-on-60": "\u{F1A53}", + "lightbulb-on-70": "\u{F1A54}", + "lightbulb-on-80": "\u{F1A55}", + "lightbulb-on-90": "\u{F1A56}", + "lightbulb-on-outline": "\u{F06E9}", + "lightbulb-outline": "\u{F0336}", + "lightbulb-question": "\u{F19E3}", + "lightbulb-question-outline": "\u{F19E4}", + "lightbulb-spot": "\u{F17F4}", + "lightbulb-spot-off": "\u{F17F5}", + "lightbulb-variant": "\u{F1802}", + "lightbulb-variant-outline": "\u{F1803}", + "lighthouse": "\u{F09FF}", + "lighthouse-on": "\u{F0A00}", + "lightning-bolt": "\u{F140B}", + "lightning-bolt-circle": "\u{F0820}", + "lightning-bolt-outline": "\u{F140C}", + "line-scan": "\u{F0624}", + "lingerie": "\u{F1476}", + "link": "\u{F0337}", + "link-box": "\u{F0D1A}", + "link-box-outline": "\u{F0D1B}", + "link-box-variant": "\u{F0D1C}", + "link-box-variant-outline": "\u{F0D1D}", + "link-lock": "\u{F10BA}", + "link-off": "\u{F0338}", + "link-plus": "\u{F0C94}", + "link-variant": "\u{F0339}", + "link-variant-minus": "\u{F10FF}", + "link-variant-off": "\u{F033A}", + "link-variant-plus": "\u{F1100}", + "link-variant-remove": "\u{F1101}", + "linkedin": "\u{F033B}", + "linux": "\u{F033D}", + "linux-mint": "\u{F08ED}", + "lipstick": "\u{F13B5}", + "liquid-spot": "\u{F1826}", + "liquor": "\u{F191E}", + "list-box": "\u{F1B7B}", + "list-box-outline": "\u{F1B7C}", + "list-status": "\u{F15AB}", + "litecoin": "\u{F0A61}", + "loading": "\u{F0772}", + "location-enter": "\u{F0FC4}", + "location-exit": "\u{F0FC5}", + "lock": "\u{F033E}", + "lock-alert": "\u{F08EE}", + "lock-alert-outline": "\u{F15D1}", + "lock-check": "\u{F139A}", + "lock-check-outline": "\u{F16A8}", + "lock-clock": "\u{F097F}", + "lock-minus": "\u{F16A9}", + "lock-minus-outline": "\u{F16AA}", + "lock-off": "\u{F1671}", + "lock-off-outline": "\u{F1672}", + "lock-open": "\u{F033F}", + "lock-open-alert": "\u{F139B}", + "lock-open-alert-outline": "\u{F15D2}", + "lock-open-check": "\u{F139C}", + "lock-open-check-outline": "\u{F16AB}", + "lock-open-minus": "\u{F16AC}", + "lock-open-minus-outline": "\u{F16AD}", + "lock-open-outline": "\u{F0340}", + "lock-open-plus": "\u{F16AE}", + "lock-open-plus-outline": "\u{F16AF}", + "lock-open-remove": "\u{F16B0}", + "lock-open-remove-outline": "\u{F16B1}", + "lock-open-variant": "\u{F0FC6}", + "lock-open-variant-outline": "\u{F0FC7}", + "lock-outline": "\u{F0341}", + "lock-pattern": "\u{F06EA}", + "lock-percent": "\u{F1C12}", + "lock-percent-open": "\u{F1C13}", + "lock-percent-open-outline": "\u{F1C14}", + "lock-percent-open-variant": "\u{F1C15}", + "lock-percent-open-variant-outline": "\u{F1C16}", + "lock-percent-outline": "\u{F1C17}", + "lock-plus": "\u{F05FB}", + "lock-plus-outline": "\u{F16B2}", + "lock-question": "\u{F08EF}", + "lock-remove": "\u{F16B3}", + "lock-remove-outline": "\u{F16B4}", + "lock-reset": "\u{F0773}", + "lock-smart": "\u{F08B2}", + "locker": "\u{F07D7}", + "locker-multiple": "\u{F07D8}", + "login": "\u{F0342}", + "login-variant": "\u{F05FC}", + "logout": "\u{F0343}", + "logout-variant": "\u{F05FD}", + "longitude": "\u{F0F5A}", + "looks": "\u{F0344}", + "lotion": "\u{F1582}", + "lotion-outline": "\u{F1583}", + "lotion-plus": "\u{F1584}", + "lotion-plus-outline": "\u{F1585}", + "loupe": "\u{F0345}", + "lumx": "\u{F0346}", + "lungs": "\u{F1084}", + "mace": "\u{F1843}", + "magazine-pistol": "\u{F0324}", + "magazine-rifle": "\u{F0323}", + "magic-staff": "\u{F1844}", + "magnet": "\u{F0347}", + "magnet-on": "\u{F0348}", + "magnify": "\u{F0349}", + "magnify-close": "\u{F0980}", + "magnify-expand": "\u{F1874}", + "magnify-minus": "\u{F034A}", + "magnify-minus-cursor": "\u{F0A62}", + "magnify-minus-outline": "\u{F06EC}", + "magnify-plus": "\u{F034B}", + "magnify-plus-cursor": "\u{F0A63}", + "magnify-plus-outline": "\u{F06ED}", + "magnify-remove-cursor": "\u{F120C}", + "magnify-remove-outline": "\u{F120D}", + "magnify-scan": "\u{F1276}", + "mail": "\u{F0EBB}", + "mailbox": "\u{F06EE}", + "mailbox-open": "\u{F0D88}", + "mailbox-open-outline": "\u{F0D89}", + "mailbox-open-up": "\u{F0D8A}", + "mailbox-open-up-outline": "\u{F0D8B}", + "mailbox-outline": "\u{F0D8C}", + "mailbox-up": "\u{F0D8D}", + "mailbox-up-outline": "\u{F0D8E}", + "manjaro": "\u{F160A}", + "map": "\u{F034D}", + "map-check": "\u{F0EBC}", + "map-check-outline": "\u{F0EBD}", + "map-clock": "\u{F0D1E}", + "map-clock-outline": "\u{F0D1F}", + "map-legend": "\u{F0A01}", + "map-marker": "\u{F034E}", + "map-marker-account": "\u{F18E3}", + "map-marker-account-outline": "\u{F18E4}", + "map-marker-alert": "\u{F0F05}", + "map-marker-alert-outline": "\u{F0F06}", + "map-marker-check": "\u{F0C95}", + "map-marker-check-outline": "\u{F12FB}", + "map-marker-circle": "\u{F034F}", + "map-marker-distance": "\u{F08F0}", + "map-marker-down": "\u{F1102}", + "map-marker-left": "\u{F12DB}", + "map-marker-left-outline": "\u{F12DD}", + "map-marker-minus": "\u{F0650}", + "map-marker-minus-outline": "\u{F12F9}", + "map-marker-multiple": "\u{F0350}", + "map-marker-multiple-outline": "\u{F1277}", + "map-marker-off": "\u{F0351}", + "map-marker-off-outline": "\u{F12FD}", + "map-marker-outline": "\u{F07D9}", + "map-marker-path": "\u{F0D20}", + "map-marker-plus": "\u{F0651}", + "map-marker-plus-outline": "\u{F12F8}", + "map-marker-question": "\u{F0F07}", + "map-marker-question-outline": "\u{F0F08}", + "map-marker-radius": "\u{F0352}", + "map-marker-radius-outline": "\u{F12FC}", + "map-marker-remove": "\u{F0F09}", + "map-marker-remove-outline": "\u{F12FA}", + "map-marker-remove-variant": "\u{F0F0A}", + "map-marker-right": "\u{F12DC}", + "map-marker-right-outline": "\u{F12DE}", + "map-marker-star": "\u{F1608}", + "map-marker-star-outline": "\u{F1609}", + "map-marker-up": "\u{F1103}", + "map-minus": "\u{F0981}", + "map-outline": "\u{F0982}", + "map-plus": "\u{F0983}", + "map-search": "\u{F0984}", + "map-search-outline": "\u{F0985}", + "mapbox": "\u{F0BAA}", + "margin": "\u{F0353}", + "marker": "\u{F0652}", + "marker-cancel": "\u{F0DD9}", + "marker-check": "\u{F0355}", + "mastodon": "\u{F0AD1}", + "material-design": "\u{F0986}", + "material-ui": "\u{F0357}", + "math-compass": "\u{F0358}", + "math-cos": "\u{F0C96}", + "math-integral": "\u{F0FC8}", + "math-integral-box": "\u{F0FC9}", + "math-log": "\u{F1085}", + "math-norm": "\u{F0FCA}", + "math-norm-box": "\u{F0FCB}", + "math-sin": "\u{F0C97}", + "math-tan": "\u{F0C98}", + "matrix": "\u{F0628}", + "medal": "\u{F0987}", + "medal-outline": "\u{F1326}", + "medical-bag": "\u{F06EF}", + "medical-cotton-swab": "\u{F1AB8}", + "medication": "\u{F1B14}", + "medication-outline": "\u{F1B15}", + "meditation": "\u{F117B}", + "memory": "\u{F035B}", + "menorah": "\u{F17D4}", + "menorah-fire": "\u{F17D5}", + "menu": "\u{F035C}", + "menu-down": "\u{F035D}", + "menu-down-outline": "\u{F06B6}", + "menu-left": "\u{F035E}", + "menu-left-outline": "\u{F0A02}", + "menu-open": "\u{F0BAB}", + "menu-right": "\u{F035F}", + "menu-right-outline": "\u{F0A03}", + "menu-swap": "\u{F0A64}", + "menu-swap-outline": "\u{F0A65}", + "menu-up": "\u{F0360}", + "menu-up-outline": "\u{F06B7}", + "merge": "\u{F0F5C}", + "message": "\u{F0361}", + "message-alert": "\u{F0362}", + "message-alert-outline": "\u{F0A04}", + "message-arrow-left": "\u{F12F2}", + "message-arrow-left-outline": "\u{F12F3}", + "message-arrow-right": "\u{F12F4}", + "message-arrow-right-outline": "\u{F12F5}", + "message-badge": "\u{F1941}", + "message-badge-outline": "\u{F1942}", + "message-bookmark": "\u{F15AC}", + "message-bookmark-outline": "\u{F15AD}", + "message-bulleted": "\u{F06A2}", + "message-bulleted-off": "\u{F06A3}", + "message-check": "\u{F1B8A}", + "message-check-outline": "\u{F1B8B}", + "message-cog": "\u{F06F1}", + "message-cog-outline": "\u{F1172}", + "message-draw": "\u{F0363}", + "message-fast": "\u{F19CC}", + "message-fast-outline": "\u{F19CD}", + "message-flash": "\u{F15A9}", + "message-flash-outline": "\u{F15AA}", + "message-image": "\u{F0364}", + "message-image-outline": "\u{F116C}", + "message-lock": "\u{F0FCC}", + "message-lock-outline": "\u{F116D}", + "message-minus": "\u{F116E}", + "message-minus-outline": "\u{F116F}", + "message-off": "\u{F164D}", + "message-off-outline": "\u{F164E}", + "message-outline": "\u{F0365}", + "message-plus": "\u{F0653}", + "message-plus-outline": "\u{F10BB}", + "message-processing": "\u{F0366}", + "message-processing-outline": "\u{F1170}", + "message-question": "\u{F173A}", + "message-question-outline": "\u{F173B}", + "message-reply": "\u{F0367}", + "message-reply-outline": "\u{F173D}", + "message-reply-text": "\u{F0368}", + "message-reply-text-outline": "\u{F173E}", + "message-settings": "\u{F06F0}", + "message-settings-outline": "\u{F1171}", + "message-star": "\u{F069A}", + "message-star-outline": "\u{F1250}", + "message-text": "\u{F0369}", + "message-text-clock": "\u{F1173}", + "message-text-clock-outline": "\u{F1174}", + "message-text-fast": "\u{F19CE}", + "message-text-fast-outline": "\u{F19CF}", + "message-text-lock": "\u{F0FCD}", + "message-text-lock-outline": "\u{F1175}", + "message-text-outline": "\u{F036A}", + "message-video": "\u{F036B}", + "meteor": "\u{F0629}", + "meter-electric": "\u{F1A57}", + "meter-electric-outline": "\u{F1A58}", + "meter-gas": "\u{F1A59}", + "meter-gas-outline": "\u{F1A5A}", + "metronome": "\u{F07DA}", + "metronome-tick": "\u{F07DB}", + "micro-sd": "\u{F07DC}", + "microphone": "\u{F036C}", + "microphone-message": "\u{F050A}", + "microphone-message-off": "\u{F050B}", + "microphone-minus": "\u{F08B3}", + "microphone-off": "\u{F036D}", + "microphone-outline": "\u{F036E}", + "microphone-plus": "\u{F08B4}", + "microphone-question": "\u{F1989}", + "microphone-question-outline": "\u{F198A}", + "microphone-settings": "\u{F036F}", + "microphone-variant": "\u{F0370}", + "microphone-variant-off": "\u{F0371}", + "microscope": "\u{F0654}", + "microsoft": "\u{F0372}", + "microsoft-access": "\u{F138E}", + "microsoft-azure": "\u{F0805}", + "microsoft-azure-devops": "\u{F0FD5}", + "microsoft-bing": "\u{F00A4}", + "microsoft-dynamics-365": "\u{F0988}", + "microsoft-edge": "\u{F01E9}", + "microsoft-excel": "\u{F138F}", + "microsoft-internet-explorer": "\u{F0300}", + "microsoft-office": "\u{F03C6}", + "microsoft-onedrive": "\u{F03CA}", + "microsoft-onenote": "\u{F0747}", + "microsoft-outlook": "\u{F0D22}", + "microsoft-powerpoint": "\u{F1390}", + "microsoft-sharepoint": "\u{F1391}", + "microsoft-teams": "\u{F02BB}", + "microsoft-visual-studio": "\u{F0610}", + "microsoft-visual-studio-code": "\u{F0A1E}", + "microsoft-windows": "\u{F05B3}", + "microsoft-windows-classic": "\u{F0A21}", + "microsoft-word": "\u{F1392}", + "microsoft-xbox": "\u{F05B9}", + "microsoft-xbox-controller": "\u{F05BA}", + "microsoft-xbox-controller-battery-alert": "\u{F074B}", + "microsoft-xbox-controller-battery-charging": "\u{F0A22}", + "microsoft-xbox-controller-battery-empty": "\u{F074C}", + "microsoft-xbox-controller-battery-full": "\u{F074D}", + "microsoft-xbox-controller-battery-low": "\u{F074E}", + "microsoft-xbox-controller-battery-medium": "\u{F074F}", + "microsoft-xbox-controller-battery-unknown": "\u{F0750}", + "microsoft-xbox-controller-menu": "\u{F0E6F}", + "microsoft-xbox-controller-off": "\u{F05BB}", + "microsoft-xbox-controller-view": "\u{F0E70}", + "microwave": "\u{F0C99}", + "microwave-off": "\u{F1423}", + "middleware": "\u{F0F5D}", + "middleware-outline": "\u{F0F5E}", + "midi": "\u{F08F1}", + "midi-port": "\u{F08F2}", + "mine": "\u{F0DDA}", + "minecraft": "\u{F0373}", + "mini-sd": "\u{F0A05}", + "minidisc": "\u{F0A06}", + "minus": "\u{F0374}", + "minus-box": "\u{F0375}", + "minus-box-multiple": "\u{F1141}", + "minus-box-multiple-outline": "\u{F1142}", + "minus-box-outline": "\u{F06F2}", + "minus-circle": "\u{F0376}", + "minus-circle-multiple": "\u{F035A}", + "minus-circle-multiple-outline": "\u{F0AD3}", + "minus-circle-off": "\u{F1459}", + "minus-circle-off-outline": "\u{F145A}", + "minus-circle-outline": "\u{F0377}", + "minus-network": "\u{F0378}", + "minus-network-outline": "\u{F0C9A}", + "minus-thick": "\u{F1639}", + "mirror": "\u{F11FD}", + "mirror-rectangle": "\u{F179F}", + "mirror-variant": "\u{F17A0}", + "mixed-martial-arts": "\u{F0D8F}", + "mixed-reality": "\u{F087F}", + "molecule": "\u{F0BAC}", + "molecule-co": "\u{F12FE}", + "molecule-co2": "\u{F07E4}", + "monitor": "\u{F0379}", + "monitor-account": "\u{F1A5B}", + "monitor-arrow-down": "\u{F19D0}", + "monitor-arrow-down-variant": "\u{F19D1}", + "monitor-cellphone": "\u{F0989}", + "monitor-cellphone-star": "\u{F098A}", + "monitor-dashboard": "\u{F0A07}", + "monitor-edit": "\u{F12C6}", + "monitor-eye": "\u{F13B4}", + "monitor-lock": "\u{F0DDB}", + "monitor-multiple": "\u{F037A}", + "monitor-off": "\u{F0D90}", + "monitor-screenshot": "\u{F0E51}", + "monitor-share": "\u{F1483}", + "monitor-shimmer": "\u{F1104}", + "monitor-small": "\u{F1876}", + "monitor-speaker": "\u{F0F5F}", + "monitor-speaker-off": "\u{F0F60}", + "monitor-star": "\u{F0DDC}", + "monitor-vertical": "\u{F1C33}", + "moon-first-quarter": "\u{F0F61}", + "moon-full": "\u{F0F62}", + "moon-last-quarter": "\u{F0F63}", + "moon-new": "\u{F0F64}", + "moon-waning-crescent": "\u{F0F65}", + "moon-waning-gibbous": "\u{F0F66}", + "moon-waxing-crescent": "\u{F0F67}", + "moon-waxing-gibbous": "\u{F0F68}", + "moped": "\u{F1086}", + "moped-electric": "\u{F15B7}", + "moped-electric-outline": "\u{F15B8}", + "moped-outline": "\u{F15B9}", + "more": "\u{F037B}", + "mortar-pestle": "\u{F1748}", + "mortar-pestle-plus": "\u{F03F1}", + "mosque": "\u{F0D45}", + "mosque-outline": "\u{F1827}", + "mother-heart": "\u{F1314}", + "mother-nurse": "\u{F0D21}", + "motion": "\u{F15B2}", + "motion-outline": "\u{F15B3}", + "motion-pause": "\u{F1590}", + "motion-pause-outline": "\u{F1592}", + "motion-play": "\u{F158F}", + "motion-play-outline": "\u{F1591}", + "motion-sensor": "\u{F0D91}", + "motion-sensor-off": "\u{F1435}", + "motorbike": "\u{F037C}", + "motorbike-electric": "\u{F15BA}", + "motorbike-off": "\u{F1B16}", + "mouse": "\u{F037D}", + "mouse-bluetooth": "\u{F098B}", + "mouse-move-down": "\u{F1550}", + "mouse-move-up": "\u{F1551}", + "mouse-move-vertical": "\u{F1552}", + "mouse-off": "\u{F037E}", + "mouse-variant": "\u{F037F}", + "mouse-variant-off": "\u{F0380}", + "move-resize": "\u{F0655}", + "move-resize-variant": "\u{F0656}", + "movie": "\u{F0381}", + "movie-check": "\u{F16F3}", + "movie-check-outline": "\u{F16F4}", + "movie-cog": "\u{F16F5}", + "movie-cog-outline": "\u{F16F6}", + "movie-edit": "\u{F1122}", + "movie-edit-outline": "\u{F1123}", + "movie-filter": "\u{F1124}", + "movie-filter-outline": "\u{F1125}", + "movie-minus": "\u{F16F7}", + "movie-minus-outline": "\u{F16F8}", + "movie-off": "\u{F16F9}", + "movie-off-outline": "\u{F16FA}", + "movie-open": "\u{F0FCE}", + "movie-open-check": "\u{F16FB}", + "movie-open-check-outline": "\u{F16FC}", + "movie-open-cog": "\u{F16FD}", + "movie-open-cog-outline": "\u{F16FE}", + "movie-open-edit": "\u{F16FF}", + "movie-open-edit-outline": "\u{F1700}", + "movie-open-minus": "\u{F1701}", + "movie-open-minus-outline": "\u{F1702}", + "movie-open-off": "\u{F1703}", + "movie-open-off-outline": "\u{F1704}", + "movie-open-outline": "\u{F0FCF}", + "movie-open-play": "\u{F1705}", + "movie-open-play-outline": "\u{F1706}", + "movie-open-plus": "\u{F1707}", + "movie-open-plus-outline": "\u{F1708}", + "movie-open-remove": "\u{F1709}", + "movie-open-remove-outline": "\u{F170A}", + "movie-open-settings": "\u{F170B}", + "movie-open-settings-outline": "\u{F170C}", + "movie-open-star": "\u{F170D}", + "movie-open-star-outline": "\u{F170E}", + "movie-outline": "\u{F0DDD}", + "movie-play": "\u{F170F}", + "movie-play-outline": "\u{F1710}", + "movie-plus": "\u{F1711}", + "movie-plus-outline": "\u{F1712}", + "movie-remove": "\u{F1713}", + "movie-remove-outline": "\u{F1714}", + "movie-roll": "\u{F07DE}", + "movie-search": "\u{F11D2}", + "movie-search-outline": "\u{F11D3}", + "movie-settings": "\u{F1715}", + "movie-settings-outline": "\u{F1716}", + "movie-star": "\u{F1717}", + "movie-star-outline": "\u{F1718}", + "mower": "\u{F166F}", + "mower-bag": "\u{F1670}", + "mower-bag-on": "\u{F1B60}", + "mower-on": "\u{F1B5F}", + "muffin": "\u{F098C}", + "multicast": "\u{F1893}", + "multimedia": "\u{F1B97}", + "multiplication": "\u{F0382}", + "multiplication-box": "\u{F0383}", + "mushroom": "\u{F07DF}", + "mushroom-off": "\u{F13FA}", + "mushroom-off-outline": "\u{F13FB}", + "mushroom-outline": "\u{F07E0}", + "music": "\u{F075A}", + "music-accidental-double-flat": "\u{F0F69}", + "music-accidental-double-sharp": "\u{F0F6A}", + "music-accidental-flat": "\u{F0F6B}", + "music-accidental-natural": "\u{F0F6C}", + "music-accidental-sharp": "\u{F0F6D}", + "music-box": "\u{F0384}", + "music-box-multiple": "\u{F0333}", + "music-box-multiple-outline": "\u{F0F04}", + "music-box-outline": "\u{F0385}", + "music-circle": "\u{F0386}", + "music-circle-outline": "\u{F0AD4}", + "music-clef-alto": "\u{F0F6E}", + "music-clef-bass": "\u{F0F6F}", + "music-clef-treble": "\u{F0F70}", + "music-note": "\u{F0387}", + "music-note-bluetooth": "\u{F05FE}", + "music-note-bluetooth-off": "\u{F05FF}", + "music-note-eighth": "\u{F0388}", + "music-note-eighth-dotted": "\u{F0F71}", + "music-note-half": "\u{F0389}", + "music-note-half-dotted": "\u{F0F72}", + "music-note-minus": "\u{F1B89}", + "music-note-off": "\u{F038A}", + "music-note-off-outline": "\u{F0F73}", + "music-note-outline": "\u{F0F74}", + "music-note-plus": "\u{F0DDE}", + "music-note-quarter": "\u{F038B}", + "music-note-quarter-dotted": "\u{F0F75}", + "music-note-sixteenth": "\u{F038C}", + "music-note-sixteenth-dotted": "\u{F0F76}", + "music-note-whole": "\u{F038D}", + "music-note-whole-dotted": "\u{F0F77}", + "music-off": "\u{F075B}", + "music-rest-eighth": "\u{F0F78}", + "music-rest-half": "\u{F0F79}", + "music-rest-quarter": "\u{F0F7A}", + "music-rest-sixteenth": "\u{F0F7B}", + "music-rest-whole": "\u{F0F7C}", + "mustache": "\u{F15DE}", + "nail": "\u{F0DDF}", + "nas": "\u{F08F3}", + "nativescript": "\u{F0880}", + "nature": "\u{F038E}", + "nature-outline": "\u{F1C71}", + "nature-people": "\u{F038F}", + "nature-people-outline": "\u{F1C72}", + "navigation": "\u{F0390}", + "navigation-outline": "\u{F1607}", + "navigation-variant": "\u{F18F0}", + "navigation-variant-outline": "\u{F18F1}", + "near-me": "\u{F05CD}", + "necklace": "\u{F0F0B}", + "needle": "\u{F0391}", + "needle-off": "\u{F19D2}", + "netflix": "\u{F0746}", + "network": "\u{F06F3}", + "network-off": "\u{F0C9B}", + "network-off-outline": "\u{F0C9C}", + "network-outline": "\u{F0C9D}", + "network-pos": "\u{F1ACB}", + "network-strength-1": "\u{F08F4}", + "network-strength-1-alert": "\u{F08F5}", + "network-strength-2": "\u{F08F6}", + "network-strength-2-alert": "\u{F08F7}", + "network-strength-3": "\u{F08F8}", + "network-strength-3-alert": "\u{F08F9}", + "network-strength-4": "\u{F08FA}", + "network-strength-4-alert": "\u{F08FB}", + "network-strength-4-cog": "\u{F191A}", + "network-strength-off": "\u{F08FC}", + "network-strength-off-outline": "\u{F08FD}", + "network-strength-outline": "\u{F08FE}", + "new-box": "\u{F0394}", + "newspaper": "\u{F0395}", + "newspaper-check": "\u{F1943}", + "newspaper-minus": "\u{F0F0C}", + "newspaper-plus": "\u{F0F0D}", + "newspaper-remove": "\u{F1944}", + "newspaper-variant": "\u{F1001}", + "newspaper-variant-multiple": "\u{F1002}", + "newspaper-variant-multiple-outline": "\u{F1003}", + "newspaper-variant-outline": "\u{F1004}", + "nfc": "\u{F0396}", + "nfc-search-variant": "\u{F0E53}", + "nfc-tap": "\u{F0397}", + "nfc-variant": "\u{F0398}", + "nfc-variant-off": "\u{F0E54}", + "ninja": "\u{F0774}", + "nintendo-game-boy": "\u{F1393}", + "nintendo-switch": "\u{F07E1}", + "nintendo-wii": "\u{F05AB}", + "nintendo-wiiu": "\u{F072D}", + "nix": "\u{F1105}", + "nodejs": "\u{F0399}", + "noodles": "\u{F117E}", + "not-equal": "\u{F098D}", + "not-equal-variant": "\u{F098E}", + "note": "\u{F039A}", + "note-alert": "\u{F177D}", + "note-alert-outline": "\u{F177E}", + "note-check": "\u{F177F}", + "note-check-outline": "\u{F1780}", + "note-edit": "\u{F1781}", + "note-edit-outline": "\u{F1782}", + "note-minus": "\u{F164F}", + "note-minus-outline": "\u{F1650}", + "note-multiple": "\u{F06B8}", + "note-multiple-outline": "\u{F06B9}", + "note-off": "\u{F1783}", + "note-off-outline": "\u{F1784}", + "note-outline": "\u{F039B}", + "note-plus": "\u{F039C}", + "note-plus-outline": "\u{F039D}", + "note-remove": "\u{F1651}", + "note-remove-outline": "\u{F1652}", + "note-search": "\u{F1653}", + "note-search-outline": "\u{F1654}", + "note-text": "\u{F039E}", + "note-text-outline": "\u{F11D7}", + "notebook": "\u{F082E}", + "notebook-check": "\u{F14F5}", + "notebook-check-outline": "\u{F14F6}", + "notebook-edit": "\u{F14E7}", + "notebook-edit-outline": "\u{F14E9}", + "notebook-heart": "\u{F1A0B}", + "notebook-heart-outline": "\u{F1A0C}", + "notebook-minus": "\u{F1610}", + "notebook-minus-outline": "\u{F1611}", + "notebook-multiple": "\u{F0E55}", + "notebook-outline": "\u{F0EBF}", + "notebook-plus": "\u{F1612}", + "notebook-plus-outline": "\u{F1613}", + "notebook-remove": "\u{F1614}", + "notebook-remove-outline": "\u{F1615}", + "notification-clear-all": "\u{F039F}", + "npm": "\u{F06F7}", + "nuke": "\u{F06A4}", + "null": "\u{F07E2}", + "numeric": "\u{F03A0}", + "numeric-0": "\u{F0B39}", + "numeric-0-box": "\u{F03A1}", + "numeric-0-box-multiple": "\u{F0F0E}", + "numeric-0-box-multiple-outline": "\u{F03A2}", + "numeric-0-box-outline": "\u{F03A3}", + "numeric-0-circle": "\u{F0C9E}", + "numeric-0-circle-outline": "\u{F0C9F}", + "numeric-1": "\u{F0B3A}", + "numeric-1-box": "\u{F03A4}", + "numeric-1-box-multiple": "\u{F0F0F}", + "numeric-1-box-multiple-outline": "\u{F03A5}", + "numeric-1-box-outline": "\u{F03A6}", + "numeric-1-circle": "\u{F0CA0}", + "numeric-1-circle-outline": "\u{F0CA1}", + "numeric-10": "\u{F0FE9}", + "numeric-10-box": "\u{F0F7D}", + "numeric-10-box-multiple": "\u{F0FEA}", + "numeric-10-box-multiple-outline": "\u{F0FEB}", + "numeric-10-box-outline": "\u{F0F7E}", + "numeric-10-circle": "\u{F0FEC}", + "numeric-10-circle-outline": "\u{F0FED}", + "numeric-2": "\u{F0B3B}", + "numeric-2-box": "\u{F03A7}", + "numeric-2-box-multiple": "\u{F0F10}", + "numeric-2-box-multiple-outline": "\u{F03A8}", + "numeric-2-box-outline": "\u{F03A9}", + "numeric-2-circle": "\u{F0CA2}", + "numeric-2-circle-outline": "\u{F0CA3}", + "numeric-3": "\u{F0B3C}", + "numeric-3-box": "\u{F03AA}", + "numeric-3-box-multiple": "\u{F0F11}", + "numeric-3-box-multiple-outline": "\u{F03AB}", + "numeric-3-box-outline": "\u{F03AC}", + "numeric-3-circle": "\u{F0CA4}", + "numeric-3-circle-outline": "\u{F0CA5}", + "numeric-4": "\u{F0B3D}", + "numeric-4-box": "\u{F03AD}", + "numeric-4-box-multiple": "\u{F0F12}", + "numeric-4-box-multiple-outline": "\u{F03B2}", + "numeric-4-box-outline": "\u{F03AE}", + "numeric-4-circle": "\u{F0CA6}", + "numeric-4-circle-outline": "\u{F0CA7}", + "numeric-5": "\u{F0B3E}", + "numeric-5-box": "\u{F03B1}", + "numeric-5-box-multiple": "\u{F0F13}", + "numeric-5-box-multiple-outline": "\u{F03AF}", + "numeric-5-box-outline": "\u{F03B0}", + "numeric-5-circle": "\u{F0CA8}", + "numeric-5-circle-outline": "\u{F0CA9}", + "numeric-6": "\u{F0B3F}", + "numeric-6-box": "\u{F03B3}", + "numeric-6-box-multiple": "\u{F0F14}", + "numeric-6-box-multiple-outline": "\u{F03B4}", + "numeric-6-box-outline": "\u{F03B5}", + "numeric-6-circle": "\u{F0CAA}", + "numeric-6-circle-outline": "\u{F0CAB}", + "numeric-7": "\u{F0B40}", + "numeric-7-box": "\u{F03B6}", + "numeric-7-box-multiple": "\u{F0F15}", + "numeric-7-box-multiple-outline": "\u{F03B7}", + "numeric-7-box-outline": "\u{F03B8}", + "numeric-7-circle": "\u{F0CAC}", + "numeric-7-circle-outline": "\u{F0CAD}", + "numeric-8": "\u{F0B41}", + "numeric-8-box": "\u{F03B9}", + "numeric-8-box-multiple": "\u{F0F16}", + "numeric-8-box-multiple-outline": "\u{F03BA}", + "numeric-8-box-outline": "\u{F03BB}", + "numeric-8-circle": "\u{F0CAE}", + "numeric-8-circle-outline": "\u{F0CAF}", + "numeric-9": "\u{F0B42}", + "numeric-9-box": "\u{F03BC}", + "numeric-9-box-multiple": "\u{F0F17}", + "numeric-9-box-multiple-outline": "\u{F03BD}", + "numeric-9-box-outline": "\u{F03BE}", + "numeric-9-circle": "\u{F0CB0}", + "numeric-9-circle-outline": "\u{F0CB1}", + "numeric-9-plus": "\u{F0FEE}", + "numeric-9-plus-box": "\u{F03BF}", + "numeric-9-plus-box-multiple": "\u{F0F18}", + "numeric-9-plus-box-multiple-outline": "\u{F03C0}", + "numeric-9-plus-box-outline": "\u{F03C1}", + "numeric-9-plus-circle": "\u{F0CB2}", + "numeric-9-plus-circle-outline": "\u{F0CB3}", + "numeric-negative-1": "\u{F1052}", + "numeric-off": "\u{F19D3}", + "numeric-positive-1": "\u{F15CB}", + "nut": "\u{F06F8}", + "nutrition": "\u{F03C2}", + "nuxt": "\u{F1106}", + "oar": "\u{F067C}", + "ocarina": "\u{F0DE0}", + "oci": "\u{F12E9}", + "ocr": "\u{F113A}", + "octagon": "\u{F03C3}", + "octagon-outline": "\u{F03C4}", + "octagram": "\u{F06F9}", + "octagram-edit": "\u{F1C34}", + "octagram-edit-outline": "\u{F1C35}", + "octagram-minus": "\u{F1C36}", + "octagram-minus-outline": "\u{F1C37}", + "octagram-outline": "\u{F0775}", + "octagram-plus": "\u{F1C38}", + "octagram-plus-outline": "\u{F1C39}", + "octahedron": "\u{F1950}", + "octahedron-off": "\u{F1951}", + "odnoklassniki": "\u{F03C5}", + "offer": "\u{F121B}", + "office-building": "\u{F0991}", + "office-building-cog": "\u{F1949}", + "office-building-cog-outline": "\u{F194A}", + "office-building-marker": "\u{F1520}", + "office-building-marker-outline": "\u{F1521}", + "office-building-minus": "\u{F1BAA}", + "office-building-minus-outline": "\u{F1BAB}", + "office-building-outline": "\u{F151F}", + "office-building-plus": "\u{F1BA8}", + "office-building-plus-outline": "\u{F1BA9}", + "office-building-remove": "\u{F1BAC}", + "office-building-remove-outline": "\u{F1BAD}", + "oil": "\u{F03C7}", + "oil-lamp": "\u{F0F19}", + "oil-level": "\u{F1053}", + "oil-temperature": "\u{F0FF8}", + "om": "\u{F0973}", + "omega": "\u{F03C9}", + "one-up": "\u{F0BAD}", + "onepassword": "\u{F0881}", + "opacity": "\u{F05CC}", + "open-in-app": "\u{F03CB}", + "open-in-new": "\u{F03CC}", + "open-source-initiative": "\u{F0BAE}", + "openid": "\u{F03CD}", + "opera": "\u{F03CE}", + "orbit": "\u{F0018}", + "orbit-variant": "\u{F15DB}", + "order-alphabetical-ascending": "\u{F020D}", + "order-alphabetical-descending": "\u{F0D07}", + "order-bool-ascending": "\u{F02BE}", + "order-bool-ascending-variant": "\u{F098F}", + "order-bool-descending": "\u{F1384}", + "order-bool-descending-variant": "\u{F0990}", + "order-numeric-ascending": "\u{F0545}", + "order-numeric-descending": "\u{F0546}", + "origin": "\u{F0B43}", + "ornament": "\u{F03CF}", + "ornament-variant": "\u{F03D0}", + "outdoor-lamp": "\u{F1054}", + "overscan": "\u{F1005}", + "owl": "\u{F03D2}", + "pac-man": "\u{F0BAF}", + "package": "\u{F03D3}", + "package-check": "\u{F1B51}", + "package-down": "\u{F03D4}", + "package-up": "\u{F03D5}", + "package-variant": "\u{F03D6}", + "package-variant-closed": "\u{F03D7}", + "package-variant-closed-check": "\u{F1B52}", + "package-variant-closed-minus": "\u{F19D4}", + "package-variant-closed-plus": "\u{F19D5}", + "package-variant-closed-remove": "\u{F19D6}", + "package-variant-minus": "\u{F19D7}", + "package-variant-plus": "\u{F19D8}", + "package-variant-remove": "\u{F19D9}", + "page-first": "\u{F0600}", + "page-last": "\u{F0601}", + "page-layout-body": "\u{F06FA}", + "page-layout-footer": "\u{F06FB}", + "page-layout-header": "\u{F06FC}", + "page-layout-header-footer": "\u{F0F7F}", + "page-layout-sidebar-left": "\u{F06FD}", + "page-layout-sidebar-right": "\u{F06FE}", + "page-next": "\u{F0BB0}", + "page-next-outline": "\u{F0BB1}", + "page-previous": "\u{F0BB2}", + "page-previous-outline": "\u{F0BB3}", + "pail": "\u{F1417}", + "pail-minus": "\u{F1437}", + "pail-minus-outline": "\u{F143C}", + "pail-off": "\u{F1439}", + "pail-off-outline": "\u{F143E}", + "pail-outline": "\u{F143A}", + "pail-plus": "\u{F1436}", + "pail-plus-outline": "\u{F143B}", + "pail-remove": "\u{F1438}", + "pail-remove-outline": "\u{F143D}", + "palette": "\u{F03D8}", + "palette-advanced": "\u{F03D9}", + "palette-outline": "\u{F0E0C}", + "palette-swatch": "\u{F08B5}", + "palette-swatch-outline": "\u{F135C}", + "palette-swatch-variant": "\u{F195A}", + "palm-tree": "\u{F1055}", + "pan": "\u{F0BB4}", + "pan-bottom-left": "\u{F0BB5}", + "pan-bottom-right": "\u{F0BB6}", + "pan-down": "\u{F0BB7}", + "pan-horizontal": "\u{F0BB8}", + "pan-left": "\u{F0BB9}", + "pan-right": "\u{F0BBA}", + "pan-top-left": "\u{F0BBB}", + "pan-top-right": "\u{F0BBC}", + "pan-up": "\u{F0BBD}", + "pan-vertical": "\u{F0BBE}", + "panda": "\u{F03DA}", + "pandora": "\u{F03DB}", + "panorama": "\u{F03DC}", + "panorama-fisheye": "\u{F03DD}", + "panorama-horizontal": "\u{F1928}", + "panorama-horizontal-outline": "\u{F03DE}", + "panorama-outline": "\u{F198C}", + "panorama-sphere": "\u{F198D}", + "panorama-sphere-outline": "\u{F198E}", + "panorama-variant": "\u{F198F}", + "panorama-variant-outline": "\u{F1990}", + "panorama-vertical": "\u{F1929}", + "panorama-vertical-outline": "\u{F03DF}", + "panorama-wide-angle": "\u{F195F}", + "panorama-wide-angle-outline": "\u{F03E0}", + "paper-cut-vertical": "\u{F03E1}", + "paper-roll": "\u{F1157}", + "paper-roll-outline": "\u{F1158}", + "paperclip": "\u{F03E2}", + "paperclip-check": "\u{F1AC6}", + "paperclip-lock": "\u{F19DA}", + "paperclip-minus": "\u{F1AC7}", + "paperclip-off": "\u{F1AC8}", + "paperclip-plus": "\u{F1AC9}", + "paperclip-remove": "\u{F1ACA}", + "parachute": "\u{F0CB4}", + "parachute-outline": "\u{F0CB5}", + "paragliding": "\u{F1745}", + "parking": "\u{F03E3}", + "party-popper": "\u{F1056}", + "passport": "\u{F07E3}", + "passport-biometric": "\u{F0DE1}", + "pasta": "\u{F1160}", + "patio-heater": "\u{F0F80}", + "patreon": "\u{F0882}", + "pause": "\u{F03E4}", + "pause-box": "\u{F00BC}", + "pause-box-outline": "\u{F1B7A}", + "pause-circle": "\u{F03E5}", + "pause-circle-outline": "\u{F03E6}", + "pause-octagon": "\u{F03E7}", + "pause-octagon-outline": "\u{F03E8}", + "paw": "\u{F03E9}", + "paw-off": "\u{F0657}", + "paw-off-outline": "\u{F1676}", + "paw-outline": "\u{F1675}", + "peace": "\u{F0884}", + "peanut": "\u{F0FFC}", + "peanut-off": "\u{F0FFD}", + "peanut-off-outline": "\u{F0FFF}", + "peanut-outline": "\u{F0FFE}", + "pen": "\u{F03EA}", + "pen-lock": "\u{F0DE2}", + "pen-minus": "\u{F0DE3}", + "pen-off": "\u{F0DE4}", + "pen-plus": "\u{F0DE5}", + "pen-remove": "\u{F0DE6}", + "pencil": "\u{F03EB}", + "pencil-box": "\u{F03EC}", + "pencil-box-multiple": "\u{F1144}", + "pencil-box-multiple-outline": "\u{F1145}", + "pencil-box-outline": "\u{F03ED}", + "pencil-circle": "\u{F06FF}", + "pencil-circle-outline": "\u{F0776}", + "pencil-lock": "\u{F03EE}", + "pencil-lock-outline": "\u{F0DE7}", + "pencil-minus": "\u{F0DE8}", + "pencil-minus-outline": "\u{F0DE9}", + "pencil-off": "\u{F03EF}", + "pencil-off-outline": "\u{F0DEA}", + "pencil-outline": "\u{F0CB6}", + "pencil-plus": "\u{F0DEB}", + "pencil-plus-outline": "\u{F0DEC}", + "pencil-remove": "\u{F0DED}", + "pencil-remove-outline": "\u{F0DEE}", + "pencil-ruler": "\u{F1353}", + "pencil-ruler-outline": "\u{F1C11}", + "penguin": "\u{F0EC0}", + "pentagon": "\u{F0701}", + "pentagon-outline": "\u{F0700}", + "pentagram": "\u{F1667}", + "percent": "\u{F03F0}", + "percent-box": "\u{F1A02}", + "percent-box-outline": "\u{F1A03}", + "percent-circle": "\u{F1A04}", + "percent-circle-outline": "\u{F1A05}", + "percent-outline": "\u{F1278}", + "periodic-table": "\u{F08B6}", + "perspective-less": "\u{F0D23}", + "perspective-more": "\u{F0D24}", + "ph": "\u{F17C5}", + "phone": "\u{F03F2}", + "phone-alert": "\u{F0F1A}", + "phone-alert-outline": "\u{F118E}", + "phone-bluetooth": "\u{F03F3}", + "phone-bluetooth-outline": "\u{F118F}", + "phone-cancel": "\u{F10BC}", + "phone-cancel-outline": "\u{F1190}", + "phone-check": "\u{F11A9}", + "phone-check-outline": "\u{F11AA}", + "phone-classic": "\u{F0602}", + "phone-classic-off": "\u{F1279}", + "phone-clock": "\u{F19DB}", + "phone-dial": "\u{F1559}", + "phone-dial-outline": "\u{F155A}", + "phone-forward": "\u{F03F4}", + "phone-forward-outline": "\u{F1191}", + "phone-hangup": "\u{F03F5}", + "phone-hangup-outline": "\u{F1192}", + "phone-in-talk": "\u{F03F6}", + "phone-in-talk-outline": "\u{F1182}", + "phone-incoming": "\u{F03F7}", + "phone-incoming-outgoing": "\u{F1B3F}", + "phone-incoming-outgoing-outline": "\u{F1B40}", + "phone-incoming-outline": "\u{F1193}", + "phone-lock": "\u{F03F8}", + "phone-lock-outline": "\u{F1194}", + "phone-log": "\u{F03F9}", + "phone-log-outline": "\u{F1195}", + "phone-message": "\u{F1196}", + "phone-message-outline": "\u{F1197}", + "phone-minus": "\u{F0658}", + "phone-minus-outline": "\u{F1198}", + "phone-missed": "\u{F03FA}", + "phone-missed-outline": "\u{F11A5}", + "phone-off": "\u{F0DEF}", + "phone-off-outline": "\u{F11A6}", + "phone-outgoing": "\u{F03FB}", + "phone-outgoing-outline": "\u{F1199}", + "phone-outline": "\u{F0DF0}", + "phone-paused": "\u{F03FC}", + "phone-paused-outline": "\u{F119A}", + "phone-plus": "\u{F0659}", + "phone-plus-outline": "\u{F119B}", + "phone-refresh": "\u{F1993}", + "phone-refresh-outline": "\u{F1994}", + "phone-remove": "\u{F152F}", + "phone-remove-outline": "\u{F1530}", + "phone-return": "\u{F082F}", + "phone-return-outline": "\u{F119C}", + "phone-ring": "\u{F11AB}", + "phone-ring-outline": "\u{F11AC}", + "phone-rotate-landscape": "\u{F0885}", + "phone-rotate-portrait": "\u{F0886}", + "phone-settings": "\u{F03FD}", + "phone-settings-outline": "\u{F119D}", + "phone-sync": "\u{F1995}", + "phone-sync-outline": "\u{F1996}", + "phone-voip": "\u{F03FE}", + "pi": "\u{F03FF}", + "pi-box": "\u{F0400}", + "pi-hole": "\u{F0DF1}", + "piano": "\u{F067D}", + "piano-off": "\u{F0698}", + "pickaxe": "\u{F08B7}", + "picture-in-picture-bottom-right": "\u{F0E57}", + "picture-in-picture-bottom-right-outline": "\u{F0E58}", + "picture-in-picture-top-right": "\u{F0E59}", + "picture-in-picture-top-right-outline": "\u{F0E5A}", + "pier": "\u{F0887}", + "pier-crane": "\u{F0888}", + "pig": "\u{F0401}", + "pig-variant": "\u{F1006}", + "pig-variant-outline": "\u{F1678}", + "piggy-bank": "\u{F1007}", + "piggy-bank-outline": "\u{F1679}", + "pill": "\u{F0402}", + "pill-multiple": "\u{F1B4C}", + "pill-off": "\u{F1A5C}", + "pillar": "\u{F0702}", + "pin": "\u{F0403}", + "pin-off": "\u{F0404}", + "pin-off-outline": "\u{F0930}", + "pin-outline": "\u{F0931}", + "pine-tree": "\u{F0405}", + "pine-tree-box": "\u{F0406}", + "pine-tree-fire": "\u{F141A}", + "pine-tree-variant": "\u{F1C73}", + "pine-tree-variant-outline": "\u{F1C74}", + "pinterest": "\u{F0407}", + "pinwheel": "\u{F0AD5}", + "pinwheel-outline": "\u{F0AD6}", + "pipe": "\u{F07E5}", + "pipe-disconnected": "\u{F07E6}", + "pipe-leak": "\u{F0889}", + "pipe-valve": "\u{F184D}", + "pipe-wrench": "\u{F1354}", + "pirate": "\u{F0A08}", + "pistol": "\u{F0703}", + "piston": "\u{F088A}", + "pitchfork": "\u{F1553}", + "pizza": "\u{F0409}", + "plane-car": "\u{F1AFF}", + "plane-train": "\u{F1B00}", + "play": "\u{F040A}", + "play-box": "\u{F127A}", + "play-box-edit-outline": "\u{F1C3A}", + "play-box-lock": "\u{F1A16}", + "play-box-lock-open": "\u{F1A17}", + "play-box-lock-open-outline": "\u{F1A18}", + "play-box-lock-outline": "\u{F1A19}", + "play-box-multiple": "\u{F0D19}", + "play-box-multiple-outline": "\u{F13E6}", + "play-box-outline": "\u{F040B}", + "play-circle": "\u{F040C}", + "play-circle-outline": "\u{F040D}", + "play-network": "\u{F088B}", + "play-network-outline": "\u{F0CB7}", + "play-outline": "\u{F0F1B}", + "play-pause": "\u{F040E}", + "play-protected-content": "\u{F040F}", + "play-speed": "\u{F08FF}", + "playlist-check": "\u{F05C7}", + "playlist-edit": "\u{F0900}", + "playlist-minus": "\u{F0410}", + "playlist-music": "\u{F0CB8}", + "playlist-music-outline": "\u{F0CB9}", + "playlist-play": "\u{F0411}", + "playlist-plus": "\u{F0412}", + "playlist-remove": "\u{F0413}", + "playlist-star": "\u{F0DF2}", + "plex": "\u{F06BA}", + "pliers": "\u{F19A4}", + "plus": "\u{F0415}", + "plus-box": "\u{F0416}", + "plus-box-multiple": "\u{F0334}", + "plus-box-multiple-outline": "\u{F1143}", + "plus-box-outline": "\u{F0704}", + "plus-circle": "\u{F0417}", + "plus-circle-multiple": "\u{F034C}", + "plus-circle-multiple-outline": "\u{F0418}", + "plus-circle-outline": "\u{F0419}", + "plus-lock": "\u{F1A5D}", + "plus-lock-open": "\u{F1A5E}", + "plus-minus": "\u{F0992}", + "plus-minus-box": "\u{F0993}", + "plus-minus-variant": "\u{F14C9}", + "plus-network": "\u{F041A}", + "plus-network-outline": "\u{F0CBA}", + "plus-outline": "\u{F0705}", + "plus-thick": "\u{F11EC}", + "podcast": "\u{F0994}", + "podium": "\u{F0D25}", + "podium-bronze": "\u{F0D26}", + "podium-gold": "\u{F0D27}", + "podium-silver": "\u{F0D28}", + "point-of-sale": "\u{F0D92}", + "pokeball": "\u{F041D}", + "pokemon-go": "\u{F0A09}", + "poker-chip": "\u{F0830}", + "polaroid": "\u{F041E}", + "police-badge": "\u{F1167}", + "police-badge-outline": "\u{F1168}", + "police-station": "\u{F1839}", + "poll": "\u{F041F}", + "polo": "\u{F14C3}", + "polymer": "\u{F0421}", + "pool": "\u{F0606}", + "pool-thermometer": "\u{F1A5F}", + "popcorn": "\u{F0422}", + "post": "\u{F1008}", + "post-lamp": "\u{F1A60}", + "post-outline": "\u{F1009}", + "postage-stamp": "\u{F0CBB}", + "pot": "\u{F02E5}", + "pot-mix": "\u{F065B}", + "pot-mix-outline": "\u{F0677}", + "pot-outline": "\u{F02FF}", + "pot-steam": "\u{F065A}", + "pot-steam-outline": "\u{F0326}", + "pound": "\u{F0423}", + "pound-box": "\u{F0424}", + "pound-box-outline": "\u{F117F}", + "power": "\u{F0425}", + "power-cycle": "\u{F0901}", + "power-off": "\u{F0902}", + "power-on": "\u{F0903}", + "power-plug": "\u{F06A5}", + "power-plug-battery": "\u{F1C3B}", + "power-plug-battery-outline": "\u{F1C3C}", + "power-plug-off": "\u{F06A6}", + "power-plug-off-outline": "\u{F1424}", + "power-plug-outline": "\u{F1425}", + "power-settings": "\u{F0426}", + "power-sleep": "\u{F0904}", + "power-socket": "\u{F0427}", + "power-socket-au": "\u{F0905}", + "power-socket-ch": "\u{F0FB3}", + "power-socket-de": "\u{F1107}", + "power-socket-eu": "\u{F07E7}", + "power-socket-fr": "\u{F1108}", + "power-socket-it": "\u{F14FF}", + "power-socket-jp": "\u{F1109}", + "power-socket-uk": "\u{F07E8}", + "power-socket-us": "\u{F07E9}", + "power-standby": "\u{F0906}", + "powershell": "\u{F0A0A}", + "prescription": "\u{F0706}", + "presentation": "\u{F0428}", + "presentation-play": "\u{F0429}", + "pretzel": "\u{F1562}", + "printer": "\u{F042A}", + "printer-3d": "\u{F042B}", + "printer-3d-nozzle": "\u{F0E5B}", + "printer-3d-nozzle-alert": "\u{F11C0}", + "printer-3d-nozzle-alert-outline": "\u{F11C1}", + "printer-3d-nozzle-heat": "\u{F18B8}", + "printer-3d-nozzle-heat-outline": "\u{F18B9}", + "printer-3d-nozzle-off": "\u{F1B19}", + "printer-3d-nozzle-off-outline": "\u{F1B1A}", + "printer-3d-nozzle-outline": "\u{F0E5C}", + "printer-3d-off": "\u{F1B0E}", + "printer-alert": "\u{F042C}", + "printer-check": "\u{F1146}", + "printer-eye": "\u{F1458}", + "printer-off": "\u{F0E5D}", + "printer-off-outline": "\u{F1785}", + "printer-outline": "\u{F1786}", + "printer-pos": "\u{F1057}", + "printer-pos-alert": "\u{F1BBC}", + "printer-pos-alert-outline": "\u{F1BBD}", + "printer-pos-cancel": "\u{F1BBE}", + "printer-pos-cancel-outline": "\u{F1BBF}", + "printer-pos-check": "\u{F1BC0}", + "printer-pos-check-outline": "\u{F1BC1}", + "printer-pos-cog": "\u{F1BC2}", + "printer-pos-cog-outline": "\u{F1BC3}", + "printer-pos-edit": "\u{F1BC4}", + "printer-pos-edit-outline": "\u{F1BC5}", + "printer-pos-minus": "\u{F1BC6}", + "printer-pos-minus-outline": "\u{F1BC7}", + "printer-pos-network": "\u{F1BC8}", + "printer-pos-network-outline": "\u{F1BC9}", + "printer-pos-off": "\u{F1BCA}", + "printer-pos-off-outline": "\u{F1BCB}", + "printer-pos-outline": "\u{F1BCC}", + "printer-pos-pause": "\u{F1BCD}", + "printer-pos-pause-outline": "\u{F1BCE}", + "printer-pos-play": "\u{F1BCF}", + "printer-pos-play-outline": "\u{F1BD0}", + "printer-pos-plus": "\u{F1BD1}", + "printer-pos-plus-outline": "\u{F1BD2}", + "printer-pos-refresh": "\u{F1BD3}", + "printer-pos-refresh-outline": "\u{F1BD4}", + "printer-pos-remove": "\u{F1BD5}", + "printer-pos-remove-outline": "\u{F1BD6}", + "printer-pos-star": "\u{F1BD7}", + "printer-pos-star-outline": "\u{F1BD8}", + "printer-pos-stop": "\u{F1BD9}", + "printer-pos-stop-outline": "\u{F1BDA}", + "printer-pos-sync": "\u{F1BDB}", + "printer-pos-sync-outline": "\u{F1BDC}", + "printer-pos-wrench": "\u{F1BDD}", + "printer-pos-wrench-outline": "\u{F1BDE}", + "printer-search": "\u{F1457}", + "printer-settings": "\u{F0707}", + "printer-wireless": "\u{F0A0B}", + "priority-high": "\u{F0603}", + "priority-low": "\u{F0604}", + "professional-hexagon": "\u{F042D}", + "progress-alert": "\u{F0CBC}", + "progress-check": "\u{F0995}", + "progress-clock": "\u{F0996}", + "progress-close": "\u{F110A}", + "progress-download": "\u{F0997}", + "progress-helper": "\u{F1BA2}", + "progress-pencil": "\u{F1787}", + "progress-question": "\u{F1522}", + "progress-star": "\u{F1788}", + "progress-star-four-points": "\u{F1C3D}", + "progress-upload": "\u{F0998}", + "progress-wrench": "\u{F0CBD}", + "projector": "\u{F042E}", + "projector-off": "\u{F1A23}", + "projector-screen": "\u{F042F}", + "projector-screen-off": "\u{F180D}", + "projector-screen-off-outline": "\u{F180E}", + "projector-screen-outline": "\u{F1724}", + "projector-screen-variant": "\u{F180F}", + "projector-screen-variant-off": "\u{F1810}", + "projector-screen-variant-off-outline": "\u{F1811}", + "projector-screen-variant-outline": "\u{F1812}", + "propane-tank": "\u{F1357}", + "propane-tank-outline": "\u{F1358}", + "protocol": "\u{F0FD8}", + "publish": "\u{F06A7}", + "publish-off": "\u{F1945}", + "pulse": "\u{F0430}", + "pump": "\u{F1402}", + "pump-off": "\u{F1B22}", + "pumpkin": "\u{F0BBF}", + "purse": "\u{F0F1C}", + "purse-outline": "\u{F0F1D}", + "puzzle": "\u{F0431}", + "puzzle-check": "\u{F1426}", + "puzzle-check-outline": "\u{F1427}", + "puzzle-edit": "\u{F14D3}", + "puzzle-edit-outline": "\u{F14D9}", + "puzzle-heart": "\u{F14D4}", + "puzzle-heart-outline": "\u{F14DA}", + "puzzle-minus": "\u{F14D1}", + "puzzle-minus-outline": "\u{F14D7}", + "puzzle-outline": "\u{F0A66}", + "puzzle-plus": "\u{F14D0}", + "puzzle-plus-outline": "\u{F14D6}", + "puzzle-remove": "\u{F14D2}", + "puzzle-remove-outline": "\u{F14D8}", + "puzzle-star": "\u{F14D5}", + "puzzle-star-outline": "\u{F14DB}", + "pyramid": "\u{F1952}", + "pyramid-off": "\u{F1953}", + "qi": "\u{F0999}", + "qqchat": "\u{F0605}", + "qrcode": "\u{F0432}", + "qrcode-edit": "\u{F08B8}", + "qrcode-minus": "\u{F118C}", + "qrcode-plus": "\u{F118B}", + "qrcode-remove": "\u{F118D}", + "qrcode-scan": "\u{F0433}", + "quadcopter": "\u{F0434}", + "quality-high": "\u{F0435}", + "quality-low": "\u{F0A0C}", + "quality-medium": "\u{F0A0D}", + "quora": "\u{F0D29}", + "rabbit": "\u{F0907}", + "rabbit-variant": "\u{F1A61}", + "rabbit-variant-outline": "\u{F1A62}", + "racing-helmet": "\u{F0D93}", + "racquetball": "\u{F0D94}", + "radar": "\u{F0437}", + "radiator": "\u{F0438}", + "radiator-disabled": "\u{F0AD7}", + "radiator-off": "\u{F0AD8}", + "radio": "\u{F0439}", + "radio-am": "\u{F0CBE}", + "radio-fm": "\u{F0CBF}", + "radio-handheld": "\u{F043A}", + "radio-off": "\u{F121C}", + "radio-tower": "\u{F043B}", + "radioactive": "\u{F043C}", + "radioactive-circle": "\u{F185D}", + "radioactive-circle-outline": "\u{F185E}", + "radioactive-off": "\u{F0EC1}", + "radiobox-blank": "\u{F043D}", + "radiobox-indeterminate-variant": "\u{F1C5E}", + "radiobox-marked": "\u{F043E}", + "radiology-box": "\u{F14C5}", + "radiology-box-outline": "\u{F14C6}", + "radius": "\u{F0CC0}", + "radius-outline": "\u{F0CC1}", + "railroad-light": "\u{F0F1E}", + "rake": "\u{F1544}", + "raspberry-pi": "\u{F043F}", + "raw": "\u{F1A0F}", + "raw-off": "\u{F1A10}", + "ray-end": "\u{F0440}", + "ray-end-arrow": "\u{F0441}", + "ray-start": "\u{F0442}", + "ray-start-arrow": "\u{F0443}", + "ray-start-end": "\u{F0444}", + "ray-start-vertex-end": "\u{F15D8}", + "ray-vertex": "\u{F0445}", + "razor-double-edge": "\u{F1997}", + "razor-single-edge": "\u{F1998}", + "react": "\u{F0708}", + "read": "\u{F0447}", + "receipt": "\u{F0824}", + "receipt-clock": "\u{F1C3E}", + "receipt-clock-outline": "\u{F1C3F}", + "receipt-outline": "\u{F04F7}", + "receipt-send": "\u{F1C40}", + "receipt-send-outline": "\u{F1C41}", + "receipt-text": "\u{F0449}", + "receipt-text-arrow-left": "\u{F1C42}", + "receipt-text-arrow-left-outline": "\u{F1C43}", + "receipt-text-arrow-right": "\u{F1C44}", + "receipt-text-arrow-right-outline": "\u{F1C45}", + "receipt-text-check": "\u{F1A63}", + "receipt-text-check-outline": "\u{F1A64}", + "receipt-text-clock": "\u{F1C46}", + "receipt-text-clock-outline": "\u{F1C47}", + "receipt-text-edit": "\u{F1C48}", + "receipt-text-edit-outline": "\u{F1C49}", + "receipt-text-minus": "\u{F1A65}", + "receipt-text-minus-outline": "\u{F1A66}", + "receipt-text-outline": "\u{F19DC}", + "receipt-text-plus": "\u{F1A67}", + "receipt-text-plus-outline": "\u{F1A68}", + "receipt-text-remove": "\u{F1A69}", + "receipt-text-remove-outline": "\u{F1A6A}", + "receipt-text-send": "\u{F1C4A}", + "receipt-text-send-outline": "\u{F1C4B}", + "record": "\u{F044A}", + "record-circle": "\u{F0EC2}", + "record-circle-outline": "\u{F0EC3}", + "record-player": "\u{F099A}", + "record-rec": "\u{F044B}", + "rectangle": "\u{F0E5E}", + "rectangle-outline": "\u{F0E5F}", + "recycle": "\u{F044C}", + "recycle-variant": "\u{F139D}", + "reddit": "\u{F044D}", + "redhat": "\u{F111B}", + "redo": "\u{F044E}", + "redo-variant": "\u{F044F}", + "reflect-horizontal": "\u{F0A0E}", + "reflect-vertical": "\u{F0A0F}", + "refresh": "\u{F0450}", + "refresh-auto": "\u{F18F2}", + "refresh-circle": "\u{F1377}", + "regex": "\u{F0451}", + "registered-trademark": "\u{F0A67}", + "reiterate": "\u{F1588}", + "relation-many-to-many": "\u{F1496}", + "relation-many-to-one": "\u{F1497}", + "relation-many-to-one-or-many": "\u{F1498}", + "relation-many-to-only-one": "\u{F1499}", + "relation-many-to-zero-or-many": "\u{F149A}", + "relation-many-to-zero-or-one": "\u{F149B}", + "relation-one-or-many-to-many": "\u{F149C}", + "relation-one-or-many-to-one": "\u{F149D}", + "relation-one-or-many-to-one-or-many": "\u{F149E}", + "relation-one-or-many-to-only-one": "\u{F149F}", + "relation-one-or-many-to-zero-or-many": "\u{F14A0}", + "relation-one-or-many-to-zero-or-one": "\u{F14A1}", + "relation-one-to-many": "\u{F14A2}", + "relation-one-to-one": "\u{F14A3}", + "relation-one-to-one-or-many": "\u{F14A4}", + "relation-one-to-only-one": "\u{F14A5}", + "relation-one-to-zero-or-many": "\u{F14A6}", + "relation-one-to-zero-or-one": "\u{F14A7}", + "relation-only-one-to-many": "\u{F14A8}", + "relation-only-one-to-one": "\u{F14A9}", + "relation-only-one-to-one-or-many": "\u{F14AA}", + "relation-only-one-to-only-one": "\u{F14AB}", + "relation-only-one-to-zero-or-many": "\u{F14AC}", + "relation-only-one-to-zero-or-one": "\u{F14AD}", + "relation-zero-or-many-to-many": "\u{F14AE}", + "relation-zero-or-many-to-one": "\u{F14AF}", + "relation-zero-or-many-to-one-or-many": "\u{F14B0}", + "relation-zero-or-many-to-only-one": "\u{F14B1}", + "relation-zero-or-many-to-zero-or-many": "\u{F14B2}", + "relation-zero-or-many-to-zero-or-one": "\u{F14B3}", + "relation-zero-or-one-to-many": "\u{F14B4}", + "relation-zero-or-one-to-one": "\u{F14B5}", + "relation-zero-or-one-to-one-or-many": "\u{F14B6}", + "relation-zero-or-one-to-only-one": "\u{F14B7}", + "relation-zero-or-one-to-zero-or-many": "\u{F14B8}", + "relation-zero-or-one-to-zero-or-one": "\u{F14B9}", + "relative-scale": "\u{F0452}", + "reload": "\u{F0453}", + "reload-alert": "\u{F110B}", + "reminder": "\u{F088C}", + "remote": "\u{F0454}", + "remote-desktop": "\u{F08B9}", + "remote-off": "\u{F0EC4}", + "remote-tv": "\u{F0EC5}", + "remote-tv-off": "\u{F0EC6}", + "rename": "\u{F1C18}", + "rename-box": "\u{F0455}", + "rename-box-outline": "\u{F1C19}", + "rename-outline": "\u{F1C1A}", + "reorder-horizontal": "\u{F0688}", + "reorder-vertical": "\u{F0689}", + "repeat": "\u{F0456}", + "repeat-off": "\u{F0457}", + "repeat-once": "\u{F0458}", + "repeat-variant": "\u{F0547}", + "replay": "\u{F0459}", + "reply": "\u{F045A}", + "reply-all": "\u{F045B}", + "reply-all-outline": "\u{F0F1F}", + "reply-circle": "\u{F11AE}", + "reply-outline": "\u{F0F20}", + "reproduction": "\u{F045C}", + "resistor": "\u{F0B44}", + "resistor-nodes": "\u{F0B45}", + "resize": "\u{F0A68}", + "resize-bottom-right": "\u{F045D}", + "responsive": "\u{F045E}", + "restart": "\u{F0709}", + "restart-alert": "\u{F110C}", + "restart-off": "\u{F0D95}", + "restore": "\u{F099B}", + "restore-alert": "\u{F110D}", + "rewind": "\u{F045F}", + "rewind-10": "\u{F0D2A}", + "rewind-15": "\u{F1946}", + "rewind-30": "\u{F0D96}", + "rewind-45": "\u{F1B13}", + "rewind-5": "\u{F11F9}", + "rewind-60": "\u{F160C}", + "rewind-outline": "\u{F070A}", + "rhombus": "\u{F070B}", + "rhombus-medium": "\u{F0A10}", + "rhombus-medium-outline": "\u{F14DC}", + "rhombus-outline": "\u{F070C}", + "rhombus-split": "\u{F0A11}", + "rhombus-split-outline": "\u{F14DD}", + "ribbon": "\u{F0460}", + "rice": "\u{F07EA}", + "rickshaw": "\u{F15BB}", + "rickshaw-electric": "\u{F15BC}", + "ring": "\u{F07EB}", + "rivet": "\u{F0E60}", + "road": "\u{F0461}", + "road-variant": "\u{F0462}", + "robber": "\u{F1058}", + "robot": "\u{F06A9}", + "robot-angry": "\u{F169D}", + "robot-angry-outline": "\u{F169E}", + "robot-confused": "\u{F169F}", + "robot-confused-outline": "\u{F16A0}", + "robot-dead": "\u{F16A1}", + "robot-dead-outline": "\u{F16A2}", + "robot-excited": "\u{F16A3}", + "robot-excited-outline": "\u{F16A4}", + "robot-happy": "\u{F1719}", + "robot-happy-outline": "\u{F171A}", + "robot-industrial": "\u{F0B46}", + "robot-industrial-outline": "\u{F1A1A}", + "robot-love": "\u{F16A5}", + "robot-love-outline": "\u{F16A6}", + "robot-mower": "\u{F11F7}", + "robot-mower-outline": "\u{F11F3}", + "robot-off": "\u{F16A7}", + "robot-off-outline": "\u{F167B}", + "robot-outline": "\u{F167A}", + "robot-vacuum": "\u{F070D}", + "robot-vacuum-alert": "\u{F1B5D}", + "robot-vacuum-off": "\u{F1C01}", + "robot-vacuum-variant": "\u{F0908}", + "robot-vacuum-variant-alert": "\u{F1B5E}", + "robot-vacuum-variant-off": "\u{F1C02}", + "rocket": "\u{F0463}", + "rocket-launch": "\u{F14DE}", + "rocket-launch-outline": "\u{F14DF}", + "rocket-outline": "\u{F13AF}", + "rodent": "\u{F1327}", + "roller-shade": "\u{F1A6B}", + "roller-shade-closed": "\u{F1A6C}", + "roller-skate": "\u{F0D2B}", + "roller-skate-off": "\u{F0145}", + "rollerblade": "\u{F0D2C}", + "rollerblade-off": "\u{F002E}", + "rollupjs": "\u{F0BC0}", + "rolodex": "\u{F1AB9}", + "rolodex-outline": "\u{F1ABA}", + "roman-numeral-1": "\u{F1088}", + "roman-numeral-10": "\u{F1091}", + "roman-numeral-2": "\u{F1089}", + "roman-numeral-3": "\u{F108A}", + "roman-numeral-4": "\u{F108B}", + "roman-numeral-5": "\u{F108C}", + "roman-numeral-6": "\u{F108D}", + "roman-numeral-7": "\u{F108E}", + "roman-numeral-8": "\u{F108F}", + "roman-numeral-9": "\u{F1090}", + "room-service": "\u{F088D}", + "room-service-outline": "\u{F0D97}", + "rotate-360": "\u{F1999}", + "rotate-3d": "\u{F0EC7}", + "rotate-3d-variant": "\u{F0464}", + "rotate-left": "\u{F0465}", + "rotate-left-variant": "\u{F0466}", + "rotate-orbit": "\u{F0D98}", + "rotate-right": "\u{F0467}", + "rotate-right-variant": "\u{F0468}", + "rounded-corner": "\u{F0607}", + "router": "\u{F11E2}", + "router-network": "\u{F1087}", + "router-wireless": "\u{F0469}", + "router-wireless-off": "\u{F15A3}", + "router-wireless-settings": "\u{F0A69}", + "routes": "\u{F046A}", + "routes-clock": "\u{F1059}", + "rowing": "\u{F0608}", + "rss": "\u{F046B}", + "rss-box": "\u{F046C}", + "rss-off": "\u{F0F21}", + "rug": "\u{F1475}", + "rugby": "\u{F0D99}", + "ruler": "\u{F046D}", + "ruler-square": "\u{F0CC2}", + "ruler-square-compass": "\u{F0EBE}", + "run": "\u{F070E}", + "run-fast": "\u{F046E}", + "rv-truck": "\u{F11D4}", + "sack": "\u{F0D2E}", + "sack-outline": "\u{F1C4C}", + "sack-percent": "\u{F0D2F}", + "safe": "\u{F0A6A}", + "safe-square": "\u{F127C}", + "safe-square-outline": "\u{F127D}", + "safety-goggles": "\u{F0D30}", + "sail-boat": "\u{F0EC8}", + "sail-boat-sink": "\u{F1AEF}", + "sale": "\u{F046F}", + "sale-outline": "\u{F1A06}", + "salesforce": "\u{F088E}", + "sass": "\u{F07EC}", + "satellite": "\u{F0470}", + "satellite-uplink": "\u{F0909}", + "satellite-variant": "\u{F0471}", + "sausage": "\u{F08BA}", + "sausage-off": "\u{F1789}", + "saw-blade": "\u{F0E61}", + "sawtooth-wave": "\u{F147A}", + "saxophone": "\u{F0609}", + "scale": "\u{F0472}", + "scale-balance": "\u{F05D1}", + "scale-bathroom": "\u{F0473}", + "scale-off": "\u{F105A}", + "scale-unbalanced": "\u{F19B8}", + "scan-helper": "\u{F13D8}", + "scanner": "\u{F06AB}", + "scanner-off": "\u{F090A}", + "scatter-plot": "\u{F0EC9}", + "scatter-plot-outline": "\u{F0ECA}", + "scent": "\u{F1958}", + "scent-off": "\u{F1959}", + "school": "\u{F0474}", + "school-outline": "\u{F1180}", + "scissors-cutting": "\u{F0A6B}", + "scooter": "\u{F15BD}", + "scooter-electric": "\u{F15BE}", + "scoreboard": "\u{F127E}", + "scoreboard-outline": "\u{F127F}", + "screen-rotation": "\u{F0475}", + "screen-rotation-lock": "\u{F0478}", + "screw-flat-top": "\u{F0DF3}", + "screw-lag": "\u{F0DF4}", + "screw-machine-flat-top": "\u{F0DF5}", + "screw-machine-round-top": "\u{F0DF6}", + "screw-round-top": "\u{F0DF7}", + "screwdriver": "\u{F0476}", + "script": "\u{F0BC1}", + "script-outline": "\u{F0477}", + "script-text": "\u{F0BC2}", + "script-text-key": "\u{F1725}", + "script-text-key-outline": "\u{F1726}", + "script-text-outline": "\u{F0BC3}", + "script-text-play": "\u{F1727}", + "script-text-play-outline": "\u{F1728}", + "sd": "\u{F0479}", + "seal": "\u{F047A}", + "seal-variant": "\u{F0FD9}", + "search-web": "\u{F070F}", + "seat": "\u{F0CC3}", + "seat-flat": "\u{F047B}", + "seat-flat-angled": "\u{F047C}", + "seat-individual-suite": "\u{F047D}", + "seat-legroom-extra": "\u{F047E}", + "seat-legroom-normal": "\u{F047F}", + "seat-legroom-reduced": "\u{F0480}", + "seat-outline": "\u{F0CC4}", + "seat-passenger": "\u{F1249}", + "seat-recline-extra": "\u{F0481}", + "seat-recline-normal": "\u{F0482}", + "seatbelt": "\u{F0CC5}", + "security": "\u{F0483}", + "security-network": "\u{F0484}", + "seed": "\u{F0E62}", + "seed-off": "\u{F13FD}", + "seed-off-outline": "\u{F13FE}", + "seed-outline": "\u{F0E63}", + "seed-plus": "\u{F1A6D}", + "seed-plus-outline": "\u{F1A6E}", + "seesaw": "\u{F15A4}", + "segment": "\u{F0ECB}", + "select": "\u{F0485}", + "select-all": "\u{F0486}", + "select-arrow-down": "\u{F1B59}", + "select-arrow-up": "\u{F1B58}", + "select-color": "\u{F0D31}", + "select-compare": "\u{F0AD9}", + "select-drag": "\u{F0A6C}", + "select-group": "\u{F0F82}", + "select-inverse": "\u{F0487}", + "select-marker": "\u{F1280}", + "select-multiple": "\u{F1281}", + "select-multiple-marker": "\u{F1282}", + "select-off": "\u{F0488}", + "select-place": "\u{F0FDA}", + "select-remove": "\u{F17C1}", + "select-search": "\u{F1204}", + "selection": "\u{F0489}", + "selection-drag": "\u{F0A6D}", + "selection-ellipse": "\u{F0D32}", + "selection-ellipse-arrow-inside": "\u{F0F22}", + "selection-ellipse-remove": "\u{F17C2}", + "selection-marker": "\u{F1283}", + "selection-multiple": "\u{F1285}", + "selection-multiple-marker": "\u{F1284}", + "selection-off": "\u{F0777}", + "selection-remove": "\u{F17C3}", + "selection-search": "\u{F1205}", + "semantic-web": "\u{F1316}", + "send": "\u{F048A}", + "send-check": "\u{F1161}", + "send-check-outline": "\u{F1162}", + "send-circle": "\u{F0DF8}", + "send-circle-outline": "\u{F0DF9}", + "send-clock": "\u{F1163}", + "send-clock-outline": "\u{F1164}", + "send-lock": "\u{F07ED}", + "send-lock-outline": "\u{F1166}", + "send-outline": "\u{F1165}", + "send-variant": "\u{F1C4D}", + "send-variant-clock": "\u{F1C7E}", + "send-variant-clock-outline": "\u{F1C7F}", + "send-variant-outline": "\u{F1C4E}", + "serial-port": "\u{F065C}", + "server": "\u{F048B}", + "server-minus": "\u{F048C}", + "server-network": "\u{F048D}", + "server-network-off": "\u{F048E}", + "server-off": "\u{F048F}", + "server-plus": "\u{F0490}", + "server-remove": "\u{F0491}", + "server-security": "\u{F0492}", + "set-all": "\u{F0778}", + "set-center": "\u{F0779}", + "set-center-right": "\u{F077A}", + "set-left": "\u{F077B}", + "set-left-center": "\u{F077C}", + "set-left-right": "\u{F077D}", + "set-merge": "\u{F14E0}", + "set-none": "\u{F077E}", + "set-right": "\u{F077F}", + "set-split": "\u{F14E1}", + "set-square": "\u{F145D}", + "set-top-box": "\u{F099F}", + "settings-helper": "\u{F0A6E}", + "shaker": "\u{F110E}", + "shaker-outline": "\u{F110F}", + "shape": "\u{F0831}", + "shape-circle-plus": "\u{F065D}", + "shape-outline": "\u{F0832}", + "shape-oval-plus": "\u{F11FA}", + "shape-plus": "\u{F0495}", + "shape-plus-outline": "\u{F1C4F}", + "shape-polygon-plus": "\u{F065E}", + "shape-rectangle-plus": "\u{F065F}", + "shape-square-plus": "\u{F0660}", + "shape-square-rounded-plus": "\u{F14FA}", + "share": "\u{F0496}", + "share-all": "\u{F11F4}", + "share-all-outline": "\u{F11F5}", + "share-circle": "\u{F11AD}", + "share-off": "\u{F0F23}", + "share-off-outline": "\u{F0F24}", + "share-outline": "\u{F0932}", + "share-variant": "\u{F0497}", + "share-variant-outline": "\u{F1514}", + "shark": "\u{F18BA}", + "shark-fin": "\u{F1673}", + "shark-fin-outline": "\u{F1674}", + "shark-off": "\u{F18BB}", + "sheep": "\u{F0CC6}", + "shield": "\u{F0498}", + "shield-account": "\u{F088F}", + "shield-account-outline": "\u{F0A12}", + "shield-account-variant": "\u{F15A7}", + "shield-account-variant-outline": "\u{F15A8}", + "shield-airplane": "\u{F06BB}", + "shield-airplane-outline": "\u{F0CC7}", + "shield-alert": "\u{F0ECC}", + "shield-alert-outline": "\u{F0ECD}", + "shield-bug": "\u{F13DA}", + "shield-bug-outline": "\u{F13DB}", + "shield-car": "\u{F0F83}", + "shield-check": "\u{F0565}", + "shield-check-outline": "\u{F0CC8}", + "shield-cross": "\u{F0CC9}", + "shield-cross-outline": "\u{F0CCA}", + "shield-crown": "\u{F18BC}", + "shield-crown-outline": "\u{F18BD}", + "shield-edit": "\u{F11A0}", + "shield-edit-outline": "\u{F11A1}", + "shield-half": "\u{F1360}", + "shield-half-full": "\u{F0780}", + "shield-home": "\u{F068A}", + "shield-home-outline": "\u{F0CCB}", + "shield-key": "\u{F0BC4}", + "shield-key-outline": "\u{F0BC5}", + "shield-link-variant": "\u{F0D33}", + "shield-link-variant-outline": "\u{F0D34}", + "shield-lock": "\u{F099D}", + "shield-lock-open": "\u{F199A}", + "shield-lock-open-outline": "\u{F199B}", + "shield-lock-outline": "\u{F0CCC}", + "shield-moon": "\u{F1828}", + "shield-moon-outline": "\u{F1829}", + "shield-off": "\u{F099E}", + "shield-off-outline": "\u{F099C}", + "shield-outline": "\u{F0499}", + "shield-plus": "\u{F0ADA}", + "shield-plus-outline": "\u{F0ADB}", + "shield-refresh": "\u{F00AA}", + "shield-refresh-outline": "\u{F01E0}", + "shield-remove": "\u{F0ADC}", + "shield-remove-outline": "\u{F0ADD}", + "shield-search": "\u{F0D9A}", + "shield-star": "\u{F113B}", + "shield-star-outline": "\u{F113C}", + "shield-sun": "\u{F105D}", + "shield-sun-outline": "\u{F105E}", + "shield-sword": "\u{F18BE}", + "shield-sword-outline": "\u{F18BF}", + "shield-sync": "\u{F11A2}", + "shield-sync-outline": "\u{F11A3}", + "shimmer": "\u{F1545}", + "ship-wheel": "\u{F0833}", + "shipping-pallet": "\u{F184E}", + "shoe-ballet": "\u{F15CA}", + "shoe-cleat": "\u{F15C7}", + "shoe-formal": "\u{F0B47}", + "shoe-heel": "\u{F0B48}", + "shoe-print": "\u{F0DFA}", + "shoe-sneaker": "\u{F15C8}", + "shopping": "\u{F049A}", + "shopping-music": "\u{F049B}", + "shopping-outline": "\u{F11D5}", + "shopping-search": "\u{F0F84}", + "shopping-search-outline": "\u{F1A6F}", + "shore": "\u{F14F9}", + "shovel": "\u{F0710}", + "shovel-off": "\u{F0711}", + "shower": "\u{F09A0}", + "shower-head": "\u{F09A1}", + "shredder": "\u{F049C}", + "shuffle": "\u{F049D}", + "shuffle-disabled": "\u{F049E}", + "shuffle-variant": "\u{F049F}", + "shuriken": "\u{F137F}", + "sickle": "\u{F18C0}", + "sigma": "\u{F04A0}", + "sigma-lower": "\u{F062B}", + "sign-caution": "\u{F04A1}", + "sign-direction": "\u{F0781}", + "sign-direction-minus": "\u{F1000}", + "sign-direction-plus": "\u{F0FDC}", + "sign-direction-remove": "\u{F0FDD}", + "sign-language": "\u{F1B4D}", + "sign-language-outline": "\u{F1B4E}", + "sign-pole": "\u{F14F8}", + "sign-real-estate": "\u{F1118}", + "sign-text": "\u{F0782}", + "sign-yield": "\u{F1BAF}", + "signal": "\u{F04A2}", + "signal-2g": "\u{F0712}", + "signal-3g": "\u{F0713}", + "signal-4g": "\u{F0714}", + "signal-5g": "\u{F0A6F}", + "signal-cellular-1": "\u{F08BC}", + "signal-cellular-2": "\u{F08BD}", + "signal-cellular-3": "\u{F08BE}", + "signal-cellular-outline": "\u{F08BF}", + "signal-distance-variant": "\u{F0E64}", + "signal-hspa": "\u{F0715}", + "signal-hspa-plus": "\u{F0716}", + "signal-off": "\u{F0783}", + "signal-variant": "\u{F060A}", + "signature": "\u{F0DFB}", + "signature-freehand": "\u{F0DFC}", + "signature-image": "\u{F0DFD}", + "signature-text": "\u{F0DFE}", + "silo": "\u{F1B9F}", + "silo-outline": "\u{F0B49}", + "silverware": "\u{F04A3}", + "silverware-clean": "\u{F0FDE}", + "silverware-fork": "\u{F04A4}", + "silverware-fork-knife": "\u{F0A70}", + "silverware-spoon": "\u{F04A5}", + "silverware-variant": "\u{F04A6}", + "sim": "\u{F04A7}", + "sim-alert": "\u{F04A8}", + "sim-alert-outline": "\u{F15D3}", + "sim-off": "\u{F04A9}", + "sim-off-outline": "\u{F15D4}", + "sim-outline": "\u{F15D5}", + "simple-icons": "\u{F131D}", + "sina-weibo": "\u{F0ADF}", + "sine-wave": "\u{F095B}", + "sitemap": "\u{F04AA}", + "sitemap-outline": "\u{F199C}", + "size-l": "\u{F13A6}", + "size-m": "\u{F13A5}", + "size-s": "\u{F13A4}", + "size-xl": "\u{F13A7}", + "size-xs": "\u{F13A3}", + "size-xxl": "\u{F13A8}", + "size-xxs": "\u{F13A2}", + "size-xxxl": "\u{F13A9}", + "skate": "\u{F0D35}", + "skate-off": "\u{F0699}", + "skateboard": "\u{F14C2}", + "skateboarding": "\u{F0501}", + "skew-less": "\u{F0D36}", + "skew-more": "\u{F0D37}", + "ski": "\u{F1304}", + "ski-cross-country": "\u{F1305}", + "ski-water": "\u{F1306}", + "skip-backward": "\u{F04AB}", + "skip-backward-outline": "\u{F0F25}", + "skip-forward": "\u{F04AC}", + "skip-forward-outline": "\u{F0F26}", + "skip-next": "\u{F04AD}", + "skip-next-circle": "\u{F0661}", + "skip-next-circle-outline": "\u{F0662}", + "skip-next-outline": "\u{F0F27}", + "skip-previous": "\u{F04AE}", + "skip-previous-circle": "\u{F0663}", + "skip-previous-circle-outline": "\u{F0664}", + "skip-previous-outline": "\u{F0F28}", + "skull": "\u{F068C}", + "skull-crossbones": "\u{F0BC6}", + "skull-crossbones-outline": "\u{F0BC7}", + "skull-outline": "\u{F0BC8}", + "skull-scan": "\u{F14C7}", + "skull-scan-outline": "\u{F14C8}", + "skype": "\u{F04AF}", + "skype-business": "\u{F04B0}", + "slack": "\u{F04B1}", + "slash-forward": "\u{F0FDF}", + "slash-forward-box": "\u{F0FE0}", + "sledding": "\u{F041B}", + "sleep": "\u{F04B2}", + "sleep-off": "\u{F04B3}", + "slide": "\u{F15A5}", + "slope-downhill": "\u{F0DFF}", + "slope-uphill": "\u{F0E00}", + "slot-machine": "\u{F1114}", + "slot-machine-outline": "\u{F1115}", + "smart-card": "\u{F10BD}", + "smart-card-off": "\u{F18F7}", + "smart-card-off-outline": "\u{F18F8}", + "smart-card-outline": "\u{F10BE}", + "smart-card-reader": "\u{F10BF}", + "smart-card-reader-outline": "\u{F10C0}", + "smog": "\u{F0A71}", + "smoke": "\u{F1799}", + "smoke-detector": "\u{F0392}", + "smoke-detector-alert": "\u{F192E}", + "smoke-detector-alert-outline": "\u{F192F}", + "smoke-detector-off": "\u{F1809}", + "smoke-detector-off-outline": "\u{F180A}", + "smoke-detector-outline": "\u{F1808}", + "smoke-detector-variant": "\u{F180B}", + "smoke-detector-variant-alert": "\u{F1930}", + "smoke-detector-variant-off": "\u{F180C}", + "smoking": "\u{F04B4}", + "smoking-off": "\u{F04B5}", + "smoking-pipe": "\u{F140D}", + "smoking-pipe-off": "\u{F1428}", + "snail": "\u{F1677}", + "snake": "\u{F150E}", + "snapchat": "\u{F04B6}", + "snowboard": "\u{F1307}", + "snowflake": "\u{F0717}", + "snowflake-alert": "\u{F0F29}", + "snowflake-check": "\u{F1A70}", + "snowflake-melt": "\u{F12CB}", + "snowflake-off": "\u{F14E3}", + "snowflake-thermometer": "\u{F1A71}", + "snowflake-variant": "\u{F0F2A}", + "snowman": "\u{F04B7}", + "snowmobile": "\u{F06DD}", + "snowshoeing": "\u{F1A72}", + "soccer": "\u{F04B8}", + "soccer-field": "\u{F0834}", + "social-distance-2-meters": "\u{F1579}", + "social-distance-6-feet": "\u{F157A}", + "sofa": "\u{F04B9}", + "sofa-outline": "\u{F156D}", + "sofa-single": "\u{F156E}", + "sofa-single-outline": "\u{F156F}", + "solar-panel": "\u{F0D9B}", + "solar-panel-large": "\u{F0D9C}", + "solar-power": "\u{F0A72}", + "solar-power-variant": "\u{F1A73}", + "solar-power-variant-outline": "\u{F1A74}", + "soldering-iron": "\u{F1092}", + "solid": "\u{F068D}", + "sony-playstation": "\u{F0414}", + "sort": "\u{F04BA}", + "sort-alphabetical-ascending": "\u{F05BD}", + "sort-alphabetical-ascending-variant": "\u{F1148}", + "sort-alphabetical-descending": "\u{F05BF}", + "sort-alphabetical-descending-variant": "\u{F1149}", + "sort-alphabetical-variant": "\u{F04BB}", + "sort-ascending": "\u{F04BC}", + "sort-bool-ascending": "\u{F1385}", + "sort-bool-ascending-variant": "\u{F1386}", + "sort-bool-descending": "\u{F1387}", + "sort-bool-descending-variant": "\u{F1388}", + "sort-calendar-ascending": "\u{F1547}", + "sort-calendar-descending": "\u{F1548}", + "sort-clock-ascending": "\u{F1549}", + "sort-clock-ascending-outline": "\u{F154A}", + "sort-clock-descending": "\u{F154B}", + "sort-clock-descending-outline": "\u{F154C}", + "sort-descending": "\u{F04BD}", + "sort-numeric-ascending": "\u{F1389}", + "sort-numeric-ascending-variant": "\u{F090D}", + "sort-numeric-descending": "\u{F138A}", + "sort-numeric-descending-variant": "\u{F0AD2}", + "sort-numeric-variant": "\u{F04BE}", + "sort-reverse-variant": "\u{F033C}", + "sort-variant": "\u{F04BF}", + "sort-variant-lock": "\u{F0CCD}", + "sort-variant-lock-open": "\u{F0CCE}", + "sort-variant-off": "\u{F1ABB}", + "sort-variant-remove": "\u{F1147}", + "soundbar": "\u{F17DB}", + "soundcloud": "\u{F04C0}", + "source-branch": "\u{F062C}", + "source-branch-check": "\u{F14CF}", + "source-branch-minus": "\u{F14CB}", + "source-branch-plus": "\u{F14CA}", + "source-branch-refresh": "\u{F14CD}", + "source-branch-remove": "\u{F14CC}", + "source-branch-sync": "\u{F14CE}", + "source-commit": "\u{F0718}", + "source-commit-end": "\u{F0719}", + "source-commit-end-local": "\u{F071A}", + "source-commit-local": "\u{F071B}", + "source-commit-next-local": "\u{F071C}", + "source-commit-start": "\u{F071D}", + "source-commit-start-next-local": "\u{F071E}", + "source-fork": "\u{F04C1}", + "source-merge": "\u{F062D}", + "source-pull": "\u{F04C2}", + "source-repository": "\u{F0CCF}", + "source-repository-multiple": "\u{F0CD0}", + "soy-sauce": "\u{F07EE}", + "soy-sauce-off": "\u{F13FC}", + "spa": "\u{F0CD1}", + "spa-outline": "\u{F0CD2}", + "space-invaders": "\u{F0BC9}", + "space-station": "\u{F1383}", + "spade": "\u{F0E65}", + "speaker": "\u{F04C3}", + "speaker-bluetooth": "\u{F09A2}", + "speaker-message": "\u{F1B11}", + "speaker-multiple": "\u{F0D38}", + "speaker-off": "\u{F04C4}", + "speaker-pause": "\u{F1B73}", + "speaker-play": "\u{F1B72}", + "speaker-stop": "\u{F1B74}", + "speaker-wireless": "\u{F071F}", + "spear": "\u{F1845}", + "speedometer": "\u{F04C5}", + "speedometer-medium": "\u{F0F85}", + "speedometer-slow": "\u{F0F86}", + "spellcheck": "\u{F04C6}", + "sphere": "\u{F1954}", + "sphere-off": "\u{F1955}", + "spider": "\u{F11EA}", + "spider-outline": "\u{F1C75}", + "spider-thread": "\u{F11EB}", + "spider-web": "\u{F0BCA}", + "spirit-level": "\u{F14F1}", + "spoon-sugar": "\u{F1429}", + "spotify": "\u{F04C7}", + "spotlight": "\u{F04C8}", + "spotlight-beam": "\u{F04C9}", + "spray": "\u{F0665}", + "spray-bottle": "\u{F0AE0}", + "sprinkler": "\u{F105F}", + "sprinkler-fire": "\u{F199D}", + "sprinkler-variant": "\u{F1060}", + "sprout": "\u{F0E66}", + "sprout-outline": "\u{F0E67}", + "square": "\u{F0764}", + "square-circle": "\u{F1500}", + "square-circle-outline": "\u{F1C50}", + "square-edit-outline": "\u{F090C}", + "square-medium": "\u{F0A13}", + "square-medium-outline": "\u{F0A14}", + "square-off": "\u{F12EE}", + "square-off-outline": "\u{F12EF}", + "square-opacity": "\u{F1854}", + "square-outline": "\u{F0763}", + "square-root": "\u{F0784}", + "square-root-box": "\u{F09A3}", + "square-rounded": "\u{F14FB}", + "square-rounded-badge": "\u{F1A07}", + "square-rounded-badge-outline": "\u{F1A08}", + "square-rounded-outline": "\u{F14FC}", + "square-small": "\u{F0A15}", + "square-wave": "\u{F147B}", + "squeegee": "\u{F0AE1}", + "ssh": "\u{F08C0}", + "stack-exchange": "\u{F060B}", + "stack-overflow": "\u{F04CC}", + "stackpath": "\u{F0359}", + "stadium": "\u{F0FF9}", + "stadium-outline": "\u{F1B03}", + "stadium-variant": "\u{F0720}", + "stairs": "\u{F04CD}", + "stairs-box": "\u{F139E}", + "stairs-down": "\u{F12BE}", + "stairs-up": "\u{F12BD}", + "stamper": "\u{F0D39}", + "standard-definition": "\u{F07EF}", + "star": "\u{F04CE}", + "star-box": "\u{F0A73}", + "star-box-multiple": "\u{F1286}", + "star-box-multiple-outline": "\u{F1287}", + "star-box-outline": "\u{F0A74}", + "star-check": "\u{F1566}", + "star-check-outline": "\u{F156A}", + "star-circle": "\u{F04CF}", + "star-circle-outline": "\u{F09A4}", + "star-cog": "\u{F1668}", + "star-cog-outline": "\u{F1669}", + "star-crescent": "\u{F0979}", + "star-david": "\u{F097A}", + "star-face": "\u{F09A5}", + "star-four-points": "\u{F0AE2}", + "star-four-points-box": "\u{F1C51}", + "star-four-points-box-outline": "\u{F1C52}", + "star-four-points-circle": "\u{F1C53}", + "star-four-points-circle-outline": "\u{F1C54}", + "star-four-points-outline": "\u{F0AE3}", + "star-four-points-small": "\u{F1C55}", + "star-half": "\u{F0246}", + "star-half-full": "\u{F04D0}", + "star-minus": "\u{F1564}", + "star-minus-outline": "\u{F1568}", + "star-off": "\u{F04D1}", + "star-off-outline": "\u{F155B}", + "star-outline": "\u{F04D2}", + "star-plus": "\u{F1563}", + "star-plus-outline": "\u{F1567}", + "star-remove": "\u{F1565}", + "star-remove-outline": "\u{F1569}", + "star-settings": "\u{F166A}", + "star-settings-outline": "\u{F166B}", + "star-shooting": "\u{F1741}", + "star-shooting-outline": "\u{F1742}", + "star-three-points": "\u{F0AE4}", + "star-three-points-outline": "\u{F0AE5}", + "state-machine": "\u{F11EF}", + "steam": "\u{F04D3}", + "steering": "\u{F04D4}", + "steering-off": "\u{F090E}", + "step-backward": "\u{F04D5}", + "step-backward-2": "\u{F04D6}", + "step-forward": "\u{F04D7}", + "step-forward-2": "\u{F04D8}", + "stethoscope": "\u{F04D9}", + "sticker": "\u{F1364}", + "sticker-alert": "\u{F1365}", + "sticker-alert-outline": "\u{F1366}", + "sticker-check": "\u{F1367}", + "sticker-check-outline": "\u{F1368}", + "sticker-circle-outline": "\u{F05D0}", + "sticker-emoji": "\u{F0785}", + "sticker-minus": "\u{F1369}", + "sticker-minus-outline": "\u{F136A}", + "sticker-outline": "\u{F136B}", + "sticker-plus": "\u{F136C}", + "sticker-plus-outline": "\u{F136D}", + "sticker-remove": "\u{F136E}", + "sticker-remove-outline": "\u{F136F}", + "sticker-text": "\u{F178E}", + "sticker-text-outline": "\u{F178F}", + "stocking": "\u{F04DA}", + "stomach": "\u{F1093}", + "stool": "\u{F195D}", + "stool-outline": "\u{F195E}", + "stop": "\u{F04DB}", + "stop-circle": "\u{F0666}", + "stop-circle-outline": "\u{F0667}", + "storage-tank": "\u{F1A75}", + "storage-tank-outline": "\u{F1A76}", + "store": "\u{F04DC}", + "store-24-hour": "\u{F04DD}", + "store-alert": "\u{F18C1}", + "store-alert-outline": "\u{F18C2}", + "store-check": "\u{F18C3}", + "store-check-outline": "\u{F18C4}", + "store-clock": "\u{F18C5}", + "store-clock-outline": "\u{F18C6}", + "store-cog": "\u{F18C7}", + "store-cog-outline": "\u{F18C8}", + "store-edit": "\u{F18C9}", + "store-edit-outline": "\u{F18CA}", + "store-marker": "\u{F18CB}", + "store-marker-outline": "\u{F18CC}", + "store-minus": "\u{F165E}", + "store-minus-outline": "\u{F18CD}", + "store-off": "\u{F18CE}", + "store-off-outline": "\u{F18CF}", + "store-outline": "\u{F1361}", + "store-plus": "\u{F165F}", + "store-plus-outline": "\u{F18D0}", + "store-remove": "\u{F1660}", + "store-remove-outline": "\u{F18D1}", + "store-search": "\u{F18D2}", + "store-search-outline": "\u{F18D3}", + "store-settings": "\u{F18D4}", + "store-settings-outline": "\u{F18D5}", + "storefront": "\u{F07C7}", + "storefront-check": "\u{F1B7D}", + "storefront-check-outline": "\u{F1B7E}", + "storefront-edit": "\u{F1B7F}", + "storefront-edit-outline": "\u{F1B80}", + "storefront-minus": "\u{F1B83}", + "storefront-minus-outline": "\u{F1B84}", + "storefront-outline": "\u{F10C1}", + "storefront-plus": "\u{F1B81}", + "storefront-plus-outline": "\u{F1B82}", + "storefront-remove": "\u{F1B85}", + "storefront-remove-outline": "\u{F1B86}", + "stove": "\u{F04DE}", + "strategy": "\u{F11D6}", + "stretch-to-page": "\u{F0F2B}", + "stretch-to-page-outline": "\u{F0F2C}", + "string-lights": "\u{F12BA}", + "string-lights-off": "\u{F12BB}", + "subdirectory-arrow-left": "\u{F060C}", + "subdirectory-arrow-right": "\u{F060D}", + "submarine": "\u{F156C}", + "subtitles": "\u{F0A16}", + "subtitles-outline": "\u{F0A17}", + "subway": "\u{F06AC}", + "subway-alert-variant": "\u{F0D9D}", + "subway-variant": "\u{F04DF}", + "summit": "\u{F0786}", + "sun-angle": "\u{F1B27}", + "sun-angle-outline": "\u{F1B28}", + "sun-clock": "\u{F1A77}", + "sun-clock-outline": "\u{F1A78}", + "sun-compass": "\u{F19A5}", + "sun-snowflake": "\u{F1796}", + "sun-snowflake-variant": "\u{F1A79}", + "sun-thermometer": "\u{F18D6}", + "sun-thermometer-outline": "\u{F18D7}", + "sun-wireless": "\u{F17FE}", + "sun-wireless-outline": "\u{F17FF}", + "sunglasses": "\u{F04E0}", + "surfing": "\u{F1746}", + "surround-sound": "\u{F05C5}", + "surround-sound-2-0": "\u{F07F0}", + "surround-sound-2-1": "\u{F1729}", + "surround-sound-3-1": "\u{F07F1}", + "surround-sound-5-1": "\u{F07F2}", + "surround-sound-5-1-2": "\u{F172A}", + "surround-sound-7-1": "\u{F07F3}", + "svg": "\u{F0721}", + "swap-horizontal": "\u{F04E1}", + "swap-horizontal-bold": "\u{F0BCD}", + "swap-horizontal-circle": "\u{F0FE1}", + "swap-horizontal-circle-outline": "\u{F0FE2}", + "swap-horizontal-variant": "\u{F08C1}", + "swap-vertical": "\u{F04E2}", + "swap-vertical-bold": "\u{F0BCE}", + "swap-vertical-circle": "\u{F0FE3}", + "swap-vertical-circle-outline": "\u{F0FE4}", + "swap-vertical-variant": "\u{F08C2}", + "swim": "\u{F04E3}", + "switch": "\u{F04E4}", + "sword": "\u{F04E5}", + "sword-cross": "\u{F0787}", + "syllabary-hangul": "\u{F1333}", + "syllabary-hiragana": "\u{F1334}", + "syllabary-katakana": "\u{F1335}", + "syllabary-katakana-halfwidth": "\u{F1336}", + "symbol": "\u{F1501}", + "symfony": "\u{F0AE6}", + "synagogue": "\u{F1B04}", + "synagogue-outline": "\u{F1B05}", + "sync": "\u{F04E6}", + "sync-alert": "\u{F04E7}", + "sync-circle": "\u{F1378}", + "sync-off": "\u{F04E8}", + "tab": "\u{F04E9}", + "tab-minus": "\u{F0B4B}", + "tab-plus": "\u{F075C}", + "tab-remove": "\u{F0B4C}", + "tab-search": "\u{F199E}", + "tab-unselected": "\u{F04EA}", + "table": "\u{F04EB}", + "table-account": "\u{F13B9}", + "table-alert": "\u{F13BA}", + "table-arrow-down": "\u{F13BB}", + "table-arrow-left": "\u{F13BC}", + "table-arrow-right": "\u{F13BD}", + "table-arrow-up": "\u{F13BE}", + "table-border": "\u{F0A18}", + "table-cancel": "\u{F13BF}", + "table-chair": "\u{F1061}", + "table-check": "\u{F13C0}", + "table-clock": "\u{F13C1}", + "table-cog": "\u{F13C2}", + "table-column": "\u{F0835}", + "table-column-plus-after": "\u{F04EC}", + "table-column-plus-before": "\u{F04ED}", + "table-column-remove": "\u{F04EE}", + "table-column-width": "\u{F04EF}", + "table-edit": "\u{F04F0}", + "table-eye": "\u{F1094}", + "table-eye-off": "\u{F13C3}", + "table-filter": "\u{F1B8C}", + "table-furniture": "\u{F05BC}", + "table-headers-eye": "\u{F121D}", + "table-headers-eye-off": "\u{F121E}", + "table-heart": "\u{F13C4}", + "table-key": "\u{F13C5}", + "table-large": "\u{F04F1}", + "table-large-plus": "\u{F0F87}", + "table-large-remove": "\u{F0F88}", + "table-lock": "\u{F13C6}", + "table-merge-cells": "\u{F09A6}", + "table-minus": "\u{F13C7}", + "table-multiple": "\u{F13C8}", + "table-network": "\u{F13C9}", + "table-of-contents": "\u{F0836}", + "table-off": "\u{F13CA}", + "table-picnic": "\u{F1743}", + "table-pivot": "\u{F183C}", + "table-plus": "\u{F0A75}", + "table-question": "\u{F1B21}", + "table-refresh": "\u{F13A0}", + "table-remove": "\u{F0A76}", + "table-row": "\u{F0837}", + "table-row-height": "\u{F04F2}", + "table-row-plus-after": "\u{F04F3}", + "table-row-plus-before": "\u{F04F4}", + "table-row-remove": "\u{F04F5}", + "table-search": "\u{F090F}", + "table-settings": "\u{F0838}", + "table-split-cell": "\u{F142A}", + "table-star": "\u{F13CB}", + "table-sync": "\u{F13A1}", + "table-tennis": "\u{F0E68}", + "tablet": "\u{F04F6}", + "tablet-cellphone": "\u{F09A7}", + "tablet-dashboard": "\u{F0ECE}", + "taco": "\u{F0762}", + "tag": "\u{F04F9}", + "tag-arrow-down": "\u{F172B}", + "tag-arrow-down-outline": "\u{F172C}", + "tag-arrow-left": "\u{F172D}", + "tag-arrow-left-outline": "\u{F172E}", + "tag-arrow-right": "\u{F172F}", + "tag-arrow-right-outline": "\u{F1730}", + "tag-arrow-up": "\u{F1731}", + "tag-arrow-up-outline": "\u{F1732}", + "tag-check": "\u{F1A7A}", + "tag-check-outline": "\u{F1A7B}", + "tag-faces": "\u{F04FA}", + "tag-heart": "\u{F068B}", + "tag-heart-outline": "\u{F0BCF}", + "tag-hidden": "\u{F1C76}", + "tag-minus": "\u{F0910}", + "tag-minus-outline": "\u{F121F}", + "tag-multiple": "\u{F04FB}", + "tag-multiple-outline": "\u{F12F7}", + "tag-off": "\u{F1220}", + "tag-off-outline": "\u{F1221}", + "tag-outline": "\u{F04FC}", + "tag-plus": "\u{F0722}", + "tag-plus-outline": "\u{F1222}", + "tag-remove": "\u{F0723}", + "tag-remove-outline": "\u{F1223}", + "tag-search": "\u{F1907}", + "tag-search-outline": "\u{F1908}", + "tag-text": "\u{F1224}", + "tag-text-outline": "\u{F04FD}", + "tailwind": "\u{F13FF}", + "tally-mark-1": "\u{F1ABC}", + "tally-mark-2": "\u{F1ABD}", + "tally-mark-3": "\u{F1ABE}", + "tally-mark-4": "\u{F1ABF}", + "tally-mark-5": "\u{F1AC0}", + "tangram": "\u{F04F8}", + "tank": "\u{F0D3A}", + "tanker-truck": "\u{F0FE5}", + "tape-drive": "\u{F16DF}", + "tape-measure": "\u{F0B4D}", + "target": "\u{F04FE}", + "target-account": "\u{F0BD0}", + "target-variant": "\u{F0A77}", + "taxi": "\u{F04FF}", + "tea": "\u{F0D9E}", + "tea-outline": "\u{F0D9F}", + "teamviewer": "\u{F0500}", + "teddy-bear": "\u{F18FB}", + "telescope": "\u{F0B4E}", + "television": "\u{F0502}", + "television-ambient-light": "\u{F1356}", + "television-box": "\u{F0839}", + "television-classic": "\u{F07F4}", + "television-classic-off": "\u{F083A}", + "television-guide": "\u{F0503}", + "television-off": "\u{F083B}", + "television-pause": "\u{F0F89}", + "television-play": "\u{F0ECF}", + "television-shimmer": "\u{F1110}", + "television-speaker": "\u{F1B1B}", + "television-speaker-off": "\u{F1B1C}", + "television-stop": "\u{F0F8A}", + "temperature-celsius": "\u{F0504}", + "temperature-fahrenheit": "\u{F0505}", + "temperature-kelvin": "\u{F0506}", + "temple-buddhist": "\u{F1B06}", + "temple-buddhist-outline": "\u{F1B07}", + "temple-hindu": "\u{F1B08}", + "temple-hindu-outline": "\u{F1B09}", + "tennis": "\u{F0DA0}", + "tennis-ball": "\u{F0507}", + "tennis-ball-outline": "\u{F1C5F}", + "tent": "\u{F0508}", + "terraform": "\u{F1062}", + "terrain": "\u{F0509}", + "test-tube": "\u{F0668}", + "test-tube-empty": "\u{F0911}", + "test-tube-off": "\u{F0912}", + "text": "\u{F09A8}", + "text-account": "\u{F1570}", + "text-box": "\u{F021A}", + "text-box-check": "\u{F0EA6}", + "text-box-check-outline": "\u{F0EA7}", + "text-box-edit": "\u{F1A7C}", + "text-box-edit-outline": "\u{F1A7D}", + "text-box-minus": "\u{F0EA8}", + "text-box-minus-outline": "\u{F0EA9}", + "text-box-multiple": "\u{F0AB7}", + "text-box-multiple-outline": "\u{F0AB8}", + "text-box-outline": "\u{F09ED}", + "text-box-plus": "\u{F0EAA}", + "text-box-plus-outline": "\u{F0EAB}", + "text-box-remove": "\u{F0EAC}", + "text-box-remove-outline": "\u{F0EAD}", + "text-box-search": "\u{F0EAE}", + "text-box-search-outline": "\u{F0EAF}", + "text-long": "\u{F09AA}", + "text-recognition": "\u{F113D}", + "text-search": "\u{F13B8}", + "text-search-variant": "\u{F1A7E}", + "text-shadow": "\u{F0669}", + "text-short": "\u{F09A9}", + "texture": "\u{F050C}", + "texture-box": "\u{F0FE6}", + "theater": "\u{F050D}", + "theme-light-dark": "\u{F050E}", + "thermometer": "\u{F050F}", + "thermometer-alert": "\u{F0E01}", + "thermometer-auto": "\u{F1B0F}", + "thermometer-bluetooth": "\u{F1895}", + "thermometer-check": "\u{F1A7F}", + "thermometer-chevron-down": "\u{F0E02}", + "thermometer-chevron-up": "\u{F0E03}", + "thermometer-high": "\u{F10C2}", + "thermometer-lines": "\u{F0510}", + "thermometer-low": "\u{F10C3}", + "thermometer-minus": "\u{F0E04}", + "thermometer-off": "\u{F1531}", + "thermometer-plus": "\u{F0E05}", + "thermometer-probe": "\u{F1B2B}", + "thermometer-probe-off": "\u{F1B2C}", + "thermometer-water": "\u{F1A80}", + "thermostat": "\u{F0393}", + "thermostat-auto": "\u{F1B17}", + "thermostat-box": "\u{F0891}", + "thermostat-box-auto": "\u{F1B18}", + "thermostat-cog": "\u{F1C80}", + "thought-bubble": "\u{F07F6}", + "thought-bubble-outline": "\u{F07F7}", + "thumb-down": "\u{F0511}", + "thumb-down-outline": "\u{F0512}", + "thumb-up": "\u{F0513}", + "thumb-up-outline": "\u{F0514}", + "thumbs-up-down": "\u{F0515}", + "thumbs-up-down-outline": "\u{F1914}", + "ticket": "\u{F0516}", + "ticket-account": "\u{F0517}", + "ticket-confirmation": "\u{F0518}", + "ticket-confirmation-outline": "\u{F13AA}", + "ticket-outline": "\u{F0913}", + "ticket-percent": "\u{F0724}", + "ticket-percent-outline": "\u{F142B}", + "tie": "\u{F0519}", + "tilde": "\u{F0725}", + "tilde-off": "\u{F18F3}", + "timelapse": "\u{F051A}", + "timeline": "\u{F0BD1}", + "timeline-alert": "\u{F0F95}", + "timeline-alert-outline": "\u{F0F98}", + "timeline-check": "\u{F1532}", + "timeline-check-outline": "\u{F1533}", + "timeline-clock": "\u{F11FB}", + "timeline-clock-outline": "\u{F11FC}", + "timeline-minus": "\u{F1534}", + "timeline-minus-outline": "\u{F1535}", + "timeline-outline": "\u{F0BD2}", + "timeline-plus": "\u{F0F96}", + "timeline-plus-outline": "\u{F0F97}", + "timeline-question": "\u{F0F99}", + "timeline-question-outline": "\u{F0F9A}", + "timeline-remove": "\u{F1536}", + "timeline-remove-outline": "\u{F1537}", + "timeline-text": "\u{F0BD3}", + "timeline-text-outline": "\u{F0BD4}", + "timer": "\u{F13AB}", + "timer-10": "\u{F051C}", + "timer-3": "\u{F051D}", + "timer-alert": "\u{F1ACC}", + "timer-alert-outline": "\u{F1ACD}", + "timer-cancel": "\u{F1ACE}", + "timer-cancel-outline": "\u{F1ACF}", + "timer-check": "\u{F1AD0}", + "timer-check-outline": "\u{F1AD1}", + "timer-cog": "\u{F1925}", + "timer-cog-outline": "\u{F1926}", + "timer-edit": "\u{F1AD2}", + "timer-edit-outline": "\u{F1AD3}", + "timer-lock": "\u{F1AD4}", + "timer-lock-open": "\u{F1AD5}", + "timer-lock-open-outline": "\u{F1AD6}", + "timer-lock-outline": "\u{F1AD7}", + "timer-marker": "\u{F1AD8}", + "timer-marker-outline": "\u{F1AD9}", + "timer-minus": "\u{F1ADA}", + "timer-minus-outline": "\u{F1ADB}", + "timer-music": "\u{F1ADC}", + "timer-music-outline": "\u{F1ADD}", + "timer-off": "\u{F13AC}", + "timer-off-outline": "\u{F051E}", + "timer-outline": "\u{F051B}", + "timer-pause": "\u{F1ADE}", + "timer-pause-outline": "\u{F1ADF}", + "timer-play": "\u{F1AE0}", + "timer-play-outline": "\u{F1AE1}", + "timer-plus": "\u{F1AE2}", + "timer-plus-outline": "\u{F1AE3}", + "timer-refresh": "\u{F1AE4}", + "timer-refresh-outline": "\u{F1AE5}", + "timer-remove": "\u{F1AE6}", + "timer-remove-outline": "\u{F1AE7}", + "timer-sand": "\u{F051F}", + "timer-sand-complete": "\u{F199F}", + "timer-sand-empty": "\u{F06AD}", + "timer-sand-full": "\u{F078C}", + "timer-sand-paused": "\u{F19A0}", + "timer-settings": "\u{F1923}", + "timer-settings-outline": "\u{F1924}", + "timer-star": "\u{F1AE8}", + "timer-star-outline": "\u{F1AE9}", + "timer-stop": "\u{F1AEA}", + "timer-stop-outline": "\u{F1AEB}", + "timer-sync": "\u{F1AEC}", + "timer-sync-outline": "\u{F1AED}", + "timetable": "\u{F0520}", + "tire": "\u{F1896}", + "toaster": "\u{F1063}", + "toaster-off": "\u{F11B7}", + "toaster-oven": "\u{F0CD3}", + "toggle-switch": "\u{F0521}", + "toggle-switch-off": "\u{F0522}", + "toggle-switch-off-outline": "\u{F0A19}", + "toggle-switch-outline": "\u{F0A1A}", + "toggle-switch-variant": "\u{F1A25}", + "toggle-switch-variant-off": "\u{F1A26}", + "toilet": "\u{F09AB}", + "toolbox": "\u{F09AC}", + "toolbox-outline": "\u{F09AD}", + "tools": "\u{F1064}", + "tooltip": "\u{F0523}", + "tooltip-account": "\u{F000C}", + "tooltip-cellphone": "\u{F183B}", + "tooltip-check": "\u{F155C}", + "tooltip-check-outline": "\u{F155D}", + "tooltip-edit": "\u{F0524}", + "tooltip-edit-outline": "\u{F12C5}", + "tooltip-image": "\u{F0525}", + "tooltip-image-outline": "\u{F0BD5}", + "tooltip-minus": "\u{F155E}", + "tooltip-minus-outline": "\u{F155F}", + "tooltip-outline": "\u{F0526}", + "tooltip-plus": "\u{F0BD6}", + "tooltip-plus-outline": "\u{F0527}", + "tooltip-question": "\u{F1BBA}", + "tooltip-question-outline": "\u{F1BBB}", + "tooltip-remove": "\u{F1560}", + "tooltip-remove-outline": "\u{F1561}", + "tooltip-text": "\u{F0528}", + "tooltip-text-outline": "\u{F0BD7}", + "tooth": "\u{F08C3}", + "tooth-outline": "\u{F0529}", + "toothbrush": "\u{F1129}", + "toothbrush-electric": "\u{F112C}", + "toothbrush-paste": "\u{F112A}", + "torch": "\u{F1606}", + "tortoise": "\u{F0D3B}", + "toslink": "\u{F12B8}", + "touch-text-outline": "\u{F1C60}", + "tournament": "\u{F09AE}", + "tow-truck": "\u{F083C}", + "tower-beach": "\u{F0681}", + "tower-fire": "\u{F0682}", + "town-hall": "\u{F1875}", + "toy-brick": "\u{F1288}", + "toy-brick-marker": "\u{F1289}", + "toy-brick-marker-outline": "\u{F128A}", + "toy-brick-minus": "\u{F128B}", + "toy-brick-minus-outline": "\u{F128C}", + "toy-brick-outline": "\u{F128D}", + "toy-brick-plus": "\u{F128E}", + "toy-brick-plus-outline": "\u{F128F}", + "toy-brick-remove": "\u{F1290}", + "toy-brick-remove-outline": "\u{F1291}", + "toy-brick-search": "\u{F1292}", + "toy-brick-search-outline": "\u{F1293}", + "track-light": "\u{F0914}", + "track-light-off": "\u{F1B01}", + "trackpad": "\u{F07F8}", + "trackpad-lock": "\u{F0933}", + "tractor": "\u{F0892}", + "tractor-variant": "\u{F14C4}", + "trademark": "\u{F0A78}", + "traffic-cone": "\u{F137C}", + "traffic-light": "\u{F052B}", + "traffic-light-outline": "\u{F182A}", + "train": "\u{F052C}", + "train-car": "\u{F0BD8}", + "train-car-autorack": "\u{F1B2D}", + "train-car-box": "\u{F1B2E}", + "train-car-box-full": "\u{F1B2F}", + "train-car-box-open": "\u{F1B30}", + "train-car-caboose": "\u{F1B31}", + "train-car-centerbeam": "\u{F1B32}", + "train-car-centerbeam-full": "\u{F1B33}", + "train-car-container": "\u{F1B34}", + "train-car-flatbed": "\u{F1B35}", + "train-car-flatbed-car": "\u{F1B36}", + "train-car-flatbed-tank": "\u{F1B37}", + "train-car-gondola": "\u{F1B38}", + "train-car-gondola-full": "\u{F1B39}", + "train-car-hopper": "\u{F1B3A}", + "train-car-hopper-covered": "\u{F1B3B}", + "train-car-hopper-full": "\u{F1B3C}", + "train-car-intermodal": "\u{F1B3D}", + "train-car-passenger": "\u{F1733}", + "train-car-passenger-door": "\u{F1734}", + "train-car-passenger-door-open": "\u{F1735}", + "train-car-passenger-variant": "\u{F1736}", + "train-car-tank": "\u{F1B3E}", + "train-variant": "\u{F08C4}", + "tram": "\u{F052D}", + "tram-side": "\u{F0FE7}", + "transcribe": "\u{F052E}", + "transcribe-close": "\u{F052F}", + "transfer": "\u{F1065}", + "transfer-down": "\u{F0DA1}", + "transfer-left": "\u{F0DA2}", + "transfer-right": "\u{F0530}", + "transfer-up": "\u{F0DA3}", + "transit-connection": "\u{F0D3C}", + "transit-connection-horizontal": "\u{F1546}", + "transit-connection-variant": "\u{F0D3D}", + "transit-detour": "\u{F0F8B}", + "transit-skip": "\u{F1515}", + "transit-transfer": "\u{F06AE}", + "transition": "\u{F0915}", + "transition-masked": "\u{F0916}", + "translate": "\u{F05CA}", + "translate-off": "\u{F0E06}", + "translate-variant": "\u{F1B99}", + "transmission-tower": "\u{F0D3E}", + "transmission-tower-export": "\u{F192C}", + "transmission-tower-import": "\u{F192D}", + "transmission-tower-off": "\u{F19DD}", + "trash-can": "\u{F0A79}", + "trash-can-outline": "\u{F0A7A}", + "tray": "\u{F1294}", + "tray-alert": "\u{F1295}", + "tray-arrow-down": "\u{F0120}", + "tray-arrow-up": "\u{F011D}", + "tray-full": "\u{F1296}", + "tray-minus": "\u{F1297}", + "tray-plus": "\u{F1298}", + "tray-remove": "\u{F1299}", + "treasure-chest": "\u{F0726}", + "treasure-chest-outline": "\u{F1C77}", + "tree": "\u{F0531}", + "tree-outline": "\u{F0E69}", + "trello": "\u{F0532}", + "trending-down": "\u{F0533}", + "trending-neutral": "\u{F0534}", + "trending-up": "\u{F0535}", + "triangle": "\u{F0536}", + "triangle-down": "\u{F1C56}", + "triangle-down-outline": "\u{F1C57}", + "triangle-outline": "\u{F0537}", + "triangle-small-down": "\u{F1A09}", + "triangle-small-up": "\u{F1A0A}", + "triangle-wave": "\u{F147C}", + "triforce": "\u{F0BD9}", + "trophy": "\u{F0538}", + "trophy-award": "\u{F0539}", + "trophy-broken": "\u{F0DA4}", + "trophy-outline": "\u{F053A}", + "trophy-variant": "\u{F053B}", + "trophy-variant-outline": "\u{F053C}", + "truck": "\u{F053D}", + "truck-alert": "\u{F19DE}", + "truck-alert-outline": "\u{F19DF}", + "truck-cargo-container": "\u{F18D8}", + "truck-check": "\u{F0CD4}", + "truck-check-outline": "\u{F129A}", + "truck-delivery": "\u{F053E}", + "truck-delivery-outline": "\u{F129B}", + "truck-fast": "\u{F0788}", + "truck-fast-outline": "\u{F129C}", + "truck-flatbed": "\u{F1891}", + "truck-minus": "\u{F19AE}", + "truck-minus-outline": "\u{F19BD}", + "truck-outline": "\u{F129D}", + "truck-plus": "\u{F19AD}", + "truck-plus-outline": "\u{F19BC}", + "truck-remove": "\u{F19AF}", + "truck-remove-outline": "\u{F19BE}", + "truck-snowflake": "\u{F19A6}", + "truck-trailer": "\u{F0727}", + "trumpet": "\u{F1096}", + "tshirt-crew": "\u{F0A7B}", + "tshirt-crew-outline": "\u{F053F}", + "tshirt-v": "\u{F0A7C}", + "tshirt-v-outline": "\u{F0540}", + "tsunami": "\u{F1A81}", + "tumble-dryer": "\u{F0917}", + "tumble-dryer-alert": "\u{F11BA}", + "tumble-dryer-off": "\u{F11BB}", + "tune": "\u{F062E}", + "tune-variant": "\u{F1542}", + "tune-vertical": "\u{F066A}", + "tune-vertical-variant": "\u{F1543}", + "tunnel": "\u{F183D}", + "tunnel-outline": "\u{F183E}", + "turbine": "\u{F1A82}", + "turkey": "\u{F171B}", + "turnstile": "\u{F0CD5}", + "turnstile-outline": "\u{F0CD6}", + "turtle": "\u{F0CD7}", + "twitch": "\u{F0543}", + "twitter": "\u{F0544}", + "two-factor-authentication": "\u{F09AF}", + "typewriter": "\u{F0F2D}", + "ubisoft": "\u{F0BDA}", + "ubuntu": "\u{F0548}", + "ufo": "\u{F10C4}", + "ufo-outline": "\u{F10C5}", + "ultra-high-definition": "\u{F07F9}", + "umbraco": "\u{F0549}", + "umbrella": "\u{F054A}", + "umbrella-beach": "\u{F188A}", + "umbrella-beach-outline": "\u{F188B}", + "umbrella-closed": "\u{F09B0}", + "umbrella-closed-outline": "\u{F13E2}", + "umbrella-closed-variant": "\u{F13E1}", + "umbrella-outline": "\u{F054B}", + "undo": "\u{F054C}", + "undo-variant": "\u{F054D}", + "unfold-less-horizontal": "\u{F054E}", + "unfold-less-vertical": "\u{F0760}", + "unfold-more-horizontal": "\u{F054F}", + "unfold-more-vertical": "\u{F0761}", + "ungroup": "\u{F0550}", + "unicode": "\u{F0ED0}", + "unicorn": "\u{F15C2}", + "unicorn-variant": "\u{F15C3}", + "unicycle": "\u{F15E5}", + "unity": "\u{F06AF}", + "unreal": "\u{F09B1}", + "update": "\u{F06B0}", + "upload": "\u{F0552}", + "upload-lock": "\u{F1373}", + "upload-lock-outline": "\u{F1374}", + "upload-multiple": "\u{F083D}", + "upload-network": "\u{F06F6}", + "upload-network-outline": "\u{F0CD8}", + "upload-off": "\u{F10C6}", + "upload-off-outline": "\u{F10C7}", + "upload-outline": "\u{F0E07}", + "usb": "\u{F0553}", + "usb-flash-drive": "\u{F129E}", + "usb-flash-drive-outline": "\u{F129F}", + "usb-port": "\u{F11F0}", + "vacuum": "\u{F19A1}", + "vacuum-outline": "\u{F19A2}", + "valve": "\u{F1066}", + "valve-closed": "\u{F1067}", + "valve-open": "\u{F1068}", + "van-passenger": "\u{F07FA}", + "van-utility": "\u{F07FB}", + "vanish": "\u{F07FC}", + "vanish-quarter": "\u{F1554}", + "vanity-light": "\u{F11E1}", + "variable": "\u{F0AE7}", + "variable-box": "\u{F1111}", + "vector-arrange-above": "\u{F0554}", + "vector-arrange-below": "\u{F0555}", + "vector-bezier": "\u{F0AE8}", + "vector-circle": "\u{F0556}", + "vector-circle-variant": "\u{F0557}", + "vector-combine": "\u{F0558}", + "vector-curve": "\u{F0559}", + "vector-difference": "\u{F055A}", + "vector-difference-ab": "\u{F055B}", + "vector-difference-ba": "\u{F055C}", + "vector-ellipse": "\u{F0893}", + "vector-intersection": "\u{F055D}", + "vector-line": "\u{F055E}", + "vector-link": "\u{F0FE8}", + "vector-point": "\u{F01C4}", + "vector-point-edit": "\u{F09E8}", + "vector-point-minus": "\u{F1B78}", + "vector-point-plus": "\u{F1B79}", + "vector-point-select": "\u{F055F}", + "vector-polygon": "\u{F0560}", + "vector-polygon-variant": "\u{F1856}", + "vector-polyline": "\u{F0561}", + "vector-polyline-edit": "\u{F1225}", + "vector-polyline-minus": "\u{F1226}", + "vector-polyline-plus": "\u{F1227}", + "vector-polyline-remove": "\u{F1228}", + "vector-radius": "\u{F074A}", + "vector-rectangle": "\u{F05C6}", + "vector-selection": "\u{F0562}", + "vector-square": "\u{F0001}", + "vector-square-close": "\u{F1857}", + "vector-square-edit": "\u{F18D9}", + "vector-square-minus": "\u{F18DA}", + "vector-square-open": "\u{F1858}", + "vector-square-plus": "\u{F18DB}", + "vector-square-remove": "\u{F18DC}", + "vector-triangle": "\u{F0563}", + "vector-union": "\u{F0564}", + "vhs": "\u{F0A1B}", + "vibrate": "\u{F0566}", + "vibrate-off": "\u{F0CD9}", + "video": "\u{F0567}", + "video-2d": "\u{F1A1C}", + "video-3d": "\u{F07FD}", + "video-3d-off": "\u{F13D9}", + "video-3d-variant": "\u{F0ED1}", + "video-4k-box": "\u{F083E}", + "video-account": "\u{F0919}", + "video-box": "\u{F00FD}", + "video-box-off": "\u{F00FE}", + "video-check": "\u{F1069}", + "video-check-outline": "\u{F106A}", + "video-high-definition": "\u{F152E}", + "video-image": "\u{F091A}", + "video-input-antenna": "\u{F083F}", + "video-input-component": "\u{F0840}", + "video-input-hdmi": "\u{F0841}", + "video-input-scart": "\u{F0F8C}", + "video-input-svideo": "\u{F0842}", + "video-marker": "\u{F19A9}", + "video-marker-outline": "\u{F19AA}", + "video-minus": "\u{F09B2}", + "video-minus-outline": "\u{F02BA}", + "video-off": "\u{F0568}", + "video-off-outline": "\u{F0BDB}", + "video-outline": "\u{F0BDC}", + "video-plus": "\u{F09B3}", + "video-plus-outline": "\u{F01D3}", + "video-stabilization": "\u{F091B}", + "video-switch": "\u{F0569}", + "video-switch-outline": "\u{F0790}", + "video-vintage": "\u{F0A1C}", + "video-wireless": "\u{F0ED2}", + "video-wireless-outline": "\u{F0ED3}", + "view-agenda": "\u{F056A}", + "view-agenda-outline": "\u{F11D8}", + "view-array": "\u{F056B}", + "view-array-outline": "\u{F1485}", + "view-carousel": "\u{F056C}", + "view-carousel-outline": "\u{F1486}", + "view-column": "\u{F056D}", + "view-column-outline": "\u{F1487}", + "view-comfy": "\u{F0E6A}", + "view-comfy-outline": "\u{F1488}", + "view-compact": "\u{F0E6B}", + "view-compact-outline": "\u{F0E6C}", + "view-dashboard": "\u{F056E}", + "view-dashboard-edit": "\u{F1947}", + "view-dashboard-edit-outline": "\u{F1948}", + "view-dashboard-outline": "\u{F0A1D}", + "view-dashboard-variant": "\u{F0843}", + "view-dashboard-variant-outline": "\u{F1489}", + "view-day": "\u{F056F}", + "view-day-outline": "\u{F148A}", + "view-gallery": "\u{F1888}", + "view-gallery-outline": "\u{F1889}", + "view-grid": "\u{F0570}", + "view-grid-compact": "\u{F1C61}", + "view-grid-outline": "\u{F11D9}", + "view-grid-plus": "\u{F0F8D}", + "view-grid-plus-outline": "\u{F11DA}", + "view-headline": "\u{F0571}", + "view-list": "\u{F0572}", + "view-list-outline": "\u{F148B}", + "view-module": "\u{F0573}", + "view-module-outline": "\u{F148C}", + "view-parallel": "\u{F0728}", + "view-parallel-outline": "\u{F148D}", + "view-quilt": "\u{F0574}", + "view-quilt-outline": "\u{F148E}", + "view-sequential": "\u{F0729}", + "view-sequential-outline": "\u{F148F}", + "view-split-horizontal": "\u{F0BCB}", + "view-split-vertical": "\u{F0BCC}", + "view-stream": "\u{F0575}", + "view-stream-outline": "\u{F1490}", + "view-week": "\u{F0576}", + "view-week-outline": "\u{F1491}", + "vimeo": "\u{F0577}", + "violin": "\u{F060F}", + "virtual-reality": "\u{F0894}", + "virus": "\u{F13B6}", + "virus-off": "\u{F18E1}", + "virus-off-outline": "\u{F18E2}", + "virus-outline": "\u{F13B7}", + "vlc": "\u{F057C}", + "voicemail": "\u{F057D}", + "volcano": "\u{F1A83}", + "volcano-outline": "\u{F1A84}", + "volleyball": "\u{F09B4}", + "volume-equal": "\u{F1B10}", + "volume-high": "\u{F057E}", + "volume-low": "\u{F057F}", + "volume-medium": "\u{F0580}", + "volume-minus": "\u{F075E}", + "volume-mute": "\u{F075F}", + "volume-off": "\u{F0581}", + "volume-plus": "\u{F075D}", + "volume-source": "\u{F1120}", + "volume-variant-off": "\u{F0E08}", + "volume-vibrate": "\u{F1121}", + "vote": "\u{F0A1F}", + "vote-outline": "\u{F0A20}", + "vpn": "\u{F0582}", + "vuejs": "\u{F0844}", + "vuetify": "\u{F0E6D}", + "walk": "\u{F0583}", + "wall": "\u{F07FE}", + "wall-fire": "\u{F1A11}", + "wall-sconce": "\u{F091C}", + "wall-sconce-flat": "\u{F091D}", + "wall-sconce-flat-outline": "\u{F17C9}", + "wall-sconce-flat-variant": "\u{F041C}", + "wall-sconce-flat-variant-outline": "\u{F17CA}", + "wall-sconce-outline": "\u{F17CB}", + "wall-sconce-round": "\u{F0748}", + "wall-sconce-round-outline": "\u{F17CC}", + "wall-sconce-round-variant": "\u{F091E}", + "wall-sconce-round-variant-outline": "\u{F17CD}", + "wallet": "\u{F0584}", + "wallet-bifold": "\u{F1C58}", + "wallet-bifold-outline": "\u{F1C59}", + "wallet-giftcard": "\u{F0585}", + "wallet-membership": "\u{F0586}", + "wallet-outline": "\u{F0BDD}", + "wallet-plus": "\u{F0F8E}", + "wallet-plus-outline": "\u{F0F8F}", + "wallet-travel": "\u{F0587}", + "wallpaper": "\u{F0E09}", + "wan": "\u{F0588}", + "wardrobe": "\u{F0F90}", + "wardrobe-outline": "\u{F0F91}", + "warehouse": "\u{F0F81}", + "washing-machine": "\u{F072A}", + "washing-machine-alert": "\u{F11BC}", + "washing-machine-off": "\u{F11BD}", + "watch": "\u{F0589}", + "watch-export": "\u{F058A}", + "watch-export-variant": "\u{F0895}", + "watch-import": "\u{F058B}", + "watch-import-variant": "\u{F0896}", + "watch-variant": "\u{F0897}", + "watch-vibrate": "\u{F06B1}", + "watch-vibrate-off": "\u{F0CDA}", + "water": "\u{F058C}", + "water-alert": "\u{F1502}", + "water-alert-outline": "\u{F1503}", + "water-boiler": "\u{F0F92}", + "water-boiler-alert": "\u{F11B3}", + "water-boiler-auto": "\u{F1B98}", + "water-boiler-off": "\u{F11B4}", + "water-check": "\u{F1504}", + "water-check-outline": "\u{F1505}", + "water-circle": "\u{F1806}", + "water-minus": "\u{F1506}", + "water-minus-outline": "\u{F1507}", + "water-off": "\u{F058D}", + "water-off-outline": "\u{F1508}", + "water-opacity": "\u{F1855}", + "water-outline": "\u{F0E0A}", + "water-percent": "\u{F058E}", + "water-percent-alert": "\u{F1509}", + "water-plus": "\u{F150A}", + "water-plus-outline": "\u{F150B}", + "water-polo": "\u{F12A0}", + "water-pump": "\u{F058F}", + "water-pump-off": "\u{F0F93}", + "water-remove": "\u{F150C}", + "water-remove-outline": "\u{F150D}", + "water-sync": "\u{F17C6}", + "water-thermometer": "\u{F1A85}", + "water-thermometer-outline": "\u{F1A86}", + "water-well": "\u{F106B}", + "water-well-outline": "\u{F106C}", + "waterfall": "\u{F1849}", + "watering-can": "\u{F1481}", + "watering-can-outline": "\u{F1482}", + "watermark": "\u{F0612}", + "wave": "\u{F0F2E}", + "waveform": "\u{F147D}", + "waves": "\u{F078D}", + "waves-arrow-left": "\u{F1859}", + "waves-arrow-right": "\u{F185A}", + "waves-arrow-up": "\u{F185B}", + "waze": "\u{F0BDE}", + "weather-cloudy": "\u{F0590}", + "weather-cloudy-alert": "\u{F0F2F}", + "weather-cloudy-arrow-right": "\u{F0E6E}", + "weather-cloudy-clock": "\u{F18F6}", + "weather-dust": "\u{F1B5A}", + "weather-fog": "\u{F0591}", + "weather-hail": "\u{F0592}", + "weather-hazy": "\u{F0F30}", + "weather-hurricane": "\u{F0898}", + "weather-hurricane-outline": "\u{F1C78}", + "weather-lightning": "\u{F0593}", + "weather-lightning-rainy": "\u{F067E}", + "weather-night": "\u{F0594}", + "weather-night-partly-cloudy": "\u{F0F31}", + "weather-partly-cloudy": "\u{F0595}", + "weather-partly-lightning": "\u{F0F32}", + "weather-partly-rainy": "\u{F0F33}", + "weather-partly-snowy": "\u{F0F34}", + "weather-partly-snowy-rainy": "\u{F0F35}", + "weather-pouring": "\u{F0596}", + "weather-rainy": "\u{F0597}", + "weather-snowy": "\u{F0598}", + "weather-snowy-heavy": "\u{F0F36}", + "weather-snowy-rainy": "\u{F067F}", + "weather-sunny": "\u{F0599}", + "weather-sunny-alert": "\u{F0F37}", + "weather-sunny-off": "\u{F14E4}", + "weather-sunset": "\u{F059A}", + "weather-sunset-down": "\u{F059B}", + "weather-sunset-up": "\u{F059C}", + "weather-tornado": "\u{F0F38}", + "weather-windy": "\u{F059D}", + "weather-windy-variant": "\u{F059E}", + "web": "\u{F059F}", + "web-box": "\u{F0F94}", + "web-cancel": "\u{F1790}", + "web-check": "\u{F0789}", + "web-clock": "\u{F124A}", + "web-minus": "\u{F10A0}", + "web-off": "\u{F0A8E}", + "web-plus": "\u{F0033}", + "web-refresh": "\u{F1791}", + "web-remove": "\u{F0551}", + "web-sync": "\u{F1792}", + "webcam": "\u{F05A0}", + "webcam-off": "\u{F1737}", + "webhook": "\u{F062F}", + "webpack": "\u{F072B}", + "webrtc": "\u{F1248}", + "wechat": "\u{F0611}", + "weight": "\u{F05A1}", + "weight-gram": "\u{F0D3F}", + "weight-kilogram": "\u{F05A2}", + "weight-lifter": "\u{F115D}", + "weight-pound": "\u{F09B5}", + "whatsapp": "\u{F05A3}", + "wheel-barrow": "\u{F14F2}", + "wheelchair": "\u{F1A87}", + "wheelchair-accessibility": "\u{F05A4}", + "whistle": "\u{F09B6}", + "whistle-outline": "\u{F12BC}", + "white-balance-auto": "\u{F05A5}", + "white-balance-incandescent": "\u{F05A6}", + "white-balance-iridescent": "\u{F05A7}", + "white-balance-sunny": "\u{F05A8}", + "widgets": "\u{F072C}", + "widgets-outline": "\u{F1355}", + "wifi": "\u{F05A9}", + "wifi-alert": "\u{F16B5}", + "wifi-arrow-down": "\u{F16B6}", + "wifi-arrow-left": "\u{F16B7}", + "wifi-arrow-left-right": "\u{F16B8}", + "wifi-arrow-right": "\u{F16B9}", + "wifi-arrow-up": "\u{F16BA}", + "wifi-arrow-up-down": "\u{F16BB}", + "wifi-cancel": "\u{F16BC}", + "wifi-check": "\u{F16BD}", + "wifi-cog": "\u{F16BE}", + "wifi-lock": "\u{F16BF}", + "wifi-lock-open": "\u{F16C0}", + "wifi-marker": "\u{F16C1}", + "wifi-minus": "\u{F16C2}", + "wifi-off": "\u{F05AA}", + "wifi-plus": "\u{F16C3}", + "wifi-refresh": "\u{F16C4}", + "wifi-remove": "\u{F16C5}", + "wifi-settings": "\u{F16C6}", + "wifi-star": "\u{F0E0B}", + "wifi-strength-1": "\u{F091F}", + "wifi-strength-1-alert": "\u{F0920}", + "wifi-strength-1-lock": "\u{F0921}", + "wifi-strength-1-lock-open": "\u{F16CB}", + "wifi-strength-2": "\u{F0922}", + "wifi-strength-2-alert": "\u{F0923}", + "wifi-strength-2-lock": "\u{F0924}", + "wifi-strength-2-lock-open": "\u{F16CC}", + "wifi-strength-3": "\u{F0925}", + "wifi-strength-3-alert": "\u{F0926}", + "wifi-strength-3-lock": "\u{F0927}", + "wifi-strength-3-lock-open": "\u{F16CD}", + "wifi-strength-4": "\u{F0928}", + "wifi-strength-4-alert": "\u{F0929}", + "wifi-strength-4-lock": "\u{F092A}", + "wifi-strength-4-lock-open": "\u{F16CE}", + "wifi-strength-alert-outline": "\u{F092B}", + "wifi-strength-lock-open-outline": "\u{F16CF}", + "wifi-strength-lock-outline": "\u{F092C}", + "wifi-strength-off": "\u{F092D}", + "wifi-strength-off-outline": "\u{F092E}", + "wifi-strength-outline": "\u{F092F}", + "wifi-sync": "\u{F16C7}", + "wikipedia": "\u{F05AC}", + "wind-power": "\u{F1A88}", + "wind-power-outline": "\u{F1A89}", + "wind-turbine": "\u{F0DA5}", + "wind-turbine-alert": "\u{F19AB}", + "wind-turbine-check": "\u{F19AC}", + "window-close": "\u{F05AD}", + "window-closed": "\u{F05AE}", + "window-closed-variant": "\u{F11DB}", + "window-maximize": "\u{F05AF}", + "window-minimize": "\u{F05B0}", + "window-open": "\u{F05B1}", + "window-open-variant": "\u{F11DC}", + "window-restore": "\u{F05B2}", + "window-shutter": "\u{F111C}", + "window-shutter-alert": "\u{F111D}", + "window-shutter-auto": "\u{F1BA3}", + "window-shutter-cog": "\u{F1A8A}", + "window-shutter-open": "\u{F111E}", + "window-shutter-settings": "\u{F1A8B}", + "windsock": "\u{F15FA}", + "wiper": "\u{F0AE9}", + "wiper-wash": "\u{F0DA6}", + "wiper-wash-alert": "\u{F18DF}", + "wizard-hat": "\u{F1477}", + "wordpress": "\u{F05B4}", + "wrap": "\u{F05B6}", + "wrap-disabled": "\u{F0BDF}", + "wrench": "\u{F05B7}", + "wrench-check": "\u{F1B8F}", + "wrench-check-outline": "\u{F1B90}", + "wrench-clock": "\u{F19A3}", + "wrench-clock-outline": "\u{F1B93}", + "wrench-cog": "\u{F1B91}", + "wrench-cog-outline": "\u{F1B92}", + "wrench-outline": "\u{F0BE0}", + "xamarin": "\u{F0845}", + "xml": "\u{F05C0}", + "xmpp": "\u{F07FF}", + "yahoo": "\u{F0B4F}", + "yeast": "\u{F05C1}", + "yin-yang": "\u{F0680}", + "yoga": "\u{F117C}", + "youtube": "\u{F05C3}", + "youtube-gaming": "\u{F0848}", + "youtube-studio": "\u{F0847}", + "youtube-subscription": "\u{F0D40}", + "youtube-tv": "\u{F0448}", + "yurt": "\u{F1516}", + "z-wave": "\u{F0AEA}", + "zend": "\u{F0AEB}", + "zigbee": "\u{F0D41}", + "zip-box": "\u{F05C4}", + "zip-box-outline": "\u{F0FFA}", + "zip-disk": "\u{F0A23}", + "zodiac-aquarius": "\u{F0A7D}", + "zodiac-aries": "\u{F0A7E}", + "zodiac-cancer": "\u{F0A7F}", + "zodiac-capricorn": "\u{F0A80}", + "zodiac-gemini": "\u{F0A81}", + "zodiac-leo": "\u{F0A82}", + "zodiac-libra": "\u{F0A83}", + "zodiac-pisces": "\u{F0A84}", + "zodiac-sagittarius": "\u{F0A85}", + "zodiac-scorpio": "\u{F0A86}", + "zodiac-taurus": "\u{F0A87}", + "zodiac-virgo": "\u{F0A88}", +}; + +// Define the font face +let customFont = new FontFace('materialdesignicons', 'url(/plugin_assets/redmine_gtt/materialdesignicons-webfont.woff2)'); + +// Load the font +const fontPromise = customFont.load().then((font) => { + // Add the loaded font to the document + document.fonts.add(font); + + // Add the definitions + FontSymbol.addDefs( + { + font: 'Material Design Icons', + name: 'Material Design Icons', + copyright: 'Apache-2.0', + prefix: 'mdi' + }, + iconMappings + ); + + // Create a FontFaceObserver instance + const observer = new FontFaceObserver('custom-icons'); + + // Use the observer to wait for the font to be loaded + return observer.load(); +}).catch((error) => { + console.error('Error loading font:', error); +}); + +export { fontPromise }; +export default FontSymbol; diff --git a/assets/images/map.png b/src/styles/images/map.png similarity index 100% rename from assets/images/map.png rename to src/styles/images/map.png diff --git a/src/styles/index.ts b/src/styles/index.ts new file mode 100644 index 00000000..2858ff50 --- /dev/null +++ b/src/styles/index.ts @@ -0,0 +1,21 @@ +// Import OpenLayers core stylesheet for displaying map elements properly +import 'ol/ol.css'; + +// Import OpenLayers extensions stylesheet for extended map functionality and styling +import 'ol-ext/dist/ol-ext.min.css'; + +// Import custom application-specific styles which provide overall look and feel +import './scss/app.scss'; + +// Import custom icons CSS file for adding custom icon designs in the application +import './icons/custom/custom-icons.css'; + +// Import custom icons definition JS file to define icon names, sizes, and variations +import './icons/custom/custom-icons-def'; + +// Import Material Design icons filled style CSS for using a large collection of Google-designed icons +// import '@material-design-icons/font/filled.css'; +import '@mdi/font/scss/materialdesignicons.scss'; + +// Import Material Design icons definition JS file to define icon names and variations +import './icons/material-design/material-design-def'; diff --git a/src/stylesheets/app.scss b/src/styles/scss/app.scss similarity index 56% rename from src/stylesheets/app.scss rename to src/styles/scss/app.scss index 8fdcde55..5e4642e5 100644 --- a/src/stylesheets/app.scss +++ b/src/styles/scss/app.scss @@ -16,7 +16,8 @@ background-color: #3f5872; } -.ol-control.ol-bar .ol-toggle.ol-active button:hover, .ol-control.ol-bar .ol-toggle.ol-active>button { +.ol-control.ol-bar .ol-toggle.ol-active button:hover, +.ol-control.ol-bar .ol-toggle.ol-active > button { background-color: #f1515c; color: #fff; } @@ -26,12 +27,14 @@ height: 400px; border: 1px solid #E4E4E4; } + #issue-form .ol-map { width: 100%; margin-bottom: 1em; } $breakpoint-tablet: 899px; + @media (max-width: $breakpoint-tablet) { .ol-map { height: 340px; @@ -43,6 +46,7 @@ $breakpoint-tablet: 899px; height: 32px; width: 32px; } + .ol-control button:hover { background-color: rgba(52, 73, 94, 1); } @@ -64,11 +68,12 @@ div.ol-rotate { right: 4.7rem; } -.ol-control.ol-bar.ol-top.ol-left, .ol-control.ol-bar.ol-top.ol-right { +.ol-control.ol-bar.ol-top.ol-left, +.ol-control.ol-bar.ol-top.ol-right { top: 5.0rem; } -.ol-touch .ol-layerswitcher>button { +.ol-touch .ol-layerswitcher > button { font-size: 1.5rem; } @@ -81,16 +86,31 @@ div.ol-rotate { line-height: initial; } -.tabular .ol-layerswitcher>button { +.tabular .ol-layerswitcher > button { font-size: 1.5rem; } -#admin-menu a.gtt { - background-image: url(../images/map.png); +.gtt-map-notification { + background-color: #f1515c; + color: #fff; + padding: 0.5em; + position: absolute; + top: 55%; + left: 50%; + transform: translate(-50%, -50%); +} + +// map.png icon as data URI +$data-uri: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAK2SURBVBgZBcHLjxN1AADg79eZttvddttll+WxIGrAV4QYTbxoYsSLgjc5arx68qCGf8G7J+NBEg8e9GqURDEmEiOJAWNUwIi8sryWDbSdmc60Mx2/Lxw78caZ1fXVo1EUAYAAACAIgICymrt/7/6P8er66tHPPzklNIJyPgNAENRqAWSzBEFdN9TzWq3y0ckPj8ZRFKmUwuxL6fcXrJzJbJ18xFKv6/LlX1xMP3Nra6jXW3Z3eyiKm0Zp7t1jtWYcaQAMh9uGT7eMkkR2+m9JcluSJEJxQTEZm2Rj00liMkmUeSqEOYI4APr9ndQzi+/v4OPz2m+tWd+zV2d2xaQ8pDfoaUUNcbMlyXIhFAgaQDAcDiXJ2MP1ymilNPn6X6q5OvvZrEhk49SsyBR5alpkQqhBDNDvr1PPDPrLhu89Y+XTbeUre7TXCo9MtzW7+y22I81W0zibYkSgQQB5XkiTzHA0NF6qPHiC/Iv/1FWuMf1WPklMi1SeJubTVABBHACdzkB3OdVfXgbNtx/V+eCsuDpg7+pf8s7ERvcP7daW6eSaqPGOgDgAxsNUkhRI/bZ5x41Zw66DlSdPXbZ5PLUr+kYx+slg8Yj2uW1hNRPQEIKA5cFuFgZ+z0rXpk2DwU53XjtgX7xisrXXoDuycX1B54dLbrQqdbMFYqjr2rmbV13YvKTb7cnzXJKkkqLw61MNh7+6Ijl/3eZK0+3nHzdqBvtbbRAHZGVqq5ppt7qWOn15MdVd6Or/ed2+W5lWkwfPHnbzsZZ2e8HStKCuQUwQQkPPsknItKuOxdC16+I9rc2Jqy8dURxMvHz2oX/27xa1m5irZqWAuCwrVVXZ2PGcjVUCCMIhvMpaCCC8OPdCNBMttESNSDWvlFUlvHni+Hc719dej5oxggAIAAAIAIGyrGzd3Tr9P5JrNp8Zt4rCAAAAAElFTkSuQmCC'); + +#admin-menu a.gtt, +#admin-menu a.gtt-tile-sources, +.icon-gtt-map { + background-image: $data-uri; } div.usermap h3 { - background: url(../images/map.png) no-repeat 0% 50%; + background: $data-uri no-repeat 0% 50%; padding-left: 20px; } @@ -106,7 +126,7 @@ i[id^='icon_settings_tracker_'] { top: 0.5em; } -.ol-control button .material-icons { +.ol-control button .material-design-icons { font-size: inherit; } diff --git a/src/stylesheets/CustomIconsDef.js b/src/stylesheets/CustomIconsDef.js deleted file mode 100644 index 116aa2b5..00000000 --- a/src/stylesheets/CustomIconsDef.js +++ /dev/null @@ -1,15 +0,0 @@ -import ol_style_FontSymbol from 'ol-ext/style/FontSymbol' - -ol_style_FontSymbol.addDefs( -{ "font":"custom-icons", - "name":"Custom Icons", - "copyright":"Apache-2.0", - "prefix": "gtt" -}, -{ "lobsta": "\uf101", - "park_bench": "\uf102", - "road": "\uf103", - "waste": "\uf104" -}); - -export default ol_style_FontSymbol diff --git a/src/stylesheets/MaterialDesignDef.js b/src/stylesheets/MaterialDesignDef.js deleted file mode 100644 index cee4eddf..00000000 --- a/src/stylesheets/MaterialDesignDef.js +++ /dev/null @@ -1,2243 +0,0 @@ -import ol_style_FontSymbol from 'ol-ext/style/FontSymbol' - -ol_style_FontSymbol.addDefs( -{ "font":"Material Icons", - "name":"Material Icons", - "copyright":"Apache-2.0", - "prefix": "mdi" -}, -{ "10k": "\ue951", - "10mp": "\ue952", - "11mp": "\ue953", - "123": "\ueb8d", - "12mp": "\ue954", - "13mp": "\ue955", - "14mp": "\ue956", - "15mp": "\ue957", - "16mp": "\ue958", - "17mp": "\ue959", - "18_up_rating": "\uf8fd", - "18mp": "\ue95a", - "19mp": "\ue95b", - "1k": "\ue95c", - "1k_plus": "\ue95d", - "1x_mobiledata": "\uefcd", - "20mp": "\ue95e", - "21mp": "\ue95f", - "22mp": "\ue960", - "23mp": "\ue961", - "24mp": "\ue962", - "2k": "\ue963", - "2k_plus": "\ue964", - "2mp": "\ue965", - "30fps": "\uefce", - "30fps_select": "\uefcf", - "360": "\ue577", - "3d_rotation": "\ue84d", - "3g_mobiledata": "\uefd0", - "3k": "\ue966", - "3k_plus": "\ue967", - "3mp": "\ue968", - "3p": "\uefd1", - "4g_mobiledata": "\uefd2", - "4g_plus_mobiledata": "\uefd3", - "4k": "\ue072", - "4k_plus": "\ue969", - "4mp": "\ue96a", - "5g": "\uef38", - "5k": "\ue96b", - "5k_plus": "\ue96c", - "5mp": "\ue96d", - "60fps": "\uefd4", - "60fps_select": "\uefd5", - "6_ft_apart": "\uf21e", - "6k": "\ue96e", - "6k_plus": "\ue96f", - "6mp": "\ue970", - "7k": "\ue971", - "7k_plus": "\ue972", - "7mp": "\ue973", - "8k": "\ue974", - "8k_plus": "\ue975", - "8mp": "\ue976", - "9k": "\ue977", - "9k_plus": "\ue978", - "9mp": "\ue979", - "abc": "\ueb94", - "ac_unit": "\ueb3b", - "access_alarm": "\ue190", - "access_alarms": "\ue191", - "access_time": "\ue192", - "access_time_filled": "\uefd6", - "accessibility": "\ue84e", - "accessibility_new": "\ue92c", - "accessible": "\ue914", - "accessible_forward": "\ue934", - "account_balance": "\ue84f", - "account_balance_wallet": "\ue850", - "account_box": "\ue851", - "account_circle": "\ue853", - "account_tree": "\ue97a", - "ad_units": "\uef39", - "adb": "\ue60e", - "add": "\ue145", - "add_a_photo": "\ue439", - "add_alarm": "\ue193", - "add_alert": "\ue003", - "add_box": "\ue146", - "add_business": "\ue729", - "add_call": "\ue0e8", - "add_card": "\ueb86", - "add_chart": "\ue97b", - "add_circle": "\ue147", - "add_circle_outline": "\ue148", - "add_comment": "\ue266", - "add_home": "\uf8eb", - "add_home_work": "\uf8ed", - "add_ic_call": "\ue97c", - "add_link": "\ue178", - "add_location": "\ue567", - "add_location_alt": "\uef3a", - "add_moderator": "\ue97d", - "add_photo_alternate": "\ue43e", - "add_reaction": "\ue1d3", - "add_road": "\uef3b", - "add_shopping_cart": "\ue854", - "add_task": "\uf23a", - "add_to_drive": "\ue65c", - "add_to_home_screen": "\ue1fe", - "add_to_photos": "\ue39d", - "add_to_queue": "\ue05c", - "addchart": "\uef3c", - "adf_scanner": "\ueada", - "adjust": "\ue39e", - "admin_panel_settings": "\uef3d", - "adobe": "\uea96", - "ads_click": "\ue762", - "agriculture": "\uea79", - "air": "\uefd8", - "airline_seat_flat": "\ue630", - "airline_seat_flat_angled": "\ue631", - "airline_seat_individual_suite": "\ue632", - "airline_seat_legroom_extra": "\ue633", - "airline_seat_legroom_normal": "\ue634", - "airline_seat_legroom_reduced": "\ue635", - "airline_seat_recline_extra": "\ue636", - "airline_seat_recline_normal": "\ue637", - "airline_stops": "\ue7d0", - "airlines": "\ue7ca", - "airplane_ticket": "\uefd9", - "airplanemode_active": "\ue195", - "airplanemode_inactive": "\ue194", - "airplanemode_off": "\ue194", - "airplanemode_on": "\ue195", - "airplay": "\ue055", - "airport_shuttle": "\ueb3c", - "alarm": "\ue855", - "alarm_add": "\ue856", - "alarm_off": "\ue857", - "alarm_on": "\ue858", - "album": "\ue019", - "align_horizontal_center": "\ue00f", - "align_horizontal_left": "\ue00d", - "align_horizontal_right": "\ue010", - "align_vertical_bottom": "\ue015", - "align_vertical_center": "\ue011", - "align_vertical_top": "\ue00c", - "all_inbox": "\ue97f", - "all_inclusive": "\ueb3d", - "all_out": "\ue90b", - "alt_route": "\uf184", - "alternate_email": "\ue0e6", - "amp_stories": "\uea13", - "analytics": "\uef3e", - "anchor": "\uf1cd", - "android": "\ue859", - "animation": "\ue71c", - "announcement": "\ue85a", - "aod": "\uefda", - "apartment": "\uea40", - "api": "\uf1b7", - "app_blocking": "\uef3f", - "app_registration": "\uef40", - "app_settings_alt": "\uef41", - "app_shortcut": "\ueae4", - "apple": "\uea80", - "approval": "\ue982", - "apps": "\ue5c3", - "apps_outage": "\ue7cc", - "architecture": "\uea3b", - "archive": "\ue149", - "area_chart": "\ue770", - "arrow_back": "\ue5c4", - "arrow_back_ios": "\ue5e0", - "arrow_back_ios_new": "\ue2ea", - "arrow_circle_down": "\uf181", - "arrow_circle_left": "\ueaa7", - "arrow_circle_right": "\ueaaa", - "arrow_circle_up": "\uf182", - "arrow_downward": "\ue5db", - "arrow_drop_down": "\ue5c5", - "arrow_drop_down_circle": "\ue5c6", - "arrow_drop_up": "\ue5c7", - "arrow_forward": "\ue5c8", - "arrow_forward_ios": "\ue5e1", - "arrow_left": "\ue5de", - "arrow_outward": "\uf8ce", - "arrow_right": "\ue5df", - "arrow_right_alt": "\ue941", - "arrow_upward": "\ue5d8", - "art_track": "\ue060", - "article": "\uef42", - "aspect_ratio": "\ue85b", - "assessment": "\ue85c", - "assignment": "\ue85d", - "assignment_ind": "\ue85e", - "assignment_late": "\ue85f", - "assignment_return": "\ue860", - "assignment_returned": "\ue861", - "assignment_turned_in": "\ue862", - "assist_walker": "\uf8d5", - "assistant": "\ue39f", - "assistant_direction": "\ue988", - "assistant_navigation": "\ue989", - "assistant_photo": "\ue3a0", - "assured_workload": "\ueb6f", - "atm": "\ue573", - "attach_email": "\uea5e", - "attach_file": "\ue226", - "attach_money": "\ue227", - "attachment": "\ue2bc", - "attractions": "\uea52", - "attribution": "\uefdb", - "audio_file": "\ueb82", - "audiotrack": "\ue3a1", - "auto_awesome": "\ue65f", - "auto_awesome_mosaic": "\ue660", - "auto_awesome_motion": "\ue661", - "auto_delete": "\uea4c", - "auto_fix_high": "\ue663", - "auto_fix_normal": "\ue664", - "auto_fix_off": "\ue665", - "auto_graph": "\ue4fb", - "auto_mode": "\uec20", - "auto_stories": "\ue666", - "autofps_select": "\uefdc", - "autorenew": "\ue863", - "av_timer": "\ue01b", - "baby_changing_station": "\uf19b", - "back_hand": "\ue764", - "backpack": "\uf19c", - "backspace": "\ue14a", - "backup": "\ue864", - "backup_table": "\uef43", - "badge": "\uea67", - "bakery_dining": "\uea53", - "balance": "\ueaf6", - "balcony": "\ue58f", - "ballot": "\ue172", - "bar_chart": "\ue26b", - "barcode_reader": "\uf85c", - "batch_prediction": "\uf0f5", - "bathroom": "\uefdd", - "bathtub": "\uea41", - "battery_0_bar": "\uebdc", - "battery_1_bar": "\uebd9", - "battery_2_bar": "\uebe0", - "battery_3_bar": "\uebdd", - "battery_4_bar": "\uebe2", - "battery_5_bar": "\uebd4", - "battery_6_bar": "\uebd2", - "battery_alert": "\ue19c", - "battery_charging_full": "\ue1a3", - "battery_full": "\ue1a4", - "battery_saver": "\uefde", - "battery_std": "\ue1a5", - "battery_unknown": "\ue1a6", - "beach_access": "\ueb3e", - "bed": "\uefdf", - "bedroom_baby": "\uefe0", - "bedroom_child": "\uefe1", - "bedroom_parent": "\uefe2", - "bedtime": "\uef44", - "bedtime_off": "\ueb76", - "beenhere": "\ue52d", - "bento": "\uf1f4", - "bike_scooter": "\uef45", - "biotech": "\uea3a", - "blender": "\uefe3", - "blind": "\uf8d6", - "blinds": "\ue286", - "blinds_closed": "\uec1f", - "block": "\ue14b", - "block_flipped": "\uef46", - "bloodtype": "\uefe4", - "bluetooth": "\ue1a7", - "bluetooth_audio": "\ue60f", - "bluetooth_connected": "\ue1a8", - "bluetooth_disabled": "\ue1a9", - "bluetooth_drive": "\uefe5", - "bluetooth_searching": "\ue1aa", - "blur_circular": "\ue3a2", - "blur_linear": "\ue3a3", - "blur_off": "\ue3a4", - "blur_on": "\ue3a5", - "bolt": "\uea0b", - "book": "\ue865", - "book_online": "\uf217", - "bookmark": "\ue866", - "bookmark_add": "\ue598", - "bookmark_added": "\ue599", - "bookmark_border": "\ue867", - "bookmark_outline": "\ue867", - "bookmark_remove": "\ue59a", - "bookmarks": "\ue98b", - "border_all": "\ue228", - "border_bottom": "\ue229", - "border_clear": "\ue22a", - "border_color": "\ue22b", - "border_horizontal": "\ue22c", - "border_inner": "\ue22d", - "border_left": "\ue22e", - "border_outer": "\ue22f", - "border_right": "\ue230", - "border_style": "\ue231", - "border_top": "\ue232", - "border_vertical": "\ue233", - "boy": "\ueb67", - "branding_watermark": "\ue06b", - "breakfast_dining": "\uea54", - "brightness_1": "\ue3a6", - "brightness_2": "\ue3a7", - "brightness_3": "\ue3a8", - "brightness_4": "\ue3a9", - "brightness_5": "\ue3aa", - "brightness_6": "\ue3ab", - "brightness_7": "\ue3ac", - "brightness_auto": "\ue1ab", - "brightness_high": "\ue1ac", - "brightness_low": "\ue1ad", - "brightness_medium": "\ue1ae", - "broadcast_on_home": "\uf8f8", - "broadcast_on_personal": "\uf8f9", - "broken_image": "\ue3ad", - "browse_gallery": "\uebd1", - "browser_not_supported": "\uef47", - "browser_updated": "\ue7cf", - "brunch_dining": "\uea73", - "brush": "\ue3ae", - "bubble_chart": "\ue6dd", - "bug_report": "\ue868", - "build": "\ue869", - "build_circle": "\uef48", - "bungalow": "\ue591", - "burst_mode": "\ue43c", - "bus_alert": "\ue98f", - "business": "\ue0af", - "business_center": "\ueb3f", - "cabin": "\ue589", - "cable": "\uefe6", - "cached": "\ue86a", - "cake": "\ue7e9", - "calculate": "\uea5f", - "calendar_month": "\uebcc", - "calendar_today": "\ue935", - "calendar_view_day": "\ue936", - "calendar_view_month": "\uefe7", - "calendar_view_week": "\uefe8", - "call": "\ue0b0", - "call_end": "\ue0b1", - "call_made": "\ue0b2", - "call_merge": "\ue0b3", - "call_missed": "\ue0b4", - "call_missed_outgoing": "\ue0e4", - "call_received": "\ue0b5", - "call_split": "\ue0b6", - "call_to_action": "\ue06c", - "camera": "\ue3af", - "camera_alt": "\ue3b0", - "camera_enhance": "\ue8fc", - "camera_front": "\ue3b1", - "camera_indoor": "\uefe9", - "camera_outdoor": "\uefea", - "camera_rear": "\ue3b2", - "camera_roll": "\ue3b3", - "cameraswitch": "\uefeb", - "campaign": "\uef49", - "cancel": "\ue5c9", - "cancel_presentation": "\ue0e9", - "cancel_schedule_send": "\uea39", - "candlestick_chart": "\uead4", - "car_crash": "\uebf2", - "car_rental": "\uea55", - "car_repair": "\uea56", - "card_giftcard": "\ue8f6", - "card_membership": "\ue8f7", - "card_travel": "\ue8f8", - "carpenter": "\uf1f8", - "cases": "\ue992", - "casino": "\ueb40", - "cast": "\ue307", - "cast_connected": "\ue308", - "cast_for_education": "\uefec", - "castle": "\ueab1", - "catching_pokemon": "\ue508", - "category": "\ue574", - "celebration": "\uea65", - "cell_tower": "\uebba", - "cell_wifi": "\ue0ec", - "center_focus_strong": "\ue3b4", - "center_focus_weak": "\ue3b5", - "chair": "\uefed", - "chair_alt": "\uefee", - "chalet": "\ue585", - "change_circle": "\ue2e7", - "change_history": "\ue86b", - "charging_station": "\uf19d", - "chat": "\ue0b7", - "chat_bubble": "\ue0ca", - "chat_bubble_outline": "\ue0cb", - "check": "\ue5ca", - "check_box": "\ue834", - "check_box_outline_blank": "\ue835", - "check_circle": "\ue86c", - "check_circle_outline": "\ue92d", - "checklist": "\ue6b1", - "checklist_rtl": "\ue6b3", - "checkroom": "\uf19e", - "chevron_left": "\ue5cb", - "chevron_right": "\ue5cc", - "child_care": "\ueb41", - "child_friendly": "\ueb42", - "chrome_reader_mode": "\ue86d", - "church": "\ueaae", - "circle": "\uef4a", - "circle_notifications": "\ue994", - "class": "\ue86e", - "clean_hands": "\uf21f", - "cleaning_services": "\uf0ff", - "clear": "\ue14c", - "clear_all": "\ue0b8", - "close": "\ue5cd", - "close_fullscreen": "\uf1cf", - "closed_caption": "\ue01c", - "closed_caption_disabled": "\uf1dc", - "closed_caption_off": "\ue996", - "cloud": "\ue2bd", - "cloud_circle": "\ue2be", - "cloud_done": "\ue2bf", - "cloud_download": "\ue2c0", - "cloud_off": "\ue2c1", - "cloud_queue": "\ue2c2", - "cloud_sync": "\ueb5a", - "cloud_upload": "\ue2c3", - "cloudy_snowing": "\ue810", - "co2": "\ue7b0", - "co_present": "\ueaf0", - "code": "\ue86f", - "code_off": "\ue4f3", - "coffee": "\uefef", - "coffee_maker": "\ueff0", - "collections": "\ue3b6", - "collections_bookmark": "\ue431", - "color_lens": "\ue3b7", - "colorize": "\ue3b8", - "comment": "\ue0b9", - "comment_bank": "\uea4e", - "comments_disabled": "\ue7a2", - "commit": "\ueaf5", - "commute": "\ue940", - "compare": "\ue3b9", - "compare_arrows": "\ue915", - "compass_calibration": "\ue57c", - "compost": "\ue761", - "compress": "\ue94d", - "computer": "\ue30a", - "confirmation_num": "\ue638", - "confirmation_number": "\ue638", - "connect_without_contact": "\uf223", - "connected_tv": "\ue998", - "connecting_airports": "\ue7c9", - "construction": "\uea3c", - "contact_emergency": "\uf8d1", - "contact_mail": "\ue0d0", - "contact_page": "\uf22e", - "contact_phone": "\ue0cf", - "contact_support": "\ue94c", - "contactless": "\uea71", - "contacts": "\ue0ba", - "content_copy": "\ue14d", - "content_cut": "\ue14e", - "content_paste": "\ue14f", - "content_paste_go": "\uea8e", - "content_paste_off": "\ue4f8", - "content_paste_search": "\uea9b", - "contrast": "\ueb37", - "control_camera": "\ue074", - "control_point": "\ue3ba", - "control_point_duplicate": "\ue3bb", - "conveyor_belt": "\uf867", - "cookie": "\ueaac", - "copy_all": "\ue2ec", - "copyright": "\ue90c", - "coronavirus": "\uf221", - "corporate_fare": "\uf1d0", - "cottage": "\ue587", - "countertops": "\uf1f7", - "create": "\ue150", - "create_new_folder": "\ue2cc", - "credit_card": "\ue870", - "credit_card_off": "\ue4f4", - "credit_score": "\ueff1", - "crib": "\ue588", - "crisis_alert": "\uebe9", - "crop": "\ue3be", - "crop_16_9": "\ue3bc", - "crop_3_2": "\ue3bd", - "crop_5_4": "\ue3bf", - "crop_7_5": "\ue3c0", - "crop_din": "\ue3c1", - "crop_free": "\ue3c2", - "crop_landscape": "\ue3c3", - "crop_original": "\ue3c4", - "crop_portrait": "\ue3c5", - "crop_rotate": "\ue437", - "crop_square": "\ue3c6", - "cruelty_free": "\ue799", - "css": "\ueb93", - "currency_bitcoin": "\uebc5", - "currency_exchange": "\ueb70", - "currency_franc": "\ueafa", - "currency_lira": "\ueaef", - "currency_pound": "\ueaf1", - "currency_ruble": "\ueaec", - "currency_rupee": "\ueaf7", - "currency_yen": "\ueafb", - "currency_yuan": "\ueaf9", - "curtains": "\uec1e", - "curtains_closed": "\uec1d", - "cyclone": "\uebd5", - "dangerous": "\ue99a", - "dark_mode": "\ue51c", - "dashboard": "\ue871", - "dashboard_customize": "\ue99b", - "data_array": "\uead1", - "data_exploration": "\ue76f", - "data_object": "\uead3", - "data_saver_off": "\ueff2", - "data_saver_on": "\ueff3", - "data_thresholding": "\ueb9f", - "data_usage": "\ue1af", - "dataset": "\uf8ee", - "dataset_linked": "\uf8ef", - "date_range": "\ue916", - "deblur": "\ueb77", - "deck": "\uea42", - "dehaze": "\ue3c7", - "delete": "\ue872", - "delete_forever": "\ue92b", - "delete_outline": "\ue92e", - "delete_sweep": "\ue16c", - "delivery_dining": "\uea72", - "density_large": "\ueba9", - "density_medium": "\ueb9e", - "density_small": "\ueba8", - "departure_board": "\ue576", - "description": "\ue873", - "deselect": "\uebb6", - "design_services": "\uf10a", - "desk": "\uf8f4", - "desktop_access_disabled": "\ue99d", - "desktop_mac": "\ue30b", - "desktop_windows": "\ue30c", - "details": "\ue3c8", - "developer_board": "\ue30d", - "developer_board_off": "\ue4ff", - "developer_mode": "\ue1b0", - "device_hub": "\ue335", - "device_thermostat": "\ue1ff", - "device_unknown": "\ue339", - "devices": "\ue1b1", - "devices_fold": "\uebde", - "devices_other": "\ue337", - "dew_point": "\uf879", - "dialer_sip": "\ue0bb", - "dialpad": "\ue0bc", - "diamond": "\uead5", - "difference": "\ueb7d", - "dining": "\ueff4", - "dinner_dining": "\uea57", - "directions": "\ue52e", - "directions_bike": "\ue52f", - "directions_boat": "\ue532", - "directions_boat_filled": "\ueff5", - "directions_bus": "\ue530", - "directions_bus_filled": "\ueff6", - "directions_car": "\ue531", - "directions_car_filled": "\ueff7", - "directions_ferry": "\ue532", - "directions_off": "\uf10f", - "directions_railway": "\ue534", - "directions_railway_filled": "\ueff8", - "directions_run": "\ue566", - "directions_subway": "\ue533", - "directions_subway_filled": "\ueff9", - "directions_train": "\ue534", - "directions_transit": "\ue535", - "directions_transit_filled": "\ueffa", - "directions_walk": "\ue536", - "dirty_lens": "\uef4b", - "disabled_by_default": "\uf230", - "disabled_visible": "\ue76e", - "disc_full": "\ue610", - "discord": "\uea6c", - "discount": "\uebc9", - "display_settings": "\ueb97", - "diversity_1": "\uf8d7", - "diversity_2": "\uf8d8", - "diversity_3": "\uf8d9", - "dnd_forwardslash": "\ue611", - "dns": "\ue875", - "do_disturb": "\uf08c", - "do_disturb_alt": "\uf08d", - "do_disturb_off": "\uf08e", - "do_disturb_on": "\uf08f", - "do_not_disturb": "\ue612", - "do_not_disturb_alt": "\ue611", - "do_not_disturb_off": "\ue643", - "do_not_disturb_on": "\ue644", - "do_not_disturb_on_total_silence": "\ueffb", - "do_not_step": "\uf19f", - "do_not_touch": "\uf1b0", - "dock": "\ue30e", - "document_scanner": "\ue5fa", - "domain": "\ue7ee", - "domain_add": "\ueb62", - "domain_disabled": "\ue0ef", - "domain_verification": "\uef4c", - "done": "\ue876", - "done_all": "\ue877", - "done_outline": "\ue92f", - "donut_large": "\ue917", - "donut_small": "\ue918", - "door_back": "\ueffc", - "door_front": "\ueffd", - "door_sliding": "\ueffe", - "doorbell": "\uefff", - "double_arrow": "\uea50", - "downhill_skiing": "\ue509", - "download": "\uf090", - "download_done": "\uf091", - "download_for_offline": "\uf000", - "downloading": "\uf001", - "drafts": "\ue151", - "drag_handle": "\ue25d", - "drag_indicator": "\ue945", - "draw": "\ue746", - "drive_eta": "\ue613", - "drive_file_move": "\ue675", - "drive_file_move_outline": "\ue9a1", - "drive_file_move_rtl": "\ue76d", - "drive_file_rename_outline": "\ue9a2", - "drive_folder_upload": "\ue9a3", - "dry": "\uf1b3", - "dry_cleaning": "\uea58", - "duo": "\ue9a5", - "dvr": "\ue1b2", - "dynamic_feed": "\uea14", - "dynamic_form": "\uf1bf", - "e_mobiledata": "\uf002", - "earbuds": "\uf003", - "earbuds_battery": "\uf004", - "east": "\uf1df", - "eco": "\uea35", - "edgesensor_high": "\uf005", - "edgesensor_low": "\uf006", - "edit": "\ue3c9", - "edit_attributes": "\ue578", - "edit_calendar": "\ue742", - "edit_document": "\uf88c", - "edit_location": "\ue568", - "edit_location_alt": "\ue1c5", - "edit_note": "\ue745", - "edit_notifications": "\ue525", - "edit_off": "\ue950", - "edit_road": "\uef4d", - "edit_square": "\uf88d", - "egg": "\ueacc", - "egg_alt": "\ueac8", - "eject": "\ue8fb", - "elderly": "\uf21a", - "elderly_woman": "\ueb69", - "electric_bike": "\ueb1b", - "electric_bolt": "\uec1c", - "electric_car": "\ueb1c", - "electric_meter": "\uec1b", - "electric_moped": "\ueb1d", - "electric_rickshaw": "\ueb1e", - "electric_scooter": "\ueb1f", - "electrical_services": "\uf102", - "elevator": "\uf1a0", - "email": "\ue0be", - "emergency": "\ue1eb", - "emergency_recording": "\uebf4", - "emergency_share": "\uebf6", - "emoji_emotions": "\uea22", - "emoji_events": "\uea23", - "emoji_flags": "\uea1a", - "emoji_food_beverage": "\uea1b", - "emoji_nature": "\uea1c", - "emoji_objects": "\uea24", - "emoji_people": "\uea1d", - "emoji_symbols": "\uea1e", - "emoji_transportation": "\uea1f", - "energy_savings_leaf": "\uec1a", - "engineering": "\uea3d", - "enhance_photo_translate": "\ue8fc", - "enhanced_encryption": "\ue63f", - "equalizer": "\ue01d", - "error": "\ue000", - "error_outline": "\ue001", - "escalator": "\uf1a1", - "escalator_warning": "\uf1ac", - "euro": "\uea15", - "euro_symbol": "\ue926", - "ev_station": "\ue56d", - "event": "\ue878", - "event_available": "\ue614", - "event_busy": "\ue615", - "event_note": "\ue616", - "event_repeat": "\ueb7b", - "event_seat": "\ue903", - "exit_to_app": "\ue879", - "expand": "\ue94f", - "expand_circle_down": "\ue7cd", - "expand_less": "\ue5ce", - "expand_more": "\ue5cf", - "explicit": "\ue01e", - "explore": "\ue87a", - "explore_off": "\ue9a8", - "exposure": "\ue3ca", - "exposure_minus_1": "\ue3cb", - "exposure_minus_2": "\ue3cc", - "exposure_neg_1": "\ue3cb", - "exposure_neg_2": "\ue3cc", - "exposure_plus_1": "\ue3cd", - "exposure_plus_2": "\ue3ce", - "exposure_zero": "\ue3cf", - "extension": "\ue87b", - "extension_off": "\ue4f5", - "face": "\ue87c", - "face_2": "\uf8da", - "face_3": "\uf8db", - "face_4": "\uf8dc", - "face_5": "\uf8dd", - "face_6": "\uf8de", - "face_retouching_natural": "\uef4e", - "face_retouching_off": "\uf007", - "facebook": "\uf234", - "fact_check": "\uf0c5", - "factory": "\uebbc", - "family_restroom": "\uf1a2", - "fast_forward": "\ue01f", - "fast_rewind": "\ue020", - "fastfood": "\ue57a", - "favorite": "\ue87d", - "favorite_border": "\ue87e", - "favorite_outline": "\ue87e", - "fax": "\uead8", - "featured_play_list": "\ue06d", - "featured_video": "\ue06e", - "feed": "\uf009", - "feedback": "\ue87f", - "female": "\ue590", - "fence": "\uf1f6", - "festival": "\uea68", - "fiber_dvr": "\ue05d", - "fiber_manual_record": "\ue061", - "fiber_new": "\ue05e", - "fiber_pin": "\ue06a", - "fiber_smart_record": "\ue062", - "file_copy": "\ue173", - "file_download": "\ue2c4", - "file_download_done": "\ue9aa", - "file_download_off": "\ue4fe", - "file_open": "\ueaf3", - "file_present": "\uea0e", - "file_upload": "\ue2c6", - "file_upload_off": "\uf886", - "filter": "\ue3d3", - "filter_1": "\ue3d0", - "filter_2": "\ue3d1", - "filter_3": "\ue3d2", - "filter_4": "\ue3d4", - "filter_5": "\ue3d5", - "filter_6": "\ue3d6", - "filter_7": "\ue3d7", - "filter_8": "\ue3d8", - "filter_9": "\ue3d9", - "filter_9_plus": "\ue3da", - "filter_alt": "\uef4f", - "filter_alt_off": "\ueb32", - "filter_b_and_w": "\ue3db", - "filter_center_focus": "\ue3dc", - "filter_drama": "\ue3dd", - "filter_frames": "\ue3de", - "filter_hdr": "\ue3df", - "filter_list": "\ue152", - "filter_list_alt": "\ue94e", - "filter_list_off": "\ueb57", - "filter_none": "\ue3e0", - "filter_tilt_shift": "\ue3e2", - "filter_vintage": "\ue3e3", - "find_in_page": "\ue880", - "find_replace": "\ue881", - "fingerprint": "\ue90d", - "fire_extinguisher": "\uf1d8", - "fire_hydrant": "\uf1a3", - "fire_hydrant_alt": "\uf8f1", - "fire_truck": "\uf8f2", - "fireplace": "\uea43", - "first_page": "\ue5dc", - "fit_screen": "\uea10", - "fitbit": "\ue82b", - "fitness_center": "\ueb43", - "flag": "\ue153", - "flag_circle": "\ueaf8", - "flaky": "\uef50", - "flare": "\ue3e4", - "flash_auto": "\ue3e5", - "flash_off": "\ue3e6", - "flash_on": "\ue3e7", - "flashlight_off": "\uf00a", - "flashlight_on": "\uf00b", - "flatware": "\uf00c", - "flight": "\ue539", - "flight_class": "\ue7cb", - "flight_land": "\ue904", - "flight_takeoff": "\ue905", - "flip": "\ue3e8", - "flip_camera_android": "\uea37", - "flip_camera_ios": "\uea38", - "flip_to_back": "\ue882", - "flip_to_front": "\ue883", - "flood": "\uebe6", - "flourescent": "\uec31", - "flourescent": "\uf00d", - "fluorescent": "\uec31", - "flutter_dash": "\ue00b", - "fmd_bad": "\uf00e", - "fmd_good": "\uf00f", - "foggy": "\ue818", - "folder": "\ue2c7", - "folder_copy": "\uebbd", - "folder_delete": "\ueb34", - "folder_off": "\ueb83", - "folder_open": "\ue2c8", - "folder_shared": "\ue2c9", - "folder_special": "\ue617", - "folder_zip": "\ueb2c", - "follow_the_signs": "\uf222", - "font_download": "\ue167", - "font_download_off": "\ue4f9", - "food_bank": "\uf1f2", - "forest": "\uea99", - "fork_left": "\ueba0", - "fork_right": "\uebac", - "forklift": "\uf868", - "format_align_center": "\ue234", - "format_align_justify": "\ue235", - "format_align_left": "\ue236", - "format_align_right": "\ue237", - "format_bold": "\ue238", - "format_clear": "\ue239", - "format_color_fill": "\ue23a", - "format_color_reset": "\ue23b", - "format_color_text": "\ue23c", - "format_indent_decrease": "\ue23d", - "format_indent_increase": "\ue23e", - "format_italic": "\ue23f", - "format_line_spacing": "\ue240", - "format_list_bulleted": "\ue241", - "format_list_numbered": "\ue242", - "format_list_numbered_rtl": "\ue267", - "format_overline": "\ueb65", - "format_paint": "\ue243", - "format_quote": "\ue244", - "format_shapes": "\ue25e", - "format_size": "\ue245", - "format_strikethrough": "\ue246", - "format_textdirection_l_to_r": "\ue247", - "format_textdirection_r_to_l": "\ue248", - "format_underline": "\ue249", - "format_underlined": "\ue249", - "fort": "\ueaad", - "forum": "\ue0bf", - "forward": "\ue154", - "forward_10": "\ue056", - "forward_30": "\ue057", - "forward_5": "\ue058", - "forward_to_inbox": "\uf187", - "foundation": "\uf200", - "free_breakfast": "\ueb44", - "free_cancellation": "\ue748", - "front_hand": "\ue769", - "front_loader": "\uf869", - "fullscreen": "\ue5d0", - "fullscreen_exit": "\ue5d1", - "functions": "\ue24a", - "g_mobiledata": "\uf010", - "g_translate": "\ue927", - "gamepad": "\ue30f", - "games": "\ue021", - "garage": "\uf011", - "gas_meter": "\uec19", - "gavel": "\ue90e", - "generating_tokens": "\ue749", - "gesture": "\ue155", - "get_app": "\ue884", - "gif": "\ue908", - "gif_box": "\ue7a3", - "girl": "\ueb68", - "gite": "\ue58b", - "goat": "\u10fffd", - "golf_course": "\ueb45", - "gpp_bad": "\uf012", - "gpp_good": "\uf013", - "gpp_maybe": "\uf014", - "gps_fixed": "\ue1b3", - "gps_not_fixed": "\ue1b4", - "gps_off": "\ue1b5", - "grade": "\ue885", - "gradient": "\ue3e9", - "grading": "\uea4f", - "grain": "\ue3ea", - "graphic_eq": "\ue1b8", - "grass": "\uf205", - "grid_3x3": "\uf015", - "grid_4x4": "\uf016", - "grid_goldenratio": "\uf017", - "grid_off": "\ue3eb", - "grid_on": "\ue3ec", - "grid_view": "\ue9b0", - "group": "\ue7ef", - "group_add": "\ue7f0", - "group_off": "\ue747", - "group_remove": "\ue7ad", - "group_work": "\ue886", - "groups": "\uf233", - "groups_2": "\uf8df", - "groups_3": "\uf8e0", - "h_mobiledata": "\uf018", - "h_plus_mobiledata": "\uf019", - "hail": "\ue9b1", - "handshake": "\uebcb", - "handyman": "\uf10b", - "hardware": "\uea59", - "hd": "\ue052", - "hdr_auto": "\uf01a", - "hdr_auto_select": "\uf01b", - "hdr_enhanced_select": "\uef51", - "hdr_off": "\ue3ed", - "hdr_off_select": "\uf01c", - "hdr_on": "\ue3ee", - "hdr_on_select": "\uf01d", - "hdr_plus": "\uf01e", - "hdr_strong": "\ue3f1", - "hdr_weak": "\ue3f2", - "headphones": "\uf01f", - "headphones_battery": "\uf020", - "headset": "\ue310", - "headset_mic": "\ue311", - "headset_off": "\ue33a", - "healing": "\ue3f3", - "health_and_safety": "\ue1d5", - "hearing": "\ue023", - "hearing_disabled": "\uf104", - "heart_broken": "\ueac2", - "heat_pump": "\uec18", - "height": "\uea16", - "help": "\ue887", - "help_center": "\uf1c0", - "help_outline": "\ue8fd", - "hevc": "\uf021", - "hexagon": "\ueb39", - "hide_image": "\uf022", - "hide_source": "\uf023", - "high_quality": "\ue024", - "highlight": "\ue25f", - "highlight_alt": "\uef52", - "highlight_off": "\ue888", - "highlight_remove": "\ue888", - "hiking": "\ue50a", - "history": "\ue889", - "history_edu": "\uea3e", - "history_toggle_off": "\uf17d", - "hive": "\ueaa6", - "hls": "\ueb8a", - "hls_off": "\ueb8c", - "holiday_village": "\ue58a", - "home": "\ue88a", - "home_filled": "\ue9b2", - "home_max": "\uf024", - "home_mini": "\uf025", - "home_repair_service": "\uf100", - "home_work": "\uea09", - "horizontal_distribute": "\ue014", - "horizontal_rule": "\uf108", - "horizontal_split": "\ue947", - "hot_tub": "\ueb46", - "hotel": "\ue53a", - "hotel_class": "\ue743", - "hourglass_bottom": "\uea5c", - "hourglass_disabled": "\uef53", - "hourglass_empty": "\ue88b", - "hourglass_full": "\ue88c", - "hourglass_top": "\uea5b", - "house": "\uea44", - "house_siding": "\uf202", - "houseboat": "\ue584", - "how_to_reg": "\ue174", - "how_to_vote": "\ue175", - "html": "\ueb7e", - "http": "\ue902", - "https": "\ue88d", - "hub": "\ue9f4", - "hvac": "\uf10e", - "ice_skating": "\ue50b", - "icecream": "\uea69", - "image": "\ue3f4", - "image_aspect_ratio": "\ue3f5", - "image_not_supported": "\uf116", - "image_search": "\ue43f", - "imagesearch_roller": "\ue9b4", - "import_contacts": "\ue0e0", - "import_export": "\ue0c3", - "important_devices": "\ue912", - "inbox": "\ue156", - "incomplete_circle": "\ue79b", - "indeterminate_check_box": "\ue909", - "info": "\ue88e", - "info_outline": "\ue88f", - "input": "\ue890", - "insert_chart": "\ue24b", - "insert_chart_outlined": "\ue26a", - "insert_comment": "\ue24c", - "insert_drive_file": "\ue24d", - "insert_emoticon": "\ue24e", - "insert_invitation": "\ue24f", - "insert_link": "\ue250", - "insert_page_break": "\ueaca", - "insert_photo": "\ue251", - "insights": "\uf092", - "install_desktop": "\ueb71", - "install_mobile": "\ueb72", - "integration_instructions": "\uef54", - "interests": "\ue7c8", - "interpreter_mode": "\ue83b", - "inventory": "\ue179", - "inventory_2": "\ue1a1", - "invert_colors": "\ue891", - "invert_colors_off": "\ue0c4", - "invert_colors_on": "\ue891", - "ios_share": "\ue6b8", - "iron": "\ue583", - "iso": "\ue3f6", - "javascript": "\ueb7c", - "join_full": "\ueaeb", - "join_inner": "\ueaf4", - "join_left": "\ueaf2", - "join_right": "\ueaea", - "kayaking": "\ue50c", - "kebab_dining": "\ue842", - "key": "\ue73c", - "key_off": "\ueb84", - "keyboard": "\ue312", - "keyboard_alt": "\uf028", - "keyboard_arrow_down": "\ue313", - "keyboard_arrow_left": "\ue314", - "keyboard_arrow_right": "\ue315", - "keyboard_arrow_up": "\ue316", - "keyboard_backspace": "\ue317", - "keyboard_capslock": "\ue318", - "keyboard_command": "\ueae0", - "keyboard_command_key": "\ueae7", - "keyboard_control": "\ue5d3", - "keyboard_control_key": "\ueae6", - "keyboard_double_arrow_down": "\uead0", - "keyboard_double_arrow_left": "\ueac3", - "keyboard_double_arrow_right": "\ueac9", - "keyboard_double_arrow_up": "\ueacf", - "keyboard_hide": "\ue31a", - "keyboard_option": "\ueadf", - "keyboard_option_key": "\ueae8", - "keyboard_return": "\ue31b", - "keyboard_tab": "\ue31c", - "keyboard_voice": "\ue31d", - "king_bed": "\uea45", - "kitchen": "\ueb47", - "kitesurfing": "\ue50d", - "label": "\ue892", - "label_important": "\ue937", - "label_important_outline": "\ue948", - "label_off": "\ue9b6", - "label_outline": "\ue893", - "lan": "\ueb2f", - "landscape": "\ue3f7", - "landslide": "\uebd7", - "language": "\ue894", - "laptop": "\ue31e", - "laptop_chromebook": "\ue31f", - "laptop_mac": "\ue320", - "laptop_windows": "\ue321", - "last_page": "\ue5dd", - "launch": "\ue895", - "layers": "\ue53b", - "layers_clear": "\ue53c", - "leaderboard": "\uf20c", - "leak_add": "\ue3f8", - "leak_remove": "\ue3f9", - "leave_bags_at_home": "\uf21b", - "legend_toggle": "\uf11b", - "lens": "\ue3fa", - "lens_blur": "\uf029", - "library_add": "\ue02e", - "library_add_check": "\ue9b7", - "library_books": "\ue02f", - "library_music": "\ue030", - "light": "\uf02a", - "light_mode": "\ue518", - "lightbulb": "\ue0f0", - "lightbulb_circle": "\uebfe", - "lightbulb_outline": "\ue90f", - "line_axis": "\uea9a", - "line_style": "\ue919", - "line_weight": "\ue91a", - "linear_scale": "\ue260", - "link": "\ue157", - "link_off": "\ue16f", - "linked_camera": "\ue438", - "liquor": "\uea60", - "list": "\ue896", - "list_alt": "\ue0ee", - "live_help": "\ue0c6", - "live_tv": "\ue639", - "living": "\uf02b", - "local_activity": "\ue53f", - "local_airport": "\ue53d", - "local_atm": "\ue53e", - "local_attraction": "\ue53f", - "local_bar": "\ue540", - "local_cafe": "\ue541", - "local_car_wash": "\ue542", - "local_convenience_store": "\ue543", - "local_dining": "\ue556", - "local_drink": "\ue544", - "local_fire_department": "\uef55", - "local_florist": "\ue545", - "local_gas_station": "\ue546", - "local_grocery_store": "\ue547", - "local_hospital": "\ue548", - "local_hotel": "\ue549", - "local_laundry_service": "\ue54a", - "local_library": "\ue54b", - "local_mall": "\ue54c", - "local_movies": "\ue54d", - "local_offer": "\ue54e", - "local_parking": "\ue54f", - "local_pharmacy": "\ue550", - "local_phone": "\ue551", - "local_pizza": "\ue552", - "local_play": "\ue553", - "local_police": "\uef56", - "local_post_office": "\ue554", - "local_print_shop": "\ue555", - "local_printshop": "\ue555", - "local_restaurant": "\ue556", - "local_see": "\ue557", - "local_shipping": "\ue558", - "local_taxi": "\ue559", - "location_city": "\ue7f1", - "location_disabled": "\ue1b6", - "location_history": "\ue55a", - "location_off": "\ue0c7", - "location_on": "\ue0c8", - "location_pin": "\uf1db", - "location_searching": "\ue1b7", - "lock": "\ue897", - "lock_clock": "\uef57", - "lock_open": "\ue898", - "lock_outline": "\ue899", - "lock_person": "\uf8f3", - "lock_reset": "\ueade", - "login": "\uea77", - "logo_dev": "\uead6", - "logout": "\ue9ba", - "looks": "\ue3fc", - "looks_3": "\ue3fb", - "looks_4": "\ue3fd", - "looks_5": "\ue3fe", - "looks_6": "\ue3ff", - "looks_one": "\ue400", - "looks_two": "\ue401", - "loop": "\ue028", - "loupe": "\ue402", - "low_priority": "\ue16d", - "loyalty": "\ue89a", - "lte_mobiledata": "\uf02c", - "lte_plus_mobiledata": "\uf02d", - "luggage": "\uf235", - "lunch_dining": "\uea61", - "lyrics": "\uec0b", - "macro_off": "\uf8d2", - "mail": "\ue158", - "mail_lock": "\uec0a", - "mail_outline": "\ue0e1", - "male": "\ue58e", - "man": "\ue4eb", - "man_2": "\uf8e1", - "man_3": "\uf8e2", - "man_4": "\uf8e3", - "manage_accounts": "\uf02e", - "manage_history": "\uebe7", - "manage_search": "\uf02f", - "map": "\ue55b", - "maps_home_work": "\uf030", - "maps_ugc": "\uef58", - "margin": "\ue9bb", - "mark_as_unread": "\ue9bc", - "mark_chat_read": "\uf18b", - "mark_chat_unread": "\uf189", - "mark_email_read": "\uf18c", - "mark_email_unread": "\uf18a", - "mark_unread_chat_alt": "\ueb9d", - "markunread": "\ue159", - "markunread_mailbox": "\ue89b", - "masks": "\uf218", - "maximize": "\ue930", - "media_bluetooth_off": "\uf031", - "media_bluetooth_on": "\uf032", - "mediation": "\uefa7", - "medical_information": "\uebed", - "medical_services": "\uf109", - "medication": "\uf033", - "medication_liquid": "\uea87", - "meeting_room": "\ueb4f", - "memory": "\ue322", - "menu": "\ue5d2", - "menu_book": "\uea19", - "menu_open": "\ue9bd", - "merge": "\ueb98", - "merge_type": "\ue252", - "message": "\ue0c9", - "messenger": "\ue0ca", - "messenger_outline": "\ue0cb", - "mic": "\ue029", - "mic_external_off": "\uef59", - "mic_external_on": "\uef5a", - "mic_none": "\ue02a", - "mic_off": "\ue02b", - "microwave": "\uf204", - "military_tech": "\uea3f", - "minimize": "\ue931", - "minor_crash": "\uebf1", - "miscellaneous_services": "\uf10c", - "missed_video_call": "\ue073", - "mms": "\ue618", - "mobile_friendly": "\ue200", - "mobile_off": "\ue201", - "mobile_screen_share": "\ue0e7", - "mobiledata_off": "\uf034", - "mode": "\uf097", - "mode_comment": "\ue253", - "mode_edit": "\ue254", - "mode_edit_outline": "\uf035", - "mode_fan_off": "\uec17", - "mode_night": "\uf036", - "mode_of_travel": "\ue7ce", - "mode_standby": "\uf037", - "model_training": "\uf0cf", - "monetization_on": "\ue263", - "money": "\ue57d", - "money_off": "\ue25c", - "money_off_csred": "\uf038", - "monitor": "\uef5b", - "monitor_heart": "\ueaa2", - "monitor_weight": "\uf039", - "monochrome_photos": "\ue403", - "mood": "\ue7f2", - "mood_bad": "\ue7f3", - "moped": "\ueb28", - "more": "\ue619", - "more_horiz": "\ue5d3", - "more_time": "\uea5d", - "more_vert": "\ue5d4", - "mosque": "\ueab2", - "motion_photos_auto": "\uf03a", - "motion_photos_off": "\ue9c0", - "motion_photos_on": "\ue9c1", - "motion_photos_pause": "\uf227", - "motion_photos_paused": "\ue9c2", - "motorcycle": "\ue91b", - "mouse": "\ue323", - "move_down": "\ueb61", - "move_to_inbox": "\ue168", - "move_up": "\ueb64", - "movie": "\ue02c", - "movie_creation": "\ue404", - "movie_filter": "\ue43a", - "moving": "\ue501", - "mp": "\ue9c3", - "multiline_chart": "\ue6df", - "multiple_stop": "\uf1b9", - "multitrack_audio": "\ue1b8", - "museum": "\uea36", - "music_note": "\ue405", - "music_off": "\ue440", - "music_video": "\ue063", - "my_library_add": "\ue02e", - "my_library_books": "\ue02f", - "my_library_music": "\ue030", - "my_location": "\ue55c", - "nat": "\uef5c", - "nature": "\ue406", - "nature_people": "\ue407", - "navigate_before": "\ue408", - "navigate_next": "\ue409", - "navigation": "\ue55d", - "near_me": "\ue569", - "near_me_disabled": "\uf1ef", - "nearby_error": "\uf03b", - "nearby_off": "\uf03c", - "nest_cam_wired_stand": "\uec16", - "network_cell": "\ue1b9", - "network_check": "\ue640", - "network_locked": "\ue61a", - "network_ping": "\uebca", - "network_wifi": "\ue1ba", - "network_wifi_1_bar": "\uebe4", - "network_wifi_2_bar": "\uebd6", - "network_wifi_3_bar": "\uebe1", - "new_label": "\ue609", - "new_releases": "\ue031", - "newspaper": "\ueb81", - "next_plan": "\uef5d", - "next_week": "\ue16a", - "nfc": "\ue1bb", - "night_shelter": "\uf1f1", - "nightlife": "\uea62", - "nightlight": "\uf03d", - "nightlight_round": "\uef5e", - "nights_stay": "\uea46", - "no_accounts": "\uf03e", - "no_adult_content": "\uf8fe", - "no_backpack": "\uf237", - "no_cell": "\uf1a4", - "no_crash": "\uebf0", - "no_drinks": "\uf1a5", - "no_encryption": "\ue641", - "no_encryption_gmailerrorred": "\uf03f", - "no_flash": "\uf1a6", - "no_food": "\uf1a7", - "no_luggage": "\uf23b", - "no_meals": "\uf1d6", - "no_meals_ouline": "\uf229", - "no_meeting_room": "\ueb4e", - "no_photography": "\uf1a8", - "no_sim": "\ue0cc", - "no_stroller": "\uf1af", - "no_transfer": "\uf1d5", - "noise_aware": "\uebec", - "noise_control_off": "\uebf3", - "nordic_walking": "\ue50e", - "north": "\uf1e0", - "north_east": "\uf1e1", - "north_west": "\uf1e2", - "not_accessible": "\uf0fe", - "not_interested": "\ue033", - "not_listed_location": "\ue575", - "not_started": "\uf0d1", - "note": "\ue06f", - "note_add": "\ue89c", - "note_alt": "\uf040", - "notes": "\ue26c", - "notification_add": "\ue399", - "notification_important": "\ue004", - "notifications": "\ue7f4", - "notifications_active": "\ue7f7", - "notifications_none": "\ue7f5", - "notifications_off": "\ue7f6", - "notifications_on": "\ue7f7", - "notifications_paused": "\ue7f8", - "now_wallpaper": "\ue1bc", - "now_widgets": "\ue1bd", - "numbers": "\ueac7", - "offline_bolt": "\ue932", - "offline_pin": "\ue90a", - "offline_share": "\ue9c5", - "oil_barrel": "\uec15", - "on_device_training": "\uebfd", - "ondemand_video": "\ue63a", - "online_prediction": "\uf0eb", - "opacity": "\ue91c", - "open_in_browser": "\ue89d", - "open_in_full": "\uf1ce", - "open_in_new": "\ue89e", - "open_in_new_off": "\ue4f6", - "open_with": "\ue89f", - "other_houses": "\ue58c", - "outbond": "\uf228", - "outbound": "\ue1ca", - "outbox": "\uef5f", - "outdoor_grill": "\uea47", - "outgoing_mail": "\uf0d2", - "outlet": "\uf1d4", - "outlined_flag": "\ue16e", - "output": "\uebbe", - "padding": "\ue9c8", - "pages": "\ue7f9", - "pageview": "\ue8a0", - "paid": "\uf041", - "palette": "\ue40a", - "pallet": "\uf86a", - "pan_tool": "\ue925", - "pan_tool_alt": "\uebb9", - "panorama": "\ue40b", - "panorama_fish_eye": "\ue40c", - "panorama_fisheye": "\ue40c", - "panorama_horizontal": "\ue40d", - "panorama_horizontal_select": "\uef60", - "panorama_photosphere": "\ue9c9", - "panorama_photosphere_select": "\ue9ca", - "panorama_vertical": "\ue40e", - "panorama_vertical_select": "\uef61", - "panorama_wide_angle": "\ue40f", - "panorama_wide_angle_select": "\uef62", - "paragliding": "\ue50f", - "park": "\uea63", - "party_mode": "\ue7fa", - "password": "\uf042", - "pattern": "\uf043", - "pause": "\ue034", - "pause_circle": "\ue1a2", - "pause_circle_filled": "\ue035", - "pause_circle_outline": "\ue036", - "pause_presentation": "\ue0ea", - "payment": "\ue8a1", - "payments": "\uef63", - "paypal": "\uea8d", - "pedal_bike": "\ueb29", - "pending": "\uef64", - "pending_actions": "\uf1bb", - "pentagon": "\ueb50", - "people": "\ue7fb", - "people_alt": "\uea21", - "people_outline": "\ue7fc", - "percent": "\ueb58", - "perm_camera_mic": "\ue8a2", - "perm_contact_cal": "\ue8a3", - "perm_contact_calendar": "\ue8a3", - "perm_data_setting": "\ue8a4", - "perm_device_info": "\ue8a5", - "perm_device_information": "\ue8a5", - "perm_identity": "\ue8a6", - "perm_media": "\ue8a7", - "perm_phone_msg": "\ue8a8", - "perm_scan_wifi": "\ue8a9", - "person": "\ue7fd", - "person_2": "\uf8e4", - "person_3": "\uf8e5", - "person_4": "\uf8e6", - "person_add": "\ue7fe", - "person_add_alt": "\uea4d", - "person_add_alt_1": "\uef65", - "person_add_disabled": "\ue9cb", - "person_off": "\ue510", - "person_outline": "\ue7ff", - "person_pin": "\ue55a", - "person_pin_circle": "\ue56a", - "person_remove": "\uef66", - "person_remove_alt_1": "\uef67", - "person_search": "\uf106", - "personal_injury": "\ue6da", - "personal_video": "\ue63b", - "pest_control": "\uf0fa", - "pest_control_rodent": "\uf0fd", - "pets": "\ue91d", - "phishing": "\uead7", - "phone": "\ue0cd", - "phone_android": "\ue324", - "phone_bluetooth_speaker": "\ue61b", - "phone_callback": "\ue649", - "phone_disabled": "\ue9cc", - "phone_enabled": "\ue9cd", - "phone_forwarded": "\ue61c", - "phone_in_talk": "\ue61d", - "phone_iphone": "\ue325", - "phone_locked": "\ue61e", - "phone_missed": "\ue61f", - "phone_paused": "\ue620", - "phonelink": "\ue326", - "phonelink_erase": "\ue0db", - "phonelink_lock": "\ue0dc", - "phonelink_off": "\ue327", - "phonelink_ring": "\ue0dd", - "phonelink_setup": "\ue0de", - "photo": "\ue410", - "photo_album": "\ue411", - "photo_camera": "\ue412", - "photo_camera_back": "\uef68", - "photo_camera_front": "\uef69", - "photo_filter": "\ue43b", - "photo_library": "\ue413", - "photo_size_select_actual": "\ue432", - "photo_size_select_large": "\ue433", - "photo_size_select_small": "\ue434", - "php": "\ueb8f", - "piano": "\ue521", - "piano_off": "\ue520", - "picture_as_pdf": "\ue415", - "picture_in_picture": "\ue8aa", - "picture_in_picture_alt": "\ue911", - "pie_chart": "\ue6c4", - "pie_chart_outline": "\uf044", - "pie_chart_outlined": "\ue6c5", - "pin": "\uf045", - "pin_drop": "\ue55e", - "pin_end": "\ue767", - "pin_invoke": "\ue763", - "pinch": "\ueb38", - "pivot_table_chart": "\ue9ce", - "pix": "\ueaa3", - "place": "\ue55f", - "plagiarism": "\uea5a", - "play_arrow": "\ue037", - "play_circle": "\ue1c4", - "play_circle_fill": "\ue038", - "play_circle_filled": "\ue038", - "play_circle_outline": "\ue039", - "play_disabled": "\uef6a", - "play_for_work": "\ue906", - "play_lesson": "\uf047", - "playlist_add": "\ue03b", - "playlist_add_check": "\ue065", - "playlist_add_check_circle": "\ue7e6", - "playlist_add_circle": "\ue7e5", - "playlist_play": "\ue05f", - "playlist_remove": "\ueb80", - "plumbing": "\uf107", - "plus_one": "\ue800", - "podcasts": "\uf048", - "point_of_sale": "\uf17e", - "policy": "\uea17", - "poll": "\ue801", - "polyline": "\uebbb", - "polymer": "\ue8ab", - "pool": "\ueb48", - "portable_wifi_off": "\ue0ce", - "portrait": "\ue416", - "post_add": "\uea20", - "power": "\ue63c", - "power_input": "\ue336", - "power_off": "\ue646", - "power_settings_new": "\ue8ac", - "precision_manufacturing": "\uf049", - "pregnant_woman": "\ue91e", - "present_to_all": "\ue0df", - "preview": "\uf1c5", - "price_change": "\uf04a", - "price_check": "\uf04b", - "print": "\ue8ad", - "print_disabled": "\ue9cf", - "priority_high": "\ue645", - "privacy_tip": "\uf0dc", - "private_connectivity": "\ue744", - "production_quantity_limits": "\ue1d1", - "propane": "\uec14", - "propane_tank": "\uec13", - "psychology": "\uea4a", - "psychology_alt": "\uf8ea", - "public": "\ue80b", - "public_off": "\uf1ca", - "publish": "\ue255", - "published_with_changes": "\uf232", - "punch_clock": "\ueaa8", - "push_pin": "\uf10d", - "qr_code": "\uef6b", - "qr_code_2": "\ue00a", - "qr_code_scanner": "\uf206", - "query_builder": "\ue8ae", - "query_stats": "\ue4fc", - "question_answer": "\ue8af", - "question_mark": "\ueb8b", - "queue": "\ue03c", - "queue_music": "\ue03d", - "queue_play_next": "\ue066", - "quick_contacts_dialer": "\ue0cf", - "quick_contacts_mail": "\ue0d0", - "quickreply": "\uef6c", - "quiz": "\uf04c", - "quora": "\uea98", - "r_mobiledata": "\uf04d", - "radar": "\uf04e", - "radio": "\ue03e", - "radio_button_checked": "\ue837", - "radio_button_off": "\ue836", - "radio_button_on": "\ue837", - "radio_button_unchecked": "\ue836", - "railway_alert": "\ue9d1", - "ramen_dining": "\uea64", - "ramp_left": "\ueb9c", - "ramp_right": "\ueb96", - "rate_review": "\ue560", - "raw_off": "\uf04f", - "raw_on": "\uf050", - "read_more": "\uef6d", - "real_estate_agent": "\ue73a", - "receipt": "\ue8b0", - "receipt_long": "\uef6e", - "recent_actors": "\ue03f", - "recommend": "\ue9d2", - "record_voice_over": "\ue91f", - "rectangle": "\ueb54", - "recycling": "\ue760", - "reddit": "\ueaa0", - "redeem": "\ue8b1", - "redo": "\ue15a", - "reduce_capacity": "\uf21c", - "refresh": "\ue5d5", - "remember_me": "\uf051", - "remove": "\ue15b", - "remove_circle": "\ue15c", - "remove_circle_outline": "\ue15d", - "remove_done": "\ue9d3", - "remove_from_queue": "\ue067", - "remove_moderator": "\ue9d4", - "remove_red_eye": "\ue417", - "remove_road": "\uebfc", - "remove_shopping_cart": "\ue928", - "reorder": "\ue8fe", - "repartition": "\uf8e8", - "repeat": "\ue040", - "repeat_on": "\ue9d6", - "repeat_one": "\ue041", - "repeat_one_on": "\ue9d7", - "replay": "\ue042", - "replay_10": "\ue059", - "replay_30": "\ue05a", - "replay_5": "\ue05b", - "replay_circle_filled": "\ue9d8", - "reply": "\ue15e", - "reply_all": "\ue15f", - "report": "\ue160", - "report_gmailerrorred": "\uf052", - "report_off": "\ue170", - "report_problem": "\ue8b2", - "request_page": "\uf22c", - "request_quote": "\uf1b6", - "reset_tv": "\ue9d9", - "restart_alt": "\uf053", - "restaurant": "\ue56c", - "restaurant_menu": "\ue561", - "restore": "\ue8b3", - "restore_from_trash": "\ue938", - "restore_page": "\ue929", - "reviews": "\uf054", - "rice_bowl": "\uf1f5", - "ring_volume": "\ue0d1", - "rocket": "\ueba5", - "rocket_launch": "\ueb9b", - "roller_shades": "\uec12", - "roller_shades_closed": "\uec11", - "roller_skating": "\uebcd", - "roofing": "\uf201", - "room": "\ue8b4", - "room_preferences": "\uf1b8", - "room_service": "\ueb49", - "rotate_90_degrees_ccw": "\ue418", - "rotate_90_degrees_cw": "\ueaab", - "rotate_left": "\ue419", - "rotate_right": "\ue41a", - "roundabout_left": "\ueb99", - "roundabout_right": "\ueba3", - "rounded_corner": "\ue920", - "route": "\ueacd", - "router": "\ue328", - "rowing": "\ue921", - "rss_feed": "\ue0e5", - "rsvp": "\uf055", - "rtt": "\ue9ad", - "rule": "\uf1c2", - "rule_folder": "\uf1c9", - "run_circle": "\uef6f", - "running_with_errors": "\ue51d", - "rv_hookup": "\ue642", - "safety_check": "\uebef", - "safety_divider": "\ue1cc", - "sailing": "\ue502", - "sanitizer": "\uf21d", - "satellite": "\ue562", - "satellite_alt": "\ueb3a", - "save": "\ue161", - "save_alt": "\ue171", - "save_as": "\ueb60", - "saved_search": "\uea11", - "savings": "\ue2eb", - "scale": "\ueb5f", - "scanner": "\ue329", - "scatter_plot": "\ue268", - "schedule": "\ue8b5", - "schedule_send": "\uea0a", - "schema": "\ue4fd", - "school": "\ue80c", - "science": "\uea4b", - "score": "\ue269", - "scoreboard": "\uebd0", - "screen_lock_landscape": "\ue1be", - "screen_lock_portrait": "\ue1bf", - "screen_lock_rotation": "\ue1c0", - "screen_rotation": "\ue1c1", - "screen_rotation_alt": "\uebee", - "screen_search_desktop": "\uef70", - "screen_share": "\ue0e2", - "screenshot": "\uf056", - "screenshot_monitor": "\uec08", - "scuba_diving": "\uebce", - "sd": "\ue9dd", - "sd_card": "\ue623", - "sd_card_alert": "\uf057", - "sd_storage": "\ue1c2", - "search": "\ue8b6", - "search_off": "\uea76", - "security": "\ue32a", - "security_update": "\uf058", - "security_update_good": "\uf059", - "security_update_warning": "\uf05a", - "segment": "\ue94b", - "select_all": "\ue162", - "self_improvement": "\uea78", - "sell": "\uf05b", - "send": "\ue163", - "send_and_archive": "\uea0c", - "send_time_extension": "\ueadb", - "send_to_mobile": "\uf05c", - "sensor_door": "\uf1b5", - "sensor_occupied": "\uec10", - "sensor_window": "\uf1b4", - "sensors": "\ue51e", - "sensors_off": "\ue51f", - "sentiment_dissatisfied": "\ue811", - "sentiment_neutral": "\ue812", - "sentiment_satisfied": "\ue813", - "sentiment_satisfied_alt": "\ue0ed", - "sentiment_very_dissatisfied": "\ue814", - "sentiment_very_satisfied": "\ue815", - "set_meal": "\uf1ea", - "settings": "\ue8b8", - "settings_accessibility": "\uf05d", - "settings_applications": "\ue8b9", - "settings_backup_restore": "\ue8ba", - "settings_bluetooth": "\ue8bb", - "settings_brightness": "\ue8bd", - "settings_cell": "\ue8bc", - "settings_display": "\ue8bd", - "settings_ethernet": "\ue8be", - "settings_input_antenna": "\ue8bf", - "settings_input_component": "\ue8c0", - "settings_input_composite": "\ue8c1", - "settings_input_hdmi": "\ue8c2", - "settings_input_svideo": "\ue8c3", - "settings_overscan": "\ue8c4", - "settings_phone": "\ue8c5", - "settings_power": "\ue8c6", - "settings_remote": "\ue8c7", - "settings_suggest": "\uf05e", - "settings_system_daydream": "\ue1c3", - "settings_voice": "\ue8c8", - "severe_cold": "\uebd3", - "shape_line": "\uf8d3", - "share": "\ue80d", - "share_arrival_time": "\ue524", - "share_location": "\uf05f", - "shelves": "\uf86e", - "shield": "\ue9e0", - "shield_moon": "\ueaa9", - "shop": "\ue8c9", - "shop_2": "\ue19e", - "shop_two": "\ue8ca", - "shopify": "\uea9d", - "shopping_bag": "\uf1cc", - "shopping_basket": "\ue8cb", - "shopping_cart": "\ue8cc", - "shopping_cart_checkout": "\ueb88", - "short_text": "\ue261", - "shortcut": "\uf060", - "show_chart": "\ue6e1", - "shower": "\uf061", - "shuffle": "\ue043", - "shuffle_on": "\ue9e1", - "shutter_speed": "\ue43d", - "sick": "\uf220", - "sign_language": "\uebe5", - "signal_cellular_0_bar": "\uf0a8", - "signal_cellular_4_bar": "\ue1c8", - "signal_cellular_alt": "\ue202", - "signal_cellular_alt_1_bar": "\uebdf", - "signal_cellular_alt_2_bar": "\uebe3", - "signal_cellular_connected_no_internet_0_bar": "\uf0ac", - "signal_cellular_connected_no_internet_4_bar": "\ue1cd", - "signal_cellular_no_sim": "\ue1ce", - "signal_cellular_nodata": "\uf062", - "signal_cellular_null": "\ue1cf", - "signal_cellular_off": "\ue1d0", - "signal_wifi_0_bar": "\uf0b0", - "signal_wifi_4_bar": "\ue1d8", - "signal_wifi_4_bar_lock": "\ue1d9", - "signal_wifi_bad": "\uf063", - "signal_wifi_connected_no_internet_4": "\uf064", - "signal_wifi_off": "\ue1da", - "signal_wifi_statusbar_4_bar": "\uf065", - "signal_wifi_statusbar_connected_no_internet_4": "\uf066", - "signal_wifi_statusbar_null": "\uf067", - "signpost": "\ueb91", - "sim_card": "\ue32b", - "sim_card_alert": "\ue624", - "sim_card_download": "\uf068", - "single_bed": "\uea48", - "sip": "\uf069", - "skateboarding": "\ue511", - "skip_next": "\ue044", - "skip_previous": "\ue045", - "sledding": "\ue512", - "slideshow": "\ue41b", - "slow_motion_video": "\ue068", - "smart_button": "\uf1c1", - "smart_display": "\uf06a", - "smart_screen": "\uf06b", - "smart_toy": "\uf06c", - "smartphone": "\ue32c", - "smoke_free": "\ueb4a", - "smoking_rooms": "\ueb4b", - "sms": "\ue625", - "sms_failed": "\ue626", - "snapchat": "\uea6e", - "snippet_folder": "\uf1c7", - "snooze": "\ue046", - "snowboarding": "\ue513", - "snowing": "\ue80f", - "snowmobile": "\ue503", - "snowshoeing": "\ue514", - "soap": "\uf1b2", - "social_distance": "\ue1cb", - "solar_power": "\uec0f", - "sort": "\ue164", - "sort_by_alpha": "\ue053", - "sos": "\uebf7", - "soup_kitchen": "\ue7d3", - "source": "\uf1c4", - "south": "\uf1e3", - "south_america": "\ue7e4", - "south_east": "\uf1e4", - "south_west": "\uf1e5", - "spa": "\ueb4c", - "space_bar": "\ue256", - "space_dashboard": "\ue66b", - "spatial_audio": "\uebeb", - "spatial_audio_off": "\uebe8", - "spatial_tracking": "\uebea", - "speaker": "\ue32d", - "speaker_group": "\ue32e", - "speaker_notes": "\ue8cd", - "speaker_notes_off": "\ue92a", - "speaker_phone": "\ue0d2", - "speed": "\ue9e4", - "spellcheck": "\ue8ce", - "splitscreen": "\uf06d", - "spoke": "\ue9a7", - "sports": "\uea30", - "sports_bar": "\uf1f3", - "sports_baseball": "\uea51", - "sports_basketball": "\uea26", - "sports_cricket": "\uea27", - "sports_esports": "\uea28", - "sports_football": "\uea29", - "sports_golf": "\uea2a", - "sports_gymnastics": "\uebc4", - "sports_handball": "\uea33", - "sports_hockey": "\uea2b", - "sports_kabaddi": "\uea34", - "sports_martial_arts": "\ueae9", - "sports_mma": "\uea2c", - "sports_motorsports": "\uea2d", - "sports_rugby": "\uea2e", - "sports_score": "\uf06e", - "sports_soccer": "\uea2f", - "sports_tennis": "\uea32", - "sports_volleyball": "\uea31", - "square": "\ueb36", - "square_foot": "\uea49", - "ssid_chart": "\ueb66", - "stacked_bar_chart": "\ue9e6", - "stacked_line_chart": "\uf22b", - "stadium": "\ueb90", - "stairs": "\uf1a9", - "star": "\ue838", - "star_border": "\ue83a", - "star_border_purple500": "\uf099", - "star_half": "\ue839", - "star_outline": "\uf06f", - "star_purple500": "\uf09a", - "star_rate": "\uf0ec", - "stars": "\ue8d0", - "start": "\ue089", - "stay_current_landscape": "\ue0d3", - "stay_current_portrait": "\ue0d4", - "stay_primary_landscape": "\ue0d5", - "stay_primary_portrait": "\ue0d6", - "sticky_note_2": "\uf1fc", - "stop": "\ue047", - "stop_circle": "\uef71", - "stop_screen_share": "\ue0e3", - "storage": "\ue1db", - "store": "\ue8d1", - "store_mall_directory": "\ue563", - "storefront": "\uea12", - "storm": "\uf070", - "straight": "\ueb95", - "straighten": "\ue41c", - "stream": "\ue9e9", - "streetview": "\ue56e", - "strikethrough_s": "\ue257", - "stroller": "\uf1ae", - "style": "\ue41d", - "subdirectory_arrow_left": "\ue5d9", - "subdirectory_arrow_right": "\ue5da", - "subject": "\ue8d2", - "subscript": "\uf111", - "subscriptions": "\ue064", - "subtitles": "\ue048", - "subtitles_off": "\uef72", - "subway": "\ue56f", - "summarize": "\uf071", - "sunny": "\ue81a", - "sunny_snowing": "\ue819", - "superscript": "\uf112", - "supervised_user_circle": "\ue939", - "supervisor_account": "\ue8d3", - "support": "\uef73", - "support_agent": "\uf0e2", - "surfing": "\ue515", - "surround_sound": "\ue049", - "swap_calls": "\ue0d7", - "swap_horiz": "\ue8d4", - "swap_horizontal_circle": "\ue933", - "swap_vert": "\ue8d5", - "swap_vert_circle": "\ue8d6", - "swap_vertical_circle": "\ue8d6", - "swipe": "\ue9ec", - "swipe_down": "\ueb53", - "swipe_down_alt": "\ueb30", - "swipe_left": "\ueb59", - "swipe_left_alt": "\ueb33", - "swipe_right": "\ueb52", - "swipe_right_alt": "\ueb56", - "swipe_up": "\ueb2e", - "swipe_up_alt": "\ueb35", - "swipe_vertical": "\ueb51", - "switch_access_shortcut": "\ue7e1", - "switch_access_shortcut_add": "\ue7e2", - "switch_account": "\ue9ed", - "switch_camera": "\ue41e", - "switch_left": "\uf1d1", - "switch_right": "\uf1d2", - "switch_video": "\ue41f", - "synagogue": "\ueab0", - "sync": "\ue627", - "sync_alt": "\uea18", - "sync_disabled": "\ue628", - "sync_lock": "\ueaee", - "sync_problem": "\ue629", - "system_security_update": "\uf072", - "system_security_update_good": "\uf073", - "system_security_update_warning": "\uf074", - "system_update": "\ue62a", - "system_update_alt": "\ue8d7", - "system_update_tv": "\ue8d7", - "tab": "\ue8d8", - "tab_unselected": "\ue8d9", - "table_bar": "\uead2", - "table_chart": "\ue265", - "table_restaurant": "\ueac6", - "table_rows": "\uf101", - "table_view": "\uf1be", - "tablet": "\ue32f", - "tablet_android": "\ue330", - "tablet_mac": "\ue331", - "tag": "\ue9ef", - "tag_faces": "\ue420", - "takeout_dining": "\uea74", - "tap_and_play": "\ue62b", - "tapas": "\uf1e9", - "task": "\uf075", - "task_alt": "\ue2e6", - "taxi_alert": "\uef74", - "telegram": "\uea6b", - "temple_buddhist": "\ueab3", - "temple_hindu": "\ueaaf", - "terminal": "\ueb8e", - "terrain": "\ue564", - "text_decrease": "\ueadd", - "text_fields": "\ue262", - "text_format": "\ue165", - "text_increase": "\ueae2", - "text_rotate_up": "\ue93a", - "text_rotate_vertical": "\ue93b", - "text_rotation_angledown": "\ue93c", - "text_rotation_angleup": "\ue93d", - "text_rotation_down": "\ue93e", - "text_rotation_none": "\ue93f", - "text_snippet": "\uf1c6", - "textsms": "\ue0d8", - "texture": "\ue421", - "theater_comedy": "\uea66", - "theaters": "\ue8da", - "thermostat": "\uf076", - "thermostat_auto": "\uf077", - "thumb_down": "\ue8db", - "thumb_down_alt": "\ue816", - "thumb_down_off_alt": "\ue9f2", - "thumb_up": "\ue8dc", - "thumb_up_alt": "\ue817", - "thumb_up_off_alt": "\ue9f3", - "thumbs_up_down": "\ue8dd", - "thunderstorm": "\uebdb", - "tiktok": "\uea7e", - "time_to_leave": "\ue62c", - "timelapse": "\ue422", - "timeline": "\ue922", - "timer": "\ue425", - "timer_10": "\ue423", - "timer_10_select": "\uf07a", - "timer_3": "\ue424", - "timer_3_select": "\uf07b", - "timer_off": "\ue426", - "tips_and_updates": "\ue79a", - "tire_repair": "\uebc8", - "title": "\ue264", - "toc": "\ue8de", - "today": "\ue8df", - "toggle_off": "\ue9f5", - "toggle_on": "\ue9f6", - "token": "\uea25", - "toll": "\ue8e0", - "tonality": "\ue427", - "topic": "\uf1c8", - "tornado": "\ue199", - "touch_app": "\ue913", - "tour": "\uef75", - "toys": "\ue332", - "track_changes": "\ue8e1", - "traffic": "\ue565", - "train": "\ue570", - "tram": "\ue571", - "transcribe": "\uf8ec", - "transfer_within_a_station": "\ue572", - "transform": "\ue428", - "transgender": "\ue58d", - "transit_enterexit": "\ue579", - "translate": "\ue8e2", - "travel_explore": "\ue2db", - "trending_down": "\ue8e3", - "trending_flat": "\ue8e4", - "trending_neutral": "\ue8e4", - "trending_up": "\ue8e5", - "trip_origin": "\ue57b", - "trolley": "\uf86b", - "troubleshoot": "\ue1d2", - "try": "\uf07c", - "tsunami": "\uebd8", - "tty": "\uf1aa", - "tune": "\ue429", - "tungsten": "\uf07d", - "turn_left": "\ueba6", - "turn_right": "\uebab", - "turn_sharp_left": "\ueba7", - "turn_sharp_right": "\uebaa", - "turn_slight_left": "\ueba4", - "turn_slight_right": "\ueb9a", - "turned_in": "\ue8e6", - "turned_in_not": "\ue8e7", - "tv": "\ue333", - "tv_off": "\ue647", - "two_wheeler": "\ue9f9", - "type_specimen": "\uf8f0", - "u_turn_left": "\ueba1", - "u_turn_right": "\ueba2", - "umbrella": "\uf1ad", - "unarchive": "\ue169", - "undo": "\ue166", - "unfold_less": "\ue5d6", - "unfold_less_double": "\uf8cf", - "unfold_more": "\ue5d7", - "unfold_more_double": "\uf8d0", - "unpublished": "\uf236", - "unsubscribe": "\ue0eb", - "upcoming": "\uf07e", - "update": "\ue923", - "update_disabled": "\ue075", - "upgrade": "\uf0fb", - "upload": "\uf09b", - "upload_file": "\ue9fc", - "usb": "\ue1e0", - "usb_off": "\ue4fa", - "vaccines": "\ue138", - "vape_free": "\uebc6", - "vaping_rooms": "\uebcf", - "verified": "\uef76", - "verified_user": "\ue8e8", - "vertical_align_bottom": "\ue258", - "vertical_align_center": "\ue259", - "vertical_align_top": "\ue25a", - "vertical_distribute": "\ue076", - "vertical_shades": "\uec0e", - "vertical_shades_closed": "\uec0d", - "vertical_split": "\ue949", - "vibration": "\ue62d", - "video_call": "\ue070", - "video_camera_back": "\uf07f", - "video_camera_front": "\uf080", - "video_chat": "\uf8a0", - "video_collection": "\ue04a", - "video_file": "\ueb87", - "video_label": "\ue071", - "video_library": "\ue04a", - "video_settings": "\uea75", - "video_stable": "\uf081", - "videocam": "\ue04b", - "videocam_off": "\ue04c", - "videogame_asset": "\ue338", - "videogame_asset_off": "\ue500", - "view_agenda": "\ue8e9", - "view_array": "\ue8ea", - "view_carousel": "\ue8eb", - "view_column": "\ue8ec", - "view_comfortable": "\ue42a", - "view_comfy": "\ue42a", - "view_comfy_alt": "\ueb73", - "view_compact": "\ue42b", - "view_compact_alt": "\ueb74", - "view_cozy": "\ueb75", - "view_day": "\ue8ed", - "view_headline": "\ue8ee", - "view_in_ar": "\ue9fe", - "view_kanban": "\ueb7f", - "view_list": "\ue8ef", - "view_module": "\ue8f0", - "view_quilt": "\ue8f1", - "view_sidebar": "\uf114", - "view_stream": "\ue8f2", - "view_timeline": "\ueb85", - "view_week": "\ue8f3", - "vignette": "\ue435", - "villa": "\ue586", - "visibility": "\ue8f4", - "visibility_off": "\ue8f5", - "voice_chat": "\ue62e", - "voice_over_off": "\ue94a", - "voicemail": "\ue0d9", - "volcano": "\uebda", - "volume_down": "\ue04d", - "volume_down_alt": "\ue79c", - "volume_mute": "\ue04e", - "volume_off": "\ue04f", - "volume_up": "\ue050", - "volunteer_activism": "\uea70", - "vpn_key": "\ue0da", - "vpn_key_off": "\ueb7a", - "vpn_lock": "\ue62f", - "vrpano": "\uf082", - "wallet": "\uf8ff", - "wallet_giftcard": "\ue8f6", - "wallet_membership": "\ue8f7", - "wallet_travel": "\ue8f8", - "wallpaper": "\ue1bc", - "warehouse": "\uebb8", - "warning": "\ue002", - "warning_amber": "\uf083", - "wash": "\uf1b1", - "watch": "\ue334", - "watch_later": "\ue924", - "watch_off": "\ueae3", - "water": "\uf084", - "water_damage": "\uf203", - "water_drop": "\ue798", - "waterfall_chart": "\uea00", - "waves": "\ue176", - "waving_hand": "\ue766", - "wb_auto": "\ue42c", - "wb_cloudy": "\ue42d", - "wb_incandescent": "\ue42e", - "wb_iridescent": "\ue436", - "wb_shade": "\uea01", - "wb_sunny": "\ue430", - "wb_twighlight": "\uea02", - "wb_twilight": "\ue1c6", - "wc": "\ue63d", - "web": "\ue051", - "web_asset": "\ue069", - "web_asset_off": "\ue4f7", - "web_stories": "\ue595", - "webhook": "\ueb92", - "wechat": "\uea81", - "weekend": "\ue16b", - "west": "\uf1e6", - "whatsapp": "\uea9c", - "whatshot": "\ue80e", - "wheelchair_pickup": "\uf1ab", - "where_to_vote": "\ue177", - "widgets": "\ue1bd", - "width_full": "\uf8f5", - "width_normal": "\uf8f6", - "width_wide": "\uf8f7", - "wifi": "\ue63e", - "wifi_1_bar": "\ue4ca", - "wifi_2_bar": "\ue4d9", - "wifi_calling": "\uef77", - "wifi_calling_3": "\uf085", - "wifi_channel": "\ueb6a", - "wifi_find": "\ueb31", - "wifi_lock": "\ue1e1", - "wifi_off": "\ue648", - "wifi_password": "\ueb6b", - "wifi_protected_setup": "\uf0fc", - "wifi_tethering": "\ue1e2", - "wifi_tethering_error": "\uead9", - "wifi_tethering_error_rounded": "\uf086", - "wifi_tethering_off": "\uf087", - "wind_power": "\uec0c", - "window": "\uf088", - "wine_bar": "\uf1e8", - "woman": "\ue13e", - "woman_2": "\uf8e7", - "woo_commerce": "\uea6d", - "wordpress": "\uea9f", - "work": "\ue8f9", - "work_history": "\uec09", - "work_off": "\ue942", - "work_outline": "\ue943", - "workspace_premium": "\ue7af", - "workspaces": "\ue1a0", - "workspaces_filled": "\uea0d", - "workspaces_outline": "\uea0f", - "wrap_text": "\ue25b", - "wrong_location": "\uef78", - "wysiwyg": "\uf1c3", - "yard": "\uf089", - "youtube_searched_for": "\ue8fa", - "zoom_in": "\ue8ff", - "zoom_in_map": "\ueb2d", - "zoom_out": "\ue900", - "zoom_out_map": "\ue56b" -}); - -export default ol_style_FontSymbol diff --git a/test/functional/gtt_map_layers_controller_test.rb b/test/functional/gtt_map_layers_controller_test.rb new file mode 100644 index 00000000..716056f3 --- /dev/null +++ b/test/functional/gtt_map_layers_controller_test.rb @@ -0,0 +1,104 @@ +require_relative '../test_helper' +require_relative '../../app/controllers/gtt_map_layers_controller' + +class GttMapLayersControllerTest < ActionController::TestCase + fixtures :users, :email_addresses + + setup do + @request.session[:user_id] = 1 + end + + test 'should require admin' do + @request.session[:user_id] = nil + get :index + assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fgtt_map_layers' + end + + test 'should get index' do + get :index + assert_response :success + assert_template 'index' + assert_select 'h2', 'Map Layers' + end + + test 'should get new' do + get :new + assert_response :success + assert_template 'new' + assert_select 'h2', /New Map Layer/ + end + + test 'should create map layer' do + assert_difference 'GttMapLayer.count' do + post :create, params: { + map_layer: { + name: 'test', + layer: 'Tile', + source_options_string: { + attributions: 'test', + url: 'https://tile.openstreetmap.jp/{z}/{x}/{y}.png' + }.to_json + } + } + end + + assert_redirected_to '/gtt_map_layers' + assert ts = GttMapLayer.last + assert_equal 'test', ts.source_options['attributions'] + assert_equal 'https://tile.openstreetmap.jp/{z}/{x}/{y}.png', + ts.source_options['url'] + end + + test 'should create map layer and continue' do + assert_difference 'GttMapLayer.count' do + post :create, params: { + map_layer: { + name: 'test', + layer: 'Tile', + source_options_string: { + attributions: 'test', + url: 'https://tile.openstreetmap.jp/{z}/{x}/{y}.png' + }.to_json + }, + continue: 'Create and continue' + } + end + + assert_redirected_to '/gtt_map_layers/new' + assert ts = GttMapLayer.last + assert_equal 'test', ts.source_options['attributions'] + assert_equal 'https://tile.openstreetmap.jp/{z}/{x}/{y}.png', + ts.source_options['url'] + end + + test 'should get edit' do + ts = create_map_layer + get :edit, params: {id: ts.to_param} + assert_response :success + end + + test 'should update' do + ts = create_map_layer + patch :update, params: {id: ts.to_param, map_layer: { name: 'new name', source_options_string: {url: 'https://example.com'}.to_json }} + assert_redirected_to gtt_map_layers_path + ts.reload + assert_equal 'new name', ts.name + assert_equal 'https://example.com', ts.source_options['url'] + end + + test 'should destroy MapLayer' do + ts = create_map_layer + assert_difference 'GttMapLayer.count', -1 do + delete :destroy, params: {id: ts.to_param} + end + end + + private + + def create_map_layer + RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'test').map_layer + end + +end + + diff --git a/test/functional/gtt_tile_sources_controller_test.rb b/test/functional/gtt_tile_sources_controller_test.rb deleted file mode 100644 index c93b3595..00000000 --- a/test/functional/gtt_tile_sources_controller_test.rb +++ /dev/null @@ -1,106 +0,0 @@ -require_relative '../test_helper' -require_relative '../../app/controllers/gtt_tile_sources_controller' - -class GttTileSourcesControllerTest < ActionController::TestCase - fixtures :users, :email_addresses - - setup do - @request.session[:user_id] = 1 - end - - test 'should require admin' do - @request.session[:user_id] = nil - get :index - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fgtt_tile_sources' - end - - test 'should get index' do - get :index - assert_response :success - assert_template 'index' - assert_select 'h2', 'Tile Sources' - end - - test 'should get new' do - get :new - assert_response :success - assert_template 'new' - assert_select 'h2', /New Tile Source/ - end - - test 'should create tile source' do - assert_difference 'GttTileSource.count' do - post :create, params: { - tile_source: { - name: 'test', - type: 'GttOsmTileSource', - options_string: { - attributions: 'test', - url: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png' - }.to_json - } - } - end - - assert_redirected_to '/gtt_tile_sources' - assert ts = GttTileSource.last - assert_equal 'test', ts.options['attributions'] - assert_equal 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', - ts.options['url'] - end - - test 'should create tile source and continue' do - assert_difference 'GttTileSource.count' do - post :create, params: { - tile_source: { - name: 'test', - type: 'GttOsmTileSource', - options_string: { - attributions: 'test', - url: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png' - }.to_json - }, - continue: 'Create and continue' - } - end - - assert_redirected_to '/gtt_tile_sources/new' - assert ts = GttTileSource.last - assert_equal 'test', ts.options['attributions'] - assert_equal 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', - ts.options['url'] - end - - test 'should get edit' do - ts = create_tile_source - get :edit, params: {id: ts.to_param} - assert_response :success - end - - test 'should update' do - ts = create_tile_source - patch :update, params: {id: ts.to_param, tile_source: { name: 'new name', options_string: {url: 'https://example.com'}.to_json }} - assert_redirected_to gtt_tile_sources_path - ts.reload - assert_equal 'new name', ts.name - assert_equal 'https://example.com', ts.options['url'] - end - - test 'should destroy tilesource' do - ts = create_tile_source - assert_difference 'GttTileSource.count', -1 do - delete :destroy, params: {id: ts.to_param} - end - end - - - private - - def create_tile_source - RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', - name: 'test').tile_source - end - -end - - diff --git a/test/gtt_tile_source_test.rb b/test/gtt_map_layer_test.rb similarity index 60% rename from test/gtt_tile_source_test.rb rename to test/gtt_map_layer_test.rb index cdce0cb6..a27e037d 100644 --- a/test/gtt_tile_source_test.rb +++ b/test/gtt_map_layer_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class GttTileSourceTest < ActiveSupport::TestCase +class GttMapLayerTest < ActiveSupport::TestCase # test "the truth" do # assert true # end diff --git a/test/integration/issue_filter_api_test.rb b/test/integration/issue_filter_api_test.rb index 2d53e7e9..f581043a 100644 --- a/test/integration/issue_filter_api_test.rb +++ b/test/integration/issue_filter_api_test.rb @@ -36,7 +36,7 @@ class IssueFilterApiTest < Redmine::ApiTest::Base 'type' => 'Feature', 'geometry' => { 'type' => 'Point', - 'coordinates' => [123.324966,9.425016] + 'coordinates' => [123.324966,9.425016,0.0] } } @@ -44,7 +44,7 @@ class IssueFilterApiTest < Redmine::ApiTest::Base 'type' => 'Feature', 'geometry' => { 'type' => 'Point', - 'coordinates' => [123.269691,9.305099] + 'coordinates' => [123.269691,9.305099,0.0] } } @@ -53,7 +53,7 @@ class IssueFilterApiTest < Redmine::ApiTest::Base 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0]] ] } } diff --git a/test/integration/issues_api_test.rb b/test/integration/issues_api_test.rb index 9ca7dee5..985c4bdb 100644 --- a/test/integration/issues_api_test.rb +++ b/test/integration/issues_api_test.rb @@ -20,7 +20,7 @@ class IssuesApiTest < Redmine::ApiTest::Base 'type' => 'Feature', 'geometry' => { 'type' => 'Point', - 'coordinates' => [123.269691,9.305099] + 'coordinates' => [123.269691,9.305099,0.0] } } geojson = geo.to_json diff --git a/test/integration/projects_api_test.rb b/test/integration/projects_api_test.rb index 0a3ba9df..9ada00ff 100644 --- a/test/integration/projects_api_test.rb +++ b/test/integration/projects_api_test.rb @@ -19,7 +19,7 @@ class ProjectsApiTest < Redmine::IntegrationTest assert projects.any? assert_equal Project.visible.count, projects.size - get '/projects.xml', params: {contains: 'POINT(123.271 9.35)'} + get '/projects.xml', params: {contains: 'POINT(123.271 9.35 0.0)'} assert_response :success xml = xml_data assert projects = xml.xpath('/projects/project') @@ -30,7 +30,7 @@ class ProjectsApiTest < Redmine::IntegrationTest 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0]] ] } } @@ -40,13 +40,13 @@ class ProjectsApiTest < Redmine::IntegrationTest @subproject1.update_attribute :geojson, geojson assert @project.visible? && @subproject1.visible? - get '/projects.xml', params: {contains: 'POINT(123.271 9.55)'} + get '/projects.xml', params: {contains: 'POINT(123.271 9.55 0.0)'} assert_response :success xml = xml_data assert projects = xml.xpath('/projects/project') assert_equal 0, projects.size - get '/projects.xml', params: {contains: 'POINT(123.271 9.35)'} + get '/projects.xml', params: {contains: 'POINT(123.271 9.35 0.0)'} assert_response :success xml = xml_data assert projects = xml.xpath('/projects/project') @@ -62,7 +62,7 @@ class ProjectsApiTest < Redmine::IntegrationTest 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099], [123.269691,9.305099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0], [123.269691,9.305099,0.0]] ] } } @@ -156,7 +156,7 @@ class ProjectsApiTest < Redmine::IntegrationTest 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0]] ] } } @@ -183,7 +183,7 @@ class ProjectsApiTest < Redmine::IntegrationTest get '/projects.xml', params: { 'f[]': 'parent_id', 'op[parent_id]': '!*', - contains: 'POINT(123.271 9.35)' + contains: 'POINT(123.271 9.35 0.0)' } assert_response :success xml = xml_data @@ -197,7 +197,7 @@ class ProjectsApiTest < Redmine::IntegrationTest 'f[]': 'parent_id', 'op[parent_id]': '!*', include: 'geometry', - contains: 'POINT(123.271 9.35)' + contains: 'POINT(123.271 9.35 0.0)' } assert_response :success xml = xml_data @@ -208,40 +208,40 @@ class ProjectsApiTest < Redmine::IntegrationTest end test 'GET /projects.xml with include=layers should return layers' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - @project.gtt_tile_sources = [ts] - @subproject1.gtt_tile_sources = [ts] + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + @project.gtt_map_layers = [ts] + @subproject1.gtt_map_layers = [ts] get '/projects.xml?include=layers' assert_response :success xml = xml_data assert projects = xml.xpath('/projects/project') assert layer = projects.xpath('layers/layer').first assert layer.present? - assert_equal 'ol.source.OSM', layer['type'] + assert_equal 'Tile', layer['layer'] end test 'GET /projects/1.xml with include=layers should return layers' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - @project.gtt_tile_sources = [ts] + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + @project.gtt_map_layers = [ts] get '/projects/1.xml?include=layers' assert_response :success xml = xml_data assert project = xml.xpath('/project') assert layer = project.xpath('layers/layer').first assert layer.present? - assert_equal 'ol.source.OSM', layer['type'] + assert_equal 'Tile', layer['layer'] end test 'GET /projects.xml with include=geometry,layers should return both geojson and layers' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - @project.gtt_tile_sources = [ts] - @subproject1.gtt_tile_sources = [ts] + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + @project.gtt_map_layers = [ts] + @subproject1.gtt_map_layers = [ts] geo = { 'type' => 'Feature', 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099], [123.269691,9.305099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0], [123.269691,9.305099,0.0]] ] } } @@ -259,18 +259,18 @@ class ProjectsApiTest < Redmine::IntegrationTest assert_equal geo['geometry'], JSON.parse(json)['geometry'], json assert layer = projects.xpath('layers/layer').first assert layer.present? - assert_equal 'ol.source.OSM', layer['type'] + assert_equal 'Tile', layer['layer'] end test 'GET /projects/1.xml with include=geometry,layers should return both geojson and layers' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - @project.gtt_tile_sources = [ts] + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + @project.gtt_map_layers = [ts] geo = { 'type' => 'Feature', 'geometry' => { 'type' => 'Polygon', 'coordinates' => [ - [[123.269691,9.305099], [123.279691,9.305099],[123.279691,9.405099],[123.269691,9.405099], [123.269691,9.305099]] + [[123.269691,9.305099,0.0], [123.279691,9.305099,0.0],[123.279691,9.405099,0.0],[123.269691,9.405099,0.0], [123.269691,9.305099,0.0]] ] } } @@ -287,7 +287,7 @@ class ProjectsApiTest < Redmine::IntegrationTest assert_equal geo['geometry'], JSON.parse(json)['geometry'], json assert layer = project.xpath('layers/layer').first assert layer.present? - assert_equal 'ol.source.OSM', layer['type'] + assert_equal 'Tile', layer['layer'] end def xml_data diff --git a/test/integration/users_api_test.rb b/test/integration/users_api_test.rb index 4b27936e..1b1b4cf9 100644 --- a/test/integration/users_api_test.rb +++ b/test/integration/users_api_test.rb @@ -17,7 +17,7 @@ class UsersApiTest < Redmine::ApiTest::Base 'type' => 'Feature', 'geometry' => { 'type' => 'Point', - 'coordinates' => [123.269691,9.305099] + 'coordinates' => [123.269691,9.305099,0.0] } } geojson = geo.to_json diff --git a/test/test_helper.rb b/test/test_helper.rb index 0328a998..41677d9d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -7,7 +7,8 @@ def test_geojson end def test_coordinates - [[[135.220734222,34.705690600],[135.302273376,34.699060014],[135.300041779,34.670969984],[135.252834900,34.676052304],[135.194212540,34.676684044],[135.220734222,34.705690600]]] + # [[[135.220734222,34.705690600],[135.302273376,34.699060014],[135.300041779,34.670969984],[135.252834900,34.676052304],[135.194212540,34.676684044],[135.220734222,34.705690600]]] + [[[135.220734222,34.705690600,0.0],[135.302273376,34.699060014,0.0],[135.300041779,34.670969984,0.0],[135.252834900,34.676052304,0.0],[135.194212540,34.676684044,0.0],[135.220734222,34.705690600,0.0]]] end def point_geojson(coordinates) diff --git a/test/unit/create_map_layer_test.rb b/test/unit/create_map_layer_test.rb new file mode 100644 index 00000000..5cd25a8b --- /dev/null +++ b/test/unit/create_map_layer_test.rb @@ -0,0 +1,20 @@ +require_relative '../test_helper' + +class CreateMapLayerTest < ActiveSupport::TestCase + + test 'should create map layer' do + r = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'test', source_options_string: '{ "url": "https://example.com" }') + assert r.map_layer_created? + assert_equal 'test', r.map_layer.name + assert_equal 'https://example.com', r.map_layer.source_options['url'] + end + + test 'should validate json' do + r = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'test', source_options_string: 'lolo{ "url": "https://example.com" }') + + refute r.map_layer_created? + assert ts = r.map_layer + assert ts.errors[:source_options_string].present? + assert_equal 'lolo{ "url": "https://example.com" }', ts.source_options_string + end +end diff --git a/test/unit/create_project_test.rb b/test/unit/create_project_test.rb index fcff2bba..ffb7d234 100644 --- a/test/unit/create_project_test.rb +++ b/test/unit/create_project_test.rb @@ -2,16 +2,16 @@ class CreateProjectTest < ActiveSupport::TestCase - test 'should add default tile source if module enabled' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'not default', default: false) - assert_equal 1, GttTileSource.default.size + test 'should add default map layer if module enabled' do + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'not default', default: false) + assert_equal 1, GttMapLayer.default.size p = Project.create! name: 'test project', identifier: 'test-project' - assert p.gtt_tile_sources.none? # module not enabled + assert p.gtt_map_layers.none? # module not enabled p = Project.create! name: 'test project', identifier: 'test-project-2', enabled_module_names: ['gtt'] - assert_equal [ts], p.gtt_tile_sources.to_a + assert_equal [ts], p.gtt_map_layers.to_a end end diff --git a/test/unit/create_tile_source_test.rb b/test/unit/create_tile_source_test.rb deleted file mode 100644 index b7ec8f19..00000000 --- a/test/unit/create_tile_source_test.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../test_helper' - -class CreateTileSourceTest < ActiveSupport::TestCase - - test 'should create tile source' do - r = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'test', options_string: '{ "url": "https://example.com" }') - assert r.tile_source_created? - assert_equal 'test', r.tile_source.name - assert_equal 'https://example.com', r.tile_source.options['url'] - end - - test 'should validate json' do - r = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'test', options_string: 'lolo{ "url": "https://example.com" }') - - refute r.tile_source_created? - assert ts = r.tile_source - assert ts.errors[:options_string].present? - assert_equal 'lolo{ "url": "https://example.com" }', ts.options_string - end -end diff --git a/test/unit/gtt_map_test.rb b/test/unit/gtt_map_test.rb index 9f955e11..94577fb6 100644 --- a/test/unit/gtt_map_test.rb +++ b/test/unit/gtt_map_test.rb @@ -3,13 +3,13 @@ class GttMapTest < GttTest setup do - @ts = GttTileSource.create! name: 'test', type: 'ol.source.OSM' + @ts = GttMapLayer.create! name: 'test', layer: 'Tile' end - test 'should compute json from geom' do - m = GttMap.new layers: [@ts], geom: test_geom - assert_geojson m.json - end + # test 'should compute json from geom' do + # m = GttMap.new layers: [@ts], geom: test_geom + # assert_geojson m.json + # end end diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index e72d8ab5..11e5cf88 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -65,7 +65,7 @@ class IssueTest < GttTest end test 'should ignore small point geom changes' do - coordinates = [135.220734222412, 34.7056906000311] + coordinates = [135.220734222412, 34.7056906000311, 0.0] @issue.update_attribute :geojson, point_geojson(coordinates) @issue.instance_variable_set "@geojson", nil @@ -76,7 +76,7 @@ class IssueTest < GttTest @issue.instance_variable_set "@geojson", nil assert_equal old_coordinates, @issue.geojson["geometry"]["coordinates"] - new_coordinates = [old_coordinates[0] + 0.2, old_coordinates[1]] + new_coordinates = [old_coordinates[0] + 0.2, old_coordinates[1], old_coordinates[2]] @issue.update_attribute :geojson, point_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal new_coordinates, @issue.geojson["geometry"]["coordinates"] @@ -89,17 +89,17 @@ class IssueTest < GttTest @issue.instance_variable_set "@geojson", nil old_coordinates = @issue.geojson["geometry"]["coordinates"] - new_coordinates = old_coordinates.map{|c| [c[0] + 0.000000001, c[1] + 0.000000001]} + new_coordinates = old_coordinates.map{|c| [c[0] + 0.000000001, c[1] + 0.000000001, c[2]]} @issue.update_attribute :geojson, linestring_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal old_coordinates, @issue.geojson["geometry"]["coordinates"] - new_coordinates = old_coordinates.map{|c| [c[0] + 0.2, c[1]]} + new_coordinates = old_coordinates.map{|c| [c[0] + 0.2, c[1], c[2]]} @issue.update_attribute :geojson, linestring_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal new_coordinates, @issue.geojson["geometry"]["coordinates"] - new_coordinates = old_coordinates.map{|c| [c[0], c[1]]} + new_coordinates = old_coordinates.map{|c| [c[0], c[1], c[2]]} new_coordinates.delete_at(1) @issue.update_attribute :geojson, linestring_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil @@ -113,18 +113,18 @@ class IssueTest < GttTest @issue.instance_variable_set "@geojson", nil old_coordinates = @issue.geojson["geometry"]["coordinates"] - new_coordinates = [old_coordinates[0].map{|c| [c[0] + 0.000000001, c[1] + 0.000000001]}] + new_coordinates = [old_coordinates[0].map{|c| [c[0] + 0.000000001, c[1] + 0.000000001, c[2]]}] @issue.update_attribute :geojson, polygon_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal old_coordinates, @issue.geojson["geometry"]["coordinates"] - new_coordinates = [old_coordinates[0].map{|c| [c[0] + 0.2, c[1]]}] + new_coordinates = [old_coordinates[0].map{|c| [c[0] + 0.2, c[1], c[2]]}] @issue.update_attribute :geojson, polygon_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal new_coordinates, @issue.geojson["geometry"]["coordinates"] - new_coordinates = [old_coordinates[0].map{|c| [c[0], c[1]]}] - new_coordinates[0].insert(2, [135.301041779,34.680969984]) + new_coordinates = [old_coordinates[0].map{|c| [c[0], c[1], c[2]]}] + new_coordinates[0].insert(2, [135.301041779,34.680969984,0.0]) @issue.update_attribute :geojson, polygon_geojson(new_coordinates) @issue.instance_variable_set "@geojson", nil assert_equal new_coordinates, @issue.geojson["geometry"]["coordinates"] diff --git a/test/unit/update_map_layer_test.rb b/test/unit/update_map_layer_test.rb new file mode 100644 index 00000000..d4cc30bc --- /dev/null +++ b/test/unit/update_map_layer_test.rb @@ -0,0 +1,13 @@ +require_relative '../test_helper' + +class UpdateMapLayerTest < ActiveSupport::TestCase + + test 'should update map layer' do + ts = GttMapLayer.create! name: 'test', layer: 'Tile' + r = RedmineGtt::Actions::UpdateMapLayer.(ts, name: 'new', source_options_string: '{ "url": "https://example.com"}') + assert r.map_layer_updated? + assert_equal 'new', r.map_layer.name + assert_equal 'https://example.com', r.map_layer.source_options['url'] + end +end + diff --git a/test/unit/update_project_settings_test.rb b/test/unit/update_project_settings_test.rb index 01030d84..80a9b6ed 100644 --- a/test/unit/update_project_settings_test.rb +++ b/test/unit/update_project_settings_test.rb @@ -3,48 +3,48 @@ class UpdateProjectSettingsTest < GttTest fixtures :projects - test 'should save tile sources' do + test 'should save map layer' do p = Project.find 'ecookbook' - ts = GttTileSource.create! name: 'test', type: 'ol.source.OSM' - form = GttConfiguration.from_params gtt_tile_source_ids: [ ts.id ] + ts = GttMapLayer.create! name: 'test', layer: 'Tile' + form = GttConfiguration.from_params gtt_map_layer_ids: [ ts.id ] form.project = p r = RedmineGtt::Actions::UpdateProjectSettings.( form ) assert r.settings_saved? p.reload - assert_equal [ts], p.gtt_tile_sources.to_a + assert_equal [ts], p.gtt_map_layers.to_a end - test 'should validate invalid multipolygon geometry' do - p = Project.find 'ecookbook' - coordinates = [ - [ - [[135.0, 35.0], [136.0, 35.0], [136.0, 36.0], [135.0, 36.0], [135.0, 35.0]] - ], - [ - [[136.0, 35.0], [137.0, 35.0], [137.0, 36.0], [136.0, 36.0], [136.0, 35.0]] - ] - ] + # test 'should validate invalid multipolygon geometry' do + # p = Project.find 'ecookbook' + # coordinates = [ + # [ + # [[135.0, 35.0], [136.0, 35.0], [136.0, 36.0], [135.0, 36.0], [135.0, 35.0]] + # ], + # [ + # [[136.0, 35.0], [137.0, 35.0], [137.0, 36.0], [136.0, 36.0], [136.0, 35.0]] + # ] + # ] - form = GttConfiguration.from_params geojson: multipolygon_geojson(coordinates) - form.project = p - r = RedmineGtt::Actions::UpdateProjectSettings.( form ) + # form = GttConfiguration.from_params geojson: multipolygon_geojson(coordinates) + # form.project = p + # r = RedmineGtt::Actions::UpdateProjectSettings.( form ) - assert_not r.settings_saved? + # assert_not r.settings_saved? - p.reload - assert_include 'Geometry is invalid', p.errors.full_messages - end + # p.reload + # assert_include 'Geometry is invalid', p.errors.full_messages + # end test 'should save valid multipolygon geometry' do p = Project.find 'ecookbook' coordinates = [ [ - [[135.0, 35.0], [136.0, 35.0], [136.0, 36.0], [135.0, 36.0], [135.0, 35.0]] + [[135.0, 35.0, 0.0], [136.0, 35.0, 0.0], [136.0, 36.0, 0.0], [135.0, 36.0, 0.0], [135.0, 35.0, 0.0]] ], [ - [[137.0, 35.0], [138.0, 35.0], [138.0, 36.0], [137.0, 36.0], [137.0, 35.0]] + [[137.0, 35.0, 0.0], [138.0, 35.0, 0.0], [138.0, 36.0, 0.0], [137.0, 36.0, 0.0], [137.0, 35.0, 0.0]] ] ] diff --git a/test/unit/update_project_test.rb b/test/unit/update_project_test.rb index 41fba051..f6e057c0 100644 --- a/test/unit/update_project_test.rb +++ b/test/unit/update_project_test.rb @@ -2,16 +2,16 @@ class UpdateProjectTest < ActiveSupport::TestCase - test 'should add default tile source if module is enabled' do - ts = RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'default', default: true).tile_source - RedmineGtt::Actions::CreateTileSource.(type: 'ol.source.OSM', name: 'not default', default: false) + test 'should add default map layer if module is enabled' do + ts = RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'default', default: true).map_layer + RedmineGtt::Actions::CreateMapLayer.(layer: 'Tile', name: 'not default', default: false) p = Project.create! name: 'test project', identifier: 'test-project' - assert p.gtt_tile_sources.none? # module not enabled + assert p.gtt_map_layers.none? # module not enabled p.update_attribute :enabled_module_names, ['gtt'] p.reload - assert_equal [ts], p.gtt_tile_sources.to_a + assert_equal [ts], p.gtt_map_layers.to_a end end diff --git a/test/unit/update_tile_source_test.rb b/test/unit/update_tile_source_test.rb deleted file mode 100644 index 455fbc9e..00000000 --- a/test/unit/update_tile_source_test.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../test_helper' - -class UpdateTileSourceTest < ActiveSupport::TestCase - - test 'should update tile source' do - ts = GttTileSource.create! name: 'test', type: 'ol.source.OSM' - r = RedmineGtt::Actions::UpdateTileSource.(ts, name: 'new', options_string: '{ "url": "https://example.com"}') - assert r.tile_source_updated? - assert_equal 'new', r.tile_source.name - assert_equal 'https://example.com', r.tile_source.options['url'] - end -end - diff --git a/tsconfig.json b/tsconfig.json index 23bc2bfe..c78fe4fe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,15 @@ { "compilerOptions": { - "outDir": "./dist/", - "noImplicitAny": true, - "module": "es6", "target": "es5", + "module": "es6", + "moduleResolution": "node", "jsx": "react", + "baseUrl": "./src/", + "outDir": "./dist", "allowJs": true, - "moduleResolution": "node", + "noImplicitAny": true, "paths": { - "*": ["./src/@types/*"] + "*": ["@types/*"] } } } diff --git a/webpack.config.js b/webpack.config.js index 2bd336bd..cbfa6ba2 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,45 +1,61 @@ -const path = require('path') +const path = require('path'); + +// Define loaders +// Loaders for processing Sass files +const sassLoaders = [ + 'style-loader', // Creates `style` nodes from JS strings + 'css-loader', // Translates CSS into CommonJS + 'sass-loader', // Compiles Sass to CSS +]; + +// Loaders for processing CSS files +const cssLoaders = ['style-loader', 'css-loader']; + +// Loaders for processing image files +const imageLoaders = { + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/resource', + generator: { + filename: '[name][ext]', // Keep the original file name and extension + }, +}; + +// Loaders for processing font files +const fontLoaders = { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + generator: { + filename: '[name][ext]', // Keep the original file name and extension + }, +}; + +// Loaders for processing TypeScript files +const tsLoaders = { + test: /\.ts$/i, + use: 'ts-loader', +}; module.exports = { - mode: 'production', - entry: path.resolve(__dirname, 'src', 'index.ts'), + mode: 'production', // Set build mode to production + entry: path.join(__dirname, 'src', 'index.ts'), // Specify entry point module: { rules: [ - { - test: /\.s[ac]ss$/i, - use: [ - // Creates `style` nodes from JS strings - "style-loader", - // Translates CSS into CommonJS - "css-loader", - // Compiles Sass to CSS - "sass-loader", - ], - }, - { - test: /\.css$/i, - use: ['style-loader', 'css-loader'], - }, - { - test: /\.(png|svg|jpg|jpeg|gif)$/i, - type: 'asset/resource', - }, - { - test: /\.(woff|woff2|eot|ttf|otf)$/i, - type: 'asset/resource', - }, - { - test: /\.ts$/i, - use: 'ts-loader', - }, + // Apply loaders + { test: /\.s[ac]ss$/i, use: sassLoaders }, + { test: /\.css$/i, use: cssLoaders }, + imageLoaders, + fontLoaders, + tsLoaders, ], }, - devtool: false, + devtool: false, // Disable source maps + // devtool: 'source-map', // Generate source maps for easier debugging resolve: { - extensions: ['.ts', '.js'] + extensions: ['.ts', '.js'], // Specify file extensions to resolve }, output: { filename: 'main.js', - path: path.resolve(__dirname, 'assets', 'javascripts') - } -} + path: path.resolve(__dirname, 'assets'), + assetModuleFilename: '[name].[ext]', + }, +}; diff --git a/yarn.lock b/yarn.lock index 7c33cb0b..110f17e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,21 +3,21 @@ "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + version "7.21.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== dependencies: regenerator-runtime "^0.13.11" "@discoveryjs/json-ext@^0.5.0": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -25,48 +25,53 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" "@juggle/resize-observer@^3.4.0": version "3.4.0" - resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz" integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== "@mapbox/jsonlint-lines-primitives@~2.0.2": version "2.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + resolved "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz" integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== "@mapbox/mapbox-gl-style-spec@^13.23.1": version "13.28.0" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz#2ec226320a0f77856046e000df9b419303a56458" + resolved "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz" integrity sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg== dependencies: "@mapbox/jsonlint-lines-primitives" "~2.0.2" @@ -80,260 +85,260 @@ "@mapbox/point-geometry@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + resolved "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz" integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ== "@mapbox/unitbezier@^0.0.0": version "0.0.0" - resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + resolved "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz" integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== -"@material-design-icons/font@^0.14.2": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@material-design-icons/font/-/font-0.14.2.tgz#5b02c3bda37022645cc2df0200be02b6bc91ab4a" - integrity sha512-svLx/Q6WidjiSE1rT9joMy241x+gLb0SfNrVR0Kd3GyPyU5HXRmXvjWDj2h2RHzAsgxFqPGez4hL+EmbjZiYSg== +"@mdi/font@^7.2.96": + version "7.2.96" + resolved "https://registry.yarnpkg.com/@mdi/font/-/font-7.2.96.tgz#af800d9fe3b424f85ad45e9baa755bd003ab4986" + integrity sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w== "@petamoriken/float16@^3.4.7": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.7.1.tgz#4a0cc0854a3a101cc2d697272f120e1a05975ce5" - integrity sha512-oXZOc+aePd0FnhTWk15pyqK+Do87n0TyLV1nxdEougE95X/WXWDqmQobfhgnSY7QsWn5euZUWuDVeTQvoQ5VNw== + version "3.8.0" + resolved "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.0.tgz" + integrity sha512-AhVAm6SQ+zgxIiOzwVdUcDmKlu/qU39FiYD2UD6kQQaVenrn0dGZewIghWAENGQsvC+1avLCuT+T2/3Gsp/W3w== "@types/eslint-scope@^3.7.3": version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.0.tgz#21724cfe12b96696feafab05829695d4d7bd7c48" - integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA== + version "8.37.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/fontfaceobserver@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@types/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz" + integrity sha512-Vqf183RAiFdIjUi4asKqogf2HIfLDnxn+dQo9GCpnsU5QrrsLMA2bkJU1dHRudQlizLybWD61Csd1zAgUQ3JKQ== "@types/geojson@^7946.0.10": version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz" integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== "@types/jquery@*", "@types/jquery@^3.5.16": version "3.5.16" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.16.tgz#632131baf30951915b0317d48c98e9890bdf051d" + resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz" integrity sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw== dependencies: "@types/sizzle" "*" -"@types/jqueryui@^1.12.16": - version "1.12.16" - resolved "https://registry.yarnpkg.com/@types/jqueryui/-/jqueryui-1.12.16.tgz#9e319f7db39490db950cba77fe83887e0ad3e1d9" - integrity sha512-6huAQDpNlso9ayaUT9amBOA3kj02OCeUWs+UvDmbaJmwkHSg/HLsQOoap/D5uveN9ePwl72N45Bl+Frp5xyG1Q== +"@types/jqueryui@^1.12.17": + version "1.12.17" + resolved "https://registry.yarnpkg.com/@types/jqueryui/-/jqueryui-1.12.17.tgz#afc9b3c12456995989a8562c67c9f631e79b60fc" + integrity sha512-rqiCaZO7d1rAcJVXNSV6MYwt42oB4ArTRr0QbU3f4+Siv0d6m9uRkhiKHpc6oL9NFJKDxzIIDvUeMXTtlJFFaA== dependencies: "@types/jquery" "*" "@types/json-schema@*", "@types/json-schema@^7.0.8": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/node@*": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + version "20.1.4" + resolved "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz" + integrity sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q== "@types/ol-ext@npm:@siedlerchr/types-ol-ext": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@siedlerchr/types-ol-ext/-/types-ol-ext-3.0.9.tgz#7e45ab0e212a46f0b16622aa008ef0b37157f160" - integrity sha512-OwQovO8A+CtIqBr4s8r6hn9sN2uR3nB+z/MiLOYLS5YPPaJ1h0nyJXxmsofjcmtedGLkqwLcAl1YfAKxjG3bAg== + version "3.2.0" + resolved "https://registry.npmjs.org/@siedlerchr/types-ol-ext/-/types-ol-ext-3.2.0.tgz" + integrity sha512-G6+IkijEDBfseBLtOxUsc+CnmyKrHQfTpmbjSVTea1enUIifpWkTkxAIQ1dtaOGCZiSjclRpmz9e3MioEzvBkA== dependencies: jspdf "^2.5.1" "@types/raf@^3.4.0": version "3.4.0" - resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.0.tgz#2b72cbd55405e071f1c4d29992638e022b20acc2" + resolved "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz" integrity sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw== "@types/sizzle@*": version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.0.1.tgz#a69720f6c9bad6aef54a8fa6ba9c3533e7ef4c7f" - integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== -"@webpack-cli/info@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0" - integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== -"@webpack-cli/serve@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8" - integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn@^8.5.0, acorn@^8.7.1: version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.12.5: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -343,14 +348,14 @@ ajv@^6.12.5: ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -358,29 +363,29 @@ anymatch@~3.1.2: atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== base64-arraybuffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.14.5: version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -390,22 +395,22 @@ browserslist@^4.14.5: btoa@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== caniuse-lite@^1.0.30001449: - version "1.0.30001450" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f" - integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== + version "1.0.30001487" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz" + integrity sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA== canvg@^3.0.6: version "3.0.10" - resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.10.tgz#8e52a2d088b6ffa23ac78970b2a9eebfae0ef4b3" + resolved "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz" integrity sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q== dependencies: "@babel/runtime" "^7.12.5" @@ -419,7 +424,7 @@ canvg@^3.0.6: chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -427,7 +432,7 @@ chalk@^4.1.0: "chokidar@>=3.0.0 <4.0.0": version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -442,12 +447,12 @@ chalk@^4.1.0: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -456,39 +461,39 @@ clone-deep@^4.0.1: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^9.4.1: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - core-js@^3.6.0, core-js@^3.8.3: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" - integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== + version "3.30.2" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz" + integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -497,20 +502,20 @@ cross-spawn@^7.0.3: css-line-break@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + resolved "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz" integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== dependencies: utrie "^1.0.2" -css-loader@^6.7.3: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== +css-loader@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" @@ -518,55 +523,63 @@ css-loader@^6.7.3: csscolorparser@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + resolved "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz" integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== dompurify@^2.2.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" - integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== + version "2.4.5" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz" + integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== earcut@^2.2.3: version "2.2.4" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + resolved "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz" integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== electron-to-chromium@^1.4.284: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + version "1.4.394" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz" + integrity sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw== + +enhanced-resolve@^5.0.0: + version "5.14.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz" + integrity sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" envinfo@^7.7.3: version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -574,61 +587,66 @@ eslint-scope@5.1.1: esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fastest-levenshtein@^1.0.12: version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fflate@^0.4.8: version "0.4.8" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz" integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" +fontfaceobserver@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz" + integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -636,17 +654,17 @@ fsevents@~2.3.2: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== geojson@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/geojson/-/geojson-0.5.0.tgz#3cd6c96399be65b56ee55596116fe9191ce701c0" + resolved "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz" integrity sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ== geotiff@^2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/geotiff/-/geotiff-2.0.7.tgz#358e578233af70bfb0b4dee62d599ad78fc5cfca" + resolved "https://registry.npmjs.org/geotiff/-/geotiff-2.0.7.tgz" integrity sha512-FKvFTNowMU5K6lHYY2f83d4lS2rsCNdpUC28AX61x9ZzzqPNaWFElWv93xj0eJFaNyOYA63ic5OzJ88dHpoA5Q== dependencies: "@petamoriken/float16" "^3.4.7" @@ -659,36 +677,36 @@ geotiff@^2.0.7: glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" html2canvas@^1.0.0-rc.5: version "1.4.1" - resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + resolved "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz" integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== dependencies: css-line-break "^2.1.0" @@ -696,22 +714,22 @@ html2canvas@^1.0.0-rc.5: icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ieee754@^1.1.12: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immutable@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" - integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== + version "4.3.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -719,60 +737,60 @@ import-local@^3.0.2: interpret@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0: + version "2.12.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -781,22 +799,22 @@ jest-worker@^27.4.5: json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stringify-pretty-compact@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz#e77c419f52ff00c45a31f07f4c820c2433143885" + resolved "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz" integrity sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ== jspdf@^2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-2.5.1.tgz#00c85250abf5447a05f3b32ab9935ab4a56592cc" + resolved "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz" integrity sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA== dependencies: "@babel/runtime" "^7.14.0" @@ -811,51 +829,46 @@ jspdf@^2.5.1: kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klona@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - lerc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lerc/-/lerc-3.0.0.tgz#36f36fbd4ba46f0abf4833799fff2e7d6865f5cb" + resolved "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz" integrity sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww== loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" mapbox-to-css-font@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz#a9e31b363ad8ca881cd339ca99f2d2a6b02ea5dd" + resolved "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz" integrity sha512-f+NBjJJY4T3dHtlEz1wCG7YFlkODEjFIYlxDdLIDMNpkSksqTt+l/d4rjuwItxuzkuMFvPyrjzV2lxRM4ePcIA== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.0: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -863,112 +876,113 @@ micromatch@^4.0.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.27: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-releases@^2.0.8: - version "2.0.9" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.9.tgz#fe66405285382b0c4ac6bcfbfbe7e8a510650b4d" - integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -ol-ext@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ol-ext/-/ol-ext-4.0.4.tgz#1474253d60c48378f0e7753e3e382835fd2cb21f" - integrity sha512-VMSsBc/vuWgMvk2U8qUNLN0kKjsuPowISmqmMB9Bs8PfyHBNBKCUgMkYOVzO2cX5EQOdVkkcsa0N/Oln5L0oYA== +ol-ext@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/ol-ext/-/ol-ext-4.0.8.tgz" + integrity sha512-O0q4HmvrB+r0VOC3SAp9jEYSFN6Z3j1kSxRZxPK3VadArWjF27PXF+TGHj7HidzBy84jEre5/vDSv8oJbECbyA== -ol-mapbox-style@^9.2.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/ol-mapbox-style/-/ol-mapbox-style-9.5.0.tgz#94dfa7ade57ee0b442a79162a1d57b70778dda4d" - integrity sha512-ArYzeuZ4dOYZ6UnhXK30kNBdouZay/r6LzLsFGnvJ86lxY6ShJu2FtcKCFGCOZoJZYyoLCStHYOHcRrVLDaJ0Q== +ol-mapbox-style@^10.1.0, ol-mapbox-style@^10.6.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/ol-mapbox-style/-/ol-mapbox-style-10.6.0.tgz#89ac864160a374d936a59f7d1c969d4dc1d0a46b" + integrity sha512-s86QhCoyyKVRsYkvPzzdWd///bhYh3onWrBq4lNXnCd9G/hS6AoK023kn4zlDESVlTBDTWLz8vhOistp0M3TXA== dependencies: "@mapbox/mapbox-gl-style-spec" "^13.23.1" mapbox-to-css-font "^2.4.1" + ol "^7.3.0" -ol@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/ol/-/ol-7.2.2.tgz#d675a1525fd995a29a70a9a9fa9c3a9bc827aa39" - integrity sha512-eqJ1hhVQQ3Ap4OhYq9DRu5pz9RMpLhmoTauDoIqpn7logVi1AJE+lXjEHrPrTSuZYjtFbMgqr07sxoLNR65nrw== +ol@^7.3.0, ol@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/ol/-/ol-7.4.0.tgz#935436c0843d1f939972e076d4fcb130530ce9d7" + integrity sha512-bgBbiah694HhC0jt8ptEFNRXwgO8d6xWH3G97PCg4bmn9Li5nLLbi59oSrvqUI6VPVwonPQF1YcqJymxxyMC6A== dependencies: earcut "^2.2.3" geotiff "^2.0.7" - ol-mapbox-style "^9.2.0" + ol-mapbox-style "^10.1.0" pbf "3.2.1" rbush "^3.0.1" p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== parse-headers@^2.0.2: version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== pbf@3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + resolved "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz" integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== dependencies: ieee754 "^1.1.12" @@ -976,35 +990,35 @@ pbf@3.2.1: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -1012,215 +1026,223 @@ postcss-modules-local-by-default@^4.0.0: postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + version "6.0.12" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz" + integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.4.21: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" protocol-buffers-schema@^3.3.1: version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz" integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== punycode@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== quick-lru@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.1.tgz#f8e5bf9010376c126c80c1a62827a526c0e60adf" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz" integrity sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q== quickselect@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== raf@^3.4.1: version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" rbush@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" + resolved "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz" integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== dependencies: quickselect "^2.0.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: resolve "^1.20.0" regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-protobuf-schema@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + resolved "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== dependencies: protocol-buffers-schema "^3.3.1" resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" rgbcolor@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + resolved "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz" integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== rw@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== safe-buffer@^5.1.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass-loader@^13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.0.tgz#80195050f58c9aac63b792fa52acb6f5e0f6bdc3" - integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== +sass-loader@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== dependencies: - klona "^2.0.4" neo-async "^2.6.2" -sass@^1.58.0: - version "1.58.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" - integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== +sass@^1.63.5: + version "1.63.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.5.tgz#6e1900b12576e3e74a8ab0a9d8607cacbe584ef1" + integrity sha512-Q6c5gs482oezdAp+0fWF9cRisvpy7yfYb64knID0OE8AnMgtkluRPfpGMFjeD4/+M4+6QpJZCU6JRSxbjiktkg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" semver@^7.3.4, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.0: +serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== sort-asc@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.1.0.tgz#ab799df61fc73ea0956c79c4b531ed1e9e7727e9" + resolved "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz" integrity sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw== sort-desc@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.1.1.tgz#198b8c0cdeb095c463341861e3925d4ee359a9ee" + resolved "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz" integrity sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw== sort-object@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-0.3.2.tgz#98e0d199ede40e07c61a84403c61d6c3b290f9e2" + resolved "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz" integrity sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA== dependencies: sort-asc "^0.1.0" @@ -1228,12 +1250,12 @@ sort-object@^0.3.2: "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -1241,63 +1263,63 @@ source-map-support@~0.5.20: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== stackblur-canvas@^2.0.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz#aa87bbed1560fdcd3138fff344fc6a1c413ebac4" + resolved "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz" integrity sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ== -style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== +style-loader@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-pathdata@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" + resolved "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz" integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.7: + version "5.3.8" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz" + integrity sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@^5.14.1: - version "5.16.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2" - integrity sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg== +terser@^5.16.8: + version "5.17.3" + resolved "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz" + integrity sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -1306,63 +1328,63 @@ terser@^5.14.1: text-segmentation@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + resolved "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz" integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== dependencies: utrie "^1.0.2" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -ts-loader@^9.4.2: - version "9.4.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" - integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== +ts-loader@^9.4.3: + version "9.4.3" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.3.tgz#55cfa7c28dd82a2de968ae45c3adb75fb888b27e" + integrity sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" micromatch "^4.0.0" semver "^7.3.4" -typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utrie@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + resolved "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz" integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== dependencies: base64-arraybuffer "^1.0.2" watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -1370,20 +1392,20 @@ watchpack@^2.4.0: web-worker@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== -webpack-cli@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.0.1.tgz#95fc0495ac4065e9423a722dec9175560b6f2d9a" - integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.0.1" - "@webpack-cli/info" "^2.0.1" - "@webpack-cli/serve" "^2.0.1" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" colorette "^2.0.14" - commander "^9.4.1" + commander "^10.0.1" cross-spawn "^7.0.3" envinfo "^7.7.3" fastest-levenshtein "^1.0.12" @@ -1394,7 +1416,7 @@ webpack-cli@^5.0.1: webpack-merge@^5.7.3: version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" @@ -1402,25 +1424,25 @@ webpack-merge@^5.7.3: webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.75.0: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== +webpack@^5.87.0: + version "5.87.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.87.0.tgz#df8a9c094c6037f45e0d77598f9e59d33ca3a98c" + integrity sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -1429,30 +1451,30 @@ webpack@^5.75.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== xml-utils@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/xml-utils/-/xml-utils-1.3.0.tgz#f1043534e3ac3deda12ddab39f8442e16da98ebb" - integrity sha512-i4PIrX33Wd66dvwo4syicwlwmnr6wuvvn4f2ku9hA67C2Uk62Xubczuhct+Evnd12/DV71qKNeDdJwES8HX1RA== + version "1.7.0" + resolved "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz" + integrity sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==