From 709201bf230793fa814d46ae66789a6c750bfe2c Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 26 Mar 2020 12:29:38 +0100 Subject: [PATCH] dashboards --- pandora_console/ajax.php | 15 +- pandora_console/extras/mr/37.sql | 2 + .../pandoradb_migrate_6.0_to_7.0.mysql.sql | 7 +- pandora_console/general/header.php | 6 +- pandora_console/general/main_menu.php | 4 +- .../godmode/users/configure_user.php | 29 +- .../images/widgets/agent_module.png | Bin 0 -> 2805 bytes .../images/widgets/alerts_fired.png | Bin 0 -> 2682 bytes pandora_console/images/widgets/clock.png | Bin 0 -> 46955 bytes .../images/widgets/custom_graph.png | Bin 0 -> 2316 bytes .../images/widgets/events_list.png | Bin 0 -> 2964 bytes pandora_console/images/widgets/example.png | Bin 0 -> 2730 bytes .../images/widgets/graph_module_histogram.png | Bin 0 -> 2205 bytes .../images/widgets/groups_status.png | Bin 0 -> 2548 bytes .../images/widgets/maps_made_by_user.png | Bin 0 -> 4162 bytes .../images/widgets/maps_status.png | Bin 0 -> 2631 bytes .../images/widgets/module_icon.png | Bin 0 -> 2903 bytes .../images/widgets/module_status.png | Bin 0 -> 3214 bytes .../images/widgets/module_table_value.png | Bin 0 -> 3271 bytes .../images/widgets/module_value.png | Bin 0 -> 3435 bytes .../images/widgets/monitor_health.png | Bin 0 -> 3101 bytes .../images/widgets/network_map.png | Bin 0 -> 3671 bytes pandora_console/images/widgets/post.png | Bin 0 -> 2760 bytes pandora_console/images/widgets/reports.png | Bin 0 -> 2583 bytes .../images/widgets/service_map.png | Bin 0 -> 2304 bytes .../images/widgets/single_graph.png | Bin 0 -> 2941 bytes .../images/widgets/sla_percent.png | Bin 0 -> 3597 bytes .../images/widgets/system_group_status.png | Bin 0 -> 2849 bytes pandora_console/images/widgets/tactical.png | Bin 0 -> 2583 bytes pandora_console/images/widgets/top_n.png | Bin 0 -> 3131 bytes .../images/widgets/top_n_events_by_group.png | Bin 0 -> 3001 bytes .../images/widgets/top_n_events_by_module.png | Bin 0 -> 3337 bytes pandora_console/images/widgets/tree_view.png | Bin 0 -> 3030 bytes pandora_console/images/widgets/url.png | Bin 0 -> 3179 bytes .../images/widgets/ux_transaction.png | Bin 0 -> 2824 bytes .../images/widgets/wux_transaction.png | Bin 0 -> 3192 bytes .../images/widgets/wux_transaction_stats.png | Bin 0 -> 4177 bytes pandora_console/include/ajax/graph.ajax.php | 2 - pandora_console/include/ajax/tree.ajax.php | 28 +- .../include/ajax/visual_console.ajax.php | 23 +- pandora_console/include/chart_generator.php | 21 +- .../include/class/NetworkMap.class.php | 19 +- .../include/class/OrderInterpreter.class.php | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/include/functions.php | 21 +- pandora_console/include/functions_agents.php | 84 +- pandora_console/include/functions_events.php | 2 +- pandora_console/include/functions_graph.php | 386 +-- pandora_console/include/functions_html.php | 74 +- pandora_console/include/functions_menu.php | 5 +- .../include/functions_reporting.php | 326 ++- .../include/functions_treeview.php | 21 +- pandora_console/include/functions_ui.php | 9 +- .../include/functions_visual_map.php | 175 +- pandora_console/include/graphs/fgraph.php | 471 +++- .../include/graphs/flot/pandora.flot.js | 390 ++- .../include/graphs/functions_d3.php | 159 +- .../include/graphs/functions_flot.php | 291 +-- pandora_console/include/graphs/pandora.d3.js | 12 +- .../include/javascript/gridstack.all.js | 1715 +++++++++++++ .../include/javascript/gridstack.jQueryUI.js | 135 + .../include/javascript/gridstack.js | 2235 +++++++++++++++++ .../include/javascript/gridstack.min.map | 1 + .../include/javascript/pandora_dashboards.js | 1300 ++++++++++ .../include/javascript/pandora_events.js | 24 +- .../include/javascript/pandora_ui.js | 3 + .../javascript/pandora_visual_console.js | 33 +- .../include/javascript/tree/TreeController.js | 5 +- .../include/lib/Dashboard/Cell.php | 240 ++ .../include/lib/Dashboard/Manager.php | 1321 ++++++++++ .../include/lib/Dashboard/Widget.php | 571 +++++ .../lib/Dashboard/Widgets/agent_module.php | 802 ++++++ .../lib/Dashboard/Widgets/alerts_fired.php | 344 +++ .../include/lib/Dashboard/Widgets/clock.php | 300 +++ .../lib/Dashboard/Widgets/custom_graph.php | 388 +++ .../lib/Dashboard/Widgets/events_list.php | 560 +++++ .../include/lib/Dashboard/Widgets/example.php | 275 ++ .../Widgets/graph_module_histogram.php | 402 +++ .../lib/Dashboard/Widgets/groups_status.php | 488 ++++ .../Dashboard/Widgets/maps_made_by_user.php | 426 ++++ .../lib/Dashboard/Widgets/maps_status.php | 339 +++ .../lib/Dashboard/Widgets/module_icon.php | 485 ++++ .../lib/Dashboard/Widgets/module_status.php | 484 ++++ .../Dashboard/Widgets/module_table_value.php | 395 +++ .../lib/Dashboard/Widgets/module_value.php | 387 +++ .../lib/Dashboard/Widgets/monitor_health.php | 335 +++ .../lib/Dashboard/Widgets/network_map.php | 380 +++ .../include/lib/Dashboard/Widgets/post.php | 266 ++ .../include/lib/Dashboard/Widgets/reports.php | 360 +++ .../lib/Dashboard/Widgets/service_map.php | 360 +++ .../lib/Dashboard/Widgets/single_graph.php | 348 +++ .../lib/Dashboard/Widgets/sla_percent.php | 421 ++++ .../Dashboard/Widgets/system_group_status.php | 486 ++++ .../lib/Dashboard/Widgets/tactical.php | 459 ++++ .../include/lib/Dashboard/Widgets/top_n.php | 490 ++++ .../Widgets/top_n_events_by_group.php | 434 ++++ .../Widgets/top_n_events_by_module.php | 471 ++++ .../lib/Dashboard/Widgets/tree_view.php | 566 +++++ .../include/lib/Dashboard/Widgets/url.php | 276 ++ .../lib/Dashboard/Widgets/ux_transaction.php | 18 + .../lib/Dashboard/Widgets/wux_transaction.php | 386 +++ .../Widgets/wux_transaction_stats.php | 342 +++ pandora_console/include/lib/View.php | 38 + pandora_console/include/rest-api/index.php | 32 +- .../include/rest-api/models/CachedModel.php | 6 +- .../include/rest-api/models/Model.php | 9 +- .../models/VisualConsole/Container.php | 11 +- .../rest-api/models/VisualConsole/Item.php | 13 +- .../models/VisualConsole/Items/BarsGraph.php | 60 +- .../models/VisualConsole/Items/ColorCloud.php | 8 +- .../models/VisualConsole/Items/DonutGraph.php | 8 +- .../VisualConsole/Items/EventsHistory.php | 15 +- .../models/VisualConsole/Items/Group.php | 8 +- .../models/VisualConsole/Items/Icon.php | 8 +- .../models/VisualConsole/Items/Line.php | 13 +- .../VisualConsole/Items/ModuleGraph.php | 45 +- .../models/VisualConsole/Items/Percentile.php | 8 +- .../VisualConsole/Items/SimpleValue.php | 8 +- .../VisualConsole/Items/StaticGraph.php | 8 +- .../include/styles/bootstrap.min.css | 7 + .../include/styles/bootstrap.min.css.map | 1 + pandora_console/include/styles/dashboards.css | 491 ++++ pandora_console/include/styles/form.css | 5 +- .../include/styles/gridstack-extra.min.css | 1 + .../include/styles/gridstack.min.css | 317 +++ pandora_console/include/styles/pandora.css | 18 +- .../include/visual-console-client/vc.main.css | 48 +- .../visual-console-client/vc.main.css.map | 2 +- pandora_console/index.php | 16 +- pandora_console/mobile/index.php | 37 - .../agentes/estado_generalagente.php | 57 +- .../operation/agentes/networkmap.dinamic.php | 3 +- .../agentes/pandora_networkmap.view.php | 28 +- .../operation/dashboard/dashboard.php | 73 + pandora_console/operation/menu.php | 31 +- .../operation/reporting/graph_viewer.php | 10 +- pandora_console/operation/users/user_edit.php | 29 +- pandora_console/pandoradb.sql | 1 + pandora_console/pandoradb_data.sql | 4 +- pandora_console/vendor/composer/LICENSE | 2 + .../vendor/composer/autoload_classmap.php | 3 + .../vendor/composer/autoload_static.php | 3 + pandora_console/views/dashboard/cell.php | 90 + .../views/dashboard/configurationWidgets.php | 62 + .../views/dashboard/formDashboard.php | 129 + .../views/dashboard/formSlides.php | 93 + pandora_console/views/dashboard/header.php | 196 ++ pandora_console/views/dashboard/jsLayout.php | 71 + pandora_console/views/dashboard/layout.php | 83 + pandora_console/views/dashboard/list.php | 234 ++ .../views/dashboard/listWidgets.php | 101 + pandora_console/views/dashboard/slides.php | 269 ++ .../views/dashboard/slidesWidget.php | 46 + pandora_console/views/dashboard/widget.php | 52 + visual_console_client/src/main.css | 34 +- 155 files changed, 24301 insertions(+), 1286 deletions(-) create mode 100644 pandora_console/images/widgets/agent_module.png create mode 100644 pandora_console/images/widgets/alerts_fired.png create mode 100644 pandora_console/images/widgets/clock.png create mode 100644 pandora_console/images/widgets/custom_graph.png create mode 100644 pandora_console/images/widgets/events_list.png create mode 100644 pandora_console/images/widgets/example.png create mode 100644 pandora_console/images/widgets/graph_module_histogram.png create mode 100644 pandora_console/images/widgets/groups_status.png create mode 100644 pandora_console/images/widgets/maps_made_by_user.png create mode 100644 pandora_console/images/widgets/maps_status.png create mode 100644 pandora_console/images/widgets/module_icon.png create mode 100644 pandora_console/images/widgets/module_status.png create mode 100644 pandora_console/images/widgets/module_table_value.png create mode 100644 pandora_console/images/widgets/module_value.png create mode 100644 pandora_console/images/widgets/monitor_health.png create mode 100644 pandora_console/images/widgets/network_map.png create mode 100644 pandora_console/images/widgets/post.png create mode 100644 pandora_console/images/widgets/reports.png create mode 100644 pandora_console/images/widgets/service_map.png create mode 100644 pandora_console/images/widgets/single_graph.png create mode 100644 pandora_console/images/widgets/sla_percent.png create mode 100644 pandora_console/images/widgets/system_group_status.png create mode 100644 pandora_console/images/widgets/tactical.png create mode 100644 pandora_console/images/widgets/top_n.png create mode 100644 pandora_console/images/widgets/top_n_events_by_group.png create mode 100644 pandora_console/images/widgets/top_n_events_by_module.png create mode 100644 pandora_console/images/widgets/tree_view.png create mode 100644 pandora_console/images/widgets/url.png create mode 100644 pandora_console/images/widgets/ux_transaction.png create mode 100644 pandora_console/images/widgets/wux_transaction.png create mode 100644 pandora_console/images/widgets/wux_transaction_stats.png create mode 100644 pandora_console/include/javascript/gridstack.all.js create mode 100644 pandora_console/include/javascript/gridstack.jQueryUI.js create mode 100644 pandora_console/include/javascript/gridstack.js create mode 100644 pandora_console/include/javascript/gridstack.min.map create mode 100644 pandora_console/include/javascript/pandora_dashboards.js create mode 100644 pandora_console/include/lib/Dashboard/Cell.php create mode 100644 pandora_console/include/lib/Dashboard/Manager.php create mode 100644 pandora_console/include/lib/Dashboard/Widget.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/agent_module.php create mode 100755 pandora_console/include/lib/Dashboard/Widgets/alerts_fired.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/clock.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/custom_graph.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/events_list.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/example.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/graph_module_histogram.php create mode 100755 pandora_console/include/lib/Dashboard/Widgets/groups_status.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/maps_made_by_user.php create mode 100755 pandora_console/include/lib/Dashboard/Widgets/maps_status.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/module_icon.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/module_status.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/module_table_value.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/module_value.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/monitor_health.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/network_map.php create mode 100755 pandora_console/include/lib/Dashboard/Widgets/post.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/reports.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/service_map.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/single_graph.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/sla_percent.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/system_group_status.php create mode 100755 pandora_console/include/lib/Dashboard/Widgets/tactical.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/top_n.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_group.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_module.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/tree_view.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/url.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/ux_transaction.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/wux_transaction.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/wux_transaction_stats.php create mode 100644 pandora_console/include/lib/View.php create mode 100644 pandora_console/include/styles/bootstrap.min.css create mode 100644 pandora_console/include/styles/bootstrap.min.css.map create mode 100644 pandora_console/include/styles/dashboards.css create mode 100644 pandora_console/include/styles/gridstack-extra.min.css create mode 100644 pandora_console/include/styles/gridstack.min.css create mode 100644 pandora_console/operation/dashboard/dashboard.php create mode 100644 pandora_console/views/dashboard/cell.php create mode 100644 pandora_console/views/dashboard/configurationWidgets.php create mode 100644 pandora_console/views/dashboard/formDashboard.php create mode 100644 pandora_console/views/dashboard/formSlides.php create mode 100644 pandora_console/views/dashboard/header.php create mode 100644 pandora_console/views/dashboard/jsLayout.php create mode 100644 pandora_console/views/dashboard/layout.php create mode 100644 pandora_console/views/dashboard/list.php create mode 100644 pandora_console/views/dashboard/listWidgets.php create mode 100644 pandora_console/views/dashboard/slides.php create mode 100644 pandora_console/views/dashboard/slidesWidget.php create mode 100644 pandora_console/views/dashboard/widget.php diff --git a/pandora_console/ajax.php b/pandora_console/ajax.php index beb07e7752..a304fd516b 100644 --- a/pandora_console/ajax.php +++ b/pandora_console/ajax.php @@ -71,21 +71,8 @@ if (isset($_GET['loginhash'])) { } } -$public_hash = get_parameter('hash', false); - // Check user. -if ($public_hash == false) { - check_login(); -} else { - enterprise_include_once('include/functions_dashboard.php'); - if (dashboard_check_public_hash($public_hash) === false) { - db_pandora_audit('Invalid public hash', 'Trying to access public dashboard'); - include 'general/noaccess.php'; - exit; - } -} - - +check_login(); // Enterprise support. if (file_exists(ENTERPRISE_DIR.'/load_enterprise.php')) { diff --git a/pandora_console/extras/mr/37.sql b/pandora_console/extras/mr/37.sql index c53f5e3c09..dd25fe2e98 100644 --- a/pandora_console/extras/mr/37.sql +++ b/pandora_console/extras/mr/37.sql @@ -1,5 +1,7 @@ START TRANSACTION; +ALTER TABLE `twidget_dashboard` ADD COLUMN `position` TEXT NOT NULL default ''; + ALTER TABLE `tagente_estado` ADD COLUMN `last_status_change` bigint(20) NOT NULL default '0'; UPDATE `tconfig` SET `value`='policy,agent,data_type,module_name,server_type,interval,status,last_status_change,graph,warn,data,timestamp' WHERE `token` = 'status_monitor_fields'; diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index 093258fe43..5a06360de8 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -1342,13 +1342,13 @@ ALTER TABLE `tmap` MODIFY COLUMN `id_user` varchar(250) NOT NULL DEFAULT ''; INSERT INTO `tconfig` (`token`, `value`) VALUES ('big_operation_step_datos_purge', '100'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('small_operation_step_datos_purge', '1000'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('days_autodisable_deletion', '30'); -INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 36); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('MR', 37); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_docs_logo', 'default_docs.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_support_logo', 'default_support.png'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_logo_white_bg_preview', 'pandora_logo_head_white_bg.png'); UPDATE tconfig SET value = 'https://licensing.artica.es/pandoraupdate7/server.php' WHERE token='url_update_manager'; DELETE FROM `tconfig` WHERE `token` = 'current_package_enterprise'; -INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '744'); +INSERT INTO `tconfig` (`token`, `value`) VALUES ('current_package_enterprise', '745'); INSERT INTO `tconfig` (`token`, `value`) VALUES ('status_monitor_fields', 'policy,agent,data_type,module_name,server_type,interval,status,graph,warn,data,timestamp'); UPDATE `tconfig` SET `value` = 'mini_severity,evento,id_agente,estado,timestamp' WHERE `token` LIKE 'event_fields'; DELETE FROM `tconfig` WHERE `token` LIKE 'integria_api_password'; @@ -1641,7 +1641,8 @@ UPDATE `tmetaconsole_agent` SET tmetaconsole_agent.alias = tmetaconsole_agent.no -- --------------------------------------------------------------------- -- Table `twidget_dashboard` -- --------------------------------------------------------------------- -ALTER TABLE twidget_dashboard MODIFY options LONGTEXT NOT NULL default ""; +ALTER TABLE `twidget_dashboard` MODIFY `options` LONGTEXT NOT NULL default ""; +ALTER TABLE `twidget_dashboard` ADD COLUMN `position` TEXT NOT NULL default ""; -- --------------------------------------------------------------------- -- Table `trecon_task` diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index e51eba8414..b443926a63 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -180,7 +180,7 @@ if ($config['menu_type'] == 'classic') { break; case 'Dashboard': - $_GET['sec2'] = 'enterprise/dashboard/main_dashboard'; + $_GET['sec2'] = 'operation/dashboard/dashboard'; break; case 'Visual console': @@ -779,9 +779,7 @@ if ($config['menu_type'] == 'classic') { } } - $new_dashboard = get_parameter('new_dashboard', 0); - - if ($_GET['sec2'] == 'enterprise/dashboard/main_dashboard' && $new_dashboard) { + if ($_GET['sec2'] == 'operation/dashboard/dashboard' && $new_dashboard) { $do_refresh = false; } } diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index ca6c0fd473..8b4ff36ab8 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -181,7 +181,7 @@ function open_submenus () { if (value) $('div.menu>ul>li#' + index + '>ul').show(); }); - $('div.menu>ul>li.selected>ul').removeClass('invisible'); + //$('div.menu>ul>li.selected>ul').removeClass('invisible'); } function close_submenus () { @@ -189,7 +189,7 @@ function close_submenus () { if (value) $('div.menu>ul>li#' + index + '>ul').hide(); }); - $('div.menu>ul>li.selected>ul').addClass('invisible'); + //$('div.menu>ul>li.selected>ul').addClass('invisible'); } diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 593326f510..c026015cc7 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -16,6 +16,10 @@ global $config; check_login(); +require 'vendor/autoload.php'; + +use PandoraFMS\Dashboard\Manager; + enterprise_hook('open_meta_frame'); require_once $config['homedir'].'/include/functions_profile.php'; @@ -31,7 +35,6 @@ if (enterprise_installed() && defined('METACONSOLE')) { } $isFunctionSkins = enterprise_include_once('include/functions_skins.php'); -enterprise_include_once('include/functions_dashboard.php'); // Add the columns for the enterprise Pandora edition. $enterprise_include = false; @@ -833,27 +836,27 @@ $values = [ 'External link' => __('External link'), 'Other' => __('Other'), ]; -if (enterprise_installed() && !is_metaconsole()) { +if (!is_metaconsole()) { $values['Dashboard'] = __('Dashboard'); } $table->data[12][1] = html_print_select($values, 'section', io_safe_output($user_info['section']), 'show_data_section();', '', -1, true, false, false); -if (enterprise_installed()) { - $dashboards = dashboard_get_dashboards(); - $dashboards_aux = []; - if ($dashboards === false) { - $dashboards = ['None' => 'None']; - } else { - foreach ($dashboards as $key => $dashboard) { - $dashboards_aux[$dashboard['name']] = $dashboard['name']; - } - } - $table->data[12][1] .= html_print_select($dashboards_aux, 'dashboard', $user_info['data_section'], '', '', '', true); +$dashboards = Manager::getDashboards(-1, -1); +$dashboards_aux = []; +if ($dashboards === false) { + $dashboards = ['None' => 'None']; +} else { + foreach ($dashboards as $key => $dashboard) { + $dashboards_aux[$dashboard['id']] = $dashboard['name']; + } } +$table->data[12][1] .= html_print_select($dashboards_aux, 'dashboard', $user_info['data_section'], '', '', '', true); + + $layouts = visual_map_get_user_layouts($config['id_user'], true); $layouts_aux = []; if ($layouts === false) { diff --git a/pandora_console/images/widgets/agent_module.png b/pandora_console/images/widgets/agent_module.png new file mode 100644 index 0000000000000000000000000000000000000000..0040a642d822cda6f2ef47cb40aecded023c6a5f GIT binary patch literal 2805 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 IEo;B}|M3&Z_5c6? literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/custom_graph.png b/pandora_console/images/widgets/custom_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..384aa1aa616bfe4823d577dfcaef73a302cdb837 GIT binary patch literal 2316 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/graph_module_histogram.png b/pandora_console/images/widgets/graph_module_histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..caec402178851fc71aa0386e61a7e4e357e6addd GIT binary patch literal 2205 zcmV;O2x9k%P)KCym-S-^yD5=nsrGo{w;B17{oeK3s< z7M)3Ec=+xN1Bz400px0QWF#R(QR0*dTjY}J)I?%!!0oFtgifto?d36!i302Mo;%L4=uNjVs3*m@upfF`^FXmB7|xdX{y z0aB7BzB&e9RwS6aNB|Rn78jCRu`y8MQ$|`_glr)!r}P7<0%S>SRT?P(R4t-`Kv)hd zz^4g|Myv*c_@Fu#2UyR(MguJo z7&8k7%wy2mfCM@OK3PeS(sWO65D4_-2C8|C%A<7D04Rg?BzugC`G!^iXIGvky=giF zto01z5cd@EZI7YoDZGOOL)}wIg&fA{hXKRT2L>2P5$G|{%#Hv)UG~bE40g&HIEMmY zvkkZ=(~-q-v9XN+#F@+mv(YExaRBff8gfz;7$(g`2fFv!hwWg*KzZ!KF!9p_^umMS z)G(#vj+6pise-QbJ;9N1OV;*F$7NT_wQRJ}!N~VH950RYT8L8<4Dh$b?EXNuJSO7o( zcCIC-VHk+oQ5S5G$O#BXKw`?*hb;sQ`1cChFLP{Rqh0##ey6Q-$ou%C8EN!1OZkCfrYp!3st@tT@rnq=SY+EY!WXiGu+%kf6Qqim~e(Hl-SKJA=}mBxZVp<%^ONC=58r@f#^n zP?wN|eacC5i3QYF5Eot91qY`2p_!mB^P24m)z~wme0K{1hNL(Ew^cGDfr5&6PV60qLIXAr<~0(VIDM$L1c!Rb$j_C4rYg={NtbBFY)ww(>Lr0 zlLYUi2}=D?UF6WbX;hSj_wR>)bDPiAcs1WNUOj8S_c%Sn``LI~CfQpSGNSCV3^Xvp{x(d}H8F4?_CNx3P%7l-4U`fAPO0<@$J}WbHlNzd6kBFl z_c{zIX!@)RCpZN4Xz#`e&a^&H0DB9#y#s3iRNz()>z>+nETFyDf&uFQnpa<{Mbo?k zY^ej$3$%B@BwGFiXz%KEn+SsN#u5?@b;{TkB^9Fd`3cgcLSR1u;t9+fIBt=mxJYj$ z4}eUCr~;)c?1BO+OKvPdfycKe&gWa-`gZo`?!He>5jnaf^Lb`xcW1uAt715-@*khN z){8Q4y^wBAuDncVV0V$3g6_$Yf%}( z94g&~4i?ElTSo$1ZH#q<@!1Ucu$fonRtOi##?V!D1lu`> zQW!#~YO3mkPOFBa_4m4Ui6G4l3I~ws$`?_A;{x`y?pcM?;!cre>R?lC4exc^kjltS zkrcxeHs(p)MLZ{1J9?SOXt8Xr8;nxZc1;`lh%ie1QE;jc+T-@hinef#Y3&OXp6Z0Z zo~dLK_fT#SXNf2)gk?hIwBdWVnTYi|SoNx`E8)oT+`|TW)4-+(q*JY_nv!RoByWUe z$csdE1;Qr6gD{v^!g2_t_3oXBYso{}CJ-rf3qJ`#KQVYkQklTe=}On4HzvZCpGABC fyAS{XG!Xv)b^c4sLjR2O00000NkvXXu0mjf*VFmM literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/groups_status.png b/pandora_console/images/widgets/groups_status.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1080c866a9a0629ec26d48b9b2f8291f7edb25 GIT binary patch literal 2548 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 M07*qoM6N<$g7y`!Z2$lO literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/maps_status.png b/pandora_console/images/widgets/maps_status.png new file mode 100644 index 0000000000000000000000000000000000000000..6818a4c2245b5214bcd7a055fe551009dc9f28a1 GIT binary patch literal 2631 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/module_icon.png b/pandora_console/images/widgets/module_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..47b9bd62516a8a98bacea6f55d5f1d2c9ea31824 GIT binary patch literal 2903 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 N002ovPDHLkV1hf8LK^@8 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/monitor_health.png b/pandora_console/images/widgets/monitor_health.png new file mode 100644 index 0000000000000000000000000000000000000000..91a832416e38a96156c0dd9d1d9b4a3924654e51 GIT binary patch literal 3101 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/network_map.png b/pandora_console/images/widgets/network_map.png new file mode 100644 index 0000000000000000000000000000000000000000..484e61e749360c2fc2b260ffc25ecb02a7bf63c6 GIT binary patch literal 3671 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/service_map.png b/pandora_console/images/widgets/service_map.png new file mode 100644 index 0000000000000000000000000000000000000000..93db3f4632b5aff66313dd4d323b17f664301d55 GIT binary patch literal 2304 zcmV+b3IFzqP)pZfq(!|T?2|nY@pWdA~xZAxJDvvL-tYvUKF?9cuWg{p~8A*%|OpU~9hNU1zVv-xSWXFgnu3!cn0BUeVmj?(S>f{U@ z&P1`1q(H$45MrYM9{kuez*0u@E`7quix|LyO9Gn>aGQWmb0B1LoatOtO+b$wK=udB zFUV|pK@-aT#7ItxXTnwv5}l)o(AbDGi@-`GP~n2hFn|DJB(ZoC08;CL*a6K24P@6F zHGU??ZzPQ0Aj$FFo@LeNaQX@(MM?!f;4mg0fjH8w> z@wQfRSgHV|?h|P~yfupr00a#>_#d%r9Ua%PU-|BTAP9h77^Q&BgL1BK#LwwtC5PW4VehEU;#1u0RpgVc1H+97t{**o`$ZgEpxv z3_W|=LtyBnWI{$Q1`|1&_GYY*B6v)*3X`dBQcQVS_s*BKlmMK2)DloF9v5f`-JQ7^ zo0MElOHqqe!WBHE1jthT!jkh$3?=>w9X@8Pq+Ka!*3R)#1RG2HvlPOPX*fBvo6|kC z9k^D)xt`4(w~X4UTC~eHIUH*ySlmi)NHsH#N7X27B-TA9@7(GBX@n< z;QU>J?u@95Tlv_Os)b3=e+ksNqW?@>k;9D6$W8q3R|>HL;?lrJ<*2xvWb-7KnjH?EsJ5>{QIg5 z9=;2vx19%a)4AXK{&Vq4=8G4f4RzA|$qG0n?MvViSTJGa0cia$;TM zBp7YYBh>a$`}~Sr(1U?B$8THme}2EonjQhLiH^J+q95We>k@&$Qiv^&u@}`qWVkzO zA3Jls0MlcXTk2KNZJ7~uyVOdIL077v=)e{JVJ>Kf9O6U_*#vDQJJ*#4nJim8DN#2P zcHUz1BQe&;&QPqYX)QD;k5Qw7M}eGAAtRO}CzkI;MJ_u2A@;A9Y91RRG z>1-_IwDgRoI*&tdv}?J@$XAJc3M zRKk?niIqsE^z;apY*!Fr^W?LQbgz;47ofc>#%UOaqE00wmP%}_Wh!Gi0Wfu>Jpttg zuylov;@;4B>C-Oy%s z8aW^ecFWI#k%fQ1NG1xOI2)&lu=FhiUFSuLfNjFH$x>O@>tZRw7wCK48dP}imWf9CXl6)ysO}#g4Z@y zThcC!V%V0fSDsnu=t=QKHNs@SsR56l7mV`yeHD3Jz^t0`xOv4iYaLKD!hg)f{ZVl^+Df*#Ki!i;NLZXk5$ohPTK zyuLtUhV9sPgPqSTdeMEAX6*nS;}}<`^)8;( zl&qvBh-!wt@C!`}Z)Hp3oX3b1=7oewLCA{7i3H-bK&L3_;O;{-@Sv3?N|ED?$IB~b zS+S{3zX+>h(WHB@E_61%X`f*o==u-4c-9KY)ph6)1}7gN!r=p9#66d)vtQ}PSvCea zOEzu{lnt^{=B9Ph!K9&KE%yD!l;dpD(UjG{?$Y=kcf%5pLdETmyNKHmA)ZD#>SHpGIogow$CBs aK=B8d(tAGYsT=A50000pZfxvkfgNanX!7N}xx2@LgB2fn5v{7Ej1h1_)HNO0G6R+(! zHU9YXnW1@?KJgln72~oI6sJtsA{Uz>_-t$>CNyD|pr;%GAoZS*CVXjC0Z84)l}6U-_Evk4IzKVZ!wI8w(1pyEPgd4K>SE7=1LZGfc?pn(S{ zsyFcE6jDkEvMVVvK_bxN1-P;>Sw11TEX3s-eJMW%Kb>Zx4aS##SqNzcS%hproatPK zMW>S)?3FX&r2>dgL>2g+1ubscsnvlsX-Ovq2Wq%xCac6|_AGvKU{_o+8VT4Ziqn6Btv~XYzt3B&RyEn{xQ_ z6DdJRRP!6TahhhiiY!ZEr9ZM|iuh_|P`i*6pAf7(X;By>*J(^NZiWfs9Veiog`g49 z4@5P1C<#(r4rU^tL6Agy4&VzJqJs?R)Ac|qfRZLRKmcydP&a`f2*XRl3*c~oLL&&W zRU}As5fEMgRo8bQ=>xR7itqvlXp&+OC{PF#C@Q;u%C^_z*xR|Cy#@Y2f&%_yW|{Aw zyW0o5dwI3HrzxOJ{kZ|BD$@6AjDQ?z1x~7D1!tJeKYf%JrN1Z*%|Ln4c3E{FN z6pmE8)RQh~`YK8^rwKU%aYIVXtZva%oH^^55ySBQxE15&3+tCG%E7x?eJ0PtaYJ|N zo;rMO&(>AGga|^K8|GbqP^0uD!LBYo7K2|d#_K4cGYWCXpE1g&!c>YimOMm_>i;_Cq!bm*Q0XlR?7Ya*mefGV1`*z;l9X&dL&PL3@&D*krdLz@!@d(D9x}&V1}(2@qgv zoF!7BUr_?RkH8WjbQ@1Yt2T0oxll%A*Pi zEHo%vIGZ&V9F)A^O=qyc8-F8G4?+Wzk0GJksw~;;z~s7G5OLTY#bZqok;w|EJD6!? zE^u43@mQ4oXWeW4Ictk#9DDYu+05%`UR%!vqk1bF^19vd4uvi9rI{U)kQ>V=-AmEI zoFqk|G}gt}o@cpZjk$zjfHs*IiZzZislxVlh-tF$%ZCHXIUPBR$_3@$UwrU3rb^OfPOjm3r`93RgeL6BG#$%z{DG*Aer63y^ z`p2ox1L^@l>W0vSa)%>{=>#1&KqiQjj!` zu9w-)%L)dW#PHxm#~f3d8L1;i!GK|qZXih-suCxinF6pn`0qKfG+4oq=1rm2W!l{v zn3_DE#NV)E9qjloP<^ZJG5(sABP8|P+xu&lBq$@BMc9wl7*aMyeKGUMVGcvJPbRP{ zLEN3PIk~Q_@}QeCS=F@XQH^|kWl9~E*L%3^gLt@?b!bEKYQ=J--s=5Ir&xw{6l=fK zKs{ip?nfi@*1mqMWcWk$d+U*KLSM zJ=yz`^{okivUS{-Dy~3Y!8FL4^dhAf(2(`snXmt&kW81;uxFLc!afCP@9cG(2%;!F z7D0jnK@E-l1TjyL@B|?ZEzTRj6OfuFP*G-)=n0e*#3`xbk`xG=Dxx6~1ugqIGiYP> zZ`L!jGrM!7RiwmLR(tmT%$^^h|UExYXya-08p} zNrxV|I2YEpXOp~vWuma61JO@ld5=u5%LbOL>AeW2U*9$$Y}b_44Ga@?Ec{U@^bvdO zCM%|jZl{qbEj(LIk`2b#=ulllFMWEsPO3@PR<%yX6C zE@YFH8)iCf0xtELVnVWxON?YW#c9!ydMyic;Rc!2*}T6aZr!{S#1o}i{mYMcwntHO z8zeSrBpBAnQsTNHf|rb`9L9|-0k1ZyO_<#Fuv!OXU{gWoz_B)w9T-sOlv%DCN&bhw<<+S7HTHc z;^bgk*eY|0;}EQBHJwIe0zC%SNIGQUGHnRG7{+#4(yUKDm*bvNwz=;ajgtkm8Kk-w}j0@xp{~|%SvT}S&8ZD@fmr8 zqwKy|*|BMb=g^x3>9^%=3TtpwgB;Z*Y$)8#)GtZ9yC!k!xZ$z~d~RUfb-9d#PU@5Y z9obd5feEWAX>6W3*%!NT@DLy?pc>;W?|ik=CLGxZp2RTXJ_$~*+3?nY6S?A{Ild#0QgN#GNFpf=s1E3Xxkfp&2(I ngRG5Mvyic8=E|)_^ay_eHO0U<;bI%`00000NkvXXu0mjfq4Qgm literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/sla_percent.png b/pandora_console/images/widgets/sla_percent.png new file mode 100644 index 0000000000000000000000000000000000000000..02c0e17987ecfad5ebdd2c77ec3e5e4dba09632f GIT binary patch literal 3597 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/tactical.png b/pandora_console/images/widgets/tactical.png new file mode 100644 index 0000000000000000000000000000000000000000..6d35605b15b6e53b35c6d151879db68ab86ea3e0 GIT binary patch literal 2583 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/top_n_events_by_group.png b/pandora_console/images/widgets/top_n_events_by_group.png new file mode 100644 index 0000000000000000000000000000000000000000..286500a13a8a3394fbb71b750acb1462e54e7f4e GIT binary patch literal 3001 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 YA2=-jhts=9h5!Hn07*qoM6N<$f?sQCy#N3J literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/url.png b/pandora_console/images/widgets/url.png new file mode 100644 index 0000000000000000000000000000000000000000..af954ed8790a56bafb7acd83e3b4fbd63c496145 GIT binary patch literal 3179 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/widgets/ux_transaction.png b/pandora_console/images/widgets/ux_transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..de778eec794a0a49e3f2a6c543b45d3024023e01 GIT binary patch literal 2824 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 literal 0 HcmV?d00001 diff --git a/pandora_console/include/ajax/graph.ajax.php b/pandora_console/include/ajax/graph.ajax.php index ad840f2e6c..ff1cb9fea0 100644 --- a/pandora_console/include/ajax/graph.ajax.php +++ b/pandora_console/include/ajax/graph.ajax.php @@ -64,7 +64,6 @@ if ($print_custom_graph) { 'only_image' => (bool) get_parameter('only_image', false), 'homeurl' => (string) get_parameter('homeurl', ''), 'ttl' => (int) get_parameter('ttl', 1), - 'dashboard' => (bool) get_parameter('dashboard', false), 'vconsole' => (bool) get_parameter('vconsole', false), 'fullscale' => (bool) get_parameter('fullscale', false), 'backgroundColor' => (string) get_parameter('background_color', 'white'), @@ -114,7 +113,6 @@ if ($print_sparse_graph) { 'menu' => (bool) get_parameter('menu', true), 'backgroundColor' => (string) get_parameter('background_color', 'white'), 'percentil' => get_parameter('percentil', null), - 'dashboard' => (bool) get_parameter('dashboard'), 'vconsole' => (bool) get_parameter('vconsole'), 'type_graph' => get_parameter('type_g', $config['type_module_charts']), 'fullscale' => get_parameter('fullscale', 0), diff --git a/pandora_console/include/ajax/tree.ajax.php b/pandora_console/include/ajax/tree.ajax.php index 24074e8327..bb5668e41f 100644 --- a/pandora_console/include/ajax/tree.ajax.php +++ b/pandora_console/include/ajax/tree.ajax.php @@ -14,28 +14,8 @@ if (is_ajax()) { global $config; - enterprise_include_once('include/functions_dashboard.php'); - - $public_hash = get_parameter('hash', 0); - - // Try to authenticate by hash on public dashboards - if ($public_hash == 0) { - // Login check - check_login(); - } else { - $validate_hash = enterprise_hook( - 'dasboard_validate_public_hash', - [ - $public_hash, - 'tree_view', - ] - ); - if ($validate_hash === false || $validate_hash === ENTERPRISE_NOT_HOOK) { - db_pandora_audit('Invalid public hash', 'Trying to access report builder'); - include 'general/noaccess.php'; - exit; - } - } + // Login check. + check_login(); include_once $config['homedir'].'/include/class/Tree.class.php'; include_once $config['homedir'].'/include/class/TreeOS.class.php'; @@ -61,10 +41,6 @@ if (is_ajax()) { $rootID = get_parameter('rootID', -1); $serverID = get_parameter('serverID', false); $childrenMethod = get_parameter('childrenMethod', 'on_demand'); - $hash = get_parameter('hash', false); - if ($hash !== false) { - enterprise_hook('dasboard_validate_public_hash', [$hash, 'tree_view']); - } $default_filters = [ 'searchAgent' => '', diff --git a/pandora_console/include/ajax/visual_console.ajax.php b/pandora_console/include/ajax/visual_console.ajax.php index f231e674ed..184132d2ec 100644 --- a/pandora_console/include/ajax/visual_console.ajax.php +++ b/pandora_console/include/ajax/visual_console.ajax.php @@ -12,32 +12,13 @@ // GNU General Public License for more details. global $config; -enterprise_include_once('include/functions_dashboard.php'); require_once 'include/functions_visual_map.php'; enterprise_include_once('include/functions_visual_map.php'); -$public_hash = get_parameter('hash', false); $id_visual_console = get_parameter('id_visual_console', null); -// Try to authenticate by hash on public dashboards -if ($public_hash === false) { - // Login check - check_login(); -} else { - $validate_hash = enterprise_hook( - 'dasboard_validate_public_hash', - [ - $public_hash, - $id_visual_console, - 'visual_console', - ] - ); - if ($validate_hash === false || $validate_hash === ENTERPRISE_NOT_HOOK) { - db_pandora_audit('Invalid public hash', 'Trying to access report builder'); - include 'general/noaccess.php'; - exit; - } -} +// Login check. +check_login(); // Fix: IW was the old ACL to check for report editing, now is RW if (! check_acl($config['id_user'], 0, 'VR')) { diff --git a/pandora_console/include/chart_generator.php b/pandora_console/include/chart_generator.php index b78d2c348a..edd8208b05 100644 --- a/pandora_console/include/chart_generator.php +++ b/pandora_console/include/chart_generator.php @@ -216,24 +216,7 @@ if (file_exists('languages/'.$user_language.'.mo') === true) { break; case 'vbar': - echo flot_vcolumn_chart( - $params['chart_data'], - $params['width'], - $params['height'], - $params['color'], - $params['legend'], - $params['long_index'], - $params['homeurl'], - $params['unit'], - $params['water_mark_url'], - $params['homedir'], - $params['font'], - $config['font_size'], - $params['from_ux'], - $params['from_wux'], - $params['backgroundColor'], - $params['tick_color'] - ); + echo flot_vcolumn_chart($params); break; case 'hbar': @@ -292,7 +275,7 @@ if (file_exists('languages/'.$user_language.'.mo') === true) { $params['full_legend_daterray'], $params['not_interactive'], $params['ttl'], - $params['widgets'], + $params['sizeForTicks'], $params['show'], $params['date_to'] ); diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index c4952ae58d..ce50b487de 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -2676,10 +2676,15 @@ class NetworkMap $simulate = false; if (isset($networkmap['__simulated']) === false) { - $networkmap['filter'] = json_decode( - $networkmap['filter'], - true - ); + if ($this->widget) { + $networkmap['filter'] = $this->mapOptions; + } else { + $networkmap['filter'] = json_decode( + $networkmap['filter'], + true + ); + } + $networkmap['filter']['holding_area'] = [ 500, 500, @@ -3460,7 +3465,11 @@ class NetworkMap // Open networkconsole_id div. $output .= '
fullSize) { - $output .= ' style="width: 100%; height: 100%;position: relative; overflow: hidden; background: #FAFAFA">'; + if ($this->widget) { + $output .= ' style="width: 100%; height: 100%;position: relative; overflow: hidden;">'; + } else { + $output .= ' style="width: 100%; height: 100%;position: relative; overflow: hidden; background: #FAFAFA">'; + } } else { $output .= ' style="width: '.$this->mapOptions['width'].'px; height: '.$this->mapOptions['height'].'px;position: relative; overflow: hidden; background: #FAFAFA">'; } diff --git a/pandora_console/include/class/OrderInterpreter.class.php b/pandora_console/include/class/OrderInterpreter.class.php index 43abced394..e9e93c75e2 100644 --- a/pandora_console/include/class/OrderInterpreter.class.php +++ b/pandora_console/include/class/OrderInterpreter.class.php @@ -221,7 +221,7 @@ class OrderInterpreter extends Wizard 'images/op_reporting.menu_gray.png' ), 'url' => ui_get_full_url( - 'index.php?sec=reporting&sec2=enterprise/dashboard/dashboards' + 'index.php?sec=reporting&sec2=operation/dashboard/dashboard' ), 'acl' => check_acl( $config['id_user'], diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index d7c9d489ac..bf5e8fd861 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -227,7 +227,7 @@ $config['extensions'] = extensions_get_extensions(); // Detect if enterprise extension is installed // NOTICE: This variable (config[enterprise_installed] is used in several // sections. Faking or forcing to 1 will make pandora fails. -if (file_exists($config['homedir'].'/'.ENTERPRISE_DIR.'/index.php')) { +if (file_exists($config['homedir'].'/'.ENTERPRISE_DIR.'/load_enterprise.php')) { $config['enterprise_installed'] = 1; enterprise_include_once('include/functions_enterprise.php'); } else { diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 6a5b183b85..e4f25be34d 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -2482,12 +2482,12 @@ function get_os_name($id_os) function get_user_dashboards($id_user) { if (users_is_admin($id_user)) { - $sql = "SELECT name + $sql = "SELECT id, name FROM tdashboard WHERE id_user = '".$id_user."' OR id_user = ''"; } else { $user_can_manage_all = users_can_manage_group_all('RR'); if ($user_can_manage_all) { - $sql = "SELECT name + $sql = "SELECT id, name FROM tdashboard WHERE id_user = '".$id_user."' OR id_user = ''"; } else { $user_groups = users_get_groups($id_user, 'RR', false); @@ -2500,7 +2500,7 @@ function get_user_dashboards($id_user) $u_groups[] = $id; } - $sql = 'SELECT name + $sql = 'SELECT id, name FROM tdashboard WHERE id_group IN ('.implode(',', $u_groups).") AND (id_user = '".$id_user."' OR id_user = '')"; } @@ -3870,12 +3870,17 @@ function generator_chart_to_pdf($type_graph_pdf, $params, $params_combined=false $img_url = ui_get_full_url(false).$hack_metaconsole.'/attachment/'.$img_file; } - $width_img = 550; - $height_img = $params['height']; + if ($type_graph_pdf === 'vbar') { + $width_img = $params['generals']['pdf']['width']; + $height_img = $params['generals']['pdf']['height']; + } else { + $width_img = 550; + $height_img = $params['height']; - if ((int) $params['landscape'] === 1) { - $height_img = 150; - $params['height'] = 150; + if ((int) $params['landscape'] === 1) { + $height_img = 150; + $params['height'] = 150; + } } $params_encode_json = urlencode(json_encode($params)); diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 570e245bd7..9eaed9c338 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -1078,7 +1078,7 @@ function agents_get_group_agents( } if ($childGroups) { - if (is_array($id_group)) { + if (is_array($id_group) === true) { foreach ($id_group as $parent) { $id_group = array_merge( $id_group, @@ -1098,7 +1098,7 @@ function agents_get_group_agents( } // Search for primary and secondary groups. - if (!empty($id_group)) { + if (empty($id_group) === false) { $filter[] = '('.db_format_array_where_clause_sql( [ 'id_group' => $id_group, @@ -1108,83 +1108,59 @@ function agents_get_group_agents( ).')'; } - if ($search === true) { - // No added search. Show both disabled and non-disabled. - } else if (is_array($search)) { + if (is_array($search) === true) { if (!$search['all_agents']) { $filter['disabled'] = 0; - if (isset($search['disabled'])) { + if (isset($search['disabled']) === true) { $filter['disabled'] = (int) $search['disabled']; - unset($search['disabled']); } } - if (isset($search['string'])) { + if (isset($search['string']) === true) { $string = io_safe_input($search['string']); - switch ($config['dbtype']) { - case 'mysql': - case 'postgresql': - $filter[] = "(nombre COLLATE utf8_general_ci LIKE '%$string%' OR direccion LIKE '%$string%')"; - break; - - case 'oracle': - $filter[] = "(UPPER(nombre) LIKE UPPER('%$string%') OR direccion LIKE upper('%$string%'))"; - break; - } - + $filter[] = "(nombre COLLATE utf8_general_ci LIKE '%$string%' OR direccion LIKE '%$string%')"; unset($search['string']); } - if (isset($search['name'])) { + if (isset($search['name']) === true) { $name = io_safe_input($search['name']); - switch ($config['dbtype']) { - case 'mysql': - case 'postgresql': - $filter[] = "nombre COLLATE utf8_general_ci LIKE '$name'"; - break; - - case 'oracle': - $filter[] = "UPPER(nombre) LIKE UPPER('$name')"; - break; - } - + $filter[] = "nombre COLLATE utf8_general_ci LIKE '$name'"; unset($search['name']); } - if (isset($search['alias'])) { + if (isset($search['alias']) === true) { $name = io_safe_input($search['alias']); - switch ($config['dbtype']) { - case 'mysql': - case 'postgresql': - $filter[] = "alias COLLATE utf8_general_ci LIKE '$name'"; - break; - - case 'oracle': - $filter[] = "UPPER(alias) LIKE UPPER('$name')"; - break; - } - + $filter[] = "alias COLLATE utf8_general_ci LIKE '$name'"; unset($search['alias']); } - if (isset($search['id_os'])) { + if (isset($search['aliasRegex']) === true) { + $name = io_safe_input($search['aliasRegex']); + $filter[] = sprintf( + 'alias COLLATE utf8_general_ci REGEXP "%s"', + $name + ); + unset($search['aliasRegex']); + } + + if (isset($search['id_os']) === true) { $filter['id_os'] = $search['id_os']; } - if (isset($search['status'])) { + if (isset($search['status']) === true) { switch ($search['status']) { case AGENT_STATUS_NORMAL: $filter[] = '( critical_count = 0 AND warning_count = 0 - AND unknown_count = 0 + AND unknown_count = 0 AND normal_count > 0)'; break; case AGENT_STATUS_WARNING: $filter[] = '( - critical_count = 0 + critical_count = 0 AND warning_count > 0 AND total_count > 0)'; break; @@ -1195,8 +1171,8 @@ function agents_get_group_agents( case AGENT_STATUS_UNKNOWN: $filter[] = '( - critical_count = 0 - AND warning_count = 0 + critical_count = 0 + AND warning_count = 0 AND unknown_count > 0)'; break; @@ -1214,6 +1190,10 @@ function agents_get_group_agents( total_count = 0 OR total_count = notinit_count)'; break; + + default: + // Not posible. + break; } unset($search['status']); @@ -1229,7 +1209,7 @@ function agents_get_group_agents( $filter['id_tmetaconsole_setup'] = $search['id_server']; if ($filter['id_tmetaconsole_setup'] == 0) { - // All nodes + // All nodes. unset($filter['id_tmetaconsole_setup']); } @@ -1237,12 +1217,12 @@ function agents_get_group_agents( } if (!$add_alert_bulk_op) { - // Add the rest of the filter from the search array + // Add the rest of the filter from the search array. foreach ($search as $key => $value) { $filter[] = $value; } } - } else { + } else if ($filter !== true) { $filter['disabled'] = 0; } diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 9eebb7ac72..7fad691c74 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -4810,7 +4810,7 @@ function events_page_comments($event, $ajax=false) __('Add comment'), 'comment_button', false, - 'event_comment();', + 'event_comment(\''.base64_encode(json_encode($event)).'\');', 'class="sub next"', true ); diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 103fa957d0..903fb2e515 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -1720,6 +1720,10 @@ function graphic_combined_module( $params['threshold_data'] = $threshold_data; } + if ($params['vconsole'] === true) { + $water_mark = false; + } + $output = area_graph( $agent_module_id, $array_data, @@ -1861,6 +1865,7 @@ function graphic_combined_module( $height = 50; } else { $height = ($height / $number_elements); + $water_mark = false; } $color = color_graph_array(); @@ -1983,18 +1988,25 @@ function graphic_combined_module( $color = color_graph_array(); - if (!$params['vconsole']) { + if ($params['vconsole'] === false) { $width = 200; $height = 200; } else { - $width = ($width / $number_elements); - $height = ($height / $number_elements); + $ratio = ((200 * ( $height / (200 * $number_elements) )) / (200 * ( $width / (200 * $number_elements)))); + + $new_width = ( 200 * ( $width / (200 * $number_elements) ) ); + $new_height = ( 200 * ( $height / (200 * $number_elements) / $ratio ) ); + + if ($height > $width) { + $new_height = (200 * ($height / (200 * $number_elements))); + $new_width = (200 * ($width / (200 * $number_elements)) / $ratio); + } } $output = stacked_gauge( $graph_values, - $width, - $height, + $new_width, + $new_height, $color, $module_name_list, ui_get_full_url( @@ -2015,10 +2027,10 @@ function graphic_combined_module( $label = ''; foreach ($module_list as $module_item) { $automatic_custom_graph_meta = false; - if ($config['metaconsole']) { + if (is_metaconsole() === true) { // Automatic custom graph from the report // template in metaconsole. - if (is_array($module_list[$i])) { + if (is_array($module_list[$i]) === true) { $server = metaconsole_get_connection_by_id( $module_item['server'] ); @@ -2027,7 +2039,7 @@ function graphic_combined_module( } } - if ($automatic_custom_graph_meta) { + if ($automatic_custom_graph_meta === true) { $module = $module_item['module']; } else { $module = $module_item; @@ -2035,8 +2047,7 @@ function graphic_combined_module( $module_data = modules_get_agentmodule($module); $query_last_value = sprintf( - ' - SELECT datos + 'SELECT datos FROM tagente_datos WHERE id_agente_modulo = %d AND utimestamp < %d @@ -2050,8 +2061,8 @@ function graphic_combined_module( modules_get_agentmodule_agent_name($module) ); - if (!empty($params_combined['labels']) - && isset($params_combined['labels'][$module]) + if (empty($params_combined['labels']) === false + && isset($params_combined['labels'][$module]) === true ) { $label = $params_combined['labels'][$module]; } else { @@ -2061,15 +2072,30 @@ function graphic_combined_module( 'id_agente', $module_data['id_agente'] ); - $label = $alias.' - '.$module_data['nombre']; + if ($params['vconsole'] === true) { + if ($width < 250 || $height < 250) { + $label = \ui_print_truncate_text($module_data['nombre'], 3, false); + } else { + $label = $module_data['nombre']; + } + } else { + $label = $alias.' - '.$module_data['nombre']; + } } - $temp[$label]['g'] = round($temp_data, 4); + if ($params_combined['stacked'] == CUSTOM_GRAPH_VBARS) { + $temp[] = [ + 'tick' => $label, + 'data' => (int) round($temp_data, 4), + ]; + } else { + $temp[$label]['g'] = round($temp_data, 4); + } - if ($config['metaconsole']) { + if (is_metaconsole() === true) { // Automatic custom graph from the report // template in metaconsole. - if (is_array($module_list[0])) { + if (is_array($module_list[0]) === true) { metaconsole_restore_db(); } } @@ -2079,12 +2105,14 @@ function graphic_combined_module( $graph_values = $temp; - if (!$params['vconsole']) { - $width = 1024; - $height = 500; - } - if ($params_combined['stacked'] == CUSTOM_GRAPH_HBARS) { + if ($params['vconsole'] === false) { + $width = 1024; + $height = 500; + } else { + $water_mark = false; + } + $output = hbar_graph( $graph_values, $width, @@ -2112,32 +2140,27 @@ function graphic_combined_module( } if ($params_combined['stacked'] == CUSTOM_GRAPH_VBARS) { - $output = vbar_graph( - $graph_values, - $width, - $height, - $color, - $module_name_list, - $long_index, - ui_get_full_url( - 'images/image_problem_area_small.png', - false, - false, - false - ), - '', - '', - $water_mark, - $config['fontpath'], - $fixed_font_size, - '', - $ttl, - $homeurl, - $background_color, - true, - false, - '#c1c1c1' - ); + $options = []; + $sizeLabelTickWidth = 85; + if ($params['vconsole'] === true) { + $water_mark = false; + if (isset($width) === true) { + $sizeLabelTickWidth = 30; + } + } else { + $options['grid']['hoverable'] = true; + } + + $options['generals']['rotate'] = true; + $options['generals']['forceTicks'] = true; + $options['x']['labelWidth'] = $sizeLabelTickWidth; + $options['generals']['arrayColors'] = $color; + $options['grid']['backgroundColor'] = 'transparent'; + $options['grid']['backgroundColor'] = $background_color; + $options['y']['color'] = $background_color; + $options['x']['color'] = $background_color; + + $output = vbar_graph($graph_values, $options, $ttl); } break; @@ -2176,6 +2199,7 @@ function graphic_combined_module( $datelimit, $params['date'] ); + $temp_data = db_get_value_sql($query_last_value); if ($temp_data) { @@ -2223,9 +2247,11 @@ function graphic_combined_module( $graph_values = $temp; - if (!$params['vconsole']) { + if ($params['vconsole'] === false) { $width = $width; $height = 500; + } else { + $water_mark = false; } $color = color_graph_array(); @@ -2358,100 +2384,62 @@ function combined_graph_summatory_average( /** - * Print a graph with access data of agents + * Print a graph with access data of agents. * - * @param integer $id_agent Agent ID. - * @param integer $width Pie graph width. - * @param integer $height Pie graph height. - * @param integer $period Time period. - * @param boolean $return Return. - * @param boolean $tree View tree. + * @param integer $id_agent Agent Id. + * @param integer $period Timestamp period graph. + * @param boolean|null $return Type return. * - * @return string Return or echo the result flag. + * @return string */ function graphic_agentaccess( - $id_agent, - $width, - $height, - $period=0, - $return=false, - $tree=false + int $id_agent, + int $period=0, + ?bool $return=false ) { global $config; - global $graphic_type; + // Dates. $date = get_system_time(); $datelimit = ($date - $period); - $data_array = []; - $interval = agents_get_interval($id_agent); + $interval = 3600; - $data = db_get_all_rows_sql( - sprintf( - 'SELECT utimestamp, count(*) as data - FROM tagent_access - WHERE id_agent = %d - AND utimestamp > %d - AND utimestamp < %d - GROUP BY ROUND(utimestamp/%d)', - $id_agent, - $datelimit, - $date, - $interval - ) + // Query. + $sql = sprintf( + 'SELECT utimestamp, count(*) as data + FROM tagent_access + WHERE id_agent = %d + AND utimestamp >= %d + AND utimestamp <= %d + GROUP BY TRUNCATE(utimestamp/%d,0)', + $id_agent, + $datelimit, + $date, + $interval ); - if (isset($data) && is_array($data)) { + $data = db_get_all_rows_sql($sql); + + // Array data. + $data_array = []; + if (isset($data) === true && is_array($data) === true) { foreach ($data as $key => $value) { - $data_array['Agent access']['data'][$key][0] = ($value['utimestamp'] * 1000); - $data_array['Agent access']['data'][$key][1] = $value['data']; - } - - $data_array['Agent access']['color'] = 'green'; - } else { - if ($return) { - return graph_nodata_image($width, $height); - } else { - echo graph_nodata_image($width, $height); + $time = (date('H:m', $value['utimestamp'])); + $data_array[] = [ + 'tick' => $time, + 'data' => (int) $value['data'], + 'color' => '#82b92f', + ]; } } - if ($config['fixed_graph'] == false) { - $water_mark = [ - 'file' => $config['homedir'].'/images/logo_vertical_water.png', - 'url' => ui_get_full_url( - 'images/logo_vertical_water.png', - false, - false, - false - ), - ]; - } + $options = []; + $options['grid']['hoverable'] = true; - $params = [ - 'agent_module_id' => false, - 'period' => $period, - 'width' => $width, - 'height' => $height, - 'unit' => $unit, - 'only_image' => $only_image, - 'homeurl' => $homeurl, - 'menu' => true, - 'backgroundColor' => 'transparent', - 'type_graph' => 'area', - 'font' => $config['fontpath'], - 'font_size' => $config['font_size'], - 'array_data_create' => $data_array, - 'show_overview' => false, - 'show_export_csv' => false, - 'vconsole' => true, - 'show_legend' => false, - 'grid_color' => 'grey', - ]; - - if ($return) { - return grafico_modulo_sparse($params); + if ($return === true) { + return vbar_graph($data_array, $options, 1); } else { - echo grafico_modulo_sparse($params); + echo vbar_graph($data_array, $options, 1); } } @@ -3667,6 +3655,7 @@ function graph_custom_sql_graph( $data = []; $count = 0; + $flagOther = false; foreach ($data_result as $data_item) { $count++; $value = 0; @@ -3688,7 +3677,13 @@ function graph_custom_sql_graph( switch ($type) { case 'sql_graph_vbar': - // vertical bar + // Vertical bar. + $data[] = [ + 'tick' => $label.'_'.$count, + 'data' => $value, + ]; + break; + case 'sql_graph_hbar': // horizontal bar $data[$label.'_'.$count]['g'] = $value; @@ -3702,7 +3697,19 @@ function graph_custom_sql_graph( } else { switch ($type) { case 'sql_graph_vbar': - // vertical bar + // Vertical bar. + if ($flagOther === false) { + $data[] = [ + 'tick' => __('Other'), + 'data' => $value, + ]; + + $flagOther = true; + } + + $data[(count($data) - 1)]['data'] += $value; + break; + case 'sql_graph_hbar': // horizontal bar if (!isset($data[__('Other')]['g'])) { @@ -3733,28 +3740,32 @@ function graph_custom_sql_graph( switch ($type) { case 'sql_graph_vbar': - // vertical bar - return vbar_graph( - $data, - $width, - $height, - [], - [], - '', - '', - '', - '', - $water_mark, - $config['fontpath'], - $config['font_size'], - '', - $ttl, - $homeurl, - 'white', - true, - false, - '#c1c1c1' - ); + // Vertical bar. + $color = color_graph_array(); + + $options = []; + $options['generals']['rotate'] = true; + $options['generals']['forceTicks'] = true; + $options['generals']['arrayColors'] = $color; + $options['x']['labelWidth'] = 75; + if ($ttl === 2) { + $options['backgroundColor'] = 'transparent'; + $options['grid']['backgroundColor'] = 'transparent'; + $options['y']['color'] = 'transparent'; + $options['x']['color'] = 'transparent'; + $options['generals']['pdf']['width'] = $width; + $options['generals']['pdf']['height'] = $height; + + $output .= ''; + } else { + $options['grid']['hoverable'] = true; + $output = '
'; + $output .= vbar_graph($data, $options, $ttl); + $output .= '
'; + } + return $output; break; case 'sql_graph_hbar': @@ -3809,8 +3820,18 @@ function graph_custom_sql_graph( * @param string homeurl * @param bool return or echo the result */ -function graph_graphic_agentevents($id_agent, $width, $height, $period=0, $homeurl, $return=false, $from_agent_view=false, $widgets=false, $server_id='') -{ +function graph_graphic_agentevents( + $id_agent, + $width, + $height, + $period=0, + $homeurl, + $return=false, + $from_agent_view=false, + $widgets=false, + $not_interactive=0, + $server_id='' +) { global $config; global $graphic_type; @@ -3885,8 +3906,27 @@ function graph_graphic_agentevents($id_agent, $width, $height, $period=0, $homeu ]; // Draw slicebar graph - $out = flot_slicesbar_graph($data, $period, $width, $height, $full_legend, $colors, $config['fontpath'], $config['round_corner'], $homeurl, '', '', false, $id_agent, $full_legend_date, 0, 1, $widgets, true, false, $server_id); - // id_server + $out = flot_slicesbar_graph( + $data, + $period, + $width, + $height, + $full_legend, + $colors, + $config['fontpath'], + $config['round_corner'], + $homeurl, + '', + '', + false, + $id_agent, + $full_legend_date, + $not_interactive, + 1, + $widgets, + $server_id + ); + if ($return) { return $out; } else { @@ -3905,8 +3945,17 @@ function graph_graphic_agentevents($id_agent, $width, $height, $period=0, $homeu * @param string homeurl * @param bool return or echo the result */ -function graph_graphic_moduleevents($id_agent, $id_module, $width, $height, $period=0, $homeurl, $return=false, $ttl=1) -{ +function graph_graphic_moduleevents( + $id_agent, + $id_module, + $width, + $height, + $period=0, + $homeurl='', + $return=false, + $ttl=1, + $widthForTicks=false +) { global $config; global $graphic_type; @@ -3995,7 +4044,7 @@ function graph_graphic_moduleevents($id_agent, $id_module, $width, $height, $per [], true, $ttl, - true + $widthForTicks ); if ($return) { @@ -4851,8 +4900,13 @@ function graphic_module_events($id_module, $width, $height, $period=0, $homeurl= } -function graph_nodata_image($width=300, $height=110, $type='area', $text='') -{ +function graph_nodata_image( + $width=300, + $height=110, + $type='area', + $text='', + $percent=false +) { $image = ui_get_full_url( 'images/image_problem_area.png', false, @@ -4860,14 +4914,20 @@ function graph_nodata_image($width=300, $height=110, $type='area', $text='') false ); - // if ($text == '') { - // $text = __('No data to show'); - // } - $text_div = '
'.$text.'
'; + $style = 'text-align:center; padding: 30px 0; display:block; font-size:9.5pt;'; + $text_div = '
'; + $text_div .= $text; + $text_div .= '
'; - $image_div = $text_div.'
'; + $style = 'background-size: contain;background-image: url(\''.$image.'\');'; + $image_div = '
'; - $div = '
'.$image_div.'
'; + if ($percent === true) { + $div = $image_div; + } else { + $style = 'width:'.$width.'px; height:'.$height.'px; background-color: white; margin: 0 auto;'; + $div = '
'.$image_div.'
'; + } return $div; } diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 8f62417656..d9af328129 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -1270,8 +1270,21 @@ function html_print_extended_select_for_cron($hour='*', $minute='*', $mday='*', * * @return string HTML code if return parameter is true. */ -function html_print_input_text_extended($name, $value, $id, $alt, $size, $maxlength, $disabled, $script, $attributes, $return=false, $password=false, $function='', $autocomplete='off') -{ +function html_print_input_text_extended( + $name, + $value, + $id, + $alt, + $size, + $maxlength, + $disabled, + $script, + $attributes, + $return=false, + $password=false, + $function='', + $autocomplete='off' +) { static $idcounter = 0; if ($maxlength == 0) { @@ -1288,6 +1301,7 @@ function html_print_input_text_extended($name, $value, $id, $alt, $size, $maxlen $valid_attrs = [ 'accept', + 'autofocus', 'disabled', 'maxlength', 'name', @@ -1345,7 +1359,7 @@ function html_print_input_text_extended($name, $value, $id, $alt, $size, $maxlen $output .= 'alt="'.$alt.'" '; } - // Attributes specified by function call + // Attributes specified by function call. $attrs = [ 'name' => 'unnamed', 'value' => '', @@ -1523,8 +1537,21 @@ function html_print_input_password( * * @return string HTML code if return parameter is true. */ -function html_print_input_text($name, $value, $alt='', $size=50, $maxlength=255, $return=false, $disabled=false, $required=false, $function='', $class='', $onChange='', $autocomplete='') -{ +function html_print_input_text( + $name, + $value, + $alt='', + $size=50, + $maxlength=255, + $return=false, + $disabled=false, + $required=false, + $function='', + $class='', + $onChange='', + $autocomplete='', + $autofocus=false +) { if ($maxlength == 0) { $maxlength = 255; } @@ -1552,7 +1579,24 @@ function html_print_input_text($name, $value, $alt='', $size=50, $maxlength=255, $attr['autocomplete'] = $autocomplete; } - return html_print_input_text_extended($name, $value, 'text-'.$name, $alt, $size, $maxlength, $disabled, '', $attr, $return, false, $function); + if ($autofocus === true) { + $attr['autofocus'] = $autofocus; + } + + return html_print_input_text_extended( + $name, + $value, + 'text-'.$name, + $alt, + $size, + $maxlength, + $disabled, + '', + $attr, + $return, + false, + $function + ); } @@ -1687,6 +1731,7 @@ function html_print_input_number(array $settings):string 'autocomplete', 'min', 'max', + 'step', ]; $output = ''; @@ -3466,7 +3511,8 @@ function html_print_input($data, $wrapper='div', $input_only=false) ((isset($data['function']) === true) ? $data['function'] : ''), ((isset($data['class']) === true) ? $data['class'] : ''), ((isset($data['onChange']) === true) ? $data['onChange'] : ''), - ((isset($data['autocomplete']) === true) ? $data['autocomplete'] : '') + ((isset($data['autocomplete']) === true) ? $data['autocomplete'] : ''), + ((isset($data['autofocus']) === true) ? $data['autofocus'] : false) ); break; @@ -3727,6 +3773,16 @@ function html_print_input($data, $wrapper='div', $input_only=false) $params['add_none_module'] = $data['module_none']; } + if (isset($data['size']) === true) { + $params['size'] = $data['size']; + } + + if (isset($data['from_wux']) === true + && $data['from_wux'] === true + ) { + $params['from_wux'] = 1; + } + $params['use_hidden_input_idagent'] = true; $params['hidden_input_idagent_id'] = 'hidden-'.$data['name_agent_hidden']; if (is_metaconsole()) { @@ -3766,6 +3822,10 @@ function html_print_input($data, $wrapper='div', $input_only=false) $string_filter = 'AND id_tipo_modulo IN (17,23,3,10,33,36)'; } + if ($data['from_wux'] === true) { + $string_filter = ' AND id_tipo_modulo = 25 '; + } + $sql = sprintf( 'SELECT id_agente_modulo, nombre FROM tagente_modulo diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index ee242a1624..118ef6641c 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -437,7 +437,8 @@ function menu_print_menu(&$menu) $visible = false; } - $output .= '
'; } else { - $img = '
'.vbar_graph( - $module_data, - 400, - 400, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ).'
'; + $img = '
'; + $img .= vbar_graph($module_data, $options, 1); + $img .= '
'; } } else if ($layoutData['label_position'] == 'right') { if ($layoutData['type_graph'] == 'horizontal') { @@ -1296,27 +1289,9 @@ function visual_map_print_item( $layoutData['border_color'] ).''; } else { - $img = '
'.vbar_graph( - $module_data, - 400, - 400, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ).'
'; + $img = '
'; + $img .= vbar_graph($module_data, $options, 1); + $img .= '
'; } } else { if ($layoutData['type_graph'] == 'horizontal') { @@ -1340,27 +1315,7 @@ function visual_map_print_item( $layoutData['border_color'] ); } else { - $img = vbar_graph( - $module_data, - 400, - 400, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ); + $img = vbar_graph($module_data, $options, 1); } } } else { @@ -1386,27 +1341,9 @@ function visual_map_print_item( $layoutData['border_color'] ).''; } else { - $img = '
'.vbar_graph( - $module_data, - $width, - $height, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ).'
'; + $img = '
'; + $img .= vbar_graph($module_data, $options, 1); + $img .= '
'; } } else if ($layoutData['label_position'] == 'right') { if ($layoutData['type_graph'] == 'horizontal') { @@ -1430,27 +1367,9 @@ function visual_map_print_item( $layoutData['border_color'] ).''; } else { - $img = '
'.vbar_graph( - $module_data, - $width, - $height, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ).'
'; + $img = '
'; + $img .= vbar_graph($module_data, $options, 1); + $img .= '
'; } } else { if ($layoutData['type_graph'] == 'horizontal') { @@ -1474,27 +1393,9 @@ function visual_map_print_item( $layoutData['border_color'] ); } else { - $img = vbar_graph( - $module_data, - $width, - $height, - $color, - [], - [], - ui_get_full_url('images/image_problem_area.png', false, false, false), - '', - '', - $water_mark, - $config['fontpath'], - 6, - '', - 0, - $config['homeurl'], - $layoutData['image'], - true, - false, - $layoutData['border_color'] - ); + $img = '
'; + $img .= vbar_graph($module_data, $options, 1); + $img .= '
'; } } } @@ -2443,7 +2344,7 @@ function get_if_module_is_image($id_module) } -function get_bars_module_data($id_module) +function get_bars_module_data($id_module, $vBars=false) { // This charts is only serialize graphs. // In other string show image no data to show. @@ -2472,9 +2373,19 @@ function get_bars_module_data($id_module) return false; } - foreach ($values as $val) { - $data = explode(',', $val); - $values_to_return[$data[0]] = ['g' => $data[1]]; + if ($vBars === false) { + foreach ($values as $val) { + $data = explode(',', $val); + $values_to_return[$data[0]] = ['g' => $data[1]]; + } + } else { + foreach ($values as $val) { + $data = explode(',', $val); + $values_to_return[] = [ + 'tick' => $data[0], + 'data' => $data[1], + ]; + } } return $values_to_return; diff --git a/pandora_console/include/graphs/fgraph.php b/pandora_console/include/graphs/fgraph.php index bacbc1a351..1d79129610 100644 --- a/pandora_console/include/graphs/fgraph.php +++ b/pandora_console/include/graphs/fgraph.php @@ -149,75 +149,404 @@ function progressbar( } +/** + * Draw vertical bars graph. + * + * @param array $data Data chart. + * @param array $params Params draw chart. + * @param integer $ttl Pdf option. + * + * @return mixed + */ function vbar_graph( - $chart_data, - $width, - $height, - $color, - $legend, - $long_index, - $no_data_image, - $xaxisname='', - $yaxisname='', - $water_mark='', - $font='', - $font_size='', - $unit='', - $ttl=1, - $homeurl='', - $backgroundColor='white', - $from_ux=false, - $from_wux=false, - $tick_color='white', - $base64=false + array $data, + array $options, + int $ttl=1 ) { - setup_watermark($water_mark, $water_mark_file, $water_mark_url); + global $config; - if (empty($chart_data)) { - return graph_nodata_image($width, $height, 'vbar'); + // INFO IN: https://github.com/flot/flot/blob/master/API.md. + // Xaxes chart Title. + if (isset($options['x']['title']['title']) === false) { + $options['x']['title']['title'] = ''; } - if ($ttl == 2) { - $params = [ - 'chart_data' => $chart_data, - 'width' => $width, - 'height' => $height, - 'color' => $color, - 'legend' => $legend, - 'long_index' => $long_index, - 'homeurl' => $homeurl, - 'unit' => $unit, - 'water_mark_url' => $water_mark_url, - 'homedir' => $homedir, - 'font' => $font, - 'font_size' => $font_size, - 'from_ux' => $from_ux, - 'from_wux' => $from_wux, - 'backgroundColor' => $backgroundColor, - 'tick_color' => $tick_color, - 'return_img_base_64' => $base64, + if (isset($options['x']['title']['fontSize']) === false) { + $options['x']['title']['fontSize'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['x']['title']['fontFamily']) === false) { + $options['x']['title']['fontFamily'] = preg_replace( + '/.ttf/', + 'Font, Arial', + $config['fontpath'] + ); + } + + if (isset($options['x']['title']['padding']) === false) { + $options['x']['title']['padding'] = 10; + } + + // Xaxes font ticks. + if (isset($options['x']['font']['size']) === false) { + $options['x']['font']['size'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['x']['font']['lineHeight']) === false) { + $options['x']['font']['lineHeight'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['x']['font']['style']) === false) { + $options['x']['font']['style'] = 'normal'; + } + + if (isset($options['x']['font']['weight']) === false) { + $options['x']['font']['weight'] = 'normal'; + } + + if (isset($options['x']['font']['family']) === false) { + $options['x']['font']['family'] = preg_replace( + '/.ttf/', + 'Font', + $config['fontpath'] + ); + } + + if (isset($options['x']['font']['variant']) === false) { + $options['x']['font']['variant'] = 'small-caps'; + } + + if (isset($options['x']['font']['color']) === false) { + $options['x']['font']['color'] = '#545454'; + } + + // Show ticks. + if (isset($options['x']['show']) === false) { + $options['x']['show'] = true; + } + + // Type position bottom or top or left or right. + if (isset($options['x']['position']) === false) { + $options['x']['position'] = 'bottom'; + } + + // Grid color axes x. + if (isset($options['x']['color']) === false) { + $options['x']['color'] = '#ffffff'; + } + + if (isset($options['x']['labelWidth']) === false) { + $options['x']['labelWidth'] = null; + } + + if (isset($options['x']['labelHeight']) === false) { + $options['x']['labelHeight'] = null; + } + + // Yaxes chart Title. + if (isset($options['y']['title']['title']) === false) { + $options['y']['title']['title'] = ''; + } + + if (isset($options['y']['title']['fontSize']) === false) { + $options['y']['title']['fontSize'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['y']['title']['fontFamily']) === false) { + $options['y']['title']['fontFamily'] = preg_replace( + '/.ttf/', + 'Font, Arial', + $config['fontpath'] + ); + } + + if (isset($options['y']['title']['padding']) === false) { + $options['y']['title']['padding'] = 10; + } + + // Yaxes font ticks. + if (isset($options['y']['font']['size']) === false) { + $options['y']['font']['size'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['y']['font']['lineHeight']) === false) { + $options['y']['font']['lineHeight'] = ((int) $config['font_size'] + 2); + } + + if (isset($options['y']['font']['style']) === false) { + $options['y']['font']['style'] = 'normal'; + } + + if (isset($options['y']['font']['weight']) === false) { + $options['y']['font']['weight'] = 'normal'; + } + + if (isset($options['y']['font']['family']) === false) { + $options['y']['font']['family'] = preg_replace( + '/.ttf/', + 'Font', + $config['fontpath'] + ); + } + + if (isset($options['y']['font']['variant']) === false) { + $options['y']['font']['variant'] = 'small-caps'; + } + + if (isset($options['y']['font']['color']) === false) { + $options['y']['font']['color'] = '#545454'; + } + + // Show ticks. + if (isset($options['y']['show']) === false) { + $options['y']['show'] = true; + } + + // Type position bottom or top or left or right. + if (isset($options['y']['position']) === false) { + $options['y']['position'] = 'left'; + } + + // Grid color axes y. + if (isset($options['y']['color']) === false) { + $options['y']['color'] = '#ffffff'; + } + + if (isset($options['y']['labelWidth']) === false) { + $options['y']['labelWidth'] = null; + } + + if (isset($options['y']['labelHeight']) === false) { + $options['y']['labelHeight'] = null; + } + + // Bars options. + // left, right or center. + if (isset($options['bars']['align']) === false) { + $options['bars']['align'] = 'center'; + } + + if (isset($options['bars']['barWidth']) === false) { + $options['bars']['barWidth'] = 0.8; + } + + if (isset($options['bars']['horizontal']) === false) { + $options['bars']['horizontal'] = false; + } + + // Grid Options. + if (isset($options['grid']['show']) === false) { + $options['grid']['show'] = true; + } + + if (isset($options['grid']['aboveData']) === false) { + $options['grid']['aboveData'] = false; + } + + if (isset($options['grid']['color']) === false) { + $options['grid']['color'] = '#ffffff'; + } + + if (isset($options['grid']['backgroundColor']) === false) { + $options['grid']['backgroundColor'] = [ + 'colors' => [ + '#ffffff', + '#ffffff', + ], ]; + } + + if (isset($options['grid']['margin']) === false) { + $options['grid']['margin'] = 0; + } + + if (isset($options['grid']['labelMargin']) === false) { + $options['grid']['labelMargin'] = 5; + } + + if (isset($options['grid']['axisMargin']) === false) { + $options['grid']['axisMargin'] = 5; + } + + if (isset($options['grid']['markings']) === false) { + $options['grid']['markings'] = []; + } + + if (isset($options['grid']['borderWidth']) === false) { + $options['grid']['borderWidth'] = 0; + } + + if (isset($options['grid']['borderColor']) === false) { + $options['grid']['borderColor'] = '#ffffff'; + } + + if (isset($options['grid']['minBorderMargin']) === false) { + $options['grid']['minBorderMargin'] = 5; + } + + if (isset($options['grid']['clickable']) === false) { + $options['grid']['clickable'] = false; + } + + if (isset($options['grid']['hoverable']) === false) { + $options['grid']['hoverable'] = false; + } + + if (isset($options['grid']['autoHighlight']) === false) { + $options['grid']['autoHighlight'] = false; + } + + if (isset($options['grid']['mouseActiveRadius']) === false) { + $options['grid']['mouseActiveRadius'] = false; + } + + // Series bars. + if (isset($options['seriesBars']['show']) === false) { + $options['seriesBars']['show'] = true; + } + + if (isset($options['seriesBars']['lineWidth']) === false) { + $options['seriesBars']['lineWidth'] = 0.3; + } + + if (isset($options['seriesBars']['fill']) === false) { + $options['seriesBars']['fill'] = true; + } + + if (isset($options['seriesBars']['fillColor']) === false) { + $options['seriesBars']['fillColor'] = [ + 'colors' => [ + [ 'opacity' => 0.9 ], + [ 'opacity' => 0.9 ], + ], + ]; + }; + + // Generals options. + if (isset($options['generals']['unit']) === false) { + $options['generals']['unit'] = ''; + } + + if (isset($options['generals']['divisor']) === false) { + $options['generals']['divisor'] = 1000; + } + + if (isset($options['generals']['forceTicks']) === false) { + $options['generals']['forceTicks'] = false; + } + + if (isset($options['generals']['arrayColors']) === false) { + $options['generals']['arrayColors'] = false; + } + + if (isset($options['generals']['rotate']) === false) { + $options['generals']['rotate'] = false; + } + + if (isset($options['generals']['pdf']['width']) === false) { + $options['generals']['pdf']['width'] = false; + } + + if (isset($options['generals']['pdf']['height']) === false) { + $options['generals']['pdf']['height'] = false; + } + + $params = [ + 'data' => $data, + 'x' => [ + 'title' => [ + 'title' => $options['x']['title']['title'], + 'fontSize' => $options['x']['title']['fontSize'], + 'fontFamily' => $options['x']['title']['fontFamily'], + 'padding' => $options['x']['title']['padding'], + ], + 'font' => [ + 'size' => $options['x']['font']['size'], + 'lineHeight' => $options['x']['font']['lineHeight'], + 'style' => $options['x']['font']['style'], + 'weight' => $options['x']['font']['weight'], + 'family' => $options['x']['font']['family'], + 'variant' => $options['x']['font']['variant'], + 'color' => $options['x']['font']['color'], + ], + 'show' => $options['x']['show'], + 'position' => $options['x']['position'], + 'color' => $options['x']['color'], + 'labelWidth' => $options['x']['labelWidth'], + 'labelHeight' => $options['x']['labelHeight'], + ], + 'y' => [ + 'title' => [ + 'title' => $options['y']['title']['title'], + 'fontSize' => $options['y']['title']['fontSize'], + 'fontFamily' => $options['y']['title']['fontFamily'], + 'padding' => $options['y']['title']['padding'], + ], + 'font' => [ + 'size' => $options['y']['font']['size'], + 'lineHeight' => $options['y']['font']['lineHeight'], + 'style' => $options['y']['font']['style'], + 'weight' => $options['y']['font']['weight'], + 'family' => $options['y']['font']['family'], + 'variant' => $options['y']['font']['variant'], + 'color' => $options['y']['font']['color'], + ], + 'show' => $options['y']['show'], + 'position' => $options['y']['position'], + 'color' => $options['y']['color'], + 'labelWidth' => $options['y']['labelWidth'], + 'labelHeight' => $options['y']['labelHeight'], + ], + 'bars' => [ + 'align' => $options['bars']['align'], + 'barWidth' => $options['bars']['barWidth'], + 'horizontal' => $options['bars']['horizontal'], + ], + 'grid' => [ + 'show' => $options['grid']['show'], + 'aboveData' => $options['grid']['aboveData'], + 'color' => $options['grid']['color'], + 'backgroundColor' => $options['grid']['backgroundColor'], + 'margin' => $options['grid']['margin'], + 'labelMargin' => $options['grid']['labelMargin'], + 'axisMargin' => $options['grid']['axisMargin'], + 'markings' => $options['grid']['markings'], + 'borderWidth' => $options['grid']['borderWidth'], + 'borderColor' => $options['grid']['borderColor'], + 'minBorderMargin' => $options['grid']['minBorderMargin'], + 'clickable' => $options['grid']['clickable'], + 'hoverable' => $options['grid']['hoverable'], + 'autoHighlight' => $options['grid']['autoHighlight'], + 'mouseActiveRadius' => $options['grid']['mouseActiveRadius'], + ], + 'seriesBars' => [ + 'show' => $options['seriesBars']['show'], + 'lineWidth' => $options['seriesBars']['lineWidth'], + 'fill' => $options['seriesBars']['fill'], + 'fillColor' => $options['seriesBars']['fillColor'], + ], + 'generals' => [ + 'unit' => $options['generals']['unit'], + 'divisor' => $options['generals']['divisor'], + 'forceTicks' => $options['generals']['forceTicks'], + 'arrayColors' => $options['generals']['arrayColors'], + 'rotate' => $options['generals']['rotate'], + ], + ]; + + if (empty($params['data']) === true) { + return graph_nodata_image(0, 0, 'vbar', '', true); + } + + if ((int) $ttl === 2) { + $params['backgroundColor'] = $options['grid']['backgroundColor']; + $params['return_img_base_64'] = true; + $params['generals']['pdf']['width'] = $options['generals']['pdf']['width']; + $params['generals']['pdf']['height'] = $options['generals']['pdf']['height']; return generator_chart_to_pdf('vbar', $params); } - return flot_vcolumn_chart( - $chart_data, - $width, - $height, - $color, - $legend, - $long_index, - $homeurl, - $unit, - $water_mark_url, - $homedir, - $font, - $font_size, - $from_ux, - $from_wux, - $backgroundColor, - $tick_color - ); + return flot_vcolumn_chart($params); } @@ -237,7 +566,9 @@ function area_graph( include_once 'functions_flot.php'; - setup_watermark($water_mark, $water_mark_file, $water_mark_url); + if ($water_mark !== false) { + setup_watermark($water_mark, $water_mark_file, $water_mark_url); + } return flot_area_graph( $agent_module_id, @@ -274,7 +605,9 @@ function stacked_bullet_chart( ) { include_once 'functions_d3.php'; - setup_watermark($water_mark, $water_mark_file, $water_mark_url); + if ($water_mark !== false) { + setup_watermark($water_mark, $water_mark_file, $water_mark_url); + } if (empty($chart_data)) { return ''; @@ -350,7 +683,9 @@ function hbar_graph( $val_max=null, $base64=false ) { - setup_watermark($water_mark, $water_mark_file, $water_mark_url); + if ($water_mark !== false) { + setup_watermark($water_mark, $water_mark_file, $water_mark_url); + } if ($chart_data === false || empty($chart_data) === true) { return graph_nodata_image($width, $height, 'hbar'); @@ -402,16 +737,18 @@ function pie_graph( $colors='', $hide_labels=false ) { - if (empty($chart_data)) { + if (empty($chart_data) === true) { return graph_nodata_image($width, $height, 'pie'); } - setup_watermark($water_mark, $water_mark_file, $water_mark_url); + if ($water_mark !== false) { + setup_watermark($water_mark, $water_mark_file, $water_mark_url); + } - // This library allows only 8 colors + // This library allows only 8 colors. $max_values = 9; - // Remove the html_entities + // Remove the html_entities. $temp = []; foreach ($chart_data as $key => $value) { $temp[io_safe_output($key)] = $value; diff --git a/pandora_console/include/graphs/flot/pandora.flot.js b/pandora_console/include/graphs/flot/pandora.flot.js index ba4c971a7a..cb2a6fc4cc 100644 --- a/pandora_console/include/graphs/flot/pandora.flot.js +++ b/pandora_console/include/graphs/flot/pandora.flot.js @@ -507,23 +507,45 @@ $.fn.HUseTooltip = function() { } }); }; + $.fn.VUseTooltip = function() { $(this).bind("plothover", function(event, pos, item) { if (item) { if ( previousLabel != item.series.label || - previousPoint != item.seriesIndex + previousPoint != item.dataIndex ) { - previousPoint = item.seriesIndex; + previousPoint = item.dataIndex; previousLabel = item.series.label; - $("#tooltip").remove(); - // var x = item.datapoint[0]; + var x = item.datapoint[0]; + var y = item.datapoint[1]; + if (typeof y != "string") { + y = number_format(y, false, "", 2, 1000); + } var color = item.series.color; - showTooltip(pos.pageX, pos.pageY, color, "" + y + ""); + + //console.log(item.series.xaxis.ticks[x].label); + + /* + "" + + item.series.label + + "
" + + item.series.xaxis.ticks[x].label + + " : " + + y + + "" + */ + + showTooltip( + item.pageX, + item.pageY, + color, + "" + item.series.label + " : " + y + "" + ); } } else { $("#tooltip").remove(); @@ -552,223 +574,143 @@ function showTooltip(x, y, color, contents) { } // eslint-disable-next-line no-unused-vars -function pandoraFlotVBars( - graph_id, - values, - labels, - labels_long, - legend, - colors, - maxvalue, - water_mark, - separator, - separator2, - font, - font_size, - from_ux, - from_wux, - background_color, - tick_color -) { - values = values.split(separator2); - legend = legend.split(separator); - font = font - .split("/") - .pop() - .split(".") - .shift(); - labels_long = labels_long.length > 0 ? labels_long.split(separator) : 0; - colors = colors.length > 0 ? colors.split(separator) : []; +function pandoraFlotVBars(settings) { + settings = JSON.parse(atob(settings)); - var colors_data = - colors.length > 0 - ? colors - : ["#FFA631", "#e63c52", "#f3b200", "#5BB6E5", "#F2919D", "#82b92e"]; - var datas = new Array(); + var unit = settings.generals.unit; + var divisor = settings.generals.divisor; - for (var i = 0; i < values.length; i++) { - var serie = values[i].split(separator); - - var aux = new Array(); - for (var j = 0; j < serie.length; j++) { - var aux2 = parseFloat(serie[j]); - aux.push([aux2, j]); - if (from_ux) { - datas.push({ - data: [[j, aux2]], - color: colors_data[j] - }); - } else { - datas.push({ - data: [[j, aux2]], - color: colors_data[0] - }); + var datas = []; + var ticks = []; + var labels = []; + settings.data.forEach(function(element, index) { + var color = element.color; + if (settings.generals.arrayColors) { + if (settings.generals.arrayColors[index] != undefined) { + color = settings.generals.arrayColors[index].color; } } - } - var labels_total = new Array(); - labels = labels.split(separator); - i = 0; - for (i = 0; i < labels.length; i++) { - labels_total.push([i, labels[i]]); + datas.push({ + label: element.tick, + color: color, + data: [[index, element.data]] + }); + + if (settings.generals.forceTicks === true) { + ticks.push([index, element.tick]); + } else { + ticks.push([element.tick]); + } + + labels.push([index, element.tick]); + }); + + var formatterTicks = ""; + if (settings.generals.forceTicks === true) { + formatterTicks = ""; + } else { + var ticksformatter = ticks; + ticks = null; + formatterTicks = function(v) { + return ticksformatter[Math.round(v)]; + }; } var options = { series: { bars: { - show: true, - lineWidth: 1, - fill: 1, - align: "center", - barWidth: 1 + show: settings.seriesBars.show, + lineWidth: settings.seriesBars.lineWidth, + fill: settings.seriesBars.fill, + fillColor: settings.seriesBars.fillColor } }, + bars: { + align: settings.bars.align, + barWidth: settings.bars.barWidth, + horizontal: settings.bars.horizontal + }, xaxis: { - color: tick_color, + axisLabel: settings.x.title.title, axisLabelUseCanvas: true, - axisLabelFontSizePixels: font_size, - axisLabelFontFamily: font + "Font", - axisLabelPadding: 0, - ticks: xFormatter, - labelWidth: 130, - labelHeight: 50 + axisLabelFontSizePixels: settings.x.title.fontSize, + axisLabelFontFamily: settings.x.title.fontFamily, + axisLabelPadding: settings.x.title.padding, + font: { + size: settings.x.font.size, + lineHeight: settings.x.font.lineHeight, + style: settings.x.font.style, + weight: settings.x.font.weight, + family: settings.x.font.family, + variant: settings.x.font.variant, + color: settings.x.font.color + }, + show: settings.x.show, + position: settings.x.position, + color: settings.x.color, + ticks: ticks, + tickFormatter: formatterTicks, + labelWidth: settings.x.labelWidth, + labelHeight: settings.x.labelHeight }, yaxis: { - color: tick_color, + axisLabel: settings.y.title.title, axisLabelUseCanvas: true, - axisLabelFontSizePixels: font_size, - axisLabelFontFamily: font + "Font", - axisLabelPadding: 100, - autoscaleMargin: 0.02, + axisLabelFontSizePixels: settings.y.title.fontSize, + axisLabelFontFamily: settings.y.title.fontFamily, + axisLabelPadding: settings.y.title.padding, + font: { + size: settings.y.font.size, + lineHeight: settings.y.font.lineHeight, + style: settings.y.font.style, + weight: settings.y.font.weight, + family: settings.y.font.family, + variant: settings.y.font.variant, + color: settings.y.font.color + }, + show: settings.y.show, + position: settings.y.position, + color: settings.y.color, tickFormatter: function(v) { - var label = parseFloat(v); - var text = label.toLocaleString(); - if (label >= 1000000) text = text.substring(0, 4) + "M"; - else if (label >= 100000) text = text.substring(0, 3) + "K"; - else if (label >= 1000) text = text.substring(0, 2) + "K"; + var formatted = v; + if (typeof formatted != "string") { + formatted = number_format(v, false, unit, 2, divisor); + } - return ( - '
' + - text + - "
" - ); - } + return formatted; + }, + labelWidth: settings.y.labelWidth, + labelHeight: settings.y.labelHeight, + reserveSpace: true }, legend: { - noColumns: 100, - labelBoxBorderColor: "", - margin: 100, - container: true, - sorted: false + // TODO: settings. + show: false }, grid: { - hoverable: true, - borderWidth: 1, - tickColor: tick_color, - borderColor: "#C1C1C1", - backgroundColor: { colors: [background_color, background_color] } + show: settings.grid.show, + aboveData: settings.grid.aboveData, + color: settings.grid.color, + backgroundColor: settings.grid.backgroundColor, + margin: settings.grid.margin, + labelMargin: settings.grid.labelMargin, + axisMargin: settings.grid.axisMargin, + markings: settings.grid.markings, + borderWidth: settings.grid.borderWidth, + borderColor: settings.grid.borderColor, + minBorderMargin: settings.grid.minBorderMargin, + clickable: settings.grid.clickable, + hoverable: settings.grid.hoverable, + autoHighlight: settings.grid.autoHighlight, + mouseActiveRadius: settings.grid.mouseActiveRadius } }; - if (from_wux) { - options.series.bars.barWidth = 0.5; - options.grid.aboveData = true; - options.grid.borderWidth = 0; - options.grid.markings = [ - { xaxis: { from: -0.25, to: -0.25 }, color: "#000" }, - { yaxis: { from: 0, to: 0 }, color: "#000" } - ]; - options.grid.markingsLineWidth = 0.3; + $.plot($("#" + settings.graphId), datas, options); - options.xaxis.tickLength = 0; - options.yaxis.tickLength = 0; - } - - if ( - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ) - options.xaxis.labelWidth = 100; - - var plot = $.plot($("#" + graph_id), datas, options); - $("#" + graph_id).VUseTooltip(); - $("#" + graph_id).css("margin-left", "auto"); - $("#" + graph_id).css("margin-right", "auto"); - - if ( - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ) - $("#" + graph_id + " .xAxis .tickLabel") - .find("div") - .css("top", "+0px") - .css("left", "-20px"); - // Format functions - function xFormatter() { - var format = new Array(); - for (i = 0; i < labels_total.length; i++) { - var label = labels_total[i][1]; - var shortLabel = reduceText(label, 28); - if ( - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ) - shortLabel = reduceText(label, 18); - var title = ""; - if (label !== shortLabel) { - title = label; - label = shortLabel; - } - - format.push([ - i, - '
' + - label + - "
" - ]); - } - return format; - } - - /* - function yFormatter(v) { - return ( - '
' + - v + - "
" - ); - } - - function lFormatter(v, axis) { - return ( - '
' + v + "
" - ); - } - */ - - if (water_mark) { - set_watermark( - graph_id, - plot, - $("#watermark_image_" + graph_id).attr("src") - ); - } + // Hover in bars graph. + $("#" + settings.graphId).VUseTooltip(); } // eslint-disable-next-line no-unused-vars @@ -968,6 +910,11 @@ function pandoraFlotSlicebar( // Format functions function xFormatter(v) { + var ct = new Date(); + var currentTime = ct.getTime(); + + var diffDates = (currentTime - 1000 * datelimit) / 1000; + var d = new Date(1000 * (v + datelimit)); var monthNames = [ "Jan", @@ -984,17 +931,27 @@ function pandoraFlotSlicebar( "Dec" ]; - var date_format = - (d.getDate() < 10 ? "0" : "") + - d.getDate() + - " " + - monthNames[d.getMonth()] + - "
" + - (d.getHours() < 10 ? "0" : "") + - d.getHours() + - ":" + - (d.getMinutes() < 10 ? "0" : "") + - d.getMinutes(); + var date_format = ""; + if (diffDates > 86500) { + date_format = + (d.getDate() < 10 ? "0" : "") + + d.getDate() + + " " + + monthNames[d.getMonth()] + + "
" + + (d.getHours() < 10 ? "0" : "") + + d.getHours() + + ":" + + (d.getMinutes() < 10 ? "0" : "") + + d.getMinutes(); + } else { + date_format = + (d.getHours() < 10 ? "0" : "") + + d.getHours() + + ":" + + (d.getMinutes() < 10 ? "0" : "") + + d.getMinutes(); + } return date_format; } } @@ -1030,13 +987,12 @@ function pandoraFlotArea( var type = parseInt(params.stacked); var show_legend = params.show_legend; var image_treshold = params.image_treshold; - var short_data = params.short_data; + var short_data = params.short_data != "" ? params.short_data : 3; var grid_color = params.grid_color; var background_color = params.backgroundColor; var legend_color = params.legend_color; var update_legend = {}; var force_integer = 0; - // var title = params.title; var divisor = params.divisor; if (typeof divisor === "undefined") { @@ -2088,23 +2044,6 @@ function pandoraFlotArea( var plot = $.plot($("#" + graph_id), datas, options); - // Re-calculate the graph height with the legend height - if (dashboard) { - var $acum = 0; - if (dashboard) $acum = 35; - var hDiff = - $("#" + graph_id).height() - $("#legend_" + graph_id).height() - $acum; - if ( - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ) { - // not defined.??? - } else { - $("#" + graph_id).css("height", hDiff); - } - } - // Adjust the overview plot to the width and position of the main plot adjust_left_width_canvas(graph_id, "overview_" + graph_id); update_left_width_canvas(graph_id); @@ -3058,6 +2997,7 @@ function check_adaptions(graph_id) { function number_format(number, force_integer, unit, short_data, divisor) { divisor = typeof divisor !== "undefined" ? divisor : 1000; + var decimals = 2; if (unit == "KB") { return number + unit; diff --git a/pandora_console/include/graphs/functions_d3.php b/pandora_console/include/graphs/functions_d3.php index ae0b950119..659270744a 100644 --- a/pandora_console/include/graphs/functions_d3.php +++ b/pandora_console/include/graphs/functions_d3.php @@ -305,7 +305,7 @@ function d3_gauges( $output = include_javascript_d3(true); foreach ($chart_data as $module) { - $output .= "
"; + $output .= "
"; } $output .= "'; - if (!$return) { + if ($return === false) { echo $output; } @@ -479,79 +484,78 @@ function d3_donut_graph($id, $width, $height, $module_data, $resume_color) } -function print_clock_analogic_1($time_format, $timezone, $clock_animation, $width, $height, $id_element, $color) -{ +function print_clock_analogic_1( + $time_format, + $timezone, + $clock_animation, + $width, + $height, + $id_element, + $color, + $title=true +) { global $config; $output .= ''; - .second-label{ - font-size: 12px; - } + $tz = $timezone; + $timestamp = time(); + $dt = new DateTime('now', new DateTimeZone($tz)); + // first argument "must" be a string. + $dt->setTimestamp($timestamp); + // adjust the object to correct timestamp. + $dateTimeZoneOption = new DateTimeZone(date_default_timezone_get()); + $dateTimeZonePandora = new DateTimeZone($timezone); - .hour-label{ - font-size: 24px; - } - } - '; + $dateTimeOption = new DateTime('now', $dateTimeZoneOption); + $dateTimePandora = new DateTime('now', $dateTimeZonePandora); - $tz = $timezone; - $timestamp = time(); - $dt = new DateTime('now', new DateTimeZone($tz)); - // first argument "must" be a string - $dt->setTimestamp($timestamp); - // adjust the object to correct timestamp - $dateTimeZoneOption = new DateTimeZone(date_default_timezone_get()); - $dateTimeZonePandora = new DateTimeZone($timezone); + $timeOffset = $dateTimeZonePandora->getOffset($dateTimeOption); - $dateTimeOption = new DateTime('now', $dateTimeZoneOption); - $dateTimePandora = new DateTime('now', $dateTimeZonePandora); - - $timeOffset = $dateTimeZonePandora->getOffset($dateTimeOption); - - $output .= include_javascript_d3(true); + $output .= include_javascript_d3(true); if ($width == 0) { $date_width = 200; @@ -559,24 +563,25 @@ function print_clock_analogic_1($time_format, $timezone, $clock_animation, $widt $date_width = $width; } - $output .= '
'; + if ($title === true) { + $output .= '
'; - if ($time_format == 'timedate') { - $output .= $dt->format('d / m / Y').' - '; + if ($time_format == 'timedate') { + $output .= $dt->format('d / m / Y').' - '; + } + + $output .= $dt->format('a').'
'; + + $timezone_short = explode('/', $timezone); + $timezone_short_end = end($timezone_short); + $output .= '
'.$timezone_short_end.'
'; } - $output .= $dt->format('a').'
'; + $output .= ""; - $output .= ""; - - $timezone_short = explode('/', $timezone); - $timezone_short_end = end($timezone_short); - - $output .= '
'.$timezone_short_end.'
'; - - return $output; + return $output; } diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php index 5445884a8a..1a74f456b2 100644 --- a/pandora_console/include/graphs/functions_flot.php +++ b/pandora_console/include/graphs/functions_flot.php @@ -138,10 +138,8 @@ function flot_area_graph( break; } - $padding_vconsole = ($params['dashboard']) ? 'padding: 1px 0px 10px 10px;' : ''; - // Parent layer. - $return = "
"; + $return = "
"; if ($params['title'] === true && empty($params['title']) === false) { $return .= '

'.$params['title'].'

'; @@ -149,14 +147,14 @@ function flot_area_graph( // Set some containers to legend, graph, timestamp tooltip, etc. if ($params['show_legend']) { - $return .= '

'; + $return .= '

'; } - if (isset($params['graph_combined']) && $params['graph_combined'] - && (!isset($params['from_interface']) || !$params['from_interface']) + if (isset($params['graph_combined']) === true && $params['graph_combined'] + && (isset($params['from_interface']) === false || !$params['from_interface']) ) { - if (isset($params['threshold_data']) - && is_array($params['threshold_data']) + if (isset($params['threshold_data']) === true + && is_array($params['threshold_data']) === true ) { $yellow_threshold = $params['threshold_data']['yellow_threshold']; $red_threshold = $params['threshold_data']['red_threshold']; @@ -170,7 +168,7 @@ function flot_area_graph( $yellow_inverse = false; $red_inverse = false; } - } else if (!isset($params['combined']) || !$params['combined']) { + } else if (isset($params['combined']) === false || !$params['combined']) { $yellow_threshold = $data_module_graph['w_min']; $red_threshold = $data_module_graph['c_min']; // Get other required module datas to draw warning and critical. @@ -185,10 +183,10 @@ function flot_area_graph( $yellow_inverse = !($data_module_graph['w_inv'] == 0); $red_inverse = !($data_module_graph['c_inv'] == 0); } - } else if (isset($params['from_interface']) + } else if (isset($params['from_interface']) === true && $params['from_interface'] ) { - if (isset($params['threshold_data']) + if (isset($params['threshold_data']) === true && is_array($params['threshold_data']) ) { $yellow_threshold = $params['threshold_data']['yellow_threshold']; @@ -228,12 +226,14 @@ function flot_area_graph( $config['custom_graph_width'], true ); - $return .= "
"; + /* + $return .= "
"; + */ $return .= "
"; - } + style='margin:0px; margin-top:30px; margin-bottom:50px; width: ".$params['width']."px; height: 200px;'>
"; - if ($water_mark != '') { - $return .= ""; - $watermark = 'true'; - } else { - $watermark = 'false'; + if ($water_mark != '') { + $return .= ""; + $watermark = 'true'; + } else { + $watermark = 'false'; + } } foreach ($series_type as $k => $v) { $series_type_unique['data_'.$graph_id.'_'.$k] = $v; } - // Store data series in javascript format. - $extra_width = (int) ($params['width'] / 3); - $return .= "
"; - // Trick to get translated string from javascript. - $return .= html_print_input_hidden('unknown_text', __('Unknown'), true); + // Trick to get translated string from javascript. + $return .= html_print_input_hidden('unknown_text', __('Unknown'), true); + */ $values = json_encode($array_data); @@ -334,52 +336,32 @@ function menu_graph( $threshold = true; } - if ($params['dashboard'] == false and $params['vconsole'] == false) { - $return .= "'; + $return .= "'; + return $return; } @@ -436,8 +418,7 @@ function flot_pie_chart( $colors = implode($separator, $colors); } - include_javascript_dependencies_flot_graph(); - + // include_javascript_dependencies_flot_graph(); $return .= "'; return $return; @@ -738,7 +670,7 @@ function flot_slicesbar_graph( $full_legend_date=[], $not_interactive=0, $ttl=1, - $widgets=false, + $sizeForTicks=false, $show=true, $date_to=false, $server_id='' @@ -763,7 +695,7 @@ function flot_slicesbar_graph( 'full_legend_date' => $full_legend_date, 'not_interactive' => $not_interactive, 'ttl' => 1, - 'widgets' => $widgets, + 'sizeForTicks' => $sizeForTicks, 'show' => $show, 'return_img_base_64' => true, 'date_to' => $date_to, @@ -776,67 +708,62 @@ function flot_slicesbar_graph( return $graph; } - // Get a unique identifier to graph + // Get a unique identifier to graph. $graph_id = uniqid('graph_'); // Set some containers to legend, graph, timestamp tooltip, etc. + $height = ((int) $height + 15); if ($stat_win) { - $height = ((int) $height + 15); $return = "
"; } else { - if ($widgets) { - $width = ((int) $width - 10); - $height = ((int) $height - 10); - $return = "
"; - } else { - $height = ((int) $height + 15); - $return = "
"; - } + $return = "
"; } $return .= ""; - // Set a weird separator to serialize and unserialize passing data from php to javascript + // Set a weird separator to serialize and unserialize + // passing data from php to javascript. $separator = ';;::;;'; $separator2 = ':,:,,,:,:'; - // Transform data from our format to library format + // Transform data from our format to library format. $vars = []; $datacolor = []; - $max = 0; - - $i = count($graph_data); - - $intervaltick = ($period / $i); - $fontsize = $config['font_size']; $fontpath = $config['fontpath']; - $extra_height = 40; - if (defined('METACONSOLE')) { - $extra_height = 50; - } - $return .= ''; $maxticks = (int) 20; + if ($sizeForTicks === false) { + $maxticks = (int) 20; + } else if ($sizeForTicks < 300) { + $maxticks = (int) 3; + } else if ($sizeForTicks < 600) { + $maxticks = (int) 6; + } else if ($sizeForTicks < 900) { + $maxticks = (int) 9; + } - $i_aux = $i; + $intervaltick = ($period / $maxticks); + + $maxticks_aux = $maxticks; while (1) { - if ($i_aux <= $maxticks) { + if ($maxticks_aux <= $maxticks) { break; } $intervaltick *= 2; - $i_aux /= 2; + $maxticks_aux /= 2; } $intervaltick = (int) $intervaltick; + $i = count($graph_data); foreach ($graph_data as $label => $values) { $i--; diff --git a/pandora_console/include/graphs/pandora.d3.js b/pandora_console/include/graphs/pandora.d3.js index 685faf1c2a..bfebebe99c 100644 --- a/pandora_console/include/graphs/pandora.d3.js +++ b/pandora_console/include/graphs/pandora.d3.js @@ -1543,21 +1543,19 @@ function Gauge(placeholderName, configuration, font) { this.configure(configuration); } -function print_phases_donut(recipient, phases) { +function print_phases_donut(recipient, phases, width, height) { var svg = d3 .select(recipient) .append("svg") - .attr("width", 800) - .attr("height", 500) + .attr("width", width) + .attr("height", height) .append("g"); svg.append("g").attr("class", "slices"); svg.append("g").attr("class", "labels"); svg.append("g").attr("class", "lines"); - var width = 550, - height = 300, - radius = Math.min(width, height) / 2; + var radius = Math.min(width, height) / 2 - 50; var pie = d3.layout .pie() @@ -1576,8 +1574,6 @@ function print_phases_donut(recipient, phases) { .innerRadius(radius * 0.9) .outerRadius(radius * 0.9); - width = 800; - height = 500; svg.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); var key = function(d) { diff --git a/pandora_console/include/javascript/gridstack.all.js b/pandora_console/include/javascript/gridstack.all.js new file mode 100644 index 0000000000..2dcdb4b10d --- /dev/null +++ b/pandora_console/include/javascript/gridstack.all.js @@ -0,0 +1,1715 @@ +/** + * gridstack.js 0.3.0 + * http://troolee.github.io/gridstack.js/ + * (c) 2014-2016 Pavel Reznikov, Dylan Weiss + * gridstack.js may be freely distributed under the MIT license. + * @preserve + */ +!(function(a) { + if ("function" == typeof define && define.amd) + define(["jquery", "lodash"], a); + else if ("undefined" != typeof exports) { + try { + jQuery = require("jquery"); + } catch (a) {} + try { + _ = require("lodash"); + } catch (a) {} + a(jQuery, _); + } else a(jQuery, _); +})(function(a, b) { + function c(a) { + this.grid = a; + } + var d = window, + e = function(a, b, c) { + var d = function() { + return ( + console.warn( + "gridstack.js: Function `" + + b + + "` is deprecated as of v0.2.5 and has been replaced with `" + + c + + "`. It will be **completely** removed in v1.0." + ), + a.apply(this, arguments) + ); + }; + return (d.prototype = a.prototype), d; + }, + f = function(a, b) { + console.warn( + "gridstack.js: Option `" + + a + + "` is deprecated as of v0.2.5 and has been replaced with `" + + b + + "`. It will be **completely** removed in v1.0." + ); + }, + g = { + isIntercepted: function(a, b) { + return !( + a.x + a.width <= b.x || + b.x + b.width <= a.x || + a.y + a.height <= b.y || + b.y + b.height <= a.y + ); + }, + sort: function(a, c, d) { + return ( + (d = + d || + b + .chain(a) + .map(function(a) { + return a.x + a.width; + }) + .max() + .value()), + (c = -1 != c ? 1 : -1), + b.sortBy(a, function(a) { + return c * (a.x + a.y * d); + }) + ); + }, + createStylesheet: function(a) { + var b = document.createElement("style"); + return ( + b.setAttribute("type", "text/css"), + b.setAttribute("data-gs-style-id", a), + b.styleSheet + ? (b.styleSheet.cssText = "") + : b.appendChild(document.createTextNode("")), + document.getElementsByTagName("head")[0].appendChild(b), + b.sheet + ); + }, + removeStylesheet: function(b) { + a("STYLE[data-gs-style-id=" + b + "]").remove(); + }, + insertCSSRule: function(a, b, c, d) { + "function" == typeof a.insertRule + ? a.insertRule(b + "{" + c + "}", d) + : "function" == typeof a.addRule && a.addRule(b, c, d); + }, + toBool: function(a) { + return "boolean" == typeof a + ? a + : "string" == typeof a + ? !( + "" === (a = a.toLowerCase()) || + "no" == a || + "false" == a || + "0" == a + ) + : Boolean(a); + }, + _collisionNodeCheck: function(a) { + return a != this.node && g.isIntercepted(a, this.nn); + }, + _didCollide: function(a) { + return g.isIntercepted( + { + x: this.n.x, + y: this.newY, + width: this.n.width, + height: this.n.height + }, + a + ); + }, + _isAddNodeIntercepted: function(a) { + return g.isIntercepted( + { + x: this.x, + y: this.y, + width: this.node.width, + height: this.node.height + }, + a + ); + }, + parseHeight: function(a) { + var c = a, + d = "px"; + if (c && b.isString(c)) { + var e = c.match( + /^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw)?$/ + ); + if (!e) throw new Error("Invalid height"); + (d = e[2] || "px"), (c = parseFloat(e[1])); + } + return { height: c, unit: d }; + } + }; + (g.is_intercepted = e(g.isIntercepted, "is_intercepted", "isIntercepted")), + (g.create_stylesheet = e( + g.createStylesheet, + "create_stylesheet", + "createStylesheet" + )), + (g.remove_stylesheet = e( + g.removeStylesheet, + "remove_stylesheet", + "removeStylesheet" + )), + (g.insert_css_rule = e( + g.insertCSSRule, + "insert_css_rule", + "insertCSSRule" + )), + (c.registeredPlugins = []), + (c.registerPlugin = function(a) { + c.registeredPlugins.push(a); + }), + (c.prototype.resizable = function(a, b) { + return this; + }), + (c.prototype.draggable = function(a, b) { + return this; + }), + (c.prototype.droppable = function(a, b) { + return this; + }), + (c.prototype.isDroppable = function(a) { + return !1; + }), + (c.prototype.on = function(a, b, c) { + return this; + }); + var h = 0, + i = function(a, b, c, d, e) { + (this.width = a), + (this.float = c || !1), + (this.height = d || 0), + (this.nodes = e || []), + (this.onchange = b || function() {}), + (this._updateCounter = 0), + (this._float = this.float), + (this._addedNodes = []), + (this._removedNodes = []); + }; + (i.prototype.batchUpdate = function() { + (this._updateCounter = 1), (this.float = !0); + }), + (i.prototype.commit = function() { + 0 !== this._updateCounter && + ((this._updateCounter = 0), + (this.float = this._float), + this._packNodes(), + this._notify()); + }), + (i.prototype.getNodeDataByDOMEl = function(a) { + return b.find(this.nodes, function(b) { + return a.get(0) === b.el.get(0); + }); + }), + (i.prototype._fixCollisions = function(a) { + this._sortNodes(-1); + var c = a, + d = Boolean( + b.find(this.nodes, function(a) { + return a.locked; + }) + ); + for ( + this.float || + d || + (c = { x: 0, y: a.y, width: this.width, height: a.height }); + ; + + ) { + var e = b.find( + this.nodes, + b.bind(g._collisionNodeCheck, { node: a, nn: c }) + ); + if (void 0 === e) return; + this.moveNode(e, e.x, a.y + a.height, e.width, e.height, !0); + } + }), + (i.prototype.isAreaEmpty = function(a, c, d, e) { + var f = { x: a || 0, y: c || 0, width: d || 1, height: e || 1 }, + h = b.find( + this.nodes, + b.bind(function(a) { + return g.isIntercepted(a, f); + }, this) + ); + return null === h || void 0 === h; + }), + (i.prototype._sortNodes = function(a) { + this.nodes = g.sort(this.nodes, a, this.width); + }), + (i.prototype._packNodes = function() { + this._sortNodes(), + this.float + ? b.each( + this.nodes, + b.bind(function(a, c) { + if (!a._updating && void 0 !== a._origY && a.y != a._origY) + for (var d = a.y; d >= a._origY; ) { + var e = b + .chain(this.nodes) + .find(b.bind(g._didCollide, { n: a, newY: d })) + .value(); + e || ((a._dirty = !0), (a.y = d)), --d; + } + }, this) + ) + : b.each( + this.nodes, + b.bind(function(a, c) { + if (!a.locked) + for (; a.y > 0; ) { + var d = a.y - 1, + e = 0 === c; + if (c > 0) { + var f = b + .chain(this.nodes) + .take(c) + .find(b.bind(g._didCollide, { n: a, newY: d })) + .value(); + e = void 0 === f; + } + if (!e) break; + (a._dirty = a.y != d), (a.y = d); + } + }, this) + ); + }), + (i.prototype._prepareNode = function(a, c) { + return ( + (a = b.defaults(a || {}, { width: 1, height: 1, x: 0, y: 0 })), + (a.x = parseInt("" + a.x)), + (a.y = parseInt("" + a.y)), + (a.width = parseInt("" + a.width)), + (a.height = parseInt("" + a.height)), + (a.autoPosition = a.autoPosition || !1), + (a.noResize = a.noResize || !1), + (a.noMove = a.noMove || !1), + a.width > this.width + ? (a.width = this.width) + : a.width < 1 && (a.width = 1), + a.height < 1 && (a.height = 1), + a.x < 0 && (a.x = 0), + a.x + a.width > this.width && + (c ? (a.width = this.width - a.x) : (a.x = this.width - a.width)), + a.y < 0 && (a.y = 0), + a + ); + }), + (i.prototype._notify = function() { + var a = Array.prototype.slice.call(arguments, 0); + if ( + ((a[0] = void 0 === a[0] ? [] : [a[0]]), + (a[1] = void 0 === a[1] || a[1]), + !this._updateCounter) + ) { + var b = a[0].concat(this.getDirtyNodes()); + this.onchange(b, a[1]); + } + }), + (i.prototype.cleanNodes = function() { + this._updateCounter || + b.each(this.nodes, function(a) { + a._dirty = !1; + }); + }), + (i.prototype.getDirtyNodes = function() { + return b.filter(this.nodes, function(a) { + return a._dirty; + }); + }), + (i.prototype.addNode = function(a, c) { + if ( + ((a = this._prepareNode(a)), + void 0 !== a.maxWidth && (a.width = Math.min(a.width, a.maxWidth)), + void 0 !== a.maxHeight && (a.height = Math.min(a.height, a.maxHeight)), + void 0 !== a.minWidth && (a.width = Math.max(a.width, a.minWidth)), + void 0 !== a.minHeight && (a.height = Math.max(a.height, a.minHeight)), + (a._id = ++h), + (a._dirty = !0), + a.autoPosition) + ) { + this._sortNodes(); + for (var d = 0; ; ++d) { + var e = d % this.width, + f = Math.floor(d / this.width); + if ( + !(e + a.width > this.width) && + !b.find( + this.nodes, + b.bind(g._isAddNodeIntercepted, { x: e, y: f, node: a }) + ) + ) { + (a.x = e), (a.y = f); + break; + } + } + } + return ( + this.nodes.push(a), + void 0 !== c && c && this._addedNodes.push(b.clone(a)), + this._fixCollisions(a), + this._packNodes(), + this._notify(), + a + ); + }), + (i.prototype.removeNode = function(a, c) { + (c = void 0 === c || c), + this._removedNodes.push(b.clone(a)), + (a._id = null), + (this.nodes = b.without(this.nodes, a)), + this._packNodes(), + this._notify(a, c); + }), + (i.prototype.canMoveNode = function(c, d, e, f, g) { + if (!this.isNodeChangedPosition(c, d, e, f, g)) return !1; + var h = Boolean( + b.find(this.nodes, function(a) { + return a.locked; + }) + ); + if (!this.height && !h) return !0; + var j, + k = new i( + this.width, + null, + this.float, + 0, + b.map(this.nodes, function(b) { + return b == c ? (j = a.extend({}, b)) : a.extend({}, b); + }) + ); + if (void 0 === j) return !0; + k.moveNode(j, d, e, f, g); + var l = !0; + return ( + h && + (l &= !Boolean( + b.find(k.nodes, function(a) { + return a != j && Boolean(a.locked) && Boolean(a._dirty); + }) + )), + this.height && (l &= k.getGridHeight() <= this.height), + l + ); + }), + (i.prototype.canBePlacedWithRespectToHeight = function(c) { + if (!this.height) return !0; + var d = new i( + this.width, + null, + this.float, + 0, + b.map(this.nodes, function(b) { + return a.extend({}, b); + }) + ); + return d.addNode(c), d.getGridHeight() <= this.height; + }), + (i.prototype.isNodeChangedPosition = function(a, b, c, d, e) { + return ( + "number" != typeof b && (b = a.x), + "number" != typeof c && (c = a.y), + "number" != typeof d && (d = a.width), + "number" != typeof e && (e = a.height), + void 0 !== a.maxWidth && (d = Math.min(d, a.maxWidth)), + void 0 !== a.maxHeight && (e = Math.min(e, a.maxHeight)), + void 0 !== a.minWidth && (d = Math.max(d, a.minWidth)), + void 0 !== a.minHeight && (e = Math.max(e, a.minHeight)), + a.x != b || a.y != c || a.width != d || a.height != e + ); + }), + (i.prototype.moveNode = function(a, b, c, d, e, f) { + if (!this.isNodeChangedPosition(a, b, c, d, e)) return a; + if ( + ("number" != typeof b && (b = a.x), + "number" != typeof c && (c = a.y), + "number" != typeof d && (d = a.width), + "number" != typeof e && (e = a.height), + void 0 !== a.maxWidth && (d = Math.min(d, a.maxWidth)), + void 0 !== a.maxHeight && (e = Math.min(e, a.maxHeight)), + void 0 !== a.minWidth && (d = Math.max(d, a.minWidth)), + void 0 !== a.minHeight && (e = Math.max(e, a.minHeight)), + a.x == b && a.y == c && a.width == d && a.height == e) + ) + return a; + var g = a.width != d; + return ( + (a._dirty = !0), + (a.x = b), + (a.y = c), + (a.width = d), + (a.height = e), + (a.lastTriedX = b), + (a.lastTriedY = c), + (a.lastTriedWidth = d), + (a.lastTriedHeight = e), + (a = this._prepareNode(a, g)), + this._fixCollisions(a), + f || (this._packNodes(), this._notify()), + a + ); + }), + (i.prototype.getGridHeight = function() { + return b.reduce( + this.nodes, + function(a, b) { + return Math.max(a, b.y + b.height); + }, + 0 + ); + }), + (i.prototype.beginUpdate = function(a) { + b.each(this.nodes, function(a) { + a._origY = a.y; + }), + (a._updating = !0); + }), + (i.prototype.endUpdate = function() { + b.each(this.nodes, function(a) { + a._origY = a.y; + }); + var a = b.find(this.nodes, function(a) { + return a._updating; + }); + a && (a._updating = !1); + }); + var j = function(d, e) { + var g, + h, + j = this; + (e = e || {}), + (this.container = a(d)), + void 0 !== e.handle_class && + ((e.handleClass = e.handle_class), f("handle_class", "handleClass")), + void 0 !== e.item_class && + ((e.itemClass = e.item_class), f("item_class", "itemClass")), + void 0 !== e.placeholder_class && + ((e.placeholderClass = e.placeholder_class), + f("placeholder_class", "placeholderClass")), + void 0 !== e.placeholder_text && + ((e.placeholderText = e.placeholder_text), + f("placeholder_text", "placeholderText")), + void 0 !== e.cell_height && + ((e.cellHeight = e.cell_height), f("cell_height", "cellHeight")), + void 0 !== e.vertical_margin && + ((e.verticalMargin = e.vertical_margin), + f("vertical_margin", "verticalMargin")), + void 0 !== e.min_width && + ((e.minWidth = e.min_width), f("min_width", "minWidth")), + void 0 !== e.static_grid && + ((e.staticGrid = e.static_grid), f("static_grid", "staticGrid")), + void 0 !== e.is_nested && + ((e.isNested = e.is_nested), f("is_nested", "isNested")), + void 0 !== e.always_show_resize_handle && + ((e.alwaysShowResizeHandle = e.always_show_resize_handle), + f("always_show_resize_handle", "alwaysShowResizeHandle")), + (e.itemClass = e.itemClass || "grid-stack-item"); + var k = this.container.closest("." + e.itemClass).length > 0; + if ( + ((this.opts = b.defaults(e || {}, { + width: parseInt(this.container.attr("data-gs-width")) || 12, + height: parseInt(this.container.attr("data-gs-height")) || 0, + itemClass: "grid-stack-item", + placeholderClass: "grid-stack-placeholder", + placeholderText: "", + handle: ".grid-stack-item-content", + handleClass: null, + cellHeight: 60, + verticalMargin: 20, + auto: !0, + minWidth: 768, + float: !1, + staticGrid: !1, + _class: "grid-stack-instance-" + (1e4 * Math.random()).toFixed(0), + animate: Boolean(this.container.attr("data-gs-animate")) || !1, + alwaysShowResizeHandle: e.alwaysShowResizeHandle || !1, + resizable: b.defaults(e.resizable || {}, { + autoHide: !e.alwaysShowResizeHandle, + handles: "se" + }), + draggable: b.defaults(e.draggable || {}, { + handle: + (e.handleClass ? "." + e.handleClass : e.handle ? e.handle : "") || + ".grid-stack-item-content", + scroll: !1, + appendTo: "body" + }), + disableDrag: e.disableDrag || !1, + disableResize: e.disableResize || !1, + rtl: "auto", + removable: !1, + removeTimeout: 2e3, + verticalMarginUnit: "px", + cellHeightUnit: "px", + disableOneColumnMode: e.disableOneColumnMode || !1, + oneColumnModeClass: + e.oneColumnModeClass || "grid-stack-one-column-mode", + ddPlugin: null + })), + !1 === this.opts.ddPlugin + ? (this.opts.ddPlugin = c) + : null === this.opts.ddPlugin && + (this.opts.ddPlugin = b.first(c.registeredPlugins) || c), + (this.dd = new this.opts.ddPlugin(this)), + "auto" === this.opts.rtl && + (this.opts.rtl = "rtl" === this.container.css("direction")), + this.opts.rtl && this.container.addClass("grid-stack-rtl"), + (this.opts.isNested = k), + (h = "auto" === this.opts.cellHeight), + h + ? j.cellHeight(j.cellWidth(), !0) + : this.cellHeight(this.opts.cellHeight, !0), + this.verticalMargin(this.opts.verticalMargin, !0), + this.container.addClass(this.opts._class), + this._setStaticClass(), + k && this.container.addClass("grid-stack-nested"), + this._initStyles(), + (this.grid = new i( + this.opts.width, + function(a, c) { + c = void 0 === c || c; + var d = 0; + b.each(a, function(a) { + c && null === a._id + ? a.el && a.el.remove() + : (a.el + .attr("data-gs-x", a.x) + .attr("data-gs-y", a.y) + .attr("data-gs-width", a.width) + .attr("data-gs-height", a.height), + (d = Math.max(d, a.y + a.height))); + }), + j._updateStyles(d + 10); + }, + this.opts.float, + this.opts.height + )), + this.opts.auto) + ) { + var l = [], + m = this; + this.container + .children( + "." + + this.opts.itemClass + + ":not(." + + this.opts.placeholderClass + + ")" + ) + .each(function(b, c) { + (c = a(c)), + l.push({ + el: c, + i: + parseInt(c.attr("data-gs-x")) + + parseInt(c.attr("data-gs-y")) * m.opts.width + }); + }), + b + .chain(l) + .sortBy(function(a) { + return a.i; + }) + .each(function(a) { + j._prepareElement(a.el); + }) + .value(); + } + if ( + (this.setAnimation(this.opts.animate), + (this.placeholder = a( + '
' + + this.opts.placeholderText + + "
" + ).hide()), + this._updateContainerHeight(), + (this._updateHeightsOnResize = b.throttle(function() { + j.cellHeight(j.cellWidth(), !1); + }, 100)), + (this.onResizeHandler = function() { + if ( + (h && j._updateHeightsOnResize(), + j._isOneColumnMode() && !j.opts.disableOneColumnMode) + ) { + if (g) return; + j.container.addClass(j.opts.oneColumnModeClass), + (g = !0), + j.grid._sortNodes(), + b.each(j.grid.nodes, function(a) { + j.container.append(a.el), + j.opts.staticGrid || + (j.dd.draggable(a.el, "disable"), + j.dd.resizable(a.el, "disable"), + a.el.trigger("resize")); + }); + } else { + if (!g) return; + if ( + (j.container.removeClass(j.opts.oneColumnModeClass), + (g = !1), + j.opts.staticGrid) + ) + return; + b.each(j.grid.nodes, function(a) { + a.noMove || j.opts.disableDrag || j.dd.draggable(a.el, "enable"), + a.noResize || + j.opts.disableResize || + j.dd.resizable(a.el, "enable"), + a.el.trigger("resize"); + }); + } + }), + a(window).resize(this.onResizeHandler), + this.onResizeHandler(), + !j.opts.staticGrid && "string" == typeof j.opts.removable) + ) { + var n = a(j.opts.removable); + this.dd.isDroppable(n) || + this.dd.droppable(n, { accept: "." + j.opts.itemClass }), + this.dd + .on(n, "dropover", function(b, c) { + var d = a(c.draggable); + d.data("_gridstack_node")._grid === j && j._setupRemovingTimeout(d); + }) + .on(n, "dropout", function(b, c) { + var d = a(c.draggable); + d.data("_gridstack_node")._grid === j && j._clearRemovingTimeout(d); + }); + } + if (!j.opts.staticGrid && j.opts.acceptWidgets) { + var o = null, + p = function(a, b) { + var c = o, + d = c.data("_gridstack_node"), + e = j.getCellFromPixel(b.offset, !0), + f = Math.max(0, e.x), + g = Math.max(0, e.y); + if (d._added) { + if (!j.grid.canMoveNode(d, f, g)) return; + j.grid.moveNode(d, f, g), j._updateContainerHeight(); + } else + (d._added = !0), + (d.el = c), + (d.x = f), + (d.y = g), + j.grid.cleanNodes(), + j.grid.beginUpdate(d), + j.grid.addNode(d), + j.container.append(j.placeholder), + j.placeholder + .attr("data-gs-x", d.x) + .attr("data-gs-y", d.y) + .attr("data-gs-width", d.width) + .attr("data-gs-height", d.height) + .show(), + (d.el = j.placeholder), + (d._beforeDragX = d.x), + (d._beforeDragY = d.y), + j._updateContainerHeight(); + }; + this.dd + .droppable(j.container, { + accept: function(b) { + b = a(b); + var c = b.data("_gridstack_node"); + return ( + (!c || c._grid !== j) && + b.is( + !0 === j.opts.acceptWidgets + ? ".grid-stack-item" + : j.opts.acceptWidgets + ) + ); + } + }) + .on(j.container, "dropover", function(b, c) { + var d = (j.container.offset(), a(c.draggable)), + e = j.cellWidth(), + f = j.cellHeight(), + g = d.data("_gridstack_node"), + h = g ? g.width : Math.ceil(d.outerWidth() / e), + i = g ? g.height : Math.ceil(d.outerHeight() / f); + o = d; + var k = j.grid._prepareNode({ + width: h, + height: i, + _added: !1, + _temporary: !0 + }); + d.data("_gridstack_node", k), + d.data("_gridstack_node_orig", g), + d.on("drag", p); + }) + .on(j.container, "dropout", function(b, c) { + var d = a(c.draggable); + d.unbind("drag", p); + var e = d.data("_gridstack_node"); + (e.el = null), + j.grid.removeNode(e), + j.placeholder.detach(), + j._updateContainerHeight(), + d.data("_gridstack_node", d.data("_gridstack_node_orig")); + }) + .on(j.container, "drop", function(b, c) { + j.placeholder.detach(); + var d = a(c.draggable).data("_gridstack_node"); + d._grid = j; + var e = a(c.draggable).clone(!1); + e.data("_gridstack_node", d); + var f = a(c.draggable).data("_gridstack_node_orig"); + void 0 !== f && f._grid._triggerRemoveEvent(), + a(c.draggable).remove(), + (d.el = e), + j.placeholder.hide(), + e + .attr("data-gs-x", d.x) + .attr("data-gs-y", d.y) + .attr("data-gs-width", d.width) + .attr("data-gs-height", d.height) + .addClass(j.opts.itemClass) + .removeAttr("style") + .enableSelection() + .removeData("draggable") + .removeClass( + "ui-draggable ui-draggable-dragging ui-draggable-disabled" + ) + .unbind("drag", p), + j.container.append(e), + j._prepareElementsByNode(e, d), + j._updateContainerHeight(), + j.grid._addedNodes.push(d), + j._triggerAddEvent(), + j._triggerChangeEvent(), + j.grid.endUpdate(); + }); + } + }; + return ( + (j.prototype._triggerChangeEvent = function(a) { + var b = this.grid.getDirtyNodes(), + c = !1, + d = []; + b && b.length && (d.push(b), (c = !0)), + (c || !0 === a) && this.container.trigger("change", d); + }), + (j.prototype._triggerAddEvent = function() { + this.grid._addedNodes && + this.grid._addedNodes.length > 0 && + (this.container.trigger("added", [ + b.map(this.grid._addedNodes, b.clone) + ]), + (this.grid._addedNodes = [])); + }), + (j.prototype._triggerRemoveEvent = function() { + this.grid._removedNodes && + this.grid._removedNodes.length > 0 && + (this.container.trigger("removed", [ + b.map(this.grid._removedNodes, b.clone) + ]), + (this.grid._removedNodes = [])); + }), + (j.prototype._initStyles = function() { + this._stylesId && g.removeStylesheet(this._stylesId), + (this._stylesId = "gridstack-style-" + (1e5 * Math.random()).toFixed()), + (this._styles = g.createStylesheet(this._stylesId)), + null !== this._styles && (this._styles._max = 0); + }), + (j.prototype._updateStyles = function(a) { + if (null !== this._styles && void 0 !== this._styles) { + var b, + c = "." + this.opts._class + " ." + this.opts.itemClass, + d = this; + if ( + (void 0 === a && (a = this._styles._max), + this._initStyles(), + this._updateContainerHeight(), + this.opts.cellHeight && + !(0 !== this._styles._max && a <= this._styles._max) && + ((b = + this.opts.verticalMargin && + this.opts.cellHeightUnit !== this.opts.verticalMarginUnit + ? function(a, b) { + return a && b + ? "calc(" + + (d.opts.cellHeight * a + d.opts.cellHeightUnit) + + " + " + + (d.opts.verticalMargin * b + + d.opts.verticalMarginUnit) + + ")" + : d.opts.cellHeight * a + + d.opts.verticalMargin * b + + d.opts.cellHeightUnit; + } + : function(a, b) { + return ( + d.opts.cellHeight * a + + d.opts.verticalMargin * b + + d.opts.cellHeightUnit + ); + }), + 0 === this._styles._max && + g.insertCSSRule( + this._styles, + c, + "min-height: " + b(1, 0) + ";", + 0 + ), + a > this._styles._max)) + ) { + for (var e = this._styles._max; e < a; ++e) + g.insertCSSRule( + this._styles, + c + '[data-gs-height="' + (e + 1) + '"]', + "height: " + b(e + 1, e) + ";", + e + ), + g.insertCSSRule( + this._styles, + c + '[data-gs-min-height="' + (e + 1) + '"]', + "min-height: " + b(e + 1, e) + ";", + e + ), + g.insertCSSRule( + this._styles, + c + '[data-gs-max-height="' + (e + 1) + '"]', + "max-height: " + b(e + 1, e) + ";", + e + ), + g.insertCSSRule( + this._styles, + c + '[data-gs-y="' + e + '"]', + "top: " + b(e, e) + ";", + e + ); + this._styles._max = a; + } + } + }), + (j.prototype._updateContainerHeight = function() { + if (!this.grid._updateCounter) { + var a = this.grid.getGridHeight(); + this.container.attr("data-gs-current-height", a), + this.opts.cellHeight && + (this.opts.verticalMargin + ? this.opts.cellHeightUnit === this.opts.verticalMarginUnit + ? this.container.css( + "height", + a * (this.opts.cellHeight + this.opts.verticalMargin) - + this.opts.verticalMargin + + this.opts.cellHeightUnit + ) + : this.container.css( + "height", + "calc(" + + (a * this.opts.cellHeight + this.opts.cellHeightUnit) + + " + " + + (a * (this.opts.verticalMargin - 1) + + this.opts.verticalMarginUnit) + + ")" + ) + : this.container.css( + "height", + a * this.opts.cellHeight + this.opts.cellHeightUnit + )); + } + }), + (j.prototype._isOneColumnMode = function() { + return ( + (window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth) <= this.opts.minWidth + ); + }), + (j.prototype._setupRemovingTimeout = function(b) { + var c = this, + d = a(b).data("_gridstack_node"); + !d._removeTimeout && + c.opts.removable && + (d._removeTimeout = setTimeout(function() { + b.addClass("grid-stack-item-removing"), (d._isAboutToRemove = !0); + }, c.opts.removeTimeout)); + }), + (j.prototype._clearRemovingTimeout = function(b) { + var c = a(b).data("_gridstack_node"); + c._removeTimeout && + (clearTimeout(c._removeTimeout), + (c._removeTimeout = null), + b.removeClass("grid-stack-item-removing"), + (c._isAboutToRemove = !1)); + }), + (j.prototype._prepareElementsByNode = function(b, c) { + var d, + e, + f = this, + g = function(a, g) { + var h, + i, + j = Math.round(g.position.left / d), + k = Math.floor((g.position.top + e / 2) / e); + if ( + ("drag" != a.type && + ((h = Math.round(g.size.width / d)), + (i = Math.round(g.size.height / e))), + "drag" == a.type) + ) + j < 0 || + j >= f.grid.width || + k < 0 || + (!f.grid.float && k > f.grid.getGridHeight()) + ? c._temporaryRemoved || + (!0 === f.opts.removable && f._setupRemovingTimeout(b), + (j = c._beforeDragX), + (k = c._beforeDragY), + f.placeholder.detach(), + f.placeholder.hide(), + f.grid.removeNode(c), + f._updateContainerHeight(), + (c._temporaryRemoved = !0)) + : (f._clearRemovingTimeout(b), + c._temporaryRemoved && + (f.grid.addNode(c), + f.placeholder + .attr("data-gs-x", j) + .attr("data-gs-y", k) + .attr("data-gs-width", h) + .attr("data-gs-height", i) + .show(), + f.container.append(f.placeholder), + (c.el = f.placeholder), + (c._temporaryRemoved = !1))); + else if ("resize" == a.type && j < 0) return; + var l = void 0 !== h ? h : c.lastTriedWidth, + m = void 0 !== i ? i : c.lastTriedHeight; + !f.grid.canMoveNode(c, j, k, h, i) || + (c.lastTriedX === j && + c.lastTriedY === k && + c.lastTriedWidth === l && + c.lastTriedHeight === m) || + ((c.lastTriedX = j), + (c.lastTriedY = k), + (c.lastTriedWidth = h), + (c.lastTriedHeight = i), + f.grid.moveNode(c, j, k, h, i), + f._updateContainerHeight()); + }, + h = function(g, h) { + f.container.append(f.placeholder); + var i = a(this); + f.grid.cleanNodes(), f.grid.beginUpdate(c), (d = f.cellWidth()); + var j = Math.ceil(i.outerHeight() / i.attr("data-gs-height")); + (e = + f.container.height() / + parseInt(f.container.attr("data-gs-current-height"))), + f.placeholder + .attr("data-gs-x", i.attr("data-gs-x")) + .attr("data-gs-y", i.attr("data-gs-y")) + .attr("data-gs-width", i.attr("data-gs-width")) + .attr("data-gs-height", i.attr("data-gs-height")) + .show(), + (c.el = f.placeholder), + (c._beforeDragX = c.x), + (c._beforeDragY = c.y), + f.dd.resizable(b, "option", "minWidth", d * (c.minWidth || 1)), + f.dd.resizable(b, "option", "minHeight", j * (c.minHeight || 1)), + "resizestart" == g.type && + i.find(".grid-stack-item").trigger("resizestart"); + }, + i = function(d, e) { + var g = a(this); + if (g.data("_gridstack_node")) { + var h = !1; + if ( + (f.placeholder.detach(), + (c.el = g), + f.placeholder.hide(), + c._isAboutToRemove) + ) { + h = !0; + b.data("_gridstack_node")._grid._triggerRemoveEvent(), + b.removeData("_gridstack_node"), + b.remove(); + } else + f._clearRemovingTimeout(b), + c._temporaryRemoved + ? (g + .attr("data-gs-x", c._beforeDragX) + .attr("data-gs-y", c._beforeDragY) + .attr("data-gs-width", c.width) + .attr("data-gs-height", c.height) + .removeAttr("style"), + (c.x = c._beforeDragX), + (c.y = c._beforeDragY), + f.grid.addNode(c)) + : g + .attr("data-gs-x", c.x) + .attr("data-gs-y", c.y) + .attr("data-gs-width", c.width) + .attr("data-gs-height", c.height) + .removeAttr("style"); + f._updateContainerHeight(), + f._triggerChangeEvent(h), + f.grid.endUpdate(); + var i = g.find(".grid-stack"); + i.length && + "resizestop" == d.type && + (i.each(function(b, c) { + a(c) + .data("gridstack") + .onResizeHandler(); + }), + g.find(".grid-stack-item").trigger("resizestop"), + g.find(".grid-stack-item").trigger("gsresizestop")), + "resizestop" == d.type && f.container.trigger("gsresizestop", g); + } + }; + this.dd + .draggable(b, { start: h, stop: i, drag: g }) + .resizable(b, { start: h, stop: i, resize: g }), + (c.noMove || + (this._isOneColumnMode() && !f.opts.disableOneColumnMode) || + this.opts.disableDrag) && + this.dd.draggable(b, "disable"), + (c.noResize || + (this._isOneColumnMode() && !f.opts.disableOneColumnMode) || + this.opts.disableResize) && + this.dd.resizable(b, "disable"), + b.attr("data-gs-locked", c.locked ? "yes" : null); + }), + (j.prototype._prepareElement = function(b, c) { + c = void 0 !== c && c; + var d = this; + (b = a(b)), b.addClass(this.opts.itemClass); + var e = d.grid.addNode( + { + x: b.attr("data-gs-x"), + y: b.attr("data-gs-y"), + width: b.attr("data-gs-width"), + height: b.attr("data-gs-height"), + maxWidth: b.attr("data-gs-max-width"), + minWidth: b.attr("data-gs-min-width"), + maxHeight: b.attr("data-gs-max-height"), + minHeight: b.attr("data-gs-min-height"), + autoPosition: g.toBool(b.attr("data-gs-auto-position")), + noResize: g.toBool(b.attr("data-gs-no-resize")), + noMove: g.toBool(b.attr("data-gs-no-move")), + locked: g.toBool(b.attr("data-gs-locked")), + el: b, + id: b.attr("data-gs-id"), + _grid: d + }, + c + ); + b.data("_gridstack_node", e), this._prepareElementsByNode(b, e); + }), + (j.prototype.setAnimation = function(a) { + a + ? this.container.addClass("grid-stack-animate") + : this.container.removeClass("grid-stack-animate"); + }), + (j.prototype.addWidget = function(b, c, d, e, f, g, h, i, j, k, l) { + return ( + (b = a(b)), + void 0 !== c && b.attr("data-gs-x", c), + void 0 !== d && b.attr("data-gs-y", d), + void 0 !== e && b.attr("data-gs-width", e), + void 0 !== f && b.attr("data-gs-height", f), + void 0 !== g && b.attr("data-gs-auto-position", g ? "yes" : null), + void 0 !== h && b.attr("data-gs-min-width", h), + void 0 !== i && b.attr("data-gs-max-width", i), + void 0 !== j && b.attr("data-gs-min-height", j), + void 0 !== k && b.attr("data-gs-max-height", k), + void 0 !== l && b.attr("data-gs-id", l), + this.container.append(b), + this._prepareElement(b, !0), + this._triggerAddEvent(), + this._updateContainerHeight(), + this._triggerChangeEvent(!0), + b + ); + }), + (j.prototype.makeWidget = function(b) { + return ( + (b = a(b)), + this._prepareElement(b, !0), + this._triggerAddEvent(), + this._updateContainerHeight(), + this._triggerChangeEvent(!0), + b + ); + }), + (j.prototype.willItFit = function(a, b, c, d, e) { + var f = { x: a, y: b, width: c, height: d, autoPosition: e }; + return this.grid.canBePlacedWithRespectToHeight(f); + }), + (j.prototype.removeWidget = function(b, c) { + (c = void 0 === c || c), (b = a(b)); + var d = b.data("_gridstack_node"); + d || (d = this.grid.getNodeDataByDOMEl(b)), + this.grid.removeNode(d, c), + b.removeData("_gridstack_node"), + this._updateContainerHeight(), + c && b.remove(), + this._triggerChangeEvent(!0), + this._triggerRemoveEvent(); + }), + (j.prototype.removeAll = function(a) { + b.each( + this.grid.nodes, + b.bind(function(b) { + this.removeWidget(b.el, a); + }, this) + ), + (this.grid.nodes = []), + this._updateContainerHeight(); + }), + (j.prototype.destroy = function(b) { + a(window).off("resize", this.onResizeHandler), + this.disable(), + void 0 === b || b + ? this.container.remove() + : (this.removeAll(!1), this.container.removeData("gridstack")), + g.removeStylesheet(this._stylesId), + this.grid && (this.grid = null); + }), + (j.prototype.resizable = function(b, c) { + var d = this; + return ( + (b = a(b)), + b.each(function(b, e) { + e = a(e); + var f = e.data("_gridstack_node"); + void 0 !== f && + null !== f && + ((f.noResize = !c), + f.noResize || (d._isOneColumnMode() && !d.opts.disableOneColumnMode) + ? d.dd.resizable(e, "disable") + : d.dd.resizable(e, "enable")); + }), + this + ); + }), + (j.prototype.movable = function(b, c) { + var d = this; + return ( + (b = a(b)), + b.each(function(b, e) { + e = a(e); + var f = e.data("_gridstack_node"); + void 0 !== f && + null !== f && + ((f.noMove = !c), + f.noMove || (d._isOneColumnMode() && !d.opts.disableOneColumnMode) + ? (d.dd.draggable(e, "disable"), + e.removeClass("ui-draggable-handle")) + : (d.dd.draggable(e, "enable"), + e.addClass("ui-draggable-handle"))); + }), + this + ); + }), + (j.prototype.enableMove = function(a, b) { + this.movable(this.container.children("." + this.opts.itemClass), a), + b && (this.opts.disableDrag = !a); + }), + (j.prototype.enableResize = function(a, b) { + this.resizable(this.container.children("." + this.opts.itemClass), a), + b && (this.opts.disableResize = !a); + }), + (j.prototype.disable = function() { + this.movable(this.container.children("." + this.opts.itemClass), !1), + this.resizable(this.container.children("." + this.opts.itemClass), !1), + this.container.trigger("disable"); + }), + (j.prototype.enable = function() { + this.movable(this.container.children("." + this.opts.itemClass), !0), + this.resizable(this.container.children("." + this.opts.itemClass), !0), + this.container.trigger("enable"); + }), + (j.prototype.locked = function(b, c) { + return ( + (b = a(b)), + b.each(function(b, d) { + d = a(d); + var e = d.data("_gridstack_node"); + void 0 !== e && + null !== e && + ((e.locked = c || !1), + d.attr("data-gs-locked", e.locked ? "yes" : null)); + }), + this + ); + }), + (j.prototype.maxHeight = function(b, c) { + return ( + (b = a(b)), + b.each(function(b, d) { + d = a(d); + var e = d.data("_gridstack_node"); + void 0 !== e && + null !== e && + (isNaN(c) || + ((e.maxHeight = c || !1), d.attr("data-gs-max-height", c))); + }), + this + ); + }), + (j.prototype.minHeight = function(b, c) { + return ( + (b = a(b)), + b.each(function(b, d) { + d = a(d); + var e = d.data("_gridstack_node"); + void 0 !== e && + null !== e && + (isNaN(c) || + ((e.minHeight = c || !1), d.attr("data-gs-min-height", c))); + }), + this + ); + }), + (j.prototype.maxWidth = function(b, c) { + return ( + (b = a(b)), + b.each(function(b, d) { + d = a(d); + var e = d.data("_gridstack_node"); + void 0 !== e && + null !== e && + (isNaN(c) || + ((e.maxWidth = c || !1), d.attr("data-gs-max-width", c))); + }), + this + ); + }), + (j.prototype.minWidth = function(b, c) { + return ( + (b = a(b)), + b.each(function(b, d) { + d = a(d); + var e = d.data("_gridstack_node"); + void 0 !== e && + null !== e && + (isNaN(c) || + ((e.minWidth = c || !1), d.attr("data-gs-min-width", c))); + }), + this + ); + }), + (j.prototype._updateElement = function(b, c) { + b = a(b).first(); + var d = b.data("_gridstack_node"); + if (void 0 !== d && null !== d) { + var e = this; + e.grid.cleanNodes(), + e.grid.beginUpdate(d), + c.call(this, b, d), + e._updateContainerHeight(), + e._triggerChangeEvent(), + e.grid.endUpdate(); + } + }), + (j.prototype.resize = function(a, b, c) { + this._updateElement(a, function(a, d) { + (b = null !== b && void 0 !== b ? b : d.width), + (c = null !== c && void 0 !== c ? c : d.height), + this.grid.moveNode(d, d.x, d.y, b, c); + }); + }), + (j.prototype.move = function(a, b, c) { + this._updateElement(a, function(a, d) { + (b = null !== b && void 0 !== b ? b : d.x), + (c = null !== c && void 0 !== c ? c : d.y), + this.grid.moveNode(d, b, c, d.width, d.height); + }); + }), + (j.prototype.update = function(a, b, c, d, e) { + this._updateElement(a, function(a, f) { + (b = null !== b && void 0 !== b ? b : f.x), + (c = null !== c && void 0 !== c ? c : f.y), + (d = null !== d && void 0 !== d ? d : f.width), + (e = null !== e && void 0 !== e ? e : f.height), + this.grid.moveNode(f, b, c, d, e); + }); + }), + (j.prototype.verticalMargin = function(a, b) { + if (void 0 === a) return this.opts.verticalMargin; + var c = g.parseHeight(a); + (this.opts.verticalMarginUnit === c.unit && + this.opts.height === c.height) || + ((this.opts.verticalMarginUnit = c.unit), + (this.opts.verticalMargin = c.height), + b || this._updateStyles()); + }), + (j.prototype.cellHeight = function(a, b) { + if (void 0 === a) { + if (this.opts.cellHeight) return this.opts.cellHeight; + var c = this.container.children("." + this.opts.itemClass).first(); + return Math.ceil(c.outerHeight() / c.attr("data-gs-height")); + } + var d = g.parseHeight(a); + (this.opts.cellHeightUnit === d.heightUnit && + this.opts.height === d.height) || + ((this.opts.cellHeightUnit = d.unit), + (this.opts.cellHeight = d.height), + b || this._updateStyles()); + }), + (j.prototype.cellWidth = function() { + return Math.round(this.container.outerWidth() / this.opts.width); + }), + (j.prototype.getCellFromPixel = function(a, b) { + var c = + void 0 !== b && b + ? this.container.offset() + : this.container.position(), + d = a.left - c.left, + e = a.top - c.top, + f = Math.floor(this.container.width() / this.opts.width), + g = Math.floor( + this.container.height() / + parseInt(this.container.attr("data-gs-current-height")) + ); + return { x: Math.floor(d / f), y: Math.floor(e / g) }; + }), + (j.prototype.batchUpdate = function() { + this.grid.batchUpdate(); + }), + (j.prototype.commit = function() { + this.grid.commit(), this._updateContainerHeight(); + }), + (j.prototype.isAreaEmpty = function(a, b, c, d) { + return this.grid.isAreaEmpty(a, b, c, d); + }), + (j.prototype.setStatic = function(a) { + (this.opts.staticGrid = !0 === a), + this.enableMove(!a), + this.enableResize(!a), + this._setStaticClass(); + }), + (j.prototype._setStaticClass = function() { + !0 === this.opts.staticGrid + ? this.container.addClass("grid-stack-static") + : this.container.removeClass("grid-stack-static"); + }), + (j.prototype._updateNodeWidths = function(a, b) { + this.grid._sortNodes(), this.grid.batchUpdate(); + for (var c = {}, d = 0; d < this.grid.nodes.length; d++) + (c = this.grid.nodes[d]), + this.update( + c.el, + Math.round((c.x * b) / a), + void 0, + Math.round((c.width * b) / a), + void 0 + ); + this.grid.commit(); + }), + (j.prototype.setGridWidth = function(a, b) { + this.container.removeClass("grid-stack-" + this.opts.width), + !0 !== b && this._updateNodeWidths(this.opts.width, a), + (this.opts.width = a), + (this.grid.width = a), + this.container.addClass("grid-stack-" + a); + }), + (i.prototype.batch_update = e(i.prototype.batchUpdate)), + (i.prototype._fix_collisions = e( + i.prototype._fixCollisions, + "_fix_collisions", + "_fixCollisions" + )), + (i.prototype.is_area_empty = e( + i.prototype.isAreaEmpty, + "is_area_empty", + "isAreaEmpty" + )), + (i.prototype._sort_nodes = e( + i.prototype._sortNodes, + "_sort_nodes", + "_sortNodes" + )), + (i.prototype._pack_nodes = e( + i.prototype._packNodes, + "_pack_nodes", + "_packNodes" + )), + (i.prototype._prepare_node = e( + i.prototype._prepareNode, + "_prepare_node", + "_prepareNode" + )), + (i.prototype.clean_nodes = e( + i.prototype.cleanNodes, + "clean_nodes", + "cleanNodes" + )), + (i.prototype.get_dirty_nodes = e( + i.prototype.getDirtyNodes, + "get_dirty_nodes", + "getDirtyNodes" + )), + (i.prototype.add_node = e(i.prototype.addNode, "add_node", "addNode, ")), + (i.prototype.remove_node = e( + i.prototype.removeNode, + "remove_node", + "removeNode" + )), + (i.prototype.can_move_node = e( + i.prototype.canMoveNode, + "can_move_node", + "canMoveNode" + )), + (i.prototype.move_node = e(i.prototype.moveNode, "move_node", "moveNode")), + (i.prototype.get_grid_height = e( + i.prototype.getGridHeight, + "get_grid_height", + "getGridHeight" + )), + (i.prototype.begin_update = e( + i.prototype.beginUpdate, + "begin_update", + "beginUpdate" + )), + (i.prototype.end_update = e( + i.prototype.endUpdate, + "end_update", + "endUpdate" + )), + (i.prototype.can_be_placed_with_respect_to_height = e( + i.prototype.canBePlacedWithRespectToHeight, + "can_be_placed_with_respect_to_height", + "canBePlacedWithRespectToHeight" + )), + (j.prototype._trigger_change_event = e( + j.prototype._triggerChangeEvent, + "_trigger_change_event", + "_triggerChangeEvent" + )), + (j.prototype._init_styles = e( + j.prototype._initStyles, + "_init_styles", + "_initStyles" + )), + (j.prototype._update_styles = e( + j.prototype._updateStyles, + "_update_styles", + "_updateStyles" + )), + (j.prototype._update_container_height = e( + j.prototype._updateContainerHeight, + "_update_container_height", + "_updateContainerHeight" + )), + (j.prototype._is_one_column_mode = e( + j.prototype._isOneColumnMode, + "_is_one_column_mode", + "_isOneColumnMode" + )), + (j.prototype._prepare_element = e( + j.prototype._prepareElement, + "_prepare_element", + "_prepareElement" + )), + (j.prototype.set_animation = e( + j.prototype.setAnimation, + "set_animation", + "setAnimation" + )), + (j.prototype.add_widget = e( + j.prototype.addWidget, + "add_widget", + "addWidget" + )), + (j.prototype.make_widget = e( + j.prototype.makeWidget, + "make_widget", + "makeWidget" + )), + (j.prototype.will_it_fit = e( + j.prototype.willItFit, + "will_it_fit", + "willItFit" + )), + (j.prototype.remove_widget = e( + j.prototype.removeWidget, + "remove_widget", + "removeWidget" + )), + (j.prototype.remove_all = e( + j.prototype.removeAll, + "remove_all", + "removeAll" + )), + (j.prototype.min_height = e( + j.prototype.minHeight, + "min_height", + "minHeight" + )), + (j.prototype.min_width = e(j.prototype.minWidth, "min_width", "minWidth")), + (j.prototype._update_element = e( + j.prototype._updateElement, + "_update_element", + "_updateElement" + )), + (j.prototype.cell_height = e( + j.prototype.cellHeight, + "cell_height", + "cellHeight" + )), + (j.prototype.cell_width = e( + j.prototype.cellWidth, + "cell_width", + "cellWidth" + )), + (j.prototype.get_cell_from_pixel = e( + j.prototype.getCellFromPixel, + "get_cell_from_pixel", + "getCellFromPixel" + )), + (j.prototype.batch_update = e( + j.prototype.batchUpdate, + "batch_update", + "batchUpdate" + )), + (j.prototype.is_area_empty = e( + j.prototype.isAreaEmpty, + "is_area_empty", + "isAreaEmpty" + )), + (j.prototype.set_static = e( + j.prototype.setStatic, + "set_static", + "setStatic" + )), + (j.prototype._set_static_class = e( + j.prototype._setStaticClass, + "_set_static_class", + "_setStaticClass" + )), + (d.GridStackUI = j), + (d.GridStackUI.Utils = g), + (d.GridStackUI.Engine = i), + (d.GridStackUI.GridStackDragDropPlugin = c), + (a.fn.gridstack = function(b) { + return this.each(function() { + var c = a(this); + c.data("gridstack") || c.data("gridstack", new j(this, b)); + }); + }), + d.GridStackUI + ); +}) +/** + * gridstack.js 0.3.0 + * http://troolee.github.io/gridstack.js/ + * (c) 2014-2016 Pavel Reznikov, Dylan Weiss + * gridstack.js may be freely distributed under the MIT license. + * @preserve + */, + (function(a) { + if ("function" == typeof define && define.amd) + define([ + "jquery", + "lodash", + "gridstack", + "jquery-ui/data", + "jquery-ui/disable-selection", + "jquery-ui/focusable", + "jquery-ui/form", + "jquery-ui/ie", + "jquery-ui/keycode", + "jquery-ui/labels", + "jquery-ui/jquery-1-7", + "jquery-ui/plugin", + "jquery-ui/safe-active-element", + "jquery-ui/safe-blur", + "jquery-ui/scroll-parent", + "jquery-ui/tabbable", + "jquery-ui/unique-id", + "jquery-ui/version", + "jquery-ui/widget", + "jquery-ui/widgets/mouse", + "jquery-ui/widgets/draggable", + "jquery-ui/widgets/droppable", + "jquery-ui/widgets/resizable" + ], a); + else if ("undefined" != typeof exports) { + try { + jQuery = require("jquery"); + } catch (a) {} + try { + _ = require("lodash"); + } catch (a) {} + try { + GridStackUI = require("gridstack"); + } catch (a) {} + a(jQuery, _, GridStackUI); + } else a(jQuery, _, GridStackUI); + })(function(a, b, c) { + function d(a) { + c.GridStackDragDropPlugin.call(this, a); + } + window; + return ( + c.GridStackDragDropPlugin.registerPlugin(d), + (d.prototype = Object.create(c.GridStackDragDropPlugin.prototype)), + (d.prototype.constructor = d), + (d.prototype.resizable = function(c, d) { + if (((c = a(c)), "disable" === d || "enable" === d)) c.resizable(d); + else if ("option" === d) { + var e = arguments[2], + f = arguments[3]; + c.resizable(d, e, f); + } else + c.resizable( + b.extend({}, this.grid.opts.resizable, { + start: d.start || function() {}, + stop: d.stop || function() {}, + resize: d.resize || function() {} + }) + ); + return this; + }), + (d.prototype.draggable = function(c, d) { + return ( + (c = a(c)), + "disable" === d || "enable" === d + ? c.draggable(d) + : c.draggable( + b.extend({}, this.grid.opts.draggable, { + containment: this.grid.opts.isNested + ? this.grid.container.parent() + : null, + start: d.start || function() {}, + stop: d.stop || function() {}, + drag: d.drag || function() {} + }) + ), + this + ); + }), + (d.prototype.droppable = function(b, c) { + return ( + (b = a(b)), + "disable" === c || "enable" === c + ? b.droppable(c) + : b.droppable({ accept: c.accept }), + this + ); + }), + (d.prototype.isDroppable = function(b, c) { + return (b = a(b)), Boolean(b.data("droppable")); + }), + (d.prototype.on = function(b, c, d) { + return a(b).on(c, d), this; + }), + d + ); + }); +//# sourceMappingURL=gridstack.min.map diff --git a/pandora_console/include/javascript/gridstack.jQueryUI.js b/pandora_console/include/javascript/gridstack.jQueryUI.js new file mode 100644 index 0000000000..de036b5bb3 --- /dev/null +++ b/pandora_console/include/javascript/gridstack.jQueryUI.js @@ -0,0 +1,135 @@ +/** + * gridstack.js 0.3.0 + * http://troolee.github.io/gridstack.js/ + * (c) 2014-2016 Pavel Reznikov, Dylan Weiss + * gridstack.js may be freely distributed under the MIT license. + * @preserve + */ +(function(factory) { + if (typeof define === "function" && define.amd) { + define([ + "jquery", + "lodash", + "gridstack", + "jquery-ui/data", + "jquery-ui/disable-selection", + "jquery-ui/focusable", + "jquery-ui/form", + "jquery-ui/ie", + "jquery-ui/keycode", + "jquery-ui/labels", + "jquery-ui/jquery-1-7", + "jquery-ui/plugin", + "jquery-ui/safe-active-element", + "jquery-ui/safe-blur", + "jquery-ui/scroll-parent", + "jquery-ui/tabbable", + "jquery-ui/unique-id", + "jquery-ui/version", + "jquery-ui/widget", + "jquery-ui/widgets/mouse", + "jquery-ui/widgets/draggable", + "jquery-ui/widgets/droppable", + "jquery-ui/widgets/resizable" + ], factory); + } else if (typeof exports !== "undefined") { + try { + jQuery = require("jquery"); + } catch (e) {} + try { + _ = require("lodash"); + } catch (e) {} + try { + GridStackUI = require("gridstack"); + } catch (e) {} + factory(jQuery, _, GridStackUI); + } else { + factory(jQuery, _, GridStackUI); + } +})(function($, _, GridStackUI) { + var scope = window; + + /** + * @class JQueryUIGridStackDragDropPlugin + * jQuery UI implementation of drag'n'drop gridstack plugin. + */ + function JQueryUIGridStackDragDropPlugin(grid) { + GridStackUI.GridStackDragDropPlugin.call(this, grid); + } + + GridStackUI.GridStackDragDropPlugin.registerPlugin( + JQueryUIGridStackDragDropPlugin + ); + + JQueryUIGridStackDragDropPlugin.prototype = Object.create( + GridStackUI.GridStackDragDropPlugin.prototype + ); + JQueryUIGridStackDragDropPlugin.prototype.constructor = JQueryUIGridStackDragDropPlugin; + + JQueryUIGridStackDragDropPlugin.prototype.resizable = function(el, opts) { + el = $(el); + if (opts === "disable" || opts === "enable") { + el.resizable(opts); + } else if (opts === "option") { + var key = arguments[2]; + var value = arguments[3]; + el.resizable(opts, key, value); + } else { + el.resizable( + _.extend({}, this.grid.opts.resizable, { + start: opts.start || function() {}, + stop: opts.stop || function() {}, + resize: opts.resize || function() {} + }) + ); + } + return this; + }; + + JQueryUIGridStackDragDropPlugin.prototype.draggable = function(el, opts) { + el = $(el); + if (opts === "disable" || opts === "enable") { + el.draggable(opts); + } else { + el.draggable( + _.extend({}, this.grid.opts.draggable, { + containment: this.grid.opts.isNested + ? this.grid.container.parent() + : null, + start: opts.start || function() {}, + stop: opts.stop || function() {}, + drag: opts.drag || function() {} + }) + ); + } + return this; + }; + + JQueryUIGridStackDragDropPlugin.prototype.droppable = function(el, opts) { + el = $(el); + if (opts === "disable" || opts === "enable") { + el.droppable(opts); + } else { + el.droppable({ + accept: opts.accept + }); + } + return this; + }; + + JQueryUIGridStackDragDropPlugin.prototype.isDroppable = function(el, opts) { + el = $(el); + return Boolean(el.data("droppable")); + }; + + JQueryUIGridStackDragDropPlugin.prototype.on = function( + el, + eventName, + callback + ) { + $(el).on(eventName, callback); + return this; + }; + + return JQueryUIGridStackDragDropPlugin; +}); diff --git a/pandora_console/include/javascript/gridstack.js b/pandora_console/include/javascript/gridstack.js new file mode 100644 index 0000000000..22ee8ad18f --- /dev/null +++ b/pandora_console/include/javascript/gridstack.js @@ -0,0 +1,2235 @@ +/** + * gridstack.js 0.3.0 + * http://troolee.github.io/gridstack.js/ + * (c) 2014-2016 Pavel Reznikov, Dylan Weiss + * gridstack.js may be freely distributed under the MIT license. + * @preserve + */ +(function(factory) { + if (typeof define === "function" && define.amd) { + define(["jquery", "lodash"], factory); + } else if (typeof exports !== "undefined") { + try { + jQuery = require("jquery"); + } catch (e) {} + try { + _ = require("lodash"); + } catch (e) {} + factory(jQuery, _); + } else { + factory(jQuery, _); + } +})(function($, _) { + var scope = window; + + var obsolete = function(f, oldName, newName) { + var wrapper = function() { + console.warn( + "gridstack.js: Function `" + + oldName + + "` is deprecated as of v0.2.5 and has been replaced " + + "with `" + + newName + + "`. It will be **completely** removed in v1.0." + ); + return f.apply(this, arguments); + }; + wrapper.prototype = f.prototype; + + return wrapper; + }; + + var obsoleteOpts = function(oldName, newName) { + console.warn( + "gridstack.js: Option `" + + oldName + + "` is deprecated as of v0.2.5 and has been replaced with `" + + newName + + "`. It will be **completely** removed in v1.0." + ); + }; + + var Utils = { + isIntercepted: function(a, b) { + return !( + a.x + a.width <= b.x || + b.x + b.width <= a.x || + a.y + a.height <= b.y || + b.y + b.height <= a.y + ); + }, + + sort: function(nodes, dir, width) { + width = + width || + _.chain(nodes) + .map(function(node) { + return node.x + node.width; + }) + .max() + .value(); + dir = dir != -1 ? 1 : -1; + return _.sortBy(nodes, function(n) { + return dir * (n.x + n.y * width); + }); + }, + + createStylesheet: function(id) { + var style = document.createElement("style"); + style.setAttribute("type", "text/css"); + style.setAttribute("data-gs-style-id", id); + if (style.styleSheet) { + style.styleSheet.cssText = ""; + } else { + style.appendChild(document.createTextNode("")); + } + document.getElementsByTagName("head")[0].appendChild(style); + return style.sheet; + }, + + removeStylesheet: function(id) { + $("STYLE[data-gs-style-id=" + id + "]").remove(); + }, + + insertCSSRule: function(sheet, selector, rules, index) { + if (typeof sheet.insertRule === "function") { + sheet.insertRule(selector + "{" + rules + "}", index); + } else if (typeof sheet.addRule === "function") { + sheet.addRule(selector, rules, index); + } + }, + + toBool: function(v) { + if (typeof v == "boolean") { + return v; + } + if (typeof v == "string") { + v = v.toLowerCase(); + return !(v === "" || v == "no" || v == "false" || v == "0"); + } + return Boolean(v); + }, + + _collisionNodeCheck: function(n) { + return n != this.node && Utils.isIntercepted(n, this.nn); + }, + + _didCollide: function(bn) { + return Utils.isIntercepted( + { + x: this.n.x, + y: this.newY, + width: this.n.width, + height: this.n.height + }, + bn + ); + }, + + _isAddNodeIntercepted: function(n) { + return Utils.isIntercepted( + { + x: this.x, + y: this.y, + width: this.node.width, + height: this.node.height + }, + n + ); + }, + + parseHeight: function(val) { + var height = val; + var heightUnit = "px"; + if (height && _.isString(height)) { + var match = height.match( + /^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw)?$/ + ); + if (!match) { + throw new Error("Invalid height"); + } + heightUnit = match[2] || "px"; + height = parseFloat(match[1]); + } + return { height: height, unit: heightUnit }; + } + }; + + // jscs:disable requireCamelCaseOrUpperCaseIdentifiers + Utils.is_intercepted = obsolete( + Utils.isIntercepted, + "is_intercepted", + "isIntercepted" + ); + + Utils.create_stylesheet = obsolete( + Utils.createStylesheet, + "create_stylesheet", + "createStylesheet" + ); + + Utils.remove_stylesheet = obsolete( + Utils.removeStylesheet, + "remove_stylesheet", + "removeStylesheet" + ); + + Utils.insert_css_rule = obsolete( + Utils.insertCSSRule, + "insert_css_rule", + "insertCSSRule" + ); + // jscs:enable requireCamelCaseOrUpperCaseIdentifiers + + /** + * @class GridStackDragDropPlugin + * Base class for drag'n'drop plugin. + */ + function GridStackDragDropPlugin(grid) { + this.grid = grid; + } + + GridStackDragDropPlugin.registeredPlugins = []; + + GridStackDragDropPlugin.registerPlugin = function(pluginClass) { + GridStackDragDropPlugin.registeredPlugins.push(pluginClass); + }; + + GridStackDragDropPlugin.prototype.resizable = function(el, opts) { + return this; + }; + + GridStackDragDropPlugin.prototype.draggable = function(el, opts) { + return this; + }; + + GridStackDragDropPlugin.prototype.droppable = function(el, opts) { + return this; + }; + + GridStackDragDropPlugin.prototype.isDroppable = function(el) { + return false; + }; + + GridStackDragDropPlugin.prototype.on = function(el, eventName, callback) { + return this; + }; + + var idSeq = 0; + + var GridStackEngine = function(width, onchange, floatMode, height, items) { + this.width = width; + this.float = floatMode || false; + this.height = height || 0; + + this.nodes = items || []; + this.onchange = onchange || function() {}; + + this._updateCounter = 0; + this._float = this.float; + + this._addedNodes = []; + this._removedNodes = []; + }; + + GridStackEngine.prototype.batchUpdate = function() { + this._updateCounter = 1; + this.float = true; + }; + + GridStackEngine.prototype.commit = function() { + if (this._updateCounter !== 0) { + this._updateCounter = 0; + this.float = this._float; + this._packNodes(); + this._notify(); + } + }; + + // For Meteor support: https://github.com/troolee/gridstack.js/pull/272 + GridStackEngine.prototype.getNodeDataByDOMEl = function(el) { + return _.find(this.nodes, function(n) { + return el.get(0) === n.el.get(0); + }); + }; + + GridStackEngine.prototype._fixCollisions = function(node) { + var self = this; + this._sortNodes(-1); + + var nn = node; + var hasLocked = Boolean( + _.find(this.nodes, function(n) { + return n.locked; + }) + ); + if (!this.float && !hasLocked) { + nn = { x: 0, y: node.y, width: this.width, height: node.height }; + } + while (true) { + var collisionNode = _.find( + this.nodes, + _.bind(Utils._collisionNodeCheck, { node: node, nn: nn }) + ); + if (typeof collisionNode == "undefined") { + return; + } + this.moveNode( + collisionNode, + collisionNode.x, + node.y + node.height, + collisionNode.width, + collisionNode.height, + true + ); + } + }; + + GridStackEngine.prototype.isAreaEmpty = function(x, y, width, height) { + var nn = { x: x || 0, y: y || 0, width: width || 1, height: height || 1 }; + var collisionNode = _.find( + this.nodes, + _.bind(function(n) { + return Utils.isIntercepted(n, nn); + }, this) + ); + return collisionNode === null || typeof collisionNode === "undefined"; + }; + + GridStackEngine.prototype._sortNodes = function(dir) { + this.nodes = Utils.sort(this.nodes, dir, this.width); + }; + + GridStackEngine.prototype._packNodes = function() { + this._sortNodes(); + + if (this.float) { + _.each( + this.nodes, + _.bind(function(n, i) { + if ( + n._updating || + typeof n._origY == "undefined" || + n.y == n._origY + ) { + return; + } + + var newY = n.y; + while (newY >= n._origY) { + var collisionNode = _.chain(this.nodes) + .find(_.bind(Utils._didCollide, { n: n, newY: newY })) + .value(); + + if (!collisionNode) { + n._dirty = true; + n.y = newY; + } + --newY; + } + }, this) + ); + } else { + _.each( + this.nodes, + _.bind(function(n, i) { + if (n.locked) { + return; + } + while (n.y > 0) { + var newY = n.y - 1; + var canBeMoved = i === 0; + + if (i > 0) { + var collisionNode = _.chain(this.nodes) + .take(i) + .find(_.bind(Utils._didCollide, { n: n, newY: newY })) + .value(); + canBeMoved = typeof collisionNode == "undefined"; + } + + if (!canBeMoved) { + break; + } + n._dirty = n.y != newY; + n.y = newY; + } + }, this) + ); + } + }; + + GridStackEngine.prototype._prepareNode = function(node, resizing) { + node = _.defaults(node || {}, { width: 1, height: 1, x: 0, y: 0 }); + + node.x = parseInt("" + node.x); + node.y = parseInt("" + node.y); + node.width = parseInt("" + node.width); + node.height = parseInt("" + node.height); + node.autoPosition = node.autoPosition || false; + node.noResize = node.noResize || false; + node.noMove = node.noMove || false; + + if (node.width > this.width) { + node.width = this.width; + } else if (node.width < 1) { + node.width = 1; + } + + if (node.height < 1) { + node.height = 1; + } + + if (node.x < 0) { + node.x = 0; + } + + if (node.x + node.width > this.width) { + if (resizing) { + node.width = this.width - node.x; + } else { + node.x = this.width - node.width; + } + } + + if (node.y < 0) { + node.y = 0; + } + + return node; + }; + + GridStackEngine.prototype._notify = function() { + var args = Array.prototype.slice.call(arguments, 0); + args[0] = typeof args[0] === "undefined" ? [] : [args[0]]; + args[1] = typeof args[1] === "undefined" ? true : args[1]; + if (this._updateCounter) { + return; + } + var deletedNodes = args[0].concat(this.getDirtyNodes()); + this.onchange(deletedNodes, args[1]); + }; + + GridStackEngine.prototype.cleanNodes = function() { + if (this._updateCounter) { + return; + } + _.each(this.nodes, function(n) { + n._dirty = false; + }); + }; + + GridStackEngine.prototype.getDirtyNodes = function() { + return _.filter(this.nodes, function(n) { + return n._dirty; + }); + }; + + GridStackEngine.prototype.addNode = function(node, triggerAddEvent) { + node = this._prepareNode(node); + + if (typeof node.maxWidth != "undefined") { + node.width = Math.min(node.width, node.maxWidth); + } + if (typeof node.maxHeight != "undefined") { + node.height = Math.min(node.height, node.maxHeight); + } + if (typeof node.minWidth != "undefined") { + node.width = Math.max(node.width, node.minWidth); + } + if (typeof node.minHeight != "undefined") { + node.height = Math.max(node.height, node.minHeight); + } + + node._id = ++idSeq; + node._dirty = true; + + if (node.autoPosition) { + this._sortNodes(); + + for (var i = 0; ; ++i) { + var x = i % this.width; + var y = Math.floor(i / this.width); + if (x + node.width > this.width) { + continue; + } + if ( + !_.find( + this.nodes, + _.bind(Utils._isAddNodeIntercepted, { x: x, y: y, node: node }) + ) + ) { + node.x = x; + node.y = y; + break; + } + } + } + + this.nodes.push(node); + if (typeof triggerAddEvent != "undefined" && triggerAddEvent) { + this._addedNodes.push(_.clone(node)); + } + + this._fixCollisions(node); + this._packNodes(); + this._notify(); + return node; + }; + + GridStackEngine.prototype.removeNode = function(node, detachNode) { + detachNode = typeof detachNode === "undefined" ? true : detachNode; + this._removedNodes.push(_.clone(node)); + node._id = null; + this.nodes = _.without(this.nodes, node); + this._packNodes(); + this._notify(node, detachNode); + }; + + GridStackEngine.prototype.canMoveNode = function(node, x, y, width, height) { + if (!this.isNodeChangedPosition(node, x, y, width, height)) { + return false; + } + var hasLocked = Boolean( + _.find(this.nodes, function(n) { + return n.locked; + }) + ); + + if (!this.height && !hasLocked) { + return true; + } + + var clonedNode; + var clone = new GridStackEngine( + this.width, + null, + this.float, + 0, + _.map(this.nodes, function(n) { + if (n == node) { + clonedNode = $.extend({}, n); + return clonedNode; + } + return $.extend({}, n); + }) + ); + + if (typeof clonedNode === "undefined") { + return true; + } + + clone.moveNode(clonedNode, x, y, width, height); + + var res = true; + + if (hasLocked) { + res &= !Boolean( + _.find(clone.nodes, function(n) { + return n != clonedNode && Boolean(n.locked) && Boolean(n._dirty); + }) + ); + } + if (this.height) { + res &= clone.getGridHeight() <= this.height; + } + + return res; + }; + + GridStackEngine.prototype.canBePlacedWithRespectToHeight = function(node) { + if (!this.height) { + return true; + } + + var clone = new GridStackEngine( + this.width, + null, + this.float, + 0, + _.map(this.nodes, function(n) { + return $.extend({}, n); + }) + ); + clone.addNode(node); + return clone.getGridHeight() <= this.height; + }; + + GridStackEngine.prototype.isNodeChangedPosition = function( + node, + x, + y, + width, + height + ) { + if (typeof x != "number") { + x = node.x; + } + if (typeof y != "number") { + y = node.y; + } + if (typeof width != "number") { + width = node.width; + } + if (typeof height != "number") { + height = node.height; + } + + if (typeof node.maxWidth != "undefined") { + width = Math.min(width, node.maxWidth); + } + if (typeof node.maxHeight != "undefined") { + height = Math.min(height, node.maxHeight); + } + if (typeof node.minWidth != "undefined") { + width = Math.max(width, node.minWidth); + } + if (typeof node.minHeight != "undefined") { + height = Math.max(height, node.minHeight); + } + + if ( + node.x == x && + node.y == y && + node.width == width && + node.height == height + ) { + return false; + } + return true; + }; + + GridStackEngine.prototype.moveNode = function( + node, + x, + y, + width, + height, + noPack + ) { + if (!this.isNodeChangedPosition(node, x, y, width, height)) { + return node; + } + if (typeof x != "number") { + x = node.x; + } + if (typeof y != "number") { + y = node.y; + } + if (typeof width != "number") { + width = node.width; + } + if (typeof height != "number") { + height = node.height; + } + + if (typeof node.maxWidth != "undefined") { + width = Math.min(width, node.maxWidth); + } + if (typeof node.maxHeight != "undefined") { + height = Math.min(height, node.maxHeight); + } + if (typeof node.minWidth != "undefined") { + width = Math.max(width, node.minWidth); + } + if (typeof node.minHeight != "undefined") { + height = Math.max(height, node.minHeight); + } + + if ( + node.x == x && + node.y == y && + node.width == width && + node.height == height + ) { + return node; + } + + var resizing = node.width != width; + node._dirty = true; + + node.x = x; + node.y = y; + node.width = width; + node.height = height; + + node.lastTriedX = x; + node.lastTriedY = y; + node.lastTriedWidth = width; + node.lastTriedHeight = height; + + node = this._prepareNode(node, resizing); + + this._fixCollisions(node); + if (!noPack) { + this._packNodes(); + this._notify(); + } + return node; + }; + + GridStackEngine.prototype.getGridHeight = function() { + return _.reduce( + this.nodes, + function(memo, n) { + return Math.max(memo, n.y + n.height); + }, + 0 + ); + }; + + GridStackEngine.prototype.beginUpdate = function(node) { + _.each(this.nodes, function(n) { + n._origY = n.y; + }); + node._updating = true; + }; + + GridStackEngine.prototype.endUpdate = function() { + _.each(this.nodes, function(n) { + n._origY = n.y; + }); + var n = _.find(this.nodes, function(n) { + return n._updating; + }); + if (n) { + n._updating = false; + } + }; + + var GridStack = function(el, opts) { + var self = this; + var oneColumnMode, isAutoCellHeight; + + opts = opts || {}; + + this.container = $(el); + + // jscs:disable requireCamelCaseOrUpperCaseIdentifiers + if (typeof opts.handle_class !== "undefined") { + opts.handleClass = opts.handle_class; + obsoleteOpts("handle_class", "handleClass"); + } + if (typeof opts.item_class !== "undefined") { + opts.itemClass = opts.item_class; + obsoleteOpts("item_class", "itemClass"); + } + if (typeof opts.placeholder_class !== "undefined") { + opts.placeholderClass = opts.placeholder_class; + obsoleteOpts("placeholder_class", "placeholderClass"); + } + if (typeof opts.placeholder_text !== "undefined") { + opts.placeholderText = opts.placeholder_text; + obsoleteOpts("placeholder_text", "placeholderText"); + } + if (typeof opts.cell_height !== "undefined") { + opts.cellHeight = opts.cell_height; + obsoleteOpts("cell_height", "cellHeight"); + } + if (typeof opts.vertical_margin !== "undefined") { + opts.verticalMargin = opts.vertical_margin; + obsoleteOpts("vertical_margin", "verticalMargin"); + } + if (typeof opts.min_width !== "undefined") { + opts.minWidth = opts.min_width; + obsoleteOpts("min_width", "minWidth"); + } + if (typeof opts.static_grid !== "undefined") { + opts.staticGrid = opts.static_grid; + obsoleteOpts("static_grid", "staticGrid"); + } + if (typeof opts.is_nested !== "undefined") { + opts.isNested = opts.is_nested; + obsoleteOpts("is_nested", "isNested"); + } + if (typeof opts.always_show_resize_handle !== "undefined") { + opts.alwaysShowResizeHandle = opts.always_show_resize_handle; + obsoleteOpts("always_show_resize_handle", "alwaysShowResizeHandle"); + } + // jscs:enable requireCamelCaseOrUpperCaseIdentifiers + + opts.itemClass = opts.itemClass || "grid-stack-item"; + var isNested = this.container.closest("." + opts.itemClass).length > 0; + + this.opts = _.defaults(opts || {}, { + width: parseInt(this.container.attr("data-gs-width")) || 12, + height: parseInt(this.container.attr("data-gs-height")) || 0, + itemClass: "grid-stack-item", + placeholderClass: "grid-stack-placeholder", + placeholderText: "", + handle: ".grid-stack-item-content", + handleClass: null, + cellHeight: 60, + verticalMargin: 20, + auto: true, + minWidth: 768, + float: false, + staticGrid: false, + _class: "grid-stack-instance-" + (Math.random() * 10000).toFixed(0), + animate: Boolean(this.container.attr("data-gs-animate")) || false, + alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false, + resizable: _.defaults(opts.resizable || {}, { + autoHide: !(opts.alwaysShowResizeHandle || false), + handles: "se" + }), + draggable: _.defaults(opts.draggable || {}, { + handle: + (opts.handleClass + ? "." + opts.handleClass + : opts.handle + ? opts.handle + : "") || ".grid-stack-item-content", + scroll: false, + appendTo: "body" + }), + disableDrag: opts.disableDrag || false, + disableResize: opts.disableResize || false, + rtl: "auto", + removable: false, + removeTimeout: 2000, + verticalMarginUnit: "px", + cellHeightUnit: "px", + disableOneColumnMode: opts.disableOneColumnMode || false, + oneColumnModeClass: + opts.oneColumnModeClass || "grid-stack-one-column-mode", + ddPlugin: null + }); + + if (this.opts.ddPlugin === false) { + this.opts.ddPlugin = GridStackDragDropPlugin; + } else if (this.opts.ddPlugin === null) { + this.opts.ddPlugin = + _.first(GridStackDragDropPlugin.registeredPlugins) || + GridStackDragDropPlugin; + } + + this.dd = new this.opts.ddPlugin(this); + + if (this.opts.rtl === "auto") { + this.opts.rtl = this.container.css("direction") === "rtl"; + } + + if (this.opts.rtl) { + this.container.addClass("grid-stack-rtl"); + } + + this.opts.isNested = isNested; + + isAutoCellHeight = this.opts.cellHeight === "auto"; + if (isAutoCellHeight) { + self.cellHeight(self.cellWidth(), true); + } else { + this.cellHeight(this.opts.cellHeight, true); + } + this.verticalMargin(this.opts.verticalMargin, true); + + this.container.addClass(this.opts._class); + + this._setStaticClass(); + + if (isNested) { + this.container.addClass("grid-stack-nested"); + } + + this._initStyles(); + + this.grid = new GridStackEngine( + this.opts.width, + function(nodes, detachNode) { + detachNode = typeof detachNode === "undefined" ? true : detachNode; + var maxHeight = 0; + _.each(nodes, function(n) { + if (detachNode && n._id === null) { + if (n.el) { + n.el.remove(); + } + } else { + n.el + .attr("data-gs-x", n.x) + .attr("data-gs-y", n.y) + .attr("data-gs-width", n.width) + .attr("data-gs-height", n.height); + maxHeight = Math.max(maxHeight, n.y + n.height); + } + }); + self._updateStyles(maxHeight + 10); + }, + this.opts.float, + this.opts.height + ); + + if (this.opts.auto) { + var elements = []; + var _this = this; + this.container + .children( + "." + + this.opts.itemClass + + ":not(." + + this.opts.placeholderClass + + ")" + ) + .each(function(index, el) { + el = $(el); + elements.push({ + el: el, + i: + parseInt(el.attr("data-gs-x")) + + parseInt(el.attr("data-gs-y")) * _this.opts.width + }); + }); + _.chain(elements) + .sortBy(function(x) { + return x.i; + }) + .each(function(i) { + self._prepareElement(i.el); + }) + .value(); + } + + this.setAnimation(this.opts.animate); + + this.placeholder = $( + '
' + + '
' + + this.opts.placeholderText + + "
" + ).hide(); + + this._updateContainerHeight(); + + this._updateHeightsOnResize = _.throttle(function() { + self.cellHeight(self.cellWidth(), false); + }, 100); + + this.onResizeHandler = function() { + if (isAutoCellHeight) { + self._updateHeightsOnResize(); + } + + if (self._isOneColumnMode() && !self.opts.disableOneColumnMode) { + if (oneColumnMode) { + return; + } + self.container.addClass(self.opts.oneColumnModeClass); + oneColumnMode = true; + + self.grid._sortNodes(); + _.each(self.grid.nodes, function(node) { + self.container.append(node.el); + + if (self.opts.staticGrid) { + return; + } + self.dd.draggable(node.el, "disable"); + self.dd.resizable(node.el, "disable"); + + node.el.trigger("resize"); + }); + } else { + if (!oneColumnMode) { + return; + } + + self.container.removeClass(self.opts.oneColumnModeClass); + oneColumnMode = false; + + if (self.opts.staticGrid) { + return; + } + + _.each(self.grid.nodes, function(node) { + if (!node.noMove && !self.opts.disableDrag) { + self.dd.draggable(node.el, "enable"); + } + if (!node.noResize && !self.opts.disableResize) { + self.dd.resizable(node.el, "enable"); + } + + node.el.trigger("resize"); + }); + } + }; + + $(window).resize(this.onResizeHandler); + this.onResizeHandler(); + + if (!self.opts.staticGrid && typeof self.opts.removable === "string") { + var trashZone = $(self.opts.removable); + if (!this.dd.isDroppable(trashZone)) { + this.dd.droppable(trashZone, { + accept: "." + self.opts.itemClass + }); + } + this.dd + .on(trashZone, "dropover", function(event, ui) { + var el = $(ui.draggable); + var node = el.data("_gridstack_node"); + if (node._grid !== self) { + return; + } + self._setupRemovingTimeout(el); + }) + .on(trashZone, "dropout", function(event, ui) { + var el = $(ui.draggable); + var node = el.data("_gridstack_node"); + if (node._grid !== self) { + return; + } + self._clearRemovingTimeout(el); + }); + } + + if (!self.opts.staticGrid && self.opts.acceptWidgets) { + var draggingElement = null; + + var onDrag = function(event, ui) { + var el = draggingElement; + var node = el.data("_gridstack_node"); + var pos = self.getCellFromPixel(ui.offset, true); + var x = Math.max(0, pos.x); + var y = Math.max(0, pos.y); + if (!node._added) { + node._added = true; + + node.el = el; + node.x = x; + node.y = y; + self.grid.cleanNodes(); + self.grid.beginUpdate(node); + self.grid.addNode(node); + + self.container.append(self.placeholder); + self.placeholder + .attr("data-gs-x", node.x) + .attr("data-gs-y", node.y) + .attr("data-gs-width", node.width) + .attr("data-gs-height", node.height) + .show(); + node.el = self.placeholder; + node._beforeDragX = node.x; + node._beforeDragY = node.y; + + self._updateContainerHeight(); + } else { + if (!self.grid.canMoveNode(node, x, y)) { + return; + } + self.grid.moveNode(node, x, y); + self._updateContainerHeight(); + } + }; + + this.dd + .droppable(self.container, { + accept: function(el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (node && node._grid === self) { + return false; + } + return el.is( + self.opts.acceptWidgets === true + ? ".grid-stack-item" + : self.opts.acceptWidgets + ); + } + }) + .on(self.container, "dropover", function(event, ui) { + var offset = self.container.offset(); + var el = $(ui.draggable); + var cellWidth = self.cellWidth(); + var cellHeight = self.cellHeight(); + var origNode = el.data("_gridstack_node"); + + var width = origNode + ? origNode.width + : Math.ceil(el.outerWidth() / cellWidth); + var height = origNode + ? origNode.height + : Math.ceil(el.outerHeight() / cellHeight); + + draggingElement = el; + + var node = self.grid._prepareNode({ + width: width, + height: height, + _added: false, + _temporary: true + }); + el.data("_gridstack_node", node); + el.data("_gridstack_node_orig", origNode); + + el.on("drag", onDrag); + }) + .on(self.container, "dropout", function(event, ui) { + var el = $(ui.draggable); + el.unbind("drag", onDrag); + var node = el.data("_gridstack_node"); + node.el = null; + self.grid.removeNode(node); + self.placeholder.detach(); + self._updateContainerHeight(); + el.data("_gridstack_node", el.data("_gridstack_node_orig")); + }) + .on(self.container, "drop", function(event, ui) { + self.placeholder.detach(); + + var node = $(ui.draggable).data("_gridstack_node"); + node._grid = self; + var el = $(ui.draggable).clone(false); + el.data("_gridstack_node", node); + var originalNode = $(ui.draggable).data("_gridstack_node_orig"); + if (typeof originalNode !== "undefined") { + originalNode._grid._triggerRemoveEvent(); + } + $(ui.draggable).remove(); + node.el = el; + self.placeholder.hide(); + el.attr("data-gs-x", node.x) + .attr("data-gs-y", node.y) + .attr("data-gs-width", node.width) + .attr("data-gs-height", node.height) + .addClass(self.opts.itemClass) + .removeAttr("style") + .enableSelection() + .removeData("draggable") + .removeClass( + "ui-draggable ui-draggable-dragging ui-draggable-disabled" + ) + .unbind("drag", onDrag); + self.container.append(el); + self._prepareElementsByNode(el, node); + self._updateContainerHeight(); + self.grid._addedNodes.push(node); + self._triggerAddEvent(); + self._triggerChangeEvent(); + + self.grid.endUpdate(); + }); + } + }; + + GridStack.prototype._triggerChangeEvent = function(forceTrigger) { + var elements = this.grid.getDirtyNodes(); + var hasChanges = false; + + var eventParams = []; + if (elements && elements.length) { + eventParams.push(elements); + hasChanges = true; + } + + if (hasChanges || forceTrigger === true) { + this.container.trigger("change", eventParams); + } + }; + + GridStack.prototype._triggerAddEvent = function() { + if (this.grid._addedNodes && this.grid._addedNodes.length > 0) { + this.container.trigger("added", [_.map(this.grid._addedNodes, _.clone)]); + this.grid._addedNodes = []; + } + }; + + GridStack.prototype._triggerRemoveEvent = function() { + if (this.grid._removedNodes && this.grid._removedNodes.length > 0) { + this.container.trigger("removed", [ + _.map(this.grid._removedNodes, _.clone) + ]); + this.grid._removedNodes = []; + } + }; + + GridStack.prototype._initStyles = function() { + if (this._stylesId) { + Utils.removeStylesheet(this._stylesId); + } + this._stylesId = "gridstack-style-" + (Math.random() * 100000).toFixed(); + this._styles = Utils.createStylesheet(this._stylesId); + if (this._styles !== null) { + this._styles._max = 0; + } + }; + + GridStack.prototype._updateStyles = function(maxHeight) { + if (this._styles === null || typeof this._styles === "undefined") { + return; + } + + var prefix = "." + this.opts._class + " ." + this.opts.itemClass; + var self = this; + var getHeight; + + if (typeof maxHeight == "undefined") { + maxHeight = this._styles._max; + } + this._initStyles(); + this._updateContainerHeight(); + if (!this.opts.cellHeight) { + // The rest will be handled by CSS + return; + } + if (this._styles._max !== 0 && maxHeight <= this._styles._max) { + return; + } + + if ( + !this.opts.verticalMargin || + this.opts.cellHeightUnit === this.opts.verticalMarginUnit + ) { + getHeight = function(nbRows, nbMargins) { + return ( + self.opts.cellHeight * nbRows + + self.opts.verticalMargin * nbMargins + + self.opts.cellHeightUnit + ); + }; + } else { + getHeight = function(nbRows, nbMargins) { + if (!nbRows || !nbMargins) { + return ( + self.opts.cellHeight * nbRows + + self.opts.verticalMargin * nbMargins + + self.opts.cellHeightUnit + ); + } + return ( + "calc(" + + (self.opts.cellHeight * nbRows + self.opts.cellHeightUnit) + + " + " + + (self.opts.verticalMargin * nbMargins + + self.opts.verticalMarginUnit) + + ")" + ); + }; + } + + if (this._styles._max === 0) { + Utils.insertCSSRule( + this._styles, + prefix, + "min-height: " + getHeight(1, 0) + ";", + 0 + ); + } + + if (maxHeight > this._styles._max) { + for (var i = this._styles._max; i < maxHeight; ++i) { + Utils.insertCSSRule( + this._styles, + prefix + '[data-gs-height="' + (i + 1) + '"]', + "height: " + getHeight(i + 1, i) + ";", + i + ); + Utils.insertCSSRule( + this._styles, + prefix + '[data-gs-min-height="' + (i + 1) + '"]', + "min-height: " + getHeight(i + 1, i) + ";", + i + ); + Utils.insertCSSRule( + this._styles, + prefix + '[data-gs-max-height="' + (i + 1) + '"]', + "max-height: " + getHeight(i + 1, i) + ";", + i + ); + Utils.insertCSSRule( + this._styles, + prefix + '[data-gs-y="' + i + '"]', + "top: " + getHeight(i, i) + ";", + i + ); + } + this._styles._max = maxHeight; + } + }; + + GridStack.prototype._updateContainerHeight = function() { + if (this.grid._updateCounter) { + return; + } + var height = this.grid.getGridHeight(); + this.container.attr("data-gs-current-height", height); + if (!this.opts.cellHeight) { + return; + } + if (!this.opts.verticalMargin) { + this.container.css( + "height", + height * this.opts.cellHeight + this.opts.cellHeightUnit + ); + } else if (this.opts.cellHeightUnit === this.opts.verticalMarginUnit) { + this.container.css( + "height", + height * (this.opts.cellHeight + this.opts.verticalMargin) - + this.opts.verticalMargin + + this.opts.cellHeightUnit + ); + } else { + this.container.css( + "height", + "calc(" + + (height * this.opts.cellHeight + this.opts.cellHeightUnit) + + " + " + + (height * (this.opts.verticalMargin - 1) + + this.opts.verticalMarginUnit) + + ")" + ); + } + }; + + GridStack.prototype._isOneColumnMode = function() { + return ( + (window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth) <= this.opts.minWidth + ); + }; + + GridStack.prototype._setupRemovingTimeout = function(el) { + var self = this; + var node = $(el).data("_gridstack_node"); + + if (node._removeTimeout || !self.opts.removable) { + return; + } + node._removeTimeout = setTimeout(function() { + el.addClass("grid-stack-item-removing"); + node._isAboutToRemove = true; + }, self.opts.removeTimeout); + }; + + GridStack.prototype._clearRemovingTimeout = function(el) { + var node = $(el).data("_gridstack_node"); + + if (!node._removeTimeout) { + return; + } + clearTimeout(node._removeTimeout); + node._removeTimeout = null; + el.removeClass("grid-stack-item-removing"); + node._isAboutToRemove = false; + }; + + GridStack.prototype._prepareElementsByNode = function(el, node) { + var self = this; + + var cellWidth; + var cellHeight; + + var dragOrResize = function(event, ui) { + var x = Math.round(ui.position.left / cellWidth); + var y = Math.floor((ui.position.top + cellHeight / 2) / cellHeight); + var width; + var height; + + if (event.type != "drag") { + width = Math.round(ui.size.width / cellWidth); + height = Math.round(ui.size.height / cellHeight); + } + + if (event.type == "drag") { + if ( + x < 0 || + x >= self.grid.width || + y < 0 || + (!self.grid.float && y > self.grid.getGridHeight()) + ) { + if (!node._temporaryRemoved) { + if (self.opts.removable === true) { + self._setupRemovingTimeout(el); + } + + x = node._beforeDragX; + y = node._beforeDragY; + + self.placeholder.detach(); + self.placeholder.hide(); + self.grid.removeNode(node); + self._updateContainerHeight(); + + node._temporaryRemoved = true; + } + } else { + self._clearRemovingTimeout(el); + + if (node._temporaryRemoved) { + self.grid.addNode(node); + self.placeholder + .attr("data-gs-x", x) + .attr("data-gs-y", y) + .attr("data-gs-width", width) + .attr("data-gs-height", height) + .show(); + self.container.append(self.placeholder); + node.el = self.placeholder; + node._temporaryRemoved = false; + } + } + } else if (event.type == "resize") { + if (x < 0) { + return; + } + } + // width and height are undefined if not resizing + var lastTriedWidth = + typeof width !== "undefined" ? width : node.lastTriedWidth; + var lastTriedHeight = + typeof height !== "undefined" ? height : node.lastTriedHeight; + if ( + !self.grid.canMoveNode(node, x, y, width, height) || + (node.lastTriedX === x && + node.lastTriedY === y && + node.lastTriedWidth === lastTriedWidth && + node.lastTriedHeight === lastTriedHeight) + ) { + return; + } + node.lastTriedX = x; + node.lastTriedY = y; + node.lastTriedWidth = width; + node.lastTriedHeight = height; + self.grid.moveNode(node, x, y, width, height); + self._updateContainerHeight(); + }; + + var onStartMoving = function(event, ui) { + self.container.append(self.placeholder); + var o = $(this); + self.grid.cleanNodes(); + self.grid.beginUpdate(node); + cellWidth = self.cellWidth(); + var strictCellHeight = Math.ceil( + o.outerHeight() / o.attr("data-gs-height") + ); + cellHeight = + self.container.height() / + parseInt(self.container.attr("data-gs-current-height")); + self.placeholder + .attr("data-gs-x", o.attr("data-gs-x")) + .attr("data-gs-y", o.attr("data-gs-y")) + .attr("data-gs-width", o.attr("data-gs-width")) + .attr("data-gs-height", o.attr("data-gs-height")) + .show(); + node.el = self.placeholder; + node._beforeDragX = node.x; + node._beforeDragY = node.y; + + self.dd.resizable( + el, + "option", + "minWidth", + cellWidth * (node.minWidth || 1) + ); + self.dd.resizable( + el, + "option", + "minHeight", + strictCellHeight * (node.minHeight || 1) + ); + + if (event.type == "resizestart") { + o.find(".grid-stack-item").trigger("resizestart"); + } + }; + + var onEndMoving = function(event, ui) { + var o = $(this); + if (!o.data("_gridstack_node")) { + return; + } + + var forceNotify = false; + self.placeholder.detach(); + node.el = o; + self.placeholder.hide(); + + if (node._isAboutToRemove) { + forceNotify = true; + var gridToNotify = el.data("_gridstack_node")._grid; + gridToNotify._triggerRemoveEvent(); + el.removeData("_gridstack_node"); + el.remove(); + } else { + self._clearRemovingTimeout(el); + if (!node._temporaryRemoved) { + o.attr("data-gs-x", node.x) + .attr("data-gs-y", node.y) + .attr("data-gs-width", node.width) + .attr("data-gs-height", node.height) + .removeAttr("style"); + } else { + o.attr("data-gs-x", node._beforeDragX) + .attr("data-gs-y", node._beforeDragY) + .attr("data-gs-width", node.width) + .attr("data-gs-height", node.height) + .removeAttr("style"); + node.x = node._beforeDragX; + node.y = node._beforeDragY; + self.grid.addNode(node); + } + } + self._updateContainerHeight(); + self._triggerChangeEvent(forceNotify); + + self.grid.endUpdate(); + + var nestedGrids = o.find(".grid-stack"); + if (nestedGrids.length && event.type == "resizestop") { + nestedGrids.each(function(index, el) { + $(el) + .data("gridstack") + .onResizeHandler(); + }); + o.find(".grid-stack-item").trigger("resizestop"); + o.find(".grid-stack-item").trigger("gsresizestop"); + } + if (event.type == "resizestop") { + self.container.trigger("gsresizestop", o); + } + }; + + this.dd + .draggable(el, { + start: onStartMoving, + stop: onEndMoving, + drag: dragOrResize + }) + .resizable(el, { + start: onStartMoving, + stop: onEndMoving, + resize: dragOrResize + }); + + if ( + node.noMove || + (this._isOneColumnMode() && !self.opts.disableOneColumnMode) || + this.opts.disableDrag + ) { + this.dd.draggable(el, "disable"); + } + + if ( + node.noResize || + (this._isOneColumnMode() && !self.opts.disableOneColumnMode) || + this.opts.disableResize + ) { + this.dd.resizable(el, "disable"); + } + + el.attr("data-gs-locked", node.locked ? "yes" : null); + }; + + GridStack.prototype._prepareElement = function(el, triggerAddEvent) { + triggerAddEvent = + typeof triggerAddEvent != "undefined" ? triggerAddEvent : false; + var self = this; + el = $(el); + + el.addClass(this.opts.itemClass); + var node = self.grid.addNode( + { + x: el.attr("data-gs-x"), + y: el.attr("data-gs-y"), + width: el.attr("data-gs-width"), + height: el.attr("data-gs-height"), + maxWidth: el.attr("data-gs-max-width"), + minWidth: el.attr("data-gs-min-width"), + maxHeight: el.attr("data-gs-max-height"), + minHeight: el.attr("data-gs-min-height"), + autoPosition: Utils.toBool(el.attr("data-gs-auto-position")), + noResize: Utils.toBool(el.attr("data-gs-no-resize")), + noMove: Utils.toBool(el.attr("data-gs-no-move")), + locked: Utils.toBool(el.attr("data-gs-locked")), + el: el, + id: el.attr("data-gs-id"), + _grid: self + }, + triggerAddEvent + ); + el.data("_gridstack_node", node); + + this._prepareElementsByNode(el, node); + }; + + GridStack.prototype.setAnimation = function(enable) { + if (enable) { + this.container.addClass("grid-stack-animate"); + } else { + this.container.removeClass("grid-stack-animate"); + } + }; + + GridStack.prototype.addWidget = function( + el, + x, + y, + width, + height, + autoPosition, + minWidth, + maxWidth, + minHeight, + maxHeight, + id + ) { + el = $(el); + if (typeof x != "undefined") { + el.attr("data-gs-x", x); + } + if (typeof y != "undefined") { + el.attr("data-gs-y", y); + } + if (typeof width != "undefined") { + el.attr("data-gs-width", width); + } + if (typeof height != "undefined") { + el.attr("data-gs-height", height); + } + if (typeof autoPosition != "undefined") { + el.attr("data-gs-auto-position", autoPosition ? "yes" : null); + } + if (typeof minWidth != "undefined") { + el.attr("data-gs-min-width", minWidth); + } + if (typeof maxWidth != "undefined") { + el.attr("data-gs-max-width", maxWidth); + } + if (typeof minHeight != "undefined") { + el.attr("data-gs-min-height", minHeight); + } + if (typeof maxHeight != "undefined") { + el.attr("data-gs-max-height", maxHeight); + } + if (typeof id != "undefined") { + el.attr("data-gs-id", id); + } + this.container.append(el); + this._prepareElement(el, true); + this._triggerAddEvent(); + this._updateContainerHeight(); + this._triggerChangeEvent(true); + + return el; + }; + + GridStack.prototype.makeWidget = function(el) { + el = $(el); + this._prepareElement(el, true); + this._triggerAddEvent(); + this._updateContainerHeight(); + this._triggerChangeEvent(true); + + return el; + }; + + GridStack.prototype.willItFit = function(x, y, width, height, autoPosition) { + var node = { + x: x, + y: y, + width: width, + height: height, + autoPosition: autoPosition + }; + return this.grid.canBePlacedWithRespectToHeight(node); + }; + + GridStack.prototype.removeWidget = function(el, detachNode) { + detachNode = typeof detachNode === "undefined" ? true : detachNode; + el = $(el); + var node = el.data("_gridstack_node"); + + // For Meteor support: https://github.com/troolee/gridstack.js/pull/272 + if (!node) { + node = this.grid.getNodeDataByDOMEl(el); + } + + this.grid.removeNode(node, detachNode); + el.removeData("_gridstack_node"); + this._updateContainerHeight(); + if (detachNode) { + el.remove(); + } + this._triggerChangeEvent(true); + this._triggerRemoveEvent(); + }; + + GridStack.prototype.removeAll = function(detachNode) { + _.each( + this.grid.nodes, + _.bind(function(node) { + this.removeWidget(node.el, detachNode); + }, this) + ); + this.grid.nodes = []; + this._updateContainerHeight(); + }; + + GridStack.prototype.destroy = function(detachGrid) { + $(window).off("resize", this.onResizeHandler); + this.disable(); + if (typeof detachGrid != "undefined" && !detachGrid) { + this.removeAll(false); + this.container.removeData("gridstack"); + } else { + this.container.remove(); + } + Utils.removeStylesheet(this._stylesId); + if (this.grid) { + this.grid = null; + } + }; + + GridStack.prototype.resizable = function(el, val) { + var self = this; + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node == "undefined" || node === null) { + return; + } + + node.noResize = !(val || false); + if ( + node.noResize || + (self._isOneColumnMode() && !self.opts.disableOneColumnMode) + ) { + self.dd.resizable(el, "disable"); + } else { + self.dd.resizable(el, "enable"); + } + }); + return this; + }; + + GridStack.prototype.movable = function(el, val) { + var self = this; + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node == "undefined" || node === null) { + return; + } + + node.noMove = !(val || false); + if ( + node.noMove || + (self._isOneColumnMode() && !self.opts.disableOneColumnMode) + ) { + self.dd.draggable(el, "disable"); + el.removeClass("ui-draggable-handle"); + } else { + self.dd.draggable(el, "enable"); + el.addClass("ui-draggable-handle"); + } + }); + return this; + }; + + GridStack.prototype.enableMove = function(doEnable, includeNewWidgets) { + this.movable(this.container.children("." + this.opts.itemClass), doEnable); + if (includeNewWidgets) { + this.opts.disableDrag = !doEnable; + } + }; + + GridStack.prototype.enableResize = function(doEnable, includeNewWidgets) { + this.resizable( + this.container.children("." + this.opts.itemClass), + doEnable + ); + if (includeNewWidgets) { + this.opts.disableResize = !doEnable; + } + }; + + GridStack.prototype.disable = function() { + this.movable(this.container.children("." + this.opts.itemClass), false); + this.resizable(this.container.children("." + this.opts.itemClass), false); + this.container.trigger("disable"); + }; + + GridStack.prototype.enable = function() { + this.movable(this.container.children("." + this.opts.itemClass), true); + this.resizable(this.container.children("." + this.opts.itemClass), true); + this.container.trigger("enable"); + }; + + GridStack.prototype.locked = function(el, val) { + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node == "undefined" || node === null) { + return; + } + + node.locked = val || false; + el.attr("data-gs-locked", node.locked ? "yes" : null); + }); + return this; + }; + + GridStack.prototype.maxHeight = function(el, val) { + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node === "undefined" || node === null) { + return; + } + + if (!isNaN(val)) { + node.maxHeight = val || false; + el.attr("data-gs-max-height", val); + } + }); + return this; + }; + + GridStack.prototype.minHeight = function(el, val) { + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node === "undefined" || node === null) { + return; + } + + if (!isNaN(val)) { + node.minHeight = val || false; + el.attr("data-gs-min-height", val); + } + }); + return this; + }; + + GridStack.prototype.maxWidth = function(el, val) { + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node === "undefined" || node === null) { + return; + } + + if (!isNaN(val)) { + node.maxWidth = val || false; + el.attr("data-gs-max-width", val); + } + }); + return this; + }; + + GridStack.prototype.minWidth = function(el, val) { + el = $(el); + el.each(function(index, el) { + el = $(el); + var node = el.data("_gridstack_node"); + if (typeof node === "undefined" || node === null) { + return; + } + + if (!isNaN(val)) { + node.minWidth = val || false; + el.attr("data-gs-min-width", val); + } + }); + return this; + }; + + GridStack.prototype._updateElement = function(el, callback) { + el = $(el).first(); + var node = el.data("_gridstack_node"); + if (typeof node == "undefined" || node === null) { + return; + } + + var self = this; + + self.grid.cleanNodes(); + self.grid.beginUpdate(node); + + callback.call(this, el, node); + + self._updateContainerHeight(); + self._triggerChangeEvent(); + + self.grid.endUpdate(); + }; + + GridStack.prototype.resize = function(el, width, height) { + this._updateElement(el, function(el, node) { + width = + width !== null && typeof width != "undefined" ? width : node.width; + height = + height !== null && typeof height != "undefined" ? height : node.height; + + this.grid.moveNode(node, node.x, node.y, width, height); + }); + }; + + GridStack.prototype.move = function(el, x, y) { + this._updateElement(el, function(el, node) { + x = x !== null && typeof x != "undefined" ? x : node.x; + y = y !== null && typeof y != "undefined" ? y : node.y; + + this.grid.moveNode(node, x, y, node.width, node.height); + }); + }; + + GridStack.prototype.update = function(el, x, y, width, height) { + this._updateElement(el, function(el, node) { + x = x !== null && typeof x != "undefined" ? x : node.x; + y = y !== null && typeof y != "undefined" ? y : node.y; + width = + width !== null && typeof width != "undefined" ? width : node.width; + height = + height !== null && typeof height != "undefined" ? height : node.height; + + this.grid.moveNode(node, x, y, width, height); + }); + }; + + GridStack.prototype.verticalMargin = function(val, noUpdate) { + if (typeof val == "undefined") { + return this.opts.verticalMargin; + } + + var heightData = Utils.parseHeight(val); + + if ( + this.opts.verticalMarginUnit === heightData.unit && + this.opts.height === heightData.height + ) { + return; + } + this.opts.verticalMarginUnit = heightData.unit; + this.opts.verticalMargin = heightData.height; + + if (!noUpdate) { + this._updateStyles(); + } + }; + + GridStack.prototype.cellHeight = function(val, noUpdate) { + if (typeof val == "undefined") { + if (this.opts.cellHeight) { + return this.opts.cellHeight; + } + var o = this.container.children("." + this.opts.itemClass).first(); + return Math.ceil(o.outerHeight() / o.attr("data-gs-height")); + } + var heightData = Utils.parseHeight(val); + + if ( + this.opts.cellHeightUnit === heightData.heightUnit && + this.opts.height === heightData.height + ) { + return; + } + this.opts.cellHeightUnit = heightData.unit; + this.opts.cellHeight = heightData.height; + + if (!noUpdate) { + this._updateStyles(); + } + }; + + GridStack.prototype.cellWidth = function() { + return Math.round(this.container.outerWidth() / this.opts.width); + }; + + GridStack.prototype.getCellFromPixel = function(position, useOffset) { + var containerPos = + typeof useOffset != "undefined" && useOffset + ? this.container.offset() + : this.container.position(); + var relativeLeft = position.left - containerPos.left; + var relativeTop = position.top - containerPos.top; + + var columnWidth = Math.floor(this.container.width() / this.opts.width); + var rowHeight = Math.floor( + this.container.height() / + parseInt(this.container.attr("data-gs-current-height")) + ); + + return { + x: Math.floor(relativeLeft / columnWidth), + y: Math.floor(relativeTop / rowHeight) + }; + }; + + GridStack.prototype.batchUpdate = function() { + this.grid.batchUpdate(); + }; + + GridStack.prototype.commit = function() { + this.grid.commit(); + this._updateContainerHeight(); + }; + + GridStack.prototype.isAreaEmpty = function(x, y, width, height) { + return this.grid.isAreaEmpty(x, y, width, height); + }; + + GridStack.prototype.setStatic = function(staticValue) { + this.opts.staticGrid = staticValue === true; + this.enableMove(!staticValue); + this.enableResize(!staticValue); + this._setStaticClass(); + }; + + GridStack.prototype._setStaticClass = function() { + var staticClassName = "grid-stack-static"; + + if (this.opts.staticGrid === true) { + this.container.addClass(staticClassName); + } else { + this.container.removeClass(staticClassName); + } + }; + + GridStack.prototype._updateNodeWidths = function(oldWidth, newWidth) { + this.grid._sortNodes(); + this.grid.batchUpdate(); + var node = {}; + for (var i = 0; i < this.grid.nodes.length; i++) { + node = this.grid.nodes[i]; + this.update( + node.el, + Math.round((node.x * newWidth) / oldWidth), + undefined, + Math.round((node.width * newWidth) / oldWidth), + undefined + ); + } + this.grid.commit(); + }; + + GridStack.prototype.setGridWidth = function(gridWidth, doNotPropagate) { + this.container.removeClass("grid-stack-" + this.opts.width); + if (doNotPropagate !== true) { + this._updateNodeWidths(this.opts.width, gridWidth); + } + this.opts.width = gridWidth; + this.grid.width = gridWidth; + this.container.addClass("grid-stack-" + gridWidth); + }; + + // jscs:disable requireCamelCaseOrUpperCaseIdentifiers + GridStackEngine.prototype.batch_update = obsolete( + GridStackEngine.prototype.batchUpdate + ); + GridStackEngine.prototype._fix_collisions = obsolete( + GridStackEngine.prototype._fixCollisions, + "_fix_collisions", + "_fixCollisions" + ); + GridStackEngine.prototype.is_area_empty = obsolete( + GridStackEngine.prototype.isAreaEmpty, + "is_area_empty", + "isAreaEmpty" + ); + GridStackEngine.prototype._sort_nodes = obsolete( + GridStackEngine.prototype._sortNodes, + "_sort_nodes", + "_sortNodes" + ); + GridStackEngine.prototype._pack_nodes = obsolete( + GridStackEngine.prototype._packNodes, + "_pack_nodes", + "_packNodes" + ); + GridStackEngine.prototype._prepare_node = obsolete( + GridStackEngine.prototype._prepareNode, + "_prepare_node", + "_prepareNode" + ); + GridStackEngine.prototype.clean_nodes = obsolete( + GridStackEngine.prototype.cleanNodes, + "clean_nodes", + "cleanNodes" + ); + GridStackEngine.prototype.get_dirty_nodes = obsolete( + GridStackEngine.prototype.getDirtyNodes, + "get_dirty_nodes", + "getDirtyNodes" + ); + GridStackEngine.prototype.add_node = obsolete( + GridStackEngine.prototype.addNode, + "add_node", + "addNode, " + ); + GridStackEngine.prototype.remove_node = obsolete( + GridStackEngine.prototype.removeNode, + "remove_node", + "removeNode" + ); + GridStackEngine.prototype.can_move_node = obsolete( + GridStackEngine.prototype.canMoveNode, + "can_move_node", + "canMoveNode" + ); + GridStackEngine.prototype.move_node = obsolete( + GridStackEngine.prototype.moveNode, + "move_node", + "moveNode" + ); + GridStackEngine.prototype.get_grid_height = obsolete( + GridStackEngine.prototype.getGridHeight, + "get_grid_height", + "getGridHeight" + ); + GridStackEngine.prototype.begin_update = obsolete( + GridStackEngine.prototype.beginUpdate, + "begin_update", + "beginUpdate" + ); + GridStackEngine.prototype.end_update = obsolete( + GridStackEngine.prototype.endUpdate, + "end_update", + "endUpdate" + ); + GridStackEngine.prototype.can_be_placed_with_respect_to_height = obsolete( + GridStackEngine.prototype.canBePlacedWithRespectToHeight, + "can_be_placed_with_respect_to_height", + "canBePlacedWithRespectToHeight" + ); + GridStack.prototype._trigger_change_event = obsolete( + GridStack.prototype._triggerChangeEvent, + "_trigger_change_event", + "_triggerChangeEvent" + ); + GridStack.prototype._init_styles = obsolete( + GridStack.prototype._initStyles, + "_init_styles", + "_initStyles" + ); + GridStack.prototype._update_styles = obsolete( + GridStack.prototype._updateStyles, + "_update_styles", + "_updateStyles" + ); + GridStack.prototype._update_container_height = obsolete( + GridStack.prototype._updateContainerHeight, + "_update_container_height", + "_updateContainerHeight" + ); + GridStack.prototype._is_one_column_mode = obsolete( + GridStack.prototype._isOneColumnMode, + "_is_one_column_mode", + "_isOneColumnMode" + ); + GridStack.prototype._prepare_element = obsolete( + GridStack.prototype._prepareElement, + "_prepare_element", + "_prepareElement" + ); + GridStack.prototype.set_animation = obsolete( + GridStack.prototype.setAnimation, + "set_animation", + "setAnimation" + ); + GridStack.prototype.add_widget = obsolete( + GridStack.prototype.addWidget, + "add_widget", + "addWidget" + ); + GridStack.prototype.make_widget = obsolete( + GridStack.prototype.makeWidget, + "make_widget", + "makeWidget" + ); + GridStack.prototype.will_it_fit = obsolete( + GridStack.prototype.willItFit, + "will_it_fit", + "willItFit" + ); + GridStack.prototype.remove_widget = obsolete( + GridStack.prototype.removeWidget, + "remove_widget", + "removeWidget" + ); + GridStack.prototype.remove_all = obsolete( + GridStack.prototype.removeAll, + "remove_all", + "removeAll" + ); + GridStack.prototype.min_height = obsolete( + GridStack.prototype.minHeight, + "min_height", + "minHeight" + ); + GridStack.prototype.min_width = obsolete( + GridStack.prototype.minWidth, + "min_width", + "minWidth" + ); + GridStack.prototype._update_element = obsolete( + GridStack.prototype._updateElement, + "_update_element", + "_updateElement" + ); + GridStack.prototype.cell_height = obsolete( + GridStack.prototype.cellHeight, + "cell_height", + "cellHeight" + ); + GridStack.prototype.cell_width = obsolete( + GridStack.prototype.cellWidth, + "cell_width", + "cellWidth" + ); + GridStack.prototype.get_cell_from_pixel = obsolete( + GridStack.prototype.getCellFromPixel, + "get_cell_from_pixel", + "getCellFromPixel" + ); + GridStack.prototype.batch_update = obsolete( + GridStack.prototype.batchUpdate, + "batch_update", + "batchUpdate" + ); + GridStack.prototype.is_area_empty = obsolete( + GridStack.prototype.isAreaEmpty, + "is_area_empty", + "isAreaEmpty" + ); + GridStack.prototype.set_static = obsolete( + GridStack.prototype.setStatic, + "set_static", + "setStatic" + ); + GridStack.prototype._set_static_class = obsolete( + GridStack.prototype._setStaticClass, + "_set_static_class", + "_setStaticClass" + ); + // jscs:enable requireCamelCaseOrUpperCaseIdentifiers + + scope.GridStackUI = GridStack; + + scope.GridStackUI.Utils = Utils; + scope.GridStackUI.Engine = GridStackEngine; + scope.GridStackUI.GridStackDragDropPlugin = GridStackDragDropPlugin; + + $.fn.gridstack = function(opts) { + return this.each(function() { + var o = $(this); + if (!o.data("gridstack")) { + o.data("gridstack", new GridStack(this, opts)); + } + }); + }; + + return scope.GridStackUI; +}); diff --git a/pandora_console/include/javascript/gridstack.min.map b/pandora_console/include/javascript/gridstack.min.map new file mode 100644 index 0000000000..21057fa840 --- /dev/null +++ b/pandora_console/include/javascript/gridstack.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/gridstack.js","../src/gridstack.jQueryUI.js"],"names":["factory","define","amd","exports","jQuery","require","e","_","$","GridStackDragDropPlugin","grid","this","scope","window","obsolete","f","oldName","newName","wrapper","console","warn","apply","arguments","prototype","obsoleteOpts","Utils","isIntercepted","a","b","x","width","y","height","sort","nodes","dir","chain","map","node","max","value","sortBy","n","createStylesheet","id","style","document","createElement","setAttribute","styleSheet","cssText","appendChild","createTextNode","getElementsByTagName","sheet","removeStylesheet","remove","insertCSSRule","selector","rules","index","insertRule","addRule","toBool","v","toLowerCase","Boolean","_collisionNodeCheck","nn","_didCollide","bn","newY","_isAddNodeIntercepted","parseHeight","val","heightUnit","isString","match","Error","parseFloat","unit","is_intercepted","create_stylesheet","remove_stylesheet","insert_css_rule","registeredPlugins","registerPlugin","pluginClass","push","resizable","el","opts","draggable","droppable","isDroppable","on","eventName","callback","idSeq","GridStackEngine","onchange","floatMode","items","float","_updateCounter","_float","_addedNodes","_removedNodes","batchUpdate","commit","_packNodes","_notify","getNodeDataByDOMEl","find","get","_fixCollisions","_sortNodes","hasLocked","locked","collisionNode","bind","moveNode","isAreaEmpty","each","i","_updating","_origY","_dirty","canBeMoved","take","_prepareNode","resizing","defaults","parseInt","autoPosition","noResize","noMove","args","Array","slice","call","deletedNodes","concat","getDirtyNodes","cleanNodes","filter","addNode","triggerAddEvent","maxWidth","Math","min","maxHeight","minWidth","minHeight","_id","floor","clone","removeNode","detachNode","without","canMoveNode","isNodeChangedPosition","clonedNode","extend","res","getGridHeight","canBePlacedWithRespectToHeight","noPack","lastTriedX","lastTriedY","lastTriedWidth","lastTriedHeight","reduce","memo","beginUpdate","endUpdate","GridStack","oneColumnMode","isAutoCellHeight","self","container","handle_class","handleClass","item_class","itemClass","placeholder_class","placeholderClass","placeholder_text","placeholderText","cell_height","cellHeight","vertical_margin","verticalMargin","min_width","static_grid","staticGrid","is_nested","isNested","always_show_resize_handle","alwaysShowResizeHandle","closest","length","attr","handle","auto","_class","random","toFixed","animate","autoHide","handles","scroll","appendTo","disableDrag","disableResize","rtl","removable","removeTimeout","verticalMarginUnit","cellHeightUnit","disableOneColumnMode","oneColumnModeClass","ddPlugin","first","dd","css","addClass","cellWidth","_setStaticClass","_initStyles","_updateStyles","elements","_this","children","_prepareElement","setAnimation","placeholder","hide","_updateContainerHeight","_updateHeightsOnResize","throttle","onResizeHandler","_isOneColumnMode","append","trigger","removeClass","resize","trashZone","accept","event","ui","data","_grid","_setupRemovingTimeout","_clearRemovingTimeout","acceptWidgets","draggingElement","onDrag","pos","getCellFromPixel","offset","_added","show","_beforeDragX","_beforeDragY","is","origNode","ceil","outerWidth","outerHeight","_temporary","unbind","detach","originalNode","_triggerRemoveEvent","removeAttr","enableSelection","removeData","_prepareElementsByNode","_triggerAddEvent","_triggerChangeEvent","forceTrigger","hasChanges","eventParams","_stylesId","_styles","_max","getHeight","prefix","nbRows","nbMargins","innerWidth","documentElement","clientWidth","body","_removeTimeout","setTimeout","_isAboutToRemove","clearTimeout","dragOrResize","round","position","left","top","type","size","_temporaryRemoved","onStartMoving","o","strictCellHeight","onEndMoving","forceNotify","nestedGrids","start","stop","drag","enable","addWidget","makeWidget","willItFit","removeWidget","removeAll","destroy","detachGrid","off","disable","movable","enableMove","doEnable","includeNewWidgets","enableResize","isNaN","_updateElement","move","update","noUpdate","heightData","useOffset","containerPos","relativeLeft","relativeTop","columnWidth","rowHeight","setStatic","staticValue","_updateNodeWidths","oldWidth","newWidth","undefined","setGridWidth","gridWidth","doNotPropagate","batch_update","_fix_collisions","is_area_empty","_sort_nodes","_pack_nodes","_prepare_node","clean_nodes","get_dirty_nodes","add_node","remove_node","can_move_node","move_node","get_grid_height","begin_update","end_update","can_be_placed_with_respect_to_height","_trigger_change_event","_init_styles","_update_styles","_update_container_height","_is_one_column_mode","_prepare_element","set_animation","add_widget","make_widget","will_it_fit","remove_widget","remove_all","min_height","_update_element","cell_width","get_cell_from_pixel","set_static","_set_static_class","GridStackUI","Engine","fn","gridstack","JQueryUIGridStackDragDropPlugin","Object","create","constructor","key","containment","parent"],"mappings":"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","file":"gridstack.all.js"} \ No newline at end of file diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js new file mode 100644 index 0000000000..4cc52254c0 --- /dev/null +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -0,0 +1,1300 @@ +/* globals $ load_modal TreeController, forced_title_callback, createVisualConsole, tinyMCE*/ +// eslint-disable-next-line no-unused-vars +function show_option_dialog(settings) { + load_modal({ + target: $("#modal-update-dashboard"), + form: "form-update-dashboard", + url: settings.url_ajax, + modal: { + title: settings.title, + cancel: settings.btn_cancel, + ok: settings.btn_text + }, + onshow: { + page: settings.url, + method: "drawFormDashboard", + extradata: { + dashboardId: settings.dashboardId + } + }, + onsubmit: { + page: settings.url, + method: "updateDashboard", + dataType: "json" + }, + ajax_callback: update_dashboard + }); +} + +function update_dashboard(data) { + if (data.error === 1) { + console.error(data.error_mesage); + return; + } + + $(".ui-dialog-content").dialog("close"); + var url = data.url + "&dashboardId=" + data.dashboardId; + location.replace(url); +} + +/** + * Onchange input switch private. + * @return {void} + */ +// eslint-disable-next-line no-unused-vars +function showGroup() { + $("#li-group").removeClass("hidden"); + + var private = $("#private").prop("checked"); + + if (private) { + $("#li-group").hide(); + } else { + $("#li-group").show(); + } +} + +// eslint-disable-next-line no-unused-vars +function initialiceLayout(data) { + var $grid = $(".grid-stack"); + $grid.gridstack({ + float: true, + column: 12, + alwaysShowResizeHandle: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( + navigator.userAgent + ), + resizable: { + handles: "e, se, s, sw, w" + }, + disableDrag: true, + disableResize: true, + draggable: false + }); + + var grid = $grid.data("gridstack"); + + var positionGrid = $grid[0].getBoundingClientRect(); + // var gridHeight = positionGrid.height; + var gridWidth = positionGrid.width; + + getCellsLayout(); + + function getCellsLayout() { + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "getCellsLayout", + dashboardId: data.dashboardId + }, + dataType: "json", + success: function(data) { + loadLayout(data); + }, + error: function(error) { + console.error(error); + return []; + } + }); + return false; + } + + function loadLayout(items) { + // Remove layout. + grid.removeAll(); + // Update. + grid.batchUpdate(); + // Add widgets. + items.forEach(function(item) { + var id = parseInt(item.id); + var position = item.position; + var widgetId = item.widgetId; + // Retrocompatibility old dashboard. + position = { + x: 0, + y: 0, + width: 4, + height: 4, + autoPosition: true, + minWidth: 0, + maxWidth: 2000, + minHeight: 0, + maxHeight: 2000 + }; + if (item.position !== "") { + position = JSON.parse(item.position); + } + addCell( + id, + position.x, + position.y, + position.width, + position.height, + position.autoPosition, + position.minWidth, + position.maxWidth, + position.minHeight, + position.maxHeight, + widgetId + ); + }); + // Commit. + grid.commit(); + return false; + } + + function addCell( + id, + x, + y, + width, + height, + autoPosition, + minWidth, + maxWidth, + minHeight, + maxHeight, + widgetId, + needSaveLayout = false + ) { + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "drawCell", + dashboardId: data.dashboardId, + cellId: id, + widgetId: widgetId, + gridWidth: gridWidth + }, + dataType: "html", + success: function(cellData) { + var elem = grid.addWidget( + cellData, + x, + y, + width, + height, + autoPosition, + minWidth, + maxWidth, + minHeight, + maxHeight, + id + ); + + // Add spinner. + var element = $("#widget-" + id); + element = element[0].querySelector(".content-widget"); + addSpinner(element); + + // Width and height. + var newWidth = elem.attr("data-gs-width"); + var newHeight = elem.attr("data-gs-height"); + + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "drawWidget", + dashboardId: data.dashboardId, + cellId: id, + widgetId: widgetId, + newWidth: newWidth, + newHeight: newHeight, + gridWidth: gridWidth + }, + dataType: "html", + success: function(widgetData) { + // Remove spinner. + removeSpinner(element); + $("#widget-" + id + " .content-widget").append(widgetData); + + $("#button-add-widget-" + id).click(function() { + addWidgetDialog(id); + }); + + if (!$("#checkbox-edit-mode").is(":checked")) { + $(".add-widget").hide(); + } else { + $(".new-widget-message").hide(); + } + + if (needSaveLayout === true) { + var parentElement = $("#widget-" + id).parent(); + grid.enableMove(parentElement, true); + grid.enableResize(parentElement, true); + grid.grid.float = false; + } + }, + error: function(error) { + console.error(error); + } + }); + + if (needSaveLayout === true) { + saveLayout(); + } + + if (!$("#checkbox-edit-mode").is(":checked")) { + $(".header-options").hide(); + } + + $("#delete-widget-" + id).click(function(event) { + var nodo = event.target.offsetParent; + deleteCell(id, nodo.parentNode); + }); + + $("#configure-widget-" + id).click(function() { + configurationWidget(id, widgetId); + }); + }, + error: function(error) { + console.error(error); + } + }); + } + + function saveLayout() { + var items = $(".grid-stack > .grid-stack-item:visible") + .map(function(i, el) { + el = $(el); + var node = el.data("_gridstack_node"); + return { + id: node.id, + x: node.x, + y: node.y, + width: node.width, + height: node.height + }; + }) + .toArray(); + + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "saveLayout", + dashboardId: data.dashboardId, + items: items + }, + dataType: "html", + success: function(data) { + console.log(data); + }, + error: function(error) { + console.error(error); + } + }); + + return false; + } + + function deleteCell(cellId, node) { + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + dashboardId: data.dashboardId, + method: "deleteCell", + cellId: cellId + }, + dataType: "json", + success: function(data) { + // For defect x and y = 0 + // width and height = 4 + // position auto = true. + if (data.result !== 0) { + grid.removeWidget(node); + saveLayout(); + } + }, + error: function(error) { + console.error(error); + } + }); + } + + function insertCellLayout() { + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "insertCellLayout", + dashboardId: data.dashboardId + }, + dataType: "json", + success: function(data) { + // For defect x and y = 0 + // width and height = 4 + // position auto = true. + if (data.cellId !== 0) { + addCell(data.cellId, 0, 0, 4, 4, true, 0, 2000, 0, 2000, 0, true); + } + }, + error: function(error) { + console.error(error); + } + }); + } + + function configurationWidget(cellId, widgetId) { + load_modal({ + target: $("#modal-config-widget"), + form: "form-config-widget", + url: data.url, + modal: { + title: "Configure widget", + cancel: "Cancel", + ok: "Ok" + }, + onshow: { + page: data.page, + method: "drawConfiguration", + extradata: { + cellId: cellId, + dashboardId: data.dashboardId, + widgetId: widgetId + }, + width: 450, + maxHeight: 600, + minHeight: 400 + }, + onsubmit: { + page: data.page, + method: "saveWidgetIntoCell", + dataType: "json", + preaction: function() { + if (tinyMCE != undefined && tinyMCE.editors.length > 0 && widgetId) { + // Content tiny. + var label = tinyMCE.activeEditor.getContent(); + $("#textarea_text").val(label); + } + } + }, + ajax_callback: update_widget_to_cell, + onsubmitClose: 1, + beforeClose: function() { + tinyMCE.remove("#textarea_text"); + tinyMCE.execCommand("mceRemoveControl", true, "textarea_text"); + } + }); + } + + function update_widget_to_cell(data) { + if (data.error === 1) { + console.error(data.text); + return; + } + + // Add spinner. + var element = $("#widget-" + data.cellId); + element = element[0].querySelector(".content-widget"); + addSpinner(element); + + // Width and height. + var newWidth = $("#widget-" + data.cellId) + .parent() + .attr("data-gs-width"); + + var newHeight = $("#widget-" + data.cellId) + .parent() + .attr("data-gs-height"); + + redraw(data.cellId, newWidth, newHeight, gridWidth, data.widgetId); + } + + // Operations. + // Add Widgets. + $("#add-widget").click(function() { + insertCellLayout(); + }); + + // Enable Layout. + $("#checkbox-edit-mode").click(function() { + if ($("#checkbox-edit-mode").is(":checked")) { + grid.movable(".grid-stack-item", true); + grid.resizable(".grid-stack-item", true); + grid.grid.float = false; + $(".header-options").show(); + $(".add-widget").show(); + $(".new-widget-message").hide(); + $("#container-layout").addClass("container-layout"); + $("#add-widget").show(); + } else { + grid.movable(".grid-stack-item", false); + grid.resizable(".grid-stack-item", false); + grid.grid.float = true; + $(".header-options").hide(); + $(".add-widget").hide(); + $(".new-widget-message").show(); + $("#container-layout").removeClass("container-layout"); + $("#add-widget").hide(); + } + }); + + // End drag. + $(".grid-stack").on("dragstop", function() { + setTimeout(function() { + saveLayout(); + }, 200); + }); + + // Start Resize. + $(".grid-stack").on("resizestart", function(event) { + var element = event.target.querySelector(".content-widget"); + addSpinner(element); + }); + + // End Resize. + $(".grid-stack").on("gsresizestop", function(event, elem) { + var grid = this; + + // Grid Height and Width. + var positionGrid = grid.getBoundingClientRect(); + // var gridHeight = positionGrid.height; + var gridWidth = positionGrid.width; + + // Width and height. + var newWidth = $(elem).attr("data-gs-width"); + var newHeight = $(elem).attr("data-gs-height"); + + var cellId = elem.getAttribute("data-gs-id"); + + redraw(cellId, newWidth, newHeight, gridWidth); + }); + + // Add Spinner + function addSpinner(element) { + var divParent = document.createElement("div"); + divParent.className = "div-dashboard-spinner"; + + var divSpinner = document.createElement("div"); + divSpinner.className = "dashboard-spinner"; + divParent.appendChild(divSpinner); + + element.innerHTML = ""; + + element.appendChild(divParent); + } + + // Remove Spinner + function removeSpinner(element) { + // Div resize. + var div = element.querySelector(".div-dashboard-spinner"); + if (div !== null) { + var parent = div.parentElement; + if (parent !== null) { + parent.removeChild(div); + } + } + } + + function addWidgetDialog(id) { + $("#modal-add-widget") + .dialog({ + title: "New Widget", + resizable: false, + modal: true, + overlay: { + opacity: 0.5, + background: "black" + }, + width: 600, + height: 600, + open: function() { + loadWidgetsDialog(id, 0); + } + }) + .show(); + } + + function loadWidgetsDialog(cellId, offset, search) { + $.ajax({ + method: "post", + url: data.url, + data: { + dashboardId: data.dashboardId, + page: data.page, + method: "drawAddWidget", + cellId: cellId, + offset: offset, + search: search + }, + dataType: "html", + success: function(data) { + $("#modal-add-widget").empty(); + $("#modal-add-widget").append(data); + $("a.pagination").click(function() { + var offset = $(this) + .attr("href") + .split("=") + .pop(); + + loadWidgetsDialog(cellId, offset, search); + }); + + document.getElementById("text-search-widget").focus(); + if (typeof search !== "undefined") { + document.getElementById("text-search-widget").value = ""; + document.getElementById("text-search-widget").value = search; + } + + $("input[name=search-widget]").on( + "keyup", + debounce(function() { + loadWidgetsDialog(cellId, 0, this.value); + }, 300) + ); + + $(".img-add-widget").click(function() { + // Empty and close modal. + $("#modal-add-widget").empty(); + $("#modal-add-widget").dialog("close"); + + // Extract Id widget + var widgetId = this.id.replace("img-add-widget-", ""); + + // Add spinner. + var element = $("#widget-" + cellId); + element = element[0].querySelector(".content-widget"); + addSpinner(element); + + // Width and height. + var newWidth = $("#widget-" + data.cellId) + .parent() + .attr("data-gs-width"); + + var newHeight = $("#widget-" + data.cellId) + .parent() + .attr("data-gs-height"); + + redraw(cellId, newWidth, newHeight, gridWidth, widgetId); + }); + }, + error: function(error) { + console.error(error); + } + }); + } + + function redraw(cellId, newWidth, newHeight, gridWidth, widgetId = 0) { + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "drawCell", + dashboardId: data.dashboardId, + cellId: cellId, + widgetId: widgetId, + gridWidth: gridWidth, + redraw: true + }, + dataType: "html", + success: function(cellData) { + var element = $("#widget-" + cellId); + + // Widget empty. + element.empty(); + + // Add Resize element. + element.append(cellData); + + // Add spinner. + var elementSpinner = element[0].querySelector(".content-widget"); + addSpinner(elementSpinner); + + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "drawWidget", + dashboardId: data.dashboardId, + cellId: cellId, + newWidth: newWidth, + newHeight: newHeight, + gridWidth: gridWidth, + widgetId: widgetId + }, + dataType: "html", + success: function(dataWidget) { + var element = $("#widget-" + cellId); + element = element[0].querySelector(".content-widget"); + removeSpinner(element); + + // Widget empty. + $("#widget-" + cellId + " .content-widget").empty(); + + // Add Resize element. + $("#widget-" + cellId + " .content-widget").append(dataWidget); + + $("#button-add-widget-" + cellId).click(function() { + addWidgetDialog(cellId); + }); + + if (!$("#checkbox-edit-mode").is(":checked")) { + $(".add-widget").hide(); + } else { + $(".new-widget-message").hide(); + } + }, + error: function(error) { + console.error(error); + } + }); + + if (!$("#checkbox-edit-mode").is(":checked")) { + $(".header-options").hide(); + } + + $("#delete-widget-" + cellId).click(function(event) { + var nodo = event.target.offsetParent; + deleteCell(cellId, nodo.parentNode); + }); + + $("#configure-widget-" + cellId).click(function() { + configurationWidget(cellId, widgetId); + }); + + saveLayout(); + } + }); + } +} + +/** + * Onchange input image. + * @return {void} + */ +// eslint-disable-next-line no-unused-vars +function imageIconChange(data) { + data = JSON.parse(atob(data)); + + var nameImg = document.getElementById("imageSrc").value; + + if (nameImg == 0) { + $("#li-image-item label").empty(); + return; + } + + $.ajax({ + method: "post", + url: data.url, + data: { + page: data.page, + method: "imageIconDashboardAjax", + nameImg: nameImg, + dashboardId: data.dashboardId + }, + dataType: "html", + success: function(data) { + $("#li-image-item label").empty(); + $("#li-image-item label").append(data); + }, + error: function(error) { + console.error(error); + } + }); +} + +/** + * Load network map. + * @return {void} + */ +// eslint-disable-next-line no-unused-vars +function dashboardLoadNetworkMap(settings) { + // Add spinner. + var element = document.getElementById("body_cell-" + settings.cellId); + + var divParent = document.createElement("div"); + divParent.id = "div-dashboard-spinner-" + settings.cellId; + divParent.className = "div-dashboard-spinner"; + var divSpinner = document.createElement("div"); + divSpinner.className = "dashboard-spinner"; + divParent.appendChild(divSpinner); + + element.appendChild(divParent); + + $.ajax({ + method: "post", + url: settings.url, + data: { + page: settings.page, + networkmap: 1, + networkmap_id: settings.networkmap_id, + x_offset: settings.x_offset, + y_offset: settings.y_offset, + zoom_dash: settings.zoom_dash, + id_user: settings.id_user, + hash: settings.hash + }, + dataType: "html", + success: function(data) { + $("#div-dashboard-spinner-" + settings.cellId).remove(); + $("#body_cell-" + settings.cellId).append(data); + }, + error: function(error) { + console.error(error); + } + }); +} + +/** + * Load Wux Stats map. + * @return {void} + */ +// eslint-disable-next-line no-unused-vars +function dashboardLoadWuxStats(settings) { + $.ajax({ + method: "post", + url: settings.url, + data: { + page: settings.page, + wux_transaction_stats: 1, + id_agent: settings.id_agent, + transaction: settings.transaction, + view_all_stats: settings.view_all_stats, + id_user: settings.id_user + }, + dataType: "html", + success: function(data) { + $("#body-cell-" + settings.cellId).append(data); + }, + error: function(error) { + console.error(error); + } + }); +} + +// eslint-disable-next-line no-unused-vars +function processTreeSearch(settings) { + var treeController = TreeController.getController(); + + // Clear the tree + if ( + typeof treeController.recipient != "undefined" && + treeController.recipient.length > 0 + ) { + treeController.recipient.empty(); + } + + var filters = {}; + filters.searchAgent = settings.searchAgent; + filters.statusAgent = settings.statusAgent; + filters.searchModule = settings.searchModule; + filters.statusModule = settings.statusModule; + filters.groupID = settings.searchGroup; + + $.ajax({ + type: "POST", + url: settings.ajaxUrl, + data: { + getChildren: 1, + page: settings.page, + id_user: settings.user, + hash: settings.hash, + type: settings.type, + filter: filters + }, + success: function(data) { + if (data.success) { + treeController.init({ + recipient: $("div#tree-controller-recipient_" + settings.cellId), + detailRecipient: { + render: function(element, data) { + return { + open: function() { + $("#module_details_window") + .hide() + .empty() + .append(data) + .dialog({ + resizable: true, + draggable: true, + modal: true, + title: "Info module", + overlay: { + opacity: 0.5, + background: "black" + }, + width: 450, + height: 500 + }); + } + }; + } + }, + page: settings.page, + emptyMessage: settings.translate.emptyMessage, + foundMessage: settings.translate.foundMessage, + tree: data.tree, + baseURL: settings.baseURL, + ajaxURL: settings.ajaxUrl, + filter: filters, + counterTitles: { + total: { + agents: settings.translate.total.agents, + modules: settings.translate.total.modules, + none: settings.translate.total.none + }, + alerts: { + agents: settings.translate.alerts.agents, + modules: settings.translate.alerts.modules, + none: settings.translate.alerts.none + }, + critical: { + agents: settings.translate.critical.agents, + modules: settings.translate.critical.modules, + none: settings.translate.critical.none + }, + warning: { + agents: settings.translate.warning.agents, + modules: settings.translate.warning.modules, + none: settings.translate.warning.none + }, + unknown: { + agents: settings.translate.unknown.agents, + modules: settings.translate.unknown.modules, + none: settings.translate.unknown.none + }, + not_init: { + agents: settings.translate.not_init.agents, + modules: settings.translate.not_init.modules, + none: settings.translate.not_init.none + }, + ok: { + agents: settings.translate.ok.agents, + modules: settings.translate.ok.modules, + none: settings.translate.ok.none + } + } + }); + + if (settings.openAllNodes) { + $("#widget-" + settings.cellId) + .find(".leaf-icon") + .click(); + } + } + }, + dataType: "json" + }); +} + +function show_module_detail_dialog( + module_id, + id_agent, + server_name, + offset, + period, + module_name +) { + var params = {}; + var f = new Date(); + period = $("#period").val(); + + params.selection_mode = $("input[name=selection_mode]:checked").val(); + if (!params.selection_mode) { + params.selection_mode = "fromnow"; + } + + params.date_from = $("#text-date_from").val(); + if (!params.date_from) { + params.date_from = + f.getFullYear() + "/" + (f.getMonth() + 1) + "/" + f.getDate(); + } + + params.time_from = $("#text-time_from").val(); + if (!params.time_from) { + params.time_from = f.getHours() + ":" + f.getMinutes(); + } + + params.date_to = $("#text-date_to").val(); + if (!params.date_to) { + params.date_to = + f.getFullYear() + "/" + (f.getMonth() + 1) + "/" + f.getDate(); + } + + params.time_to = $("#text-time_to").val(); + if (!params.time_to) { + params.time_to = f.getHours() + ":" + f.getMinutes(); + } + + params.page = "include/ajax/module"; + params.get_module_detail = 1; + params.server_name = server_name; + params.id_agent = id_agent; + params.id_module = module_id; + params.offset = offset; + params.period = period; + + $.ajax({ + type: "POST", + url: "ajax.php", + data: params, + dataType: "html", + success: function(data) { + $("#module_details_window") + .hide() + .empty() + .append(data) + .dialog({ + resizable: true, + draggable: true, + modal: true, + title: "Module: " + module_name, + overlay: { + opacity: 0.5, + background: "black" + }, + width: 650, + height: 500 + }) + .show(); + refresh_pagination_callback( + module_id, + id_agent, + server_name, + module_name + ); + //datetime_picker_callback(); + forced_title_callback(); + } + }); +} +/* +function datetime_picker_callback() { + $("#text-time_from, #text-time_to").timepicker({ + showSecond: true, + timeFormat: settings.timeFormat, + timeOnlyTitle: settings.translate.timeOnlyTitle, + timeText: settings.translate.timeText, + hourText: settings.translate.hourText, + minuteText: settings.translate.minuteText, + secondText: settings.translate.secondText, + currentText: settings.translate.currentText, + closeText: settings.translate.closeText + }); + + $.datepicker.setDefaults($.datepicker.regional[settings.userLanguage]); + $("#text-date_from, #text-date_to").datepicker({ + dateFormat: settings.dateFormat + }); +}*/ + +function refresh_pagination_callback( + module_id, + id_agent, + server_name, + module_name +) { + $(".binary_dialog").click(function() { + var classes = $(this).attr("class"); + classes = classes.split(" "); + var offset_class = classes[2]; + offset_class = offset_class.split("_"); + var offset = offset_class[1]; + + var period = $("#period").val(); + + show_module_detail_dialog( + module_id, + id_agent, + server_name, + offset, + period, + module_name + ); + return false; + }); +} + +// eslint-disable-next-line no-unused-vars +function dashboardLoadVC(settings) { + var container = document.getElementById( + "visual-console-container-" + settings.cellId + ); + + // Add the datetime when the item was received. + var receivedAt = new Date(); + + var beforeUpdate = function(items, visualConsole, props) { + // Add the datetime when the item was received. + items.map(function(item) { + item["receivedAt"] = receivedAt; + return item; + }); + + var ratio_visualconsole = props.height / props.width; + + props.width = settings.size.width; + props.height = settings.size.width * ratio_visualconsole; + + if (props.height > settings.size.height) { + props.height = settings.size.height; + props.width = settings.size.height / ratio_visualconsole; + } + + // Update the data structure. + visualConsole.props = props; + // Update the items. + visualConsole.updateElements(items); + }; + + var handleUpdate = function(prevProps, newProps) { + if (!newProps) return; + + //Remove spinner change VC. + document + .getElementById("visual-console-container" + settings.cellId) + .classList.remove("is-updating"); + + var div = document + .getElementById("visual-console-container" + settings.cellId) + .querySelector(".div-visual-console-spinner"); + + if (div !== null) { + var parent = div.parentElement; + if (parent !== null) { + parent.removeChild(div); + } + } + + // Change the links. + if (prevProps && prevProps.id !== newProps.id) { + var regex = /(id=|id_visual_console=|id_layout=|id_visualmap=)\d+(&?)/gi; + var replacement = "$1" + newProps.id + "$2"; + + // Tab links. + var menuLinks = document.querySelectorAll("div#menu_tab a"); + if (menuLinks !== null) { + menuLinks.forEach(function(menuLink) { + menuLink.href = menuLink.href.replace(regex, replacement); + }); + } + } + }; + + settings.items.map(function(item) { + item["receivedAt"] = receivedAt; + return item; + }); + + createVisualConsole( + container, + settings.props, + settings.items, + settings.baseUrl, + 300 * 1000, + handleUpdate, + beforeUpdate, + settings.size + ); +} + +// eslint-disable-next-line no-unused-vars +function dashboardShowEventDialog(settings) { + settings = JSON.parse(atob(settings)); + $.ajax({ + method: "post", + url: settings.ajaxUrl, + data: { + page: settings.page, + get_extended_event: 1, + event: settings.event, + dialog_page: "", + meta: 0, + history: 0, + filter: [] + }, + dataType: "html", + success: function(data) { + $("#event_details_window") + .hide() + .empty() + .append(data) + .dialog({ + title: settings.event.evento, + resizable: true, + draggable: true, + modal: true, + close: function() { + //$("#refrcounter").countdown("resume"); + //$("div.vc-countdown").countdown("resume"); + }, + overlay: { + opacity: 0.5, + background: "black" + }, + width: 710, + height: 600 + }) + .show(); + + $.post({ + url: settings.ajaxUrl, + data: { + page: "include/ajax/events", + get_comments: 1, + event: settings.event, + filter: [] + }, + dataType: "html", + success: function(data) { + $("#extended_event_comments_page").empty(); + $("#extended_event_comments_page").html(data); + } + }); + + //$("#refrcounter").countdown("pause"); + //$("div.vc-countdown").countdown("pause"); + + switch (settings.result) { + case "comment_ok": + $("#notification_comment_success").show(); + break; + case "comment_error": + $("#notification_comment_error").show(); + break; + case "status_ok": + $("#notification_status_success").show(); + break; + case "status_error": + $("#notification_status_error").show(); + break; + case "owner_ok": + $("#notification_owner_success").show(); + break; + case "owner_error": + $("#notification_owner_error").show(); + break; + } + + forced_title_callback(); + }, + error: function(error) { + console.error(error); + } + }); +} + +// eslint-disable-next-line no-unused-vars +function dashboardInitTinyMce(url) { + // Initialice. + tinyMCE.init({ + selector: "#textarea_text", + theme: "advanced", + content_css: url + "include/styles/pandora.css", + theme_advanced_font_sizes: + "4pt=.visual_font_size_4pt, " + + "6pt=.visual_font_size_6pt, " + + "8pt=.visual_font_size_8pt, " + + "10pt=.visual_font_size_10pt, " + + "12pt=.visual_font_size_12pt, " + + "14pt=.visual_font_size_14pt, " + + "18pt=.visual_font_size_18pt, " + + "24pt=.visual_font_size_24pt, " + + "28pt=.visual_font_size_28pt, " + + "36pt=.visual_font_size_36pt, " + + "48pt=.visual_font_size_48pt, " + + "60pt=.visual_font_size_60pt, " + + "72pt=.visual_font_size_72pt, " + + "84pt=.visual_font_size_84pt, " + + "96pt=.visual_font_size_96pt, " + + "116pt=.visual_font_size_116pt, " + + "128pt=.visual_font_size_128pt, " + + "140pt=.visual_font_size_140pt, " + + "154pt=.visual_font_size_154pt, " + + "196pt=.visual_font_size_196pt", + theme_advanced_toolbar_location: "top", + theme_advanced_toolbar_align: "left", + theme_advanced_buttons1: + "bold,italic, |,justifyleft, justifycenter, justifyright, |, undo, redo, |, image, link", + theme_advanced_buttons2: "fontselect, forecolor, fontsizeselect, |,code", + theme_advanced_buttons3: "", + theme_advanced_statusbar_location: "none", + body_class: "", + forced_root_block: false, + force_p_newlines: false, + force_br_newlines: true, + convert_newlines_to_brs: false, + remove_linebreaks: true + }); +} + +function debounce(func, wait, immediate) { + var timeout; + return function() { + var context = this, + args = arguments; + var later = function() { + timeout = null; + if (!immediate) func.apply(context, args); + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) func.apply(context, args); + }; +} + +// eslint-disable-next-line no-unused-vars +function formSlides(settings) { + load_modal({ + target: $("#modal-update-dashboard"), + form: "slides-form", + url: settings.url_ajax, + modal: { + title: settings.title, + cancel: settings.btn_cancel, + ok: settings.btn_text + }, + onshow: { + page: settings.url, + method: "formSlides", + extradata: { + dashboardId: settings.dashboardId + }, + width: 250 + } + }); +} + +// eslint-disable-next-line no-unused-vars +function loadSliceWidget(settings) { + settings = JSON.parse(settings); + var width = $(window).width(); + $.ajax({ + method: "post", + url: settings.url, + data: { + page: settings.page, + method: "drawWidget", + dashboardId: settings.dashboardId, + cellId: settings.cellId, + newWidth: 12, + newHeight: 12, + gridWidth: width, + widgetId: settings.widgetId + }, + dataType: "html", + success: function(dataWidget) { + // Widget empty. + $("#view-slides-cell-mode").empty(); + + // Add Resize element. + $("#view-slides-cell-mode").append(dataWidget); + }, + error: function(error) { + console.error(error); + } + }); +} diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 8f23339692..8a2546ad09 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1,7 +1,6 @@ /*global jQuery,$,forced_title_callback,Base64, dt_events*/ // Show the modal window of an event -var current_event; function show_event_dialog(event, dialog_page, result) { var ajax_file = $("#hidden-ajax_file").val(); @@ -9,8 +8,6 @@ function show_event_dialog(event, dialog_page, result) { dialog_page = "general"; } - current_event = event; - try { event = JSON.parse(atob(event)); } catch (e) { @@ -480,7 +477,9 @@ function event_change_status(event_ids) { } if (data == "status_ok") { - dt_events.draw(false); + if (typeof dt_events !== "undefined") { + dt_events.draw(false); + } $("#notification_status_success").show(); } else { $("#notification_status_error").show(); @@ -526,7 +525,9 @@ function event_change_owner() { } if (data == "owner_ok") { - dt_events.draw(false); + if (typeof dt_events !== "undefined") { + dt_events.draw(false); + } $("#notification_owner_success").show(); if (new_owner == -1) { $("#extended_event_general_page table td.general_owner").html( @@ -547,7 +548,7 @@ function event_change_owner() { } // Save a comment into an event -function event_comment() { +function event_comment(current_event) { var event; try { event = JSON.parse(atob(current_event)); @@ -558,8 +559,15 @@ function event_comment() { var event_id = event.id_evento; var comment = $("#textarea_comment").val(); - var meta = $("#hidden-meta").val(); - var history = $("#hidden-history").val(); + var meta = 0; + if ($("#hidden-meta").val() != undefined) { + meta = $("#hidden-meta").val(); + } + + var history = 0; + if ($("#hidden-history").val() != undefined) { + history = $("#hidden-history").val(); + } if (comment == "") { show_event_dialog(current_event, "comments", "comment_error"); diff --git a/pandora_console/include/javascript/pandora_ui.js b/pandora_console/include/javascript/pandora_ui.js index 4342c8381e..14804d7ab5 100644 --- a/pandora_console/include/javascript/pandora_ui.js +++ b/pandora_console/include/javascript/pandora_ui.js @@ -300,6 +300,9 @@ function load_modal(settings) { } else { // No onsumbit configured. Directly close. $(this).dialog("close"); + if (document.getElementById(settings.form) != undefined) { + document.getElementById(settings.form).submit(); + } } }, error: function(data) { diff --git a/pandora_console/include/javascript/pandora_visual_console.js b/pandora_console/include/javascript/pandora_visual_console.js index 0e0a21659b..6e7fd0fe47 100755 --- a/pandora_console/include/javascript/pandora_visual_console.js +++ b/pandora_console/include/javascript/pandora_visual_console.js @@ -26,7 +26,9 @@ function createVisualConsole( items, baseUrl, updateInterval, - onUpdate + onUpdate, + beforeUpdate, + size ) { if (container == null || props == null || items == null) return null; if (baseUrl == null) baseUrl = ""; @@ -43,6 +45,7 @@ function createVisualConsole( var abortable = loadVisualConsoleData( baseUrl, visualConsoleId, + size, function(error, data) { if (error) { //Remove spinner change VC. @@ -82,18 +85,23 @@ function createVisualConsole( ? JSON.parse(data.items) : data.items; - // Add the datetime when the item was received. var receivedAt = new Date(); - items.map(function(item) { - item["receivedAt"] = receivedAt; - return item; - }); - var prevProps = visualConsole.props; - // Update the data structure. - visualConsole.props = props; - // Update the items. - visualConsole.updateElements(items); + if (beforeUpdate) { + beforeUpdate(items, visualConsole, props); + } else { + // Add the datetime when the item was received. + items.map(function(item) { + item["receivedAt"] = receivedAt; + return item; + }); + + // Update the data structure. + visualConsole.props = props; + // Update the items. + visualConsole.updateElements(items); + } + // Emit the VC update event. if (onUpdate) onUpdate(prevProps, visualConsole.props); } catch (ignored) {} // eslint-disable-line no-empty @@ -619,7 +627,7 @@ function createVisualConsole( * @return {Object} Cancellable. Object which include and .abort([statusText]) function. */ // eslint-disable-next-line no-unused-vars -function loadVisualConsoleData(baseUrl, vcId, callback) { +function loadVisualConsoleData(baseUrl, vcId, size, callback) { // var apiPath = baseUrl + "/include/rest-api"; var apiPath = baseUrl + "/ajax.php"; var vcJqXHR = null; @@ -695,6 +703,7 @@ function loadVisualConsoleData(baseUrl, vcId, callback) { { page: "include/rest-api/index", getVisualConsoleItems: 1, + size: size, visualConsoleId: vcId }, "json" diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 868d5b748a..eaac70d8ec 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -1086,7 +1086,10 @@ var TreeController = { } controller.recipient.empty(); - if (controller.tree.length !== undefined) { + if ( + controller.tree.length !== undefined && + controller.foundMessage !== "not" + ) { controller.recipient.html( "
" + controller.foundMessage + diff --git a/pandora_console/include/lib/Dashboard/Cell.php b/pandora_console/include/lib/Dashboard/Cell.php new file mode 100644 index 0000000000..df93bbdfec --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Cell.php @@ -0,0 +1,240 @@ +dashboardId = $dashboardId; + + // Check exists Cell id. + if (is_array($data) === false && empty($data) === false) { + $this->cellId = $data; + } else { + $this->cellId = $this->set($data); + } + + $this->fieldsCell = $this->get(); + return $this; + } + + + /** + * Retrieve a cell definition. + * + * @return array cell data. + */ + public function get() + { + global $config; + + $sql = sprintf( + 'SELECT * + FROM twidget_dashboard + WHERE id = %d', + $this->cellId + ); + + $data = \db_get_row_sql($sql); + + if ($data === false) { + return []; + } + + return $data; + } + + + /** + * Create Cell widget layout. + * + * @param array $position Array position widgets. + * + * @return integer + */ + public function set(array $position):int + { + global $config; + + if (isset($position['order']) === true) { + $order = $position['order']; + unset($position['order']); + } else { + $order = count(self::getCells($this->dashboardId)); + } + + $position = json_encode($position); + + $values = [ + 'id_dashboard' => $this->dashboardId, + 'position' => $position, + 'order' => $order, + ]; + + // Insert. + $res = \db_process_sql_insert( + 'twidget_dashboard', + $values + ); + + if ($res === false) { + $res = 0; + } + + return $res; + } + + + /** + * Save Cell widget layout. + * + * @param array $position Array position widgets. + * @param integer|null $idWidget Id widget insert to cell. + * @param array $options Options for widget. + * + * @return integer + */ + public function put( + array $position=[], + ?int $idWidget=null, + array $options=[] + ):int { + global $config; + + // Position. + if (empty($position) !== true) { + $order = 0; + if (isset($position['order']) === true) { + $order = $position['order']; + unset($position['order']); + } + + $position = json_encode($position); + } else { + $order = $this->fieldsCell['order']; + $position = $this->fieldsCell['position']; + } + + // Id widget. + if (isset($idWidget) === false) { + $idWidget = $this->fieldsCell['id_widget']; + } + + // Options for widget. + if (empty($options) !== true) { + $options = json_encode($options); + } else { + $options = $this->fieldsCell['options']; + } + + // Values. + $values = [ + 'id_dashboard' => $this->dashboardId, + 'position' => $position, + 'options' => $options, + 'order' => $order, + 'id_widget' => $idWidget, + ]; + + // Update. + $res = \db_process_sql_update( + 'twidget_dashboard', + $values, + ['id' => $this->cellId] + ); + + if ($res === false) { + $res = 0; + } + + return $res; + } + + + /** + * Remove Cell layout. + * + * @return integer + */ + public function delete():int + { + global $config; + + // Delete. + $res = db_process_sql_delete( + 'twidget_dashboard', + ['id' => $this->cellId] + ); + if ($res === false) { + $res = 0; + } + + return $res; + } + + + /** + * Get Cells widget. + * + * @param integer $dashboardId Id dashboard. + * + * @return array + */ + public static function getCells(int $dashboardId):array + { + global $config; + + $cells = db_get_all_rows_filter( + 'twidget_dashboard', + [ + 'id_dashboard' => $dashboardId, + 'order' => [ + 'order' => 'ASC', + 'field' => \db_encapsule_fields_with_same_name_to_instructions('order'), + ], + ] + ); + + if (empty($cells) === true) { + return []; + } + + return $cells; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Manager.php b/pandora_console/include/lib/Dashboard/Manager.php new file mode 100644 index 0000000000..8671e64e3a --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Manager.php @@ -0,0 +1,1321 @@ +isAdmin = (bool) \is_user_admin($config['id_user']); + + // Groups user access. + $this->groups = array_keys( + \users_get_groups( + $config['id_user'], + 'RR', + true + ) + ); + + // String groups for query. + $this->stringGroups = \io_safe_output( + implode( + ', ', + array_keys($this->groups) + ) + ); + + // Urls. + $this->url = \ui_get_full_url( + 'index.php?sec=reporting&sec2=operation/dashboard/dashboard' + ); + $this->ajaxController = $page; + + // ACL Dashboards. + $this->writeDashboards = \check_acl($config['id_user'], 0, 'RW'); + $this->manageDashboards = \check_acl($config['id_user'], 0, 'RM'); + + // Operations Dashboards. + $this->deleteDashboard = (bool) \get_parameter('deleteDashboard', 0); + $this->copyDashboard = (bool) \get_parameter('copyDashboard', 0); + $this->createDashboard = \get_parameter('createDashboard', null); + $this->updateDashboard = \get_parameter('updateDashboard', null); + + $this->slides = (int) \get_parameter('slides', 0); + $extradata = \get_parameter('extradata', ''); + if (empty($extradata) === false) { + $extradata = json_decode(\io_safe_output($extradata), true); + $this->dashboardId = (int) $extradata['dashboardId']; + $this->cellId = (int) $extradata['cellId']; + $this->offset = (int) $extradata['offset']; + $this->widgetId = (int) $extradata['widgetId']; + } else { + $this->cellId = (int) \get_parameter('cellId', []); + $this->offset = (int) \get_parameter('offset', 0); + + $this->dashboardId = (int) \get_parameter('dashboardId', 0); + if ($this->slides === 1) { + $this->slidesIds = (array) \get_parameter('slidesIds'); + $this->cellModeSlides = (int) \get_parameter( + 'cellModeSlides', + 0 + ); + if ($this->dashboardId === 0) { + $this->dashboardId = (int) $this->slidesIds[0]; + } + } + + $this->widgetId = (int) \get_parameter('widgetId', 0); + } + + if ($this->dashboardId !== 0) { + $this->dashboardFields = $this->get(); + $this->cells = Cell::getCells($this->dashboardId); + } + + $this->refr = (int) get_parameter('refr', 0); + $this->refr = (empty($this->refr) === false) ? $this->refr : $config['vc_refr']; + } + + + /** + * Instance Widget. + * + * @param integer|null $width Width. + * @param integer|null $height Height. + * @param integer|null $gridWidth Width Grid. + * + * @return object + */ + private function instanceWidget( + ?int $width=0, + ?int $height=0, + ?int $gridWidth=0 + ):object { + global $config; + + if ($this->widgetId === 0) { + $cellClass = new Cell($this->cellId, $this->dashboardId); + $dataCell = $cellClass->get(); + $this->widgetId = $dataCell['id_widget']; + } + + $this->cWidget = new Widget( + $this->cellId, + $this->dashboardId, + $this->widgetId + ); + + $widgetData = $this->cWidget->get(); + + // Include widget if necesary. + $urlWidget = $config['homedir']; + $urlWidget .= '/include/lib/Dashboard/Widgets/'; + $urlWidget .= $widgetData['page']; + include_once $urlWidget; + + $class = new \ReflectionClass($this); + $nameSpace = $class->getNamespaceName(); + + // Rename Old bad name class. + if ($widgetData['class_name'] === 'TopN_event_by_group') { + $widgetData['class_name'] = 'TopNEventByGroupWidget'; + } else if ($widgetData['class_name'] === 'TopN_event_by_module') { + $widgetData['class_name'] = 'TopNEventByModuleWidget'; + } + + $className = $nameSpace.'\\'.$widgetData['class_name']; + + // Hack: class_name is the name of the widget class to create. + $instance = new $className( + $this->cellId, + $this->dashboardId, + $this->widgetId, + $width, + $height, + $gridWidth + ); + + return $instance; + } + + + /** + * Retrieve a dashboard definition. + * + * @return array dashboard data. + */ + private function get() + { + global $config; + + $sql = sprintf( + 'SELECT * + FROM tdashboard + WHERE id = %d', + $this->dashboardId + ); + + if ($this->isAdmin !== true) { + $sql = sprintf( + "SELECT * + FROM tdashboard + WHERE id = %d + AND (id_group IN (%s) AND id_user = '') OR id_user = '%s'", + $this->dashboardId, + $this->stringGroups, + $config['id_user'] + ); + } + + $data = \db_get_row_sql($sql); + + if ($data === false) { + return []; + } + + return $data; + } + + + /** + * Insert dashboard item. + * + * @param array $data Array data Insert. + * + * @return integer + */ + public function set(array $data):int + { + global $config; + + // Insert. + $result = \db_process_sql_insert( + 'tdashboard', + $data + ); + + if ($result === false) { + $result = 0; + } + + return $result; + } + + + /** + * Update local object attributes and updates the DB. + * + * @param array $values Values to be updated. + * + * @return array Result of set operation. + */ + public function put(array $values) : array + { + global $config; + + $result = [ + 'error' => false, + 'msg_error' => '', + 'result' => 0, + ]; + + // Update. + $res = \db_process_sql_update( + 'tdashboard', + $values, + ['id' => $this->dashboardId] + ); + + $result['result'] = $res; + if ($res === false) { + $result = [ + 'error' => true, + 'msg_error' => $config['dbconnection']->error, + 'result' => $res, + ]; + } + + return $result; + } + + + /** + * Delete Dashboard. + * + * @return boolean + */ + public function delete() + { + global $config; + + $result = 0; + if ($this->manageDashboards === 1) { + $result = \db_process_sql_delete( + 'tdashboard', + ['id' => $this->dashboardId] + ); + } + + // Audit. + if ($result !== 0) { + \db_pandora_audit( + 'Dashboard management', + 'Delete dashboard #'.$this->dashboardId + ); + } else { + \db_pandora_audit( + 'Dashboard management', + 'Fail try to delete dashboard #'.$this->dashboardId + ); + } + + return $result; + } + + + /** + * Copy Dashboard and asociate widgets. + * + * @return integer + */ + public function copy():int + { + $result = true; + + // Name copy change. + $name = __('Copy of %s', $this->dashboardFields['name']); + $i = 1; + while (true) { + $exists = db_get_value( + 'name', + 'tdashboard', + 'name', + $name + ); + if (empty($exists) === true) { + break; + } else { + $name = $name.' ('.$i.')'; + } + + $i++; + } + + $values = [ + 'name' => $name, + 'id_user' => $this->dashboardFields['id_user'], + 'id_group' => $this->dashboardFields['id_group'], + 'active' => $this->dashboardFields['active'], + 'cells' => $this->dashboardFields['cells'], + 'cells_slideshow' => $this->dashboardFields['cells_slideshow'], + ]; + + $id = $this->set($values); + + if (empty($id) === true) { + $result = 0; + } else { + $cells = Cell::getCells($this->dashboardId); + foreach ($cells as $cell) { + // Remove Id. + unset($cell['id']); + // Change Id dashboard. + $cell['id_dashboard'] = $id; + + $result = db_process_sql_insert('twidget_dashboard', $cell); + + if (empty($result) === true) { + $result = 0; + break; + } + } + + // Clean database. + if ($result === 0) { + db_process_sql_delete( + 'tdashboard', + ['id' => $id] + ); + db_process_sql_delete( + 'twidget_dashboard', + ['id_dashboard' => $id] + ); + } + } + + return $result; + } + + + /** + * Get all dashboard user can you see. + * + * @param integer $offset Offset query. + * @param integer $limit Limit query. + * @param boolean $favourite Fovorite dashboard. + * @param boolean $slideshow Slideshow Mode. + * + * @return array + */ + static public function getDashboards( + int $offset=-1, + int $limit=-1, + bool $favourite=false, + bool $slideshow=false + ):array { + global $config; + + $sql_limit = ''; + if ($offset !== -1 && $limit !== -1) { + $sql_limit = ' LIMIT '.$offset.','.$limit; + } + + $sql_where = ''; + if ($favourite === true) { + $sql_where .= 'AND td.active = 1'; + } + + if ($slideshow === true) { + $sql_where .= 'AND td.cells_slideshow = 1'; + } + + // Check ACl. + if (\is_user_admin($config['id_user']) !== true) { + // User no admin see dashboards of him groups and profile 'AR'. + $group_list = \users_get_groups( + $config['id_user'], + 'RR', + true + ); + + if ($group_list === false) { + $group_list = []; + } + + if (empty($group_list) === false) { + $string_groups = implode(', ', array_keys($group_list)); + $string_groups = \io_safe_output($string_groups); + + // Select user's dashboards. + $sql_dashboard = sprintf( + "SELECT td.id, + td.name, + td.id_user, + td.id_group, + td.active, + count(twd.id) as cells, + td.cells_slideshow + FROM tdashboard td + LEFT JOIN twidget_dashboard twd + ON td.id = twd.id_dashboard + WHERE (td.id_group IN (%s) AND td.id_user = '') OR + td.id_user = '%s' %s + GROUP BY td.id + ORDER BY name%s", + $string_groups, + $config['id_user'], + $sql_where, + $sql_limit + ); + } else { + $sql_dashboard = sprintf( + "SELECT td.id, + td.name, + td.id_user, + td.id_group, + td.active, + count(twd.id) as cells, + td.cells_slideshow + FROM tdashboard td + LEFT JOIN twidget_dashboard twd + ON td.id = twd.id_dashboard + WHERE td.id_group = 0 AND td.id_user = '%s' %s + GROUP BY td.id + ORDER BY name%s", + $config['id_user'], + $sql_where, + $sql_limit + ); + } + } else { + // User admin view all dashboards. + $sql_dashboard = sprintf( + 'SELECT td.id, + td.name, + td.id_user, + td.id_group, + td.active, + count(twd.id) as cells, + td.cells_slideshow + FROM tdashboard td + LEFT JOIN twidget_dashboard twd + ON td.id = twd.id_dashboard + WHERE 1=1 %s + GROUP BY td.id + ORDER BY name%s', + $sql_where, + $sql_limit + ); + } + + $dashboards = \db_get_all_rows_sql($sql_dashboard); + + if ($dashboards === false) { + $dashboards = []; + } + + return $dashboards; + } + + + /** + * Get all dashboard user can you see. + * + * @return array Return counts. + */ + static public function getDashboardsCount() + { + global $config; + + if (is_user_admin($config['id_user']) !== false) { + // User no admin see dashboards of him groups and profile 'AR'. + $group_list = \users_get_groups( + $config['id_user'], + 'RR', + true + ); + + if ($group_list === false) { + $group_list = []; + } + + if (empty($group_list) === false) { + $string_groups = implode(', ', array_keys($group_list)); + $string_groups = io_safe_output($string_groups); + + $sql_dashboard = sprintf( + "SELECT COUNT(*) + FROM tdashboard + WHERE (id_group IN (%s) AND id_user = '') OR + id_user = '%s'", + $string_groups, + $config['id_user'] + ); + } else { + $sql_dashboard = sprintf( + "SELECT COUNT(*) + FROM tdashboard + WHERE id_group = 0 AND id_user = '%s'", + $config['id_user'] + ); + } + } else { + $sql_dashboard = 'SELECT COUNT(*) FROM tdashboard'; + } + + $count_dashboards = db_get_all_rows_sql($sql_dashboard); + + if ($count_dashboards === false) { + $count_dashboards = []; + } + + return $count_dashboards[0]['COUNT(*)']; + } + + + /** + * Checks if target method is available to be called using AJAX. + * + * @param string $method Target method. + * + * @return boolean True allowed, false not. + */ + public function ajaxMethod(string $method):bool + { + return in_array($method, $this->AJAXMethods); + } + + + /** + * Init manager dashboard. + * + * @return void + */ + public function run() + { + global $config; + + ui_require_css_file('modal'); + ui_require_css_file('form'); + + if ($this->dashboardId === 0 + || $this->deleteDashboard === true + || $this->copyDashboard === true + ) { + $this->showList(); + } else { + $this->drawLayout(); + } + } + + + /** + * Draw list dashboards. + * + * @return void + */ + private function showList() + { + global $config; + + $limit_sql = $config['block_size']; + + $resultDelete = null; + if ($this->deleteDashboard === true) { + $resultDelete = $this->delete(); + } + + $resultCopy = null; + if ($this->copyDashboard === true) { + $resultCopy = $this->copy(); + } + + $dashboards = $this->getDashboards($this->offset, $limit_sql); + $count = $this->getDashboardsCount(); + + View::render( + 'dashboard/list', + [ + 'dashboards' => $dashboards, + 'count' => $count, + 'offset' => $this->offset, + 'urlDashboard' => $this->url, + 'manageDashboards' => $this->manageDashboards, + 'writeDashboards' => $this->writeDashboards, + 'resultDelete' => $resultDelete, + 'resultCopy' => $resultCopy, + 'ajaxController' => $this->ajaxController, + 'urlAjax' => \ui_get_full_url('ajax.php'), + + ] + ); + } + + + /** + * Form Upadte dashboards. + * + * @return void + */ + public function drawFormDashboard() + { + View::render( + 'dashboard/formDashboard', + [ + 'dashboardId' => $this->dashboardId, + 'arrayDashboard' => $this->dashboardFields, + ] + ); + } + + + /** + * Update dashboards. + * + * @return mixed + */ + public function updateDashboard() + { + global $config; + + $name = \get_parameter('name', ''); + $private = \get_parameter_switch('private'); + $id_group = \get_parameter('id_group'); + $slideshow = \get_parameter_switch('slideshow'); + $favourite = \get_parameter_switch('favourite'); + + $id_user = (empty($private) === false) ? $config['id_user'] : ''; + + $values = [ + 'name' => $name, + 'id_user' => $id_user, + 'id_group' => $id_group, + 'cells_slideshow' => $slideshow, + 'active' => $favourite, + ]; + + if ($this->dashboardId === 0) { + $this->dashboardId = $this->set($values); + $res = $this->dashboardId; + if ($res !== false) { + // Create Initial Widget. + $values = [ + 'x' => '0', + 'y' => '0', + 'width' => '4', + 'height' => '4', + ]; + $cellClass = new Cell($values, $this->dashboardId); + $dataCell = $cellClass->get(); + } + + $type = '&createDashboard=1'; + $type .= '&cellIdCreate='.$dataCell['id']; + } else { + $res = $this->put($values); + } + + $result = [ + 'error' => ($res === false) ? 1 : 0, + 'error_mesage' => __('Error create or update dashboard'), + 'url' => $this->url.$type, + 'dashboardId' => $this->dashboardId, + ]; + + exit(json_encode($result)); + + } + + + /** + * Draw layout. + * + * @return mixed + */ + public function drawLayout() + { + global $config; + + $dashboards = $this->getDashboards(); + $dashboards = array_reduce( + $dashboards, + function ($carry, $item) { + $carry[$item['id']] = $item['name']; + return $carry; + }, + [] + ); + + // Header. + if ($this->slides === 0) { + View::render( + 'dashboard/header', + [ + 'dashboards' => $dashboards, + 'ajaxController' => $this->ajaxController, + 'dashboardId' => $this->dashboardId, + 'refr' => $this->refr, + 'url' => $this->url, + 'dashboardName' => $this->dashboardFields['name'], + ] + ); + } else { + View::render( + 'dashboard/slides', + [ + 'dashboard' => $this->dashboardFields, + 'ajaxController' => $this->ajaxController, + 'dashboardId' => $this->dashboardId, + 'refr' => $this->refr, + 'url' => $this->url, + 'dashboardName' => $this->dashboardFields['name'], + 'slides' => $this->slides, + 'slidesIds' => $this->slidesIds, + 'cells' => $this->cells, + 'cellModeSlides' => $this->cellModeSlides, + 'cellId' => ($this->cellId === 0) ? $this->cells[0]['id'] : $this->cellId, + ] + ); + } + + // View. + if ($this->slides === 0 || $this->cellModeSlides === 0) { + View::render( + 'dashboard/layout', + [ + 'ajaxController' => $this->ajaxController, + 'dashboardId' => $this->dashboardId, + 'url' => \ui_get_full_url('ajax.php'), + 'createDashboard' => $this->createDashboard, + 'updateDashboard' => $this->updateDashboard, + 'cellIdCreate' => get_parameter('cellIdCreate', 0), + ] + ); + } else { + $this->cellId = ($this->cellId === 0) ? $this->cells[0]['id'] : $this->cellId; + + $cellClass = new Cell($this->cellId, $this->dashboardId); + $cellData = $cellClass->get(); + + $instance = ''; + if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) { + $settings = [ + 'page' => $this->ajaxController, + 'url' => \ui_get_full_url('ajax.php'), + 'dashboardId' => $this->dashboardId, + 'widgetId' => $cellData['id_widget'], + 'cellId' => $this->cellId, + ]; + } else { + // TODO:XXX + $output = 'no tiene widget'; + } + + View::render( + 'dashboard/slidesWidget', + [ + 'options' => \json_decode($cellData['options'], true), + 'settings' => $settings, + ] + ); + } + + // Js countdown for mode slice. + View::render( + 'dashboard/jsLayout', + ['dashboardId' => $this->dashboardId] + ); + return null; + } + + + /** + * Get cells for layout draw + * + * @return void + */ + public function getCellsLayout() + { + global $config; + + $result = []; + $cells = $this->cells; + + if ($cells === false) { + $cells = []; + } + + if (empty($cells) === false) { + $result = array_reduce( + $cells, + function ($carry, $item) { + $carry[$item['order']]['id'] = $item['id']; + $carry[$item['order']]['position'] = $item['position']; + $carry[$item['order']]['widgetId'] = $item['id_widget']; + + return $carry; + }, + [] + ); + } + + exit(json_encode($result)); + } + + + /** + * Insert new cell layout. + * + * @return void + */ + public function insertCellLayout():void + { + global $config; + + $position = [ + 'x' => 0, + 'y' => 0, + 'width' => 4, + 'height' => 4, + ]; + + $cellClass = new Cell($position, $this->dashboardId); + $dataCell = $cellClass->get(); + + $result = ['cellId' => $dataCell['id']]; + + exit(json_encode($result)); + } + + + /** + * Draw Cell. + * + * @return mixed + */ + public function drawCell() + { + global $config; + + $redraw = (bool) \get_parameter('redraw', 0); + + $cellClass = new Cell($this->cellId, $this->dashboardId); + $cellData = $cellClass->get(); + + if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) { + if ((int) $cellData['id_widget'] === 0 && $this->widgetId !== 0) { + // Insert in cell widget ID. + $res = $cellClass->put([], $this->widgetId); + if ($res === 1) { + $cellData['id_widget'] = $this->widgetId; + } + } + } + + View::render( + 'dashboard/cell', + [ + 'redraw' => $redraw, + 'cellData' => $cellData, + 'manageDashboards' => $this->manageDashboards, + ] + ); + + return null; + } + + + /** + * Draw widget. + * + * @return mixed + */ + public function drawWidget() + { + $newWidth = (int) \get_parameter('newWidth', 0); + $newHeight = (int) \get_parameter('newHeight', 0); + $gridWidth = (int) \get_parameter('gridWidth', 0); + + $cellClass = new Cell($this->cellId, $this->dashboardId); + $cellData = $cellClass->get(); + + $instance = ''; + if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) { + $instance = $this->instanceWidget( + $newWidth, + $newHeight, + $gridWidth + ); + } + + View::render( + 'dashboard/widget', + [ + 'widgetId' => $this->widgetId, + 'cellData' => $cellData, + 'instance' => $instance, + ] + ); + + return null; + } + + + /** + * Save layout. + * Update, Insert and delete widgets. + * More important order. + * + * @return mixed + */ + public function saveLayout() + { + global $config; + + $items = \get_parameter('items', []); + + // Class Dashboard. + if (empty($items) === false) { + // Order for position Y and X. + usort( + $items, + function ($a, $b) { + // First order by position `y`. + // if `y` is the same order by position `x`. + $retval = ($a['y'] <=> $b['y']); + if ($retval === 0) { + $retval = ($a['x'] <=> $b['x']); + } + + return $retval; + } + ); + + $result = false; + foreach ($items as $order => $item) { + $item['order'] = $order; + $id = $item['id']; + unset($item['id']); + // Update cells. + $cellClass = new Cell($id, $this->dashboardId); + $result = $cellClass->put($item); + + if ($result === false) { + return false; + } + } + } + + exit(json_encode($result)); + } + + + /** + * Ajax layout delete Cell. + * + * @return void + */ + public function deleteCell():void + { + global $config; + + $res = 0; + if ($this->cellId !== 0) { + // Remove cells. + $cellClass = new Cell($this->cellId, $this->dashboardId); + $res = $cellClass->delete(); + } + + $result = ['result' => $res]; + + exit(json_encode($result)); + } + + + /** + * Draw list widgets. + * + * @return mixed + */ + public function drawAddWidget() + { + global $config; + + Widget::dashboardInstallWidgets($this->cellId); + + $search = \io_safe_output(\get_parameter('search', '')); + + // The limit is fixed here. + $total = count(Widget::getWidgets(-1, -1, $search)); + $widgets = Widget::getWidgets($this->offset, 9, $search); + + View::render( + 'dashboard/listWidgets', + [ + 'widgets' => $widgets, + 'total' => $total, + 'offset' => $this->offset, + 'dashboardId' => $this->dashboardId, + 'cellId' => $this->cellId, + 'search' => $search, + 'ajaxController' => $this->ajaxController, + ] + ); + + return null; + } + + + /** + * Form configuration widget. + * + * @return mixed + */ + public function drawConfiguration() + { + global $config; + + $instance = $this->instanceWidget(); + $htmlInputs = $instance->getFormInputs([]); + + View::render( + 'dashboard/configurationWidgets', + [ + 'dashboardId' => $this->dashboardId, + 'cellId' => $this->cellId, + 'htmlInputs' => $htmlInputs, + ] + ); + + return null; + } + + + /** + * Save widget into cell. + * + * @return void + */ + public function saveWidgetIntoCell() + { + global $config; + + // Init result. + $result = ['result' => false]; + if ($this->widgetId !== 0) { + // Instance widget for get Post. + $instance = $this->instanceWidget(); + $values = $instance->getPost(); + + // Add new configuration for widget into cell. + $cellClass = new Cell($this->cellId, $this->dashboardId); + $res = $cellClass->put([], $this->widgetId, $values); + + $result = [ + 'result' => $res, + 'page' => $this->ajaxController, + 'url' => ui_get_full_url('ajax.php'), + 'dashboardId' => $this->dashboardId, + 'cellId' => $this->cellId, + 'widgetId' => $this->widgetId, + ]; + } + + exit(json_encode($result)); + } + + + /** + * Image icon Dashboard ajax change. + * + * @return mixed + */ + public function imageIconDashboardAjax() + { + $nameImg = \get_parameter('nameImg', ''); + + $output = $this->imageIconDashboard($nameImg); + + echo $output; + return null; + } + + + /** + * Return image php. + * + * @param string|null $nameImg Path image. + * + * @return string Image. + */ + public static function imageIconDashboard(?string $nameImg):string + { + if (empty($nameImg) === true) { + $nameImg = 'appliance'; + } + + $output = html_print_image( + 'images/console/icons/'.$nameImg.'.png', + true, + [ + 'alt' => __('Icon image dashboard'), + 'style' => 'max-width:70px; max-height:70px;', + ] + ); + return $output; + } + + + /** + * Draw form slides. + * + * @return mixed + */ + public function formSlides() + { + $dashboards = $this->getDashboards(-1, -1, false, false); + + View::render( + 'dashboard/formSlides', + [ + 'url' => $this->url, + 'dashboards' => $dashboards, + ] + ); + return null; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widget.php b/pandora_console/include/lib/Dashboard/Widget.php new file mode 100644 index 0000000000..9e3d0c3ead --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widget.php @@ -0,0 +1,571 @@ +widgetId = $widgetId; + $this->cellId = $cellId; + $this->dashboardId = $dashboardId; + $this->fields = $this->get(); + + $cellClass = new Cell($this->cellId, $this->dashboardId); + $this->dataCell = $cellClass->get(); + $this->values = $this->getOptionsWidget(); + } + + return $this; + } + + + /** + * Retrieve a cell definition. + * + * @return array cell data. + */ + public function get() + { + global $config; + + $sql = sprintf( + 'SELECT * + FROM twidget + WHERE id = %d', + $this->widgetId + ); + + $data = \db_get_row_sql($sql); + + if ($data === false) { + return []; + } + + return $data; + } + + + /** + * Get options Cell widget configuration. + * + * @return array + */ + public function getOptionsWidget():array + { + global $config; + + $result = []; + if (empty($this->dataCell['options']) === false) { + $result = \json_decode($this->dataCell['options'], true); + + // Hack retrocompatibility. + if ($result === null) { + $result = \unserialize($this->dataCell['options']); + } + } + + return $result; + } + + + /** + * Get options Cell widget configuration. + * + * @return array + */ + public function getPositionWidget():array + { + global $config; + + $result = []; + if (empty($this->dataCell['position']) === false) { + $result = \json_decode($this->dataCell['position'], true); + + // Hack retrocompatibility. + if ($result === null) { + $result = \unserialize($this->dataCell['position']); + } + } + + return $result; + } + + + /** + * Insert widgets. + * + * @return void + */ + public function install() + { + $id = db_get_value( + 'id', + 'twidget', + 'unique_name', + $this->getName() + ); + + if ($id !== false) { + return; + } + + $values = [ + 'unique_name' => $this->getName(), + 'description' => $this->getDescription(), + 'options' => '', + 'page' => $this->page, + 'class_name' => $this->className, + ]; + + $res = db_process_sql_insert('twidget', $values); + return $res; + } + + + /** + * Get all dashboard user can you see. + * + * @param integer $offset Offset query. + * @param integer $limit Limit query. + * @param string|null $search Search word. + * + * @return array Return info all dasboards. + */ + static public function getWidgets( + int $offset=-1, + int $limit=-1, + ?string $search='' + ):array { + global $config; + + $sql_limit = ''; + if ($offset !== -1 && $limit !== -1) { + $sql_limit = ' LIMIT '.$offset.','.$limit; + } + + $sql_search = ''; + if (empty($search) === false) { + $sql_search = 'AND description LIKE "%'.$search.'%" '; + } + + // User admin view all dashboards. + $sql_widget = \sprintf( + 'SELECT * FROM twidget + WHERE unique_name <> "agent_module" + %s + ORDER BY `description` %s', + $sql_search, + $sql_limit + ); + + $widgets = \db_get_all_rows_sql($sql_widget); + + if ($widgets === false) { + $widgets = []; + } + + return $widgets; + } + + + /** + * Install Widgets. + * + * @param integer $cellId Cell ID. + * + * @return void + */ + public static function dashboardInstallWidgets(int $cellId) + { + global $config; + + $dir = $config['homedir'].'/include/lib/Dashboard/Widgets/'; + $handle = opendir($dir); + if ($handle === false) { + return; + } + + $file = readdir($handle); + $ignores = [ + '.', + '..', + ]; + + while ($file !== false) { + if (in_array($file, $ignores) === true) { + $file = readdir($handle); + continue; + } + + $filepath = realpath($dir.'/'.$file); + if (is_readable($filepath) === false + || is_dir($filepath) === true + || preg_match('/.*\.php$/', $filepath) === false + ) { + $file = readdir($handle); + continue; + } + + $name = preg_replace('/.php/', '', $file); + $className = 'PandoraFMS\Dashboard'; + $not_installed = false; + switch ($name) { + case 'agent_module': + $not_installed = true; + $className .= '\AgentModuleWidget'; + break; + + case 'alerts_fired': + $className .= '\AlertsFiredWidget'; + break; + + case 'clock': + $className .= '\ClockWidget'; + break; + + case 'custom_graph': + $className .= '\CustomGraphWidget'; + break; + + case 'events_list': + $className .= '\EventsListWidget'; + break; + + case 'example': + $className .= '\WelcomeWidget'; + break; + + case 'graph_module_histogram': + $className .= '\GraphModuleHistogramWidget'; + break; + + case 'groups_status': + $className .= '\GroupsStatusWidget'; + break; + + case 'maps_made_by_user': + $className .= '\MapsMadeByUser'; + break; + + case 'maps_status': + $className .= '\MapsStatusWidget'; + break; + + case 'module_icon': + $className .= '\ModuleIconWidget'; + break; + + case 'module_status': + $className .= '\ModuleStatusWidget'; + break; + + case 'module_table_value': + $className .= '\ModuleTableValueWidget'; + break; + + case 'module_value': + $className .= '\ModuleValueWidget'; + break; + + case 'monitor_health': + $className .= '\MonitorHealthWidget'; + break; + + case 'network_map': + if (\enterprise_installed() === false) { + $not_installed = true; + } + + $className .= '\NetworkMapWidget'; + break; + + case 'post': + $className .= '\PostWidget'; + break; + + case 'reports': + $className .= '\ReportsWidget'; + break; + + case 'service_map': + if (\enterprise_installed() === false) { + $not_installed = true; + } + + $className .= '\ServiceMapWidget'; + break; + + case 'single_graph': + $className .= '\SingleGraphWidget'; + break; + + case 'sla_percent': + $className .= '\SLAPercentWidget'; + break; + + case 'system_group_status': + $className .= '\SystemGroupStatusWidget'; + break; + + case 'tactical': + $className .= '\TacticalWidget'; + break; + + case 'top_n_events_by_module': + $className .= '\TopNEventByModuleWidget'; + break; + + case 'top_n_events_by_group': + $className .= '\TopNEventByGroupWidget'; + break; + + case 'top_n': + $className .= '\TopNWidget'; + break; + + case 'tree_view': + $className .= '\TreeViewWidget'; + break; + + case 'url': + $className .= '\UrlWidget'; + break; + + case 'wux_transaction_stats': + if (\enterprise_installed() === false) { + $not_installed = true; + } + + $className .= '\WuxStatsWidget'; + break; + + case 'wux_transaction': + if (\enterprise_installed() === false) { + $not_installed = true; + } + + $className .= '\WuxWidget'; + break; + + default: + $className = false; + break; + } + + if ($not_installed === false && $className !== false) { + include_once $filepath; + $instance = new $className($cellId, 0, 0); + if (method_exists($instance, 'install') === true) { + $instance->install(); + } + } + + // Check next. + $file = readdir($handle); + } + } + + + /** + * Draw html. + * + * @return string Html data. + */ + public function printHtml() + { + global $config; + + $output = ''; + + if ($this->configurationRequired === true) { + $output .= '
'; + $output .= \ui_print_info_message( + __('Please configure this widget before usage'), + '', + true + ); + $output .= '
'; + } else if ($this->loadError === true) { + $output .= '
'; + $output .= \ui_print_error_message( + __('Widget cannot be loaded'), + '', + true + ); + $output .= __('Please, configure the widget again to recover it'); + $output .= '
'; + } else { + $output .= $this->load(); + } + + return $output; + } + + + /** + * Generates inputs for form. + * + * @return array Of inputs. + */ + public function getFormInputs(): array + { + $inputs = []; + + $values = $this->values; + + // Default values. + if (isset($values['title']) === false) { + $values['title'] = $this->getDescription(); + } + + if (empty($values['background']) === true) { + $values['background'] = '#ffffff'; + } + + $inputs[] = [ + 'arguments' => [ + 'type' => 'hidden', + 'name' => 'dashboardId', + 'value' => $this->dashboardId, + ], + ]; + + $inputs[] = [ + 'arguments' => [ + 'type' => 'hidden', + 'name' => 'cellId', + 'value' => $this->cellId, + ], + ]; + + $inputs[] = [ + 'arguments' => [ + 'type' => 'hidden', + 'name' => 'widgetId', + 'value' => $this->widgetId, + ], + ]; + + $inputs[] = [ + 'label' => __('Title'), + 'arguments' => [ + 'type' => 'text', + 'name' => 'title', + 'value' => $values['title'], + 'return' => true, + 'size' => 0, + ], + ]; + + $inputs[] = [ + 'label' => __('Background'), + 'arguments' => [ + 'wrapper' => 'div', + 'name' => 'background', + 'type' => 'color', + 'value' => $values['background'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + $values = []; + $values['title'] = \get_parameter('title', ''); + $values['background'] = \get_parameter('background', '#ffffff'); + + return $values; + + } + + + /** + * Size Cell. + * + * @return array + */ + protected function getSize():array + { + $gridWidth = $this->gridWidth; + if ($this->gridWidth === 0) { + $gridWidth = 1170; + } + + if ($this->width === 0) { + $width = (((int) $this->position['width'] / 12 * $gridWidth) - 50); + } else { + $width = (((int) $this->width / 12 * $gridWidth) - 50); + } + + if ($this->height === 0) { + $height = ((((int) $this->position['height'] - 1) * 80) + 60 - 30); + } else { + $height = ((((int) $this->height - 1) * 80) + 60 - 30); + } + + $result = [ + 'width' => $width, + 'height' => $height, + ]; + + return $result; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/agent_module.php b/pandora_console/include/lib/Dashboard/Widgets/agent_module.php new file mode 100644 index 0000000000..e9f0c4c0a2 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/agent_module.php @@ -0,0 +1,802 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Agent/Module View'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'agent_module'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /* + // DO NOT CHANGE THIS VALUE. + $id_group = isset($this->options['search_group_'.$id]) ? $this->options['search_group_'.$id] : 0; + + $agent_conf_key = 'id_agent_'.$id; + $id_agent = $this->options[$agent_conf_key]; + $module_conf_key = 'id_module_'.$id; + $id_module = $this->options[$module_conf_key]; + $recursion_checked = $this->options['recursion']; + + $this->add_configuration( + 'search_group_'.$id, + __('Group'), + OPTION_TREE_GROUP_SELECT + ); + + $list_agents = agents_get_group_agents( + $id_group, + false, + 'lower', + false, + $recursion_checked + ); + + if (!isset($this->options['selection_agent_module_'.$id]) + || $this->options['selection_agent_module_'.$id] == '' + || $this->options['selection_agent_module_'.$id] == null + ) { + $selection_agent_module = 'common'; + } else { + $selection_agent_module = $this->options['selection_agent_module_'.$id]; + } + + $limit_common = ''; + $sql = false; + if (!empty($id_agent)) { + if ($selection_agent_module == 'common') { + $limit_common = sprintf( + ' AND (SELECT count(nombre) + FROM tagente_modulo t2 + WHERE t2.delete_pending = 0 + AND t1.nombre = t2.nombre + AND t2.id_agente IN (%s)) = (%d)', + implode(',', (array) $id_agent), + count($id_agent) + ); + } + + $sql = sprintf( + 'SELECT DISTINCT nombre + FROM tagente_modulo t1 + WHERE id_agente IN (%s) + AND delete_pending = 0 %s ORDER BY nombre', + implode(', ', (array) $id_agent), + $limit_common + ); + } + + if (empty($id_module)) { + $this->options[$module_conf_key] = index_array( + db_get_all_rows_sql($sql), + 'nombre', + 'nombre' + ); + } + + $this->add_configuration( + 'recursion', + __('Recursion'), + OPTION_BOOLEAN + ); + + $this->add_configuration( + $agent_conf_key, + __('Agent'), + OPTION_SELECT_MULTISELECTION, + ['values' => $list_agents] + ); + + $this->add_configuration( + 'selection_agent_module_'.$id, + __('Show common modules'), + OPTION_SINGLE_SELECT, + [ + 'values' => [ + 'common' => __('Show common modules'), + 'all' => __('Show all modules'), + ], + ] + ); + + $this->add_configuration( + $module_conf_key, + __('Module'), + OPTION_SELECT_MULTISELECTION, + [ + 'values' => index_array( + db_get_all_rows_sql($sql), + 'nombre', + 'nombre' + ), + ] + ); + + $this->add_configuration( + '', + '', + OPTION_CUSTOM_INPUT, + [ + 'widget' => $this, + 'entire_row' => true, + 'update' => false, + ] + ); + */ + + + function print_configuration_custom($return=true) + { + $id = $this->getId(); + ob_start(); + + ?> + + $module) { + if ($module == $name) { + $modules_by_name[($cont - 1)]['id'][] = $key; + } else { + $name = $module; + $modules_by_name[$cont]['name'] = $name; + $modules_by_name[$cont]['id'][] = $key; + $cont ++; + } + } + + foreach ($agents as $agent) { + if (!users_access_to_agent($agent['id_agente'])) { + continue; + } + + $row = []; + $row['agent_status'] = agents_get_status($agent['id_agente'], true); + $row['agent_name'] = $agent['nombre']; + $row['agent_alias'] = $agent['alias']; + $agent_modules = agents_get_modules($agent['id_agente']); + + $row['modules'] = []; + foreach ($modules_by_name as $module) { + $row['modules'][$module['name']] = null; + foreach ($module['id'] as $module_id) { + if (array_key_exists($module_id, $agent_modules)) { + $row['modules'][$module['name']] = modules_get_agentmodule_status($module_id); + break; + } + } + } + + $return[] = $row; + } + + return $return; + } + + + public function generate_view_agent_module($visual_data) + { + $table_data = '
'; + $table_data .= ''; + + if (!empty($visual_data)) { + $table_data .= ''; + + $array_names = []; + + foreach ($visual_data as $data) { + foreach ($data['modules'] as $module_name => $module) { + if ($module === null || in_array($module_name, $array_names)) { + continue; + } else { + $array_names[] = $module_name; + } + } + } + + natcasesort($array_names); + foreach ($array_names as $module_name) { + $file_name = ui_print_truncate_text( + $module_name, + 'module_small', + false, + true, + false, + '...' + ); + $table_data .= ''; + } + + foreach ($visual_data as $row) { + $table_data .= ""; + switch ($row['agent_status']) { + case AGENT_STATUS_ALERT_FIRED: + $rowcolor = COL_ALERTFIRED; + $textcolor = '#000'; + break; + + case AGENT_STATUS_CRITICAL: + $rowcolor = COL_CRITICAL; + $textcolor = '#FFF'; + break; + + case AGENT_STATUS_WARNING: + $rowcolor = COL_WARNING; + $textcolor = '#000'; + break; + + case AGENT_STATUS_NORMAL: + $rowcolor = COL_NORMAL; + $textcolor = '#FFF'; + break; + + case AGENT_STATUS_UNKNOWN: + case AGENT_STATUS_ALL: + default: + $rowcolor = COL_UNKNOWN; + $textcolor = '#FFF'; + break; + } + + $file_name = ui_print_truncate_text( + $row['agent_alias'], + 'agent_small', + false, + true, + false, + '...' + ); + $table_data .= "'; + + foreach ($row['modules'] as $module_name => $module) { + if ($module === null) { + if (in_array($module_name, $array_names)) { + $table_data .= ""; + } else { + continue; + } + } else { + $table_data .= "'; + } + } + + $table_data .= ''; + } + } else { + $table_data .= ''; + } + + $table_data .= '
'.__('Agents').' / '.__('Modules').''.$file_name.'
".$file_name.'"; + switch ($module) { + case AGENT_STATUS_NORMAL: + $table_data .= ui_print_status_image( + 'module_ok.png', + __( + '%s in %s : NORMAL', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + + case AGENT_STATUS_CRITICAL: + $table_data .= ui_print_status_image( + 'module_critical.png', + __( + '%s in %s : CRITICAL', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + + case AGENT_STATUS_WARNING: + $table_data .= ui_print_status_image( + 'module_warning.png', + __( + '%s in %s : WARNING', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + + case AGENT_STATUS_UNKNOWN: + $table_data .= ui_print_status_image( + 'module_unknown.png', + __( + '%s in %s : UNKNOWN', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + + case 4: + $table_data .= ui_print_status_image( + 'module_no_data.png', + __( + '%s in %s : Not initialize', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + + case AGENT_STATUS_ALERT_FIRED: + default: + $table_data .= ui_print_status_image( + 'module_alertsfired.png', + __( + '%s in %s : ALERTS FIRED', + $module_name, + $row['agent_alias'] + ), + true, + [ + 'width' => '20px', + 'height' => '20px', + ] + ); + break; + } + + $table_data .= '
'.__('Please configure this widget before usage').'
'; + $table_data .= '
'; + + return $table_data; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['period'] = \get_parameter('period', 0); + $values['showLegend'] = \get_parameter_switch('showLegend'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + // TODO:XXX WIP. + return 'WIP in this widget'; + /* + $this->body = ''; + $id_agent = $this->options['id_agent_'.$this->getId()]; + if (! check_acl($config['id_user'], 0, 'AR')) { + $this->body = __('You don\'t have access'); + return; + } + + $id_module = $this->options['id_module_'.$this->getId()]; + if ($id_agent) { + $sql = 'SELECT id_agente,nombre,alias + FROM tagente + WHERE id_agente IN ('.implode(',', $id_agent).') + ORDER BY id_agente'; + $agents = db_get_all_rows_sql($sql); + if ($agents === false) { + $agents = []; + } + + $sql = 'SELECT id_agente_modulo,nombre + FROM tagente_modulo + WHERE id_agente IN ('.implode(',', $id_agent).") + AND nombre IN ('".implode("','", $id_module)."') + AND delete_pending = 0 ORDER BY nombre"; + $modules = index_array(db_get_all_rows_sql($sql), 'id_agente_modulo', 'nombre'); + if ($modules === false) { + $modules = []; + } + } else { + $agents = []; + $modules = []; + } + + $visual_data = $this->generate_data_agent_module($agents, $modules); + + $this->body .= $this->generate_view_agent_module($visual_data); + */ + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Agent/Module View'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'agent_module'; + } + + +} + +$instance = new AgentModuleWidget(false); diff --git a/pandora_console/include/lib/Dashboard/Widgets/alerts_fired.php b/pandora_console/include/lib/Dashboard/Widgets/alerts_fired.php new file mode 100755 index 0000000000..de76b7a744 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/alerts_fired.php @@ -0,0 +1,344 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Triggered alerts report'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'alerts_fired'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (isset($this->values['groupId']) === false) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Groups. + $inputs[] = [ + 'label' => __('Group'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => $values['groupId'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['groupId'] = \get_parameter('groupId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + + if ($this->values['groupId'] === 0) { + $groups = users_get_groups(false, 'AR', false); + } else { + $groups = [$this->values['groupId'] => '']; + } + + if (isset($groups) === true && is_array($groups) === true) { + $table = new \StdClass(); + $table->class = 'databox data'; + $table->cellspacing = '0'; + $table->width = '90%'; + $table->data = []; + $table->size = []; + + $url = $config['homeurl']; + $url .= 'index.php?sec=estado&sec2=operation/agentes/alerts_status'; + $url .= '&refr=60&filter=fired&filter_standby=all'; + + $flag = false; + foreach ($groups as $id_group => $name) { + $alerts_group = get_group_alerts($id_group); + if (isset($alerts_group['simple']) === true) { + $alerts_group = $alerts_group['simple']; + } + + foreach ($alerts_group as $alert) { + $data = []; + + if ($alert['times_fired'] == 0) { + continue; + } + + $flag = true; + + $data[0] = ''; + $data[0] .= ui_print_group_icon( + $id_group, + true, + 'groups_small', + '', + false + ); + $data[0] .= ''; + + $data[1] = ''; + $data[1] .= $alert['agent_name']; + $data[1] .= ''; + + $data[2] = $alert['agent_module_name']; + + $data[3] = ui_print_timestamp($alert['last_fired'], true); + + array_push($table->data, $data); + } + } + + if ($flag === true) { + $height = (count($table->data) * 30); + $style = 'min-width:300px; min-height:'.$height.'px;'; + $output .= '
'; + $output .= html_print_table($table, true); + $output .= '
'; + } else { + $output .= '
'; + $output .= \ui_print_info_message( + __('Not alert fired'), + '', + true + ); + $output .= '
'; + } + } else { + $output .= '
'; + $output .= \ui_print_info_message( + __('You must select some group'), + '', + true + ); + $output .= '
'; + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Triggered alerts report'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'alerts_fired'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/clock.php b/pandora_console/include/lib/Dashboard/Widgets/clock.php new file mode 100644 index 0000000000..5c7b793b9e --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/clock.php @@ -0,0 +1,300 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Clock'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'clock'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['clockType']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Type clock. + $fields = [ + 'analogic' => __('Analogic'), + 'digital' => __('Digital'), + ]; + + $inputs[] = [ + 'label' => __('Type'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'clockType', + 'selected' => $values['clockType'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['clockType'] = \get_parameter('clockType', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + include_once $config['homedir'].'/include/graphs/functions_d3.php'; + + $id = \uniqid(); + $output = '
'; + if ($this->values['clockType'] === 'analogic') { + $posAnolgic = (int) $size['height']; + if ((int) $size['width'] < (int) $size['height']) { + $posAnolgic = (int) $size['width']; + } + + $output .= "
"; + $output .= print_clock_analogic_1( + 'time', + $config['timezone'], + 'analogic_1', + $posAnolgic, + $posAnolgic, + $id, + '#000000', + false + ); + $output .= '
'; + } else { + $output .= "
"; + $output .= print_clock_digital_1( + 'time', + $config['timezone'], + 'digital_1', + $size['width'], + $size['height'], + $id, + '#000000' + ); + $output .= '
'; + } + + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Clock'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'clock'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/custom_graph.php b/pandora_console/include/lib/Dashboard/Widgets/custom_graph.php new file mode 100644 index 0000000000..61d5a49904 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/custom_graph.php @@ -0,0 +1,388 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Defined custom graph'); + + // Name. + $this->name = 'custom_graph'; + + // Don't forget to include here. + // the headers needed for any configuration file. + include_once $config['homedir'].'/include/functions_custom_graphs.php'; + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['id_graph']) === true) { + $this->configurationRequired = true; + } + + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['period']) === false) { + $values['period'] = SECONDS_1DAY; + } + + if (isset($values['showLegend']) === false) { + $values['showLegend'] = 1; + } + + // Custom graph. + $fields = \custom_graphs_get_user(); + $inputs[] = [ + 'label' => __('Graph'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'id_graph', + 'selected' => $values['id_graph'], + 'return' => true, + ], + ]; + + // Type charts. + $fields = [ + CUSTOM_GRAPH_AREA => __('Area'), + CUSTOM_GRAPH_STACKED_AREA => __('Stacked area'), + CUSTOM_GRAPH_LINE => __('Line'), + CUSTOM_GRAPH_STACKED_LINE => __('Stacked line'), + CUSTOM_GRAPH_BULLET_CHART => __('Bullet chart'), + CUSTOM_GRAPH_GAUGE => __('Gauge'), + CUSTOM_GRAPH_HBARS => __('Horizontal Bars'), + CUSTOM_GRAPH_VBARS => __('Vertical Bars'), + CUSTOM_GRAPH_PIE => __('Pie'), + ]; + + $inputs[] = [ + 'label' => __('Type'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'type', + 'selected' => $values['type'], + 'return' => true, + ], + ]; + + // Show legend. + $inputs[] = [ + 'label' => __('Show legend'), + 'arguments' => [ + 'name' => 'showLegend', + 'id' => 'showLegend', + 'type' => 'switch', + 'value' => $values['showLegend'], + ], + ]; + + // Period. + $inputs[] = [ + 'label' => __('Interval'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'interval', + 'value' => $values['period'], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['id_graph'] = \get_parameter('id_graph', 0); + $values['type'] = \get_parameter('type', 0); + $values['period'] = \get_parameter('period', 0); + $values['showLegend'] = \get_parameter_switch('showLegend'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + switch ($this->values['type']) { + case CUSTOM_GRAPH_STACKED_LINE: + case CUSTOM_GRAPH_STACKED_AREA: + case CUSTOM_GRAPH_AREA: + case CUSTOM_GRAPH_LINE: + if ($this->values['showLegend'] === 1) { + $sources = db_get_all_rows_field_filter( + 'tgraph_source', + 'id_graph', + $this->values['id_graph'], + 'field_order' + ); + + $hackLegendHight = (30 * count($sources)); + if ($hackLegendHight < ($size['height'] - 10 - $hackLegendHight)) { + $height = ($size['height'] - 10 - $hackLegendHight); + } else { + $height = ($size['height'] - 10); + $this->values['showLegend'] = 0; + } + } else { + $height = ($size['height'] - 10); + } + + $output = '
'; + break; + + case CUSTOM_GRAPH_VBARS: + $style = 'padding: 10px;'; + $height = $size['height']; + $output = '
'; + break; + + case CUSTOM_GRAPH_GAUGE: + $height = $size['height']; + $output = '
'; + break; + + default: + $height = $size['height']; + $output = '
'; + break; + } + + $params = [ + 'period' => $this->values['period'], + 'width' => ($size['width'] - 10), + 'height' => $height, + 'only_image' => false, + 'homeurl' => $config['homeurl'], + 'percentil' => $percentil, + 'backgroundColor' => 'transparent', + 'menu' => false, + 'show_legend' => $this->values['showLegend'], + 'vconsole' => true, + ]; + + $params_combined = [ + 'stacked' => (int) $this->values['type'], + 'id_graph' => (int) $this->values['id_graph'], + ]; + + $output .= graphic_combined_module( + false, + $params, + $params_combined + ); + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Defined custom graph'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'custom_graph'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/events_list.php b/pandora_console/include/lib/Dashboard/Widgets/events_list.php new file mode 100644 index 0000000000..31e66dd3fe --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/events_list.php @@ -0,0 +1,560 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('List of latest events'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'events_list'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (isset($this->values['groupId']) === false) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + $fields = \get_event_types(); + $fields['not_normal'] = __('Not normal'); + + // Default values. + if (isset($values['maxHours']) === false) { + $values['maxHours'] = 8; + } + + if (isset($values['limit']) === false) { + $values['limit'] = $config['block_size']; + } + + // Event Type. + $inputs[] = [ + 'label' => __('Event type'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'eventType', + 'selected' => $values['eventType'], + 'return' => true, + 'nothing' => __('Any'), + 'nothing_value' => 0, + ], + ]; + + // Max. hours old. Default 8. + $inputs[] = [ + 'label' => __('Max. hours old'), + 'arguments' => [ + 'name' => 'maxHours', + 'type' => 'number', + 'value' => $values['maxHours'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Limit Default block_size. + $blockSizeD4 = \format_integer_round(($config['block_size'] / 4)); + $blockSizeD2 = \format_integer_round(($config['block_size'] / 2)); + $fields = [ + $config['block_size'] => $config['block_size'], + $blockSizeD4 => $blockSizeD4, + $blockSizeD2 => $blockSizeD2, + ($config['block_size'] * 2) => ($config['block_size'] * 2), + ($config['block_size'] * 3) => ($config['block_size'] * 3), + ]; + + $inputs[] = [ + 'label' => __('Limit'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'limit', + 'selected' => $values['limit'], + 'return' => true, + ], + ]; + + // Event status. + $fields = [ + -1 => __('All event'), + 1 => __('Only validated'), + 0 => __('Only pending'), + ]; + + $inputs[] = [ + 'label' => __('Event status'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'eventStatus', + 'selected' => $values['eventStatus'], + 'return' => true, + ], + ]; + + // Severity. + $fields = \get_priorities(); + + $inputs[] = [ + 'label' => __('Severity'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'severity', + 'selected' => $values['severity'], + 'return' => true, + 'nothing' => __('All'), + 'nothing_value' => -1, + ], + ]; + + // Groups. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId[]', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => explode(',', $values['groupId'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + // Tags. + $fields = tags_get_user_tags($config['id_user'], 'AR'); + + $inputs[] = [ + 'label' => __('Tags'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'tagsId[]', + 'selected' => explode(',', $values['tagsId'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['eventType'] = \get_parameter('eventType', 0); + $values['maxHours'] = \get_parameter('maxHours', 8); + $values['limit'] = \get_parameter('limit', 20); + $values['eventStatus'] = \get_parameter('eventStatus', -1); + $values['severity'] = \get_parameter_switch('severity', -1); + $values['groupId'] = \get_parameter_switch('groupId', []); + $values['tagsId'] = \get_parameter_switch('tagsId', []); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + $user_groups = \users_get_groups(); + + ui_require_css_file('events', 'include/styles/', true); + ui_require_css_file('tables', 'include/styles/', true); + + $this->values['groupId'] = explode(',', $this->values['groupId'][0]); + $this->values['tagsId'] = explode(',', $this->values['tagsId'][0]); + + if (empty($this->values['groupId']) === true) { + $output .= __('You must select some group'); + return $output; + } + + foreach ($this->values['groupId'] as $id_group) { + // Sanity check for user access. + if (isset($user_groups[$id_group]) === false) { + $output .= __('You must select some group'); + return; + } + } + + $useTags = \tags_has_user_acl_tags($config['id_user']); + if ($useTags) { + if (empty($this->values['tagsId']) === true) { + $output .= __('You don\'t have access'); + return; + } + } + + $hours = ($this->values['maxHours'] * SECONDS_1HOUR); + $unixtime = (get_system_time() - $hours); + + // Put hours in seconds. + $filter = []; + // Group all. + if (in_array(0, $this->values['groupId'])) { + $filter['id_grupo'] = array_keys(users_get_groups()); + } else { + $filter['id_grupo'] = $this->values['groupId']; + } + + $filter['utimestamp'] = '>'.$unixtime; + + if (empty($this->values['eventType']) === false) { + $filter['event_type'] = $this->values['eventType']; + + if ($filter['event_type'] === 'warning' + || $filter['event_type'] === 'critical' + || $filter['event_type'] === 'normal' + ) { + $filter['event_type'] = '%'.$filter['event_type'].'%'; + } else if ($filter['event_type'] === 'not_normal') { + unset($filter['event_type']); + $filter[] = '(event_type REGEXP "warning|critical|unknown")'; + } + } + + if ((int) $this->values['eventStatus'] !== -1) { + $filter['estado'] = $this->values['eventStatus']; + } + + $filter['limit'] = $this->values['limit']; + $filter['order'] = '`utimestamp` DESC'; + + if ((int) $this->values['severity'] !== -1) { + $filter['criticity'] = $this->values['severity']; + } + + if (empty($this->values['tagsId']) === false) { + foreach ($this->values['tagsId'] as $tag) { + $tag_name[$tag] = \tags_get_name($tag); + } + + $filter['tags'] = $tag_name; + } + + $events = \events_get_events($filter); + + if ($events === false) { + $events = []; + } + + $i = 0; + if (isset($events) === true + && is_array($events) === true + && empty($events) === false + ) { + $output .= html_print_input_hidden( + 'ajax_file', + ui_get_full_url('ajax.php', false, false, false), + true + ); + + $table = new \StdClass; + $table->class = 'widget_groups_status databox'; + $table->cellspacing = '1'; + $table->width = '100%'; + $table->data = []; + $table->size = []; + $table->rowclass = []; + + foreach ($events as $event) { + $data = []; + $event['evento'] = io_safe_output($event['evento']); + if ($event['estado'] === 0) { + $img = 'images/pixel_red.png'; + } else { + $img = 'images/pixel_green.png'; + } + + $data[0] = events_print_type_img($event['event_type'], true); + $agent_alias = agents_get_alias($event['id_agente']); + + if ($agent_alias !== '') { + $data[1] = ''; + $data[1] .= $agent_alias; + $data[1] .= ''; + } else { + $data[1] = ''.__('Unknown').''; + } + + $settings = json_encode( + [ + 'event' => $event, + 'page' => 'include/ajax/events', + 'cellId' => $id_cell, + 'ajaxUrl' => ui_get_full_url( + 'ajax.php', + false, + false, + false + ), + 'result' => false, + ] + ); + + $data[2] = ''; + $data[2] .= substr(io_safe_output($event['evento']), 0, 150); + if (strlen($event['evento']) > 150) { + $data[2] .= '...'; + } + + $data[2] .= ''; + + $data[3] = ui_print_timestamp($event['timestamp'], true); + + $table->data[$i] = $data; + + $table->cellstyle[$i][0] = 'background: #E8E8E8;'; + $rowclass = get_priority_class($event['criticity']); + $table->cellclass[$i][1] = $rowclass; + $table->cellclass[$i][2] = $rowclass; + $table->cellclass[$i][3] = $rowclass; + $i++; + } + + $output .= html_print_table($table, true); + $output .= "
"; + $output .= "
"; + $output .= "
"; + $output .= ui_require_javascript_file( + 'pandora_events', + 'include/javascript/', + true + ); + } else { + $output .= '
'; + $output .= \ui_print_info_message( + __('There are no events matching selected search filters'), + '', + true + ); + $output .= '
'; + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('List of latest events'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'events_list'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/example.php b/pandora_console/include/lib/Dashboard/Widgets/example.php new file mode 100644 index 0000000000..e7d431cd5a --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/example.php @@ -0,0 +1,275 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Welcome message to %s', get_product_name()); + + // Name. + if (empty($this->name) === true) { + $this->name = 'example'; + } + + $this->configurationRequired = false; + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + $output = ''; + + $size = parent::getSize(); + + if (isset($this->values['message']) === true) { + $output .= \io_safe_output( + str_replace(' ', '
', $this->values['message']) + ); + return $output; + } + + $style = 'height:'.$size['height'].'px; width:'.$size['width'].'px;'; + $style .= 'text-align: left;'; + + $output .= '
'; + $output .= '

'; + $output .= __('Welcome to %s', \get_product_name()); + $output .= '

'; + $output .= '
'; + $output .= '
'; + $output .= __('This is an example of a dashboard widget. A widget may contain elements'); + $output .= __('To add more elements, click on "Add widgets" on the top of this page.'); + $output .= __('To delete this message, click on the delete button on top right corner of this element.'); + $output .= __('To do so, just click on the title and drag and drop it to the desired place.'); + $output .= __('To delete this message, click on the delete button on top right corner of this element.'); + $output .= __('Thanks for using %s.', \get_product_name()); + $output .= '
'; + $output .= "
"; + $output .= \html_print_image( + \ui_get_logo_to_center_networkmap(), + true, + ['style' => 'margin-top:-27px;width:75%;'] + ); + $output .= '
'; + $output .= '
'; + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Welcome message to %s', get_product_name()); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'example'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/graph_module_histogram.php b/pandora_console/include/lib/Dashboard/Widgets/graph_module_histogram.php new file mode 100644 index 0000000000..7e99294311 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/graph_module_histogram.php @@ -0,0 +1,402 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Module histogram'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'graph_module_histogram'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Default values. + if (isset($values['period']) === false) { + $values['period'] = SECONDS_1DAY; + } + + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 30; + } + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + // Periodicity. + $inputs[] = [ + 'label' => __('Interval'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'interval', + 'value' => $values['period'], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['period'] = \get_parameter('period', 0); + $values['sizeLabel'] = \get_parameter_switch('sizeLabel', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + // Desactive scroll bars only this item. + $output .= ''; + $id_agent = $this->values['agentId']; + $id_module = $this->values['moduleId']; + $period = $this->values['period']; + $label = $this->values['label']; + $size_label = $this->values['sizeLabel']; + + $id_group = \agents_get_agent_group($id_agent); + + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + if (modules_get_agentmodule_agent($id_module) !== (int) $id_agent) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $content = [ + 'id_agent_module' => $id_module, + 'period' => $period, + 'time_from' => '00:00:00', + 'time_to' => '00:00:00', + 'id_group' => $id_group, + 'sizeForTicks' => $size['width'], + [ + ['id_agent_module' => $id_module], + ] + ]; + + $graph = \reporting_module_histogram_graph( + ['datetime' => time()], + $content + ); + + $style = 'min-width:200px; min-height:100px;'; + $output .= '
'; + $output .= '
'; + $output .= $label; + $output .= '
'; + $style = 'min-width:200px; width:'.($size['width'] + 15).'px;'; + $output .= '
'; + $output .= $graph['chart']; + $output .= '
'; + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Module histogram'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'graph_module_histogram'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/groups_status.php b/pandora_console/include/lib/Dashboard/Widgets/groups_status.php new file mode 100755 index 0000000000..7e2c449bbd --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/groups_status.php @@ -0,0 +1,488 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('General group status'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'groups_status'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['groupId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Restrict access to group. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId', + 'returnAllGroup' => false, + 'privilege' => 'AR', + 'selected' => $values['groupId'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['groupId'] = \get_parameter('groupId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + include_once $config['homedir'].'/include/functions_reporting.php'; + include_once $config['homedir'].'/include/functions_graph.php'; + + $output = ''; + // Check ACL. + $user_groups = \users_get_groups(false, 'AR', false); + + if (empty($this->values['groupId']) === true) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + // Sanity check for user access. + if (isset($user_groups[$this->values['groupId']]) === false) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $stats = \reporting_get_group_stats_resume($this->values['groupId']); + + $data = '
'; + + $data .= '
'; + + $table = new \stdClass(); + $table->class = 'widget_groups_status'; + $table->cellspacing = '0'; + $table->width = '100%'; + $table->data = []; + $table->size = []; + $table->colspan = []; + $table->cellstyle = []; + + $table->size[0] = '50%'; + $table->size[1] = '50%'; + + $style = 'border-bottom:1px solid #ECECEC; text-align: center;'; + $table->cellstyle[0][0] = $style; + $table->cellstyle[0][1] = $style; + $table->cellstyle[1][0] = 'padding-top: 10px;'; + $table->cellstyle[1][1] = 'padding-top: 10px;'; + + // Head agents. + $table->data[0][0] = ''; + $table->data[0][0] .= html_print_image( + 'images/agent.png', + true, + ['alt' => __('Agents')] + ); + $table->data[0][0] .= ' '; + $table->data[0][0] .= __('Agents'); + $table->data[0][0] .= ''; + $table->data[0][0] .= ''; + $table->data[0][1] = ''; + $table->data[0][1] .= ''; + $table->data[0][1] .= $stats['total_agents']; + $table->data[0][1] .= ''; + $table->data[0][1] .= ''; + + if ($stats['total_agents'] !== 0) { + // Agent Critical. + $table->data[1][0] = $this->getCellCounter( + $stats['agent_critical'], + '#e63c52' + ); + + // Agent Warning. + $table->data[2][0] = $this->getCellCounter( + $stats['agent_warning'], + '#f3b200' + ); + + // Agent OK. + $table->data[3][0] = $this->getCellCounter( + $stats['agent_ok'], + '#82b92e' + ); + + // Agent Unknown. + $table->data[1][1] = $this->getCellCounter( + $stats['agent_unknown'], + '#B2B2B2' + ); + + // Agent Not Init. + $table->data[2][1] = $this->getCellCounter( + $stats['agent_not_init'], + '#5bb6e5' + ); + + $data .= html_print_table($table, true); + $data .= '
'; + + $data .= '
'; + + $table = new \stdClass(); + $table->class = 'widget_groups_status'; + $table->cellspacing = '0'; + $table->width = '100%'; + $table->data = []; + $table->size = []; + $table->colspan = []; + $table->cellstyle = []; + + $table->size[0] = '50%'; + $table->size[1] = '50%'; + + $style = 'border-bottom:1px solid #ECECEC; text-align: center;'; + $table->cellstyle[0][0] = $style; + $table->cellstyle[0][1] = $style; + $table->cellstyle[1][0] = 'padding-top: 20px;'; + $table->cellstyle[1][1] = 'padding-top: 20px;'; + + // Head Modules. + $table->data[0][0] = ''; + $table->data[0][0] .= html_print_image( + 'images/module.png', + true, + ['alt' => __('Modules')] + ); + + $table->data[0][0] .= ''; + $table->data[0][0] .= __('Modules'); + $table->data[0][0] .= ''; + $table->data[0][0] .= ''; + $table->data[0][1] = ''; + $table->data[0][1] .= ''; + $table->data[0][1] .= $stats['monitor_total']; + $table->data[0][1] .= ''; + $table->data[0][1] .= ''; + + // Modules Critical. + $table->data[1][0] = $this->getCellCounter( + $stats['monitor_critical'], + '#e63c52' + ); + + // Modules Warning. + $table->data[2][0] = $this->getCellCounter( + $stats['monitor_warning'], + '#f3b200' + ); + + // Modules OK. + $table->data[3][0] = $this->getCellCounter( + $stats['monitor_ok'], + '#82b92e' + ); + + // Modules Unknown. + $table->data[1][1] = $this->getCellCounter( + $stats['monitor_unknown'], + '#B2B2B2' + ); + + // Modules Not Init. + $table->data[2][1] = $this->getCellCounter( + $stats['monitor_not_init'], + '#5bb6e5' + ); + + $data .= html_print_table($table, true); + $data .= '
'; + } else { + // Not agents in this group. + $table->colspan[1][0] = 2; + $table->data[1][0] = __('Not agents in this group'); + $data .= html_print_table($table, true); + $data .= '
'; + } + + $style = 'min-width:200px; min-height:460px;'; + $output = '
'; + $output .= $data; + $output .= '
'; + + return $output; + } + + + /** + * Draw cell. + * + * @param integer|null $count Counter. + * @param string $color Background color cell. + * + * @return string + */ + protected function getCellCounter(?int $count, string $color):string + { + $output = '
'; + if (isset($count) === true + && $count !== 0 + ) { + $output .= $count; + } else { + $output .= 0; + } + + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('General group status'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'groups_status'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/maps_made_by_user.php b/pandora_console/include/lib/Dashboard/Widgets/maps_made_by_user.php new file mode 100644 index 0000000000..baa6765789 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/maps_made_by_user.php @@ -0,0 +1,426 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Cell Id. + $this->cellId = $cellId; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Visual Console'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'maps_made_by_user'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['vcId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + $fields = \visual_map_get_user_layouts($config['id_user'], true); + + // Event Type. + $inputs[] = [ + 'label' => __('Event type'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'vcId', + 'selected' => $values['vcId'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['vcId'] = \get_parameter('vcId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $visualConsole = null; + try { + $visualConsole = VisualConsole::fromDB( + ['id' => $this->values['vcId']] + ); + } catch (Throwable $e) { + db_pandora_audit( + 'ACL Violation', + 'Trying to access visual console without Id' + ); + include 'general/noaccess.php'; + exit; + } + + $size['width'] = ($size['width'] + 30); + + $visualConsoleData = $visualConsole->toArray(); + $ratio_visualconsole = ($visualConsoleData['height'] / $visualConsoleData['width']); + $ratio_t = ($size['width'] / $visualConsoleData['width']); + $radio_h = ($size['height'] / $visualConsoleData['height']); + + $visualConsoleData['width'] = $size['width']; + $visualConsoleData['height'] = ($size['width'] * $ratio_visualconsole); + + if ($visualConsoleData['height'] > $size['height']) { + $ratio_t = $radio_h; + + $visualConsoleData['height'] = $size['height']; + $visualConsoleData['width'] = ($size['height'] / $ratio_visualconsole); + } + + $groupId = $visualConsoleData['groupId']; + $visualConsoleName = $visualConsoleData['name']; + + // ACL. + $aclRead = check_acl($config['id_user'], $groupId, 'VR'); + $aclWrite = check_acl($config['id_user'], $groupId, 'VW'); + $aclManage = check_acl($config['id_user'], $groupId, 'VM'); + + if ($aclRead === 0 && $aclWrite === 0 && $aclManage === 0) { + db_pandora_audit( + 'ACL Violation', + 'Trying to access visual console without group access' + ); + include 'general/noaccess.php'; + exit; + } + + $uniq = uniqid(); + + $output = '
'; + // Style. + $style = 'width:'.$visualConsoleData['width'].'px;'; + // Class. + $class = 'visual-console-container-dashboard c-'.$uniq; + // Id. + $id = 'visual-console-container-'.$this->cellId; + $output .= '
'; + $output .= '
'; + $output .= '
'; + + // Check groups can access user. + $aclUserGroups = []; + if (users_can_manage_group_all('AR') === true) { + $aclUserGroups = array_keys( + users_get_groups(false, 'AR') + ); + } + + $ignored_params['refr'] = ''; + \ui_require_javascript_file( + 'tiny_mce', + 'include/javascript/tiny_mce/' + ); + \ui_require_javascript_file( + 'pandora_visual_console', + 'include/javascript/', + true + ); + \include_javascript_d3(); + \visual_map_load_client_resources(); + + // Load Visual Console Items. + $visualConsoleItems = VisualConsole::getItemsFromDB( + $this->values['vcId'], + $aclUserGroups, + $ratio_t + ); + + // Horrible trick! due to the use of tinyMCE + // it is necessary to modify specific classes of each + // of the visual consoles. + $output .= ''; + + $visualConsoleItems = array_reduce( + $visualConsoleItems, + function ($carry, $item) use ($ratio_t) { + $carry[] = $item->toArray(); + return $carry; + }, + [] + ); + + $settings = \json_encode( + [ + 'props' => $visualConsoleData, + 'items' => $visualConsoleItems, + 'baseUrl' => ui_get_full_url('/', false, false, false), + 'ratio' => $ratio_t, + 'size' => $size, + 'cellId' => $this->cellId, + ] + ); + + $output .= ''; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Visual Console'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'maps_made_by_user'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/maps_status.php b/pandora_console/include/lib/Dashboard/Widgets/maps_status.php new file mode 100755 index 0000000000..083a3bd2b3 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/maps_status.php @@ -0,0 +1,339 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('General visual maps report'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'maps_status'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['maps']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + include_once $config['homedir'].'/include/functions_visual_map.php'; + + $dataVc = \visual_map_get_user_layouts( + $config['id_user'], + false, + [], + true, + false + ); + + $fields = array_reduce( + $dataVc, + function ($carry, $item) { + $carry[$item['id']] = $item['name']; + return $carry; + }, + [] + ); + + $inputs[] = [ + 'label' => __('Maps'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'maps[]', + 'selected' => explode(',', $values['maps'][0]), + 'multiple' => true, + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['maps'] = \get_parameter('maps', []); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + include_once $config['homedir'].'/include/functions_visual_map.php'; + + $user_layouts = \visual_map_get_user_layouts( + $config['id_user'], + false, + [], + true, + false + ); + + $table = new \stdClass(); + $table->class = 'widget_maps_status'; + $table->width = '90%'; + $table->data = []; + + $maps = explode(',', $this->values['maps'][0]); + $output = ''; + if (isset($maps) === true && empty($maps) === false) { + foreach ($maps as $id_layout) { + $data = []; + + $url = $config['homeurl']; + $url .= 'index.php?sec=visualc'; + $url .= '&sec2=operation/visual_console/render_view&refr=60'; + + // This will give us the group name. + $data[0] = ''; + $data[0] .= $user_layouts[$id_layout]['name']; + $data[0] .= ''; + + // Status 0 is OK. + if (!\visual_map_get_layout_status($id_layout)) { + $data[1] = html_print_image( + 'images/pixel_green.png', + true, + [ + 'title' => __('OK'), + 'class' => 'status', + ] + ); + } else { + $data[1] = html_print_image( + 'images/pixel_red.png', + true, + [ + 'title' => __('Bad'), + 'class' => 'status', + ] + ); + } + + array_push($table->data, $data); + } + + // 31 px for each map. + $minHeight = (count($maps) * 31); + $style = 'min-width:200px; min-height:'.$minHeight.'px'; + $output = '
'; + $output .= html_print_table($table, true); + $output .= '
'; + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('General visual maps report'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'maps_status'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/module_icon.php b/pandora_console/include/lib/Dashboard/Widgets/module_icon.php new file mode 100644 index 0000000000..10ed9f8948 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/module_icon.php @@ -0,0 +1,485 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Icon and module value'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'module_icon'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + $this->dashboardId = $dashboardId; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['sizeValue']) === false) { + $values['sizeValue'] = 20; + } + + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + if (isset($values['sizeIcon']) === false) { + $values['sizeIcon'] = 70; + } + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + $all_images = \list_files( + $config['homedir'].'/images/console/icons/', + 'png', + 1, + 0 + ); + + foreach ($all_images as $image_file) { + if (\strpos($image_file, '_bad') !== false) { + continue; + } + + if (\strpos($image_file, '_ok') !== false) { + continue; + } + + if (\strpos($image_file, '_warning') !== false) { + continue; + } + + $image_file = \substr($image_file, 0, (\strlen($image_file) - 4)); + $images_list[$image_file] = $image_file; + } + + $settings = \base64_encode( + \json_encode( + [ + 'url' => ui_get_full_url('ajax.php'), + 'page' => 'operation/dashboard/dashboard', + 'dashboardId' => $this->dashboardId, + ] + ) + ); + + $inputs[] = [ + 'label' => __('Icon'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $images_list, + 'name' => 'imageSrc', + 'selected' => $values['imageSrc'], + 'script' => 'imageIconChange(\''.$settings.'\')', + 'return' => true, + ], + ]; + + $image = Manager::imageIconDashboard($values['imageSrc']); + + $inputs[] = [ + 'block_id' => 'image-item', + 'class' => 'flex-row flex-end w100p', + 'direct' => 1, + 'block_content' => [ + ['label' => $image], + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Text size of value in px'), + 'arguments' => [ + 'name' => 'sizeValue', + 'type' => 'number', + 'value' => $values['sizeValue'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + // 'Size of icon. + $inputs[] = [ + 'label' => __('Size of icon'), + 'arguments' => [ + 'name' => 'sizeIcon', + 'type' => 'number', + 'value' => $values['sizeIcon'], + 'return' => true, + 'min' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['imageSrc'] = \get_parameter('imageSrc', 'appliance'); + $values['sizeValue'] = \get_parameter('sizeValue', 0); + $values['sizeLabel'] = \get_parameter_switch('sizeLabel'); + $values['sizeIcon'] = \get_parameter_switch('sizeIcon'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + include_once $config['homedir'].'/include/functions_agents.php'; + include_once $config['homedir'].'/include/functions_modules.php'; + + $output = ''; + + $id_group = \agents_get_agent_group($this->values['agentId']); + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $modulesAgent = \modules_get_agentmodule_agent( + $this->values['moduleId'] + ); + + if ($modulesAgent !== (int) $this->values['agentId']) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $data_module = \modules_get_last_value( + $this->values['moduleId'] + ); + + $icon = $this->values['imageSrc']; + $label = $this->values['label']; + $sizeLabel = (($this->values['sizeLabel'] !== 0) ? $this->values['sizeLabel'] : 20); + $sizeValue = (($this->values['sizeValue'] !== 0) ? $this->values['sizeValue'] : 20); + $sizeIcon = (($this->values['sizeIcon'] !== 0) ? $this->values['sizeIcon'] : 100); + + $output .= '
'; + // General div. + $output .= '
'; + + // Div image. + $output .= '
'; + $output .= html_print_image( + 'images/console/icons/'.$icon.'.png', + true, + ['width' => $sizeIcon] + ); + $output .= '
'; + + // Div value. + $output .= '
'; + $output .= remove_right_zeros( + number_format($data_module, $config['graph_precision']) + ); + $output .= '
'; + + if (empty($label) === false) { + // Div Label. + $output .= '
'.$label.'
'; + } + + $output .= '
'; + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Icon and module value'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'module_icon'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/module_status.php b/pandora_console/include/lib/Dashboard/Widgets/module_status.php new file mode 100644 index 0000000000..06fd65afd3 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/module_status.php @@ -0,0 +1,484 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Module status'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'module_status'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + if (isset($values['sizeIcon']) === false) { + $values['sizeIcon'] = 70; + } + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + $all_images = \list_files( + $config['homedir'].'/images/console/icons/', + 'png', + 1, + 0 + ); + + foreach ($all_images as $image_file) { + if (\strpos($image_file, '_bad') !== false) { + continue; + } + + if (\strpos($image_file, '_ok') !== false) { + continue; + } + + if (\strpos($image_file, '_warning') !== false) { + continue; + } + + $image_file = \substr($image_file, 0, (\strlen($image_file) - 4)); + $images_list[$image_file] = $image_file; + } + + $settings = \base64_encode( + \json_encode( + [ + 'url' => ui_get_full_url('ajax.php'), + 'page' => 'operation/dashboard/dashboard', + 'dashboardId' => $this->dashboardId, + ] + ) + ); + + $inputs[] = [ + 'label' => __('Icon'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $images_list, + 'name' => 'imageSrc', + 'selected' => $values['imageSrc'], + 'script' => 'imageIconChange(\''.$settings.'\')', + 'return' => true, + ], + ]; + + $image = Manager::imageIconDashboard($values['imageSrc']); + + $inputs[] = [ + 'block_id' => 'image-item', + 'class' => 'flex-row flex-end w100p', + 'direct' => 1, + 'block_content' => [ + ['label' => $image], + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + // 'Size of icon. + $inputs[] = [ + 'label' => __('Size of icon'), + 'arguments' => [ + 'name' => 'sizeIcon', + 'type' => 'number', + 'value' => $values['sizeIcon'], + 'return' => true, + 'min' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['imageSrc'] = \get_parameter('imageSrc', 'appliance'); + $values['sizeValue'] = \get_parameter('sizeValue', 0); + $values['sizeLabel'] = \get_parameter_switch('sizeLabel'); + $values['sizeIcon'] = \get_parameter_switch('sizeIcon'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output .= ''; + + $id_agent = $this->values['agentId']; + $id_group = agents_get_agent_group($id_agent); + + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $id_module = $this->values['moduleId']; + + if (modules_get_agentmodule_agent($id_module) !== (int) $id_agent) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $icon = $this->values['imageSrc']; + $label = $this->values['label']; + $sizeLabel = (isset($this->values['sizeLabel']) === true) ? $this->values['sizeLabel'] : 30; + $sizeIcon = (isset($this->values['sizeIcon']) === true) ? $this->values['sizeIcon'] : 80; + + $status_module = modules_get_agentmodule_last_status($id_module); + + switch ($status_module) { + case 1: + // Critical (BAD). + $icon .= '_bad.png'; + break; + + case 4: + // Critical (ALERT). + $icon = '4'.$icon.'_bad.png'; + break; + + case 0: + // Normal (OK). + $icon .= '_ok.png'; + break; + + case 2: + // Warning. + $icon .= '_warning.png'; + break; + + case 10: + // Warning (ALERT). + $icon = '4'.$icon.'_warning.png'; + break; + + case 3: + default: + // Unknown. + // Default is Grey (Other). + $icon .= '.png'; + break; + } + + $output .= '
'; + // General div. + $output .= '
'; + + // Div image. + $output .= '
'; + $output .= html_print_image( + 'images/console/icons/'.$icon, + true, + ['width' => $sizeIcon] + ); + $output .= '
'; + + if (empty($label) === false) { + // Div Label. + $output .= '
'.$label.'
'; + } + + $output .= '
'; + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Module status'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'module_status'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/module_table_value.php b/pandora_console/include/lib/Dashboard/Widgets/module_table_value.php new file mode 100644 index 0000000000..a817ffce8b --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/module_table_value.php @@ -0,0 +1,395 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Show module value in a table'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'module_table_value'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + $fields = [ + '<br>' => __('Carriage Return'), + '|' => __('Vertical Bar'), + ';' => __('Semicolon'), + ':' => __('Colon'), + ',' => __('Commas'), + ' ' => __('Blank'), + ]; + + $inputs[] = [ + 'label' => __('Data separator'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'separator', + 'selected' => $values['separator'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['sizeLabel'] = \get_parameter('sizeLabel', 0); + $values['separator'] = \get_parameter_switch('separator'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + $id_agent = $this->values['agentId']; + $id_group = \agents_get_agent_group($id_agent); + + $id_module = $this->values['moduleId']; + $size_text = $this->values['sizeLabel']; + + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + if (modules_get_agentmodule_agent($id_module) !== (int) $id_agent) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $data_module = modules_get_last_value($id_module); + $value = (string) $data_module; + + $array_values = explode(' ', io_safe_input($value)); + + if (isset($array_values) === true && is_array($array_values) === true) { + io_safe_output_array($array_values); + + $value = implode( + io_safe_output( + $this->values['separator'] + ), + $array_values + ); + + $value = preg_replace( + '/'.$this->values['separator'].'/i', + '
', + $value + ); + } else { + $value = preg_replace( + '/\n/i', + io_safe_output( + $this->values['separator'] + ), + io_safe_output($value) + ); + $value = preg_replace('/\s/i', ' ', $value); + } + + $output .= '
'; + $output .= '
'; + $styles = 'width:100%; font-family:monospace; word-wrap: break-word;'; + $output .= '
'; + $output .= $value; + $output .= '
'; + $output .= '
'; + $output .= '
'; + + return $output; + + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Module in a table'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'module_table_value'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/module_value.php b/pandora_console/include/lib/Dashboard/Widgets/module_value.php new file mode 100644 index 0000000000..b1606be21b --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/module_value.php @@ -0,0 +1,387 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Module value'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'module_value'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Default values. + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + if (isset($values['sizeValue']) === false) { + $values['sizeValue'] = 20; + } + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Text size of value in px'), + 'arguments' => [ + 'name' => 'sizeValue', + 'type' => 'number', + 'value' => $values['sizeValue'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['sizeValue'] = \get_parameter('sizeValue', 0); + $values['sizeLabel'] = \get_parameter_switch('sizeLabel'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output .= ''; + + $id_agent = $this->values['agentId']; + $id_group = agents_get_agent_group($id_agent); + + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $id_module = $this->values['moduleId']; + + if (modules_get_agentmodule_agent($id_module) !== (int) $id_agent) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $data_module = \modules_get_last_value($id_module); + + $label = $this->values['label']; + $sizeLabel = (isset($this->values['sizeLabel']) === true) ? $this->values['sizeLabel'] : 40; + $sizeValue = (isset($this->values['sizeValue']) === true) ? $this->values['sizeValue'] : 40; + + $output .= '
'; + // General div. + $output .= '
'; + // Div value. + $output .= '
'; + $output .= remove_right_zeros( + number_format($data_module, $config['graph_precision']) + ); + $output .= '
'; + + if (empty($label) === false) { + // Div Label. + $output .= '
'.$label.'
'; + } + + $output .= '
'; + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Module value'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'module_value'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/monitor_health.php b/pandora_console/include/lib/Dashboard/Widgets/monitor_health.php new file mode 100644 index 0000000000..0d364de6ee --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/monitor_health.php @@ -0,0 +1,335 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Global health info'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'monitor_health'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (isset($this->values['title']) === false) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + include_once $config['homedir'].'/include/functions_reporting.php'; + include_once $config['homedir'].'/include/functions_graph.php'; + include_once $config['homedir'].'/include/functions_servers.php'; + include_once $config['homedir'].'/include/functions_tactical.php'; + + $size = parent::getSize(); + + $all_data = tactical_status_modules_agents( + $config['id_user'], + $user_strict, + 'AR' + ); + + $data = []; + + $data['mNI'] = (int) $all_data['_monitors_not_init_']; + $data['monitor_unknown'] = (int) $all_data['_monitors_unknown_']; + $data['monitor_ok'] = (int) $all_data['_monitors_ok_']; + $data['mW'] = (int) $all_data['_monitors_warning_']; + $data['mC'] = (int) $all_data['_monitors_critical_']; + $data['mNN'] = (int) $all_data['_monitor_not_normal_']; + $data['monitor_alerts'] = (int) $all_data['_monitors_alerts_']; + $data['mAFired'] = (int) $all_data['_monitors_alerts_fired_']; + + $data['total_agents'] = (int) $all_data['_total_agents_']; + + $data['mChecks'] = (int) $all_data['_monitor_checks_']; + if (empty($all_data) === false) { + if ($data['mNN'] > 0 && $data['mChecks'] > 0) { + $data['monitor_health'] = \format_numeric( + (100 - ($data['mNN'] / ($data['mChecks'] / 100))), + 1 + ); + } else { + $data['monitor_health'] = 100; + } + + if ($data['mNI'] > 0 && $data['mChecks'] > 0) { + $data['module_sanity'] = \format_numeric( + (100 - ($data['mNI'] / ($data['mChecks'] / 100))), + 1 + ); + } else { + $data['module_sanity'] = 100; + } + + if (isset($data['alerts']) === true) { + if ($data['mAfired'] > 0 && $data['alerts'] > 0) { + $data['alert_level'] = \format_numeric( + (100 - ($data['mAfired'] / ($data['alerts'] / 100))), + 1 + ); + } else { + $data['alert_level'] = 100; + } + } else { + $data['alert_level'] = 100; + $data['alerts'] = 0; + } + + $data['monitor_bad'] = ($data['mC'] + $data['mW']); + + if ($data['monitor_bad'] > 0 && $data['mChecks'] > 0) { + $data['global_health'] = \format_numeric( + (100 - ($data['monitor_bad'] / ($data['mChecks'] / 100))), + 1 + ); + } else { + $data['global_health'] = 100; + } + + $data['server_sanity'] = \format_numeric( + (100 - $data['module_sanity']), + 1 + ); + } + + $table = new \stdClass; + $table->width = '90%'; + $table->class = 'nothing'; + + $table->align[0] = 'center'; + + $table->data[0][0] = \reporting_get_stats_indicators( + $data, + ((int) $size['width'] - 100), + 20 + ); + + $output = '
'; + $output .= \html_print_table($table, true); + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Global health info'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'monitor_health'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/network_map.php b/pandora_console/include/lib/Dashboard/Widgets/network_map.php new file mode 100644 index 0000000000..c873bbbec1 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/network_map.php @@ -0,0 +1,380 @@ +cellId = $cellId; + + // Width. + $this->width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Network map'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'network_map'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['networkmapId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['xOffset']) === false) { + $values['xOffset'] = 0; + } + + if (isset($values['yOffset']) === false) { + $values['yOffset'] = 0; + } + + if (isset($values['zoomLevel']) === false) { + $values['zoomLevel'] = 0.5; + } + + // Map. + $fields = \networkmap_get_networkmaps(); + + $inputs[] = [ + 'label' => __('Map'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'networkmapId', + 'selected' => $values['networkmapId'], + 'return' => true, + ], + ]; + + // X offset. + $help = ui_print_help_tip( + __('Introduce x-axis data. Right=positive Left=negative'), + true + ); + $inputs[] = [ + 'label' => __('X offset').$help, + 'arguments' => [ + 'name' => 'xOffset', + 'type' => 'number', + 'value' => $values['xOffset'], + 'return' => true, + ], + ]; + + // Y offset. + $help = ui_print_help_tip( + __('Introduce Y-axis data. Top=positive Bottom=negative'), + true + ); + $inputs[] = [ + 'label' => __('Y offset').$help, + 'arguments' => [ + 'name' => 'yOffset', + 'type' => 'number', + 'value' => $values['yOffset'], + 'return' => true, + ], + ]; + + // Zoom level. + $fields = [ + '0.1' => 'x1', + '0.2' => 'x2', + '0.3' => 'x3', + '0.4' => 'x4', + '0.5' => 'x5', + '0.6' => 'x6', + '0.7' => 'x7', + '0.8' => 'x8', + '0.9' => 'x9', + '1' => 'x10', + ]; + + $inputs[] = [ + 'label' => __('Zoom level').$help, + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'zoomLevel', + 'selected' => $values['zoomLevel'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['networkmapId'] = \get_parameter('networkmapId', 0); + $values['xOffset'] = \get_parameter('xOffset', 0); + $values['yOffset'] = \get_parameter('yOffset', 0); + $values['zoomLevel'] = (float) \get_parameter('zoomLevel', 0.5); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $id_networkmap = $this->values['networkmapId']; + $x_offset = $this->values['xOffset']; + $y_offset = $this->values['yOffset']; + $zoom_dash = $this->values['zoomLevel']; + + $hash = md5($config['dbpass'].$id_networkmap.$config['id_user']); + + $style = 'width:'.$size['width'].'px; height:'.$size['height'].'px;'; + $id = 'body_cell-'.$this->cellId; + $output = '
'; + + $settings = \json_encode( + [ + 'cellId' => $this->cellId, + 'page' => 'enterprise/include/ajax/map_enterprise.ajax', + 'url' => ui_get_full_url( + 'ajax.php', + false, + false, + false + ), + 'networkmap_id' => $id_networkmap, + 'x_offset' => $x_offset, + 'y_offset' => $y_offset, + 'zoom_dash' => $zoom_dash, + 'id_user' => $config['id_user'], + 'hash' => $hash, + + ] + ); + + $output .= ''; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Network map'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'network_map'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/post.php b/pandora_console/include/lib/Dashboard/Widgets/post.php new file mode 100755 index 0000000000..be8bdd9193 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/post.php @@ -0,0 +1,266 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Panel with a message'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'post'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['text']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + $inputs[] = ['label' => __('Text')]; + + $inputs[] = [ + 'class' => 'flex-row', + 'id' => 'div-textarea', + 'arguments' => [ + 'name' => 'text', + 'type' => 'textarea', + 'value' => $values['text'], + 'return' => true, + 'rows' => 1, + 'columns' => 1, + 'size' => 25, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['text'] = \get_parameter('text', ''); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + $output = ''; + + if (isset($this->values['text']) === true) { + $output .= '
'; + $output .= io_safe_output($this->values['text']); + $output .= '
'; + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Panel with a message'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'post'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/reports.php b/pandora_console/include/lib/Dashboard/Widgets/reports.php new file mode 100644 index 0000000000..5ae3a5c70d --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/reports.php @@ -0,0 +1,360 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Custom report'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'reports'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['reportId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Reports. + $reports = \reports_get_reports(false, ['id_report', 'name']); + $fields = array_reduce( + $reports, + function ($carry, $item) { + $carry[$item['id_report']] = $item['name']; + return $carry; + }, + [] + ); + + $inputs[] = [ + 'label' => __('Report'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'reportId', + 'selected' => $values['reportId'], + 'return' => true, + 'style' => 'width: inherit;', + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['reportId'] = \get_parameter('reportId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $output = ''; + ob_start(); + if ($this->values['reportId'] !== 0) { + $output .= '
'; + $this->printReport(); + $output .= ob_get_clean(); + + $output .= 'Click to view: '.__('Report').''; + $output .= '
'; + } else { + $this->load_error = true; + } + + return $output; + } + + + /** + * Draw Report. + * + * @return mixed + */ + public function printReport() + { + global $config; + + $id_report = $this->values['reportId']; + + // Get Report record (to get id_group). + $report = db_get_row('treport', 'id_report', $id_report); + + // Include with the functions to calculate each kind of report. + include_once $config['homedir'].'/include/functions_reporting.php'; + + // Check if the report is a private report. + if (empty($report) === true + || ($report['private'] === true + && ($report['id_user'] !== $config['id_user'] + && is_user_admin($config['id_user']) === false)) + ) { + include $config['homedir'].'/general/noaccess.php'; + return ''; + } + + // Get different date to search the report. + $utimestamp = get_system_time(); + $date = date('Y-m-j', $utimestamp); + $time = date('h:iA', $utimestamp); + + $report['datetime'] = $utimestamp; + + // Evaluate if it's better to render blocks when are calculated + // (enabling realtime flush) or if it's better to wait report to be + // finished before showing anything (this could break the execution by + // overflowing the running PHP memory on HUGE reports). + $table = new \stdClass(); + $table->size = []; + $table->style = []; + $table->width = '99%'; + $table->class = 'databox report_table'; + $table->rowclass = []; + $table->rowclass[0] = 'datos3'; + + $report['group_name'] = groups_get_name($report['id_group']); + + $contents = db_get_all_rows_field_filter( + 'treport_content', + 'id_report', + $id_report, + '`order`' + ); + + if ($contents === false) { + return ''; + } + + $report = reporting_make_reporting_data( + null, + $id_report, + $date, + $time, + false, + 'dinamic' + ); + + reporting_html_print_report($report, true); + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Custom report'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'reports'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/service_map.php b/pandora_console/include/lib/Dashboard/Widgets/service_map.php new file mode 100644 index 0000000000..401852b070 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/service_map.php @@ -0,0 +1,360 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Service Map'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'service_map'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['serviceId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + $services_res = services_get_services(); + $services = [0 => __('None')]; + if ($services_res !== false) { + $fields = array_reduce( + $services_res, + function ($carry, $item) { + $carry[$item['id']] = $item['name']; + return $carry; + }, + [] + ); + } + + $inputs[] = [ + 'label' => __('Service'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'serviceId', + 'selected' => $values['serviceId'], + 'return' => true, + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + // Show legend. + $inputs[] = [ + 'label' => __('Show legend'), + 'arguments' => [ + 'name' => 'showLegend', + 'id' => 'showLegend', + 'type' => 'switch', + 'value' => $values['showLegend'], + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['serviceId'] = \get_parameter('serviceId', 0); + $values['showLegend'] = \get_parameter_switch('showLegend'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + if (check_acl($config['id_user'], 0, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('The user doesn\'t have permission to read agents'), + '', + true + ); + $output .= '
'; + return $output; + } + + if (empty($this->values['serviceId']) === true) { + $output .= '
'; + $output = ui_print_error_message( + __('Missing Service id'), + '', + true + ); + $output .= '
'; + return $output; + } + + $output .= "
"; + + if ($this->values['showLegend'] === 1) { + $output .= "
"; + $output .= ''; + $output .= "'; + $output .= ""; + + $output .= "'; + + // Coulour legend. + $output .= "'; + + $output .= "'; + $output .= ''; + + $output .= "'; + $output .= ''; + $output .= '
".__('Legend').'
"; + $output .= ""; + $output .= ''.__('Services').'"; + $output .= ''; + $output .= "'; + $output .= "'; + $output .= "'; + $output .= "'; + $output .= '
".__('Critical').'
".__('Warning').'
".__('Ok').'
".__('Unknown').'
'; + $output .= '
"; + $output .= ""; + $output .= ''.__('Agents').'
"; + $output .= ""; + $output .= ''.__('Modules').'
'; + $output .= '
'; + } + + $output .= html_print_input_hidden( + 'full_url_dashboard_map', + $config['homeurl'], + true + ); + // TODO:XXX fix draw service map. + ob_start(); + servicemap_print_servicemap( + $this->values['serviceId'], + false, + $size['width'], + $size['height'] + ); + $output .= ob_get_clean(); + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Service map'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'service_map'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/single_graph.php b/pandora_console/include/lib/Dashboard/Widgets/single_graph.php new file mode 100644 index 0000000000..bd7969dc72 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/single_graph.php @@ -0,0 +1,348 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Agent module graph'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'single_graph'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['period']) === false) { + $values['period'] = SECONDS_1DAY; + } + + if (isset($values['showLegend']) === false) { + $values['showLegend'] = 1; + } + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + // Show legend. + $inputs[] = [ + 'label' => __('Show legend'), + 'arguments' => [ + 'name' => 'showLegend', + 'id' => 'showLegend', + 'type' => 'switch', + 'value' => $values['showLegend'], + ], + ]; + + // Period. + $inputs[] = [ + 'label' => __('Interval'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'interval', + 'value' => $values['period'], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['period'] = \get_parameter('period', 0); + $values['showLegend'] = \get_parameter_switch('showLegend'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + include_once $config['homedir'].'/include/functions_graph.php'; + include_once $config['homedir'].'/include/functions_agents.php'; + include_once $config['homedir'].'/include/functions_modules.php'; + + $module_name = \modules_get_agentmodule_name($id_module); + $units_name = \modules_get_unit($id_module); + + $trickHight = 10; + if ($this->values['showLegend'] === 1) { + // Needed for legend. + $trickHight = 40; + } + + $params = [ + 'agent_module_id' => $this->values['moduleId'], + 'width' => ((int) $size['width'] - 5), + 'height' => ((int) $size['height'] - $trickHight), + 'period' => $this->values['period'], + 'title' => $module_name, + 'unit' => $units_name, + 'homeurl' => $config['homeurl'], + 'backgroundColor' => 'transparent', + 'show_legend' => $this->values['showLegend'], + 'show_title' => $module_name, + 'menu' => false, + ]; + + $output = '
'; + $output .= \grafico_modulo_sparse($params); + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Agent module graph'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'single_graph'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/sla_percent.php b/pandora_console/include/lib/Dashboard/Widgets/sla_percent.php new file mode 100644 index 0000000000..3cd1e72fc4 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/sla_percent.php @@ -0,0 +1,421 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('SLA percentage'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'sla_percent'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['period']) === false) { + $values['period'] = 300; + } + + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + if (isset($values['sizeValue']) === false) { + $values['sizeValue'] = 20; + } + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + ], + ]; + + // Period. + $inputs[] = [ + 'label' => __('Interval'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'interval', + 'value' => $values['period'], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Text size of value in px'), + 'arguments' => [ + 'name' => 'sizeValue', + 'type' => 'number', + 'value' => $values['sizeValue'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['period'] = \get_parameter('period', 0); + $values['sizeValue'] = \get_parameter('sizeValue', ''); + $values['sizeLabel'] = \get_parameter('sizeLabel', ''); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $output .= ''; + $id_agent = $this->values['agentId']; + $id_module = $this->values['moduleId']; + $period = $this->values['period']; + $label = $this->values['label']; + + $id_group = agents_get_agent_group($id_agent); + if (check_acl($config['id_user'], $id_group, 'AR') === 0) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + if (modules_get_agentmodule_agent($id_module) !== (int) $id_agent) { + $output .= '
'; + $output .= \ui_print_error_message( + __('You don\'t have access'), + '', + true + ); + $output .= '
'; + return $output; + } + + $sla_array = reporting_advanced_sla( + $id_module, + (time() - $period), + time(), + null, + null, + 0, + [ + '1' => 1, + '2' => 1, + '3' => 1, + '4' => 1, + '5' => 1, + '6' => 1, + '7' => 1, + ], + '00:00:00', + '00:00:00', + 1 + ); + + $sizeLabel = (isset($this->values['sizeLabel']) === true) ? $this->values['sizeLabel'] : 30; + $sizeValue = (isset($this->values['sizeValue']) === true) ? $this->values['sizeValue'] : 30; + + $output .= '
'; + // General div. + $output .= '
'; + // Div value. + $output .= '
'; + $output .= $sla_array['sla_fixed'].'%'; + $output .= '
'; + + if (empty($label) === false) { + // Div Label. + $output .= '
'.$label.'
'; + } + + $output .= '
'; + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('SLA percentage'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'sla_percent'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/system_group_status.php b/pandora_console/include/lib/Dashboard/Widgets/system_group_status.php new file mode 100644 index 0000000000..9691c3e81a --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/system_group_status.php @@ -0,0 +1,486 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Groups status'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'system_group_status'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['groupId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Restrict access to group. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId[]', + 'returnAllGroup' => true, + 'privilege' => 'ER', + 'selected' => explode(',', $values['groupId'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + // Graph Type. + $fields = [ + AGENT_STATUS_NORMAL => __('Normal'), + AGENT_STATUS_WARNING => __('Warning'), + AGENT_STATUS_CRITICAL => __('Critical'), + 4 => __('Alert Fired'), + ]; + + $inputs[] = [ + 'label' => __('Status'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'status[]', + 'selected' => explode(',', $values['status'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['groupId'] = \get_parameter('groupId', []); + $values['status'] = \get_parameter('status', []); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + include_once 'include/functions_groupview.php'; + + // ACL Check. + $agent_a = \check_acl($config['id_user'], 0, 'AR'); + $agent_w = \check_acl($config['id_user'], 0, 'AW'); + + if ($agent_a === 0 && $agent_w === 0) { + \db_pandora_audit( + 'ACL Violation', + 'Trying to access Agent view (Grouped)' + ); + include 'general/noaccess.php'; + exit; + } + + // Groups and tags. + $result_groups_info = \groupview_get_groups_list( + $config['id_user'], + ($agent_a === 1) ? 'AR' : (($agent_w === 1) ? 'AW' : 'AR') + ); + + $result_groups = $result_groups_info['groups']; + $result_groups = array_reduce( + $result_groups, + function ($carry, $item) { + $carry[$item['_id_']] = $item; + return $carry; + }, + [] + ); + + $this->values['groupId'] = explode(',', $this->values['groupId'][0]); + + if (count($this->values['groupId']) === 1 + && in_array(0, $this->values['groupId']) === true + ) { + $this->values['groupId'] = []; + foreach ($result_groups as $key => $value) { + $this->values['groupId'][] = $key; + } + } + + $this->values['status'] = explode(',', $this->values['status'][0]); + + $style = 'font-size: 12px; text-align: center;'; + + $table = new \stdClass(); + $table->class = 'group_modules_status_box'; + $table->cellpadding = '0'; + $table->cellspacing = '0'; + $table->width = '90%'; + $table->data = []; + $table->size = []; + $table->cellstyle = []; + + $i = 1; + + $show_normal = true; + $show_warning = true; + $show_critical = true; + $show_alert_fired = true; + $show_all = isset($this->values['status']) === false; + if ($show_all === false) { + $show_normal = in_array( + AGENT_STATUS_NORMAL, + $this->values['status'] + ) === true; + $show_warning = in_array( + AGENT_STATUS_WARNING, + $this->values['status'] + ) === true; + $show_critical = in_array( + AGENT_STATUS_CRITICAL, + $this->values['status'] + ) === true; + $show_alert_fired = in_array( + 4, + $this->values['status'] + ) === true; + } + + $flag_groups = false; + foreach ($this->values['groupId'] as $groupId) { + if (isset($result_groups[$groupId]) === true) { + $group = $result_groups[$groupId]; + } else { + $group = [ + '_monitors_critical_' => 0, + '_monitors_warning_' => 0, + '_monitors_unknown_' => 0, + '_monitors_not_init_' => 0, + '_monitors_ok_' => 0, + '_monitor_checks_' => 0, + '_monitors_alerts_fired_' => 0, + '_agents_critical_' => 0, + '_agents_warning_' => 0, + '_agents_unknown_' => 0, + '_agents_not_init_' => 0, + '_agents_ok_' => 0, + '_total_agents_' => 0, + '_name_' => groups_get_name($groupId), + '_id_' => $groupId, + '_icon_' => groups_get_icon($groupId), + '_monitor_not_normal_' => 0, + ]; + } + + if ($group['_id_'] === 0) { + continue; + } + + $flag_groups = true; + + if ((in_array($group['_id_'], $this->values['groupId'])) === true) { + $table->data[$i][] = ''.$group['_name_'].''; + + $url = $config['homeurl'].'index.php'; + $url .= '?sec=estado&sec2=operation/agentes/status_monitor'; + $url .= '&ag_group='.$group['_id_']; + + if ($show_normal === true) { + $outputLine = '
'; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= $group['_monitors_ok_']; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= '
'; + + $table->data[$i][] = $outputLine; + } + + if ($show_warning === true) { + $outputLine = '
'; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= $group['_monitors_warning_']; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= '
'; + + $table->data[$i][] = $outputLine; + } + + if ($show_critical === true) { + $outputLine = '
'; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= $group['_monitors_critical_']; + $outputLine .= ''; + $outputLine .= ''; + $outputLine .= '
'; + + $table->data[$i][] = $outputLine; + } + + if ($show_alert_fired === true) { + $outputLine = '
'; + $outputLine .= ''; + $outputLine .= 'data[$i][] = $outputLine; + } + + $i++; + } + } + + $height = (count($result_groups) * 30); + $style = 'min-width:200px; min-height:'.$height.'px;'; + $output = '
'; + if ($flag_groups === true) { + $output .= html_print_table($table, true); + } else { + $output .= '
'; + $output .= \ui_print_info_message( + __('Not modules in this groups'), + '', + true + ); + $output .= '
'; + return $output; + } + + $output .= '
'; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Groups status'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'system_group_status'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/tactical.php b/pandora_console/include/lib/Dashboard/Widgets/tactical.php new file mode 100755 index 0000000000..bee5f4164c --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/tactical.php @@ -0,0 +1,459 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // PM Access. + $this->pmAccess = \users_can_manage_group_all('PM'); + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Tactical view'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'tactical'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['statusMonitor']) === true + && empty($this->values['serverPerformance']) === true + && empty($this->values['summary']) === true + ) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['statusMonitor']) === false) { + $values['statusMonitor'] = 1; + } + + if (isset($values['serverPerformance']) === false) { + $values['serverPerformance'] = 1; + } + + if (isset($values['summary']) === false) { + $values['summary'] = 1; + } + + // Status and Monitor checks. + $inputs[] = [ + 'label' => __('Status and Monitor checks'), + 'arguments' => [ + 'name' => 'statusMonitor', + 'id' => 'statusMonitor', + 'type' => 'switch', + 'value' => $values['statusMonitor'], + ], + ]; + + if ($this->pmAccess === true) { + // Server performance. + $inputs[] = [ + 'label' => __('Server performance'), + 'arguments' => [ + 'name' => 'serverPerformance', + 'id' => 'serverPerformance', + 'type' => 'switch', + 'value' => $values['serverPerformance'], + ], + ]; + } + + // Summary. + $inputs[] = [ + 'label' => __('Summary'), + 'arguments' => [ + 'name' => 'summary', + 'id' => 'summary', + 'type' => 'switch', + 'value' => $values['summary'], + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['statusMonitor'] = \get_parameter_switch('statusMonitor'); + $values['serverPerformance'] = \get_parameter_switch( + 'serverPerformance' + ); + $values['summary'] = \get_parameter_switch('summary'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + + $all_data = \tactical_status_modules_agents($config['id_user']); + + $data = []; + + $data['monitor_not_init'] = (int) $all_data['_monitors_not_init_']; + $data['monitor_unknown'] = (int) $all_data['_monitors_unknown_']; + $data['monitor_ok'] = (int) $all_data['_monitors_ok_']; + $data['monitor_warning'] = (int) $all_data['_monitors_warning_']; + $data['monitor_critical'] = (int) $all_data['_monitors_critical_']; + $data['monitor_not_normal'] = (int) $all_data['_monitor_not_normal_']; + $data['monitor_alerts'] = (int) $all_data['_monitors_alerts_']; + $data['monitor_alerts_fired'] = (int) $all_data['_monitors_alerts_fired_']; + + $data['total_agents'] = (int) $all_data['_total_agents_']; + + $data['monitor_checks'] = (int) $all_data['_monitor_checks_']; + + // Percentages. + if (empty($all_data) === false) { + if ($data['monitor_not_normal'] > 0 + && $data['monitor_checks'] > 0 + ) { + $data['monitor_health'] = \format_numeric( + (100 - ($data['monitor_not_normal'] / ($data['monitor_checks'] / 100))), + 1 + ); + } else { + $data['monitor_health'] = 100; + } + + if ($data['monitor_not_init'] > 0 + && $data['monitor_checks'] > 0 + ) { + $data['module_sanity'] = \format_numeric( + (100 - ($data['monitor_not_init'] / ($data['monitor_checks'] / 100))), + 1 + ); + } else { + $data['module_sanity'] = 100; + } + + if (isset($data['alerts']) === true) { + if ($data['monitor_alerts_fired'] > 0 + && $data['alerts'] > 0 + ) { + $data['alert_level'] = \format_numeric( + (100 - ($data['monitor_alerts_fired'] / ($data['alerts'] / 100))), + 1 + ); + } else { + $data['alert_level'] = 100; + } + } else { + $data['alert_level'] = 100; + $data['alerts'] = 0; + } + + $data['monitor_bad'] = ($data['monitor_critical'] + $data['monitor_warning']); + + if ($data['monitor_bad'] > 0 + && $data['monitor_checks'] > 0 + ) { + $data['global_health'] = \format_numeric( + (100 - ($data['monitor_bad'] / ($data['monitor_checks'] / 100))), + 1 + ); + } else { + $data['global_health'] = 100; + } + + $data['server_sanity'] = \format_numeric( + (100 - $data['module_sanity']), + 1 + ); + } + + if ($this->values['statusMonitor'] === 1) { + $table = new \stdClass(); + $table->width = '100%'; + + $table->size[0] = '220px'; + + $table->align[0] = 'center'; + + $table->colspan = []; + $table->colspan[0][1] = 2; + + $table->rowclass = \array_fill(0, 9, ''); + + $table->data[0][0] = \reporting_get_stats_indicators( + $data, + 120, + 25 + ); + $table->data[0][0] .= \reporting_get_stats_alerts($data); + $table->cellstyle[0][0] = 'vertical-align: top;'; + + $table->data[0][1] = \reporting_get_stats_modules_status($data); + $table->data[0][1] .= '
'; + $table->data[0][1] .= \reporting_get_stats_agents_monitors($data); + $table->data[0][1] .= '
'; + $table->cellstyle[0][1] = 'vertical-align: top;'; + + $output .= \html_print_table($table, true); + } + + if ($this->values['serverPerformance'] === 1 + && $this->pmAccess === true + ) { + $table = new \stdClass(); + $table->width = '100%'; + $table->class = ''; + $table->cellpadding = 4; + $table->cellspacing = 4; + $table->border = 0; + $table->head = []; + $table->data = []; + $table->style = []; + + $table->data[0][0] = \reporting_get_stats_servers(); + + $output .= \html_print_table($table, true); + } + + if ($this->values['summary'] === 1) { + $table = new \stdClass(); + $table->width = '100%'; + $table->class = ''; + $table->cellpadding = 4; + $table->cellspacing = 4; + $table->border = 0; + $table->head = []; + $table->data = []; + $table->style = []; + + $table->data[0][0] = \reporting_get_stats_summary($data, 150, 100); + + $output .= \html_print_table($table, true); + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription():string + { + return __('Tactical view'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'tactical'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/top_n.php b/pandora_console/include/lib/Dashboard/Widgets/top_n.php new file mode 100644 index 0000000000..a7b8198546 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/top_n.php @@ -0,0 +1,490 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Top N of agent modules'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'top_n'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['agent']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['quantity']) === false) { + $values['quantity'] = 5; + } + + // Default values. + if (isset($values['period']) === false) { + $values['period'] = SECONDS_1DAY; + } + + // Agent. + $inputs[] = [ + 'label' => __('Agent').ui_print_help_tip( + __('Case insensitive regular expression for agent name. For example: Network.* will match with the following agent names: network_agent1, NetworK CHECKS'), + true + ), + 'arguments' => [ + 'name' => 'agent', + 'type' => 'text', + 'value' => $values['agent'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Module. + $inputs[] = [ + 'label' => __('Module').ui_print_help_tip( + __('Case insensitive regular expression or string for module name. For example: .*usage.* will match: cpu_usage, vram usage.'), + true + ), + 'arguments' => [ + 'name' => 'module', + 'type' => 'text', + 'value' => $values['module'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Period. + $inputs[] = [ + 'label' => __('Interval'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'interval', + 'value' => $values['period'], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + // Quantity (n). + $inputs[] = [ + 'label' => __('Quantity (n)'), + 'arguments' => [ + 'name' => 'quantity', + 'type' => 'number', + 'value' => $values['quantity'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Order. + $fields = [ + 1 => __('Descending'), + 2 => __('Ascending'), + 3 => __('By agent name'), + ]; + + $inputs[] = [ + 'label' => __('Order'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'order', + 'selected' => $values['order'], + 'return' => true, + 'sort' => false, + ], + ]; + + // Display. + $fields = [ + REPORT_TOP_N_AVG => __('Avg.'), + REPORT_TOP_N_MAX => __('Max.'), + REPORT_TOP_N_MIN => __('Min.'), + ]; + + $inputs[] = [ + 'label' => __('Display'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'display', + 'selected' => $values['display'], + 'return' => true, + 'sort' => false, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agent'] = \get_parameter('agent', ''); + $values['module'] = \get_parameter('module', ''); + $values['period'] = \get_parameter('period', 0); + $values['quantity'] = \get_parameter('quantity', 5); + $values['order'] = \get_parameter('order', 1); + $values['display'] = \get_parameter('display', REPORT_TOP_N_AVG); + + return $values; + } + + + /** + * Draw widget. + * + * @return string + */ + public function load() + { + global $config; + + $output = ''; + + $size = parent::getSize(); + + $quantity = $this->values['quantity']; + $period = $this->values['period']; + + switch ($this->values['display']) { + case 1: + $display = 'max'; + break; + + case 2: + $display = 'min'; + break; + + default: + case 0: + $display = 'avg'; + break; + } + + switch ($this->values['order']) { + case 2: + $order = $display.' DESC'; + break; + + case 3: + $order = 'alias ASC'; + break; + + default: + case 1: + $order = $display.' ASC'; + break; + } + + $agentRegex = $this->values['agent']; + + $moduleRegex = ''; + if (empty($this->values['module']) === false) { + $moduleRegex = sprintf( + "AND tam.nombre REGEXP '%s'", + $this->values['module'] + ); + } + + // This function check ACL. + $agents = agents_get_group_agents(0, ['aliasRegex' => $agentRegex]); + $agentsId = \array_keys($agents); + $agentsIdString = \implode(',', $agentsId); + + // Initialize variables. + $date = \get_system_time(); + $datelimit = ($date - $period); + $search_in_history_db = db_search_in_history_db($datelimit); + + $sql = \sprintf( + 'SELECT tam.id_agente_modulo as id_module, + tam.id_agente as id_agent, + ta.alias as aliasAgent, + tam.id_tipo_modulo as type_module, + tam.nombre as nameModule, + tam.unit as unit, + MIN(tad.datos) as `min`, + MAX(tad.datos) as `max`, + AVG(tad.datos) as `avg` + FROM tagente_modulo tam + INNER JOIN tagente ta + ON ta.id_agente = tam.id_agente + LEFT JOIN tagente_datos tad + ON tam.id_agente_modulo = tad.id_agente_modulo + WHERE tam.id_agente IN (%s) + %s + AND tad.utimestamp > %d + AND tad.utimestamp < %d + GROUP BY tad.id_agente_modulo + ORDER BY %s + LIMIT %d', + $agentsIdString, + $moduleRegex, + $datelimit, + $date, + $order, + $quantity + ); + + $modules = \db_get_all_rows_sql( + $sql, + $search_in_history_db + ); + + if (empty($modules) === true) { + $output .= '
'; + $output .= \ui_print_info_message( + __('There are no Agent/Modules defined'), + '', + true + ); + $output .= '
'; + return $output; + } + + $data_hbar = []; + foreach ($modules as $module) { + $item_name = ''; + $item_name = $module['aliasAgent'].' - '.$module['nameModule']; + $data_hbar[$item_name]['g'] = $module[$display]; + } + + $height = (count($data_hbar) * 25 + 35); + $output .= '
'; + $output .= hbar_graph( + array_reverse($data_hbar), + $size['width'], + $height, + [], + [], + '', + '', + '', + '', + $config['homedir'].'/images/logo_vertical_water.png', + $config['fontpath'], + $config['font_size'], + true, + 1, + $config['homeurl'], + 'white', + 'black' + ); + $output .= '
'; + + return $output; + + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Top N of agent modules'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'top_n'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_group.php b/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_group.php new file mode 100644 index 0000000000..10ddfb881a --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_group.php @@ -0,0 +1,434 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Top N events by agent'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'top_n_events_by_group'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['groupId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['amountShow']) === false) { + $values['amountShow'] = 10; + } + + if (isset($values['maxHours']) === false) { + $values['maxHours'] = 8; + } + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Amount to show'), + 'arguments' => [ + 'name' => 'amountShow', + 'type' => 'number', + 'value' => $values['amountShow'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Max. hours old'), + 'arguments' => [ + 'name' => 'maxHours', + 'type' => 'number', + 'value' => $values['maxHours'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Groups. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId[]', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => explode(',', $values['groupId'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + // Legend Position. + $fields = [ + 'bottom' => __('Bottom'), + 'hidden' => __('No legend'), + ]; + + $inputs[] = [ + 'label' => __('Legend Position'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'legendPosition', + 'selected' => $values['legendPosition'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['amountShow'] = \get_parameter('amountShow', 0); + $values['maxHours'] = \get_parameter('maxHours', 0); + $values['groupId'] = \get_parameter('groupId', []); + $values['legendPosition'] = \get_parameter('legendPosition', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + + $size = parent::getSize(); + + $this->values['groupId'] = explode(',', $this->values['groupId'][0]); + + if (empty($this->values['groupId']) === true) { + $output .= '
'; + $output .= \ui_print_info_message( + __('Please select one or more groups.'), + '', + true + ); + $output .= '
'; + return $output; + } else { + $timestamp = (time() - SECONDS_1HOUR * $this->values['maxHours']); + + $all_group = false; + // Search all. + if (array_search('0', $this->values['groupId']) !== false) { + $all_group = true; + } + + if ($all_group === false) { + $sql = sprintf( + 'SELECT id_agente, COUNT(*) AS count + FROM tevento + WHERE utimestamp >= %d + AND id_grupo IN (%s) + GROUP BY id_agente + ORDER BY count DESC + LIMIT %d', + implode(',', $this->values['groupId']), + $timestamp, + $this->values['amountShow'] + ); + } else { + $sql = sprintf( + 'SELECT id_agente, COUNT(*) AS count + FROM tevento + WHERE utimestamp >= %d + GROUP BY id_agente + ORDER BY count DESC + LIMIT %d', + $timestamp, + $this->values['amountShow'] + ); + } + + $result = db_get_all_rows_sql($sql); + + if (empty($result) === true) { + $output .= '
'; + $output .= \ui_print_error_message( + __('There is not data to show.'), + '', + true + ); + $output .= '
'; + return $output; + } else { + $data_pie = []; + foreach ($result as $row) { + if ($row['id_agente'] == 0) { + $name = __('System'); + } else { + $name = io_safe_output( + agents_get_alias($row['id_agente']) + ); + } + + $name .= ' ('.$row['count'].')'; + + $data_pie[$name] = $row['count']; + } + } + + $width = $size['width']; + $height = $size['height']; + + switch ($this->values['legendPosition']) { + case 'hidden': + $height = ($height - 50); + break; + + default: + case 'bottom': + $numleg = count($data_pie); + if ($numleg >= 4) { + $numleg = 4; + } else if ($numleg < 4 && $numleg > 1) { + $numleg = 2; + } else if ($numleg == 1) { + $numleg = 1.5; + } + + // % is for the pie group the slices and show only 5. + $height = ($height - (65 * ($numleg))); + break; + } + + $output .= pie_graph( + $data_pie, + $width, + $height, + __('other'), + '', + false, + $config['fontpath'], + $config['font_size'], + 1, + $this->values['legendPosition'], + '', + false + ); + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Top N events by agent'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'top_n_events_by_group'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_module.php b/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_module.php new file mode 100644 index 0000000000..4d9187bf80 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/top_n_events_by_module.php @@ -0,0 +1,471 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Top N events by module'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'top_n_events_by_module'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['groupId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Default values. + if (isset($values['amountShow']) === false) { + $values['amountShow'] = 10; + } + + if (isset($values['maxHours']) === false) { + $values['maxHours'] = 8; + } + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Amount to show'), + 'arguments' => [ + 'name' => 'amountShow', + 'type' => 'number', + 'value' => $values['amountShow'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Max. hours old'), + 'arguments' => [ + 'name' => 'maxHours', + 'type' => 'number', + 'value' => $values['maxHours'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Groups. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId[]', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => explode(',', $values['groupId'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + // Legend Position. + $fields = [ + 'bottom' => __('Bottom'), + 'hidden' => __('No legend'), + ]; + + $inputs[] = [ + 'label' => __('Legend Position'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'legendPosition', + 'selected' => $values['legendPosition'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['amountShow'] = \get_parameter('amountShow', 0); + $values['maxHours'] = \get_parameter('maxHours', 0); + $values['groupId'] = \get_parameter('groupId', []); + $values['legendPosition'] = \get_parameter('legendPosition', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $this->values['groupId'] = explode(',', $this->values['groupId'][0]); + + if (empty($this->values['groupId']) === true) { + $output .= '
'; + $output .= \ui_print_info_message( + __('Please select one or more groups.'), + '', + true + ); + $output .= '
'; + return $output; + } else { + $timestamp = (time() - SECONDS_1HOUR * $this->values['maxHours']); + + $all_group = false; + // Search all. + if (array_search('0', $this->values['groupId']) !== false) { + $all_group = true; + } + + if ($all_group === false) { + $sql = sprintf( + 'SELECT id_agentmodule, COUNT(*) AS count + FROM tevento + WHERE utimestamp >= %d + AND id_grupo IN (%s) + GROUP BY id_agentmodule, event_type + ORDER BY count DESC + LIMIT %d', + implode(',', $this->values['groupId']), + $timestamp, + $this->values['amountShow'] + ); + } else { + $sql = sprintf( + 'SELECT id_agentmodule, COUNT(*) AS count + FROM tevento + WHERE utimestamp >= %d + GROUP BY id_agentmodule, event_type + ORDER BY count DESC + LIMIT %d', + $timestamp, + $this->values['amountShow'] + ); + } + + $result = db_get_all_rows_sql($sql); + + if (empty($result) === true) { + $output .= '
'; + $output .= \ui_print_error_message( + __('There is not data to show.'), + '', + true + ); + $output .= '
'; + return $output; + } else { + $data_pie = []; + foreach ($result as $row) { + if ($row['id_agentmodule'] == 0) { + $name = __('System'); + } else { + $name_agent = io_safe_output( + agents_get_alias($row['id_agentmodule']) + ); + $name_module = io_safe_output( + modules_get_agentmodule_name($row['id_agentmodule']) + ); + if ($size['width'] < 400) { + $name_agent = ui_print_truncate_text( + $name_agent, + 15, + false, + true, + false, + '…', + false + ); + $name_module = ui_print_truncate_text( + $name_module, + 15, + false, + true, + false, + '…', + false + ); + } + + $name = $name_agent.' - '.$name_module; + } + + $event_name = events_print_type_description( + $row['event_type'], + true + ); + if ($size['width'] < 400) { + $event_name = ui_print_truncate_text( + $event_name, + 20, + false, + true, + false, + '…', + false + ); + } + + $data_pie[$event_name.' [ '.$name.' ] ('.$row['count'].')'] = $row['count']; + } + } + + $width = $size['width']; + $height = $size['height']; + + switch ($this->values['legendPosition']) { + case 'hidden': + $height = ($height - 50); + break; + + default: + case 'bottom': + $numleg = count($data_pie); + if ($numleg >= 4) { + $numleg = 4; + } else if ($numleg < 4 && $numleg > 1) { + $numleg = 2; + } else if ($numleg == 1) { + $numleg = 1.5; + } + + // % is for the pie group the slices and show only 5 + $height = ($height - (65 * ($numleg))); + break; + } + + $output .= pie_graph( + $data_pie, + $width, + $height, + __('other'), + '', + false, + $config['fontpath'], + $config['font_size'], + 1, + $this->values['legendPosition'], + '', + false + ); + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Top N events by module'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'top_n_events_by_module'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php new file mode 100644 index 0000000000..9176bec9ef --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php @@ -0,0 +1,566 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Cell Id. + $this->cellId = $cellId; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Tree view'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'tree_view'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (isset($this->values['groupId']) === false) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Type tree view. + $fields = [ + 'group' => __('Groups'), + 'tag' => __('Tags'), + 'module_group' => __('Module groups'), + 'module' => __('Modules'), + 'os' => __('OS'), + 'policies' => __('Policies'), + ]; + + $inputs[] = [ + 'label' => __('Type tree'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'typeTree', + 'selected' => $values['typeTree'], + 'return' => true, + ], + ]; + + // Groups. + $inputs[] = [ + 'label' => __('Groups'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => $values['groupId'], + 'return' => true, + ], + ]; + + // Open all groups. + $inputs[] = [ + 'label' => __('Open all groups'), + 'arguments' => [ + 'name' => 'openAllGroups', + 'id' => 'openAllGroups', + 'type' => 'switch', + 'value' => $values['openAllGroups'], + ], + ]; + + // Agents status. + $fields = [ + AGENT_STATUS_ALL => __('All'), + AGENT_STATUS_NORMAL => __('Normal'), + AGENT_STATUS_WARNING => __('Warning'), + AGENT_STATUS_CRITICAL => __('Critical'), + AGENT_STATUS_UNKNOWN => __('Unknown'), + AGENT_STATUS_NOT_INIT => __('Not init'), + ]; + + $inputs[] = [ + 'label' => __('Agents status'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'agentStatus', + 'selected' => $values['agentStatus'], + 'return' => true, + ], + ]; + + // Filter agents. + $inputs[] = [ + 'label' => __('Filter agents'), + 'arguments' => [ + 'name' => 'filterAgent', + 'type' => 'text', + 'value' => $values['filterAgent'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Modules status. + $fields = [ + -1 => __('All'), + AGENT_MODULE_STATUS_NORMAL => __('Normal'), + AGENT_MODULE_STATUS_WARNING => __('Warning'), + AGENT_MODULE_STATUS_CRITICAL_BAD => __('Critical'), + AGENT_MODULE_STATUS_UNKNOWN => __('Unknown'), + AGENT_MODULE_STATUS_NOT_INIT => __('Not init'), + ]; + + $inputs[] = [ + 'label' => __('Modules status'), + 'arguments' => [ + 'type' => 'select', + 'fields' => $fields, + 'name' => 'moduleStatus', + 'selected' => $values['moduleStatus'], + 'return' => true, + ], + ]; + + // Filter modules. + $inputs[] = [ + 'label' => __('Filter modules'), + 'arguments' => [ + 'name' => 'filterModule', + 'type' => 'text', + 'value' => $values['filterModule'], + 'return' => true, + 'size' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['typeTree'] = \get_parameter('typeTree', ''); + $values['groupId'] = \get_parameter('groupId', 0); + $values['openAllGroups'] = \get_parameter_switch('openAllGroups'); + $values['agentStatus'] = \get_parameter('agentStatus', 0); + $values['filterAgent'] = \get_parameter('filterAgent', ''); + $values['moduleStatus'] = \get_parameter('moduleStatus', 0); + $values['filterModule'] = \get_parameter('filterModule', ''); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $size = parent::getSize(); + + $output = ''; + + if (check_acl($config['id_user'], 0, 'AR') === 0) { + $output .= '
'; + $output .= ui_print_error_message( + __( + 'The user doesn\'t have permission to read agents. Please contact with your %s administrator.', + get_product_name() + ), + '', + true + ); + $output .= '
'; + return $output; + } + + $id_cell = $this->cellId; + $all_nodes = $this->values['openAllGroups']; + + $tab = 'group'; + if (empty($this->values['typeTree']) === false) { + $tab = $this->values['typeTree']; + } + + $statusAgent = -1; + if (isset($this->values['agentStatus']) === true + && $this->values['agentStatus'] !== AGENT_STATUS_ALL + ) { + $statusAgent = $this->values['agentStatus']; + } + + $searchAgent = ''; + if (empty($this->values['filterAgent']) === false) { + $searchAgent = $this->values['filterAgent']; + } + + $statusModule = -1; + if (isset($this->values['moduleStatus']) === true + && $this->values['moduleStatus'] !== -1 + ) { + $statusModule = $this->values['moduleStatus']; + } + + $searchModule = ''; + if (empty($this->values['filterModule']) === false) { + $searchModule = $this->values['filterModule']; + } + + $searchGroup = 0; + if (empty($this->values['groupId']) === false) { + $searchGroup = $this->values['groupId']; + } + + $width = $size['width']; + $height = $size['height']; + + // Css Files. + \ui_require_css_file('tree', 'include/styles/', true); + + // Javascript Files. + \ui_include_time_picker(); + \ui_require_jquery_file( + 'ui.datepicker-'.\get_user_language(), + 'include/javascript/i18n/' + ); + + \ui_require_javascript_file( + 'TreeController', + 'include/javascript/tree/', + true + ); + + \ui_require_javascript_file( + 'fixed-bottom-box', + 'include/javascript/', + true + ); + + $base_url = \ui_get_full_url( + false, + false, + false, + \is_metaconsole() + ); + + // Spinner. + $output .= \html_print_image( + 'images/spinner.gif', + true, + [ + 'class' => 'loading_tree', + 'style' => 'display: none;', + ] + ); + + // Container tree. + $style = 'height:'.$height.'px; width:'.$width.'px;'; + $style .= 'text-align: left; padding:10px;'; + $idTree = 'tree-controller-recipient_'.$id_cell; + + $output .= '
'; + $output .= '
'; + + $output .= \html_print_input_hidden( + 'publi_dash_tree_view_hash', + $hash, + true + ); + $output .= \html_print_input_hidden( + 'publi_dash_tree_view_id_user', + $config['id_user'], + true + ); + + $settings = [ + 'page' => 'include/ajax/tree.ajax', + 'user' => $config['id_user'], + 'hash' => $hash, + 'type' => $tab, + 'cellId' => $id_cell, + 'ajaxUrl' => ui_get_full_url('ajax.php', false, false, false), + 'baseUrl' => $base_url, + 'searchAgent' => $searchAgent, + 'statusAgent' => $statusAgent, + 'searchModule' => $searchModule, + 'statusModule' => $statusModule, + 'searchGroup' => $searchGroup, + 'openAllNodes' => $all_nodes, + 'timeFormat' => TIME_FORMAT_JS, + 'dateFormat' => DATE_FORMAT_JS, + 'userLanguage' => get_user_language(), + 'translate' => [ + 'emptyMessage' => __('No data found'), + 'foundMessage' => 'not', + 'total' => [ + 'agents' => __('Total agents'), + 'modules' => __('Total modules'), + 'none' => __('Total'), + ], + 'alerts' => [ + 'agents' => __('Fired alerts'), + 'modules' => __('Fired alerts'), + 'none' => __('Fired alerts'), + ], + 'critical' => [ + 'agents' => __('Critical agents'), + 'modules' => __('Critical modules'), + 'none' => __('Critical'), + ], + 'warning' => [ + 'agents' => __('Warning agents'), + 'modules' => __('Warning modules'), + 'none' => __('Warning'), + ], + 'unknown' => [ + 'agents' => __('Unknown agents'), + 'modules' => __('Unknown modules'), + 'none' => __('Unknown'), + ], + 'not_init' => [ + 'agents' => __('Not init agents'), + 'modules' => __('Not init modules'), + 'none' => __('Not init'), + ], + 'ok' => [ + 'agents' => __('Normal agents'), + 'modules' => __('Normal modules'), + 'none' => __('Normal'), + ], + 'module' => __('Module'), + 'timeOnlyTitle' => __('Choose time'), + 'timeText' => __('Time'), + 'hourText' => __('Hour'), + 'minuteText' => __('Minute'), + 'secondText' => __('Second'), + 'currentText' => __('Now'), + 'closeText' => __('Close'), + ], + + ]; + + // Show the modal window of an module. + $output .= ''; + + // Script. + $output .= ''; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Tree view'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'tree_view'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/url.php b/pandora_console/include/lib/Dashboard/Widgets/url.php new file mode 100644 index 0000000000..70a841a9fd --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/url.php @@ -0,0 +1,276 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('URL content'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'url'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['urlText']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Url. + $inputs[] = [ + 'label' => __('Url'), + 'arguments' => [ + 'name' => 'urlText', + 'type' => 'text', + 'value' => $values['urlText'], + 'return' => true, + 'size' => 0, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['urlText'] = \get_parameter('urlText', ''); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + $output = ''; + + $url = $this->values['urlText']; + + $size = parent::getSize(); + + $width = $size['width']; + $height = $size['height']; + + if (isset($url) === false || empty($url) === true) { + $output .= __('Please, configure this widget before use'); + } else { + if (!preg_match('/^https?:\/\/.+/', $url)) { + $url = 'http://'.$url; + } + + $url = str_replace('watch?v=', 'embed/', $url); + $style = 'border:none; width:100%; height:'.$height.'px;'; + $output .= ''; + } + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('URL content'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'url'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/ux_transaction.php b/pandora_console/include/lib/Dashboard/Widgets/ux_transaction.php new file mode 100644 index 0000000000..4abc4262e1 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/ux_transaction.php @@ -0,0 +1,18 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Agent WUX transaction'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'wux_transaction'; + } + + // Must be configured before using. + $this->configurationRequired = false; + if (empty($this->options) === true) { + $this->configuration_required = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'transactionId', + 'module_none' => false, + 'from_wux' => true, + 'size' => 0, + 'required' => true, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Wux transaction'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'transactionId', + 'selected' => $values['transactionId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + 'from_wux' => true, + 'required' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['transactionId'] = \get_parameter('transactionId', 0); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + include_once $config['homedir'].'/enterprise/include/functions_ux_console.php'; + include_once $config['homedir'].'/include/graphs/functions_d3.php'; + + $size = parent::getSize(); + + $id_agent = $this->values['agentId']; + $wux_transaction = $this->values['transactionId']; + + $output = ''; + if (empty($wux_transaction) === true) { + $output .= '
'; + $output .= \ui_print_info_message( + [ + 'no_close' => true, + 'message' => __('No wux transaction selected.'), + ], + '', + true + ); + $output .= '
'; + } else { + $wux_transaction_name = \get_wux_trans_name($wux_transaction); + $wux_transaction_ppal = \get_id_trans_ppal($wux_transaction); + $phases = \wux_transaction_get_phases( + $wux_transaction_ppal, + $wux_transaction_name, + $wux_transaction_ppal + ); + + if ($phases) { + $global_time = \wux_transaction_get_global_time( + $wux_transaction_ppal + ); + + $last_try = (\get_system_time() - \time_w_fixed_tz( + \wux_transaction_get_last_try( + $wux_transaction_ppal + ) + )); + + $wux_transaction_statistics = \wux_transaction_statistics( + $wux_transaction + ); + + $have_errors = false; + $first_error = false; + + foreach ($phases as $phase) { + if ($phase['status'] != 0) { + if (!$first_error) { + $first_error = true; + $error_image = \get_last_error_image_wux( + $wux_transaction_ppal + ); + } + + $have_errors = true; + } + } + + $output .= '
'; + $output .= '
'; + $output .= "

"; + if ($have_errors === true) { + $output .= __('Global status').': '; + $output .= ""; + $output .= __('Failed'); + $output .= ''; + } else { + $output .= __('Global status').': '; + $output .= ""; + $output .= __('Ok'); + $output .= ''; + } + + $output .= '

'; + + $output .= '
'; + $output .= \ux_console_phases_donut( + $phases, + ($id_agent + \rand(10, 1000)), + $size['width'], + ($size['height'] - 45), + true + ); + $output .= '
'; + + $output .= '
'; + } else { + $output .= \ui_print_info_message( + [ + 'no_close' => true, + 'message' => __('Phase modules not found'), + ], + '', + true + ); + } + } + + return $output; + + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Agent WUX transaction'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'wux_transaction'; + } + + +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/wux_transaction_stats.php b/pandora_console/include/lib/Dashboard/Widgets/wux_transaction_stats.php new file mode 100644 index 0000000000..25b4270715 --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/wux_transaction_stats.php @@ -0,0 +1,342 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Cell Id. + $this->cellId = $cellId; + + // Options. + $this->values = $this->getOptionsWidget(); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('WUX transaction stats'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'wux_transaction_stats'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['transactionId']) === true) { + $this->configurationRequired = true; + } + + $this->overflow_scrollbars = false; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + $values = $this->values; + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'transactionId', + 'module_none' => false, + 'from_wux' => true, + 'size' => 0, + 'required' => true, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Wux transaction'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'fields' => $fields, + 'name' => 'transactionId', + 'selected' => $values['transactionId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + 'from_wux' => true, + 'required' => true, + ], + ]; + + // View all statistics. + $inputs[] = [ + 'label' => __('View all statistics'), + 'arguments' => [ + 'name' => 'allStats', + 'id' => 'showLegend', + 'type' => 'switch', + 'value' => $values['allStats'], + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['transactionId'] = \get_parameter('transactionId', 0); + $values['allStats'] = \get_parameter_switch('allStats'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $id_agent = $this->values['agentId']; + $transaction = $this->values['transactionId']; + $view_all_stats = $this->values['allStats']; + $size = parent::getSize(); + + $settings = json_encode( + [ + 'url' => ui_get_full_url( + 'ajax.php', + false, + false, + false + ), + 'page' => 'enterprise/include/ajax/wux_transaction.ajax', + 'id_agent' => $id_agent, + 'transaction' => $transaction, + 'view_all_stats' => $view_all_stats, + 'id_user' => $config['id_user'], + 'cellId' => $this->cellId, + ] + ); + + $width = $size['width']; + $height = $size['height']; + + $style = 'width:'.$width.'px; height:'.$height.'px;'; + $style .= 'min-width:300px; min-height:300px;'; + $output = '
'; + $output .= ''; + + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('WUX transaction stats'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'wux_transaction_stats'; + } + + +} diff --git a/pandora_console/include/lib/View.php b/pandora_console/include/lib/View.php new file mode 100644 index 0000000000..facdb8f262 --- /dev/null +++ b/pandora_console/include/lib/View.php @@ -0,0 +1,38 @@ + $visualConsoleId]); + $visualConsole = VisualConsole::fromDB(['id' => $visualConsoleId], $ratio); $visualConsoleData = $visualConsole->toArray(); $vcGroupId = $visualConsoleData['groupId']; @@ -80,7 +80,35 @@ if ($getVisualConsole === true) { $aclUserGroups = array_keys(users_get_groups(false, 'AR')); } - $vcItems = VisualConsole::getItemsFromDB($visualConsoleId, $aclUserGroups); + $size = get_parameter('size', []); + + $ratio = 0; + if (isset($size) === true + && is_array($size) === true + && empty($size) === false + ) { + $visualConsoleData = $visualConsole->toArray(); + $ratio_visualconsole = ($visualConsoleData['height'] / $visualConsoleData['width']); + $ratio = ($size['width'] / $visualConsoleData['width']); + $radio_h = ($size['height'] / $visualConsoleData['height']); + + $visualConsoleData['width'] = $size['width']; + $visualConsoleData['height'] = ($size['width'] * $ratio_visualconsole); + + if ($visualConsoleData['height'] > $size['height']) { + $ratio = $radio_h; + + $visualConsoleData['height'] = $size['height']; + $visualConsoleData['width'] = ($size['height'] / $ratio_visualconsole); + } + } + + $vcItems = VisualConsole::getItemsFromDB( + $visualConsoleId, + $aclUserGroups, + $ratio + ); + echo '['.implode($vcItems, ',').']'; return; } else if ($getVisualConsoleItem === true diff --git a/pandora_console/include/rest-api/models/CachedModel.php b/pandora_console/include/rest-api/models/CachedModel.php index 49d209179a..4c36aa85b9 100644 --- a/pandora_console/include/rest-api/models/CachedModel.php +++ b/pandora_console/include/rest-api/models/CachedModel.php @@ -72,17 +72,17 @@ abstract class CachedModel extends Model * * @overrides Model::fromDB. */ - public static function fromDB(array $filter): Model + public static function fromDB(array $filter, ?float $ratio=0): Model { global $config; $save_cache = false; - if ($filter['cache_expiration'] > 0) { + if ($ratio == 0 && $filter['cache_expiration'] > 0) { $data = static::fetchCachedData($filter); $save_cache = true; } if (isset($data) === false) { - $data = static::fetchDataFromDB($filter); + $data = static::fetchDataFromDB($filter, $ratio); } else { // Retrieved from cache. $save_cache = false; diff --git a/pandora_console/include/rest-api/models/Model.php b/pandora_console/include/rest-api/models/Model.php index 47d002ebe4..12a00f88c1 100644 --- a/pandora_console/include/rest-api/models/Model.php +++ b/pandora_console/include/rest-api/models/Model.php @@ -128,7 +128,10 @@ abstract class Model * * @abstract */ - abstract protected static function fetchDataFromDB(array $filter); + abstract protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ); /** @@ -138,10 +141,10 @@ abstract class Model * * @return self A modeled element's instance. */ - public static function fromDB(array $filter): self + public static function fromDB(array $filter, ?float $ratio=0): self { // The reserved word static refers to the invoked class at runtime. - return static::fromArray(static::fetchDataFromDB($filter)); + return static::fromArray(static::fetchDataFromDB($filter, $ratio)); } diff --git a/pandora_console/include/rest-api/models/VisualConsole/Container.php b/pandora_console/include/rest-api/models/VisualConsole/Container.php index 3074d3feef..16d72c9d95 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Container.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Container.php @@ -245,8 +245,10 @@ final class Container extends Model * * @override Model::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter) - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ) { // Due to this DB call, this function cannot be unit tested without // a proper mock. $row = \db_get_row_filter('tlayout', $filter); @@ -360,7 +362,8 @@ final class Container extends Model */ public static function getItemsFromDB( int $layoutId, - array $groupsFilter=[] + array $groupsFilter=[], + ?float $ratio=0 ): array { // Default filter. $filter = ['id_layout' => $layoutId]; @@ -411,7 +414,7 @@ final class Container extends Model $class = static::getItemClass((int) $data['type']); try { - array_push($items, $class::fromDB($data)); + array_push($items, $class::fromDB($data, $ratio)); } catch (\Throwable $e) { error_log('VC[Container]: '.$e->getMessage()); } diff --git a/pandora_console/include/rest-api/models/VisualConsole/Item.php b/pandora_console/include/rest-api/models/VisualConsole/Item.php index ff033b645e..13ddc6590f 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Item.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Item.php @@ -754,8 +754,10 @@ class Item extends CachedModel * * @override Model::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Load side libraries. global $config; include_once $config['homedir'].'/include/functions_io.php'; @@ -787,6 +789,13 @@ class Item extends CachedModel $row['link'] = static::buildLink($row); } + if ($ratio != 0) { + $row['width'] = ($row['width'] * $ratio); + $row['height'] = ($row['height'] * $ratio); + $row['pos_x'] = ($row['pos_x'] * $ratio); + $row['pos_y'] = ($row['pos_y'] * $ratio); + } + return $row; } diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/BarsGraph.php b/pandora_console/include/rest-api/models/VisualConsole/Items/BarsGraph.php index 8741032fe5..62a39dd71a 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/BarsGraph.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/BarsGraph.php @@ -190,11 +190,13 @@ final class BarsGraph extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. @@ -317,7 +319,10 @@ final class BarsGraph extends Item } } - $moduleData = \get_bars_module_data($moduleId); + $moduleData = \get_bars_module_data( + $moduleId, + ($typeGraph !== 'horizontal') + ); if ($moduleData !== false && is_array($moduleData) === true) { array_pop($moduleData); } @@ -373,33 +378,26 @@ final class BarsGraph extends Item true ); } else { - $graph = \vbar_graph( - $moduleData, - $width, - $height, - $color, - [], - [], - \ui_get_full_url( - 'images/image_problem_area.png', - false, - false, - false - ), - '', - '', - $waterMark, - $config['fontpath'], - $config['fontsize'], - '', - 2, - $config['homeurl'], - $backGroundColor, - true, - false, - $gridColor, - true - ); + $options = []; + $options['generals']['rotate'] = true; + $options['generals']['forceTicks'] = true; + $options['generals']['arrayColors'] = $color; + $options['grid']['backgroundColor'] = $backGroundColor; + $options['y']['color'] = $backGroundColor; + $options['x']['color'] = $backGroundColor; + + if ($ratio != 0) { + $options['x']['font']['size'] = (($config['font_size'] * $ratio) + 1); + $options['x']['font']['color'] = $gridColor; + $options['y']['font']['size'] = (($config['font_size'] * $ratio) + 1); + $options['y']['font']['color'] = $gridColor; + } + + $options['generals']['pdf']['width'] = $width; + $options['generals']['pdf']['width'] = $width; + $options['generals']['pdf']['height'] = $height; + $options['x']['labelWidth'] = $sizeLabelTickWidth; + $graph = vbar_graph($moduleData, $options, 2); } } diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/ColorCloud.php b/pandora_console/include/rest-api/models/VisualConsole/Items/ColorCloud.php index 4f2e9d4f02..a2d3d67e29 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/ColorCloud.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/ColorCloud.php @@ -278,11 +278,13 @@ final class ColorCloud extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/DonutGraph.php b/pandora_console/include/rest-api/models/VisualConsole/Items/DonutGraph.php index 3b4addee96..65f671d405 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/DonutGraph.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/DonutGraph.php @@ -87,11 +87,13 @@ final class DonutGraph extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/EventsHistory.php b/pandora_console/include/rest-api/models/VisualConsole/Items/EventsHistory.php index f2c1090d4d..1c7852518c 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/EventsHistory.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/EventsHistory.php @@ -79,11 +79,13 @@ final class EventsHistory extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. @@ -119,12 +121,13 @@ final class EventsHistory extends Item $html = \graph_graphic_moduleevents( $agentId, $moduleId, - (int) $data['width'], - (int) $data['height'], + 100, + ((int) $data['height'] - 20), static::extractMaxTime($data), '', true, - 1 + 1, + $data['width'] ); $data['html'] = $html; diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/Group.php b/pandora_console/include/rest-api/models/VisualConsole/Items/Group.php index 2f90daeee9..2db12e4ae2 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/Group.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/Group.php @@ -202,11 +202,13 @@ final class Group extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/Icon.php b/pandora_console/include/rest-api/models/VisualConsole/Items/Icon.php index 9bda4de62b..d9074d871f 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/Icon.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/Icon.php @@ -96,11 +96,13 @@ final class Icon extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php b/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php index 9ccb5440e1..cf1660396d 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php @@ -192,8 +192,10 @@ final class Line extends Model * * @override Model::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. $row = \db_get_row_filter('tlayout_data', $filter); @@ -202,6 +204,13 @@ final class Line extends Model throw new \Exception('error fetching the data from the DB'); } + if ($ratio != 0) { + $row['width'] = ($row['width'] * $ratio); + $row['height'] = ($row['height'] * $ratio); + $row['pos_x'] = ($row['pos_x'] * $ratio); + $row['pos_y'] = ($row['pos_y'] * $ratio); + } + return $row; } diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php b/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php index e96e8809bd..8393d0e21d 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php @@ -258,11 +258,13 @@ final class ModuleGraph extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. @@ -281,6 +283,7 @@ final class ModuleGraph extends Item $backgroundType = static::extractBackgroundType($data); $period = static::extractPeriod($data); $showLegend = static::extractShowLegend($data); + $customGraphId = static::extractCustomGraphId($data); $graphType = static::extractGraphType($data); $linkedModule = static::extractLinkedModule($data); @@ -321,6 +324,31 @@ final class ModuleGraph extends Item if (empty($customGraphId) === false) { $customGraph = \db_get_row('tgraph', 'id_graph', $customGraphId); + $sources = db_get_all_rows_field_filter( + 'tgraph_source', + 'id_graph', + $customGraphId, + 'field_order' + ); + + $hackLegendHight = (28 * count($sources)); + + // Trick for legend monstruosity. + if ((int) $customGraph['stacked'] === CUSTOM_GRAPH_STACKED_LINE + || (int) $customGraph['stacked'] === CUSTOM_GRAPH_STACKED_AREA + || (int) $customGraph['stacked'] === CUSTOM_GRAPH_AREA + || (int) $customGraph['stacked'] === CUSTOM_GRAPH_LINE + ) { + if ($width < 200 || $height < 200) { + $showLegend = false; + } else { + $height = ($height - 10 - $hackLegendHight); + $showLegend = true; + } + } else if ((int) $customGraph['stacked'] === CUSTOM_GRAPH_VBARS) { + $height = ($height - 40); + } + $params = [ 'period' => $period, 'width' => $width, @@ -331,8 +359,8 @@ final class ModuleGraph extends Item 'only_image' => $imageOnly, 'vconsole' => true, 'backgroundColor' => $backgroundType, + 'show_legend' => $showLegend, 'return_img_base_64' => true, - 'show_legend' => true, 'show_title' => false, ]; @@ -359,6 +387,14 @@ final class ModuleGraph extends Item throw new \InvalidArgumentException('missing module Id'); } + // Trick for legend monstruosity. + if ($width < 200 || $height < 200) { + $showLegend = false; + } else { + $height = ($height - 30); + $showLegend = true; + } + $params = [ 'agent_module_id' => $moduleId, 'period' => $period, @@ -377,6 +413,7 @@ final class ModuleGraph extends Item 'return_img_base_64' => true, 'show_legend' => $showLegend, 'show_title' => false, + 'dashboard' => true, ]; if ($imageOnly !== false) { diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/Percentile.php b/pandora_console/include/rest-api/models/VisualConsole/Items/Percentile.php index 51bb7ff0b6..3ca8c707bd 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/Percentile.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/Percentile.php @@ -328,11 +328,13 @@ final class Percentile extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/SimpleValue.php b/pandora_console/include/rest-api/models/VisualConsole/Items/SimpleValue.php index 7f44546629..bd43da0ad4 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/SimpleValue.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/SimpleValue.php @@ -228,11 +228,13 @@ final class SimpleValue extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/StaticGraph.php b/pandora_console/include/rest-api/models/VisualConsole/Items/StaticGraph.php index 1cd4a3bd41..f4a93c7af4 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Items/StaticGraph.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Items/StaticGraph.php @@ -139,11 +139,13 @@ final class StaticGraph extends Item * * @override Item::fetchDataFromDB. */ - protected static function fetchDataFromDB(array $filter): array - { + protected static function fetchDataFromDB( + array $filter, + ?float $ratio=0 + ): array { // Due to this DB call, this function cannot be unit tested without // a proper mock. - $data = parent::fetchDataFromDB($filter); + $data = parent::fetchDataFromDB($filter, $ratio); /* * Retrieve extra data. diff --git a/pandora_console/include/styles/bootstrap.min.css b/pandora_console/include/styles/bootstrap.min.css new file mode 100644 index 0000000000..92e3fe8712 --- /dev/null +++ b/pandora_console/include/styles/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/pandora_console/include/styles/bootstrap.min.css.map b/pandora_console/include/styles/bootstrap.min.css.map new file mode 100644 index 0000000000..1e9cb78a53 --- /dev/null +++ b/pandora_console/include/styles/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-align: center;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: stretch;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: -ms-flexbox;\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: -ms-inline-flexbox;\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n -webkit-transform: translateX(0.75rem);\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-flow: row nowrap;\n flex-flow: row nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group > .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n -moz-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n -moz-column-gap: 1.25rem;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -50px);\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: none;\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: -ms-flexbox;\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n -webkit-transform: none;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes spinner-border {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: spinner-border .75s linear infinite;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: spinner-grow .75s linear infinite;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all ``s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on `s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on ` receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n text-decoration: $link-decoration;\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus,\n &.focus {\n text-decoration: $link-hover-decoration;\n box-shadow: none;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n pointer-events: none;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n\n // Vertically space out multiple block buttons\n + .btn-block {\n margin-top: $btn-block-spacing-y;\n }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n color: color-yiq($background);\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n @include hover {\n color: color-yiq($hover-background);\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n color: color-yiq($background);\n background-color: $background;\n border-color: $border;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n @if $enable-gradients {\n background-image: none; // Remove the gradient for the pressed/active state\n }\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n }\n }\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n color: $color;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:not(:disabled):not(.disabled):active,\n &:not(:disabled):not(.disabled).active,\n .show > &.dropdown-toggle {\n color: color-yiq($active-background);\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows and $btn-active-box-shadow != none {\n box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\n } @else {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n line-height: $line-height;\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`
`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret;\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-left {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu#{$infix}-right {\n right: 0;\n left: auto;\n }\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropright {\n .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(right);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropleft {\n .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(left);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n// When enabled Popper.js, reset basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n &[x-placement^=\"top\"],\n &[x-placement^=\"right\"],\n &[x-placement^=\"bottom\"],\n &[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n }\n}\n\n// Dividers (basically an `
`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `