From a387bfa03bfe07758c764d492d88d7d0fa5257c9 Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 11 Jun 2025 08:24:09 +0000 Subject: [PATCH] Deployed d4e9b63 with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 238 ++ api/html/annotated.html | 198 + api/html/annotated_dup.js | 119 + api/html/bc_s.png | Bin 0 -> 668 bytes api/html/bc_sd.png | Bin 0 -> 632 bytes ...tch_1_1config_yaml_1_1_config_y_a_m_l.html | 366 ++ ...watch_1_1config_yaml_1_1_config_y_a_m_l.js | 10 + ...tch_1_1decoder_1_1decoder_1_1_decoder.html | 178 + ...watch_1_1decoder_1_1decoder_1_1_decoder.js | 4 + ...ecoder_1_1fms_decoder_1_1_fms_decoder.html | 206 + ...1decoder_1_1fms_decoder_1_1_fms_decoder.js | 4 + ..._1_1pocsag_decoder_1_1_pocsag_decoder.html | 269 ++ ...er_1_1pocsag_decoder_1_1_pocsag_decoder.js | 5 + ...oder_1_1zvei_decoder_1_1_zvei_decoder.html | 239 ++ ...ecoder_1_1zvei_decoder_1_1_zvei_decoder.js | 5 + ...t_source_1_1input_base_1_1_input_base.html | 527 +++ ...put_source_1_1input_base_1_1_input_base.js | 15 + ...ce_1_1line_in_input_1_1_line_in_input.html | 279 ++ ...urce_1_1line_in_input_1_1_line_in_input.js | 5 + ...ulseaudio_input_1_1_pulse_audio_input.html | 278 ++ ...1pulseaudio_input_1_1_pulse_audio_input.js | 5 + ...put_source_1_1sdr_input_1_1_sdr_input.html | 283 ++ ...input_source_1_1sdr_input_1_1_sdr_input.js | 5 + ...ork_1_1broadcast_1_1_broadcast_client.html | 404 ++ ...twork_1_1broadcast_1_1_broadcast_client.js | 11 + ...ork_1_1broadcast_1_1_broadcast_server.html | 513 +++ ...twork_1_1broadcast_1_1_broadcast_server.js | 15 + ...1_1network_1_1client_1_1_t_c_p_client.html | 461 +++ ...h_1_1network_1_1client_1_1_t_c_p_client.js | 11 + ...1_1network_1_1net_check_1_1_net_check.html | 289 ++ ...h_1_1network_1_1net_check_1_1_net_check.js | 8 + ..._1_1___threaded_t_c_p_request_handler.html | 203 + ...er_1_1___threaded_t_c_p_request_handler.js | 4 + ...1_1server_1_1___threaded_t_c_p_server.html | 124 + ...1_1network_1_1server_1_1_t_c_p_server.html | 605 +++ ...h_1_1network_1_1server_1_1_t_c_p_server.js | 19 + .../classboswatch_1_1packet_1_1_packet.html | 350 ++ .../classboswatch_1_1packet_1_1_packet.js | 9 + ..._1process_manager_1_1_process_manager.html | 780 ++++ ..._1_1process_manager_1_1_process_manager.js | 24 + ...boswatch_1_1router_1_1route_1_1_route.html | 262 ++ ...ssboswatch_1_1router_1_1route_1_1_route.js | 8 + ...swatch_1_1router_1_1router_1_1_router.html | 441 +++ ...boswatch_1_1router_1_1router_1_1_router.js | 12 + ..._1_1router_manager_1_1_router_manager.html | 531 +++ ...er_1_1router_manager_1_1_router_manager.js | 13 + ...sboswatch_1_1timer_1_1_repeated_timer.html | 646 +++ ...assboswatch_1_1timer_1_1_repeated_timer.js | 21 + api/html/classes.html | 163 + ...ule_1_1descriptor_1_1_boswatch_module.html | 327 ++ ...odule_1_1descriptor_1_1_boswatch_module.js | 8 + ..._1_1double_filter_1_1_boswatch_module.html | 428 ++ ...er_1_1double_filter_1_1_boswatch_module.js | 10 + ...er_1_1mode_filter_1_1_boswatch_module.html | 300 ++ ...lter_1_1mode_filter_1_1_boswatch_module.js | 7 + ...r_1_1regex_filter_1_1_boswatch_module.html | 334 ++ ...ter_1_1regex_filter_1_1_boswatch_module.js | 8 + ...dule_1_1geocoding_1_1_boswatch_module.html | 317 ++ ...module_1_1geocoding_1_1_boswatch_module.js | 6 + ...module_1_1module_base_1_1_module_base.html | 657 ++++ ...ssmodule_1_1module_base_1_1_module_base.js | 18 + ...1template__module_1_1_boswatch_module.html | 305 ++ ...1_1template__module_1_1_boswatch_module.js | 7 + ...splugin_1_1divera_1_1_boswatch_plugin.html | 575 +++ ...assplugin_1_1divera_1_1_boswatch_plugin.js | 11 + ...assplugin_1_1http_1_1_boswatch_plugin.html | 534 +++ ...classplugin_1_1http_1_1_boswatch_plugin.js | 11 + ...ssplugin_1_1mysql_1_1_boswatch_plugin.html | 659 ++++ ...lassplugin_1_1mysql_1_1_boswatch_plugin.js | 15 + ...plugin_1_1plugin_base_1_1_plugin_base.html | 1008 +++++ ...ssplugin_1_1plugin_base_1_1_plugin_base.js | 29 + ...lugin_1_1telegram_1_1_boswatch_plugin.html | 547 +++ ...splugin_1_1telegram_1_1_boswatch_plugin.js | 12 + .../classplugin_1_1telegram_1_1_m_q_bot.html | 285 ++ .../classplugin_1_1telegram_1_1_m_q_bot.js | 8 + ...1template__plugin_1_1_boswatch_plugin.html | 489 +++ ...1_1template__plugin_1_1_boswatch_plugin.js | 12 + api/html/clipboard.js | 61 + api/html/closed.png | Bin 0 -> 132 bytes api/html/cookie.js | 58 + .../dir_065827023a8094952705c99b7a70d726.html | 119 + .../dir_13e138d54eb8818da29c3992edef070a.html | 129 + .../dir_18ba14bdafca2d5fe76631d8c96c7756.html | 119 + .../dir_2006f8608b07fda10f64d4c6574ce610.html | 119 + .../dir_43da38551d4977a390038d31b18749ea.html | 119 + .../dir_4cd0c9eca83862460f0369248cfc2f5b.html | 119 + .../dir_814a05153877d296d2f0b8283bfee1e3.html | 119 + .../dir_8f20f41be9704e4cc35f0dc735991ad7.html | 119 + .../dir_a401edae9efb638176fb2226123ed9a0.html | 119 + .../dir_a7b0466279106ea0b8f86f609f621680.html | 125 + .../dir_b4c3aec6cd8f28418150dce663061cfa.html | 119 + .../dir_c3c55799aed6b6d9e14d19d26506d0dd.html | 119 + .../dir_f49b800a024456700a737074495380af.html | 133 + api/html/doc.svg | 12 + api/html/docd.svg | 12 + api/html/doxygen.css | 2247 +++++++++++ api/html/doxygen.svg | 28 + api/html/doxygen_crawl.html | 712 ++++ api/html/dynsections.js | 198 + api/html/folderclosed.svg | 11 + api/html/folderclosedd.svg | 11 + api/html/folderopen.svg | 17 + api/html/folderopend.svg | 12 + api/html/functions.html | 196 + api/html/functions_a.html | 122 + api/html/functions_b.html | 121 + api/html/functions_c.html | 129 + api/html/functions_d.html | 122 + api/html/functions_dup.js | 21 + api/html/functions_f.html | 120 + api/html/functions_func.html | 256 ++ api/html/functions_g.html | 124 + api/html/functions_h.html | 120 + api/html/functions_i.html | 121 + api/html/functions_l.html | 121 + api/html/functions_m.html | 120 + api/html/functions_n.html | 120 + api/html/functions_o.html | 122 + api/html/functions_p.html | 122 + api/html/functions_r.html | 126 + api/html/functions_s.html | 136 + api/html/functions_t.html | 121 + api/html/functions_vars.html | 223 ++ api/html/functions_z.html | 120 + api/html/hierarchy.html | 164 + api/html/hierarchy.js | 53 + api/html/index.html | 119 + api/html/jquery.js | 204 + api/html/md__r_e_a_d_m_e.html | 127 + api/html/minus.svg | 8 + api/html/minusd.svg | 8 + api/html/namespaceboswatch.html | 145 + .../namespaceboswatch_1_1config_yaml.html | 130 + api/html/namespaceboswatch_1_1decoder.html | 133 + ...mespaceboswatch_1_1decoder_1_1decoder.html | 130 + ...aceboswatch_1_1decoder_1_1fms_decoder.html | 131 + ...boswatch_1_1decoder_1_1pocsag_decoder.html | 131 + ...ceboswatch_1_1decoder_1_1zvei_decoder.html | 131 + .../namespaceboswatch_1_1input_source.html | 133 + ...oswatch_1_1input_source_1_1input_base.html | 131 + ...atch_1_1input_source_1_1line_in_input.html | 131 + ...h_1_1input_source_1_1pulseaudio_input.html | 131 + ...boswatch_1_1input_source_1_1sdr_input.html | 131 + api/html/namespaceboswatch_1_1network.html | 133 + ...spaceboswatch_1_1network_1_1broadcast.html | 134 + ...amespaceboswatch_1_1network_1_1client.html | 152 + ...spaceboswatch_1_1network_1_1net_check.html | 131 + ...amespaceboswatch_1_1network_1_1server.html | 158 + api/html/namespaceboswatch_1_1packet.html | 131 + .../namespaceboswatch_1_1process_manager.html | 131 + api/html/namespaceboswatch_1_1router.html | 131 + .../namespaceboswatch_1_1router_1_1route.html | 131 + ...namespaceboswatch_1_1router_1_1router.html | 131 + ...eboswatch_1_1router_1_1router_manager.html | 131 + api/html/namespaceboswatch_1_1timer.html | 130 + api/html/namespaceboswatch_1_1utils.html | 133 + .../namespaceboswatch_1_1utils_1_1header.html | 215 + .../namespaceboswatch_1_1utils_1_1misc.html | 225 ++ .../namespaceboswatch_1_1utils_1_1paths.html | 270 ++ ...namespaceboswatch_1_1utils_1_1version.html | 193 + api/html/namespaceboswatch_1_1wildcard.html | 294 ++ api/html/namespacemembers.html | 277 ++ api/html/namespacemembers_func.html | 250 ++ api/html/namespacemembers_vars.html | 128 + api/html/namespacemodule.html | 135 + api/html/namespacemodule_1_1descriptor.html | 131 + api/html/namespacemodule_1_1filter.html | 131 + ...pacemodule_1_1filter_1_1double_filter.html | 131 + ...espacemodule_1_1filter_1_1mode_filter.html | 131 + ...spacemodule_1_1filter_1_1regex_filter.html | 131 + api/html/namespacemodule_1_1geocoding.html | 131 + api/html/namespacemodule_1_1module_base.html | 131 + .../namespacemodule_1_1template__module.html | 131 + api/html/namespaceplugin.html | 137 + api/html/namespaceplugin_1_1divera.html | 131 + api/html/namespaceplugin_1_1http.html | 131 + api/html/namespaceplugin_1_1mysql.html | 131 + api/html/namespaceplugin_1_1plugin_base.html | 131 + api/html/namespaceplugin_1_1telegram.html | 133 + .../namespaceplugin_1_1template__plugin.html | 131 + api/html/namespacetest.html | 133 + api/html/namespacetest_1_1boswatch.html | 141 + ...t_1_1boswatch_1_1test___server_client.html | 850 ++++ ...cetest_1_1boswatch_1_1test__broadcast.html | 358 ++ ...spacetest_1_1boswatch_1_1test__config.html | 470 +++ ...pacetest_1_1boswatch_1_1test__decoder.html | 446 +++ ...spacetest_1_1boswatch_1_1test__header.html | 204 + ...spacetest_1_1boswatch_1_1test__packet.html | 316 ++ ...espacetest_1_1boswatch_1_1test__paths.html | 261 ++ ...espacetest_1_1boswatch_1_1test__timer.html | 474 +++ api/html/namespacetest_1_1module.html | 127 + ...acetest_1_1module_1_1test__descriptor.html | 341 ++ api/html/namespacetest_1_1plugin.html | 119 + api/html/namespacetest_1_1test__template.html | 244 ++ api/html/nav_f.png | Bin 0 -> 151 bytes api/html/nav_fd.png | Bin 0 -> 156 bytes api/html/nav_g.png | Bin 0 -> 95 bytes api/html/nav_h.png | Bin 0 -> 97 bytes api/html/nav_hd.png | Bin 0 -> 109 bytes api/html/navtree.css | 149 + api/html/navtree.js | 483 +++ api/html/navtreedata.js | 54 + api/html/navtreeindex0.js | 253 ++ api/html/navtreeindex1.js | 89 + api/html/open.png | Bin 0 -> 123 bytes api/html/pages.html | 124 + api/html/plus.svg | 9 + api/html/plusd.svg | 9 + api/html/resize.js | 147 + api/html/search/all_0.js | 83 + api/html/search/all_1.js | 8 + api/html/search/all_10.js | 90 + api/html/search/all_11.js | 5 + api/html/search/all_12.js | 5 + api/html/search/all_2.js | 45 + api/html/search/all_3.js | 16 + api/html/search/all_4.js | 8 + api/html/search/all_5.js | 7 + api/html/search/all_6.js | 13 + api/html/search/all_7.js | 5 + api/html/search/all_8.js | 7 + api/html/search/all_9.js | 9 + api/html/search/all_a.js | 18 + api/html/search/all_b.js | 5 + api/html/search/all_c.js | 6 + api/html/search/all_d.js | 18 + api/html/search/all_e.js | 16 + api/html/search/all_f.js | 25 + api/html/search/classes_0.js | 5 + api/html/search/classes_1.js | 7 + api/html/search/classes_2.js | 4 + api/html/search/classes_3.js | 4 + api/html/search/classes_4.js | 4 + api/html/search/classes_5.js | 4 + api/html/search/classes_6.js | 4 + api/html/search/classes_7.js | 5 + api/html/search/classes_8.js | 4 + api/html/search/classes_9.js | 8 + api/html/search/classes_a.js | 7 + api/html/search/classes_b.js | 4 + api/html/search/classes_c.js | 5 + api/html/search/classes_d.js | 4 + api/html/search/close.svg | 18 + api/html/search/functions_0.js | 24 + api/html/search/functions_1.js | 8 + api/html/search/functions_10.js | 5 + api/html/search/functions_11.js | 4 + api/html/search/functions_2.js | 7 + api/html/search/functions_3.js | 8 + api/html/search/functions_4.js | 6 + api/html/search/functions_5.js | 6 + api/html/search/functions_6.js | 13 + api/html/search/functions_7.js | 4 + api/html/search/functions_8.js | 6 + api/html/search/functions_9.js | 5 + api/html/search/functions_a.js | 7 + api/html/search/functions_b.js | 5 + api/html/search/functions_c.js | 6 + api/html/search/functions_d.js | 10 + api/html/search/functions_e.js | 21 + api/html/search/functions_f.js | 72 + api/html/search/mag.svg | 24 + api/html/search/mag_d.svg | 24 + api/html/search/mag_sel.svg | 31 + api/html/search/mag_seld.svg | 31 + api/html/search/namespaces_0.js | 33 + api/html/search/namespaces_1.js | 12 + api/html/search/namespaces_2.js | 10 + api/html/search/namespaces_3.js | 17 + api/html/search/pages_0.js | 4 + api/html/search/pages_1.js | 4 + api/html/search/pages_2.js | 4 + api/html/search/search.css | 286 ++ api/html/search/search.js | 694 ++++ api/html/search/searchdata.js | 30 + api/html/search/variables_0.js | 60 + api/html/search/variables_1.js | 6 + api/html/search/variables_2.js | 11 + api/html/search/variables_3.js | 4 + api/html/search/variables_4.js | 4 + api/html/search/variables_5.js | 5 + api/html/search/variables_6.js | 5 + api/html/search/variables_7.js | 4 + api/html/search/variables_8.js | 4 + api/html/search/variables_9.js | 6 + api/html/search/variables_a.js | 6 + api/html/search/variables_b.js | 4 + api/html/splitbar.png | Bin 0 -> 312 bytes api/html/splitbard.png | Bin 0 -> 286 bytes api/html/sync_off.png | Bin 0 -> 840 bytes api/html/sync_on.png | Bin 0 -> 829 bytes api/html/tab_a.png | Bin 0 -> 143 bytes api/html/tab_ad.png | Bin 0 -> 133 bytes api/html/tab_b.png | Bin 0 -> 177 bytes api/html/tab_bd.png | Bin 0 -> 164 bytes api/html/tab_h.png | Bin 0 -> 184 bytes api/html/tab_hd.png | Bin 0 -> 177 bytes api/html/tab_s.png | Bin 0 -> 193 bytes api/html/tab_sd.png | Bin 0 -> 186 bytes api/html/tabs.css | 1 + api/html/todo.html | 123 + changelog.html | 290 ++ config.html | 674 ++++ css/base.css | 366 ++ css/bootstrap.min.css | 12 + css/bootstrap.min.css.map | 1 + css/brands.min.css | 6 + css/fontawesome.min.css | 9 + css/solid.min.css | 6 + css/v4-font-face.min.css | 6 + develop/ModulPlugin.html | 415 ++ develop/packet.html | 597 +++ img/broadcast.drawio | 1 + img/broadcast.png | Bin 0 -> 52272 bytes img/bw3.png | Bin 0 -> 35934 bytes img/client.drawio | 1 + img/client.png | Bin 0 -> 28358 bytes img/favicon.ico | Bin 0 -> 1150 bytes img/grid.png | Bin 0 -> 1458 bytes img/router.drawio | 1 + img/router.png | Bin 0 -> 48160 bytes img/server.drawio | 1 + img/server.png | Bin 0 -> 45722 bytes index.html | 271 ++ information/broadcast.html | 288 ++ information/router.html | 360 ++ information/serverclient.html | 290 ++ js/base.js | 287 ++ js/bootstrap.bundle.min.js | 7 + js/bootstrap.bundle.min.js.map | 1 + js/darkmode.js | 65 + modul/descriptor.html | 403 ++ modul/double_filter.html | 360 ++ modul/geocoding.html | 380 ++ modul/mode_filter.html | 349 ++ modul/regex_filter.html | 397 ++ plugin/divera.html | 381 ++ plugin/http.html | 351 ++ plugin/mysql.html | 349 ++ plugin/telegram.html | 367 ++ search/lunr.js | 3475 +++++++++++++++++ search/main.js | 109 + search/search_index.json | 1 + search/worker.js | 133 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes tbd.html | 262 ++ webfonts/fa-brands-400.ttf | Bin 0 -> 207972 bytes webfonts/fa-brands-400.woff2 | Bin 0 -> 117372 bytes webfonts/fa-regular-400.ttf | Bin 0 -> 68004 bytes webfonts/fa-regular-400.woff2 | Bin 0 -> 25452 bytes webfonts/fa-solid-900.ttf | Bin 0 -> 419720 bytes webfonts/fa-solid-900.woff2 | Bin 0 -> 156496 bytes webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes 356 files changed, 51035 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 api/html/annotated.html create mode 100644 api/html/annotated_dup.js create mode 100644 api/html/bc_s.png create mode 100644 api/html/bc_sd.png create mode 100644 api/html/classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html create mode 100644 api/html/classboswatch_1_1config_yaml_1_1_config_y_a_m_l.js create mode 100644 api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.html create mode 100644 api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.js create mode 100644 api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html create mode 100644 api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.js create mode 100644 api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html create mode 100644 api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.js create mode 100644 api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html create mode 100644 api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.js create mode 100644 api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.html create mode 100644 api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.js create mode 100644 api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html create mode 100644 api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.js create mode 100644 api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html create mode 100644 api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.js create mode 100644 api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html create mode 100644 api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.js create mode 100644 api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html create mode 100644 api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.js create mode 100644 api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html create mode 100644 api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.js create mode 100644 api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.html create mode 100644 api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.js create mode 100644 api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.html create mode 100644 api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.js create mode 100644 api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html create mode 100644 api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.js create mode 100644 api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html create mode 100644 api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.html create mode 100644 api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.js create mode 100644 api/html/classboswatch_1_1packet_1_1_packet.html create mode 100644 api/html/classboswatch_1_1packet_1_1_packet.js create mode 100644 api/html/classboswatch_1_1process_manager_1_1_process_manager.html create mode 100644 api/html/classboswatch_1_1process_manager_1_1_process_manager.js create mode 100644 api/html/classboswatch_1_1router_1_1route_1_1_route.html create mode 100644 api/html/classboswatch_1_1router_1_1route_1_1_route.js create mode 100644 api/html/classboswatch_1_1router_1_1router_1_1_router.html create mode 100644 api/html/classboswatch_1_1router_1_1router_1_1_router.js create mode 100644 api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.html create mode 100644 api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.js create mode 100644 api/html/classboswatch_1_1timer_1_1_repeated_timer.html create mode 100644 api/html/classboswatch_1_1timer_1_1_repeated_timer.js create mode 100644 api/html/classes.html create mode 100644 api/html/classmodule_1_1descriptor_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1descriptor_1_1_boswatch_module.js create mode 100644 api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.js create mode 100644 api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.js create mode 100644 api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.js create mode 100644 api/html/classmodule_1_1geocoding_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1geocoding_1_1_boswatch_module.js create mode 100644 api/html/classmodule_1_1module_base_1_1_module_base.html create mode 100644 api/html/classmodule_1_1module_base_1_1_module_base.js create mode 100644 api/html/classmodule_1_1template__module_1_1_boswatch_module.html create mode 100644 api/html/classmodule_1_1template__module_1_1_boswatch_module.js create mode 100644 api/html/classplugin_1_1divera_1_1_boswatch_plugin.html create mode 100644 api/html/classplugin_1_1divera_1_1_boswatch_plugin.js create mode 100644 api/html/classplugin_1_1http_1_1_boswatch_plugin.html create mode 100644 api/html/classplugin_1_1http_1_1_boswatch_plugin.js create mode 100644 api/html/classplugin_1_1mysql_1_1_boswatch_plugin.html create mode 100644 api/html/classplugin_1_1mysql_1_1_boswatch_plugin.js create mode 100644 api/html/classplugin_1_1plugin_base_1_1_plugin_base.html create mode 100644 api/html/classplugin_1_1plugin_base_1_1_plugin_base.js create mode 100644 api/html/classplugin_1_1telegram_1_1_boswatch_plugin.html create mode 100644 api/html/classplugin_1_1telegram_1_1_boswatch_plugin.js create mode 100644 api/html/classplugin_1_1telegram_1_1_m_q_bot.html create mode 100644 api/html/classplugin_1_1telegram_1_1_m_q_bot.js create mode 100644 api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.html create mode 100644 api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.js create mode 100644 api/html/clipboard.js create mode 100644 api/html/closed.png create mode 100644 api/html/cookie.js create mode 100644 api/html/dir_065827023a8094952705c99b7a70d726.html create mode 100644 api/html/dir_13e138d54eb8818da29c3992edef070a.html create mode 100644 api/html/dir_18ba14bdafca2d5fe76631d8c96c7756.html create mode 100644 api/html/dir_2006f8608b07fda10f64d4c6574ce610.html create mode 100644 api/html/dir_43da38551d4977a390038d31b18749ea.html create mode 100644 api/html/dir_4cd0c9eca83862460f0369248cfc2f5b.html create mode 100644 api/html/dir_814a05153877d296d2f0b8283bfee1e3.html create mode 100644 api/html/dir_8f20f41be9704e4cc35f0dc735991ad7.html create mode 100644 api/html/dir_a401edae9efb638176fb2226123ed9a0.html create mode 100644 api/html/dir_a7b0466279106ea0b8f86f609f621680.html create mode 100644 api/html/dir_b4c3aec6cd8f28418150dce663061cfa.html create mode 100644 api/html/dir_c3c55799aed6b6d9e14d19d26506d0dd.html create mode 100644 api/html/dir_f49b800a024456700a737074495380af.html create mode 100644 api/html/doc.svg create mode 100644 api/html/docd.svg create mode 100644 api/html/doxygen.css create mode 100644 api/html/doxygen.svg create mode 100644 api/html/doxygen_crawl.html create mode 100644 api/html/dynsections.js create mode 100644 api/html/folderclosed.svg create mode 100644 api/html/folderclosedd.svg create mode 100644 api/html/folderopen.svg create mode 100644 api/html/folderopend.svg create mode 100644 api/html/functions.html create mode 100644 api/html/functions_a.html create mode 100644 api/html/functions_b.html create mode 100644 api/html/functions_c.html create mode 100644 api/html/functions_d.html create mode 100644 api/html/functions_dup.js create mode 100644 api/html/functions_f.html create mode 100644 api/html/functions_func.html create mode 100644 api/html/functions_g.html create mode 100644 api/html/functions_h.html create mode 100644 api/html/functions_i.html create mode 100644 api/html/functions_l.html create mode 100644 api/html/functions_m.html create mode 100644 api/html/functions_n.html create mode 100644 api/html/functions_o.html create mode 100644 api/html/functions_p.html create mode 100644 api/html/functions_r.html create mode 100644 api/html/functions_s.html create mode 100644 api/html/functions_t.html create mode 100644 api/html/functions_vars.html create mode 100644 api/html/functions_z.html create mode 100644 api/html/hierarchy.html create mode 100644 api/html/hierarchy.js create mode 100644 api/html/index.html create mode 100644 api/html/jquery.js create mode 100644 api/html/md__r_e_a_d_m_e.html create mode 100644 api/html/minus.svg create mode 100644 api/html/minusd.svg create mode 100644 api/html/namespaceboswatch.html create mode 100644 api/html/namespaceboswatch_1_1config_yaml.html create mode 100644 api/html/namespaceboswatch_1_1decoder.html create mode 100644 api/html/namespaceboswatch_1_1decoder_1_1decoder.html create mode 100644 api/html/namespaceboswatch_1_1decoder_1_1fms_decoder.html create mode 100644 api/html/namespaceboswatch_1_1decoder_1_1pocsag_decoder.html create mode 100644 api/html/namespaceboswatch_1_1decoder_1_1zvei_decoder.html create mode 100644 api/html/namespaceboswatch_1_1input_source.html create mode 100644 api/html/namespaceboswatch_1_1input_source_1_1input_base.html create mode 100644 api/html/namespaceboswatch_1_1input_source_1_1line_in_input.html create mode 100644 api/html/namespaceboswatch_1_1input_source_1_1pulseaudio_input.html create mode 100644 api/html/namespaceboswatch_1_1input_source_1_1sdr_input.html create mode 100644 api/html/namespaceboswatch_1_1network.html create mode 100644 api/html/namespaceboswatch_1_1network_1_1broadcast.html create mode 100644 api/html/namespaceboswatch_1_1network_1_1client.html create mode 100644 api/html/namespaceboswatch_1_1network_1_1net_check.html create mode 100644 api/html/namespaceboswatch_1_1network_1_1server.html create mode 100644 api/html/namespaceboswatch_1_1packet.html create mode 100644 api/html/namespaceboswatch_1_1process_manager.html create mode 100644 api/html/namespaceboswatch_1_1router.html create mode 100644 api/html/namespaceboswatch_1_1router_1_1route.html create mode 100644 api/html/namespaceboswatch_1_1router_1_1router.html create mode 100644 api/html/namespaceboswatch_1_1router_1_1router_manager.html create mode 100644 api/html/namespaceboswatch_1_1timer.html create mode 100644 api/html/namespaceboswatch_1_1utils.html create mode 100644 api/html/namespaceboswatch_1_1utils_1_1header.html create mode 100644 api/html/namespaceboswatch_1_1utils_1_1misc.html create mode 100644 api/html/namespaceboswatch_1_1utils_1_1paths.html create mode 100644 api/html/namespaceboswatch_1_1utils_1_1version.html create mode 100644 api/html/namespaceboswatch_1_1wildcard.html create mode 100644 api/html/namespacemembers.html create mode 100644 api/html/namespacemembers_func.html create mode 100644 api/html/namespacemembers_vars.html create mode 100644 api/html/namespacemodule.html create mode 100644 api/html/namespacemodule_1_1descriptor.html create mode 100644 api/html/namespacemodule_1_1filter.html create mode 100644 api/html/namespacemodule_1_1filter_1_1double_filter.html create mode 100644 api/html/namespacemodule_1_1filter_1_1mode_filter.html create mode 100644 api/html/namespacemodule_1_1filter_1_1regex_filter.html create mode 100644 api/html/namespacemodule_1_1geocoding.html create mode 100644 api/html/namespacemodule_1_1module_base.html create mode 100644 api/html/namespacemodule_1_1template__module.html create mode 100644 api/html/namespaceplugin.html create mode 100644 api/html/namespaceplugin_1_1divera.html create mode 100644 api/html/namespaceplugin_1_1http.html create mode 100644 api/html/namespaceplugin_1_1mysql.html create mode 100644 api/html/namespaceplugin_1_1plugin_base.html create mode 100644 api/html/namespaceplugin_1_1telegram.html create mode 100644 api/html/namespaceplugin_1_1template__plugin.html create mode 100644 api/html/namespacetest.html create mode 100644 api/html/namespacetest_1_1boswatch.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test___server_client.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__broadcast.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__config.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__decoder.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__header.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__packet.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__paths.html create mode 100644 api/html/namespacetest_1_1boswatch_1_1test__timer.html create mode 100644 api/html/namespacetest_1_1module.html create mode 100644 api/html/namespacetest_1_1module_1_1test__descriptor.html create mode 100644 api/html/namespacetest_1_1plugin.html create mode 100644 api/html/namespacetest_1_1test__template.html create mode 100644 api/html/nav_f.png create mode 100644 api/html/nav_fd.png create mode 100644 api/html/nav_g.png create mode 100644 api/html/nav_h.png create mode 100644 api/html/nav_hd.png create mode 100644 api/html/navtree.css create mode 100644 api/html/navtree.js create mode 100644 api/html/navtreedata.js create mode 100644 api/html/navtreeindex0.js create mode 100644 api/html/navtreeindex1.js create mode 100644 api/html/open.png create mode 100644 api/html/pages.html create mode 100644 api/html/plus.svg create mode 100644 api/html/plusd.svg create mode 100644 api/html/resize.js create mode 100644 api/html/search/all_0.js create mode 100644 api/html/search/all_1.js create mode 100644 api/html/search/all_10.js create mode 100644 api/html/search/all_11.js create mode 100644 api/html/search/all_12.js create mode 100644 api/html/search/all_2.js create mode 100644 api/html/search/all_3.js create mode 100644 api/html/search/all_4.js create mode 100644 api/html/search/all_5.js create mode 100644 api/html/search/all_6.js create mode 100644 api/html/search/all_7.js create mode 100644 api/html/search/all_8.js create mode 100644 api/html/search/all_9.js create mode 100644 api/html/search/all_a.js create mode 100644 api/html/search/all_b.js create mode 100644 api/html/search/all_c.js create mode 100644 api/html/search/all_d.js create mode 100644 api/html/search/all_e.js create mode 100644 api/html/search/all_f.js create mode 100644 api/html/search/classes_0.js create mode 100644 api/html/search/classes_1.js create mode 100644 api/html/search/classes_2.js create mode 100644 api/html/search/classes_3.js create mode 100644 api/html/search/classes_4.js create mode 100644 api/html/search/classes_5.js create mode 100644 api/html/search/classes_6.js create mode 100644 api/html/search/classes_7.js create mode 100644 api/html/search/classes_8.js create mode 100644 api/html/search/classes_9.js create mode 100644 api/html/search/classes_a.js create mode 100644 api/html/search/classes_b.js create mode 100644 api/html/search/classes_c.js create mode 100644 api/html/search/classes_d.js create mode 100644 api/html/search/close.svg create mode 100644 api/html/search/functions_0.js create mode 100644 api/html/search/functions_1.js create mode 100644 api/html/search/functions_10.js create mode 100644 api/html/search/functions_11.js create mode 100644 api/html/search/functions_2.js create mode 100644 api/html/search/functions_3.js create mode 100644 api/html/search/functions_4.js create mode 100644 api/html/search/functions_5.js create mode 100644 api/html/search/functions_6.js create mode 100644 api/html/search/functions_7.js create mode 100644 api/html/search/functions_8.js create mode 100644 api/html/search/functions_9.js create mode 100644 api/html/search/functions_a.js create mode 100644 api/html/search/functions_b.js create mode 100644 api/html/search/functions_c.js create mode 100644 api/html/search/functions_d.js create mode 100644 api/html/search/functions_e.js create mode 100644 api/html/search/functions_f.js create mode 100644 api/html/search/mag.svg create mode 100644 api/html/search/mag_d.svg create mode 100644 api/html/search/mag_sel.svg create mode 100644 api/html/search/mag_seld.svg create mode 100644 api/html/search/namespaces_0.js create mode 100644 api/html/search/namespaces_1.js create mode 100644 api/html/search/namespaces_2.js create mode 100644 api/html/search/namespaces_3.js create mode 100644 api/html/search/pages_0.js create mode 100644 api/html/search/pages_1.js create mode 100644 api/html/search/pages_2.js create mode 100644 api/html/search/search.css create mode 100644 api/html/search/search.js create mode 100644 api/html/search/searchdata.js create mode 100644 api/html/search/variables_0.js create mode 100644 api/html/search/variables_1.js create mode 100644 api/html/search/variables_2.js create mode 100644 api/html/search/variables_3.js create mode 100644 api/html/search/variables_4.js create mode 100644 api/html/search/variables_5.js create mode 100644 api/html/search/variables_6.js create mode 100644 api/html/search/variables_7.js create mode 100644 api/html/search/variables_8.js create mode 100644 api/html/search/variables_9.js create mode 100644 api/html/search/variables_a.js create mode 100644 api/html/search/variables_b.js create mode 100644 api/html/splitbar.png create mode 100644 api/html/splitbard.png create mode 100644 api/html/sync_off.png create mode 100644 api/html/sync_on.png create mode 100644 api/html/tab_a.png create mode 100644 api/html/tab_ad.png create mode 100644 api/html/tab_b.png create mode 100644 api/html/tab_bd.png create mode 100644 api/html/tab_h.png create mode 100644 api/html/tab_hd.png create mode 100644 api/html/tab_s.png create mode 100644 api/html/tab_sd.png create mode 100644 api/html/tabs.css create mode 100644 api/html/todo.html create mode 100644 changelog.html create mode 100644 config.html create mode 100644 css/base.css create mode 100644 css/bootstrap.min.css create mode 100644 css/bootstrap.min.css.map create mode 100644 css/brands.min.css create mode 100644 css/fontawesome.min.css create mode 100644 css/solid.min.css create mode 100644 css/v4-font-face.min.css create mode 100644 develop/ModulPlugin.html create mode 100644 develop/packet.html create mode 100644 img/broadcast.drawio create mode 100644 img/broadcast.png create mode 100644 img/bw3.png create mode 100644 img/client.drawio create mode 100644 img/client.png create mode 100644 img/favicon.ico create mode 100644 img/grid.png create mode 100644 img/router.drawio create mode 100644 img/router.png create mode 100644 img/server.drawio create mode 100644 img/server.png create mode 100644 index.html create mode 100644 information/broadcast.html create mode 100644 information/router.html create mode 100644 information/serverclient.html create mode 100644 js/base.js create mode 100644 js/bootstrap.bundle.min.js create mode 100644 js/bootstrap.bundle.min.js.map create mode 100644 js/darkmode.js create mode 100644 modul/descriptor.html create mode 100644 modul/double_filter.html create mode 100644 modul/geocoding.html create mode 100644 modul/mode_filter.html create mode 100644 modul/regex_filter.html create mode 100644 plugin/divera.html create mode 100644 plugin/http.html create mode 100644 plugin/mysql.html create mode 100644 plugin/telegram.html create mode 100644 search/lunr.js create mode 100644 search/main.js create mode 100644 search/search_index.json create mode 100644 search/worker.js create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 tbd.html create mode 100644 webfonts/fa-brands-400.ttf create mode 100644 webfonts/fa-brands-400.woff2 create mode 100644 webfonts/fa-regular-400.ttf create mode 100644 webfonts/fa-regular-400.woff2 create mode 100644 webfonts/fa-solid-900.ttf create mode 100644 webfonts/fa-solid-900.woff2 create mode 100644 webfonts/fa-v4compatibility.ttf create mode 100644 webfonts/fa-v4compatibility.woff2 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..2df7f84 --- /dev/null +++ b/404.html @@ -0,0 +1,238 @@ + + + + + + + + + + + BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+ +
+
+

404

+

Page not found

+
+
+ + +
+
+ + + + + + + + + + + diff --git a/api/html/annotated.html b/api/html/annotated.html new file mode 100644 index 0000000..cfc0d84 --- /dev/null +++ b/api/html/annotated.html @@ -0,0 +1,198 @@ + + + + + + + +BOSWatch 3: Data Structures + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Nboswatch
 NconfigYaml
 CConfigYAML
 Ndecoder
 Ndecoder
 CDecoder
 NfmsDecoder
 CFmsDecoderFMS decoder class
 NpocsagDecoder
 CPocsagDecoderPOCSAG decoder class
 NzveiDecoder
 CZveiDecoderZVEI decoder class
 NinputSource
 NinputBase
 CInputBaseBase class for handling inout sources
 NlineInInput
 CLineInInputClass for the line-in input source
 NpulseaudioInput
 CPulseAudioInputClass for the PulseAudio input source
 NsdrInput
 CSdrInputClass for the sdr input source
 Nnetwork
 Nbroadcast
 CBroadcastClientBroadcastClient class
 CBroadcastServerBroadcastServer class
 Nclient
 CTCPClientTCP client class
 NnetCheck
 CNetCheckWorker class to check internet connection
 Nserver
 C_ThreadedTCPRequestHandlerThreadedTCPRequestHandler class for our TCPServer class
 C_ThreadedTCPServerThreadedTCPServer class for our TCPServer class
 CTCPServerTCP server class
 Npacket
 CPacketClass implementation of an BOSWatch packet
 NprocessManager
 CProcessManagerClass to manage a extern sub process
 Nrouter
 Nroute
 CRouteClass for single routing points
 Nrouter
 CRouterClass for the Router
 NrouterManager
 CRouterManagerClass to manage all routers
 Ntimer
 CRepeatedTimer
 Nmodule
 Ndescriptor
 CBoswatchModuleAdds descriptions to bwPackets
 Nfilter
 NdoubleFilter
 CBoswatchModuleDescription of the Module
 NmodeFilter
 CBoswatchModuleFilter of specific bwPacket mode
 NregexFilter
 CBoswatchModuleRegex based filter mechanism
 Ngeocoding
 CBoswatchModuleDescription of the Module
 NmoduleBase
 CModuleBaseMain module class
 Ntemplate_module
 CBoswatchModuleDescription of the Module
 Nplugin
 Ndivera
 CBoswatchPluginDescription of the Plugin
 Nhttp
 CBoswatchPluginDescription of the Plugin
 Nmysql
 CBoswatchPluginDescription of the Plugin
 NpluginBase
 CPluginBaseMain plugin class
 Ntelegram
 CBoswatchPluginDescription of the Plugin
 CMQBot
 Ntemplate_plugin
 CBoswatchPluginDescription of the Plugin
+
+
+
+ + + + diff --git a/api/html/annotated_dup.js b/api/html/annotated_dup.js new file mode 100644 index 0000000..8e323a7 --- /dev/null +++ b/api/html/annotated_dup.js @@ -0,0 +1,119 @@ +var annotated_dup = +[ + [ "boswatch", "namespaceboswatch.html", [ + [ "configYaml", "namespaceboswatch_1_1config_yaml.html", [ + [ "ConfigYAML", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l" ] + ] ], + [ "decoder", "namespaceboswatch_1_1decoder.html", [ + [ "decoder", "namespaceboswatch_1_1decoder_1_1decoder.html", [ + [ "Decoder", "classboswatch_1_1decoder_1_1decoder_1_1_decoder.html", "classboswatch_1_1decoder_1_1decoder_1_1_decoder" ] + ] ], + [ "fmsDecoder", "namespaceboswatch_1_1decoder_1_1fms_decoder.html", [ + [ "FmsDecoder", "classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html", "classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder" ] + ] ], + [ "pocsagDecoder", "namespaceboswatch_1_1decoder_1_1pocsag_decoder.html", [ + [ "PocsagDecoder", "classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html", "classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder" ] + ] ], + [ "zveiDecoder", "namespaceboswatch_1_1decoder_1_1zvei_decoder.html", [ + [ "ZveiDecoder", "classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html", "classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder" ] + ] ] + ] ], + [ "inputSource", "namespaceboswatch_1_1input_source.html", [ + [ "inputBase", "namespaceboswatch_1_1input_source_1_1input_base.html", [ + [ "InputBase", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html", "classboswatch_1_1input_source_1_1input_base_1_1_input_base" ] + ] ], + [ "lineInInput", "namespaceboswatch_1_1input_source_1_1line_in_input.html", [ + [ "LineInInput", "classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html", "classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input" ] + ] ], + [ "pulseaudioInput", "namespaceboswatch_1_1input_source_1_1pulseaudio_input.html", [ + [ "PulseAudioInput", "classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html", "classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input" ] + ] ], + [ "sdrInput", "namespaceboswatch_1_1input_source_1_1sdr_input.html", [ + [ "SdrInput", "classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html", "classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input" ] + ] ] + ] ], + [ "network", "namespaceboswatch_1_1network.html", [ + [ "broadcast", "namespaceboswatch_1_1network_1_1broadcast.html", [ + [ "BroadcastClient", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client" ], + [ "BroadcastServer", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server" ] + ] ], + [ "client", "namespaceboswatch_1_1network_1_1client.html", [ + [ "TCPClient", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html", "classboswatch_1_1network_1_1client_1_1_t_c_p_client" ] + ] ], + [ "netCheck", "namespaceboswatch_1_1network_1_1net_check.html", [ + [ "NetCheck", "classboswatch_1_1network_1_1net_check_1_1_net_check.html", "classboswatch_1_1network_1_1net_check_1_1_net_check" ] + ] ], + [ "server", "namespaceboswatch_1_1network_1_1server.html", [ + [ "_ThreadedTCPRequestHandler", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler" ], + [ "_ThreadedTCPServer", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html", null ], + [ "TCPServer", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html", "classboswatch_1_1network_1_1server_1_1_t_c_p_server" ] + ] ] + ] ], + [ "packet", "namespaceboswatch_1_1packet.html", [ + [ "Packet", "classboswatch_1_1packet_1_1_packet.html", "classboswatch_1_1packet_1_1_packet" ] + ] ], + [ "processManager", "namespaceboswatch_1_1process_manager.html", [ + [ "ProcessManager", "classboswatch_1_1process_manager_1_1_process_manager.html", "classboswatch_1_1process_manager_1_1_process_manager" ] + ] ], + [ "router", "namespaceboswatch_1_1router.html", [ + [ "route", "namespaceboswatch_1_1router_1_1route.html", [ + [ "Route", "classboswatch_1_1router_1_1route_1_1_route.html", "classboswatch_1_1router_1_1route_1_1_route" ] + ] ], + [ "router", "namespaceboswatch_1_1router_1_1router.html", [ + [ "Router", "classboswatch_1_1router_1_1router_1_1_router.html", "classboswatch_1_1router_1_1router_1_1_router" ] + ] ], + [ "routerManager", "namespaceboswatch_1_1router_1_1router_manager.html", [ + [ "RouterManager", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html", "classboswatch_1_1router_1_1router_manager_1_1_router_manager" ] + ] ] + ] ], + [ "timer", "namespaceboswatch_1_1timer.html", [ + [ "RepeatedTimer", "classboswatch_1_1timer_1_1_repeated_timer.html", "classboswatch_1_1timer_1_1_repeated_timer" ] + ] ] + ] ], + [ "module", "namespacemodule.html", [ + [ "descriptor", "namespacemodule_1_1descriptor.html", [ + [ "BoswatchModule", "classmodule_1_1descriptor_1_1_boswatch_module.html", "classmodule_1_1descriptor_1_1_boswatch_module" ] + ] ], + [ "filter", "namespacemodule_1_1filter.html", [ + [ "doubleFilter", "namespacemodule_1_1filter_1_1double_filter.html", [ + [ "BoswatchModule", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module" ] + ] ], + [ "modeFilter", "namespacemodule_1_1filter_1_1mode_filter.html", [ + [ "BoswatchModule", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module" ] + ] ], + [ "regexFilter", "namespacemodule_1_1filter_1_1regex_filter.html", [ + [ "BoswatchModule", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module" ] + ] ] + ] ], + [ "geocoding", "namespacemodule_1_1geocoding.html", [ + [ "BoswatchModule", "classmodule_1_1geocoding_1_1_boswatch_module.html", "classmodule_1_1geocoding_1_1_boswatch_module" ] + ] ], + [ "moduleBase", "namespacemodule_1_1module_base.html", [ + [ "ModuleBase", "classmodule_1_1module_base_1_1_module_base.html", "classmodule_1_1module_base_1_1_module_base" ] + ] ], + [ "template_module", "namespacemodule_1_1template__module.html", [ + [ "BoswatchModule", "classmodule_1_1template__module_1_1_boswatch_module.html", "classmodule_1_1template__module_1_1_boswatch_module" ] + ] ] + ] ], + [ "plugin", "namespaceplugin.html", [ + [ "divera", "namespaceplugin_1_1divera.html", [ + [ "BoswatchPlugin", "classplugin_1_1divera_1_1_boswatch_plugin.html", "classplugin_1_1divera_1_1_boswatch_plugin" ] + ] ], + [ "http", "namespaceplugin_1_1http.html", [ + [ "BoswatchPlugin", "classplugin_1_1http_1_1_boswatch_plugin.html", "classplugin_1_1http_1_1_boswatch_plugin" ] + ] ], + [ "mysql", "namespaceplugin_1_1mysql.html", [ + [ "BoswatchPlugin", "classplugin_1_1mysql_1_1_boswatch_plugin.html", "classplugin_1_1mysql_1_1_boswatch_plugin" ] + ] ], + [ "pluginBase", "namespaceplugin_1_1plugin_base.html", [ + [ "PluginBase", "classplugin_1_1plugin_base_1_1_plugin_base.html", "classplugin_1_1plugin_base_1_1_plugin_base" ] + ] ], + [ "telegram", "namespaceplugin_1_1telegram.html", [ + [ "BoswatchPlugin", "classplugin_1_1telegram_1_1_boswatch_plugin.html", "classplugin_1_1telegram_1_1_boswatch_plugin" ], + [ "MQBot", "classplugin_1_1telegram_1_1_m_q_bot.html", "classplugin_1_1telegram_1_1_m_q_bot" ] + ] ], + [ "template_plugin", "namespaceplugin_1_1template__plugin.html", [ + [ "BoswatchPlugin", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html", "classplugin_1_1template__plugin_1_1_boswatch_plugin" ] + ] ] + ] ] +]; \ No newline at end of file diff --git a/api/html/bc_s.png b/api/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..43099b0f4e67f97a8a1d6861998db3b187e05fc1 GIT binary patch literal 668 zcmV;N0%QG&P)4CJZEP++c|Ta*`|xlZ7!FESWW4JG!mpBD(Dp&L8CPzQ$s2ViXx;)A_{^& z7KPQ<`qZbOFj;C%r+cw&$?WBeC>?ChlqJUsuOx}YH zF2Sf#;~oOMS_!br`{9q-#Y>J#{v62^fKJ_>kT-`An%=fi#F#<8p@bAK0fAczAgk9= z#qVBk;KCo`Qb!3md2_s&tt`tVwz|av$+qEyBq_j&-Vz||g~zUQi#&cboSc840LO1c zR{}m!i~Bt`-ERW8*8*fk>Rp1KW104m$@$ml*!3|0pd2C>J!>;-vIIDQ4qqJw0LnbZ z=zG0OWH19>bm+=|fULgiO5SJEtKOphmm>fGt7o43Os%qo0`8*1Hpj`#Nf2Yu3XNMn3Cowz#DvbvAj%obe%ypF`4}t007D? zT{vYh@XrUB2>JoM z91I2nz0oW0v@(a_MDaojgZ=3c@7C5EK@>buQ=5E;aDF-GJUP5M=Y8J~z{ieMkSNYU z&t8N_kRcld2QUgVEpy_2D>wC6HwrUw!;JjpWnPf;!Jd&-0FN45F9G~F7R_B6CI3uG z6n}7DsgDYNxeF}6?hAH@q;TeLW4rp?QJ@b@TmC9z+#NMF{uPX$Y;3>kD9BD(ULfj{ zKEV6rScwWgw+kZK3wFH7al%<8Irf&~TaBISUp1ULXA>vB^`5-fGS56vY#my9qLWn` z`+fTK;!Rs))~n+w5i3eh@jK`7Wg0uL!9oX50dUv{8aXIw<{TBgU~1|F0Ef*o&U1q{ zZkI8BnyJZg01opLU!+Ku6XfVH3&uwPz|BJ;pqB!AuFCs@aR6{5`nB{?YV;>N&@}`A z4rtq#=+}c3K4r3T7=XhRQBBlEC5h(l8xsNjkem6gp=%%G!?RDU98$R70X6-p``Gm@ zipy3Gzh-uFoQ{8wR@k&Ph-#`03CnbeH;4sWgQz5IH0pdmHh5*9V%^r6ARBh~3rc*n z!g!(9tglttBYP$NPv8-injFphoAq_;<63)YkEmLd>CozQyK4XPHlV$R*RQQa`p<6= z^H$yocsi9pw9pEhlP!uh!qVE%Ef;Rn^6#|1@)F|(xUv4T8R{+VQ8os~!_9B24u#g? SLR9hq0000 + + + + + + +BOSWatch 3: boswatch.configYaml.ConfigYAML Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.configYaml.ConfigYAML Class Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config=None)
 
 __iter__ (self)
 
 __len__ (self)
 returns the length of an config element
 
 __str__ (self)
 Returns the string representation of the internal config dict.
 
 loadConfigFile (self, configPath)
 loads a given configuration file
 
 get (self, *args, default=None)
 Get a single value from the config or a value set in a new configYAML class instance.
 
+ + + +

+Protected Attributes

 _config = config
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
boswatch.configYaml.ConfigYAML.__init__ ( self,
config = None )
+
+
26 def __init__(self, config=None):
+
27 self._config = config
+
28
+
+
+
+

Member Function Documentation

+ +

◆ __iter__()

+ +
+
+ + + + + + + +
boswatch.configYaml.ConfigYAML.__iter__ ( self)
+
+
29 def __iter__(self):
+
30 for item in self._config:
+
31 if type(item) is list or type(item) is dict:
+
32 yield ConfigYAML(item)
+
33 else:
+
34 yield item
+
35
+
+
+
+ +

◆ __len__()

+ +
+
+ + + + + + + +
boswatch.configYaml.ConfigYAML.__len__ ( self)
+
+ +

returns the length of an config element

+
36 def __len__(self):
+
37 r"""!returns the length of an config element"""
+
38 return len(self._config)
+
39
+
+
+
+ +

◆ __str__()

+ +
+
+ + + + + + + +
boswatch.configYaml.ConfigYAML.__str__ ( self)
+
+ +

Returns the string representation of the internal config dict.

+
40 def __str__(self):
+
41 r"""!Returns the string representation of the internal config dict"""
+
42 return str(self._config)
+
43
+
+
+
+ +

◆ loadConfigFile()

+ +
+
+ + + + + + + + + + + +
boswatch.configYaml.ConfigYAML.loadConfigFile ( self,
configPath )
+
+ +

loads a given configuration file

+
Parameters
+ + +
configPathPath to the config file
+
+
+
Returns
True or False
+
44 def loadConfigFile(self, configPath):
+
45 r"""!loads a given configuration file
+
46
+
47 @param configPath: Path to the config file
+
48 @return True or False"""
+
49 logging.debug("load config file from: %s", configPath)
+
50 try:
+
51 with open(configPath) as file:
+
52 # use safe_load instead load
+
53 self._config = yaml.safe_load(file)
+
54 return True
+
55 except FileNotFoundError:
+
56 logging.error("config file not found: %s", configPath)
+
57 except yaml.parser.ParserError:
+
58 logging.exception("syntax error in config file: %s", configPath)
+
59 return False
+
60
+
+
+
+ +

◆ get()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.configYaml.ConfigYAML.get ( self,
* args,
default = None )
+
+ +

Get a single value from the config or a value set in a new configYAML class instance.

+
Parameters
+ + + +
*argsConfig section (one ore more strings)
defaultDefault value if section not found (None)
+
+
+
Returns
: A single value, a value set in an configYAML instance, the default value
+
61 def get(self, *args, default=None):
+
62 r"""!Get a single value from the config
+
63 or a value set in a new configYAML class instance
+
64
+
65 @param *args: Config section (one ore more strings)
+
66 @param default: Default value if section not found (None)
+
67 @return: A single value, a value set in an configYAML instance, the default value"""
+
68 tmp = self._config
+
69 try:
+
70 for arg in args:
+
71 tmp = tmp.get(arg, default)
+
72 if type(tmp) is list or type(tmp) is dict:
+
73 return ConfigYAML(tmp)
+
74 else:
+
75 return tmp
+
76 except AttributeError: # pragma: no cover
+
77 return default
+
+
+
+

Field Documentation

+ +

◆ _config

+ +
+
+ + + + + +
+ + + + +
boswatch.configYaml.ConfigYAML._config = config
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1config_yaml_1_1_config_y_a_m_l.js b/api/html/classboswatch_1_1config_yaml_1_1_config_y_a_m_l.js new file mode 100644 index 0000000..2eab6aa --- /dev/null +++ b/api/html/classboswatch_1_1config_yaml_1_1_config_y_a_m_l.js @@ -0,0 +1,10 @@ +var classboswatch_1_1config_yaml_1_1_config_y_a_m_l = +[ + [ "__init__", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab71fa021f469d6d45d597c0594403c85", null ], + [ "__iter__", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab774c33b0a9d2cf9f9a1ecbe28509ed5", null ], + [ "__len__", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a3e9d8bb1064df8d4971cb9c53c4df727", null ], + [ "__str__", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a973b5c19761074acf7e59407ecb36e5b", null ], + [ "loadConfigFile", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a77fa4b800bf837e717b351de2a184cbd", null ], + [ "get", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a7c5fe27e45b2124cb4147727713bfb94", null ], + [ "_config", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a099b2cad054f88c4819f4cc0c369b6d6", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.html b/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.html new file mode 100644 index 0000000..4cdd464 --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.html @@ -0,0 +1,178 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.decoder.Decoder Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.decoder.Decoder Class Reference
+
+
+ + + + + +

+Static Public Member Functions

 decode (data)
 Choose the right decoder and return a bwPacket instance.
 
+

Member Function Documentation

+ +

◆ decode()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.decoder.Decoder.decode ( data)
+
+static
+
+ +

Choose the right decoder and return a bwPacket instance.

+
Parameters
+ + +
datadata to decode
+
+
+
Returns
bwPacket instance
+
29 def decode(data):
+
30 r"""!Choose the right decoder and return a bwPacket instance
+
31
+
32 @param data: data to decode
+
33 @return bwPacket instance"""
+
34 data = str(data)
+
35 if "FMS" in data:
+
36 return FmsDecoder.decode(data)
+
37 elif "POCSAG" in data:
+
38 return PocsagDecoder.decode(data)
+
39 elif "ZVEI" in data:
+
40 return ZveiDecoder.decode(data)
+
41 else:
+
42 logging.warning("no decoder found for: %s", data)
+
43 return None
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.js b/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.js new file mode 100644 index 0000000..4792648 --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1decoder_1_1_decoder.js @@ -0,0 +1,4 @@ +var classboswatch_1_1decoder_1_1decoder_1_1_decoder = +[ + [ "decode", "classboswatch_1_1decoder_1_1decoder_1_1_decoder.html#addeb065568a99b4bcadb1fb3c6f11bd1", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html b/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html new file mode 100644 index 0000000..9df067e --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html @@ -0,0 +1,206 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.fmsDecoder.FmsDecoder Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.fmsDecoder.FmsDecoder Class Reference
+
+
+ +

FMS decoder class. + More...

+ + + + + +

+Static Public Member Functions

 decode (data)
 Decodes FMS.
 
+

Detailed Description

+

FMS decoder class.

+

This class decodes FMS data. First step is to validate the data and _check if the format is correct. In the last step a valid BOSWatch packet is created and returned

+

Member Function Documentation

+ +

◆ decode()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.fmsDecoder.FmsDecoder.decode ( data)
+
+static
+
+ +

Decodes FMS.

+
Parameters
+ + +
dataFMS for decoding
+
+
+
Returns
BOSWatch FMS packet or None
+
34 def decode(data):
+
35 r"""!Decodes FMS
+
36
+
37 @param data: FMS for decoding
+
38 @return BOSWatch FMS packet or None"""
+
39 if "CRC correct" in data:
+
40 service = data[19]
+
41 country = data[36]
+
42 location = data[61:63]
+
43 vehicle = data[72:76]
+
44 status = data[84]
+
45 direction = data[101]
+
46 directionText = data[103:110]
+
47 tacticalInfo = data[114:117]
+
48 fms_id = service + country + location + vehicle + status + direction
+
49
+
50 if re.search("[0-9a-f]{8}[0-9a-f][01]", fms_id):
+
51 logging.debug("found valid FMS")
+
52
+
53 bwPacket = Packet()
+
54 bwPacket.set("mode", "fms")
+
55 bwPacket.set("fms", fms_id)
+
56 bwPacket.set("service", service)
+
57 bwPacket.set("country", country)
+
58 bwPacket.set("location", location)
+
59 bwPacket.set("vehicle", vehicle)
+
60 bwPacket.set("status", status)
+
61 bwPacket.set("direction", direction)
+
62 bwPacket.set("directionText", directionText)
+
63 bwPacket.set("tacticalInfo", tacticalInfo)
+
64
+
65 return bwPacket
+
66
+
67 logging.warning("no valid FMS")
+
68 return None
+
69 logging.warning("CRC Error")
+
70 return None
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.js b/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.js new file mode 100644 index 0000000..0b3e46d --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.js @@ -0,0 +1,4 @@ +var classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder = +[ + [ "decode", "classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html#a2cf35244ea56127feeaf19e6edfac03f", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html b/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html new file mode 100644 index 0000000..2e356ca --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html @@ -0,0 +1,269 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.pocsagDecoder.PocsagDecoder Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.pocsagDecoder.PocsagDecoder Class Reference
+
+
+ +

POCSAG decoder class. + More...

+ + + + + +

+Static Public Member Functions

 decode (data)
 Decodes POCSAG.
 
+ + + + +

+Static Protected Member Functions

 _getBitrateRicSubric (data)
 Gets the Bitrate, Ric and Subric from data.
 
+

Detailed Description

+

POCSAG decoder class.

+

This class decodes POCSAG data. First step is to validate the data and _check if the format is correct. In the last step a valid BOSWatch packet is created and returned

+

Member Function Documentation

+ +

◆ decode()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.pocsagDecoder.PocsagDecoder.decode ( data)
+
+static
+
+ +

Decodes POCSAG.

+
Parameters
+ + +
dataPOCSAG for decoding
+
+
+
Returns
BOSWatch POCSAG packet or None
+
34 def decode(data):
+
35 r"""!Decodes POCSAG
+
36
+
37 @param data: POCSAG for decoding
+
38 @return BOSWatch POCSAG packet or None"""
+
39 bitrate, ric, subric = PocsagDecoder._getBitrateRicSubric(data)
+
40
+
41 if re.search("[0-9]{7}", ric) and re.search("[1-4]", subric):
+
42 if "Alpha:" in data:
+
43 message = data.split('Alpha: ')[1].strip()
+
44 message = message.replace('<NUL>', '').replace('<NUL', '').replace('< NUL>', '').replace('<EOT>', '').strip()
+
45 else:
+
46 message = ""
+
47 subricText = subric.replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d")
+
48
+
49 logging.debug("found valid POCSAG")
+
50
+
51 bwPacket = Packet()
+
52 bwPacket.set("mode", "pocsag")
+
53 bwPacket.set("bitrate", bitrate)
+
54 bwPacket.set("ric", ric)
+
55 bwPacket.set("subric", subric)
+
56 bwPacket.set("subricText", subricText)
+
57 bwPacket.set("message", message)
+
58
+
59 return bwPacket
+
60
+
61 logging.warning("no valid POCSAG")
+
62 return None
+
63
+
+
+
+ +

◆ _getBitrateRicSubric()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.pocsagDecoder.PocsagDecoder._getBitrateRicSubric ( data)
+
+staticprotected
+
+ +

Gets the Bitrate, Ric and Subric from data.

+
Parameters
+ + +
dataPOCSAG data string
+
+
+
Returns
bitrate
+
+ric
+
+subric
+
65 def _getBitrateRicSubric(data):
+
66 r"""!Gets the Bitrate, Ric and Subric from data
+
67
+
68 @param data: POCSAG data string
+
69 @return bitrate
+
70 @return ric
+
71 @return subric"""
+
72 bitrate, ric, subric = "0", "0", "0"
+
73
+
74 if "POCSAG512:" in data:
+
75 bitrate = "512"
+
76 ric = data[20:27].replace(" ", "").zfill(7)
+
77 subric = str(int(data[39]) + 1)
+
78
+
79 elif "POCSAG1200:" in data:
+
80 bitrate = "1200"
+
81 ric = data[21:28].replace(" ", "").zfill(7)
+
82 subric = str(int(data[40]) + 1)
+
83
+
84 elif "POCSAG2400:" in data:
+
85 bitrate = "2400"
+
86 ric = data[21:28].replace(" ", "").zfill(7)
+
87 subric = str(int(data[40]) + 1)
+
88
+
89 return bitrate, ric, subric
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.js b/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.js new file mode 100644 index 0000000..b12e861 --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.js @@ -0,0 +1,5 @@ +var classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder = +[ + [ "decode", "classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a868542c74621fe5e6238ff92d998a8ce", null ], + [ "_getBitrateRicSubric", "classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a9c7e70e58eacd1cf556ca02ca5a2d639", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html b/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html new file mode 100644 index 0000000..79d7d9a --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html @@ -0,0 +1,239 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.zveiDecoder.ZveiDecoder Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.zveiDecoder.ZveiDecoder Class Reference
+
+
+ +

ZVEI decoder class. + More...

+ + + + + +

+Static Public Member Functions

 decode (data)
 Decodes ZVEI.
 
+ + + + +

+Static Protected Member Functions

 _solveDoubleTone (data)
 Remove the doubleTone sign (here its the 'E')
 
+

Detailed Description

+

ZVEI decoder class.

+

This class decodes ZVEI data. First step is to validate the data and _check if the format is correct. After that the double-tone-sign 'E' is replaced. In the last step a valid BOSWatch packet is created and returned

+

Member Function Documentation

+ +

◆ decode()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.zveiDecoder.ZveiDecoder.decode ( data)
+
+static
+
+ +

Decodes ZVEI.

+
Parameters
+ + +
dataZVEI for decoding
+
+
+
Returns
BOSWatch ZVEI packet or None
+
35 def decode(data):
+
36 r"""!Decodes ZVEI
+
37
+
38 @param data: ZVEI for decoding
+
39 @return BOSWatch ZVEI packet or None"""
+
40 if re.search("[0-9E]{5}", data[7:12]):
+
41 logging.debug("found valid ZVEI")
+
42
+
43 bwPacket = Packet()
+
44 bwPacket.set("mode", "zvei")
+
45 bwPacket.set("tone", ZveiDecoder._solveDoubleTone(data[7:12]))
+
46
+
47 return bwPacket
+
48
+
49 logging.warning("no valid ZVEI")
+
50 return None
+
51
+
+
+
+ +

◆ _solveDoubleTone()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.decoder.zveiDecoder.ZveiDecoder._solveDoubleTone ( data)
+
+staticprotected
+
+ +

Remove the doubleTone sign (here its the 'E')

+
Parameters
+ + +
dataZVEI for double tone sign replacement
+
+
+
Returns
Double Tone replaced ZVEI
+
53 def _solveDoubleTone(data):
+
54 r"""!Remove the doubleTone sign (here its the 'E')
+
55
+
56 @param data: ZVEI for double tone sign replacement
+
57 @return Double Tone replaced ZVEI"""
+
58 if "E" in data:
+
59 data_old = data
+
60 for i in range(1, len(data)):
+
61 if data[i] == "E":
+
62 data = data.replace("E", data[i - 1], 1)
+
63 logging.debug("solve doubleTone: %s -> %s", data_old, data)
+
64 return data
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.js b/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.js new file mode 100644 index 0000000..3f78d46 --- /dev/null +++ b/api/html/classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.js @@ -0,0 +1,5 @@ +var classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder = +[ + [ "decode", "classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#a69957ae8721e3fd8b8d66bac1ba8896e", null ], + [ "_solveDoubleTone", "classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#af7f14c40e52ebac1349cc31b73928bc9", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.html b/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.html new file mode 100644 index 0000000..c14ef5b --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.html @@ -0,0 +1,527 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.inputBase.InputBase Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.inputBase.InputBase Class Reference
+
+
+ +

Base class for handling inout sources. + More...

+ + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, inputQueue, inputConfig, decoderConfig)
 Build a new InputSource class.
 
 start (self)
 Start the input source thread.
 
 shutdown (self)
 Stop the input source thread.
 
 addToQueue (self, data)
 Decode and add alarm data to the queue for further processing during boswatch client.
 
 getDecoderInstance (self, decoderConfig, StdIn)
 
+ + + +

+Data Fields

bool _inputThread = True
 
+ + + + +

+Protected Member Functions

 _runThread (self, dataQueue, sdrConfig, decoderConfig)
 Thread routine of the input source has to be inherit.
 
+ + + + + + + + + + + +

+Protected Attributes

 _inputThread = None
 
bool _isRunning = False
 
 _inputQueue = inputQueue
 
 _inputConfig = inputConfig
 
 _decoderConfig = decoderConfig
 
+

Detailed Description

+

Base class for handling inout sources.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
boswatch.inputSource.inputBase.InputBase.__init__ ( self,
inputQueue,
inputConfig,
decoderConfig )
+
+ +

Build a new InputSource class.

+
Parameters
+ + + + +
inputQueuePython queue object to store input data
inputConfigConfigYaml object with the inoutSource config
decoderConfigConfigYaml object with the decoder config
+
+
+
31 def __init__(self, inputQueue, inputConfig, decoderConfig):
+
32 r"""!Build a new InputSource class
+
33
+
34 @param inputQueue: Python queue object to store input data
+
35 @param inputConfig: ConfigYaml object with the inoutSource config
+
36 @param decoderConfig: ConfigYaml object with the decoder config"""
+
37 self._inputThread = None
+
38 self._isRunning = False
+
39 self._inputQueue = inputQueue
+
40 self._inputConfig = inputConfig
+
41 self._decoderConfig = decoderConfig
+
42
+
+
+
+

Member Function Documentation

+ +

◆ start()

+ +
+
+ + + + + + + +
boswatch.inputSource.inputBase.InputBase.start ( self)
+
+ +

Start the input source thread.

+
43 def start(self):
+
44 r"""!Start the input source thread"""
+
45 logging.debug("starting input thread")
+
46 self._isRunning = True
+
47 self._inputThread = threading.Thread(target=self._runThread, name="inputThread",
+
48 args=(self._inputQueue, self._inputConfig, self._decoderConfig))
+
49 self._inputThread.daemon = True
+
50 self._inputThread.start()
+
51
+
+
+
+ +

◆ _runThread()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
boswatch.inputSource.inputBase.InputBase._runThread ( self,
dataQueue,
sdrConfig,
decoderConfig )
+
+protected
+
+ +

Thread routine of the input source has to be inherit.

+ +

Reimplemented in boswatch.inputSource.lineInInput.LineInInput, boswatch.inputSource.pulseaudioInput.PulseAudioInput, and boswatch.inputSource.sdrInput.SdrInput.

+
53 def _runThread(self, dataQueue, sdrConfig, decoderConfig):
+
54 r"""!Thread routine of the input source has to be inherit"""
+
55
+
+
+
+ +

◆ shutdown()

+ +
+
+ + + + + + + +
boswatch.inputSource.inputBase.InputBase.shutdown ( self)
+
+ +

Stop the input source thread.

+
56 def shutdown(self):
+
57 r"""!Stop the input source thread"""
+
58 if self._isRunning:
+
59 logging.debug("wait for stopping the input thread")
+
60 self._isRunning = False
+
61 self._inputThread.join()
+
62 logging.debug("input thread stopped")
+
63
+
+
+
+ +

◆ addToQueue()

+ +
+
+ + + + + + + + + + + +
boswatch.inputSource.inputBase.InputBase.addToQueue ( self,
data )
+
+ +

Decode and add alarm data to the queue for further processing during boswatch client.

+
64 def addToQueue(self, data):
+
65 r"""!Decode and add alarm data to the queue for further processing during boswatch client"""
+
66 bwPacket = Decoder.decode(data)
+
67 if bwPacket is not None:
+
68 self._inputQueue.put_nowait((bwPacket, time.time()))
+
69 logging.debug("Added received data to queue")
+
70
+
+
+
+ +

◆ getDecoderInstance()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.inputSource.inputBase.InputBase.getDecoderInstance ( self,
decoderConfig,
StdIn )
+
+
71 def getDecoderInstance(self, decoderConfig, StdIn):
+
72 mmProc = ProcessManager(str(decoderConfig.get("path", default="multimon-ng")), textMode=True)
+
73 if decoderConfig.get("fms", default=0):
+
74 mmProc.addArgument("-a FMSFSK")
+
75 if decoderConfig.get("zvei", default=0):
+
76 mmProc.addArgument("-a ZVEI1")
+
77 if decoderConfig.get("poc512", default=0):
+
78 mmProc.addArgument("-a POCSAG512")
+
79 if decoderConfig.get("poc1200", default=0):
+
80 mmProc.addArgument("-a POCSAG1200")
+
81 if decoderConfig.get("poc2400", default=0):
+
82 mmProc.addArgument("-a POCSAG2400")
+
83 if decoderConfig.get("char", default=0):
+
84 mmProc.addArgument("-C " + str(decoderConfig.get("char")))
+
85 mmProc.addArgument("-f alpha")
+
86 mmProc.addArgument("-t raw -")
+
87 mmProc.setStdin(StdIn)
+
88 mmProc.setStderr(open(paths.LOG_PATH + "multimon-ng.log", "a"))
+
89 return mmProc
+
+
+
+

Field Documentation

+ +

◆ _inputThread [1/2]

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.inputBase.InputBase._inputThread = None
+
+protected
+
+ +
+
+ +

◆ _isRunning

+ +
+
+ + + + + +
+ + + + +
bool boswatch.inputSource.inputBase.InputBase._isRunning = False
+
+protected
+
+ +
+
+ +

◆ _inputQueue

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.inputBase.InputBase._inputQueue = inputQueue
+
+protected
+
+ +
+
+ +

◆ _inputConfig

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.inputBase.InputBase._inputConfig = inputConfig
+
+protected
+
+ +
+
+ +

◆ _decoderConfig

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.inputBase.InputBase._decoderConfig = decoderConfig
+
+protected
+
+ +
+
+ +

◆ _inputThread [2/2]

+ +
+
+ + + + +
bool boswatch.inputSource.inputBase.InputBase._inputThread = True
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.js b/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.js new file mode 100644 index 0000000..f038767 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1input_base_1_1_input_base.js @@ -0,0 +1,15 @@ +var classboswatch_1_1input_source_1_1input_base_1_1_input_base = +[ + [ "__init__", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#af27cd87704982341ab475309db6036aa", null ], + [ "start", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#ac01b4ac15a033f2df6d3ce95875f15e0", null ], + [ "_runThread", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a846609a2f9dd8b30009aa1bfd8131437", null ], + [ "shutdown", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a0ab8a4109b818531fc9f79192b045465", null ], + [ "addToQueue", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a83c2b67af75a860fc71b0424866f8bae", null ], + [ "getDecoderInstance", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a9874c16b7000f464b820d1ba831fdb1b", null ], + [ "_inputThread", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a6af1af984a2046a70a73e4ce2d6f1bfe", null ], + [ "_isRunning", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#ab32d042b09f11fe44d9d2a213241aa0e", null ], + [ "_inputQueue", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a16a630736e398371fbb7d9b8a39880cc", null ], + [ "_inputConfig", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a6ef8c7d1da7aa6c0aa391f6391dbc908", null ], + [ "_decoderConfig", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a39c4c74464f0d25c2545270f420c24cd", null ], + [ "_inputThread", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#aac7a9d6165202e4f97ba8b8241e74012", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html b/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html new file mode 100644 index 0000000..b6ba9a4 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html @@ -0,0 +1,279 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.lineInInput.LineInInput Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.lineInInput.LineInInput Class Reference
+
+
+ +

Class for the line-in input source. + More...

+ + + + + + +

+Protected Member Functions

 _runThread (self, dataQueue, lineInConfig, decoderConfig)
 Thread routine of the input source has to be inherit.
 
- Protected Member Functions inherited from boswatch.inputSource.inputBase.InputBase
+ + + + + + + + + + + + + + +

+Protected Attributes

 _isRunning
 
- Protected Attributes inherited from boswatch.inputSource.inputBase.InputBase
 _inputThread = None
 
bool _isRunning = False
 
 _inputQueue = inputQueue
 
 _inputConfig = inputConfig
 
 _decoderConfig = decoderConfig
 
+ + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from boswatch.inputSource.inputBase.InputBase
 __init__ (self, inputQueue, inputConfig, decoderConfig)
 Build a new InputSource class.
 
 start (self)
 Start the input source thread.
 
 shutdown (self)
 Stop the input source thread.
 
 addToQueue (self, data)
 Decode and add alarm data to the queue for further processing during boswatch client.
 
 getDecoderInstance (self, decoderConfig, StdIn)
 
- Data Fields inherited from boswatch.inputSource.inputBase.InputBase
bool _inputThread = True
 
+

Detailed Description

+

Class for the line-in input source.

+

Member Function Documentation

+ +

◆ _runThread()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
boswatch.inputSource.lineInInput.LineInInput._runThread ( self,
dataQueue,
sdrConfig,
decoderConfig )
+
+protected
+
+ +

Thread routine of the input source has to be inherit.

+ +

Reimplemented from boswatch.inputSource.inputBase.InputBase.

+
28 def _runThread(self, dataQueue, lineInConfig, decoderConfig):
+
29 lineInProc = None
+
30 mmProc = None
+
31 try:
+
32 lineInProc = ProcessManager("arecord")
+
33 lineInProc.addArgument("-q ") # supress any other outputs
+
34 lineInProc.addArgument("-f S16_LE") # set output format (16bit)
+
35 lineInProc.addArgument("-r 22050") # set output sampling rate (22050Hz)
+
36 lineInProc.addArgument("-D plughw:" +
+
37 str(lineInConfig.get("card", default="1")) +
+
38 "," +
+
39 str(lineInConfig.get("device", default="0"))) # device id
+
40 lineInProc.setStderr(open(paths.LOG_PATH + "asla.log", "a"))
+
41 lineInProc.start()
+
42
+
43 mmProc = self.getDecoderInstance(decoderConfig, lineInProc.stdout)
+
44 mmProc.start()
+
45
+
46 logging.info("start decoding")
+
47 while self._isRunning:
+
48 if not lineInProc.isRunning:
+
49 logging.warning("asla was down - try to restart")
+
50 lineInProc.start()
+
51
+
52 if lineInProc.isRunning:
+
53 logging.info("rtl_fm is back up - restarting multimon...")
+
54 mmProc.setStdin(lineInProc.stdout)
+
55 mmProc.start()
+
56 elif not mmProc.isRunning:
+
57 logging.warning("multimon was down - try to restart")
+
58 mmProc.start()
+
59 elif lineInProc.isRunning and mmProc.isRunning:
+
60 line = mmProc.readline()
+
61 if line:
+
62 self.addToQueue(line)
+
63 except:
+
64 logging.exception("error in lineIn input routine")
+
65 finally:
+
66 mmProc.stop()
+
67 lineInProc.stop()
+
+
+
+

Field Documentation

+ +

◆ _isRunning

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.lineInInput.LineInInput._isRunning
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.js b/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.js new file mode 100644 index 0000000..5061e1f --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.js @@ -0,0 +1,5 @@ +var classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input = +[ + [ "_runThread", "classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html#a57e48d2c1329f7c8dc2604a0c88dc8c0", null ], + [ "_isRunning", "classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html#a80507ea35abcb897f2b27265ca43f98f", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html b/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html new file mode 100644 index 0000000..488f597 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html @@ -0,0 +1,278 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.pulseaudioInput.PulseAudioInput Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.pulseaudioInput.PulseAudioInput Class Reference
+
+
+ +

Class for the PulseAudio input source. + More...

+ + + + + + +

+Protected Member Functions

 _runThread (self, dataQueue, PulseAudioConfig, decoderConfig)
 Thread routine of the input source has to be inherit.
 
- Protected Member Functions inherited from boswatch.inputSource.inputBase.InputBase
+ + + + + + + + + + + + + + +

+Protected Attributes

 _isRunning
 
- Protected Attributes inherited from boswatch.inputSource.inputBase.InputBase
 _inputThread = None
 
bool _isRunning = False
 
 _inputQueue = inputQueue
 
 _inputConfig = inputConfig
 
 _decoderConfig = decoderConfig
 
+ + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from boswatch.inputSource.inputBase.InputBase
 __init__ (self, inputQueue, inputConfig, decoderConfig)
 Build a new InputSource class.
 
 start (self)
 Start the input source thread.
 
 shutdown (self)
 Stop the input source thread.
 
 addToQueue (self, data)
 Decode and add alarm data to the queue for further processing during boswatch client.
 
 getDecoderInstance (self, decoderConfig, StdIn)
 
- Data Fields inherited from boswatch.inputSource.inputBase.InputBase
bool _inputThread = True
 
+

Detailed Description

+

Class for the PulseAudio input source.

+

Member Function Documentation

+ +

◆ _runThread()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
boswatch.inputSource.pulseaudioInput.PulseAudioInput._runThread ( self,
dataQueue,
sdrConfig,
decoderConfig )
+
+protected
+
+ +

Thread routine of the input source has to be inherit.

+ +

Reimplemented from boswatch.inputSource.inputBase.InputBase.

+
28 def _runThread(self, dataQueue, PulseAudioConfig, decoderConfig):
+
29 PulseAudioProc = None
+
30 mmProc = None
+
31 try:
+
32 PulseAudioProc = ProcessManager("parec")
+
33 PulseAudioProc.addArgument("--channels=1") # supress any other outputs
+
34 PulseAudioProc.addArgument("--format=s16le") # set output format (16bit)
+
35 PulseAudioProc.addArgument("--rate=22050") # set output sampling rate (22050Hz)
+
36 PulseAudioProc.addArgument("--device=" +
+
37 str(PulseAudioConfig.get("device", default="boswatch")) +
+
38 ".monitor") # sink name
+
39 PulseAudioProc.setStderr(open(paths.LOG_PATH + "pulseaudio.log", "a"))
+
40 PulseAudioProc.start()
+
41
+
42 mmProc = self.getDecoderInstance(decoderConfig, PulseAudioProc.stdout)
+
43 mmProc.start()
+
44
+
45 logging.info("start decoding")
+
46 while self._isRunning:
+
47 if not PulseAudioProc.isRunning:
+
48 logging.warning("PulseAudio was down - try to restart")
+
49 PulseAudioProc.start()
+
50
+
51 if PulseAudioProc.isRunning:
+
52 logging.info("rtl_fm is back up - restarting multimon...")
+
53 mmProc.setStdin(PulseAudioProc.stdout)
+
54 mmProc.start()
+
55 elif not mmProc.isRunning:
+
56 logging.warning("multimon was down - try to restart")
+
57 mmProc.start()
+
58 elif PulseAudioProc.isRunning and mmProc.isRunning:
+
59 line = mmProc.readline()
+
60 if line:
+
61 self.addToQueue(line)
+
62 except:
+
63 logging.exception("error in PulseAudio input routine")
+
64 finally:
+
65 mmProc.stop()
+
66 PulseAudioProc.stop()
+
+
+
+

Field Documentation

+ +

◆ _isRunning

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.pulseaudioInput.PulseAudioInput._isRunning
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.js b/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.js new file mode 100644 index 0000000..ee8c1c1 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.js @@ -0,0 +1,5 @@ +var classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input = +[ + [ "_runThread", "classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html#a343b1c81e6088a31501568c006542ff0", null ], + [ "_isRunning", "classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html#acf7d29232bad1b330d309f37cb064f65", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html b/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html new file mode 100644 index 0000000..629fe90 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html @@ -0,0 +1,283 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.sdrInput.SdrInput Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.sdrInput.SdrInput Class Reference
+
+
+ +

Class for the sdr input source. + More...

+ + + + + + +

+Protected Member Functions

 _runThread (self, dataQueue, sdrConfig, decoderConfig)
 Thread routine of the input source has to be inherit.
 
- Protected Member Functions inherited from boswatch.inputSource.inputBase.InputBase
+ + + + + + + + + + + + + + +

+Protected Attributes

 _isRunning
 
- Protected Attributes inherited from boswatch.inputSource.inputBase.InputBase
 _inputThread = None
 
bool _isRunning = False
 
 _inputQueue = inputQueue
 
 _inputConfig = inputConfig
 
 _decoderConfig = decoderConfig
 
+ + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from boswatch.inputSource.inputBase.InputBase
 __init__ (self, inputQueue, inputConfig, decoderConfig)
 Build a new InputSource class.
 
 start (self)
 Start the input source thread.
 
 shutdown (self)
 Stop the input source thread.
 
 addToQueue (self, data)
 Decode and add alarm data to the queue for further processing during boswatch client.
 
 getDecoderInstance (self, decoderConfig, StdIn)
 
- Data Fields inherited from boswatch.inputSource.inputBase.InputBase
bool _inputThread = True
 
+

Detailed Description

+

Class for the sdr input source.

+

Member Function Documentation

+ +

◆ _runThread()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
boswatch.inputSource.sdrInput.SdrInput._runThread ( self,
dataQueue,
sdrConfig,
decoderConfig )
+
+protected
+
+ +

Thread routine of the input source has to be inherit.

+ +

Reimplemented from boswatch.inputSource.inputBase.InputBase.

+
29 def _runThread(self, dataQueue, sdrConfig, decoderConfig):
+
30 sdrProc = None
+
31 mmProc = None
+
32 try:
+
33 sdrProc = ProcessManager(str(sdrConfig.get("rtlPath", default="rtl_fm")))
+
34 sdrProc.addArgument("-d " + str(sdrConfig.get("device", default="0"))) # device id
+
35 sdrProc.addArgument("-f " + str(sdrConfig.get("frequency"))) # frequencies
+
36 sdrProc.addArgument("-p " + str(sdrConfig.get("error", default="0"))) # frequency error in ppm
+
37 sdrProc.addArgument("-l " + str(sdrConfig.get("squelch", default="1"))) # squelch
+
38 sdrProc.addArgument("-g " + str(sdrConfig.get("gain", default="100"))) # gain
+
39 if (sdrConfig.get("fir_size", default=None) is not None):
+
40 sdrProc.addArgument("-F " + str(sdrConfig.get("fir_size"))) # fir_size
+
41 sdrProc.addArgument("-M fm") # set mode to fm
+
42 sdrProc.addArgument("-E DC") # set DC filter
+
43 sdrProc.addArgument("-s 22050") # bit rate of audio stream
+
44 sdrProc.setStderr(open(paths.LOG_PATH + "rtl_fm.log", "a"))
+
45 sdrProc.start()
+
46
+
47 mmProc = self.getDecoderInstance(decoderConfig, sdrProc.stdout)
+
48 mmProc.start()
+
49
+
50 logging.info("start decoding")
+
51 while self._isRunning:
+
52 if not sdrProc.isRunning:
+
53 logging.warning("rtl_fm was down - trying to restart in 10 seconds")
+
54 time.sleep(10)
+
55
+
56 sdrProc.start()
+
57 if sdrProc.isRunning:
+
58 logging.info("rtl_fm is back up - restarting multimon...")
+
59 mmProc.setStdin(sdrProc.stdout)
+
60 mmProc.start()
+
61 elif not mmProc.isRunning:
+
62 logging.warning("multimon was down - try to restart")
+
63 mmProc.start()
+
64 elif sdrProc.isRunning and mmProc.isRunning:
+
65 line = mmProc.readline()
+
66 if line:
+
67 self.addToQueue(line)
+
68 except:
+
69 logging.exception("error in sdr input routine")
+
70 finally:
+
71 mmProc.stop()
+
72 sdrProc.stop()
+
+
+
+

Field Documentation

+ +

◆ _isRunning

+ +
+
+ + + + + +
+ + + + +
boswatch.inputSource.sdrInput.SdrInput._isRunning
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.js b/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.js new file mode 100644 index 0000000..e428e71 --- /dev/null +++ b/api/html/classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.js @@ -0,0 +1,5 @@ +var classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input = +[ + [ "_runThread", "classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html#aaccbce0d6b8c281e71a0c3703e43a704", null ], + [ "_isRunning", "classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html#a66fdca8f67bc143ad3d087496cb0cb92", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html new file mode 100644 index 0000000..bf79331 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html @@ -0,0 +1,404 @@ + + + + + + + +BOSWatch 3: boswatch.network.broadcast.BroadcastClient Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.broadcast.BroadcastClient Class Reference
+
+
+ +

BroadcastClient class. + More...

+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, port=5000)
 Create an BroadcastClient instance.
 
 getConnInfo (self, retry=0)
 Get the connection info from server over udp broadcast.
 
 serverIP (self)
 Property to get the server IP after successful broadcast.
 
 serverPort (self)
 Property to get the server Port after successful broadcast.
 
+ + + + + + + + + +

+Protected Attributes

 _broadcastPort = port
 
str _serverIP = ""
 
int _serverPort = 0
 
 _socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
+

Detailed Description

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
boswatch.network.broadcast.BroadcastClient.__init__ ( self,
port = 5000 )
+
+ +

Create an BroadcastClient instance.

+
Parameters
+ + +
portport to send broadcast packets (5000)
+
+
+
27 def __init__(self, port=5000):
+
28 r"""!Create an BroadcastClient instance
+
29
+
30 @param port: port to send broadcast packets (5000)"""
+
31 self._broadcastPort = port
+
32
+
33 self._serverIP = ""
+
34 self._serverPort = 0
+
35
+
36 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
37 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+
38 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+
39 self._socket.settimeout(3)
+
40
+
+
+
+

Member Function Documentation

+ +

◆ getConnInfo()

+ +
+
+ + + + + + + + + + + +
boswatch.network.broadcast.BroadcastClient.getConnInfo ( self,
retry = 0 )
+
+ +

Get the connection info from server over udp broadcast.

+

This function will send broadcast package(s) to get connection info from the server.

+
    +
  • send the magic packet <BW-Request> on broadcast address.
  • +
  • wait for a <BW-Result> magic packet.
  • +
  • extract the connection data from the magic packet and return
  • +
+
Parameters
+ + +
retryCount of retry - 0 is infinite (0)
+
+
+
Returns
True or False
+
41 def getConnInfo(self, retry=0):
+
42 r"""!Get the connection info from server over udp broadcast
+
43
+
44 This function will send broadcast package(s)
+
45 to get connection info from the server.
+
46
+
47 - send the magic packet <BW-Request> on broadcast address.
+
48 - wait for a <BW-Result> magic packet.
+
49 - extract the connection data from the magic packet and return
+
50
+
51 @param retry: Count of retry - 0 is infinite (0)
+
52
+
53 @return True or False"""
+
54 sendPackages = 0
+
55 while sendPackages < retry or retry == 0:
+
56 try:
+
57 logging.debug("send magic <BW3-Request> as broadcast - Try: %d", sendPackages)
+
58 self._socket.sendto("<BW3-Request>".encode(), ('255.255.255.255', self._broadcastPort))
+
59 sendPackages += 1
+
60 payload, address = self._socket.recvfrom(1024)
+
61 payload = str(payload, "UTF-8")
+
62
+
63 if payload.startswith("<BW3-Result>"):
+
64 logging.debug("received magic <BW3-Result> from: %s", address[0])
+
65 self._serverIP = address[0]
+
66 self._serverPort = int(payload.split(";")[1])
+
67 logging.info("got connection info from server: %s:%d", self._serverIP, self._serverPort)
+
68 return True
+
69 except socket.timeout: # nothing received - retry
+
70 logging.debug("no magic packet received")
+
71 logging.warning("cannot fetch connection info after %d tries", sendPackages)
+
72 return False
+
73
+
+
+
+ +

◆ serverIP()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastClient.serverIP ( self)
+
+ +

Property to get the server IP after successful broadcast.

+
75 def serverIP(self):
+
76 r"""!Property to get the server IP after successful broadcast"""
+
77 return self._serverIP
+
78
+
+
+
+ +

◆ serverPort()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastClient.serverPort ( self)
+
+ +

Property to get the server Port after successful broadcast.

+
80 def serverPort(self):
+
81 r"""!Property to get the server Port after successful broadcast"""
+
82 return self._serverPort
+
83
+
84
+
+
+
+

Field Documentation

+ +

◆ _broadcastPort

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastClient._broadcastPort = port
+
+protected
+
+ +
+
+ +

◆ _serverIP

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastClient._serverIP = ""
+
+protected
+
+ +
+
+ +

◆ _serverPort

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastClient._serverPort = 0
+
+protected
+
+ +
+
+ +

◆ _socket

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastClient._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.js b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.js new file mode 100644 index 0000000..bc49fba --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.js @@ -0,0 +1,11 @@ +var classboswatch_1_1network_1_1broadcast_1_1_broadcast_client = +[ + [ "__init__", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#ab4294fb84142b6c5c7897adbac664bb1", null ], + [ "getConnInfo", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a020c629a993829463a215a58ddcfac21", null ], + [ "serverIP", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#af35a11a41a256de82a65128fb6be70a3", null ], + [ "serverPort", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a84e39ca725becf9615d186be8430eb92", null ], + [ "_broadcastPort", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#acdd370e919a9df510c393bf3cd220760", null ], + [ "_serverIP", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a3cdfb326c00a65543c5277f8c0a013af", null ], + [ "_serverPort", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a52906f01625de0d1a89331265a4ea2c4", null ], + [ "_socket", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#ae5551bfa3d1cc9957c97869ded23fe14", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html new file mode 100644 index 0000000..cc6262a --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html @@ -0,0 +1,513 @@ + + + + + + + +BOSWatch 3: boswatch.network.broadcast.BroadcastServer Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.broadcast.BroadcastServer Class Reference
+
+
+ +

BroadcastServer class. + More...

+ + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, servePort=8080, listenPort=5000)
 Create an BroadcastServer instance.
 
 __del__ (self)
 
 start (self)
 Start the broadcast server in a new thread.
 
 stop (self)
 Stop the broadcast server.
 
 isRunning (self)
 Property of broadcast server running state.
 
+ + + + + +

+Data Fields

 isRunning
 
str _serverThread = "BroadServ"
 
+ + + + +

+Protected Member Functions

 _listen (self)
 Broadcast server worker thread.
 
+ + + + + + + + + +

+Protected Attributes

 _socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
 _serverThread = None
 
bool _serverShutdown = False
 
 _servePort = servePort
 
+

Detailed Description

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.network.broadcast.BroadcastServer.__init__ ( self,
servePort = 8080,
listenPort = 5000 )
+
+ +

Create an BroadcastServer instance.

+
Parameters
+ + + +
servePortport to serve as connection info (8080)
listenPortport to listen for broadcast packets (5000)
+
+
+
88 def __init__(self, servePort=8080, listenPort=5000):
+
89 r"""!Create an BroadcastServer instance
+
90
+
91 @param servePort: port to serve as connection info (8080)
+
92 @param listenPort: port to listen for broadcast packets (5000)"""
+
93 self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
94 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+
95 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+
96 self._socket.settimeout(2)
+
97 self._socket.bind(('', listenPort))
+
98 self._serverThread = None
+
99 self._serverShutdown = False
+
100 self._servePort = servePort
+
101
+
+
+
+ +

◆ __del__()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastServer.__del__ ( self)
+
+
102 def __del__(self): # pragma: no cover
+
103 if self.isRunning:
+
104 self.stop()
+
105 while self.isRunning:
+
106 pass
+
107
+
+
+
+

Member Function Documentation

+ +

◆ start()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastServer.start ( self)
+
+ +

Start the broadcast server in a new thread.

+
Returns
True or False
+
108 def start(self):
+
109 r"""!Start the broadcast server in a new thread
+
110
+
111 @return True or False"""
+
112 if not self.isRunning:
+
113 logging.debug("start udp broadcast server")
+
114 self._serverThread = threading.Thread(target=self._listen)
+
115 self._serverThread.name = "BroadServ"
+
116 self._serverThread.daemon = True
+
117 self._serverShutdown = False
+
118 self._serverThread.start()
+
119 return True
+
120 logging.warning("udp broadcast server always started")
+
121 return True
+
122
+
+
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastServer.stop ( self)
+
+ +

Stop the broadcast server.

+

Due to the timeout of the socket, stopping the thread can be delayed by two seconds. But function returns immediately.

+
Returns
True or False
+
123 def stop(self):
+
124 r"""!Stop the broadcast server
+
125
+
126 Due to the timeout of the socket,
+
127 stopping the thread can be delayed by two seconds.
+
128 But function returns immediately.
+
129
+
130 @return True or False"""
+
131
+
132 if self.isRunning:
+
133 logging.debug("stop udp broadcast server")
+
134 self._serverShutdown = True
+
135 return True
+
136 else:
+
137 logging.warning("udp broadcast server always stopped")
+
138 return True
+
139
+
+
+
+ +

◆ _listen()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.network.broadcast.BroadcastServer._listen ( self)
+
+protected
+
+ +

Broadcast server worker thread.

+

This function listen for magic packets on broadcast address and send the connection info to the clients.

+
    +
  • listen for the magic packet <BW-Request>
  • +
  • send connection info in an <BW-Result> macig packet
  • +
+
140 def _listen(self):
+
141 r"""!Broadcast server worker thread
+
142
+
143 This function listen for magic packets on broadcast
+
144 address and send the connection info to the clients.
+
145
+
146 - listen for the magic packet <BW-Request>
+
147 - send connection info in an <BW-Result> macig packet"""
+
148 logging.debug("start listening for magic")
+
149 while not self._serverShutdown:
+
150 try:
+
151 payload, address = self._socket.recvfrom(1024)
+
152 payload = str(payload, "UTF-8")
+
153 if payload == "<BW3-Request>":
+
154 logging.debug("received magic <BW3-Request> from: %s", address[0])
+
155 logging.info("send connection info in magic <BW3-Result> to: %s", address[0])
+
156 self._socket.sendto("<BW3-Result>;".encode() + str(self._servePort).encode(), address)
+
157 except socket.timeout:
+
158 continue # timeout is accepted (not block at recvfrom())
+
159 self._serverThread = None
+
160 logging.debug("udp broadcast server stopped")
+
161
+
+
+
+ +

◆ isRunning()

+ +
+
+ + + + + + + +
boswatch.network.broadcast.BroadcastServer.isRunning ( self)
+
+ +

Property of broadcast server running state.

+
163 def isRunning(self):
+
164 r"""!Property of broadcast server running state"""
+
165 if self._serverThread:
+
166 return True
+
167 return False
+
+
+
+

Field Documentation

+ +

◆ _socket

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastServer._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+protected
+
+ +
+
+ +

◆ _serverThread [1/2]

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastServer._serverThread = None
+
+protected
+
+ +
+
+ +

◆ _serverShutdown

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastServer._serverShutdown = False
+
+protected
+
+ +
+
+ +

◆ _servePort

+ +
+
+ + + + + +
+ + + + +
boswatch.network.broadcast.BroadcastServer._servePort = servePort
+
+protected
+
+ +
+
+ +

◆ isRunning

+ +
+
+ + + + +
boswatch.network.broadcast.BroadcastServer.isRunning
+
+ +
+
+ +

◆ _serverThread [2/2]

+ +
+
+ + + + +
str boswatch.network.broadcast.BroadcastServer._serverThread = "BroadServ"
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.js b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.js new file mode 100644 index 0000000..ade96d9 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.js @@ -0,0 +1,15 @@ +var classboswatch_1_1network_1_1broadcast_1_1_broadcast_server = +[ + [ "__init__", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ae93a0a17a87977e5e675361f513c18d6", null ], + [ "__del__", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#aa4fcca86240231413885fcd050744152", null ], + [ "start", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9578bab3fdb883c6de357bf513884b2c", null ], + [ "stop", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ad4c950fc28b36e52da565856ab61866c", null ], + [ "_listen", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a5155943e9eb814fa38e30838998b0c97", null ], + [ "isRunning", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9fe9bb49f6d72bacdddee6436de7ec91", null ], + [ "_socket", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a896370fa8a3adca5e0435d3433a5bfcf", null ], + [ "_serverThread", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a5181654894e310d20de83207e4fc6d07", null ], + [ "_serverShutdown", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#adeecb8b6c9efbd9752657bc23c0abadb", null ], + [ "_servePort", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a6d220c67297313c9c3523a8aac9669e9", null ], + [ "isRunning", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#abd218c599104e5483936cc64ed2c1eb0", null ], + [ "_serverThread", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a74f239839968faaed59206bc4f02cdff", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.html b/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.html new file mode 100644 index 0000000..eb87749 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.html @@ -0,0 +1,461 @@ + + + + + + + +BOSWatch 3: boswatch.network.client.TCPClient Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.client.TCPClient Class Reference
+
+
+ +

TCP client class. + More...

+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, timeout=3)
 Create a new instance.
 
 connect (self, host="localhost", port=8080)
 Connect to the server.
 
 disconnect (self)
 Disconnect from the server.
 
 transmit (self, data)
 Send a data packet to the server.
 
 receive (self, timeout=1)
 Receive data from the server.
 
 isConnected (self)
 Property of client connected state.
 
+ + + +

+Data Fields

 isConnected
 
+ + + +

+Protected Attributes

 _sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
+

Detailed Description

+

TCP client class.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
boswatch.network.client.TCPClient.__init__ ( self,
timeout = 3 )
+
+ +

Create a new instance.

+
Parameters
+ + +
timeouttimeout for the client in sec. (3)
+
+
+
29 def __init__(self, timeout=3):
+
30 r"""!Create a new instance
+
31
+
32 @param timeout: timeout for the client in sec. (3)"""
+
33 socket.setdefaulttimeout(timeout)
+
34 self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
35
+
+
+
+

Member Function Documentation

+ +

◆ connect()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.network.client.TCPClient.connect ( self,
host = "localhost",
port = 8080 )
+
+ +

Connect to the server.

+
Parameters
+ + + +
hostServer IP address ("localhost")
portServer Port (8080)
+
+
+
Returns
True or False
+
36 def connect(self, host="localhost", port=8080):
+
37 r"""!Connect to the server
+
38
+
39 @param host: Server IP address ("localhost")
+
40 @param port: Server Port (8080)
+
41 @return True or False"""
+
42 try:
+
43 if not self.isConnected:
+
44 self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
45 self._sock.connect((host, port))
+
46 logging.debug("connected to %s:%s", host, port)
+
47 return True
+
48 logging.warning("client always connected")
+
49 return True
+
50 except socket.error as e:
+
51 logging.error(e)
+
52 return False
+
53
+
+
+
+ +

◆ disconnect()

+ +
+
+ + + + + + + +
boswatch.network.client.TCPClient.disconnect ( self)
+
+ +

Disconnect from the server.

+
Returns
True or False
+
54 def disconnect(self):
+
55 r"""!Disconnect from the server
+
56
+
57 @return True or False"""
+
58 try:
+
59 if self.isConnected:
+
60 self._sock.shutdown(socket.SHUT_RDWR)
+
61 self._sock.close()
+
62 logging.debug("disconnected")
+
63 return True
+
64 logging.warning("client always disconnected")
+
65 return True
+
66 except socket.error as e:
+
67 logging.error(e)
+
68 return False
+
69
+
+
+
+ +

◆ transmit()

+ +
+
+ + + + + + + + + + + +
boswatch.network.client.TCPClient.transmit ( self,
data )
+
+ +

Send a data packet to the server.

+
Parameters
+ + +
datadata to send to the server
+
+
+
Returns
True or False
+
70 def transmit(self, data):
+
71 r"""!Send a data packet to the server
+
72
+
73 @param data: data to send to the server
+
74 @return True or False"""
+
75 try:
+
76 logging.debug("transmitting:\n%s", data)
+
77 data = data.encode("utf-8")
+
78 header = str(len(data)).ljust(HEADERSIZE).encode("utf-8")
+
79 self._sock.sendall(header + data)
+
80 logging.debug("transmitted...")
+
81 return True
+
82 except socket.error as e:
+
83 logging.error(e)
+
84 return False
+
85
+
+
+
+ +

◆ receive()

+ +
+
+ + + + + + + + + + + +
boswatch.network.client.TCPClient.receive ( self,
timeout = 1 )
+
+ +

Receive data from the server.

+
Parameters
+ + +
timeoutto wait for incoming data in seconds
+
+
+
Returns
received data
+
86 def receive(self, timeout=1):
+
87 r"""!Receive data from the server
+
88
+
89 @param timeout: to wait for incoming data in seconds
+
90 @return received data"""
+
91 try:
+
92 read, _, _ = select.select([self._sock], [], [], timeout)
+
93 if not read: # check if there is something to read
+
94 return False
+
95
+
96 header = self._sock.recv(HEADERSIZE).decode("utf-8")
+
97 if not len(header): # check if there data
+
98 return False
+
99
+
100 length = int(header.strip())
+
101 received = self._sock.recv(length).decode("utf-8")
+
102
+
103 logging.debug("recv header: '%s'", header)
+
104 logging.debug("received %d bytes: %s", len(received), received)
+
105 return received
+
106 except socket.error as e:
+
107 logging.error(e)
+
108 return False
+
109
+
+
+
+ +

◆ isConnected()

+ +
+
+ + + + + + + +
boswatch.network.client.TCPClient.isConnected ( self)
+
+ +

Property of client connected state.

+
111 def isConnected(self):
+
112 r"""!Property of client connected state"""
+
113 try:
+
114 if self._sock:
+
115 _, write, _ = select.select([], [self._sock], [], 0.1)
+
116 if write:
+
117 data = "<keep-alive>".encode("utf-8")
+
118 header = str(len(data)).ljust(HEADERSIZE).encode("utf-8")
+
119 self._sock.sendall(header + data)
+
120 return True
+
121 return False
+
122 except socket.error as e:
+
123 if e.errno != 32:
+
124 logging.exception(e)
+
125 return False
+
126 except ValueError:
+
127 return False
+
+
+
+

Field Documentation

+ +

◆ _sock

+ +
+
+ + + + + +
+ + + + +
boswatch.network.client.TCPClient._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+protected
+
+ +
+
+ +

◆ isConnected

+ +
+
+ + + + +
boswatch.network.client.TCPClient.isConnected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.js b/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.js new file mode 100644 index 0000000..483dfbe --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1client_1_1_t_c_p_client.js @@ -0,0 +1,11 @@ +var classboswatch_1_1network_1_1client_1_1_t_c_p_client = +[ + [ "__init__", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a52dad8d55fb35e07756a5a779deff7fe", null ], + [ "connect", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a9cb1cfa9fa1f3e5aeb25329a2406ea50", null ], + [ "disconnect", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ac8a3ce9fefc7b8e0b2fbf653f484aac4", null ], + [ "transmit", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a0b220cacacdf690617645c7fefdc4f98", null ], + [ "receive", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ab38ae11d876aed47d12c7f753601b67f", null ], + [ "isConnected", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ae913438a3d6370473b87e323fa1afa9b", null ], + [ "_sock", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a085df370df1ad97a2ea2b9a510590721", null ], + [ "isConnected", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a22e2077708bcd0526c1628b24569a6f9", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.html b/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.html new file mode 100644 index 0000000..6bbfaf8 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.html @@ -0,0 +1,289 @@ + + + + + + + +BOSWatch 3: boswatch.network.netCheck.NetCheck Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.netCheck.NetCheck Class Reference
+
+
+ +

Worker class to check internet connection. + More...

+ + + + + + + + +

+Public Member Functions

 __init__ (self, hostname="https://www.google.com/", timeout=1)
 Create a new NetCheck instance.
 
 checkConn (self)
 Check the connection.
 
+ + + +

+Data Fields

bool connectionState = False
 
+ + + + + +

+Protected Attributes

 _hostname = hostname
 
 _timeout = timeout
 
+

Detailed Description

+

Worker class to check internet connection.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.network.netCheck.NetCheck.__init__ ( self,
hostname = "https://www.google.com/",
timeout = 1 )
+
+ +

Create a new NetCheck instance.

+
Parameters
+ + + +
hostnamehost against connection check is running ("https://www.google.com/")
timeouttimeout for connection check in sec. (1)
+
+
+
26 def __init__(self, hostname="https://www.google.com/", timeout=1):
+
27 r"""!Create a new NetCheck instance
+
28
+
29 @param hostname: host against connection check is running ("https://www.google.com/")
+
30 @param timeout: timeout for connection check in sec. (1)"""
+
31 self._hostname = hostname
+
32 self._timeout = timeout
+
33 self.connectionState = False
+
34 self.checkConn() # initiate a first check
+
35
+
+
+
+

Member Function Documentation

+ +

◆ checkConn()

+ +
+
+ + + + + + + +
boswatch.network.netCheck.NetCheck.checkConn ( self)
+
+ +

Check the connection.

+
Returns
True or False
+
36 def checkConn(self):
+
37 r"""!Check the connection
+
38
+
39 @return True or False"""
+
40 try:
+
41 urlopen(self._hostname, timeout=self._timeout)
+
42 logging.debug("%s is reachable", self._hostname)
+
43 self.connectionState = True
+
44 return True
+
45 except: # todo find right exception type
+
46 logging.warning("%s is not reachable", self._hostname)
+
47 self.connectionState = False
+
48 return False
+
+
+
+

Field Documentation

+ +

◆ _hostname

+ +
+
+ + + + + +
+ + + + +
boswatch.network.netCheck.NetCheck._hostname = hostname
+
+protected
+
+ +
+
+ +

◆ _timeout

+ +
+
+ + + + + +
+ + + + +
boswatch.network.netCheck.NetCheck._timeout = timeout
+
+protected
+
+ +
+
+ +

◆ connectionState

+ +
+
+ + + + +
bool boswatch.network.netCheck.NetCheck.connectionState = False
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.js b/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.js new file mode 100644 index 0000000..fe6e06d --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1net_check_1_1_net_check.js @@ -0,0 +1,8 @@ +var classboswatch_1_1network_1_1net_check_1_1_net_check = +[ + [ "__init__", "classboswatch_1_1network_1_1net_check_1_1_net_check.html#a93d5881314909255eb8b687a94942526", null ], + [ "checkConn", "classboswatch_1_1network_1_1net_check_1_1_net_check.html#a7e4b0f0b6a16bb9991e8f98f5a0e01d7", null ], + [ "_hostname", "classboswatch_1_1network_1_1net_check_1_1_net_check.html#abd1284df56696f11553229f48e33379d", null ], + [ "_timeout", "classboswatch_1_1network_1_1net_check_1_1_net_check.html#a3f96032d88c885267d1337c72d14da85", null ], + [ "connectionState", "classboswatch_1_1network_1_1net_check_1_1_net_check.html#a85861ea00ae1921f47c4addd2b40ce5b", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html new file mode 100644 index 0000000..2a163b4 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html @@ -0,0 +1,203 @@ + + + + + + + +BOSWatch 3: boswatch.network.server._ThreadedTCPRequestHandler Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.server._ThreadedTCPRequestHandler Class Reference
+
+
+ +

ThreadedTCPRequestHandler class for our TCPServer class. + More...

+ + + + + +

+Public Member Functions

 handle (self)
 Handles the request from an single client in a own thread.
 
+

Detailed Description

+

ThreadedTCPRequestHandler class for our TCPServer class.

+

Member Function Documentation

+ +

◆ handle()

+ +
+
+ + + + + + + +
boswatch.network.server._ThreadedTCPRequestHandler.handle ( self)
+
+ +

Handles the request from an single client in a own thread.

+

Insert a request in the clients[] list and send a [ack]

+
32 def handle(self):
+
33 r"""!Handles the request from an single client in a own thread
+
34
+
35 Insert a request in the clients[] list and send a [ack]"""
+
36 with self.server.clientsConnectedLock: # because our list is not threadsafe
+
37 self.server.clientsConnected[threading.current_thread().name] = {"address": self.client_address[0], "timestamp": time.time()}
+
38
+
39 logging.info("Client connected: %s", self.client_address[0])
+
40 cur_thread = threading.current_thread().name
+
41 req_name = str(cur_thread) + " " + self.client_address[0]
+
42
+
43 try:
+
44 while self.server.isActive:
+
45 read, _, _ = select.select([self.request], [], [], 0.5)
+
46 if not read:
+
47 continue # nothing to read on the socket
+
48
+
49 header = self.request.recv(HEADERSIZE).decode("utf-8")
+
50 if not len(header):
+
51 break # empty data -> socked closed
+
52
+
53 length = int(header.strip())
+
54 data = self.request.recv(length).decode("utf-8")
+
55
+
56 if data == "<keep-alive>":
+
57 continue
+
58
+
59 logging.debug("%s recv header: '%s'", req_name, header)
+
60 logging.debug("%s recv %d bytes:\n%s", req_name, len(data), data)
+
61
+
62 # add a new entry and the decoded data dict as an string in utf-8 and an timestamp
+
63 self.server.alarmQueue.put_nowait((self.client_address[0], data, time.time())) # queue is threadsafe
+
64 logging.debug("Add data to queue")
+
65
+
66 logging.debug("%s send: [ack]", req_name)
+
67
+
68 data = "[ack]".encode("utf-8")
+
69 header = str(len(data)).ljust(HEADERSIZE).encode("utf-8")
+
70 self.request.sendall(header + data)
+
71
+
72 except socket.error as e:
+
73 logging.error(e)
+
74 return False
+
75 finally:
+
76 self.request.close()
+
77 del self.server.clientsConnected[threading.current_thread().name]
+
78 logging.info("Client disconnected: %s", self.client_address[0])
+
79
+
80
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.js b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.js new file mode 100644 index 0000000..17d5716 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.js @@ -0,0 +1,4 @@ +var classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler = +[ + [ "handle", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html#acb4cb23886abc3c2b3be70ed3127c3b0", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html new file mode 100644 index 0000000..7146507 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html @@ -0,0 +1,124 @@ + + + + + + + +BOSWatch 3: boswatch.network.server._ThreadedTCPServer Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
boswatch.network.server._ThreadedTCPServer Class Reference
+
+
+ +

ThreadedTCPServer class for our TCPServer class. + More...

+

Detailed Description

+

ThreadedTCPServer class for our TCPServer class.

+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.html b/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.html new file mode 100644 index 0000000..bfa13ac --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.html @@ -0,0 +1,605 @@ + + + + + + + +BOSWatch 3: boswatch.network.server.TCPServer Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.server.TCPServer Class Reference
+
+
+ +

TCP server class. + More...

+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, alarmQueue, timeout=3)
 Create a new instance.
 
 __del__ (self)
 
 start (self, port=8080)
 Start a threaded TCP socket server.
 
 stop (self)
 Stops the TCP socket server.
 
 countClientsConnected (self)
 Number of currently connected Clients.
 
 getClientsConnected (self)
 A list of all connected clients with their IP address and last seen timestamp _clients[ThreadName] = {"address", "timestamp"}.
 
 isRunning (self)
 Property of server running state.
 
+ + + + + + + +

+Data Fields

 isRunning = False
 
bool isRunning = True
 
str _server_thread = "Thread-BWServer"
 
+ + + + + + + + + + + + + +

+Protected Attributes

 _server = None
 
 _server_thread = None
 
 _timeout = timeout
 
 _alarmQueue = alarmQueue
 
# because our list is not threadsafe _clientsConnectedLock = threading.Lock()
 
dict _clientsConnected = {}
 
+

Detailed Description

+

TCP server class.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.network.server.TCPServer.__init__ ( self,
alarmQueue,
timeout = 3 )
+
+ +

Create a new instance.

+
Parameters
+ + + +
alarmQueuepython queue instance
timeoutserver timeout in sec (3)
+
+
+
89 def __init__(self, alarmQueue, timeout=3):
+
90 r"""!Create a new instance
+
91
+
92 @param alarmQueue: python queue instance
+
93 @param timeout: server timeout in sec (3)
+
94 """
+
95 self._server = None
+
96 self._server_thread = None
+
97 self._timeout = timeout
+
98 self._alarmQueue = alarmQueue
+
99
+
100 self._clientsConnectedLock = threading.Lock()
+
101 self._clientsConnected = {}
+
102
+
+
+
+ +

◆ __del__()

+ +
+
+ + + + + + + +
boswatch.network.server.TCPServer.__del__ ( self)
+
+
103 def __del__(self):
+
104 if self.isRunning:
+
105 self.stop()
+
106
+
+
+
+

Member Function Documentation

+ +

◆ start()

+ +
+
+ + + + + + + + + + + +
boswatch.network.server.TCPServer.start ( self,
port = 8080 )
+
+ +

Start a threaded TCP socket server.

+

Start a TCP Socket Server in a new thread that will then start one more thread for each client request. The ip address for binding the server socket is always 'localhost'

+
Parameters
+ + +
portServer Port (8080)
+
+
+
Returns
True or False
+
107 def start(self, port=8080):
+
108 r"""!Start a threaded TCP socket server
+
109
+
110 Start a TCP Socket Server in a new thread that will
+
111 then start one more thread for each client request.
+
112 The ip address for binding the server socket is always 'localhost'
+
113
+
114 @param port: Server Port (8080)
+
115
+
116 @return True or False"""
+
117 if not self.isRunning:
+
118 try:
+
119 socketserver.TCPServer.allow_reuse_address = True # because we can start two instances on same port elsewhere
+
120 self._server = _ThreadedTCPServer(("", port), _ThreadedTCPRequestHandler)
+
121 self._server.timeout = self._timeout
+
122 self._server.alarmQueue = self._alarmQueue
+
123 self._server.isActive = True
+
124
+
125 self._server.clientsConnectedLock = self._clientsConnectedLock
+
126 self._server.clientsConnected = self._clientsConnected
+
127
+
128 self._server_thread = threading.Thread(target=self._server.serve_forever)
+
129 self._server_thread.name = "Thread-BWServer"
+
130 self._server_thread.daemon = True
+
131 self._server_thread.start()
+
132 logging.debug("TCPServer started in Thread: %s", self._server_thread.name)
+
133 return True
+
134 except socket.error as e:
+
135 logging.error(e)
+
136 return False
+
137 else:
+
138 logging.warning("server always started")
+
139 return True
+
140
+
+
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
boswatch.network.server.TCPServer.stop ( self)
+
+ +

Stops the TCP socket server.

+
Returns
True or False
+
141 def stop(self):
+
142 r"""!Stops the TCP socket server
+
143
+
144 @return True or False"""
+
145 if self.isRunning:
+
146 self._server.shutdown()
+
147 self._server.isActive = False
+
148 self._server.server_close()
+
149 self._server_thread.join()
+
150 self._server_thread = None
+
151 self._server = None
+
152 logging.debug("TCPServer stopped")
+
153 return True
+
154 logging.warning("server always stopped")
+
155 return True
+
156
+
+
+
+ +

◆ countClientsConnected()

+ +
+
+ + + + + + + +
boswatch.network.server.TCPServer.countClientsConnected ( self)
+
+ +

Number of currently connected Clients.

+
Returns
Connected clients
+
157 def countClientsConnected(self):
+
158 r"""!Number of currently connected Clients
+
159
+
160 @return Connected clients"""
+
161 with self._clientsConnectedLock: # because our list is not threadsafe
+
162 return len(self._clientsConnected)
+
163
+
+
+
+ +

◆ getClientsConnected()

+ +
+
+ + + + + + + +
boswatch.network.server.TCPServer.getClientsConnected ( self)
+
+ +

A list of all connected clients with their IP address and last seen timestamp _clients[ThreadName] = {"address", "timestamp"}.

+
Returns
List of onnected clients
+
164 def getClientsConnected(self):
+
165 r"""!A list of all connected clients
+
166 with their IP address and last seen timestamp
+
167 _clients[ThreadName] = {"address", "timestamp"}
+
168
+
169 @return List of onnected clients"""
+
170 # todo return full list or write a print/debug method?
+
171 with self._clientsConnectedLock: # because our list is not threadsafe
+
172 return self._clientsConnected
+
173
+
+
+
+ +

◆ isRunning()

+ +
+
+ + + + + + + +
boswatch.network.server.TCPServer.isRunning ( self)
+
+ +

Property of server running state.

+
175 def isRunning(self):
+
176 r"""!Property of server running state"""
+
177 if self._server:
+
178 return True
+
179 return False
+
+
+
+

Field Documentation

+ +

◆ _server

+ +
+
+ + + + + +
+ + + + +
boswatch.network.server.TCPServer._server = None
+
+protected
+
+ +
+
+ +

◆ _server_thread [1/2]

+ +
+
+ + + + + +
+ + + + +
boswatch.network.server.TCPServer._server_thread = None
+
+protected
+
+ +
+
+ +

◆ _timeout

+ +
+
+ + + + + +
+ + + + +
boswatch.network.server.TCPServer._timeout = timeout
+
+protected
+
+ +
+
+ +

◆ _alarmQueue

+ +
+
+ + + + + +
+ + + + +
boswatch.network.server.TCPServer._alarmQueue = alarmQueue
+
+protected
+
+ +
+
+ +

◆ _clientsConnectedLock

+ +
+
+ + + + + +
+ + + + +
# because our list is not threadsafe boswatch.network.server.TCPServer._clientsConnectedLock = threading.Lock()
+
+protected
+
+ +
+
+ +

◆ _clientsConnected

+ +
+
+ + + + + +
+ + + + +
boswatch.network.server.TCPServer._clientsConnected = {}
+
+protected
+
+ +
+
+ +

◆ isRunning [1/2]

+ +
+
+ + + + +
bool boswatch.network.server.TCPServer.isRunning = False
+
+ +
+
+ +

◆ isRunning [2/2]

+ +
+
+ + + + +
bool boswatch.network.server.TCPServer.isRunning = True
+
+ +
+
+ +

◆ _server_thread [2/2]

+ +
+
+ + + + +
str boswatch.network.server.TCPServer._server_thread = "Thread-BWServer"
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.js b/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.js new file mode 100644 index 0000000..22e5899 --- /dev/null +++ b/api/html/classboswatch_1_1network_1_1server_1_1_t_c_p_server.js @@ -0,0 +1,19 @@ +var classboswatch_1_1network_1_1server_1_1_t_c_p_server = +[ + [ "__init__", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aa7bde82a0490275757eb62cf2245ece8", null ], + [ "__del__", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a7bd8bbf36dc9e947fd6889b64e66bf79", null ], + [ "start", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aef3b308e2d4d28406bdb31be97460e60", null ], + [ "stop", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#adcb3af039525e3fd4465f661e985eba1", null ], + [ "countClientsConnected", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a96ddddf0a3fbac223d04ef68de9b35cd", null ], + [ "getClientsConnected", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ace26dcf01e7072e302d25751cfd35999", null ], + [ "isRunning", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aeba7db2323e57b57d17c05ab9f448370", null ], + [ "_server", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a196dd011e76b9ffa269b1d7ae945317f", null ], + [ "_server_thread", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a069063419170444e452c49d4d3226d42", null ], + [ "_timeout", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a34210569d9aeb0f83e23fda9ac6501c1", null ], + [ "_alarmQueue", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a3126636b3ebc15906a02433a9f921cdd", null ], + [ "_clientsConnectedLock", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ad7d5a3318dd17eb81d4145b364354b9b", null ], + [ "_clientsConnected", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ad384e027f90c85bd533081c5df69c143", null ], + [ "isRunning", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ab0b936931fdf4ccc43aa17b78732b207", null ], + [ "isRunning", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ab0b936931fdf4ccc43aa17b78732b207", null ], + [ "_server_thread", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a502b42c4e702a1ef1440d7d156ea4493", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1packet_1_1_packet.html b/api/html/classboswatch_1_1packet_1_1_packet.html new file mode 100644 index 0000000..ef852dd --- /dev/null +++ b/api/html/classboswatch_1_1packet_1_1_packet.html @@ -0,0 +1,350 @@ + + + + + + + +BOSWatch 3: boswatch.packet.Packet Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.packet.Packet Class Reference
+
+
+ +

Class implementation of an BOSWatch packet. + More...

+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, bwPacket=None)
 Build a new BOSWatch packet or copy existing data in it.
 
 __str__ (self)
 Return the intern _packet dict as string.
 
 set (self, fieldName, value)
 Set a field in the intern _packet dict.
 
 get (self, fieldName)
 Returns the value from a single field.
 
 printInfo (self)
 Print a info message to the log on INFO level.
 
+ + + +

+Protected Attributes

dict _packet = {"timestamp": time.time()}
 
+

Detailed Description

+

Class implementation of an BOSWatch packet.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
boswatch.packet.Packet.__init__ ( self,
bwPacket = None )
+
+ +

Build a new BOSWatch packet or copy existing data in it.

+
Parameters
+ + +
bwPacketExisting data to copy
+
+
+
26 def __init__(self, bwPacket=None):
+
27 r"""!Build a new BOSWatch packet or copy existing data in it
+
28
+
29 @param bwPacket: Existing data to copy"""
+
30 if bwPacket is None:
+
31 logging.debug("create new bwPacket")
+
32 self._packet = {"timestamp": time.time()}
+
33 else:
+
34 logging.debug("create bwPacket from string")
+
35 self._packet = eval(str(bwPacket.strip()))
+
36
+
+
+
+

Member Function Documentation

+ +

◆ __str__()

+ +
+
+ + + + + + + +
boswatch.packet.Packet.__str__ ( self)
+
+ +

Return the intern _packet dict as string.

+
37 def __str__(self):
+
38 r"""!Return the intern _packet dict as string"""
+
39 return str(self._packet)
+
40
+
+
+
+ +

◆ set()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.packet.Packet.set ( self,
fieldName,
value )
+
+ +

Set a field in the intern _packet dict.

+
Parameters
+ + + +
fieldNameName of the data to set
valueValue to set
+
+
+
41 def set(self, fieldName, value):
+
42 r"""!Set a field in the intern _packet dict
+
43
+
44 @param fieldName: Name of the data to set
+
45 @param value: Value to set"""
+
46 self._packet[fieldName] = str(value)
+
47
+
+
+
+ +

◆ get()

+ +
+
+ + + + + + + + + + + +
boswatch.packet.Packet.get ( self,
fieldName )
+
+ +

Returns the value from a single field.

+

If field not existing None is returned

+
Parameters
+ + +
fieldNameName of the field
+
+
+
Returns
Value or None
+
48 def get(self, fieldName):
+
49 r"""!Returns the value from a single field.
+
50 If field not existing `None` is returned
+
51
+
52 @param fieldName: Name of the field
+
53 @return Value or None"""
+
54 try:
+
55 return str(self._packet[fieldName])
+
56 except:
+
57 logging.warning("field not found: %s", fieldName)
+
58 return None
+
59
+
+
+
+ +

◆ printInfo()

+ +
+
+ + + + + + + +
boswatch.packet.Packet.printInfo ( self)
+
+ +

Print a info message to the log on INFO level.

+

Contains the most useful info about this packet.

Todo
not complete yet - must be edit to print nice formatted messages on console
+
60 def printInfo(self):
+
61 r"""!Print a info message to the log on INFO level.
+
62 Contains the most useful info about this packet.
+
63 @todo not complete yet - must be edit to print nice formatted messages on console
+
64 """
+
65 logging.info("[%s]", self.get("mode"))
+
+
+
+

Field Documentation

+ +

◆ _packet

+ +
+
+ + + + + +
+ + + + +
boswatch.packet.Packet._packet = {"timestamp": time.time()}
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1packet_1_1_packet.js b/api/html/classboswatch_1_1packet_1_1_packet.js new file mode 100644 index 0000000..e324bb8 --- /dev/null +++ b/api/html/classboswatch_1_1packet_1_1_packet.js @@ -0,0 +1,9 @@ +var classboswatch_1_1packet_1_1_packet = +[ + [ "__init__", "classboswatch_1_1packet_1_1_packet.html#a33f9ad91a87a012e192cd2ef629b536e", null ], + [ "__str__", "classboswatch_1_1packet_1_1_packet.html#aaa72c4726ad47f994e915ad397b89186", null ], + [ "set", "classboswatch_1_1packet_1_1_packet.html#ae2562639ea14f5e92fbe5048af72a2f9", null ], + [ "get", "classboswatch_1_1packet_1_1_packet.html#a58fbb3a8a2080ea38a49bb5bead48a44", null ], + [ "printInfo", "classboswatch_1_1packet_1_1_packet.html#a01a4bf1fb3af1e72d5a2da96d296e832", null ], + [ "_packet", "classboswatch_1_1packet_1_1_packet.html#a3fb27af3d9f25714b715ac313798cbb2", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1process_manager_1_1_process_manager.html b/api/html/classboswatch_1_1process_manager_1_1_process_manager.html new file mode 100644 index 0000000..2cd4bcc --- /dev/null +++ b/api/html/classboswatch_1_1process_manager_1_1_process_manager.html @@ -0,0 +1,780 @@ + + + + + + + +BOSWatch 3: boswatch.processManager.ProcessManager Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.processManager.ProcessManager Class Reference
+
+
+ +

class to manage a extern sub process + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, process, textMode=False)
 
 addArgument (self, arg)
 add a new argument
 
 clearArguments (self)
 clear all arguments
 
 start (self)
 start the new process
 
 stop (self)
 Stop the process by sending SIGTERM and wait for ending.
 
 readline (self)
 Read one line from stdout stream.
 
 skipLines (self, lineCount=1)
 Skip given number of lines from the output.
 
 skipLinesUntil (self, matchText)
 Skip lines from the output until the given string is in it.
 
 setStdin (self, stdin)
 Set the stdin stream instance.
 
 setStdout (self, stdout)
 Set the stdout stream instance.
 
 setStderr (self, stderr)
 Set the stderr stream instance.
 
 stdout (self)
 Property to get the stdout stream.
 
 stderr (self)
 Property to get the stderr stream.
 
 isRunning (self)
 Property to get process running state.
 
+ + + +

+Data Fields

 isRunning
 
+ + + + + + + + + + + + + +

+Protected Attributes

list _args = []
 
 _stdin = None
 
 _stdout = subprocess.PIPE
 
 _stderr = subprocess.STDOUT
 
 _processHandle = None
 
 _textMode = textMode
 
+

Detailed Description

+

class to manage a extern sub process

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.processManager.ProcessManager.__init__ ( self,
process,
textMode = False )
+
+
25 def __init__(self, process, textMode=False):
+
26 logging.debug("create process instance %s - textMode: %s", process, textMode)
+
27 self._args = []
+
28 self._args.append(process)
+
29 self._stdin = None
+
30 self._stdout = subprocess.PIPE
+
31 self._stderr = subprocess.STDOUT
+
32 self._processHandle = None
+
33 self._textMode = textMode
+
34
+
+
+
+

Member Function Documentation

+ +

◆ addArgument()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.addArgument ( self,
arg )
+
+ +

add a new argument

+
Parameters
+ + +
argargument to add as string
+
+
+
35 def addArgument(self, arg):
+
36 r"""!add a new argument
+
37
+
38 @param arg: argument to add as string"""
+
39 logging.debug("add argument to process: %s -> %s", self._args[0], arg)
+
40 for splitArg in arg.split():
+
41 self._args.append(splitArg)
+
42
+
+
+
+ +

◆ clearArguments()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.clearArguments ( self)
+
+ +

clear all arguments

+
43 def clearArguments(self):
+
44 r"""!clear all arguments"""
+
45 self._args = self._args[0:1] # kept first element (process name)
+
46
+
+
+
+ +

◆ start()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.start ( self)
+
+ +

start the new process

+
Returns
: True or False
+
47 def start(self):
+
48 r"""!start the new process
+
49
+
50 @return: True or False"""
+
51 logging.debug("start new process: %s %s", self._args[0], self._args[1:])
+
52 try:
+
53 self._processHandle = subprocess.Popen(self._args,
+
54 stdin=self._stdin,
+
55 stdout=self._stdout,
+
56 stderr=self._stderr,
+
57 universal_newlines=self._textMode,
+
58 shell=False)
+
59 if not self.isRunning:
+
60 logging.error("cannot start process")
+
61 return False
+
62 logging.debug("process started with PID %d", self._processHandle.pid)
+
63 return True
+
64
+
65 except FileNotFoundError:
+
66 logging.error("File not found: %s", self._args[0])
+
67 return False
+
68
+
+
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.stop ( self)
+
+ +

Stop the process by sending SIGTERM and wait for ending.

+
69 def stop(self):
+
70 r"""!Stop the process by sending SIGTERM and wait for ending"""
+
71 logging.debug("stopping process: %s", self._args[0])
+
72 if self.isRunning:
+
73 self._processHandle.terminate()
+
74 while self.isRunning:
+
75 pass
+
76 logging.debug("process %s returned %d", self._args[0], self._processHandle.returncode)
+
77
+
+
+
+ +

◆ readline()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.readline ( self)
+
+ +

Read one line from stdout stream.

+
Returns
singe line or None
+
78 def readline(self):
+
79 r"""!Read one line from stdout stream
+
80
+
81 @return singe line or None"""
+
82 if self.isRunning and self._stdout is not None:
+
83 try:
+
84 line = self._processHandle.stdout.readline().strip()
+
85 except UnicodeDecodeError:
+
86 return None
+
87 return line
+
88 return None
+
89
+
+
+
+ +

◆ skipLines()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.skipLines ( self,
lineCount = 1 )
+
+ +

Skip given number of lines from the output.

+
Parameters
+ + +
lineCountnumber of lines to skip
+
+
+
90 def skipLines(self, lineCount=1):
+
91 r"""!Skip given number of lines from the output
+
92
+
93 @param lineCount: number of lines to skip
+
94 """
+
95 logging.debug("skip %d lines from output", lineCount)
+
96 while self.isRunning and lineCount:
+
97 self.readline()
+
98 lineCount -= 1
+
99
+
+
+
+ +

◆ skipLinesUntil()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.skipLinesUntil ( self,
matchText )
+
+ +

Skip lines from the output until the given string is in it.

+
Parameters
+ + +
matchTextstring to search for in output
+
+
+
100 def skipLinesUntil(self, matchText):
+
101 r"""!Skip lines from the output until the given string is in it
+
102
+
103 @param matchText: string to search for in output
+
104 """
+
105 logging.debug("skip lines till '%s' from output", matchText)
+
106 if not self._textMode:
+
107 matchText = bytes(matchText, "utf-8")
+
108 while self.isRunning and matchText not in self.readline():
+
109 pass
+
110
+
+
+
+ +

◆ setStdin()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.setStdin ( self,
stdin )
+
+ +

Set the stdin stream instance.

+
111 def setStdin(self, stdin):
+
112 r"""!Set the stdin stream instance"""
+
113 self._stdin = stdin
+
114
+
+
+
+ +

◆ setStdout()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.setStdout ( self,
stdout )
+
+ +

Set the stdout stream instance.

+
115 def setStdout(self, stdout):
+
116 r"""!Set the stdout stream instance"""
+
117 self._stdout = stdout
+
118
+
+
+
+ +

◆ setStderr()

+ +
+
+ + + + + + + + + + + +
boswatch.processManager.ProcessManager.setStderr ( self,
stderr )
+
+ +

Set the stderr stream instance.

+
119 def setStderr(self, stderr):
+
120 r"""!Set the stderr stream instance"""
+
121 self._stderr = stderr
+
122
+
+
+
+ +

◆ stdout()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.stdout ( self)
+
+ +

Property to get the stdout stream.

+
124 def stdout(self):
+
125 r"""!Property to get the stdout stream"""
+
126 return self._processHandle.stdout
+
127
+
+
+
+ +

◆ stderr()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.stderr ( self)
+
+ +

Property to get the stderr stream.

+
129 def stderr(self):
+
130 r"""!Property to get the stderr stream"""
+
131 return self._processHandle.stderr
+
132
+
+
+
+ +

◆ isRunning()

+ +
+
+ + + + + + + +
boswatch.processManager.ProcessManager.isRunning ( self)
+
+ +

Property to get process running state.

+
Returns
True or False
+
134 def isRunning(self):
+
135 r"""!Property to get process running state
+
136
+
137 @return True or False"""
+
138 if self._processHandle:
+
139 if self._processHandle.poll() is None:
+
140 return True
+
141 return False
+
+
+
+

Field Documentation

+ +

◆ _args

+ +
+
+ + + + + +
+ + + + +
list boswatch.processManager.ProcessManager._args = []
+
+protected
+
+ +
+
+ +

◆ _stdin

+ +
+
+ + + + + +
+ + + + +
boswatch.processManager.ProcessManager._stdin = None
+
+protected
+
+ +
+
+ +

◆ _stdout

+ +
+
+ + + + + +
+ + + + +
boswatch.processManager.ProcessManager._stdout = subprocess.PIPE
+
+protected
+
+ +
+
+ +

◆ _stderr

+ +
+
+ + + + + +
+ + + + +
boswatch.processManager.ProcessManager._stderr = subprocess.STDOUT
+
+protected
+
+ +
+
+ +

◆ _processHandle

+ +
+
+ + + + + +
+ + + + +
boswatch.processManager.ProcessManager._processHandle = None
+
+protected
+
+ +
+
+ +

◆ _textMode

+ +
+
+ + + + + +
+ + + + +
boswatch.processManager.ProcessManager._textMode = textMode
+
+protected
+
+ +
+
+ +

◆ isRunning

+ +
+
+ + + + +
boswatch.processManager.ProcessManager.isRunning
+
+Initial value:
= subprocess.Popen(self._args,
+
stdin=self._stdin,
+
stdout=self._stdout,
+
stderr=self._stderr,
+
universal_newlines=self._textMode,
+
shell=False)
+
+
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1process_manager_1_1_process_manager.js b/api/html/classboswatch_1_1process_manager_1_1_process_manager.js new file mode 100644 index 0000000..7cb4510 --- /dev/null +++ b/api/html/classboswatch_1_1process_manager_1_1_process_manager.js @@ -0,0 +1,24 @@ +var classboswatch_1_1process_manager_1_1_process_manager = +[ + [ "__init__", "classboswatch_1_1process_manager_1_1_process_manager.html#a932e0d5d67cca47b4e5fc73a25082408", null ], + [ "addArgument", "classboswatch_1_1process_manager_1_1_process_manager.html#a83b9d7d3aa926c0cdbe86d4a36873c50", null ], + [ "clearArguments", "classboswatch_1_1process_manager_1_1_process_manager.html#aafaebfc0b133edfad339910f92d941de", null ], + [ "start", "classboswatch_1_1process_manager_1_1_process_manager.html#a9dddc0c204be55e4391557f2cb1616bf", null ], + [ "stop", "classboswatch_1_1process_manager_1_1_process_manager.html#a9f0eb14407cf78ab7010bf247c8d6115", null ], + [ "readline", "classboswatch_1_1process_manager_1_1_process_manager.html#a80143d4751ce9b1cc8a164cd56c8dbca", null ], + [ "skipLines", "classboswatch_1_1process_manager_1_1_process_manager.html#ac86f2638f1239a188692006699471f1f", null ], + [ "skipLinesUntil", "classboswatch_1_1process_manager_1_1_process_manager.html#af2886ee808fe04cebd36bc72ad8616c3", null ], + [ "setStdin", "classboswatch_1_1process_manager_1_1_process_manager.html#a3872072d62e14aec84d190d5a31626e9", null ], + [ "setStdout", "classboswatch_1_1process_manager_1_1_process_manager.html#a8b34c7836cc8947e174d0e0cc84b4cd3", null ], + [ "setStderr", "classboswatch_1_1process_manager_1_1_process_manager.html#a3abb0b2b54f126e46774a0f33fc2980c", null ], + [ "stdout", "classboswatch_1_1process_manager_1_1_process_manager.html#a68468dd0235a3b0725d70852670e9ac4", null ], + [ "stderr", "classboswatch_1_1process_manager_1_1_process_manager.html#a401b316004c76dea8175e7a879f649d4", null ], + [ "isRunning", "classboswatch_1_1process_manager_1_1_process_manager.html#a31152ee52782cf204c84cb557591f4b8", null ], + [ "_args", "classboswatch_1_1process_manager_1_1_process_manager.html#a115b1f84ab38b22275d409a63257c2e9", null ], + [ "_stdin", "classboswatch_1_1process_manager_1_1_process_manager.html#a6d4df5612ac7d822144b8198299588f8", null ], + [ "_stdout", "classboswatch_1_1process_manager_1_1_process_manager.html#a593dfb43e5f701227e166ceb0dc1d930", null ], + [ "_stderr", "classboswatch_1_1process_manager_1_1_process_manager.html#abb6bac128e56b2167fdf56f5bd3cea2e", null ], + [ "_processHandle", "classboswatch_1_1process_manager_1_1_process_manager.html#aee5993f601ba3472c92bb06a0b278663", null ], + [ "_textMode", "classboswatch_1_1process_manager_1_1_process_manager.html#a2c5d6361b9973cc43ed452056bda080b", null ], + [ "isRunning", "classboswatch_1_1process_manager_1_1_process_manager.html#a67863ea2b20617af7d4b54691e75cded", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1router_1_1route_1_1_route.html b/api/html/classboswatch_1_1router_1_1route_1_1_route.html new file mode 100644 index 0000000..1d3efcd --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1route_1_1_route.html @@ -0,0 +1,262 @@ + + + + + + + +BOSWatch 3: boswatch.router.route.Route Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.route.Route Class Reference
+
+
+ +

Class for single routing points. + More...

+ + + + + +

+Public Member Functions

 __init__ (self, name, callback, statsCallback=None, cleanupCallback=None)
 Create a instance of an route point.
 
+ + + + + + + + + +

+Data Fields

 name = name
 
 callback = callback
 
 statistics = statsCallback
 
 cleanup = cleanupCallback
 
+

Detailed Description

+

Class for single routing points.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
boswatch.router.route.Route.__init__ ( self,
name,
callback,
statsCallback = None,
cleanupCallback = None )
+
+ +

Create a instance of an route point.

+
Parameters
+ + + + + +
namename of the route point
callbackinstance of the callback function
statsCallbackinstance of the callback to get statistics (None)
cleanupCallbackinstance of the callback to run a cleanup method (None)
+
+
+
25 def __init__(self, name, callback, statsCallback=None, cleanupCallback=None):
+
26 r"""!Create a instance of an route point
+
27
+
28 @param name: name of the route point
+
29 @param callback: instance of the callback function
+
30 @param statsCallback: instance of the callback to get statistics (None)
+
31 @param cleanupCallback: instance of the callback to run a cleanup method (None)
+
32 """
+
33 self.name = name
+
34 self.callback = callback
+
35 self.statistics = statsCallback
+
36 self.cleanup = cleanupCallback
+
+
+
+

Field Documentation

+ +

◆ name

+ +
+
+ + + + +
boswatch.router.route.Route.name = name
+
+ +
+
+ +

◆ callback

+ +
+
+ + + + +
boswatch.router.route.Route.callback = callback
+
+ +
+
+ +

◆ statistics

+ +
+
+ + + + +
boswatch.router.route.Route.statistics = statsCallback
+
+ +
+
+ +

◆ cleanup

+ +
+
+ + + + +
boswatch.router.route.Route.cleanup = cleanupCallback
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1router_1_1route_1_1_route.js b/api/html/classboswatch_1_1router_1_1route_1_1_route.js new file mode 100644 index 0000000..f6e05a0 --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1route_1_1_route.js @@ -0,0 +1,8 @@ +var classboswatch_1_1router_1_1route_1_1_route = +[ + [ "__init__", "classboswatch_1_1router_1_1route_1_1_route.html#a15d3829220d3bd9ba38fc95d562227e0", null ], + [ "name", "classboswatch_1_1router_1_1route_1_1_route.html#a63208097fc8bfd4ae4395f238b24f6ec", null ], + [ "callback", "classboswatch_1_1router_1_1route_1_1_route.html#a5854d6578e8f94a4e47d9b63e54bfda9", null ], + [ "statistics", "classboswatch_1_1router_1_1route_1_1_route.html#a0576a975ab706dd9bb5cfca8c2ce6e05", null ], + [ "cleanup", "classboswatch_1_1router_1_1route_1_1_route.html#acf9db2e5e2d24b93eb6bcf0a403c3914", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1router_1_1router_1_1_router.html b/api/html/classboswatch_1_1router_1_1router_1_1_router.html new file mode 100644 index 0000000..d470481 --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1router_1_1_router.html @@ -0,0 +1,441 @@ + + + + + + + +BOSWatch 3: boswatch.router.router.Router Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.router.Router Class Reference
+
+
+ +

Class for the Router. + More...

+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, name)
 Create a new router.
 
 addRoute (self, route)
 Adds a route point to the router.
 
 runRouter (self, bwPacket)
 Run the router.
 
+ + + + + +

+Data Fields

 name = name
 
list routeList = []
 
+ + + + +

+Protected Member Functions

 _getStatistics (self)
 Returns statistical information's from last router run.
 
+ + + + + + + +

+Protected Attributes

int _cumTime = 0
 
int _routerTime = 0
 
int _runCount = 0
 
+

Detailed Description

+

Class for the Router.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
boswatch.router.router.Router.__init__ ( self,
name )
+
+ +

Create a new router.

+
Parameters
+ + +
namename of the router
+
+
+
26 def __init__(self, name):
+
27 r"""!Create a new router
+
28
+
29 @param name: name of the router"""
+
30 self.name = name
+
31 self.routeList = []
+
32
+
33 # for time counting
+
34 self._cumTime = 0
+
35 self._routerTime = 0
+
36
+
37 # for statistics
+
38 self._runCount = 0
+
39
+
40 logging.debug("[%s] add new router", self.name)
+
41
+
+
+
+

Member Function Documentation

+ +

◆ addRoute()

+ +
+
+ + + + + + + + + + + +
boswatch.router.router.Router.addRoute ( self,
route )
+
+ +

Adds a route point to the router.

+
Parameters
+ + +
routeinstance of the Route class
+
+
+
42 def addRoute(self, route):
+
43 r"""!Adds a route point to the router
+
44
+
45 @param route: instance of the Route class
+
46 """
+
47 logging.debug("[%s] add route: %s", self.name, route.name)
+
48 self.routeList.append(route)
+
49
+
+
+
+ +

◆ runRouter()

+ +
+
+ + + + + + + + + + + +
boswatch.router.router.Router.runRouter ( self,
bwPacket )
+
+ +

Run the router.

+
Parameters
+ + +
bwPacketinstance of Packet class
+
+
+
Returns
a instance of Packet class
+
50 def runRouter(self, bwPacket):
+
51 r"""!Run the router
+
52
+
53 @param bwPacket: instance of Packet class
+
54 @return a instance of Packet class
+
55 """
+
56 self._runCount += 1
+
57 tmpTime = time.time()
+
58
+
59 logging.debug("[%s] started", self.name)
+
60
+
61 for routeObject in self.routeList:
+
62 logging.debug("[%s] -> run route: %s", self.name, routeObject.name)
+
63 bwPacket_tmp = routeObject.callback(copy.deepcopy(bwPacket)) # copy bwPacket to prevent edit the original
+
64
+
65 if bwPacket_tmp is None: # returning None doesnt change the bwPacket
+
66 continue
+
67
+
68 if bwPacket_tmp is False: # returning False stops the router immediately
+
69 logging.debug("[%s] stopped", self.name)
+
70 break
+
71
+
72 bwPacket = bwPacket_tmp
+
73 logging.debug("[%s] bwPacket returned", self.name)
+
74 logging.debug("[%s] finished", self.name)
+
75
+
76 self._routerTime = time.time() - tmpTime
+
77 self._cumTime += self._routerTime
+
78
+
79 return bwPacket
+
80
+
+
+
+ +

◆ _getStatistics()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.router.router.Router._getStatistics ( self)
+
+protected
+
+ +

Returns statistical information's from last router run.

+
Returns
Statistics as pyton dict
+
81 def _getStatistics(self):
+
82 r"""!Returns statistical information's from last router run
+
83
+
84 @return Statistics as pyton dict"""
+
85 stats = {"type": "router",
+
86 "runCount": self._runCount,
+
87 "cumTime": self._cumTime,
+
88 "moduleTime": self._routerTime}
+
89 return stats
+
+
+
+

Field Documentation

+ +

◆ name

+ +
+
+ + + + +
boswatch.router.router.Router.name = name
+
+ +
+
+ +

◆ routeList

+ +
+
+ + + + +
list boswatch.router.router.Router.routeList = []
+
+ +
+
+ +

◆ _cumTime

+ +
+
+ + + + + +
+ + + + +
int boswatch.router.router.Router._cumTime = 0
+
+protected
+
+ +
+
+ +

◆ _routerTime

+ +
+
+ + + + + +
+ + + + +
int boswatch.router.router.Router._routerTime = 0
+
+protected
+
+ +
+
+ +

◆ _runCount

+ +
+
+ + + + + +
+ + + + +
int boswatch.router.router.Router._runCount = 0
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1router_1_1router_1_1_router.js b/api/html/classboswatch_1_1router_1_1router_1_1_router.js new file mode 100644 index 0000000..b3e1d3a --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1router_1_1_router.js @@ -0,0 +1,12 @@ +var classboswatch_1_1router_1_1router_1_1_router = +[ + [ "__init__", "classboswatch_1_1router_1_1router_1_1_router.html#aa7c921ad0880824595d7fa05bcac6b08", null ], + [ "addRoute", "classboswatch_1_1router_1_1router_1_1_router.html#a561f89ef4e05555ea81cfa5da4551e0d", null ], + [ "runRouter", "classboswatch_1_1router_1_1router_1_1_router.html#a11fab65f0b4e7f2daff58fbd675d8347", null ], + [ "_getStatistics", "classboswatch_1_1router_1_1router_1_1_router.html#a4f0f891fcae507b7f47ec389194d912c", null ], + [ "name", "classboswatch_1_1router_1_1router_1_1_router.html#a90d717b6aece9f0a505a0b85eb4dacfa", null ], + [ "routeList", "classboswatch_1_1router_1_1router_1_1_router.html#a3ed6cf62a9a5f85205318ff39cb6db8a", null ], + [ "_cumTime", "classboswatch_1_1router_1_1router_1_1_router.html#a12a8f1e03f1ca7d9a10d5b59faf03e02", null ], + [ "_routerTime", "classboswatch_1_1router_1_1router_1_1_router.html#a06691105ddcd06e4f0fcd323a1b8a261", null ], + [ "_runCount", "classboswatch_1_1router_1_1router_1_1_router.html#abc663ec17904868934fa8682aa7859a9", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.html b/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.html new file mode 100644 index 0000000..02cbc49 --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.html @@ -0,0 +1,531 @@ + + + + + + + +BOSWatch 3: boswatch.router.routerManager.RouterManager Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.routerManager.RouterManager Class Reference
+
+
+ +

Class to manage all routers. + More...

+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 Create new router.
 
 buildRouters (self, config)
 Initialize Routers from given config file.
 
 runRouters (self, routerRunList, bwPacket)
 Run given Routers.
 
 cleanup (self)
 Run cleanup routines for all loaded route points.
 
+ + + + + +

+Data Fields

 config = None
 
bool _routerDict = False):
 
+ + + + + + + +

+Protected Member Functions

 _showRouterRoute (self)
 Show the routes of all routers.
 
 _saveStats (self)
 Save current statistics to file.
 
+ + + + + +

+Protected Attributes

dict _routerDict = {}
 
 _startTime = int(time.time())
 
+

Detailed Description

+

Class to manage all routers.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + +
boswatch.router.routerManager.RouterManager.__init__ ( self)
+
+ +

Create new router.

+
32 def __init__(self):
+
33 """!Create new router"""
+
34 self.config = None
+
35 self._routerDict = {}
+
36 self._startTime = int(time.time())
+
37
+
+
+
+

Member Function Documentation

+ +

◆ buildRouters()

+ +
+
+ + + + + + + + + + + +
boswatch.router.routerManager.RouterManager.buildRouters ( self,
config )
+
+ +

Initialize Routers from given config file.

+
Parameters
+ + +
configinstance of ConfigYaml class
+
+
+
Returns
True or False
+
39 def buildRouters(self, config):
+
40 r"""!Initialize Routers from given config file
+
41
+
42 @param config: instance of ConfigYaml class
+
43 @return True or False"""
+
44 self.config = config
+
45 self._routerDict = {} # all routers and instances of modules/plugins would be destroyed
+
46 routerDict_tmp = {}
+
47 logging.debug("build routers")
+
48
+
49 # first we have to init all routers
+
50 # because a router can be a valid target and we need his reference
+
51 for router in config.get("router"):
+
52 if router.get("name") is None or router.get("route") is None:
+
53 logging.error("name or route not found in router: %s", router)
+
54 return False
+
55 if router.get("name") in self._routerDict:
+
56 logging.error("duplicated router name: %s", router.get("name"))
+
57 return False
+
58 routerDict_tmp[router.get("name")] = Router(router.get("name"))
+
59
+
60 for router in config.get("router"):
+
61 routerName = router.get("name")
+
62
+
63 for route in router.get("route"):
+
64 routeType = route.get("type")
+
65 routeRes = route.get("res")
+
66 routeName = route.get("name", default=routeRes)
+
67
+
68 routeConfig = route.get("config", default=ConfigYAML()) # if no config - build a empty
+
69
+
70 if routeType is None or routeRes is None:
+
71 logging.error("type or name not found in route: %s", route)
+
72 return False
+
73
+
74 try:
+
75 if routeType == "plugin":
+
76 importedFile = importlib.import_module(routeType + "." + routeRes)
+
77 loadedClass = importedFile.BoswatchPlugin(routeConfig)
+
78 routerDict_tmp[routerName].addRoute(Route(routeName,
+
79 loadedClass._run,
+
80 loadedClass._getStatistics,
+
81 loadedClass._cleanup))
+
82
+
83 elif routeType == "module":
+
84 importedFile = importlib.import_module(routeType + "." + routeRes)
+
85 loadedClass = importedFile.BoswatchModule(routeConfig)
+
86 routerDict_tmp[routerName].addRoute(Route(routeName,
+
87 loadedClass._run,
+
88 loadedClass._getStatistics,
+
89 loadedClass._cleanup))
+
90
+
91 elif routeType == "router":
+
92 routerDict_tmp[routerName].addRoute(Route(routeName, routerDict_tmp[routeRes].runRouter))
+
93
+
94 else:
+
95 logging.error("unknown type '%s' in %s", routeType, route)
+
96 return False
+
97
+
98 except ModuleNotFoundError:
+
99 logging.exception("%s not found: %s", route.get("type"), route.get("res"))
+
100 return False
+
101
+
102 logging.debug("finished building routers")
+
103 self._routerDict = routerDict_tmp
+
104 self._showRouterRoute()
+
105 return True
+
106
+
+
+
+ +

◆ runRouters()

+ +
+
+ + + + + + + + + + + + + + + + +
boswatch.router.routerManager.RouterManager.runRouters ( self,
routerRunList,
bwPacket )
+
+ +

Run given Routers.

+
Parameters
+ + + +
routerRunListstring or list of router names in string form
bwPacketinstance of Packet class
+
+
+
107 def runRouters(self, routerRunList, bwPacket):
+
108 r"""!Run given Routers
+
109
+
110 @param routerRunList: string or list of router names in string form
+
111 @param bwPacket: instance of Packet class"""
+
112 if type(routerRunList) is str: # convert single string name to list
+
113 routerRunList = [routerRunList]
+
114
+
115 for routerName in routerRunList:
+
116 if routerName in self._routerDict:
+
117 self._routerDict[routerName].runRouter(bwPacket)
+
118 else:
+
119 logging.warning("unknown router: %s", routerName)
+
120
+
121 if self.config.get("server", "logging", default=False):
+
122 self._saveStats() # write stats to stats file
+
123
+
+
+
+ +

◆ cleanup()

+ +
+
+ + + + + + + +
boswatch.router.routerManager.RouterManager.cleanup ( self)
+
+ +

Run cleanup routines for all loaded route points.

+
124 def cleanup(self):
+
125 r"""!Run cleanup routines for all loaded route points"""
+
126 for name, routerObject in self._routerDict.items():
+
127 logging.debug("Start cleanup for %s", name)
+
128 for routePoint in routerObject.routeList:
+
129 if routePoint.cleanup:
+
130 routePoint.cleanup()
+
131
+
+
+
+ +

◆ _showRouterRoute()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.router.routerManager.RouterManager._showRouterRoute ( self)
+
+protected
+
+ +

Show the routes of all routers.

+
132 def _showRouterRoute(self):
+
133 r"""!Show the routes of all routers"""
+
134 for name, routerObject in self._routerDict.items():
+
135 logging.debug("Route for %s", name)
+
136 counter = 0
+
137 for routePoint in routerObject.routeList:
+
138 counter += 1
+
139 logging.debug(" %d. %s", counter, routePoint.name)
+
140
+
+
+
+ +

◆ _saveStats()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.router.routerManager.RouterManager._saveStats ( self)
+
+protected
+
+ +

Save current statistics to file.

+
141 def _saveStats(self):
+
142 r"""!Save current statistics to file"""
+
143 lines = []
+
144 for name, routerObject in self._routerDict.items():
+
145 lines.append("[" + name + "]")
+
146 lines.append(" - Route points: " + str(len(routerObject.routeList)))
+
147 lines.append(" - Runs: " + str(routerObject._getStatistics()['runCount']))
+
148 for routePoint in routerObject.routeList:
+
149 lines.append("[+] " + routePoint.name)
+
150 if routePoint.statistics:
+
151 if routePoint.statistics()['type'] == "module":
+
152 lines.append(" - Runs: " + str(routePoint.statistics()['runCount']))
+
153 lines.append(" - Run errors: " + str(routePoint.statistics()['moduleErrorCount']))
+
154 elif routePoint.statistics()['type'] == "plugin":
+
155 lines.append(" - Runs: " + str(routePoint.statistics()['runCount']))
+
156 lines.append(" - Setup errors: " + str(routePoint.statistics()['setupErrorCount']))
+
157 lines.append(" - Alarm errors: " + str(routePoint.statistics()['alarmErrorCount']))
+
158 lines.append(" - Teardown errors: " + str(routePoint.statistics()['teardownErrorCount']))
+
159 lines.append("")
+
160
+
161 with open("stats_" + str(self._startTime) + ".txt", "w") as stats:
+
162 for line in lines:
+
163 stats.write(line + "\n")
+
+
+
+

Field Documentation

+ +

◆ config

+ +
+
+ + + + +
boswatch.router.routerManager.RouterManager.config = None
+
+ +
+
+ +

◆ _routerDict [1/2]

+ +
+
+ + + + + +
+ + + + +
dict boswatch.router.routerManager.RouterManager._routerDict = {}
+
+protected
+
+ +
+
+ +

◆ _startTime

+ +
+
+ + + + + +
+ + + + +
boswatch.router.routerManager.RouterManager._startTime = int(time.time())
+
+protected
+
+ +
+
+ +

◆ _routerDict [2/2]

+ +
+
+ + + + +
bool boswatch.router.routerManager.RouterManager._routerDict = False):
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.js b/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.js new file mode 100644 index 0000000..ea2d80c --- /dev/null +++ b/api/html/classboswatch_1_1router_1_1router_manager_1_1_router_manager.js @@ -0,0 +1,13 @@ +var classboswatch_1_1router_1_1router_manager_1_1_router_manager = +[ + [ "__init__", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a0a84f95c300da38392422533d5782aaf", null ], + [ "buildRouters", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaff6ed2da859797e18f6c072d7904f87", null ], + [ "runRouters", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aa54e031529782bd0a7e907c8d7e8f0a9", null ], + [ "cleanup", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaf81a014d86abc76cdc0722d6f71b15e", null ], + [ "_showRouterRoute", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#ab546d0c2d93ff67032c7ce10be3604cd", null ], + [ "_saveStats", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a97f0f4b83877b3c0765e9387048c3429", null ], + [ "config", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a4e59d8e534b9be386eec05de3d2fe746", null ], + [ "_routerDict", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a847bf4d91a11bc22b44977c04f616e73", null ], + [ "_startTime", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a3da3dc3de144cf743f76862eca77e998", null ], + [ "_routerDict", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a8a1753d5725c13435417935a7f44a668", null ] +]; \ No newline at end of file diff --git a/api/html/classboswatch_1_1timer_1_1_repeated_timer.html b/api/html/classboswatch_1_1timer_1_1_repeated_timer.html new file mode 100644 index 0000000..4ec4a53 --- /dev/null +++ b/api/html/classboswatch_1_1timer_1_1_repeated_timer.html @@ -0,0 +1,646 @@ + + + + + + + +BOSWatch 3: boswatch.timer.RepeatedTimer Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.timer.RepeatedTimer Class Reference
+
+
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, interval, targetFunction, *args, **kwargs)
 Create a new instance of the RepeatedTimer.
 
 start (self)
 Start a new timer worker thread.
 
 stop (self)
 Stop the timer worker thread.
 
 isRunning (self)
 Property for repeatedTimer running state.
 
 restTime (self)
 Property to get remaining time till next call.
 
+ + + + + + + + + +

+Data Fields

int overdueCount = 0
 
int lostEvents = 0
 
str _thread = "RepTim(" + str(self._interval) + ")"
 
 restTime = time.time()
 
+ + + + +

+Protected Member Functions

 _target (self)
 Runs the target function with his arguments in own thread.
 
+ + + + + + + + + + + + + + + + + +

+Protected Attributes

 _interval = interval
 
 _function = targetFunction
 
 _args = args
 
 _kwargs = kwargs
 
int _start = 0
 
bool _isRunning = False
 
 _event = Event()
 
 _thread = None
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
boswatch.timer.RepeatedTimer.__init__ ( self,
interval,
targetFunction,
* args,
** kwargs )
+
+ +

Create a new instance of the RepeatedTimer.

+
Parameters
+ + + + + +
intervalinterval in sec. to recall target function
targetFunctionfunction to call on timer event
*argsarguments for the called function
*kwargskeyword arguments for the called function
+
+
+
26 def __init__(self, interval, targetFunction, *args, **kwargs):
+
27 r"""!Create a new instance of the RepeatedTimer
+
28
+
29 @param interval: interval in sec. to recall target function
+
30 @param targetFunction: function to call on timer event
+
31 @param *args: arguments for the called function
+
32 @param *kwargs: keyword arguments for the called function
+
33 """
+
34 self._interval = interval
+
35 self._function = targetFunction
+
36 self._args = args
+
37 self._kwargs = kwargs
+
38 self._start = 0
+
39 self.overdueCount = 0
+
40 self.lostEvents = 0
+
41 self._isRunning = False
+
42 self._event = Event()
+
43 self._thread = None
+
44
+
+
+
+

Member Function Documentation

+ +

◆ start()

+ +
+
+ + + + + + + +
boswatch.timer.RepeatedTimer.start ( self)
+
+ +

Start a new timer worker thread.

+
Returns
True or False
+
45 def start(self):
+
46 r"""!Start a new timer worker thread
+
47
+
48 @return True or False"""
+
49 if self._thread is None:
+
50 self._event.clear()
+
51 self._thread = Thread(target=self._target)
+
52 self._thread.name = "RepTim(" + str(self._interval) + ")"
+
53 self._thread.daemon = True # start as daemon (thread dies if main program ends)
+
54 self._thread.start()
+
55 logging.debug("start repeatedTimer: %s", self._thread.name)
+
56 return True
+
57 logging.debug("repeatedTimer always started")
+
58 return True
+
59
+
+
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
boswatch.timer.RepeatedTimer.stop ( self)
+
+ +

Stop the timer worker thread.

+
Returns
True or False
+
60 def stop(self):
+
61 r"""!Stop the timer worker thread
+
62
+
63 @return True or False"""
+
64 if self._thread is not None:
+
65 logging.debug("stop repeatedTimer: %s", self._thread.name)
+
66 self._event.set()
+
67 if self._thread is not None:
+
68 self._thread.join()
+
69 return True
+
70 logging.warning("repeatedTimer always stopped")
+
71 return True
+
72
+
+
+
+ +

◆ _target()

+ +
+
+ + + + + +
+ + + + + + + +
boswatch.timer.RepeatedTimer._target ( self)
+
+protected
+
+ +

Runs the target function with his arguments in own thread.

+
73 def _target(self):
+
74 r"""!Runs the target function with his arguments in own thread"""
+
75 self._start = time.time()
+
76 while not self._event.wait(self.restTime):
+
77 logging.debug("work")
+
78 startTime = time.time()
+
79
+
80 try:
+
81 self._function(*self._args, **self._kwargs)
+
82 except: # pragma: no cover
+
83 logging.exception("target throws an exception")
+
84
+
85 runTime = time.time() - startTime
+
86 if runTime < self._interval:
+
87 logging.debug("ready after: %0.3f sec. - next call in: %0.3f sec.", runTime, self.restTime)
+
88 else:
+
89 lostEvents = int(runTime / self._interval)
+
90 logging.warning("timer overdue! interval: %0.3f sec. - runtime: %0.3f sec. - "
+
91 "%d events lost - next call in: %0.3f sec.", self._interval, runTime, lostEvents, self.restTime)
+
92 self.lostEvents += lostEvents
+
93 self.overdueCount += 1
+
94 logging.debug("repeatedTimer thread stopped: %s", self._thread.name)
+
95 self._thread = None # set to none after leave teh thread (running recognize)
+
96
+
+
+
+ +

◆ isRunning()

+ +
+
+ + + + + + + +
boswatch.timer.RepeatedTimer.isRunning ( self)
+
+ +

Property for repeatedTimer running state.

+
98 def isRunning(self):
+
99 r"""!Property for repeatedTimer running state"""
+
100 if self._thread:
+
101 return True
+
102 return False
+
103
+
+
+
+ +

◆ restTime()

+ +
+
+ + + + + + + +
boswatch.timer.RepeatedTimer.restTime ( self)
+
+ +

Property to get remaining time till next call.

+
105 def restTime(self):
+
106 r"""!Property to get remaining time till next call"""
+
107 return self._interval - ((time.time() - self._start) % self._interval)
+
+
+
+

Field Documentation

+ +

◆ _interval

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._interval = interval
+
+protected
+
+ +
+
+ +

◆ _function

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._function = targetFunction
+
+protected
+
+ +
+
+ +

◆ _args

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._args = args
+
+protected
+
+ +
+
+ +

◆ _kwargs

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._kwargs = kwargs
+
+protected
+
+ +
+
+ +

◆ _start

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._start = 0
+
+protected
+
+ +
+
+ +

◆ overdueCount

+ +
+
+ + + + +
int boswatch.timer.RepeatedTimer.overdueCount = 0
+
+ +
+
+ +

◆ lostEvents

+ +
+
+ + + + +
int boswatch.timer.RepeatedTimer.lostEvents = 0
+
+ +
+
+ +

◆ _isRunning

+ +
+
+ + + + + +
+ + + + +
bool boswatch.timer.RepeatedTimer._isRunning = False
+
+protected
+
+ +
+
+ +

◆ _event

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._event = Event()
+
+protected
+
+ +
+
+ +

◆ _thread [1/2]

+ +
+
+ + + + + +
+ + + + +
boswatch.timer.RepeatedTimer._thread = None
+
+protected
+
+ +
+
+ +

◆ _thread [2/2]

+ +
+
+ + + + +
str boswatch.timer.RepeatedTimer._thread = "RepTim(" + str(self._interval) + ")"
+
+ +
+
+ +

◆ restTime

+ +
+
+ + + + +
boswatch.timer.RepeatedTimer.restTime = time.time()
+
+ +
+
+
+
+ + + + diff --git a/api/html/classboswatch_1_1timer_1_1_repeated_timer.js b/api/html/classboswatch_1_1timer_1_1_repeated_timer.js new file mode 100644 index 0000000..2f2c86f --- /dev/null +++ b/api/html/classboswatch_1_1timer_1_1_repeated_timer.js @@ -0,0 +1,21 @@ +var classboswatch_1_1timer_1_1_repeated_timer = +[ + [ "__init__", "classboswatch_1_1timer_1_1_repeated_timer.html#a6456136d21c1cfa45cea27f8e52a6d90", null ], + [ "start", "classboswatch_1_1timer_1_1_repeated_timer.html#a7ac6df54ac53ce43b550ea2fb7f593ba", null ], + [ "stop", "classboswatch_1_1timer_1_1_repeated_timer.html#a5f7c9e59eb302893ede382b3cf36fc6d", null ], + [ "_target", "classboswatch_1_1timer_1_1_repeated_timer.html#a0a8c3bc1726ae2a8f43a36a4f2f74165", null ], + [ "isRunning", "classboswatch_1_1timer_1_1_repeated_timer.html#a2f693bfc34ab3bff466d1af495ac6524", null ], + [ "restTime", "classboswatch_1_1timer_1_1_repeated_timer.html#afbe5f47ada6c6220e43b6bbec6318a51", null ], + [ "_interval", "classboswatch_1_1timer_1_1_repeated_timer.html#ad1430785a88382edf7f5577060e0d01a", null ], + [ "_function", "classboswatch_1_1timer_1_1_repeated_timer.html#a925a7f0f26df28aa88fb69ef192b1deb", null ], + [ "_args", "classboswatch_1_1timer_1_1_repeated_timer.html#a33f78dd48f368e8b2e423b94d8d4f7f0", null ], + [ "_kwargs", "classboswatch_1_1timer_1_1_repeated_timer.html#ae92aee50e2a2341581abec6a14c788da", null ], + [ "_start", "classboswatch_1_1timer_1_1_repeated_timer.html#a41ace1d4fc64ef5196eea937d5247c1b", null ], + [ "overdueCount", "classboswatch_1_1timer_1_1_repeated_timer.html#a840c33f251da10948ba1940f7edae806", null ], + [ "lostEvents", "classboswatch_1_1timer_1_1_repeated_timer.html#ab5cd56124ddbb4e05348624139ed2e75", null ], + [ "_isRunning", "classboswatch_1_1timer_1_1_repeated_timer.html#a7ae2d4c2a6d8f17307df85227f3b1085", null ], + [ "_event", "classboswatch_1_1timer_1_1_repeated_timer.html#ad0dde3339f157e43f191aafab23f03e5", null ], + [ "_thread", "classboswatch_1_1timer_1_1_repeated_timer.html#a3b492713fbe661683f886f23c0925212", null ], + [ "_thread", "classboswatch_1_1timer_1_1_repeated_timer.html#a0ba9bc6b5aea4aa3ecb3670a2ca64b2f", null ], + [ "restTime", "classboswatch_1_1timer_1_1_repeated_timer.html#a5b693144e9b2060eff4a30e526f618f8", null ] +]; \ No newline at end of file diff --git a/api/html/classes.html b/api/html/classes.html new file mode 100644 index 0000000..8d6dbe3 --- /dev/null +++ b/api/html/classes.html @@ -0,0 +1,163 @@ + + + + + + + +BOSWatch 3: Data Structure Index + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structure Index
+
+
+
B | C | D | F | I | L | M | N | P | R | S | T | Z | _
+ +
+
+ + + + diff --git a/api/html/classmodule_1_1descriptor_1_1_boswatch_module.html b/api/html/classmodule_1_1descriptor_1_1_boswatch_module.html new file mode 100644 index 0000000..a6da59c --- /dev/null +++ b/api/html/classmodule_1_1descriptor_1_1_boswatch_module.html @@ -0,0 +1,327 @@ + + + + + + + +BOSWatch 3: module.descriptor.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.descriptor.BoswatchModule Class Reference
+
+
+ +

Adds descriptions to bwPackets. + More...

+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin.
 
 doWork (self, bwPacket)
 start an run of the module.
 
 onUnload (self)
 Called by destruction of the plugin.
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
+ + + + + + +

+Data Fields

 config = bwPacket.get(descriptor.get("scanField")):
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Adds descriptions to bwPackets.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.descriptor.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.descriptor.BoswatchModule.onLoad ( self)
+
+ +

Called by import of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
34 def onLoad(self):
+
35 r"""!Called by import of the plugin"""
+
36 for descriptor in self.config:
+
37 if descriptor.get("wildcard", default=None):
+
38 self.registerWildcard(descriptor.get("wildcard"), descriptor.get("descrField"))
+
39
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.descriptor.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
40 def doWork(self, bwPacket):
+
41 r"""!start an run of the module.
+
42
+
43 @param bwPacket: A BOSWatch packet instance"""
+
44 for descriptor in self.config:
+
45 if not bwPacket.get(descriptor.get("scanField")):
+
46 break # scanField is not available in this packet
+
47 bwPacket.set(descriptor.get("descrField"), bwPacket.get(descriptor.get("scanField")))
+
48 for description in descriptor.get("descriptions"):
+
49 if str(description.get("for")) == bwPacket.get(descriptor.get("scanField")):
+
50 logging.debug("Description '%s' added in packet field '%s'",
+
51 description.get("add"), descriptor.get("descrField"))
+
52 bwPacket.set(descriptor.get("descrField"), description.get("add"))
+
53 break # this descriptor has found a description - run next descriptor
+
54 return bwPacket
+
55
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.descriptor.BoswatchModule.onUnload ( self)
+
+ +

Called by destruction of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
56 def onUnload(self):
+
57 r"""!Called by destruction of the plugin"""
+
58 pass
+
+
+
+

Field Documentation

+ +

◆ config

+ +
+
+ + + + +
module.descriptor.BoswatchModule.config = bwPacket.get(descriptor.get("scanField")):
+
+ +
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1descriptor_1_1_boswatch_module.js b/api/html/classmodule_1_1descriptor_1_1_boswatch_module.js new file mode 100644 index 0000000..7f3bbc1 --- /dev/null +++ b/api/html/classmodule_1_1descriptor_1_1_boswatch_module.js @@ -0,0 +1,8 @@ +var classmodule_1_1descriptor_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1descriptor_1_1_boswatch_module.html#aa1bc2516e337c8fa96ef7e3656435f85", null ], + [ "onLoad", "classmodule_1_1descriptor_1_1_boswatch_module.html#a39d8aef7f47e43c8108813f072785a56", null ], + [ "doWork", "classmodule_1_1descriptor_1_1_boswatch_module.html#a2192a35cc94bccc69d1b6a268acc9b94", null ], + [ "onUnload", "classmodule_1_1descriptor_1_1_boswatch_module.html#adf37fd4608e42b4a9335c0d2954d7113", null ], + [ "config", "classmodule_1_1descriptor_1_1_boswatch_module.html#aaa022ad0b56c3cbd15d2dab38fb99fb7", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html b/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html new file mode 100644 index 0000000..9c0df19 --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html @@ -0,0 +1,428 @@ + + + + + + + +BOSWatch 3: module.filter.doubleFilter.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.doubleFilter.BoswatchModule Class Reference
+
+
+ +

Description of the Module. + More...

+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin Remove if not implemented.
 
 doWork (self, bwPacket)
 start an run of the module.
 
 onUnload (self)
 Called by destruction of the plugin Remove if not implemented.
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
+ + + + + + +

+Data Fields

list _filterLists = []
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
+ + + + + + + + + + + + + +

+Protected Member Functions

 _check (self, bwPacket, filterFields)
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
+ + + + + + + + + + + + + + +

+Protected Attributes

dict _filterLists = {}
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
+ + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Description of the Module.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.filter.doubleFilter.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33 self._filterLists = {}
+
34 logging.debug("Configured ignoreTime: %d", self.config.get("ignoreTime", default=10))
+
35 logging.debug("Configured maxEntry: %d", self.config.get("maxEntry", default=10))
+
36
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.filter.doubleFilter.BoswatchModule.onLoad ( self)
+
+ +

Called by import of the plugin Remove if not implemented.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
37 def onLoad(self):
+
38 r"""!Called by import of the plugin
+
39 Remove if not implemented"""
+
40 pass
+
41
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.filter.doubleFilter.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
42 def doWork(self, bwPacket):
+
43 r"""!start an run of the module.
+
44
+
45 @param bwPacket: A BOSWatch packet instance"""
+
46 if bwPacket.get("mode") == "fms":
+
47 filterFields = ["fms"]
+
48 elif bwPacket.get("mode") == "pocsag":
+
49 filterFields = self.config.get("pocsagFields", default=["ric", "subric"])
+
50 elif bwPacket.get("mode") == "zvei":
+
51 filterFields = ["tone"]
+
52 else:
+
53 logging.error("No Filter for '%s'", bwPacket)
+
54 return False
+
55
+
56 if not bwPacket.get("mode") in self._filterLists:
+
57 logging.debug("create new doubleFilter list for '%s'", bwPacket.get("mode"))
+
58 self._filterLists[bwPacket.get("mode")] = []
+
59
+
60 logging.debug("filterFields for '%s' is '%s'", bwPacket.get("mode"), ", ".join(filterFields))
+
61
+
62 return self._check(bwPacket, filterFields)
+
63
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.filter.doubleFilter.BoswatchModule.onUnload ( self)
+
+ +

Called by destruction of the plugin Remove if not implemented.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
64 def onUnload(self):
+
65 r"""!Called by destruction of the plugin
+
66 Remove if not implemented"""
+
67 pass
+
68
+
+
+
+ +

◆ _check()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
module.filter.doubleFilter.BoswatchModule._check ( self,
bwPacket,
filterFields )
+
+protected
+
+
69 def _check(self, bwPacket, filterFields):
+
70 self._filterLists[bwPacket.get("mode")].insert(0, bwPacket)
+
71
+
72 for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
+
73 if all(listPacket.get(x) == bwPacket.get(x) for x in filterFields):
+
74 logging.debug("found duplicate: %s", bwPacket.get("mode"))
+
75 return False
+
76 # delete entries that are to old
+
77 counter = 0
+
78 for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
+
79 if float(listPacket.get("timestamp")) < (time.time() - self.config.get("ignoreTime", default=10)):
+
80 self._filterLists[bwPacket.get("mode")].remove(listPacket)
+
81 counter += 1
+
82 if counter:
+
83 logging.debug("%d old entry(s) removed", counter)
+
84
+
85 # delete last entry if list is to big
+
86 if len(self._filterLists[bwPacket.get("mode")]) > self.config.get("maxEntry", default=20):
+
87 logging.debug("MaxEntry reached - delete oldest")
+
88 self._filterLists[bwPacket.get("mode")].pop()
+
89
+
90 logging.debug("doubleFilter ok")
+
91 return None
+
+
+
+

Field Documentation

+ +

◆ _filterLists [1/2]

+ +
+
+ + + + + +
+ + + + +
dict module.filter.doubleFilter.BoswatchModule._filterLists = {}
+
+protected
+
+ +
+
+ +

◆ _filterLists [2/2]

+ +
+
+ + + + +
list module.filter.doubleFilter.BoswatchModule._filterLists = []
+
+ +
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.js b/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.js new file mode 100644 index 0000000..db2db0a --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.js @@ -0,0 +1,10 @@ +var classmodule_1_1filter_1_1double_filter_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a10e2b681c89887ee422f01a1f9ae9dcd", null ], + [ "onLoad", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#aa5f9d403d03ad71ebacc98d0e05ef0ab", null ], + [ "doWork", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a88c57fc92229358481fa36e98c677c7d", null ], + [ "onUnload", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a81185d2d81a4959d8a29e5054adf975d", null ], + [ "_check", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a43d03ed47b4c9bdaf34daec40cf094d4", null ], + [ "_filterLists", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#acea4923f42d2b6688455567e1c3f6f2e", null ], + [ "_filterLists", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a8636be116a0033d585673a8c0e3527d0", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html b/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html new file mode 100644 index 0000000..9d1f453 --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html @@ -0,0 +1,300 @@ + + + + + + + +BOSWatch 3: module.filter.modeFilter.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.modeFilter.BoswatchModule Class Reference
+
+
+ +

Filter of specific bwPacket mode. + More...

+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin.
 
 doWork (self, bwPacket)
 start an run of the module.
 
 onUnload (self)
 Called by destruction of the plugin.
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Filter of specific bwPacket mode.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.filter.modeFilter.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.filter.modeFilter.BoswatchModule.onLoad ( self)
+
+ +

Called by import of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
34 def onLoad(self):
+
35 r"""!Called by import of the plugin"""
+
36 pass
+
37
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.filter.modeFilter.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
38 def doWork(self, bwPacket):
+
39 r"""!start an run of the module.
+
40
+
41 @param bwPacket: A BOSWatch packet instance"""
+
42
+
43 for mode in self.config.get("allowed", default=[]):
+
44 if bwPacket.get("mode") == mode:
+
45 logging.debug("mode is allowed: %s", bwPacket.get("mode"))
+
46 return None
+
47 logging.debug("mode is denied: %s", bwPacket.get("mode"))
+
48 return False
+
49
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.filter.modeFilter.BoswatchModule.onUnload ( self)
+
+ +

Called by destruction of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
50 def onUnload(self):
+
51 r"""!Called by destruction of the plugin"""
+
52 pass
+
+
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.js b/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.js new file mode 100644 index 0000000..05fb36c --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.js @@ -0,0 +1,7 @@ +var classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a40d029c8dc22e315b84237d31055137b", null ], + [ "onLoad", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a316db93e433ec18280dba7c603b6db7f", null ], + [ "doWork", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a720563d78144989697ed24804d554f8d", null ], + [ "onUnload", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#af5c6b174721359c9c93ddc29faa9be9b", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html b/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html new file mode 100644 index 0000000..2c2f668 --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html @@ -0,0 +1,334 @@ + + + + + + + +BOSWatch 3: module.filter.regexFilter.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.regexFilter.BoswatchModule Class Reference
+
+
+ +

Regex based filter mechanism. + More...

+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin.
 
 doWork (self, bwPacket)
 start an run of the module.
 
 onUnload (self)
 Called by destruction of the plugin.
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
+ + + + + + +

+Data Fields

 config
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Regex based filter mechanism.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.filter.regexFilter.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.filter.regexFilter.BoswatchModule.onLoad ( self)
+
+ +

Called by import of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
34 def onLoad(self):
+
35 r"""!Called by import of the plugin"""
+
36 pass
+
37
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.filter.regexFilter.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
38 def doWork(self, bwPacket):
+
39 r"""!start an run of the module.
+
40
+
41 @param bwPacket: A BOSWatch packet instance"""
+
42 for regexFilter in self.config:
+
43 checkFailed = False
+
44 logging.debug("try filter '%s' with %d check(s)", regexFilter.get("name"), len(regexFilter.get("checks")))
+
45
+
46 for check in regexFilter.get("checks"):
+
47 fieldData = bwPacket.get(check.get("field"))
+
48
+
49 if not fieldData or not re.search(check.get("regex"), fieldData):
+
50 logging.debug("[-] field '%s' with regex '%s'", check.get("field"), check.get("regex"))
+
51 checkFailed = True
+
52 break # if one check failed we break this filter
+
53 else:
+
54 logging.debug("[+] field '%s' with regex '%s'", check.get("field"), check.get("regex"))
+
55
+
56 if not checkFailed:
+
57 logging.debug("[PASSED] filter '%s'", regexFilter.get("name"))
+
58 return None # None -> Router will go on with this packet
+
59 logging.debug("[FAILED] filter '%s'", regexFilter.get("name"))
+
60
+
61 return False # False -> Router will stop further processing
+
62
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.filter.regexFilter.BoswatchModule.onUnload ( self)
+
+ +

Called by destruction of the plugin.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
63 def onUnload(self):
+
64 r"""!Called by destruction of the plugin"""
+
65 pass
+
+
+
+

Field Documentation

+ +

◆ config

+ +
+
+ + + + +
module.filter.regexFilter.BoswatchModule.config
+
+ +
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.js b/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.js new file mode 100644 index 0000000..47f4c4c --- /dev/null +++ b/api/html/classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.js @@ -0,0 +1,8 @@ +var classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a7d0ba6d5f55296e81be161ffc0cf5f86", null ], + [ "onLoad", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a636f42c800fd91192e2f683313fc75bf", null ], + [ "doWork", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a887577d5947b9277541d8013e6685103", null ], + [ "onUnload", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#afa1a66cb2277360e21841526e41cec5c", null ], + [ "config", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#ab826f80406d3117525de1e2d4e0615f0", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1geocoding_1_1_boswatch_module.html b/api/html/classmodule_1_1geocoding_1_1_boswatch_module.html new file mode 100644 index 0000000..f3f318d --- /dev/null +++ b/api/html/classmodule_1_1geocoding_1_1_boswatch_module.html @@ -0,0 +1,317 @@ + + + + + + + +BOSWatch 3: module.geocoding.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.geocoding.BoswatchModule Class Reference
+
+
+ +

Description of the Module. + More...

+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 doWork (self, bwPacket)
 start an run of the module.
 
 geocode (self, bwPacket)
 find address in message and get latitude and longitude
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
 onLoad (self)
 Called by import of the module can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Description of the Module.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.geocoding.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
31 def __init__(self, config):
+
32 r"""!Do not change anything here!"""
+
33 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
34
+
+
+
+

Member Function Documentation

+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.geocoding.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
35 def doWork(self, bwPacket):
+
36 r"""!start an run of the module.
+
37
+
38 @param bwPacket: A BOSWatch packet instance"""
+
39 if bwPacket.get("mode") == "pocsag":
+
40 self.geocode(bwPacket)
+
41
+
42 return bwPacket
+
43
+
+
+
+ +

◆ geocode()

+ +
+
+ + + + + + + + + + + +
module.geocoding.BoswatchModule.geocode ( self,
bwPacket )
+
+ +

find address in message and get latitude and longitude

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+
44 def geocode(self, bwPacket):
+
45 r"""!find address in message and get latitude and longitude
+
46
+
47 @param bwPacket: A BOSWatch packet instance"""
+
48 try:
+
49 addressArray = re.search(self.config.get("regex"), bwPacket.get("message"))
+
50 provider = self.config.get("apiProvider")
+
51
+
52 if addressArray[1] is None:
+
53 logging.info("No address found, skipping geocoding")
+
54 return bwPacket
+
55
+
56 address = addressArray[1]
+
57 bwPacket.set("address", address)
+
58 self.registerWildcard("{ADDRESS}", "address")
+
59 logging.info("Found address: '" + address + "' in packet")
+
60
+
61 if "mapbox" == provider:
+
62 logging.info("Using Mapbox as provider")
+
63 g = geocoder.mapbox(address, key=self.config.get("apiToken"))
+
64 elif "google" == provider:
+
65 logging.info("Using Google as provider")
+
66 g = geocoder.google(address, key=self.config.get("apiToken"))
+
67 else:
+
68 return bwPacket
+
69
+
70 (lat, lon) = g.latlng
+
71 logging.info("Found following coordinates for address: [lat=" + str(lat) + ", lon=" + str(lon) + "]")
+
72 bwPacket.set("lat", lat)
+
73 bwPacket.set("lon", lon)
+
74 self.registerWildcard("{LAT}", "lat")
+
75 self.registerWildcard("{LON}", "lon")
+
76
+
77 return bwPacket
+
78 except Exception as e:
+
79 logging.exception("Unknown Error while executing geocoding module: " + str(type(e).__name__) + ": " + str(e))
+
80 return bwPacket
+
+
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1geocoding_1_1_boswatch_module.js b/api/html/classmodule_1_1geocoding_1_1_boswatch_module.js new file mode 100644 index 0000000..87f50c7 --- /dev/null +++ b/api/html/classmodule_1_1geocoding_1_1_boswatch_module.js @@ -0,0 +1,6 @@ +var classmodule_1_1geocoding_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1geocoding_1_1_boswatch_module.html#a0c730c8d45b001e1ddb2ab73400df373", null ], + [ "doWork", "classmodule_1_1geocoding_1_1_boswatch_module.html#af7f1f53f8f23f091bb12fbb3c5b040eb", null ], + [ "geocode", "classmodule_1_1geocoding_1_1_boswatch_module.html#a59b6abc9064a3674525563647ed6d8cd", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1module_base_1_1_module_base.html b/api/html/classmodule_1_1module_base_1_1_module_base.html new file mode 100644 index 0000000..2b9ba62 --- /dev/null +++ b/api/html/classmodule_1_1module_base_1_1_module_base.html @@ -0,0 +1,657 @@ + + + + + + + +BOSWatch 3: module.moduleBase.ModuleBase Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +

Main module class. + More...

+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, moduleName, config)
 init preload some needed locals and then call onLoad() directly
 
 onLoad (self)
 Called by import of the module can be inherited.
 
 doWork (self, bwPacket)
 Called module run can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
+ + + + +

+Static Public Member Functions

 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
+ + + +

+Data Fields

 config = config
 
+ + + + + + + + + + +

+Protected Member Functions

 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
+ + + + + + + + + + + +

+Protected Attributes

 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
+ + + +

+Static Protected Attributes

list _modulesActive = []
 
+

Detailed Description

+

Main module class.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
module.moduleBase.ModuleBase.__init__ ( self,
moduleName,
config )
+
+ +

init preload some needed locals and then call onLoad() directly

+ +

Reimplemented in module.descriptor.BoswatchModule, module.filter.doubleFilter.BoswatchModule, module.filter.modeFilter.BoswatchModule, module.filter.regexFilter.BoswatchModule, module.geocoding.BoswatchModule, and module.template_module.BoswatchModule.

+
31 def __init__(self, moduleName, config):
+
32 r"""!init preload some needed locals and then call onLoad() directly"""
+
33 self._moduleName = moduleName
+
34 self.config = config
+
35 self._modulesActive.append(self)
+
36
+
37 # for time counting
+
38 self._cumTime = 0
+
39 self._moduleTime = 0
+
40
+
41 # for statistics
+
42 self._runCount = 0
+
43 self._moduleErrorCount = 0
+
44
+
45 logging.debug("[%s] onLoad()", moduleName)
+
46 self.onLoad()
+
47
+
+
+
+

Member Function Documentation

+ +

◆ _cleanup()

+ +
+
+ + + + + +
+ + + + + + + +
module.moduleBase.ModuleBase._cleanup ( self)
+
+protected
+
+ +

Cleanup routine calls onUnload() directly.

+
48 def _cleanup(self):
+
49 r"""!Cleanup routine calls onUnload() directly"""
+
50 logging.debug("[%s] onUnload()", self._moduleName)
+
51 self._modulesActive.remove(self)
+
52 self.onUnload()
+
53
+
+
+
+ +

◆ _run()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
module.moduleBase.ModuleBase._run ( self,
bwPacket )
+
+protected
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+
Returns
bwPacket or False
+
54 def _run(self, bwPacket):
+
55 r"""!start an run of the module.
+
56
+
57 @param bwPacket: A BOSWatch packet instance
+
58 @return bwPacket or False"""
+
59 self._runCount += 1
+
60 logging.debug("[%s] run #%d", self._moduleName, self._runCount)
+
61
+
62 tmpTime = time.time()
+
63 try:
+
64 logging.debug("[%s] doWork()", self._moduleName)
+
65 bwPacket = self.doWork(bwPacket)
+
66 except:
+
67 self._moduleErrorCount += 1
+
68 logging.exception("[%s] alarm error", self._moduleName)
+
69 self._moduleTime = time.time() - tmpTime
+
70
+
71 self._cumTime += self._moduleTime
+
72
+
73 logging.debug("[%s] took %0.3f seconds", self._moduleName, self._moduleTime)
+
74
+
75 return bwPacket
+
76
+
+
+
+ +

◆ _getStatistics()

+ +
+
+ + + + + +
+ + + + + + + +
module.moduleBase.ModuleBase._getStatistics ( self)
+
+protected
+
+ +

Returns statistical information's from last module run.

+
Returns
Statistics as pyton dict
+
77 def _getStatistics(self):
+
78 r"""!Returns statistical information's from last module run
+
79
+
80 @return Statistics as pyton dict"""
+
81 stats = {"type": "module",
+
82 "runCount": self._runCount,
+
83 "cumTime": self._cumTime,
+
84 "moduleTime": self._moduleTime,
+
85 "moduleErrorCount": self._moduleErrorCount}
+
86 return stats
+
87
+
+
+
+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.moduleBase.ModuleBase.onLoad ( self)
+
+ +

Called by import of the module can be inherited.

+ +

Reimplemented in module.descriptor.BoswatchModule, module.filter.doubleFilter.BoswatchModule, module.filter.modeFilter.BoswatchModule, module.filter.regexFilter.BoswatchModule, and module.template_module.BoswatchModule.

+
88 def onLoad(self):
+
89 r"""!Called by import of the module
+
90 can be inherited"""
+
91 pass
+
92
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.moduleBase.ModuleBase.doWork ( self,
bwPacket )
+
+ +

Called module run can be inherited.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented in module.descriptor.BoswatchModule, module.filter.doubleFilter.BoswatchModule, module.filter.modeFilter.BoswatchModule, module.filter.regexFilter.BoswatchModule, module.geocoding.BoswatchModule, and module.template_module.BoswatchModule.

+
93 def doWork(self, bwPacket):
+
94 r"""!Called module run
+
95 can be inherited
+
96
+
97 @param bwPacket: bwPacket instance"""
+
98 logging.warning("no functionality in module %s", self._moduleName)
+
99
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.moduleBase.ModuleBase.onUnload ( self)
+
+ +

Called on shutdown of boswatch can be inherited.

+ +

Reimplemented in module.descriptor.BoswatchModule, module.filter.doubleFilter.BoswatchModule, module.filter.modeFilter.BoswatchModule, module.filter.regexFilter.BoswatchModule, and module.template_module.BoswatchModule.

+
100 def onUnload(self):
+
101 r"""!Called on shutdown of boswatch
+
102 can be inherited"""
+
103 pass
+
104
+
+
+
+ +

◆ registerWildcard()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
module.moduleBase.ModuleBase.registerWildcard ( newWildcard,
bwPacketField )
+
+static
+
+ +

Register a new wildcard.

+
Parameters
+ + + +
newWildcardwildcard where parser searching for
bwPacketFieldfield from bwPacket where holds replacement data
+
+
+
106 def registerWildcard(newWildcard, bwPacketField):
+
107 r"""!Register a new wildcard
+
108
+
109 @param newWildcard: wildcard where parser searching for
+
110 @param bwPacketField: field from bwPacket where holds replacement data"""
+
111 if not newWildcard.startswith("{") or not newWildcard.endswith("}"):
+
112 logging.error("wildcard not registered - false format: %s", newWildcard)
+
113 return
+
114 if bwPacketField == "":
+
115 logging.error("wildcard not registered - bwPacket field is empty")
+
116 return
+
117 wildcard.registerWildcard(newWildcard, bwPacketField)
+
+
+
+

Field Documentation

+ +

◆ _modulesActive

+ +
+
+ + + + + +
+ + + + +
list module.moduleBase.ModuleBase._modulesActive = []
+
+staticprotected
+
+ +
+
+ +

◆ _moduleName

+ +
+
+ + + + + +
+ + + + +
module.moduleBase.ModuleBase._moduleName = moduleName
+
+protected
+
+ +
+
+ +

◆ config

+ +
+
+ + + + +
module.moduleBase.ModuleBase.config = config
+
+ +
+
+ +

◆ _cumTime

+ +
+
+ + + + + +
+ + + + +
int module.moduleBase.ModuleBase._cumTime = 0
+
+protected
+
+ +
+
+ +

◆ _moduleTime

+ +
+
+ + + + + +
+ + + + +
int module.moduleBase.ModuleBase._moduleTime = 0
+
+protected
+
+ +
+
+ +

◆ _runCount

+ +
+
+ + + + + +
+ + + + +
module.moduleBase.ModuleBase._runCount = 0
+
+protected
+
+ +
+
+ +

◆ _moduleErrorCount

+ +
+
+ + + + + +
+ + + + +
int module.moduleBase.ModuleBase._moduleErrorCount = 0
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1module_base_1_1_module_base.js b/api/html/classmodule_1_1module_base_1_1_module_base.js new file mode 100644 index 0000000..7f55ddf --- /dev/null +++ b/api/html/classmodule_1_1module_base_1_1_module_base.js @@ -0,0 +1,18 @@ +var classmodule_1_1module_base_1_1_module_base = +[ + [ "__init__", "classmodule_1_1module_base_1_1_module_base.html#afee02f2e4ef75f43eb819facba9e9bd7", null ], + [ "_cleanup", "classmodule_1_1module_base_1_1_module_base.html#ae43a99376d14379225916bbce74793bd", null ], + [ "_run", "classmodule_1_1module_base_1_1_module_base.html#a1bc0d95375400ac328aaa9c10fd1996a", null ], + [ "_getStatistics", "classmodule_1_1module_base_1_1_module_base.html#a872db7602a8139866730ba79a220314b", null ], + [ "onLoad", "classmodule_1_1module_base_1_1_module_base.html#aedd2d0694073eff10a3c0440f487a373", null ], + [ "doWork", "classmodule_1_1module_base_1_1_module_base.html#a2146259480980a909ee97410cfdc7933", null ], + [ "onUnload", "classmodule_1_1module_base_1_1_module_base.html#a4c69727e801ba326aed6963cd9fd6dae", null ], + [ "registerWildcard", "classmodule_1_1module_base_1_1_module_base.html#a75f00bbad4a6905c467e71df1df22f9c", null ], + [ "_modulesActive", "classmodule_1_1module_base_1_1_module_base.html#addb1f046325535d8f3036c605429cf14", null ], + [ "_moduleName", "classmodule_1_1module_base_1_1_module_base.html#a667c99040b316d66a00de34ff5cebf3e", null ], + [ "config", "classmodule_1_1module_base_1_1_module_base.html#a7cbca9fa85b9b9bb487ac882d51385c4", null ], + [ "_cumTime", "classmodule_1_1module_base_1_1_module_base.html#a96ad0ccc9a2dadf099285b5e938a098a", null ], + [ "_moduleTime", "classmodule_1_1module_base_1_1_module_base.html#a9b6aa123432ef49e373f643f5b10a82c", null ], + [ "_runCount", "classmodule_1_1module_base_1_1_module_base.html#a9f55a9dd81ff02426ae9d73ff62f4134", null ], + [ "_moduleErrorCount", "classmodule_1_1module_base_1_1_module_base.html#ac95033dbbecea6287331a58f4b2fd046", null ] +]; \ No newline at end of file diff --git a/api/html/classmodule_1_1template__module_1_1_boswatch_module.html b/api/html/classmodule_1_1template__module_1_1_boswatch_module.html new file mode 100644 index 0000000..fa1317a --- /dev/null +++ b/api/html/classmodule_1_1template__module_1_1_boswatch_module.html @@ -0,0 +1,305 @@ + + + + + + + +BOSWatch 3: module.template_module.BoswatchModule Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.template_module.BoswatchModule Class Reference
+
+
+ +

Description of the Module. + More...

+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin Remove if not implemented.
 
 doWork (self, bwPacket)
 start an run of the module.
 
 onUnload (self)
 Called by destruction of the plugin Remove if not implemented.
 
- Public Member Functions inherited from module.moduleBase.ModuleBase
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Member Functions inherited from module.moduleBase.ModuleBase
 registerWildcard (newWildcard, bwPacketField)
 Register a new wildcard.
 
- Data Fields inherited from module.moduleBase.ModuleBase
 config = config
 
- Protected Member Functions inherited from module.moduleBase.ModuleBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an run of the module.
 
 _getStatistics (self)
 Returns statistical information's from last module run.
 
- Protected Attributes inherited from module.moduleBase.ModuleBase
 _moduleName = moduleName
 
int _cumTime = 0
 
int _moduleTime = 0
 
int _runCount = 0
 
int _moduleErrorCount = 0
 
- Static Protected Attributes inherited from module.moduleBase.ModuleBase
list _modulesActive = []
 
+

Detailed Description

+

Description of the Module.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
module.template_module.BoswatchModule.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
module.template_module.BoswatchModule.onLoad ( self)
+
+ +

Called by import of the plugin Remove if not implemented.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
34 def onLoad(self):
+
35 r"""!Called by import of the plugin
+
36 Remove if not implemented"""
+
37 pass
+
38
+
+
+
+ +

◆ doWork()

+ +
+
+ + + + + + + + + + + +
module.template_module.BoswatchModule.doWork ( self,
bwPacket )
+
+ +

start an run of the module.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+ +

Reimplemented from module.moduleBase.ModuleBase.

+
39 def doWork(self, bwPacket):
+
40 r"""!start an run of the module.
+
41
+
42 @param bwPacket: A BOSWatch packet instance"""
+
43 if bwPacket.get("mode") == "fms":
+
44 pass
+
45 elif bwPacket.get("mode") == "zvei":
+
46 pass
+
47 elif bwPacket.get("mode") == "pocsag":
+
48 pass
+
49 elif bwPacket.get("mode") == "msg":
+
50 pass
+
51
+
52 return bwPacket
+
53
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
module.template_module.BoswatchModule.onUnload ( self)
+
+ +

Called by destruction of the plugin Remove if not implemented.

+ +

Reimplemented from module.moduleBase.ModuleBase.

+
54 def onUnload(self):
+
55 r"""!Called by destruction of the plugin
+
56 Remove if not implemented"""
+
57 pass
+
+
+
+
+
+ + + + diff --git a/api/html/classmodule_1_1template__module_1_1_boswatch_module.js b/api/html/classmodule_1_1template__module_1_1_boswatch_module.js new file mode 100644 index 0000000..050bccf --- /dev/null +++ b/api/html/classmodule_1_1template__module_1_1_boswatch_module.js @@ -0,0 +1,7 @@ +var classmodule_1_1template__module_1_1_boswatch_module = +[ + [ "__init__", "classmodule_1_1template__module_1_1_boswatch_module.html#a3f001ec829334fde0039cdbfec542588", null ], + [ "onLoad", "classmodule_1_1template__module_1_1_boswatch_module.html#a5fbab9ed6a058b089d39d3f53c7f1527", null ], + [ "doWork", "classmodule_1_1template__module_1_1_boswatch_module.html#a266810ac3b486b4340fe823390a4b866", null ], + [ "onUnload", "classmodule_1_1template__module_1_1_boswatch_module.html#a00f969c06c87ae304c65aee372d95d0a", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1divera_1_1_boswatch_plugin.html b/api/html/classplugin_1_1divera_1_1_boswatch_plugin.html new file mode 100644 index 0000000..5d5cf26 --- /dev/null +++ b/api/html/classplugin_1_1divera_1_1_boswatch_plugin.html @@ -0,0 +1,575 @@ + + + + + + + +BOSWatch 3: plugin.divera.BoswatchPlugin Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.divera.BoswatchPlugin Class Reference
+
+
+ +

Description of the Plugin. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 fms (self, bwPacket)
 Called on FMS alarm.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm.
 
 msg (self, bwPacket)
 Called on MSG packet.
 
- Public Member Functions inherited from plugin.pluginBase.PluginBase
 onLoad (self)
 Called by import of the plugin can be inherited.
 
 setup (self)
 Called before alarm can be inherited.
 
 teardown (self)
 Called after alarm can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + + + + + + + + + + + + + + + +

+Protected Member Functions

 _makeRequests (self, apipath, apicall)
 
 _asyncRequests (self, url)
 
 _fetch (self, url, session)
 
- Protected Member Functions inherited from plugin.pluginBase.PluginBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Data Fields inherited from plugin.pluginBase.PluginBase
 config = config
 
- Protected Attributes inherited from plugin.pluginBase.PluginBase
 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
- Static Protected Attributes inherited from plugin.pluginBase.PluginBase
list _pluginsActive = []
 
+

Detailed Description

+

Description of the Plugin.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
32 def __init__(self, config):
+
33 r"""!Do not change anything here!"""
+
34 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
35
+
+
+
+

Member Function Documentation

+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
36 def fms(self, bwPacket):
+
37 r"""!Called on FMS alarm
+
38
+
39 @param bwPacket: bwPacket instance
+
40 Remove if not implemented"""
+
41 fms_data = self.config.get("fms")
+
42 apicall = urllib.parse.urlencode({
+
43 "accesskey": self.config.get("accesskey", default=""),
+
44 "vehicle_ric": self.parseWildcards(fms_data.get("vehicle", default="")),
+
45 "status_id": bwPacket.get("status"),
+
46 "status_note": bwPacket.get("directionText"),
+
47 "title": self.parseWildcards(fms_data.get("title", default="{FMS}")),
+
48 "text": self.parseWildcards(fms_data.get("message", default="{FMS}")),
+
49 "priority": fms_data.get("priority", default="false"),
+
50 })
+
51 apipath = "/api/fms"
+
52 self._makeRequests(apipath, apicall)
+
53
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
54 def pocsag(self, bwPacket):
+
55 r"""!Called on POCSAG alarm
+
56
+
57 @param bwPacket: bwPacket instance
+
58 Remove if not implemented"""
+
59 poc_data = self.config.get("pocsag")
+
60 apicall = urllib.parse.urlencode({
+
61 "accesskey": self.config.get("accesskey", default=""),
+
62 "title": self.parseWildcards(poc_data.get("title", default="{RIC}({SRIC})\n{MSG}")),
+
63 "ric": self.parseWildcards(poc_data.get("ric", default="")),
+
64 "text": self.parseWildcards(poc_data.get("message", default="{MSG}")),
+
65 "priority": poc_data.get("priority", default="false"),
+
66 })
+
67 apipath = "/api/alarm"
+
68 self._makeRequests(apipath, apicall)
+
69
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
70 def zvei(self, bwPacket):
+
71 r"""!Called on ZVEI alarm
+
72
+
73 @param bwPacket: bwPacket instance
+
74 Remove if not implemented"""
+
75 zvei_data = self.config.get("zvei")
+
76 apicall = urllib.parse.urlencode({
+
77 "accesskey": self.config.get("accesskey", default=""),
+
78 "title": self.parseWildcards(zvei_data.get("title", default="{TONE}")),
+
79 "ric": self.parseWildcards(zvei_data.get("ric", default="{TONE}")),
+
80 "text": self.parseWildcards(zvei_data.get("message", default="{TONE}")),
+
81 "priority": zvei_data.get("priority", default="false"),
+
82 })
+
83 apipath = "/api/alarm"
+
84 self._makeRequests(apipath, apicall)
+
85
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin.msg ( self,
bwPacket )
+
+ +

Called on MSG packet.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
86 def msg(self, bwPacket):
+
87 r"""!Called on MSG packet
+
88
+
89 @param bwPacket: bwPacket instance
+
90 Remove if not implemented"""
+
91 msg_data = self.config.get("msg")
+
92 apicall = urllib.parse.urlencode({
+
93 "accesskey": self.config.get("accesskey", default=""),
+
94 "title": self.parseWildcards(msg_data.get("title", default="{MSG}")),
+
95 "ric": self.parseWildcards(msg_data.get("ric", default="")),
+
96 "text": self.parseWildcards(msg_data.get("message", default="{MSG}")),
+
97 "priority": msg_data.get("priority", default="false"),
+
98 })
+
99 apipath = "/api/alarm"
+
100 self._makeRequests(apipath, apicall)
+
101
+
+
+
+ +

◆ _makeRequests()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
plugin.divera.BoswatchPlugin._makeRequests ( self,
apipath,
apicall )
+
+protected
+
+
Parses wildcard urls and handles asynchronus requests
+
+@param urls: array of urls
102 def _makeRequests(self, apipath, apicall):
+
103 """Parses wildcard urls and handles asynchronus requests
+
104
+
105 @param urls: array of urls"""
+
106 url = "https://www.divera247.com"
+
107 request = url + apipath + "?" + apicall
+
108
+
109 loop = asyncio.get_event_loop()
+
110
+
111 future = asyncio.ensure_future(self._asyncRequests(request))
+
112 loop.run_until_complete(future)
+
113
+
+
+
+ +

◆ _asyncRequests()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
plugin.divera.BoswatchPlugin._asyncRequests ( self,
url )
+
+protected
+
+
Handles asynchronus requests
+
+@param urls: array of urls to send requests to
114 async def _asyncRequests(self, url):
+
115 """Handles asynchronus requests
+
116
+
117 @param urls: array of urls to send requests to"""
+
118 tasks = []
+
119
+
120 async with ClientSession() as session:
+
121 logging.debug("Generated URL: [{}]".format(url))
+
122 task = asyncio.ensure_future(self._fetch(url, session))
+
123 tasks.append(task)
+
124
+
125 responses = asyncio.gather(*tasks)
+
126 await responses
+
127
+
+
+
+ +

◆ _fetch()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
plugin.divera.BoswatchPlugin._fetch ( self,
url,
session )
+
+protected
+
+
Fetches requests
+
+@param url: url
+
+@param session: Clientsession instance
128 async def _fetch(self, url, session):
+
129 """Fetches requests
+
130
+
131 @param url: url
+
132
+
133 @param session: Clientsession instance"""
+
134 logging.debug("Post URL: [{}]".format(url))
+
135 async with session.post(url) as response:
+
136 logging.info("{} returned [{}]".format(response.url, response.status))
+
137 return await response.read()
+
+
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1divera_1_1_boswatch_plugin.js b/api/html/classplugin_1_1divera_1_1_boswatch_plugin.js new file mode 100644 index 0000000..1084dc9 --- /dev/null +++ b/api/html/classplugin_1_1divera_1_1_boswatch_plugin.js @@ -0,0 +1,11 @@ +var classplugin_1_1divera_1_1_boswatch_plugin = +[ + [ "__init__", "classplugin_1_1divera_1_1_boswatch_plugin.html#a15699267f01c1dcf595832ceaf3a717c", null ], + [ "fms", "classplugin_1_1divera_1_1_boswatch_plugin.html#aa1c4e66999052f91bb36fb0ab049a591", null ], + [ "pocsag", "classplugin_1_1divera_1_1_boswatch_plugin.html#aad60e175ed9d2a6832655d90e38ba179", null ], + [ "zvei", "classplugin_1_1divera_1_1_boswatch_plugin.html#ae681c4a8b35f18cce21bab24a9b74f7c", null ], + [ "msg", "classplugin_1_1divera_1_1_boswatch_plugin.html#a95a7f19773431bec715f2f293caf8d85", null ], + [ "_makeRequests", "classplugin_1_1divera_1_1_boswatch_plugin.html#a2bf369f81f8e4aa4497b058ce57fa9b7", null ], + [ "_asyncRequests", "classplugin_1_1divera_1_1_boswatch_plugin.html#ad710304e33432b74c0e1716283bea397", null ], + [ "_fetch", "classplugin_1_1divera_1_1_boswatch_plugin.html#a995706093c53e10bd494c98f06c8b8cb", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1http_1_1_boswatch_plugin.html b/api/html/classplugin_1_1http_1_1_boswatch_plugin.html new file mode 100644 index 0000000..88c22f1 --- /dev/null +++ b/api/html/classplugin_1_1http_1_1_boswatch_plugin.html @@ -0,0 +1,534 @@ + + + + + + + +BOSWatch 3: plugin.http.BoswatchPlugin Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.http.BoswatchPlugin Class Reference
+
+
+ +

Description of the Plugin. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 fms (self, bwPacket)
 Called on FMS alarm.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm.
 
 msg (self, bwPacket)
 Called on MSG packet.
 
- Public Member Functions inherited from plugin.pluginBase.PluginBase
 onLoad (self)
 Called by import of the plugin can be inherited.
 
 setup (self)
 Called before alarm can be inherited.
 
 teardown (self)
 Called after alarm can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + + + + + + + + + + + + + + + +

+Protected Member Functions

 _makeRequests (self, urls)
 
 _asyncRequests (self, urls)
 
 _fetch (self, url, session)
 
- Protected Member Functions inherited from plugin.pluginBase.PluginBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Data Fields inherited from plugin.pluginBase.PluginBase
 config = config
 
- Protected Attributes inherited from plugin.pluginBase.PluginBase
 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
- Static Protected Attributes inherited from plugin.pluginBase.PluginBase
list _pluginsActive = []
 
+

Detailed Description

+

Description of the Plugin.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
31 def __init__(self, config):
+
32 r"""!Do not change anything here!"""
+
33 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
34
+
+
+
+

Member Function Documentation

+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
35 def fms(self, bwPacket):
+
36 r"""!Called on FMS alarm
+
37
+
38 @param bwPacket: bwPacket instance
+
39 Remove if not implemented"""
+
40 urls = self.config.get("fms")
+
41 self._makeRequests(urls)
+
42
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
43 def pocsag(self, bwPacket):
+
44 r"""!Called on POCSAG alarm
+
45
+
46 @param bwPacket: bwPacket instance
+
47 Remove if not implemented"""
+
48 urls = self.config.get("pocsag")
+
49 self._makeRequests(urls)
+
50
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
51 def zvei(self, bwPacket):
+
52 r"""!Called on ZVEI alarm
+
53
+
54 @param bwPacket: bwPacket instance
+
55 Remove if not implemented"""
+
56 urls = self.config.get("zvei")
+
57 self._makeRequests(urls)
+
58
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin.msg ( self,
bwPacket )
+
+ +

Called on MSG packet.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
59 def msg(self, bwPacket):
+
60 r"""!Called on MSG packet
+
61
+
62 @param bwPacket: bwPacket instance
+
63 Remove if not implemented"""
+
64 urls = self.config.get("msg")
+
65 self._makeRequests(urls)
+
66
+
+
+
+ +

◆ _makeRequests()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin._makeRequests ( self,
urls )
+
+protected
+
+
Parses wildcard urls and handles asynchronus requests
+
+@param urls: array of urls
67 def _makeRequests(self, urls):
+
68 """Parses wildcard urls and handles asynchronus requests
+
69
+
70 @param urls: array of urls"""
+
71 urls = [self.parseWildcards(url) for url in urls]
+
72
+
73 loop = asyncio.get_event_loop()
+
74
+
75 future = asyncio.ensure_future(self._asyncRequests(urls))
+
76 loop.run_until_complete(future)
+
77
+
+
+
+ +

◆ _asyncRequests()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
plugin.http.BoswatchPlugin._asyncRequests ( self,
urls )
+
+protected
+
+
Handles asynchronus requests
+
+@param urls: array of urls to send requests to
78 async def _asyncRequests(self, urls):
+
79 """Handles asynchronus requests
+
80
+
81 @param urls: array of urls to send requests to"""
+
82 tasks = []
+
83
+
84 async with ClientSession() as session:
+
85 for url in urls:
+
86 task = asyncio.ensure_future(self._fetch(url, session))
+
87 tasks.append(task)
+
88
+
89 responses = asyncio.gather(*tasks)
+
90 await responses
+
91
+
+
+
+ +

◆ _fetch()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
plugin.http.BoswatchPlugin._fetch ( self,
url,
session )
+
+protected
+
+
Fetches requests
+
+@param url: url
+
+@param session: Clientsession instance
92 async def _fetch(self, url, session):
+
93 """Fetches requests
+
94
+
95 @param url: url
+
96
+
97 @param session: Clientsession instance"""
+
98 async with session.get(url) as response:
+
99 logging.info("{} returned [{}]".format(response.url, response.status))
+
100 return await response.read()
+
+
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1http_1_1_boswatch_plugin.js b/api/html/classplugin_1_1http_1_1_boswatch_plugin.js new file mode 100644 index 0000000..d20a355 --- /dev/null +++ b/api/html/classplugin_1_1http_1_1_boswatch_plugin.js @@ -0,0 +1,11 @@ +var classplugin_1_1http_1_1_boswatch_plugin = +[ + [ "__init__", "classplugin_1_1http_1_1_boswatch_plugin.html#a5a9cebdc7d9bfbb1c4655ce8df99885b", null ], + [ "fms", "classplugin_1_1http_1_1_boswatch_plugin.html#a9f553a502830180aeb3683c92e5ee695", null ], + [ "pocsag", "classplugin_1_1http_1_1_boswatch_plugin.html#aebea23ae39e04a4c9becab1405d17f57", null ], + [ "zvei", "classplugin_1_1http_1_1_boswatch_plugin.html#a35d80b12f07174df5a46c52776df6946", null ], + [ "msg", "classplugin_1_1http_1_1_boswatch_plugin.html#a53ff7d38082e062630f6485476c33ece", null ], + [ "_makeRequests", "classplugin_1_1http_1_1_boswatch_plugin.html#ab0d2721349d465674f27e7fb0ec07f52", null ], + [ "_asyncRequests", "classplugin_1_1http_1_1_boswatch_plugin.html#a5e3200e56a8022a46bc3aaeab915ed74", null ], + [ "_fetch", "classplugin_1_1http_1_1_boswatch_plugin.html#a201e0da093af49f002c1e6b8b6757480", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.html b/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.html new file mode 100644 index 0000000..5b18612 --- /dev/null +++ b/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.html @@ -0,0 +1,659 @@ + + + + + + + +BOSWatch 3: plugin.mysql.BoswatchPlugin Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.mysql.BoswatchPlugin Class Reference
+
+
+ +

Description of the Plugin. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin Remove if not implemented.
 
 setup (self)
 Called before alarm Remove if not implemented.
 
 fms (self, bwPacket)
 Called on FMS alarm.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm.
 
 msg (self, bwPacket)
 Called on MSG packet.
 
 teardown (self)
 Called after alarm Remove if not implemented.
 
 onUnload (self)
 Called by destruction of the plugin Remove if not implemented.
 
- Public Member Functions inherited from plugin.pluginBase.PluginBase
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + + + + + + + + +

+Data Fields

dict sqlInserts
 
 connection
 
 cursor = self.connection.cursor()
 
- Data Fields inherited from plugin.pluginBase.PluginBase
 config = config
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from plugin.pluginBase.PluginBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
- Protected Attributes inherited from plugin.pluginBase.PluginBase
 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
- Static Protected Attributes inherited from plugin.pluginBase.PluginBase
list _pluginsActive = []
 
+

Detailed Description

+

Description of the Plugin.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
plugin.mysql.BoswatchPlugin.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
33 def __init__(self, config):
+
34 r"""!Do not change anything here!"""
+
35 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
36
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
plugin.mysql.BoswatchPlugin.onLoad ( self)
+
+ +

Called by import of the plugin Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
37 def onLoad(self):
+
38 r"""!Called by import of the plugin
+
39 Remove if not implemented"""
+
40 self.sqlInserts = {
+
41 "pocsag": "INSERT INTO boswatch (packetTimestamp, packetMode, pocsag_ric, pocsag_subric, pocsag_subricText, pocsag_message, pocsag_bitrate, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
42 "zvei": "INSERT INTO boswatch (packetTimestamp, packetMode, zvei_tone, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
43 "fms": "INSERT INTO boswatch (packetTimestamp, packetMode, fms_fms, fms_service, fms_country, fms_location, fms_vehicle, fms_status, fms_direction, fms_directionText, fms_tacticalInfo, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUE (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
44 "msg": "INSERT INTO boswatch (packetTimestamp, packetMode, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUE (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
+
45 }
+
46
+
47 self.connection = mysql.connector.connect(
+
48 host=self.config.get("host"),
+
49 user=self.config.get("user"),
+
50 password=self.config.get("password"),
+
51 database=self.config.get("database"),
+
52 )
+
53
+
54 self.cursor = self.connection.cursor()
+
55 self.cursor.execute("SHOW TABLES LIKE 'boswatch'")
+
56
+
57 if self.cursor.fetchone() is None:
+
58 with open('init_db.sql') as f:
+
59 for stmnt in f.read().split(';'):
+
60 self.cursor.execute(stmnt)
+
61 self.connection.commit()
+
62
+
63 self.cursor.close()
+
64
+
+
+
+ +

◆ setup()

+ +
+
+ + + + + + + +
plugin.mysql.BoswatchPlugin.setup ( self)
+
+ +

Called before alarm Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
65 def setup(self):
+
66 r"""!Called before alarm
+
67 Remove if not implemented"""
+
68 try:
+
69 self.connection.ping(reconnect=True, attempts=3, delay=2)
+
70 except mysql.connector.Error:
+
71 logging.warning("Connection was down, trying to reconnect...")
+
72 self.onLoad()
+
73
+
74 self.cursor = self.connection.cursor()
+
75
+
+
+
+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.mysql.BoswatchPlugin.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
76 def fms(self, bwPacket):
+
77 r"""!Called on FMS alarm
+
78
+
79 @param bwPacket: bwPacket instance
+
80 Remove if not implemented"""
+
81 val = (
+
82 datetime.fromtimestamp(float(bwPacket.get("timestamp"))),
+
83 bwPacket.get("mode"),
+
84 bwPacket.get("fms"),
+
85 bwPacket.get("service"),
+
86 bwPacket.get("country"),
+
87 bwPacket.get("location"),
+
88 bwPacket.get("vehicle"),
+
89 bwPacket.get("status"),
+
90 bwPacket.get("direction"),
+
91 bwPacket.get("directionText"),
+
92 bwPacket.get("tacticalInfo"),
+
93 bwPacket.get("serverName"),
+
94 bwPacket.get("serverVersion"),
+
95 bwPacket.get("serverBuildDate"),
+
96 bwPacket.get("serverBranch"),
+
97 bwPacket.get("clientName"),
+
98 bwPacket.get("clientIP"),
+
99 bwPacket.get("clientVersion"),
+
100 bwPacket.get("clientBuildDate"),
+
101 bwPacket.get("clientBranch"),
+
102 bwPacket.get("inputSource"),
+
103 bwPacket.get("frequency")
+
104 )
+
105 self.cursor.execute(self.sqlInserts.get("fms"), val)
+
106
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.mysql.BoswatchPlugin.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
107 def pocsag(self, bwPacket):
+
108 r"""!Called on POCSAG alarm
+
109
+
110 @param bwPacket: bwPacket instance
+
111 Remove if not implemented"""
+
112 val = (
+
113 datetime.fromtimestamp(float(bwPacket.get("timestamp"))),
+
114 bwPacket.get("mode"),
+
115 bwPacket.get("ric"),
+
116 bwPacket.get("subric"),
+
117 bwPacket.get("subricText"),
+
118 bwPacket.get("message"),
+
119 bwPacket.get("bitrate"),
+
120 bwPacket.get("serverName"),
+
121 bwPacket.get("serverVersion"),
+
122 bwPacket.get("serverBuildDate"),
+
123 bwPacket.get("serverBranch"),
+
124 bwPacket.get("clientName"),
+
125 bwPacket.get("clientIP"),
+
126 bwPacket.get("clientVersion"),
+
127 bwPacket.get("clientBuildDate"),
+
128 bwPacket.get("clientBranch"),
+
129 bwPacket.get("inputSource"),
+
130 bwPacket.get("frequency")
+
131 )
+
132 self.cursor.execute(self.sqlInserts.get("pocsag"), val)
+
133
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.mysql.BoswatchPlugin.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
134 def zvei(self, bwPacket):
+
135 r"""!Called on ZVEI alarm
+
136
+
137 @param bwPacket: bwPacket instance
+
138 Remove if not implemented"""
+
139 val = (
+
140 datetime.fromtimestamp(float(bwPacket.get("timestamp"))),
+
141 bwPacket.get("mode"),
+
142 bwPacket.get("tone"),
+
143 bwPacket.get("serverName"),
+
144 bwPacket.get("serverVersion"),
+
145 bwPacket.get("serverBuildDate"),
+
146 bwPacket.get("serverBranch"),
+
147 bwPacket.get("clientName"),
+
148 bwPacket.get("clientIP"),
+
149 bwPacket.get("clientVersion"),
+
150 bwPacket.get("clientBuildDate"),
+
151 bwPacket.get("clientBranch"),
+
152 bwPacket.get("inputSource"),
+
153 bwPacket.get("frequency")
+
154 )
+
155 self.cursor.execute(self.sqlInserts.get("pocsag"), val)
+
156
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.mysql.BoswatchPlugin.msg ( self,
bwPacket )
+
+ +

Called on MSG packet.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
157 def msg(self, bwPacket):
+
158 r"""!Called on MSG packet
+
159
+
160 @param bwPacket: bwPacket instance
+
161 Remove if not implemented"""
+
162 val = (
+
163 datetime.fromtimestamp(float(bwPacket.get("timestamp"))),
+
164 bwPacket.get("mode"),
+
165 bwPacket.get("serverName"),
+
166 bwPacket.get("serverVersion"),
+
167 bwPacket.get("serverBuildDate"),
+
168 bwPacket.get("serverBranch"),
+
169 bwPacket.get("clientName"),
+
170 bwPacket.get("clientIP"),
+
171 bwPacket.get("clientVersion"),
+
172 bwPacket.get("clientBuildDate"),
+
173 bwPacket.get("clientBranch"),
+
174 bwPacket.get("inputSource"),
+
175 bwPacket.get("frequency")
+
176 )
+
177 self.cursor.execute(self.sqlInserts.get("msg"), val)
+
178
+
+
+
+ +

◆ teardown()

+ +
+
+ + + + + + + +
plugin.mysql.BoswatchPlugin.teardown ( self)
+
+ +

Called after alarm Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
179 def teardown(self):
+
180 r"""!Called after alarm
+
181 Remove if not implemented"""
+
182 self.connection.commit()
+
183 self.cursor.close()
+
184
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
plugin.mysql.BoswatchPlugin.onUnload ( self)
+
+ +

Called by destruction of the plugin Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
185 def onUnload(self):
+
186 r"""!Called by destruction of the plugin
+
187 Remove if not implemented"""
+
188 self.connection.close()
+
+
+
+

Field Documentation

+ +

◆ sqlInserts

+ +
+
+ + + + +
dict plugin.mysql.BoswatchPlugin.sqlInserts
+
+Initial value:
= {
+
"pocsag": "INSERT INTO boswatch (packetTimestamp, packetMode, pocsag_ric, pocsag_subric, pocsag_subricText, pocsag_message, pocsag_bitrate, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
"zvei": "INSERT INTO boswatch (packetTimestamp, packetMode, zvei_tone, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
"fms": "INSERT INTO boswatch (packetTimestamp, packetMode, fms_fms, fms_service, fms_country, fms_location, fms_vehicle, fms_status, fms_direction, fms_directionText, fms_tacticalInfo, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUE (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
+
"msg": "INSERT INTO boswatch (packetTimestamp, packetMode, serverName, serverVersion, serverBuildDate, serverBranch, clientName, clientIP, clientVersion, clientBuildDate, clientBranch, inputSource, frequency) VALUE (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
+
}
+
+
+
+ +

◆ connection

+ +
+
+ + + + +
plugin.mysql.BoswatchPlugin.connection
+
+Initial value:
= mysql.connector.connect(
+
host=self.config.get("host"),
+
user=self.config.get("user"),
+
password=self.config.get("password"),
+
database=self.config.get("database"),
+
)
+
+
+
+ +

◆ cursor

+ +
+
+ + + + +
plugin.mysql.BoswatchPlugin.cursor = self.connection.cursor()
+
+ +
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.js b/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.js new file mode 100644 index 0000000..8b48dde --- /dev/null +++ b/api/html/classplugin_1_1mysql_1_1_boswatch_plugin.js @@ -0,0 +1,15 @@ +var classplugin_1_1mysql_1_1_boswatch_plugin = +[ + [ "__init__", "classplugin_1_1mysql_1_1_boswatch_plugin.html#ab7dc98122deb62b02cab749b3f4fee32", null ], + [ "onLoad", "classplugin_1_1mysql_1_1_boswatch_plugin.html#af4be87c8480d01c0d7f285c5de1ad045", null ], + [ "setup", "classplugin_1_1mysql_1_1_boswatch_plugin.html#aec48341c7ba834871813bfdb0c285d86", null ], + [ "fms", "classplugin_1_1mysql_1_1_boswatch_plugin.html#adef1d378759ea53b9aebb4af72237260", null ], + [ "pocsag", "classplugin_1_1mysql_1_1_boswatch_plugin.html#aeaffdab7a2025c51d0af3151c475d1ec", null ], + [ "zvei", "classplugin_1_1mysql_1_1_boswatch_plugin.html#a54fbd13ab387336c4261349bb252ccc3", null ], + [ "msg", "classplugin_1_1mysql_1_1_boswatch_plugin.html#a2fb3e4559927837551f192cf13754583", null ], + [ "teardown", "classplugin_1_1mysql_1_1_boswatch_plugin.html#abfa5c5279cfe58cae60af8272fb50f92", null ], + [ "onUnload", "classplugin_1_1mysql_1_1_boswatch_plugin.html#aa421e2a472ac9ac3b9a13ec6bd5a5fca", null ], + [ "sqlInserts", "classplugin_1_1mysql_1_1_boswatch_plugin.html#a15ccdf15153caab4ea4d96e599a0954c", null ], + [ "connection", "classplugin_1_1mysql_1_1_boswatch_plugin.html#a9176bb4f142a1ca499851051b2da8684", null ], + [ "cursor", "classplugin_1_1mysql_1_1_boswatch_plugin.html#aa19e53f1b893899662c2510db9cfc4e1", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1plugin_base_1_1_plugin_base.html b/api/html/classplugin_1_1plugin_base_1_1_plugin_base.html new file mode 100644 index 0000000..b1be282 --- /dev/null +++ b/api/html/classplugin_1_1plugin_base_1_1_plugin_base.html @@ -0,0 +1,1008 @@ + + + + + + + +BOSWatch 3: plugin.pluginBase.PluginBase Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +

Main plugin class. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, pluginName, config)
 init preload some needed locals and then call onLoad() directly
 
 onLoad (self)
 Called by import of the plugin can be inherited.
 
 setup (self)
 Called before alarm can be inherited.
 
 fms (self, bwPacket)
 Called on FMS alarm can be inherited.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm can be inherited.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm can be inherited.
 
 msg (self, bwPacket)
 Called on MSG packet can be inherited.
 
 teardown (self)
 Called after alarm can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + +

+Data Fields

 config = config
 
+ + + + + + + + + + +

+Protected Member Functions

 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
+ + + +

+Static Protected Attributes

list _pluginsActive = []
 
+

Detailed Description

+

Main plugin class.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + +
plugin.pluginBase.PluginBase.__init__ ( self,
pluginName,
config )
+
+ +

init preload some needed locals and then call onLoad() directly

+ +

Reimplemented in plugin.divera.BoswatchPlugin, plugin.http.BoswatchPlugin, plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
31 def __init__(self, pluginName, config):
+
32 r"""!init preload some needed locals and then call onLoad() directly"""
+
33 self._pluginName = pluginName
+
34 self.config = config
+
35 self._pluginsActive.append(self)
+
36
+
37 # to save the packet while alarm is running for other functions
+
38 self._bwPacket = None
+
39
+
40 # for time counting
+
41 self._sumTime = 0
+
42 self._cumTime = 0
+
43 self._setupTime = 0
+
44 self._alarmTime = 0
+
45 self._teardownTime = 0
+
46
+
47 # for statistics
+
48 self._runCount = 0
+
49 self._setupErrorCount = 0
+
50 self._alarmErrorCount = 0
+
51 self._teardownErrorCount = 0
+
52
+
53 logging.debug("[%s] onLoad()", pluginName)
+
54 self.onLoad()
+
55
+
+
+
+

Member Function Documentation

+ +

◆ _cleanup()

+ +
+
+ + + + + +
+ + + + + + + +
plugin.pluginBase.PluginBase._cleanup ( self)
+
+protected
+
+ +

Cleanup routine calls onUnload() directly.

+
56 def _cleanup(self):
+
57 r"""!Cleanup routine calls onUnload() directly"""
+
58 logging.debug("[%s] onUnload()", self._pluginName)
+
59 self._pluginsActive.remove(self)
+
60 self.onUnload()
+
61
+
+
+
+ +

◆ _run()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase._run ( self,
bwPacket )
+
+protected
+
+ +

start an complete running turn of an plugin.

+

Calls setup(), alarm() and teardown() in this order. The alarm() method serves the BOSWatch packet to the plugin.

+
Parameters
+ + +
bwPacketA BOSWatch packet instance
+
+
+
62 def _run(self, bwPacket):
+
63 r"""!start an complete running turn of an plugin.
+
64 Calls setup(), alarm() and teardown() in this order.
+
65 The alarm() method serves the BOSWatch packet to the plugin.
+
66
+
67 @param bwPacket: A BOSWatch packet instance"""
+
68 self._runCount += 1
+
69 logging.debug("[%s] run #%d", self._pluginName, self._runCount)
+
70
+
71 self._bwPacket = bwPacket
+
72
+
73 tmpTime = time.time()
+
74 try:
+
75 logging.debug("[%s] setup()", self._pluginName)
+
76 self.setup()
+
77 except:
+
78 self._setupErrorCount += 1
+
79 logging.exception("[%s] error in setup()", self._pluginName)
+
80
+
81 self._setupTime = time.time() - tmpTime
+
82 tmpTime = time.time()
+
83 try:
+
84
+
85 if bwPacket.get("mode") == "fms":
+
86 logging.debug("[%s] fms()", self._pluginName)
+
87 self.fms(bwPacket)
+
88 if bwPacket.get("mode") == "pocsag":
+
89 logging.debug("[%s] pocsag()", self._pluginName)
+
90 self.pocsag(bwPacket)
+
91 if bwPacket.get("mode") == "zvei":
+
92 logging.debug("[%s] zvei()", self._pluginName)
+
93 self.zvei(bwPacket)
+
94 if bwPacket.get("mode") == "msg":
+
95 logging.debug("[%s] msg()", self._pluginName)
+
96 self.msg(bwPacket)
+
97 except:
+
98 self._alarmErrorCount += 1
+
99 logging.exception("[%s] alarm error", self._pluginName)
+
100
+
101 self._alarmTime = time.time() - tmpTime
+
102 tmpTime = time.time()
+
103 try:
+
104 logging.debug("[%s] teardown()", self._pluginName)
+
105 self.teardown()
+
106 except:
+
107 self._teardownErrorCount += 1
+
108 logging.exception("[%s] error in teardown()", self._pluginName)
+
109
+
110 self._teardownTime = time.time() - tmpTime
+
111 self._sumTime = self._setupTime + self._alarmTime + self._teardownTime
+
112 self._cumTime += self._sumTime
+
113
+
114 self._bwPacket = None
+
115
+
116 logging.debug("[%s] took %0.3f seconds", self._pluginName, self._sumTime)
+
117 # logging.debug("- setup: %0.2f sec.", self._setupTime)
+
118 # logging.debug("- alarm: %0.2f sec.", self._alarmTime)
+
119 # logging.debug("- teardown: %0.2f sec.", self._teardownTime)
+
120
+
121 return None
+
122
+
+
+
+ +

◆ _getStatistics()

+ +
+
+ + + + + +
+ + + + + + + +
plugin.pluginBase.PluginBase._getStatistics ( self)
+
+protected
+
+ +

Returns statistical information's from last plugin run.

+
Returns
Statistics as pyton dict
+
123 def _getStatistics(self):
+
124 r"""!Returns statistical information's from last plugin run
+
125
+
126 @return Statistics as pyton dict"""
+
127 stats = {"type": "plugin",
+
128 "runCount": self._runCount,
+
129 "sumTime": self._sumTime,
+
130 "cumTime": self._cumTime,
+
131 "setupTime": self._setupTime,
+
132 "alarmTime": self._alarmTime,
+
133 "teardownTime": self._teardownTime,
+
134 "setupErrorCount": self._setupErrorCount,
+
135 "alarmErrorCount": self._alarmErrorCount,
+
136 "teardownErrorCount": self._teardownErrorCount}
+
137 return stats
+
138
+
+
+
+ +

◆ onLoad()

+ +
+
+ + + + + + + +
plugin.pluginBase.PluginBase.onLoad ( self)
+
+ +

Called by import of the plugin can be inherited.

+ +

Reimplemented in plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
139 def onLoad(self):
+
140 r"""!Called by import of the plugin
+
141 can be inherited"""
+
142 pass
+
143
+
+
+
+ +

◆ setup()

+ +
+
+ + + + + + + +
plugin.pluginBase.PluginBase.setup ( self)
+
+ +

Called before alarm can be inherited.

+ +

Reimplemented in plugin.mysql.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
144 def setup(self):
+
145 r"""!Called before alarm
+
146 can be inherited"""
+
147 pass
+
148
+
+
+
+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm can be inherited.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented in plugin.divera.BoswatchPlugin, plugin.http.BoswatchPlugin, plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
149 def fms(self, bwPacket):
+
150 r"""!Called on FMS alarm
+
151 can be inherited
+
152
+
153 @param bwPacket: bwPacket instance"""
+
154 logging.warning("ZVEI not implemented in %s", self._pluginName)
+
155
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm can be inherited.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented in plugin.divera.BoswatchPlugin, plugin.http.BoswatchPlugin, plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
156 def pocsag(self, bwPacket):
+
157 r"""!Called on POCSAG alarm
+
158 can be inherited
+
159
+
160 @param bwPacket: bwPacket instance"""
+
161 logging.warning("POCSAG not implemented in %s", self._pluginName)
+
162
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm can be inherited.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented in plugin.divera.BoswatchPlugin, plugin.http.BoswatchPlugin, plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
163 def zvei(self, bwPacket):
+
164 r"""!Called on ZVEI alarm
+
165 can be inherited
+
166
+
167 @param bwPacket: bwPacket instance"""
+
168 logging.warning("ZVEI not implemented in %s", self._pluginName)
+
169
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase.msg ( self,
bwPacket )
+
+ +

Called on MSG packet can be inherited.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented in plugin.divera.BoswatchPlugin, plugin.http.BoswatchPlugin, plugin.mysql.BoswatchPlugin, plugin.telegram.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
170 def msg(self, bwPacket):
+
171 r"""!Called on MSG packet
+
172 can be inherited
+
173
+
174 @param bwPacket: bwPacket instance"""
+
175 logging.warning("MSG not implemented in %s", self._pluginName)
+
176
+
+
+
+ +

◆ teardown()

+ +
+
+ + + + + + + +
plugin.pluginBase.PluginBase.teardown ( self)
+
+ +

Called after alarm can be inherited.

+ +

Reimplemented in plugin.mysql.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
177 def teardown(self):
+
178 r"""!Called after alarm
+
179 can be inherited"""
+
180 pass
+
181
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
plugin.pluginBase.PluginBase.onUnload ( self)
+
+ +

Called on shutdown of boswatch can be inherited.

+ +

Reimplemented in plugin.mysql.BoswatchPlugin, and plugin.template_plugin.BoswatchPlugin.

+
182 def onUnload(self):
+
183 r"""!Called on shutdown of boswatch
+
184 can be inherited"""
+
185 pass
+
186
+
+
+
+ +

◆ parseWildcards()

+ +
+
+ + + + + + + + + + + +
plugin.pluginBase.PluginBase.parseWildcards ( self,
msg )
+
+ +

Return the message with parsed wildcards.

+
187 def parseWildcards(self, msg):
+
188 r"""!Return the message with parsed wildcards"""
+
189 if self._bwPacket is None:
+
190 logging.warning("wildcard replacing not allowed - no bwPacket set")
+
191 return msg
+
192 return wildcard.replaceWildcards(msg, self._bwPacket)
+
+
+
+

Field Documentation

+ +

◆ _pluginsActive

+ +
+
+ + + + + +
+ + + + +
list plugin.pluginBase.PluginBase._pluginsActive = []
+
+staticprotected
+
+ +
+
+ +

◆ _pluginName

+ +
+
+ + + + + +
+ + + + +
plugin.pluginBase.PluginBase._pluginName = pluginName
+
+protected
+
+ +
+
+ +

◆ config

+ +
+
+ + + + +
plugin.pluginBase.PluginBase.config = config
+
+ +
+
+ +

◆ _bwPacket

+ +
+
+ + + + + +
+ + + + +
plugin.pluginBase.PluginBase._bwPacket = None
+
+protected
+
+ +
+
+ +

◆ _sumTime

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._sumTime = 0
+
+protected
+
+ +
+
+ +

◆ _cumTime

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._cumTime = 0
+
+protected
+
+ +
+
+ +

◆ _setupTime

+ +
+
+ + + + + +
+ + + + +
plugin.pluginBase.PluginBase._setupTime = 0
+
+protected
+
+ +
+
+ +

◆ _alarmTime

+ +
+
+ + + + + +
+ + + + +
plugin.pluginBase.PluginBase._alarmTime = 0
+
+protected
+
+ +
+
+ +

◆ _teardownTime

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._teardownTime = 0
+
+protected
+
+ +
+
+ +

◆ _runCount

+ +
+
+ + + + + +
+ + + + +
plugin.pluginBase.PluginBase._runCount = 0
+
+protected
+
+ +
+
+ +

◆ _setupErrorCount

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._setupErrorCount = 0
+
+protected
+
+ +
+
+ +

◆ _alarmErrorCount

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._alarmErrorCount = 0
+
+protected
+
+ +
+
+ +

◆ _teardownErrorCount

+ +
+
+ + + + + +
+ + + + +
int plugin.pluginBase.PluginBase._teardownErrorCount = 0
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1plugin_base_1_1_plugin_base.js b/api/html/classplugin_1_1plugin_base_1_1_plugin_base.js new file mode 100644 index 0000000..99ec74d --- /dev/null +++ b/api/html/classplugin_1_1plugin_base_1_1_plugin_base.js @@ -0,0 +1,29 @@ +var classplugin_1_1plugin_base_1_1_plugin_base = +[ + [ "__init__", "classplugin_1_1plugin_base_1_1_plugin_base.html#ade82c0cd7c4c180dc62e5e6ca425d063", null ], + [ "_cleanup", "classplugin_1_1plugin_base_1_1_plugin_base.html#a176d74cf5854616fc0e716226d29716f", null ], + [ "_run", "classplugin_1_1plugin_base_1_1_plugin_base.html#a845b34feb0883393a1a521407ab37072", null ], + [ "_getStatistics", "classplugin_1_1plugin_base_1_1_plugin_base.html#a3689bf4fef985b41df640c79b2eb71b2", null ], + [ "onLoad", "classplugin_1_1plugin_base_1_1_plugin_base.html#a2fc30d6a8691b7b1c2b7c1431a6dfa67", null ], + [ "setup", "classplugin_1_1plugin_base_1_1_plugin_base.html#afe097ea5f51321784754e168ac1ca6d6", null ], + [ "fms", "classplugin_1_1plugin_base_1_1_plugin_base.html#afbeb6510e88e221358df19636cffe0be", null ], + [ "pocsag", "classplugin_1_1plugin_base_1_1_plugin_base.html#a1a9a3bc59e6e2737839138f098ba4fe5", null ], + [ "zvei", "classplugin_1_1plugin_base_1_1_plugin_base.html#af2d08ecea66961db0fd70e79927e7b80", null ], + [ "msg", "classplugin_1_1plugin_base_1_1_plugin_base.html#a9b7266a1e9e343c185181ad273a2fde2", null ], + [ "teardown", "classplugin_1_1plugin_base_1_1_plugin_base.html#afbb808defd32c1cfc2714eba2f79654c", null ], + [ "onUnload", "classplugin_1_1plugin_base_1_1_plugin_base.html#a3b3164e45d334ca2dab14f28d352334b", null ], + [ "parseWildcards", "classplugin_1_1plugin_base_1_1_plugin_base.html#a75eb26af5668918fba36fd5fc795a66b", null ], + [ "_pluginsActive", "classplugin_1_1plugin_base_1_1_plugin_base.html#a115d9600af538a3b7b2cf63225361cfc", null ], + [ "_pluginName", "classplugin_1_1plugin_base_1_1_plugin_base.html#a30f6b8fcaef2e480f3c4e270ed400a05", null ], + [ "config", "classplugin_1_1plugin_base_1_1_plugin_base.html#a5c82d6def9c98bd482fa88248c4f355c", null ], + [ "_bwPacket", "classplugin_1_1plugin_base_1_1_plugin_base.html#a049f3c84ba64856a66532d60a7b3c823", null ], + [ "_sumTime", "classplugin_1_1plugin_base_1_1_plugin_base.html#ae5d1664183b8986df4c61ebc96fb8483", null ], + [ "_cumTime", "classplugin_1_1plugin_base_1_1_plugin_base.html#a69bcc46e64dbaddf524f49adb246a491", null ], + [ "_setupTime", "classplugin_1_1plugin_base_1_1_plugin_base.html#a55a4a34b3f98ae8162633a0caf77eea6", null ], + [ "_alarmTime", "classplugin_1_1plugin_base_1_1_plugin_base.html#ab8555502760f06321573b32b20a07093", null ], + [ "_teardownTime", "classplugin_1_1plugin_base_1_1_plugin_base.html#aeb241bbb7f19b71ec1d0e64be490f445", null ], + [ "_runCount", "classplugin_1_1plugin_base_1_1_plugin_base.html#abdb7ee79ffd6c4145fa5240b542c8187", null ], + [ "_setupErrorCount", "classplugin_1_1plugin_base_1_1_plugin_base.html#a9968925b171eea70507286142e8a442d", null ], + [ "_alarmErrorCount", "classplugin_1_1plugin_base_1_1_plugin_base.html#ab9145f156441739cf1cd9d1b4a5e67c9", null ], + [ "_teardownErrorCount", "classplugin_1_1plugin_base_1_1_plugin_base.html#abb9f93add76f10d02c72f75f1034e2ad", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.html b/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.html new file mode 100644 index 0000000..f8ea4a6 --- /dev/null +++ b/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.html @@ -0,0 +1,547 @@ + + + + + + + +BOSWatch 3: plugin.telegram.BoswatchPlugin Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.telegram.BoswatchPlugin Class Reference
+
+
+ +

Description of the Plugin. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin.
 
 fms (self, bwPacket)
 Called on FMS alarm.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm.
 
 msg (self, bwPacket)
 Called on MSG packet.
 
- Public Member Functions inherited from plugin.pluginBase.PluginBase
 setup (self)
 Called before alarm can be inherited.
 
 teardown (self)
 Called after alarm can be inherited.
 
 onUnload (self)
 Called on shutdown of boswatch can be inherited.
 
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + + + + +

+Data Fields

 bot = MQBot(token=self.config.get("botToken", default=""), request=request, mqueue=q)
 
- Data Fields inherited from plugin.pluginBase.PluginBase
 config = config
 
+ + + + + + + + + + + + + + + +

+Protected Member Functions

 _sendMessage (self, message)
 
 _sendLocation (self, lat, lon)
 
- Protected Member Functions inherited from plugin.pluginBase.PluginBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from plugin.pluginBase.PluginBase
 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
- Static Protected Attributes inherited from plugin.pluginBase.PluginBase
list _pluginsActive = []
 
+

Detailed Description

+

Description of the Plugin.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
56 def __init__(self, config):
+
57 r"""!Do not change anything here!"""
+
58 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
59
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
plugin.telegram.BoswatchPlugin.onLoad ( self)
+
+ +

Called by import of the plugin.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
60 def onLoad(self):
+
61 r"""!Called by import of the plugin"""
+
62 if self.config.get("queue", default=True):
+
63 q = mq.MessageQueue()
+
64 request = Request(con_pool_size=8)
+
65 self.bot = MQBot(token=self.config.get("botToken", default=""), request=request, mqueue=q)
+
66 print('queue')
+
67 else:
+
68 self.bot = telegram.Bot(token=self.config.get("botToken"))
+
69 print('normal')
+
70
+
+
+
+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
71 def fms(self, bwPacket):
+
72 r"""!Called on FMS alarm
+
73
+
74 @param bwPacket: bwPacket instance"""
+
75 msg = self.parseWildcards(self.config.get("message_fms", default="{FMS}"))
+
76 self._sendMessage(msg)
+
77
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
78 def pocsag(self, bwPacket):
+
79 r"""!Called on POCSAG alarm
+
80
+
81 @param bwPacket: bwPacket instance"""
+
82 msg = self.parseWildcards(self.config.get("message_pocsag", default="{RIC}({SRIC})\n{MSG}"))
+
83 self._sendMessage(msg)
+
84
+
85 if bwPacket.get("lat") is not None and bwPacket.get("lon") is not None:
+
86 logging.debug("Found coordinates in packet")
+
87 (lat, lon) = (bwPacket.get("lat"), bwPacket.get("lon"))
+
88 self._sendLocation(lat, lon)
+
89
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
90 def zvei(self, bwPacket):
+
91 r"""!Called on ZVEI alarm
+
92
+
93 @param bwPacket: bwPacket instance"""
+
94 msg = self.parseWildcards(self.config.get("message_zvei", default="{TONE}"))
+
95 self._sendMessage(msg)
+
96
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin.msg ( self,
bwPacket )
+
+ +

Called on MSG packet.

+
Parameters
+ + +
bwPacketbwPacket instance
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
97 def msg(self, bwPacket):
+
98 r"""!Called on MSG packet
+
99
+
100 @param bwPacket: bwPacket instance"""
+
101 msg = self.parseWildcards(self.config.get("message_msg"))
+
102 self._sendMessage(msg)
+
103
+
+
+
+ +

◆ _sendMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
plugin.telegram.BoswatchPlugin._sendMessage ( self,
message )
+
+protected
+
+
104 def _sendMessage(self, message):
+
105 for chatId in self.config.get("chatIds", default=[]):
+
106 try:
+
107 # Send Message via Telegram
+
108 logging.info("Sending message to " + chatId)
+
109 self.bot.send_message(chat_id=chatId, text=message)
+
110
+
111 except Unauthorized:
+
112 logging.exception("Error while sending Telegram Message, please Check your api-key")
+
113 except (TimedOut, NetworkError):
+
114 logging.exception("Error while sending Telegram Message, please Check your connectivity")
+
115 except (BadRequest, TelegramError):
+
116 logging.exception("Error while sending Telegram Message")
+
117 except Exception as e:
+
118 logging.exception("Unknown Error while sending Telegram Message: " + str(type(e).__name__) + ": " + str(e))
+
119
+
+
+
+ +

◆ _sendLocation()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
plugin.telegram.BoswatchPlugin._sendLocation ( self,
lat,
lon )
+
+protected
+
+
120 def _sendLocation(self, lat, lon):
+
121 for chatId in self.config.get("chatIds", default=[]):
+
122 try:
+
123 # Send Location via Telegram
+
124 if lat is not None and lon is not None:
+
125 logging.info("Sending location to " + chatId)
+
126 self.bot.sendLocation(chat_id=chatId, latitude=lat, longitude=lon)
+
127
+
128 except Unauthorized:
+
129 logging.exception("Error while sending Telegram Message, please Check your api-key")
+
130 except (TimedOut, NetworkError):
+
131 logging.exception("Error while sending Telegram Message, please Check your connectivity")
+
132 except (BadRequest, TelegramError):
+
133 logging.exception("Error while sending Telegram Message")
+
134 except Exception as e:
+
135 logging.exception("Unknown Error while sending Telegram Message: " + str(type(e).__name__) + ": " + str(e))
+
+
+
+

Field Documentation

+ +

◆ bot

+ +
+
+ + + + +
plugin.telegram.BoswatchPlugin.bot = MQBot(token=self.config.get("botToken", default=""), request=request, mqueue=q)
+
+ +
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.js b/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.js new file mode 100644 index 0000000..e38328c --- /dev/null +++ b/api/html/classplugin_1_1telegram_1_1_boswatch_plugin.js @@ -0,0 +1,12 @@ +var classplugin_1_1telegram_1_1_boswatch_plugin = +[ + [ "__init__", "classplugin_1_1telegram_1_1_boswatch_plugin.html#a07bd64a5b06e7a16d4438dd4fd231edb", null ], + [ "onLoad", "classplugin_1_1telegram_1_1_boswatch_plugin.html#a31348dca1c54dfd0dd268ee0c80089a3", null ], + [ "fms", "classplugin_1_1telegram_1_1_boswatch_plugin.html#aa118f52c5984d55acddb6823678bd30c", null ], + [ "pocsag", "classplugin_1_1telegram_1_1_boswatch_plugin.html#adfc28616ddda41af1b7980fbb1a5b617", null ], + [ "zvei", "classplugin_1_1telegram_1_1_boswatch_plugin.html#afa8a57888af2b30126ae6826b1873135", null ], + [ "msg", "classplugin_1_1telegram_1_1_boswatch_plugin.html#aa2cdc668f9e09149417a3481252f50d9", null ], + [ "_sendMessage", "classplugin_1_1telegram_1_1_boswatch_plugin.html#a776065ec08ddb1412c9212a97b054596", null ], + [ "_sendLocation", "classplugin_1_1telegram_1_1_boswatch_plugin.html#accea7cd16ddb267acd6f393628ec23d6", null ], + [ "bot", "classplugin_1_1telegram_1_1_boswatch_plugin.html#ab5d363141b79cd5a3d6c701d091c77b8", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1telegram_1_1_m_q_bot.html b/api/html/classplugin_1_1telegram_1_1_m_q_bot.html new file mode 100644 index 0000000..af47808 --- /dev/null +++ b/api/html/classplugin_1_1telegram_1_1_m_q_bot.html @@ -0,0 +1,285 @@ + + + + + + + +BOSWatch 3: plugin.telegram.MQBot Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.telegram.MQBot Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

 __init__ (self, *args, is_queued_def=True, mqueue=None, **kwargs)
 
 __del__ (self)
 
 send_message (self, *args, **kwargs)
 
+ + + + + +

+Protected Attributes

 _is_messages_queued_default = is_queued_def
 
 _msg_queue = mqueue or mq.MessageQueue()
 
+

Detailed Description

+
A subclass of Bot which delegates send method handling to MQ

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
plugin.telegram.MQBot.__init__ ( self,
* args,
is_queued_def = True,
mqueue = None,
** kwargs )
+
+
34 def __init__(self, *args, is_queued_def=True, mqueue=None, **kwargs):
+
35 super(MQBot, self).__init__(*args, **kwargs)
+
36 # below 2 attributes should be provided for decorator usage
+
37 self._is_messages_queued_default = is_queued_def
+
38 self._msg_queue = mqueue or mq.MessageQueue()
+
39
+
+
+
+ +

◆ __del__()

+ +
+
+ + + + + + + +
plugin.telegram.MQBot.__del__ ( self)
+
+
40 def __del__(self):
+
41 try:
+
42 self._msg_queue.stop()
+
43 except:
+
44 pass
+
45
+
+
+
+

Member Function Documentation

+ +

◆ send_message()

+ +
+
+ + + + + + + + + + + + + + + + +
plugin.telegram.MQBot.send_message ( self,
* args,
** kwargs )
+
+
Wrapped method would accept new `queued` and `isgroup`
+OPTIONAL arguments
47 def send_message(self, *args, **kwargs):
+
48 '''Wrapped method would accept new `queued` and `isgroup`
+
49 OPTIONAL arguments'''
+
50 return super(MQBot, self).send_message(*args, **kwargs)
+
51
+
52
+
+
+
+

Field Documentation

+ +

◆ _is_messages_queued_default

+ +
+
+ + + + + +
+ + + + +
plugin.telegram.MQBot._is_messages_queued_default = is_queued_def
+
+protected
+
+ +
+
+ +

◆ _msg_queue

+ +
+
+ + + + + +
+ + + + +
plugin.telegram.MQBot._msg_queue = mqueue or mq.MessageQueue()
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1telegram_1_1_m_q_bot.js b/api/html/classplugin_1_1telegram_1_1_m_q_bot.js new file mode 100644 index 0000000..fb1e050 --- /dev/null +++ b/api/html/classplugin_1_1telegram_1_1_m_q_bot.js @@ -0,0 +1,8 @@ +var classplugin_1_1telegram_1_1_m_q_bot = +[ + [ "__init__", "classplugin_1_1telegram_1_1_m_q_bot.html#a67cb2a543fc2dcf6c8e25493ee3dcd16", null ], + [ "__del__", "classplugin_1_1telegram_1_1_m_q_bot.html#a83cf2befc52ad0318c6f274a4f4e7106", null ], + [ "send_message", "classplugin_1_1telegram_1_1_m_q_bot.html#a792ef18fa266853822ec53862a32264a", null ], + [ "_is_messages_queued_default", "classplugin_1_1telegram_1_1_m_q_bot.html#a507bb5109a57f3ae4f424deedb44c9c9", null ], + [ "_msg_queue", "classplugin_1_1telegram_1_1_m_q_bot.html#a9f38fd67d29650b5976e4794b324c6b1", null ] +]; \ No newline at end of file diff --git a/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.html b/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.html new file mode 100644 index 0000000..4b2e528 --- /dev/null +++ b/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.html @@ -0,0 +1,489 @@ + + + + + + + +BOSWatch 3: plugin.template_plugin.BoswatchPlugin Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.template_plugin.BoswatchPlugin Class Reference
+
+
+ +

Description of the Plugin. + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 Do not change anything here!
 
 onLoad (self)
 Called by import of the plugin Remove if not implemented.
 
 setup (self)
 Called before alarm Remove if not implemented.
 
 fms (self, bwPacket)
 Called on FMS alarm.
 
 pocsag (self, bwPacket)
 Called on POCSAG alarm.
 
 zvei (self, bwPacket)
 Called on ZVEI alarm.
 
 msg (self, bwPacket)
 Called on MSG packet.
 
 teardown (self)
 Called after alarm Remove if not implemented.
 
 onUnload (self)
 Called by destruction of the plugin Remove if not implemented.
 
- Public Member Functions inherited from plugin.pluginBase.PluginBase
 parseWildcards (self, msg)
 Return the message with parsed wildcards.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Data Fields inherited from plugin.pluginBase.PluginBase
 config = config
 
- Protected Member Functions inherited from plugin.pluginBase.PluginBase
 _cleanup (self)
 Cleanup routine calls onUnload() directly.
 
 _run (self, bwPacket)
 start an complete running turn of an plugin.
 
 _getStatistics (self)
 Returns statistical information's from last plugin run.
 
- Protected Attributes inherited from plugin.pluginBase.PluginBase
 _pluginName = pluginName
 
 _bwPacket = None
 
int _sumTime = 0
 
int _cumTime = 0
 
int _setupTime = 0
 
int _alarmTime = 0
 
int _teardownTime = 0
 
int _runCount = 0
 
int _setupErrorCount = 0
 
int _alarmErrorCount = 0
 
int _teardownErrorCount = 0
 
- Static Protected Attributes inherited from plugin.pluginBase.PluginBase
list _pluginsActive = []
 
+

Detailed Description

+

Description of the Plugin.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
plugin.template_plugin.BoswatchPlugin.__init__ ( self,
config )
+
+ +

Do not change anything here!

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
30 def __init__(self, config):
+
31 r"""!Do not change anything here!"""
+
32 super().__init__(__name__, config) # you can access the config class on 'self.config'
+
33
+
+
+
+

Member Function Documentation

+ +

◆ onLoad()

+ +
+
+ + + + + + + +
plugin.template_plugin.BoswatchPlugin.onLoad ( self)
+
+ +

Called by import of the plugin Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
34 def onLoad(self):
+
35 r"""!Called by import of the plugin
+
36 Remove if not implemented"""
+
37 pass
+
38
+
+
+
+ +

◆ setup()

+ +
+
+ + + + + + + +
plugin.template_plugin.BoswatchPlugin.setup ( self)
+
+ +

Called before alarm Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
39 def setup(self):
+
40 r"""!Called before alarm
+
41 Remove if not implemented"""
+
42 pass
+
43
+
+
+
+ +

◆ fms()

+ +
+
+ + + + + + + + + + + +
plugin.template_plugin.BoswatchPlugin.fms ( self,
bwPacket )
+
+ +

Called on FMS alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
44 def fms(self, bwPacket):
+
45 r"""!Called on FMS alarm
+
46
+
47 @param bwPacket: bwPacket instance
+
48 Remove if not implemented"""
+
49 pass
+
50
+
+
+
+ +

◆ pocsag()

+ +
+
+ + + + + + + + + + + +
plugin.template_plugin.BoswatchPlugin.pocsag ( self,
bwPacket )
+
+ +

Called on POCSAG alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
51 def pocsag(self, bwPacket):
+
52 r"""!Called on POCSAG alarm
+
53
+
54 @param bwPacket: bwPacket instance
+
55 Remove if not implemented"""
+
56 pass
+
57
+
+
+
+ +

◆ zvei()

+ +
+
+ + + + + + + + + + + +
plugin.template_plugin.BoswatchPlugin.zvei ( self,
bwPacket )
+
+ +

Called on ZVEI alarm.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
58 def zvei(self, bwPacket):
+
59 r"""!Called on ZVEI alarm
+
60
+
61 @param bwPacket: bwPacket instance
+
62 Remove if not implemented"""
+
63 pass
+
64
+
+
+
+ +

◆ msg()

+ +
+
+ + + + + + + + + + + +
plugin.template_plugin.BoswatchPlugin.msg ( self,
bwPacket )
+
+ +

Called on MSG packet.

+
Parameters
+ + +
bwPacketbwPacket instance Remove if not implemented
+
+
+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
65 def msg(self, bwPacket):
+
66 r"""!Called on MSG packet
+
67
+
68 @param bwPacket: bwPacket instance
+
69 Remove if not implemented"""
+
70 pass
+
71
+
+
+
+ +

◆ teardown()

+ +
+
+ + + + + + + +
plugin.template_plugin.BoswatchPlugin.teardown ( self)
+
+ +

Called after alarm Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
72 def teardown(self):
+
73 r"""!Called after alarm
+
74 Remove if not implemented"""
+
75 pass
+
76
+
+
+
+ +

◆ onUnload()

+ +
+
+ + + + + + + +
plugin.template_plugin.BoswatchPlugin.onUnload ( self)
+
+ +

Called by destruction of the plugin Remove if not implemented.

+ +

Reimplemented from plugin.pluginBase.PluginBase.

+
77 def onUnload(self):
+
78 r"""!Called by destruction of the plugin
+
79 Remove if not implemented"""
+
80 pass
+
+
+
+
+
+ + + + diff --git a/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.js b/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.js new file mode 100644 index 0000000..d13f747 --- /dev/null +++ b/api/html/classplugin_1_1template__plugin_1_1_boswatch_plugin.js @@ -0,0 +1,12 @@ +var classplugin_1_1template__plugin_1_1_boswatch_plugin = +[ + [ "__init__", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#adc94a0cafa6b6ff4d3b837fd6ac874a4", null ], + [ "onLoad", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#ac2e80b20bc4e7bbdccf6c821207a70ac", null ], + [ "setup", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a7aa0048b112116e841e7aeac7c6d92a7", null ], + [ "fms", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a101a2602e3dcd19bd70bed75721219e7", null ], + [ "pocsag", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a15a07ec58d94ad4e52339d6f5b0bc38b", null ], + [ "zvei", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af5c36cb43b625a31e660b874b4ed03f5", null ], + [ "msg", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a58590a4f45b3a56ae86e08988176c884", null ], + [ "teardown", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af332cd897823565ab3fbebf16e72c657", null ], + [ "onUnload", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af72d5ae2c1ae6a85c1582addc03aef7e", null ] +]; \ No newline at end of file diff --git a/api/html/clipboard.js b/api/html/clipboard.js new file mode 100644 index 0000000..42c1fb0 --- /dev/null +++ b/api/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/api/html/closed.png b/api/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..ca22860afcbc0fabc4a072eca0a591492f5dbe68 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8 + + + + + + +BOSWatch 3: filter Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
filter Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_13e138d54eb8818da29c3992edef070a.html b/api/html/dir_13e138d54eb8818da29c3992edef070a.html new file mode 100644 index 0000000..4815432 --- /dev/null +++ b/api/html/dir_13e138d54eb8818da29c3992edef070a.html @@ -0,0 +1,129 @@ + + + + + + + +BOSWatch 3: test Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
test Directory Reference
+
+
+ + + + + + + + +

+Directories

 boswatch
 
 module
 
 plugin
 
+
+
+ + + + diff --git a/api/html/dir_18ba14bdafca2d5fe76631d8c96c7756.html b/api/html/dir_18ba14bdafca2d5fe76631d8c96c7756.html new file mode 100644 index 0000000..72e842f --- /dev/null +++ b/api/html/dir_18ba14bdafca2d5fe76631d8c96c7756.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: router Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
router Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_2006f8608b07fda10f64d4c6574ce610.html b/api/html/dir_2006f8608b07fda10f64d4c6574ce610.html new file mode 100644 index 0000000..9fd3fb6 --- /dev/null +++ b/api/html/dir_2006f8608b07fda10f64d4c6574ce610.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: network Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
network Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_43da38551d4977a390038d31b18749ea.html b/api/html/dir_43da38551d4977a390038d31b18749ea.html new file mode 100644 index 0000000..6ef7625 --- /dev/null +++ b/api/html/dir_43da38551d4977a390038d31b18749ea.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: decoder Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
decoder Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_4cd0c9eca83862460f0369248cfc2f5b.html b/api/html/dir_4cd0c9eca83862460f0369248cfc2f5b.html new file mode 100644 index 0000000..3e19af5 --- /dev/null +++ b/api/html/dir_4cd0c9eca83862460f0369248cfc2f5b.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: utils Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
utils Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_814a05153877d296d2f0b8283bfee1e3.html b/api/html/dir_814a05153877d296d2f0b8283bfee1e3.html new file mode 100644 index 0000000..d6682e7 --- /dev/null +++ b/api/html/dir_814a05153877d296d2f0b8283bfee1e3.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: inputSource Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
inputSource Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_8f20f41be9704e4cc35f0dc735991ad7.html b/api/html/dir_8f20f41be9704e4cc35f0dc735991ad7.html new file mode 100644 index 0000000..6fd71f7 --- /dev/null +++ b/api/html/dir_8f20f41be9704e4cc35f0dc735991ad7.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: plugin Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
plugin Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_a401edae9efb638176fb2226123ed9a0.html b/api/html/dir_a401edae9efb638176fb2226123ed9a0.html new file mode 100644 index 0000000..351f2d5 --- /dev/null +++ b/api/html/dir_a401edae9efb638176fb2226123ed9a0.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: module Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
module Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_a7b0466279106ea0b8f86f609f621680.html b/api/html/dir_a7b0466279106ea0b8f86f609f621680.html new file mode 100644 index 0000000..e7d471a --- /dev/null +++ b/api/html/dir_a7b0466279106ea0b8f86f609f621680.html @@ -0,0 +1,125 @@ + + + + + + + +BOSWatch 3: module Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
module Directory Reference
+
+
+ + + + +

+Directories

 filter
 
+
+
+ + + + diff --git a/api/html/dir_b4c3aec6cd8f28418150dce663061cfa.html b/api/html/dir_b4c3aec6cd8f28418150dce663061cfa.html new file mode 100644 index 0000000..69aece5 --- /dev/null +++ b/api/html/dir_b4c3aec6cd8f28418150dce663061cfa.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: plugin Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
plugin Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_c3c55799aed6b6d9e14d19d26506d0dd.html b/api/html/dir_c3c55799aed6b6d9e14d19d26506d0dd.html new file mode 100644 index 0000000..27d1f3e --- /dev/null +++ b/api/html/dir_c3c55799aed6b6d9e14d19d26506d0dd.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: boswatch Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
boswatch Directory Reference
+
+
+
+
+ + + + diff --git a/api/html/dir_f49b800a024456700a737074495380af.html b/api/html/dir_f49b800a024456700a737074495380af.html new file mode 100644 index 0000000..032f591 --- /dev/null +++ b/api/html/dir_f49b800a024456700a737074495380af.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: boswatch Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
boswatch Directory Reference
+
+
+ + + + + + + + + + + + +

+Directories

 decoder
 
 inputSource
 
 network
 
 router
 
 utils
 
+
+
+ + + + diff --git a/api/html/doc.svg b/api/html/doc.svg new file mode 100644 index 0000000..e50e6d3 --- /dev/null +++ b/api/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/html/docd.svg b/api/html/docd.svg new file mode 100644 index 0000000..998a1ab --- /dev/null +++ b/api/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/html/doxygen.css b/api/html/doxygen.css new file mode 100644 index 0000000..3f76126 --- /dev/null +++ b/api/html/doxygen.css @@ -0,0 +1,2247 @@ +/* The standard CSS for doxygen 1.12.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #284D95; +--page-visited-link-color: #2F59AE; + +/* index */ +--index-odd-item-bg-color: #F6F8FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F8F9FD; +--header-separator-color: #B9CAEC; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #7194D8; +--group-header-color: #234382; +--inherit-header-color: gray; + +--footer-foreground-color: #1B3466; +--footer-logo-width: 104px; +--citation-label-color: #213F7B; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #3666C7; +--directory-separator-color: #8AA6DF; +--separator-color: #325EB8; + +--blockquote-background-color: #F5F7FC; +--blockquote-border-color: #8AA6DF; + +--scrollbar-thumb-color: #8AA6DF; +--scrollbar-background-color: #F8F9FD; + +--icon-background-color: #5981D1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F8F9FD; +--memdecl-separator-color: #D7E1F4; +--memdecl-foreground-color: #555; +--memdecl-template-color: #2F59AE; + +/* detailed member list */ +--memdef-border-color: #98B1E3; +--memdef-title-background-color: #DDE5F5; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #D9E2F4; +--memdef-proto-text-color: #182D58; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #2F59AE; + +/* tables */ +--table-cell-border-color: #1D386C; +--table-header-background-color: #244587; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #5981D1; +--label-left-top-border-color: #3666C7; +--label-right-bottom-border-color: #B9CAEC; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F8F9FD; +--nav-foreground-color: #234384; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #B6C8EB; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #1A3160; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #234384; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #8AA6DF; +--nav-arrow-selected-color: #8AA6DF; + +/* table of contents */ +--toc-background-color: #F2F5FB; +--toc-border-color: #D1DCF2; +--toc-header-color: #2F59AE; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F8F9FD; +--search-filter-foreground-color: black; +--search-filter-border-color: #7B9BDB; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #284D95; +--search-results-foreground-color: #2C53A2; +--search-results-background-color: #EAEFF9; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #2F59AE; +--code-external-link-color: #2F59AE; +--fragment-foreground-color: black; +--fragment-background-color: #FAFBFD; +--fragment-border-color: #B9CAEC; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #2F59AE; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #2F59AE; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #2F59AE; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #7B9BDB; +--page-visited-link-color: #92ACE1; + +/* index */ +--index-odd-item-bg-color: #060D19; +--index-even-item-bg-color: black; +--index-header-color: #B9CAEC; +--index-separator-color: #213F7B; + +/* header */ +--header-background-color: #040810; +--header-separator-color: #0C172E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #1A3160; +--group-header-color: #7B9BDB; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #3E6DCA; +--footer-logo-width: 60px; +--citation-label-color: #7B9BDB; +--glow-color: cyan; + +--title-background-color: #050A15; +--title-separator-color: #224280; +--directory-separator-color: #1A3160; +--separator-color: #1A3160; + +--blockquote-background-color: #0A1326; +--blockquote-border-color: #1A3160; + +--scrollbar-thumb-color: #1A3160; +--scrollbar-background-color: #040810; + +--icon-background-color: #213F7B; +--icon-foreground-color: #B9CAEC; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #060D19; +--memdecl-separator-color: #1C3669; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #648AD5; + +/* detailed member list */ +--memdef-border-color: #162A53; +--memdef-title-background-color: #112141; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #101E3B; +--memdef-proto-text-color: #8BA7DF; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #648AD5; + +/* tables */ +--table-cell-border-color: #1A3160; +--table-header-background-color: #1A3160; +--table-header-foreground-color: #B9CAEC; + +/* labels */ +--label-background-color: #234382; +--label-left-top-border-color: #2F59AE; +--label-right-bottom-border-color: #1A3160; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #0A1326; +--nav-foreground-color: #234384; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #1B3466; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #A9BDE7; +--nav-text-hover-color: #D5DFF3; +--nav-text-active-color: #D5DFF3; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #A9BDE7; +--nav-menu-background-color: #03060B; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #213F7B; +--nav-arrow-selected-color: #7B9BDB; + +/* table of contents */ +--toc-background-color: #0D1830; +--toc-border-color: #14274B; +--toc-header-color: #92ACE1; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #0A1326; +--search-filter-foreground-color: #7B9BDB; +--search-filter-border-color: #648AD5; +--search-filter-highlight-text-color: #B0C3E9; +--search-filter-highlight-bg-color: #1A3160; +--search-results-background-color: #0A1326; +--search-results-foreground-color: #7B9BDB; +--search-results-border-color: #648AD5; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #1E3A71; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #050A15; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* + +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention, dl.important { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/html/doxygen.svg b/api/html/doxygen.svg new file mode 100644 index 0000000..793f9a8 --- /dev/null +++ b/api/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/html/doxygen_crawl.html b/api/html/doxygen_crawl.html new file mode 100644 index 0000000..6edce74 --- /dev/null +++ b/api/html/doxygen_crawl.html @@ -0,0 +1,712 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/html/dynsections.js b/api/html/dynsections.js new file mode 100644 index 0000000..b05f4c8 --- /dev/null +++ b/api/html/dynsections.js @@ -0,0 +1,198 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/api/html/folderclosed.svg b/api/html/folderclosed.svg new file mode 100644 index 0000000..420e93a --- /dev/null +++ b/api/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/html/folderclosedd.svg b/api/html/folderclosedd.svg new file mode 100644 index 0000000..99a4982 --- /dev/null +++ b/api/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/html/folderopen.svg b/api/html/folderopen.svg new file mode 100644 index 0000000..ae6b7f5 --- /dev/null +++ b/api/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/html/folderopend.svg b/api/html/folderopend.svg new file mode 100644 index 0000000..a52edfd --- /dev/null +++ b/api/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/html/functions.html b/api/html/functions.html new file mode 100644 index 0000000..feecc21 --- /dev/null +++ b/api/html/functions.html @@ -0,0 +1,196 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- _ -

+
+
+ + + + diff --git a/api/html/functions_a.html b/api/html/functions_a.html new file mode 100644 index 0000000..5b20a40 --- /dev/null +++ b/api/html/functions_a.html @@ -0,0 +1,122 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- a -

+
+
+ + + + diff --git a/api/html/functions_b.html b/api/html/functions_b.html new file mode 100644 index 0000000..78b5ac0 --- /dev/null +++ b/api/html/functions_b.html @@ -0,0 +1,121 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- b -

+
+
+ + + + diff --git a/api/html/functions_c.html b/api/html/functions_c.html new file mode 100644 index 0000000..60c2a03 --- /dev/null +++ b/api/html/functions_c.html @@ -0,0 +1,129 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ + + + diff --git a/api/html/functions_d.html b/api/html/functions_d.html new file mode 100644 index 0000000..4cae9fb --- /dev/null +++ b/api/html/functions_d.html @@ -0,0 +1,122 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ + + + + + diff --git a/api/html/functions_dup.js b/api/html/functions_dup.js new file mode 100644 index 0000000..e640895 --- /dev/null +++ b/api/html/functions_dup.js @@ -0,0 +1,21 @@ +var functions_dup = +[ + [ "_", "functions.html", null ], + [ "a", "functions_a.html", null ], + [ "b", "functions_b.html", null ], + [ "c", "functions_c.html", null ], + [ "d", "functions_d.html", null ], + [ "f", "functions_f.html", null ], + [ "g", "functions_g.html", null ], + [ "h", "functions_h.html", null ], + [ "i", "functions_i.html", null ], + [ "l", "functions_l.html", null ], + [ "m", "functions_m.html", null ], + [ "n", "functions_n.html", null ], + [ "o", "functions_o.html", null ], + [ "p", "functions_p.html", null ], + [ "r", "functions_r.html", null ], + [ "s", "functions_s.html", null ], + [ "t", "functions_t.html", null ], + [ "z", "functions_z.html", null ] +]; \ No newline at end of file diff --git a/api/html/functions_f.html b/api/html/functions_f.html new file mode 100644 index 0000000..34542c8 --- /dev/null +++ b/api/html/functions_f.html @@ -0,0 +1,120 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- f -

+
+
+ + + + diff --git a/api/html/functions_func.html b/api/html/functions_func.html new file mode 100644 index 0000000..4581c99 --- /dev/null +++ b/api/html/functions_func.html @@ -0,0 +1,256 @@ + + + + + + + +BOSWatch 3: Data Fields - Functions + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the structures/unions they belong to:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- z -

+
+
+ + + + diff --git a/api/html/functions_g.html b/api/html/functions_g.html new file mode 100644 index 0000000..1aadb91 --- /dev/null +++ b/api/html/functions_g.html @@ -0,0 +1,124 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- g -

+
+
+ + + + diff --git a/api/html/functions_h.html b/api/html/functions_h.html new file mode 100644 index 0000000..4c5f6ed --- /dev/null +++ b/api/html/functions_h.html @@ -0,0 +1,120 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- h -

+
+
+ + + + diff --git a/api/html/functions_i.html b/api/html/functions_i.html new file mode 100644 index 0000000..94798ba --- /dev/null +++ b/api/html/functions_i.html @@ -0,0 +1,121 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- i -

+
+
+ + + + diff --git a/api/html/functions_l.html b/api/html/functions_l.html new file mode 100644 index 0000000..e6fb7bb --- /dev/null +++ b/api/html/functions_l.html @@ -0,0 +1,121 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- l -

+
+
+ + + + diff --git a/api/html/functions_m.html b/api/html/functions_m.html new file mode 100644 index 0000000..e469adf --- /dev/null +++ b/api/html/functions_m.html @@ -0,0 +1,120 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- m -

+
+
+ + + + diff --git a/api/html/functions_n.html b/api/html/functions_n.html new file mode 100644 index 0000000..6dd7d9d --- /dev/null +++ b/api/html/functions_n.html @@ -0,0 +1,120 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- n -

+
+
+ + + + diff --git a/api/html/functions_o.html b/api/html/functions_o.html new file mode 100644 index 0000000..9f32fee --- /dev/null +++ b/api/html/functions_o.html @@ -0,0 +1,122 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ + + + + + diff --git a/api/html/functions_p.html b/api/html/functions_p.html new file mode 100644 index 0000000..ad0036e --- /dev/null +++ b/api/html/functions_p.html @@ -0,0 +1,122 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- p -

+
+
+ + + + diff --git a/api/html/functions_r.html b/api/html/functions_r.html new file mode 100644 index 0000000..117d50c --- /dev/null +++ b/api/html/functions_r.html @@ -0,0 +1,126 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- r -

+
+
+ + + + diff --git a/api/html/functions_s.html b/api/html/functions_s.html new file mode 100644 index 0000000..778f201 --- /dev/null +++ b/api/html/functions_s.html @@ -0,0 +1,136 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ + + + + + diff --git a/api/html/functions_t.html b/api/html/functions_t.html new file mode 100644 index 0000000..7d128bf --- /dev/null +++ b/api/html/functions_t.html @@ -0,0 +1,121 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- t -

+
+
+ + + + diff --git a/api/html/functions_vars.html b/api/html/functions_vars.html new file mode 100644 index 0000000..c4680f8 --- /dev/null +++ b/api/html/functions_vars.html @@ -0,0 +1,223 @@ + + + + + + + +BOSWatch 3: Data Fields - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all variables with links to the structures/unions they belong to:
+ +

- _ -

+ + +

- b -

+ + +

- c -

+ + +

- i -

+ + +

- l -

+ + +

- n -

+ + +

- o -

+ + +

- r -

+ + +

- s -

+
+
+ + + + diff --git a/api/html/functions_z.html b/api/html/functions_z.html new file mode 100644 index 0000000..094e06d --- /dev/null +++ b/api/html/functions_z.html @@ -0,0 +1,120 @@ + + + + + + + +BOSWatch 3: Data Fields + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- z -

+
+
+ + + + diff --git a/api/html/hierarchy.html b/api/html/hierarchy.html new file mode 100644 index 0000000..34319d6 --- /dev/null +++ b/api/html/hierarchy.html @@ -0,0 +1,164 @@ + + + + + + + +BOSWatch 3: Class Hierarchy + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Csocketserver.BaseRequestHandler
 Cboswatch.network.server._ThreadedTCPRequestHandlerThreadedTCPRequestHandler class for our TCPServer class
 Ctelegram.bot.Bot
 Cplugin.telegram.MQBot
 Cboswatch.network.broadcast.BroadcastClientBroadcastClient class
 Cboswatch.network.broadcast.BroadcastServerBroadcastServer class
 Cboswatch.configYaml.ConfigYAML
 Cboswatch.decoder.decoder.Decoder
 Cboswatch.decoder.fmsDecoder.FmsDecoderFMS decoder class
 Cboswatch.network.netCheck.NetCheckWorker class to check internet connection
 Cboswatch.packet.PacketClass implementation of an BOSWatch packet
 Cboswatch.decoder.pocsagDecoder.PocsagDecoderPOCSAG decoder class
 Cboswatch.processManager.ProcessManagerClass to manage a extern sub process
 Cboswatch.timer.RepeatedTimer
 Cboswatch.router.route.RouteClass for single routing points
 Cboswatch.router.router.RouterClass for the Router
 Cboswatch.router.routerManager.RouterManagerClass to manage all routers
 Cboswatch.network.client.TCPClientTCP client class
 Cboswatch.network.server.TCPServerTCP server class
 Csocketserver.TCPServer
 Cboswatch.network.server._ThreadedTCPServerThreadedTCPServer class for our TCPServer class
 Csocketserver.ThreadingMixIn
 Cboswatch.network.server._ThreadedTCPServerThreadedTCPServer class for our TCPServer class
 Cboswatch.decoder.zveiDecoder.ZveiDecoderZVEI decoder class
 CABC
 Cboswatch.inputSource.inputBase.InputBaseBase class for handling inout sources
 Cboswatch.inputSource.lineInInput.LineInInputClass for the line-in input source
 Cboswatch.inputSource.pulseaudioInput.PulseAudioInputClass for the PulseAudio input source
 Cboswatch.inputSource.sdrInput.SdrInputClass for the sdr input source
 Cmodule.moduleBase.ModuleBaseMain module class
 Cmodule.descriptor.BoswatchModuleAdds descriptions to bwPackets
 Cmodule.filter.doubleFilter.BoswatchModuleDescription of the Module
 Cmodule.filter.modeFilter.BoswatchModuleFilter of specific bwPacket mode
 Cmodule.filter.regexFilter.BoswatchModuleRegex based filter mechanism
 Cmodule.geocoding.BoswatchModuleDescription of the Module
 Cmodule.template_module.BoswatchModuleDescription of the Module
 Cplugin.pluginBase.PluginBaseMain plugin class
 Cplugin.divera.BoswatchPluginDescription of the Plugin
 Cplugin.http.BoswatchPluginDescription of the Plugin
 Cplugin.mysql.BoswatchPluginDescription of the Plugin
 Cplugin.telegram.BoswatchPluginDescription of the Plugin
 Cplugin.template_plugin.BoswatchPluginDescription of the Plugin
+
+
+
+ + + + diff --git a/api/html/hierarchy.js b/api/html/hierarchy.js new file mode 100644 index 0000000..fb8fd1e --- /dev/null +++ b/api/html/hierarchy.js @@ -0,0 +1,53 @@ +var hierarchy = +[ + [ "socketserver.BaseRequestHandler", null, [ + [ "boswatch.network.server._ThreadedTCPRequestHandler", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html", null ] + ] ], + [ "telegram.bot.Bot", null, [ + [ "plugin.telegram.MQBot", "classplugin_1_1telegram_1_1_m_q_bot.html", null ] + ] ], + [ "boswatch.network.broadcast.BroadcastClient", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html", null ], + [ "boswatch.network.broadcast.BroadcastServer", "classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html", null ], + [ "boswatch.configYaml.ConfigYAML", "classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html", null ], + [ "boswatch.decoder.decoder.Decoder", "classboswatch_1_1decoder_1_1decoder_1_1_decoder.html", null ], + [ "boswatch.decoder.fmsDecoder.FmsDecoder", "classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html", null ], + [ "boswatch.network.netCheck.NetCheck", "classboswatch_1_1network_1_1net_check_1_1_net_check.html", null ], + [ "boswatch.packet.Packet", "classboswatch_1_1packet_1_1_packet.html", null ], + [ "boswatch.decoder.pocsagDecoder.PocsagDecoder", "classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html", null ], + [ "boswatch.processManager.ProcessManager", "classboswatch_1_1process_manager_1_1_process_manager.html", null ], + [ "boswatch.timer.RepeatedTimer", "classboswatch_1_1timer_1_1_repeated_timer.html", null ], + [ "boswatch.router.route.Route", "classboswatch_1_1router_1_1route_1_1_route.html", null ], + [ "boswatch.router.router.Router", "classboswatch_1_1router_1_1router_1_1_router.html", null ], + [ "boswatch.router.routerManager.RouterManager", "classboswatch_1_1router_1_1router_manager_1_1_router_manager.html", null ], + [ "boswatch.network.client.TCPClient", "classboswatch_1_1network_1_1client_1_1_t_c_p_client.html", null ], + [ "boswatch.network.server.TCPServer", "classboswatch_1_1network_1_1server_1_1_t_c_p_server.html", null ], + [ "socketserver.TCPServer", null, [ + [ "boswatch.network.server._ThreadedTCPServer", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html", null ] + ] ], + [ "socketserver.ThreadingMixIn", null, [ + [ "boswatch.network.server._ThreadedTCPServer", "classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html", null ] + ] ], + [ "boswatch.decoder.zveiDecoder.ZveiDecoder", "classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html", null ], + [ "ABC", null, [ + [ "boswatch.inputSource.inputBase.InputBase", "classboswatch_1_1input_source_1_1input_base_1_1_input_base.html", [ + [ "boswatch.inputSource.lineInInput.LineInInput", "classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html", null ], + [ "boswatch.inputSource.pulseaudioInput.PulseAudioInput", "classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html", null ], + [ "boswatch.inputSource.sdrInput.SdrInput", "classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html", null ] + ] ], + [ "module.moduleBase.ModuleBase", "classmodule_1_1module_base_1_1_module_base.html", [ + [ "module.descriptor.BoswatchModule", "classmodule_1_1descriptor_1_1_boswatch_module.html", null ], + [ "module.filter.doubleFilter.BoswatchModule", "classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html", null ], + [ "module.filter.modeFilter.BoswatchModule", "classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html", null ], + [ "module.filter.regexFilter.BoswatchModule", "classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html", null ], + [ "module.geocoding.BoswatchModule", "classmodule_1_1geocoding_1_1_boswatch_module.html", null ], + [ "module.template_module.BoswatchModule", "classmodule_1_1template__module_1_1_boswatch_module.html", null ] + ] ], + [ "plugin.pluginBase.PluginBase", "classplugin_1_1plugin_base_1_1_plugin_base.html", [ + [ "plugin.divera.BoswatchPlugin", "classplugin_1_1divera_1_1_boswatch_plugin.html", null ], + [ "plugin.http.BoswatchPlugin", "classplugin_1_1http_1_1_boswatch_plugin.html", null ], + [ "plugin.mysql.BoswatchPlugin", "classplugin_1_1mysql_1_1_boswatch_plugin.html", null ], + [ "plugin.telegram.BoswatchPlugin", "classplugin_1_1telegram_1_1_boswatch_plugin.html", null ], + [ "plugin.template_plugin.BoswatchPlugin", "classplugin_1_1template__plugin_1_1_boswatch_plugin.html", null ] + ] ] + ] ] +]; \ No newline at end of file diff --git a/api/html/index.html b/api/html/index.html new file mode 100644 index 0000000..1769af8 --- /dev/null +++ b/api/html/index.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: Main Page + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
BOSWatch 3 Documentation
+
+
+ +
+
+ + + + diff --git a/api/html/jquery.js b/api/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/api/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/api/html/md__r_e_a_d_m_e.html b/api/html/md__r_e_a_d_m_e.html new file mode 100644 index 0000000..41f9d02 --- /dev/null +++ b/api/html/md__r_e_a_d_m_e.html @@ -0,0 +1,127 @@ + + + + + + + +BOSWatch 3: BOSWatch + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
BOSWatch
+
+
+

BOSWatch

+

pytest documentation CodeQL

+

Es wird darauf hingewiesen, dass für die Teilnahme am BOS-Funk nur nach den Technischen Richtlinien der BOS zugelassene Funkanlagen verwendet werden dürfen. Der BOS-Funk ist ein nichtöffentlicher mobiler Landfunk. Privatpersonen gehören nicht zum Kreis der berechtigten Funkteilnehmer. (Quelle: TR-BOS)

+

Documentation: https://docs.boswatch.de

+

Wenn dir dieses Projekt gefällt, gib uns bitte einen STAR

+
+

The intercept of the German BOS radio is strictly prohibited and will be prosecuted. The use is only permitted for authorized personnel.

+

If you like this project, please give us a STAR

+
+
+
+ + + + diff --git a/api/html/minus.svg b/api/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/api/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/html/minusd.svg b/api/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/api/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/html/namespaceboswatch.html b/api/html/namespaceboswatch.html new file mode 100644 index 0000000..74967a1 --- /dev/null +++ b/api/html/namespaceboswatch.html @@ -0,0 +1,145 @@ + + + + + + + +BOSWatch 3: boswatch Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Namespaces

namespace  configYaml
 
namespace  decoder
 
namespace  inputSource
 
namespace  network
 
namespace  packet
 
namespace  processManager
 
namespace  router
 
namespace  timer
 
namespace  utils
 
namespace  wildcard
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1config_yaml.html b/api/html/namespaceboswatch_1_1config_yaml.html new file mode 100644 index 0000000..0f45fc4 --- /dev/null +++ b/api/html/namespaceboswatch_1_1config_yaml.html @@ -0,0 +1,130 @@ + + + + + + + +BOSWatch 3: boswatch.configYaml Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.configYaml Namespace Reference
+
+
+ + + + +

+Data Structures

class  ConfigYAML
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1decoder.html b/api/html/namespaceboswatch_1_1decoder.html new file mode 100644 index 0000000..152e9f3 --- /dev/null +++ b/api/html/namespaceboswatch_1_1decoder.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: boswatch.decoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  decoder
 
namespace  fmsDecoder
 
namespace  pocsagDecoder
 
namespace  zveiDecoder
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1decoder_1_1decoder.html b/api/html/namespaceboswatch_1_1decoder_1_1decoder.html new file mode 100644 index 0000000..9df7fdb --- /dev/null +++ b/api/html/namespaceboswatch_1_1decoder_1_1decoder.html @@ -0,0 +1,130 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.decoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.decoder Namespace Reference
+
+
+ + + + +

+Data Structures

class  Decoder
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1decoder_1_1fms_decoder.html b/api/html/namespaceboswatch_1_1decoder_1_1fms_decoder.html new file mode 100644 index 0000000..8e05b17 --- /dev/null +++ b/api/html/namespaceboswatch_1_1decoder_1_1fms_decoder.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.fmsDecoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.fmsDecoder Namespace Reference
+
+
+ + + + + +

+Data Structures

class  FmsDecoder
 FMS decoder class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1decoder_1_1pocsag_decoder.html b/api/html/namespaceboswatch_1_1decoder_1_1pocsag_decoder.html new file mode 100644 index 0000000..8d2aa20 --- /dev/null +++ b/api/html/namespaceboswatch_1_1decoder_1_1pocsag_decoder.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.pocsagDecoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.pocsagDecoder Namespace Reference
+
+
+ + + + + +

+Data Structures

class  PocsagDecoder
 POCSAG decoder class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1decoder_1_1zvei_decoder.html b/api/html/namespaceboswatch_1_1decoder_1_1zvei_decoder.html new file mode 100644 index 0000000..5941b59 --- /dev/null +++ b/api/html/namespaceboswatch_1_1decoder_1_1zvei_decoder.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.decoder.zveiDecoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.decoder.zveiDecoder Namespace Reference
+
+
+ + + + + +

+Data Structures

class  ZveiDecoder
 ZVEI decoder class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1input_source.html b/api/html/namespaceboswatch_1_1input_source.html new file mode 100644 index 0000000..c59371c --- /dev/null +++ b/api/html/namespaceboswatch_1_1input_source.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  inputBase
 
namespace  lineInInput
 
namespace  pulseaudioInput
 
namespace  sdrInput
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1input_source_1_1input_base.html b/api/html/namespaceboswatch_1_1input_source_1_1input_base.html new file mode 100644 index 0000000..4862f43 --- /dev/null +++ b/api/html/namespaceboswatch_1_1input_source_1_1input_base.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.inputBase Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.inputBase Namespace Reference
+
+
+ + + + + +

+Data Structures

class  InputBase
 Base class for handling inout sources. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1input_source_1_1line_in_input.html b/api/html/namespaceboswatch_1_1input_source_1_1line_in_input.html new file mode 100644 index 0000000..fa750ad --- /dev/null +++ b/api/html/namespaceboswatch_1_1input_source_1_1line_in_input.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.lineInInput Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.lineInInput Namespace Reference
+
+
+ + + + + +

+Data Structures

class  LineInInput
 Class for the line-in input source. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1input_source_1_1pulseaudio_input.html b/api/html/namespaceboswatch_1_1input_source_1_1pulseaudio_input.html new file mode 100644 index 0000000..79cffd9 --- /dev/null +++ b/api/html/namespaceboswatch_1_1input_source_1_1pulseaudio_input.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.pulseaudioInput Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.pulseaudioInput Namespace Reference
+
+
+ + + + + +

+Data Structures

class  PulseAudioInput
 Class for the PulseAudio input source. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1input_source_1_1sdr_input.html b/api/html/namespaceboswatch_1_1input_source_1_1sdr_input.html new file mode 100644 index 0000000..5e9a846 --- /dev/null +++ b/api/html/namespaceboswatch_1_1input_source_1_1sdr_input.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.inputSource.sdrInput Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.inputSource.sdrInput Namespace Reference
+
+
+ + + + + +

+Data Structures

class  SdrInput
 Class for the sdr input source. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1network.html b/api/html/namespaceboswatch_1_1network.html new file mode 100644 index 0000000..b73135e --- /dev/null +++ b/api/html/namespaceboswatch_1_1network.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: boswatch.network Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  broadcast
 
namespace  client
 
namespace  netCheck
 
namespace  server
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1network_1_1broadcast.html b/api/html/namespaceboswatch_1_1network_1_1broadcast.html new file mode 100644 index 0000000..696fe17 --- /dev/null +++ b/api/html/namespaceboswatch_1_1network_1_1broadcast.html @@ -0,0 +1,134 @@ + + + + + + + +BOSWatch 3: boswatch.network.broadcast Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.broadcast Namespace Reference
+
+
+ + + + + + + + +

+Data Structures

class  BroadcastClient
 BroadcastClient class. More...
 
class  BroadcastServer
 BroadcastServer class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1network_1_1client.html b/api/html/namespaceboswatch_1_1network_1_1client.html new file mode 100644 index 0000000..e7f8eda --- /dev/null +++ b/api/html/namespaceboswatch_1_1network_1_1client.html @@ -0,0 +1,152 @@ + + + + + + + +BOSWatch 3: boswatch.network.client Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.client Namespace Reference
+
+
+ + + + + +

+Data Structures

class  TCPClient
 TCP client class. More...
 
+ + + +

+Variables

int HEADERSIZE = 10
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Variable Documentation

+ +

◆ HEADERSIZE

+ +
+
+ + + + +
int boswatch.network.client.HEADERSIZE = 10
+
+ +
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1network_1_1net_check.html b/api/html/namespaceboswatch_1_1network_1_1net_check.html new file mode 100644 index 0000000..81dd6f7 --- /dev/null +++ b/api/html/namespaceboswatch_1_1network_1_1net_check.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.network.netCheck Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.netCheck Namespace Reference
+
+
+ + + + + +

+Data Structures

class  NetCheck
 Worker class to check internet connection. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1network_1_1server.html b/api/html/namespaceboswatch_1_1network_1_1server.html new file mode 100644 index 0000000..fdeaadc --- /dev/null +++ b/api/html/namespaceboswatch_1_1network_1_1server.html @@ -0,0 +1,158 @@ + + + + + + + +BOSWatch 3: boswatch.network.server Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.network.server Namespace Reference
+
+
+ + + + + + + + + + + +

+Data Structures

class  _ThreadedTCPRequestHandler
 ThreadedTCPRequestHandler class for our TCPServer class. More...
 
class  _ThreadedTCPServer
 ThreadedTCPServer class for our TCPServer class. More...
 
class  TCPServer
 TCP server class. More...
 
+ + + +

+Variables

int HEADERSIZE = 10
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Variable Documentation

+ +

◆ HEADERSIZE

+ +
+
+ + + + +
int boswatch.network.server.HEADERSIZE = 10
+
+ +
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1packet.html b/api/html/namespaceboswatch_1_1packet.html new file mode 100644 index 0000000..0f14645 --- /dev/null +++ b/api/html/namespaceboswatch_1_1packet.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.packet Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.packet Namespace Reference
+
+
+ + + + + +

+Data Structures

class  Packet
 Class implementation of an BOSWatch packet. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1process_manager.html b/api/html/namespaceboswatch_1_1process_manager.html new file mode 100644 index 0000000..56ac2a8 --- /dev/null +++ b/api/html/namespaceboswatch_1_1process_manager.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.processManager Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.processManager Namespace Reference
+
+
+ + + + + +

+Data Structures

class  ProcessManager
 class to manage a extern sub process More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1router.html b/api/html/namespaceboswatch_1_1router.html new file mode 100644 index 0000000..e52cf63 --- /dev/null +++ b/api/html/namespaceboswatch_1_1router.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.router Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router Namespace Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  route
 
namespace  router
 
namespace  routerManager
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1router_1_1route.html b/api/html/namespaceboswatch_1_1router_1_1route.html new file mode 100644 index 0000000..c915b7e --- /dev/null +++ b/api/html/namespaceboswatch_1_1router_1_1route.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.router.route Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.route Namespace Reference
+
+
+ + + + + +

+Data Structures

class  Route
 Class for single routing points. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1router_1_1router.html b/api/html/namespaceboswatch_1_1router_1_1router.html new file mode 100644 index 0000000..72993c9 --- /dev/null +++ b/api/html/namespaceboswatch_1_1router_1_1router.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.router.router Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.router Namespace Reference
+
+
+ + + + + +

+Data Structures

class  Router
 Class for the Router. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1router_1_1router_manager.html b/api/html/namespaceboswatch_1_1router_1_1router_manager.html new file mode 100644 index 0000000..d1a4664 --- /dev/null +++ b/api/html/namespaceboswatch_1_1router_1_1router_manager.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: boswatch.router.routerManager Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.router.routerManager Namespace Reference
+
+
+ + + + + +

+Data Structures

class  RouterManager
 Class to manage all routers. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1timer.html b/api/html/namespaceboswatch_1_1timer.html new file mode 100644 index 0000000..2cfd1e5 --- /dev/null +++ b/api/html/namespaceboswatch_1_1timer.html @@ -0,0 +1,130 @@ + + + + + + + +BOSWatch 3: boswatch.timer Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.timer Namespace Reference
+
+
+ + + + +

+Data Structures

class  RepeatedTimer
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1utils.html b/api/html/namespaceboswatch_1_1utils.html new file mode 100644 index 0000000..e085216 --- /dev/null +++ b/api/html/namespaceboswatch_1_1utils.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: boswatch.utils Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.utils Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  header
 
namespace  misc
 
namespace  paths
 
namespace  version
 
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1utils_1_1header.html b/api/html/namespaceboswatch_1_1utils_1_1header.html new file mode 100644 index 0000000..bb75ef5 --- /dev/null +++ b/api/html/namespaceboswatch_1_1utils_1_1header.html @@ -0,0 +1,215 @@ + + + + + + + +BOSWatch 3: boswatch.utils.header Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.utils.header Namespace Reference
+
+
+ + + + + + + + +

+Functions

 logoToLog ()
 Prints the BOSWatch logo to the log at debug level.
 
 infoToLog ()
 Prints the BOSWatch and OS information to log at debug level.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ logoToLog()

+ +
+
+ + + + + + + +
boswatch.utils.header.logoToLog ()
+
+ +

Prints the BOSWatch logo to the log at debug level.

+
@return True or False on error
+
25def logoToLog():
+
26 r"""!Prints the BOSWatch logo to the log at debug level
+
27
+
28 @return True or False on error"""
+
29 logging.debug(r" ____ ____ ______ __ __ __ _____ ")
+
30 logging.debug(r" / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / ")
+
31 logging.debug(r" / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < ")
+
32 logging.debug(r" / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / ")
+
33 logging.debug(r"/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ ")
+
34 logging.debug(r" German BOS Information Script ")
+
35 logging.debug(r" by Bastian Schroll ")
+
36 logging.debug(r"")
+
37 return True
+
38
+
39
+
+
+
+ +

◆ infoToLog()

+ +
+
+ + + + + + + +
boswatch.utils.header.infoToLog ()
+
+ +

Prints the BOSWatch and OS information to log at debug level.

+
@return True or False on error
+
40def infoToLog():
+
41 r"""!Prints the BOSWatch and OS information to log at debug level
+
42
+
43 @return True or False on error"""
+
44 logging.debug("BOSWatch and environment information")
+
45 logging.debug("- Client version: %d.%d.%d",
+
46 version.client["major"],
+
47 version.client["minor"],
+
48 version.client["patch"])
+
49 logging.debug("- Server version: %d.%d.%d",
+
50 version.server["major"],
+
51 version.server["minor"],
+
52 version.server["patch"])
+
53 logging.debug("- Branch: %s",
+
54 version.branch)
+
55 logging.debug("- Release date: %02d.%02d.%4d",
+
56 version.date["day"],
+
57 version.date["month"],
+
58 version.date["year"])
+
59 logging.debug("- Python version: %s", platform.python_version())
+
60 logging.debug("- Python build: %s", platform.python_build())
+
61 logging.debug("- System: %s", platform.system())
+
62 logging.debug("- OS Version: %s", platform.platform())
+
63 logging.debug("")
+
64 return True
+
+
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1utils_1_1misc.html b/api/html/namespaceboswatch_1_1utils_1_1misc.html new file mode 100644 index 0000000..6715c96 --- /dev/null +++ b/api/html/namespaceboswatch_1_1utils_1_1misc.html @@ -0,0 +1,225 @@ + + + + + + + +BOSWatch 3: boswatch.utils.misc Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.utils.misc Namespace Reference
+
+
+ + + + + + + + +

+Functions

 addClientDataToPacket (bwPacket, config)
 Add the client information to the decoded data.
 
 addServerDataToPacket (bwPacket, config)
 Add the server information to the decoded data.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ addClientDataToPacket()

+ +
+
+ + + + + + + + + + + +
boswatch.utils.misc.addClientDataToPacket ( bwPacket,
config )
+
+ +

Add the client information to the decoded data.

+
This function adds the following data to the bwPacket:
+- clientName
+- clientVersion
+- clientBuildDate
+- clientBranch
+- inputSource
+- frequency
+
23def addClientDataToPacket(bwPacket, config):
+
24 r"""!Add the client information to the decoded data
+
25
+
26 This function adds the following data to the bwPacket:
+
27 - clientName
+
28 - clientVersion
+
29 - clientBuildDate
+
30 - clientBranch
+
31 - inputSource
+
32 - frequency"""
+
33 logging.debug("add client data to bwPacket")
+
34 bwPacket.set("clientName", config.get("client", "name"))
+
35 bwPacket.set("clientVersion", version.client)
+
36 bwPacket.set("clientBuildDate", version.date)
+
37 bwPacket.set("clientBranch", version.branch)
+
38 bwPacket.set("inputSource", config.get("client", "inputSource"))
+
39 bwPacket.set("frequency", config.get("inputSource", "sdr", "frequency"))
+
40
+
41
+
+
+
+ +

◆ addServerDataToPacket()

+ +
+
+ + + + + + + + + + + +
boswatch.utils.misc.addServerDataToPacket ( bwPacket,
config )
+
+ +

Add the server information to the decoded data.

+
This function adds the following data to the bwPacket:
+- serverName
+- serverVersion
+- serverBuildDate
+- serverBranch
+
42def addServerDataToPacket(bwPacket, config):
+
43 r"""!Add the server information to the decoded data
+
44
+
45 This function adds the following data to the bwPacket:
+
46 - serverName
+
47 - serverVersion
+
48 - serverBuildDate
+
49 - serverBranch"""
+
50 logging.debug("add server data to bwPacket")
+
51 bwPacket.set("serverName", config.get("server", "name"))
+
52 bwPacket.set("serverVersion", version.server)
+
53 bwPacket.set("serverBuildDate", version.date)
+
54 bwPacket.set("serverBranch", version.branch)
+
+
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1utils_1_1paths.html b/api/html/namespaceboswatch_1_1utils_1_1paths.html new file mode 100644 index 0000000..b56e92c --- /dev/null +++ b/api/html/namespaceboswatch_1_1utils_1_1paths.html @@ -0,0 +1,270 @@ + + + + + + + +BOSWatch 3: boswatch.utils.paths Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.utils.paths Namespace Reference
+
+
+ + + + + + + +

+Functions

 fileExist (filePath)
 
 makeDirIfNotExist (dirPath)
 Checks if an directory is existing and create it if not.
 
+ + + + + + + + + + + +

+Variables

str ROOT_PATH = os.path.dirname(sys.modules['boswatch'].__file__).replace("\\", "/") + "/../"
 
str LOG_PATH = ROOT_PATH + "log/"
 
str CONFIG_PATH = ROOT_PATH + "config/"
 
str BIN_PATH = ROOT_PATH + "_bin/"
 
str TEST_PATH = ROOT_PATH + "test/"
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ fileExist()

+ +
+
+ + + + + + + +
boswatch.utils.paths.fileExist ( filePath)
+
+
32def fileExist(filePath):
+
33 return os.path.exists(filePath)
+
34
+
35
+
+
+
+ +

◆ makeDirIfNotExist()

+ +
+
+ + + + + + + +
boswatch.utils.paths.makeDirIfNotExist ( dirPath)
+
+ +

Checks if an directory is existing and create it if not.

+
@param dirPath: Path of the directory
+@return Path of the directory or False
+
36def makeDirIfNotExist(dirPath):
+
37 r"""!Checks if an directory is existing and create it if not
+
38
+
39 @param dirPath: Path of the directory
+
40 @return Path of the directory or False"""
+
41 if not os.path.exists(dirPath):
+
42 os.mkdir(dirPath)
+
43 logging.debug("directory created: %s", dirPath)
+
44 return dirPath
+
+
+
+

Variable Documentation

+ +

◆ ROOT_PATH

+ +
+
+ + + + +
str boswatch.utils.paths.ROOT_PATH = os.path.dirname(sys.modules['boswatch'].__file__).replace("\\", "/") + "/../"
+
+ +
+
+ +

◆ LOG_PATH

+ +
+
+ + + + +
str boswatch.utils.paths.LOG_PATH = ROOT_PATH + "log/"
+
+ +
+
+ +

◆ CONFIG_PATH

+ +
+
+ + + + +
str boswatch.utils.paths.CONFIG_PATH = ROOT_PATH + "config/"
+
+ +
+
+ +

◆ BIN_PATH

+ +
+
+ + + + +
str boswatch.utils.paths.BIN_PATH = ROOT_PATH + "_bin/"
+
+ +
+
+ +

◆ TEST_PATH

+ +
+
+ + + + +
str boswatch.utils.paths.TEST_PATH = ROOT_PATH + "test/"
+
+ +
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1utils_1_1version.html b/api/html/namespaceboswatch_1_1utils_1_1version.html new file mode 100644 index 0000000..c9a2de2 --- /dev/null +++ b/api/html/namespaceboswatch_1_1utils_1_1version.html @@ -0,0 +1,193 @@ + + + + + + + +BOSWatch 3: boswatch.utils.version Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.utils.version Namespace Reference
+
+
+ + + + + + + + + + +

+Variables

dict client = {"major": 3, "minor": 0, "patch": 0}
 
dict server = {"major": 3, "minor": 0, "patch": 0}
 
dict date = {"day": 1, "month": 1, "year": 2019}
 
str branch = "develop"
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Variable Documentation

+ +

◆ client

+ +
+
+ + + + +
dict boswatch.utils.version.client = {"major": 3, "minor": 0, "patch": 0}
+
+ +
+
+ +

◆ server

+ +
+
+ + + + +
dict boswatch.utils.version.server = {"major": 3, "minor": 0, "patch": 0}
+
+ +
+
+ +

◆ date

+ +
+
+ + + + +
dict boswatch.utils.version.date = {"day": 1, "month": 1, "year": 2019}
+
+ +
+
+ +

◆ branch

+ +
+
+ + + + +
str boswatch.utils.version.branch = "develop"
+
+ +
+
+
+
+ + + + diff --git a/api/html/namespaceboswatch_1_1wildcard.html b/api/html/namespaceboswatch_1_1wildcard.html new file mode 100644 index 0000000..218b182 --- /dev/null +++ b/api/html/namespaceboswatch_1_1wildcard.html @@ -0,0 +1,294 @@ + + + + + + + +BOSWatch 3: boswatch.wildcard Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
boswatch.wildcard Namespace Reference
+
+
+ + + + + + + + +

+Functions

 registerWildcard (wildcard, bwPacketField)
 Register a new additional wildcard.
 
 replaceWildcards (message, bwPacket)
 Replace the wildcards in a given message.
 
+ + + +

+Variables

dict _additionalWildcards = {}
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ registerWildcard()

+ +
+
+ + + + + + + + + + + +
boswatch.wildcard.registerWildcard ( wildcard,
bwPacketField )
+
+ +

Register a new additional wildcard.

+
@param wildcard: New wildcard string with format: '{WILDCARD}'
+@param bwPacketField: Field of the bwPacket which is used for wildcard replacement
+
27def registerWildcard(wildcard, bwPacketField):
+
28 r"""!Register a new additional wildcard
+
29
+
30 @param wildcard: New wildcard string with format: '{WILDCARD}'
+
31 @param bwPacketField: Field of the bwPacket which is used for wildcard replacement"""
+
32 if wildcard in _additionalWildcards:
+
33 logging.error("wildcard always registered: %s", wildcard)
+
34 return
+
35 logging.debug("register new wildcard %s for field: %s", wildcard, bwPacketField)
+
36 _additionalWildcards[wildcard] = bwPacketField
+
37
+
38
+
+
+
+ +

◆ replaceWildcards()

+ +
+
+ + + + + + + + + + + +
boswatch.wildcard.replaceWildcards ( message,
bwPacket )
+
+ +

Replace the wildcards in a given message.

+
@param message: Message in which wildcards should be replaced
+@param bwPacket: bwPacket instance with the replacement information
+@return Input message with the replaced wildcards
+
39def replaceWildcards(message, bwPacket):
+
40 r"""!Replace the wildcards in a given message
+
41
+
42 @param message: Message in which wildcards should be replaced
+
43 @param bwPacket: bwPacket instance with the replacement information
+
44 @return Input message with the replaced wildcards"""
+
45 _wildcards = {
+
46 # formatting wildcards
+
47 # todo check if br and par are needed - if not also change config
+
48 "{BR}": "\r\n",
+
49 "{LPAR}": "(",
+
50 "{RPAR}": ")",
+
51 "{TIME}": time.strftime("%d.%m.%Y %H:%M:%S"),
+
52
+
53 # info wildcards
+
54 # server
+
55 "{SNAME}": bwPacket.get("serverName"),
+
56 "{SVERS}": bwPacket.get("serverVersion"),
+
57 "{SDATE}": bwPacket.get("serverBuildDate"),
+
58 "{SBRCH}": bwPacket.get("serverBranch"),
+
59
+
60 # client
+
61 "{CNAME}": bwPacket.get("clientName"),
+
62 "{CIP}": bwPacket.get("clientIP"),
+
63 "{CVERS}": bwPacket.get("clientVersion"),
+
64 "{CDATE}": bwPacket.get("clientBuildDate"),
+
65 "{CBRCH}": bwPacket.get("clientBranch"),
+
66
+
67 # boswatch wildcards
+
68 "{INSRC}": bwPacket.get("inputSource"),
+
69 "{TIMES}": bwPacket.get("timestamp"),
+
70 "{FREQ}": bwPacket.get("frequency"),
+
71 "{MODE}": bwPacket.get("mode"),
+
72
+
73 # fms wildcards
+
74 "{FMS}": bwPacket.get("fms"),
+
75 "{SERV}": bwPacket.get("service"),
+
76 "{COUNT}": bwPacket.get("country"),
+
77 "{LOC}": bwPacket.get("location"),
+
78 "{VEHC}": bwPacket.get("vehicle"),
+
79 "{STAT}": bwPacket.get("status"),
+
80 "{DIR}": bwPacket.get("direction"),
+
81 "{DIRT}": bwPacket.get("directionText"),
+
82 "{TACI}": bwPacket.get("tacticalInfo"),
+
83
+
84 # pocsag wildcards
+
85 "{BIT}": bwPacket.get("bitrate"),
+
86 "{RIC}": bwPacket.get("ric"),
+
87 "{SRIC}": bwPacket.get("subric"),
+
88 "{SRICT}": bwPacket.get("subricText"),
+
89 "{MSG}": bwPacket.get("message"),
+
90
+
91 # zvei wildcards
+
92 "{TONE}": bwPacket.get("tone"),
+
93
+
94 # message for MSG packet is done in poc
+
95 }
+
96 for wildcard, field in _wildcards.items():
+
97 if field is not None:
+
98 message = message.replace(wildcard, field)
+
99
+
100 for wildcard, fieldName in _additionalWildcards.items():
+
101 field = bwPacket.get(fieldName)
+
102 if field is not None:
+
103 message = message.replace(wildcard, field)
+
104
+
105 return message
+
+
+
+

Variable Documentation

+ +

◆ _additionalWildcards

+ +
+
+ + + + + +
+ + + + +
dict boswatch.wildcard._additionalWildcards = {}
+
+protected
+
+ +
+
+
+
+ + + + diff --git a/api/html/namespacemembers.html b/api/html/namespacemembers.html new file mode 100644 index 0000000..eea6064 --- /dev/null +++ b/api/html/namespacemembers.html @@ -0,0 +1,277 @@ + + + + + + + +BOSWatch 3: Namespace Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all namespace members with links to the namespace documentation for each member:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+ + + + diff --git a/api/html/namespacemembers_func.html b/api/html/namespacemembers_func.html new file mode 100644 index 0000000..adafed6 --- /dev/null +++ b/api/html/namespacemembers_func.html @@ -0,0 +1,250 @@ + + + + + + + +BOSWatch 3: Namespace Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all namespace functions with links to the namespace documentation for each function:
+ +

- a -

+ + +

- b -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+ + + + diff --git a/api/html/namespacemembers_vars.html b/api/html/namespacemembers_vars.html new file mode 100644 index 0000000..eb734a1 --- /dev/null +++ b/api/html/namespacemembers_vars.html @@ -0,0 +1,128 @@ + + + + + + + +BOSWatch 3: Namespace Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all namespace variables with links to the namespace documentation for each variable:
+
+
+ + + + diff --git a/api/html/namespacemodule.html b/api/html/namespacemodule.html new file mode 100644 index 0000000..bc96b21 --- /dev/null +++ b/api/html/namespacemodule.html @@ -0,0 +1,135 @@ + + + + + + + +BOSWatch 3: module Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module Namespace Reference
+
+
+ + + + + + + + + + + + +

+Namespaces

namespace  descriptor
 
namespace  filter
 
namespace  geocoding
 
namespace  moduleBase
 
namespace  template_module
 
+
+
+ + + + diff --git a/api/html/namespacemodule_1_1descriptor.html b/api/html/namespacemodule_1_1descriptor.html new file mode 100644 index 0000000..7aa6ae8 --- /dev/null +++ b/api/html/namespacemodule_1_1descriptor.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.descriptor Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.descriptor Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Adds descriptions to bwPackets. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1filter.html b/api/html/namespacemodule_1_1filter.html new file mode 100644 index 0000000..78ea60b --- /dev/null +++ b/api/html/namespacemodule_1_1filter.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.filter Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter Namespace Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  doubleFilter
 
namespace  modeFilter
 
namespace  regexFilter
 
+
+
+ + + + diff --git a/api/html/namespacemodule_1_1filter_1_1double_filter.html b/api/html/namespacemodule_1_1filter_1_1double_filter.html new file mode 100644 index 0000000..2cc4982 --- /dev/null +++ b/api/html/namespacemodule_1_1filter_1_1double_filter.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.filter.doubleFilter Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.doubleFilter Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Description of the Module. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1filter_1_1mode_filter.html b/api/html/namespacemodule_1_1filter_1_1mode_filter.html new file mode 100644 index 0000000..e2ff59a --- /dev/null +++ b/api/html/namespacemodule_1_1filter_1_1mode_filter.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.filter.modeFilter Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.modeFilter Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Filter of specific bwPacket mode. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1filter_1_1regex_filter.html b/api/html/namespacemodule_1_1filter_1_1regex_filter.html new file mode 100644 index 0000000..a7bc644 --- /dev/null +++ b/api/html/namespacemodule_1_1filter_1_1regex_filter.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.filter.regexFilter Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.filter.regexFilter Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Regex based filter mechanism. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1geocoding.html b/api/html/namespacemodule_1_1geocoding.html new file mode 100644 index 0000000..c674db4 --- /dev/null +++ b/api/html/namespacemodule_1_1geocoding.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.geocoding Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.geocoding Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Description of the Module. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1module_base.html b/api/html/namespacemodule_1_1module_base.html new file mode 100644 index 0000000..57acf74 --- /dev/null +++ b/api/html/namespacemodule_1_1module_base.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.moduleBase Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.moduleBase Namespace Reference
+
+
+ + + + + +

+Data Structures

class  ModuleBase
 Main module class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacemodule_1_1template__module.html b/api/html/namespacemodule_1_1template__module.html new file mode 100644 index 0000000..06298c4 --- /dev/null +++ b/api/html/namespacemodule_1_1template__module.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: module.template_module Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
module.template_module Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchModule
 Description of the Module. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin.html b/api/html/namespaceplugin.html new file mode 100644 index 0000000..90570fc --- /dev/null +++ b/api/html/namespaceplugin.html @@ -0,0 +1,137 @@ + + + + + + + +BOSWatch 3: plugin Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin Namespace Reference
+
+
+ + + + + + + + + + + + + + +

+Namespaces

namespace  divera
 
namespace  http
 
namespace  mysql
 
namespace  pluginBase
 
namespace  telegram
 
namespace  template_plugin
 
+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1divera.html b/api/html/namespaceplugin_1_1divera.html new file mode 100644 index 0000000..0ccfb49 --- /dev/null +++ b/api/html/namespaceplugin_1_1divera.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: plugin.divera Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.divera Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchPlugin
 Description of the Plugin. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1http.html b/api/html/namespaceplugin_1_1http.html new file mode 100644 index 0000000..620f3c8 --- /dev/null +++ b/api/html/namespaceplugin_1_1http.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: plugin.http Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.http Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchPlugin
 Description of the Plugin. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1mysql.html b/api/html/namespaceplugin_1_1mysql.html new file mode 100644 index 0000000..788b4eb --- /dev/null +++ b/api/html/namespaceplugin_1_1mysql.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: plugin.mysql Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.mysql Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchPlugin
 Description of the Plugin. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1plugin_base.html b/api/html/namespaceplugin_1_1plugin_base.html new file mode 100644 index 0000000..5c4f219 --- /dev/null +++ b/api/html/namespaceplugin_1_1plugin_base.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: plugin.pluginBase Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.pluginBase Namespace Reference
+
+
+ + + + + +

+Data Structures

class  PluginBase
 Main plugin class. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1telegram.html b/api/html/namespaceplugin_1_1telegram.html new file mode 100644 index 0000000..014829d --- /dev/null +++ b/api/html/namespaceplugin_1_1telegram.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: plugin.telegram Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.telegram Namespace Reference
+
+
+ + + + + + + +

+Data Structures

class  BoswatchPlugin
 Description of the Plugin. More...
 
class  MQBot
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespaceplugin_1_1template__plugin.html b/api/html/namespaceplugin_1_1template__plugin.html new file mode 100644 index 0000000..d56cfd1 --- /dev/null +++ b/api/html/namespaceplugin_1_1template__plugin.html @@ -0,0 +1,131 @@ + + + + + + + +BOSWatch 3: plugin.template_plugin Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
plugin.template_plugin Namespace Reference
+
+
+ + + + + +

+Data Structures

class  BoswatchPlugin
 Description of the Plugin. More...
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+
+
+ + + + diff --git a/api/html/namespacetest.html b/api/html/namespacetest.html new file mode 100644 index 0000000..735072a --- /dev/null +++ b/api/html/namespacetest.html @@ -0,0 +1,133 @@ + + + + + + + +BOSWatch 3: test Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  boswatch
 
namespace  module
 
namespace  plugin
 
namespace  test_template
 
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch.html b/api/html/namespacetest_1_1boswatch.html new file mode 100644 index 0000000..5a0c3e1 --- /dev/null +++ b/api/html/namespacetest_1_1boswatch.html @@ -0,0 +1,141 @@ + + + + + + + +BOSWatch 3: test.boswatch Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Namespaces

namespace  test_broadcast
 
namespace  test_config
 
namespace  test_decoder
 
namespace  test_header
 
namespace  test_packet
 
namespace  test_paths
 
namespace  test_ServerClient
 
namespace  test_timer
 
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test___server_client.html b/api/html/namespacetest_1_1boswatch_1_1test___server_client.html new file mode 100644 index 0000000..afb3b5e --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test___server_client.html @@ -0,0 +1,850 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_ServerClient Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_ServerClient Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 getClient ()
 Build and serve a TCPCLient.
 
 getServer ()
 Build and serve a TCPServer.
 
 getRunningServer (getServer)
 Build and serve a still running TCPServer.
 
 test_clientConnectFailed (getClient)
 Connect to a non available server.
 
 test_clientDisconnectFailed (getClient)
 Disconnect while no connection is established.
 
 test_clientTransmitFailed (getClient)
 Transmit while no connection is established.
 
 test_clientReceiveFailed (getClient)
 Receive while no connection is established.
 
 test_clientConnect (getClient, getRunningServer)
 Connect to a server.
 
 test_doubleConnect (getClient, getRunningServer)
 Connect to a server twice.
 
 test_clientReconnect (getClient, getRunningServer)
 Try a reconnect after a established connection.
 
 test_clientMultiConnect (getClient, getRunningServer)
 Connect with 2 clients to the server.
 
 test_clientCommunicate (getClient, getRunningServer)
 Try to send data to the server and check on '[ack]'.
 
 test_clientMultiCommunicate (getServer)
 Try to send data to the server with 3 clients and check on '[ack]'.
 
 test_serverRestart (getRunningServer)
 Test a stop and restart of the server.
 
 test_serverStopFailed (getServer)
 Test to stop a stopped server.
 
 test_serverDoubleStart (getServer)
 Test to start the server twice.
 
 test_serverStartTwoInstances ()
 Test to start two server different server instances.
 
 test_serverStopsWhileConnected (getRunningServer, getClient)
 Shutdown server while client is connected.
 
 test_serverGetOutput (getRunningServer)
 Send data to server with 2 clients, check '[ack]' and data on server queue.
 
 test_serverHighLoad (getRunningServer)
 High load server test with 10 send threads each will send 100 msg with 324 bytes size.
 
 sendThread ()
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.setup_function ( function)
+
+
29def setup_function(function):
+
30 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
31
+
32
+
33@pytest.fixture
+
+
+
+ +

◆ getClient()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.getClient ()
+
+ +

Build and serve a TCPCLient.

+
34def getClient():
+
35 r"""!Build and serve a TCPCLient"""
+
36 return TCPClient()
+
37
+
38
+
39@pytest.fixture
+
+
+
+ +

◆ getServer()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.getServer ()
+
+ +

Build and serve a TCPServer.

+
40def getServer():
+
41 r"""!Build and serve a TCPServer"""
+
42 dataQueue = queue.Queue()
+
43 testServer = TCPServer(dataQueue)
+
44 return testServer
+
45
+
46
+
47@pytest.fixture
+
+
+
+ +

◆ getRunningServer()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.getRunningServer ( getServer)
+
+ +

Build and serve a still running TCPServer.

+
48def getRunningServer(getServer):
+
49 r"""!Build and serve a still running TCPServer"""
+
50 logging.debug("start server")
+
51 assert getServer.start()
+
52 while not getServer.isRunning:
+
53 pass
+
54 yield getServer
+
55 logging.debug("stop server")
+
56 assert getServer.stop()
+
57 time.sleep(0.1) # wait for safe stopped
+
58
+
59
+
+
+
+ +

◆ test_clientConnectFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_clientConnectFailed ( getClient)
+
+ +

Connect to a non available server.

+
60def test_clientConnectFailed(getClient):
+
61 r"""!Connect to a non available server"""
+
62 assert not getClient.connect()
+
63
+
64
+
+
+
+ +

◆ test_clientDisconnectFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_clientDisconnectFailed ( getClient)
+
+ +

Disconnect while no connection is established.

+
65def test_clientDisconnectFailed(getClient):
+
66 r"""!Disconnect while no connection is established"""
+
67 assert getClient.disconnect()
+
68
+
69
+
+
+
+ +

◆ test_clientTransmitFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_clientTransmitFailed ( getClient)
+
+ +

Transmit while no connection is established.

+
70def test_clientTransmitFailed(getClient):
+
71 r"""!Transmit while no connection is established"""
+
72 assert not getClient.transmit("test")
+
73
+
74
+
+
+
+ +

◆ test_clientReceiveFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_clientReceiveFailed ( getClient)
+
+ +

Receive while no connection is established.

+
75def test_clientReceiveFailed(getClient):
+
76 r"""!Receive while no connection is established"""
+
77 assert not getClient.receive()
+
78
+
79
+
+
+
+ +

◆ test_clientConnect()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_clientConnect ( getClient,
getRunningServer )
+
+ +

Connect to a server.

+
80def test_clientConnect(getClient, getRunningServer):
+
81 r"""!Connect to a server"""
+
82 assert getClient.connect()
+
83 assert getClient.disconnect()
+
84
+
85
+
+
+
+ +

◆ test_doubleConnect()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_doubleConnect ( getClient,
getRunningServer )
+
+ +

Connect to a server twice.

+
86def test_doubleConnect(getClient, getRunningServer):
+
87 r"""!Connect to a server twice"""
+
88 assert getClient.connect()
+
89 assert getClient.connect()
+
90 assert getClient.disconnect()
+
91
+
92
+
+
+
+ +

◆ test_clientReconnect()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_clientReconnect ( getClient,
getRunningServer )
+
+ +

Try a reconnect after a established connection.

+
93def test_clientReconnect(getClient, getRunningServer):
+
94 r"""!Try a reconnect after a established connection"""
+
95 assert getClient.connect()
+
96 assert getClient.disconnect()
+
97 assert getClient.connect()
+
98 assert getClient.disconnect()
+
99
+
100
+
+
+
+ +

◆ test_clientMultiConnect()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_clientMultiConnect ( getClient,
getRunningServer )
+
+ +

Connect with 2 clients to the server.

+
101def test_clientMultiConnect(getClient, getRunningServer):
+
102 r"""!Connect with 2 clients to the server"""
+
103 assert getClient.connect()
+
104 testClient2 = TCPClient()
+
105 assert testClient2.connect()
+
106 time.sleep(0.1) # wait for all clients connected
+
107 # check connected clients
+
108 assert getRunningServer.countClientsConnected() == 2
+
109 # disconnect all
+
110 assert getClient.disconnect()
+
111 assert testClient2.disconnect()
+
112
+
113
+
+
+
+ +

◆ test_clientCommunicate()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_clientCommunicate ( getClient,
getRunningServer )
+
+ +

Try to send data to the server and check on '[ack]'.

+
114def test_clientCommunicate(getClient, getRunningServer):
+
115 r"""!Try to send data to the server and check on '[ack]'"""
+
116 assert getClient.connect()
+
117 assert getClient.transmit("test")
+
118 assert getClient.receive() == "[ack]"
+
119 assert getClient.disconnect()
+
120
+
121
+
122@pytest.mark.skip("needs fixture for more than one client")
+
+
+
+ +

◆ test_clientMultiCommunicate()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_clientMultiCommunicate ( getServer)
+
+ +

Try to send data to the server with 3 clients and check on '[ack]'.

+
123def test_clientMultiCommunicate(getServer):
+
124 r"""!Try to send data to the server with 3 clients and check on '[ack]'"""
+
125 # connect all
+
126 testClient1 = TCPClient()
+
127 assert testClient1.connect()
+
128 testClient2 = TCPClient()
+
129 assert testClient2.connect()
+
130 testClient3 = TCPClient()
+
131 assert testClient3.connect()
+
132 # send all
+
133 assert testClient1.transmit("test")
+
134 assert testClient2.transmit("test")
+
135 assert testClient3.transmit("test")
+
136 # recv all
+
137 assert testClient3.receive() == "[ack]"
+
138 assert testClient2.receive() == "[ack]"
+
139 assert testClient1.receive() == "[ack]"
+
140 # check server msg queue
+
141 assert getRunningServer._alarmQueue.qsize() == 3
+
142 # disconnect all
+
143 assert testClient1.disconnect()
+
144 assert testClient2.disconnect()
+
145 assert testClient3.disconnect()
+
146
+
147
+
+
+
+ +

◆ test_serverRestart()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverRestart ( getRunningServer)
+
+ +

Test a stop and restart of the server.

+
148def test_serverRestart(getRunningServer):
+
149 r"""!Test a stop and restart of the server"""
+
150 assert getRunningServer.stop()
+
151 assert getRunningServer.start()
+
152 assert getRunningServer.stop()
+
153
+
154
+
+
+
+ +

◆ test_serverStopFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverStopFailed ( getServer)
+
+ +

Test to stop a stopped server.

+
155def test_serverStopFailed(getServer):
+
156 r"""!Test to stop a stopped server"""
+
157 assert getServer.stop()
+
158
+
159
+
+
+
+ +

◆ test_serverDoubleStart()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverDoubleStart ( getServer)
+
+ +

Test to start the server twice.

+
160def test_serverDoubleStart(getServer):
+
161 r"""!Test to start the server twice"""
+
162 assert getServer.start()
+
163 assert getServer.start()
+
164 assert getServer.stop()
+
165
+
166
+
+
+
+ +

◆ test_serverStartTwoInstances()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverStartTwoInstances ()
+
+ +

Test to start two server different server instances.

+
167def test_serverStartTwoInstances():
+
168 r"""!Test to start two server different server instances"""
+
169 dataQueue = queue.Queue()
+
170 testServer1 = TCPServer(dataQueue)
+
171 testServer2 = TCPServer(dataQueue)
+
172 assert testServer1.start()
+
173 assert testServer1.isRunning
+
174 assert not testServer2.start()
+
175 assert testServer1.isRunning
+
176 assert not testServer2.isRunning
+
177 assert testServer1.stop()
+
178 assert testServer2.stop()
+
179
+
180
+
+
+
+ +

◆ test_serverStopsWhileConnected()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_ServerClient.test_serverStopsWhileConnected ( getRunningServer,
getClient )
+
+ +

Shutdown server while client is connected.

+
181def test_serverStopsWhileConnected(getRunningServer, getClient):
+
182 r"""!Shutdown server while client is connected"""
+
183 getClient.connect()
+
184 getRunningServer.stop()
+
185 timeout = 5
+
186 while getClient.isConnected:
+
187 time.sleep(0.1)
+
188 timeout = timeout - 1
+
189 if timeout == 0:
+
190 break
+
191 assert timeout
+
192
+
193
+
194@pytest.mark.skip("needs fixture for more than one client")
+
+
+
+ +

◆ test_serverGetOutput()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverGetOutput ( getRunningServer)
+
+ +

Send data to server with 2 clients, check '[ack]' and data on server queue.

+
195def test_serverGetOutput(getRunningServer):
+
196 r"""!Send data to server with 2 clients, check '[ack]' and data on server queue"""
+
197 # connect all
+
198 testClient1 = TCPClient()
+
199 assert testClient1.connect()
+
200 testClient2 = TCPClient()
+
201 assert testClient2.connect()
+
202 # send all
+
203 assert testClient1.transmit("test1")
+
204 time.sleep(0.1) # wait for recv to prevent fail of false order
+
205 assert testClient2.transmit("test2")
+
206 # recv all
+
207 assert testClient1.receive() == "[ack]"
+
208 assert testClient2.receive() == "[ack]"
+
209 # _check server output data
+
210 assert getRunningServer._alarmQueue.qsize() == 2
+
211 assert getRunningServer._alarmQueue.get(True, 1)[1] == "test1"
+
212 assert getRunningServer._alarmQueue.get(True, 1)[1] == "test2"
+
213 assert getRunningServer._alarmQueue.qsize() == 0 # Last _check must be None
+
214 # disconnect all
+
215 assert testClient1.disconnect()
+
216 assert testClient2.disconnect()
+
217
+
218
+
+
+
+ +

◆ test_serverHighLoad()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.test_serverHighLoad ( getRunningServer)
+
+ +

High load server test with 10 send threads each will send 100 msg with 324 bytes size.

+
219def test_serverHighLoad(getRunningServer):
+
220 r"""!High load server test with 10 send threads each will send 100 msg with 324 bytes size"""
+
221 logging.debug("start sendThreads")
+
222 threads = []
+
223 for thr_id in range(10):
+
224 thr = threading.Thread(target=sendThread, name="sendThread-" + str(thr_id))
+
225 thr.daemon = True
+
226 thr.start()
+
227 threads.append(thr)
+
228 for thread in threads:
+
229 thread.join()
+
230 logging.debug("finished sendThreads")
+
231 assert getRunningServer._alarmQueue.qsize() == 1000
+
232
+
233
+
+
+
+ +

◆ sendThread()

+ +
+
+ + + + + + + +
test.boswatch.test_ServerClient.sendThread ()
+
+
234def sendThread():
+
235 client = TCPClient()
+
236 client.connect()
+
237 time.sleep(0.1)
+
238 for i in range(100):
+
239 # actually this string is 324 bytes long
+
240 client.transmit("HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-"
+
241 "HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-"
+
242 "HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-HigLoadTestString-")
+
243 if not client.receive() == "[ack]":
+
244 logging.error("missing [ACK]")
+
245
+
246 time.sleep(0.1)
+
247 client.disconnect()
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__broadcast.html b/api/html/namespacetest_1_1boswatch_1_1test__broadcast.html new file mode 100644 index 0000000..6596695 --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__broadcast.html @@ -0,0 +1,358 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_broadcast Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_broadcast Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 broadcastServer ()
 Server a BroadcastServer instance.
 
 broadcastClient ()
 Server a BroadcastClient instance.
 
 test_serverStartStop (broadcastServer)
 Start a BroadcastServer, check if running and stop it.
 
 test_serverDoubleStart (broadcastServer)
 Try to start a BroadcastServer twice.
 
 test_serverStopNotStarted (broadcastServer)
 Try to stop a BroadcastServer where is not running.
 
 test_clientWithoutServer (broadcastClient)
 Use BroadcastClient with no server.
 
 test_serverClientFetchConnInfo (broadcastClient, broadcastServer)
 Fetch connection info from BroadcastServer.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.setup_function ( function)
+
+
26def setup_function(function):
+
27 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
28
+
29
+
30@pytest.fixture()
+
+
+
+ +

◆ broadcastServer()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.broadcastServer ()
+
+ +

Server a BroadcastServer instance.

+
31def broadcastServer():
+
32 r"""!Server a BroadcastServer instance"""
+
33 broadcastServer = BroadcastServer()
+
34 yield broadcastServer
+
35 if broadcastServer.isRunning:
+
36 assert broadcastServer.stop()
+
37 while broadcastServer.isRunning:
+
38 pass
+
39
+
40
+
41@pytest.fixture()
+
+
+
+ +

◆ broadcastClient()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.broadcastClient ()
+
+ +

Server a BroadcastClient instance.

+
42def broadcastClient():
+
43 r"""!Server a BroadcastClient instance"""
+
44 return BroadcastClient()
+
45
+
46
+
+
+
+ +

◆ test_serverStartStop()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.test_serverStartStop ( broadcastServer)
+
+ +

Start a BroadcastServer, check if running and stop it.

+
47def test_serverStartStop(broadcastServer):
+
48 r"""!Start a BroadcastServer, check if running and stop it"""
+
49 assert broadcastServer.start()
+
50 assert broadcastServer.isRunning
+
51 assert broadcastServer.stop()
+
52
+
53
+
+
+
+ +

◆ test_serverDoubleStart()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.test_serverDoubleStart ( broadcastServer)
+
+ +

Try to start a BroadcastServer twice.

+
54def test_serverDoubleStart(broadcastServer):
+
55 r"""!Try to start a BroadcastServer twice"""
+
56 assert broadcastServer.start()
+
57 assert broadcastServer.start()
+
58 assert broadcastServer.stop()
+
59
+
60
+
+
+
+ +

◆ test_serverStopNotStarted()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.test_serverStopNotStarted ( broadcastServer)
+
+ +

Try to stop a BroadcastServer where is not running.

+
61def test_serverStopNotStarted(broadcastServer):
+
62 r"""!Try to stop a BroadcastServer where is not running"""
+
63 assert broadcastServer.stop()
+
64
+
65
+
+
+
+ +

◆ test_clientWithoutServer()

+ +
+
+ + + + + + + +
test.boswatch.test_broadcast.test_clientWithoutServer ( broadcastClient)
+
+ +

Use BroadcastClient with no server.

+
66def test_clientWithoutServer(broadcastClient):
+
67 r"""!Use BroadcastClient with no server"""
+
68 assert not broadcastClient.getConnInfo(1)
+
69
+
70
+
+
+
+ +

◆ test_serverClientFetchConnInfo()

+ +
+
+ + + + + + + + + + + +
test.boswatch.test_broadcast.test_serverClientFetchConnInfo ( broadcastClient,
broadcastServer )
+
+ +

Fetch connection info from BroadcastServer.

+
71def test_serverClientFetchConnInfo(broadcastClient, broadcastServer):
+
72 r"""!Fetch connection info from BroadcastServer"""
+
73 assert broadcastServer.start()
+
74 assert broadcastClient.getConnInfo()
+
75 assert broadcastServer.stop()
+
76 assert broadcastClient.serverIP
+
77 assert broadcastClient.serverPort
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__config.html b/api/html/namespacetest_1_1boswatch_1_1test__config.html new file mode 100644 index 0000000..44fdd2e --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__config.html @@ -0,0 +1,470 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_config Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_config Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 getConfig ()
 Build a config object.
 
 getFilledConfig ()
 Build a config object and fill it with the config data.
 
 test_loadConfigFile (getConfig)
 load a config file
 
 test_loadConfigFileFailed (getConfig)
 load a config file with syntax error
 
 test_loadConfigFileNotFound (getConfig)
 load a config file where is not available
 
 test_getConfigAsString (getFilledConfig)
 Get the string representation of the config.
 
 test_getTypes (getFilledConfig)
 Get and check different data types in config.
 
 test_getDefaultValue (getFilledConfig)
 Get the default value of an not existent entry.
 
 test_getNestedConfig (getFilledConfig)
 Work with nested sub-config elements.
 
 test_configIterationList (getFilledConfig)
 Try to iterate over a list in the config.
 
 test_configIterationListWithNestedList (getFilledConfig)
 Try to iterate over a list in the config where its elements are lists itself.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_config.setup_function ( function)
+
+
26def setup_function(function):
+
27 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
28
+
29
+
30@pytest.fixture
+
+
+
+ +

◆ getConfig()

+ +
+
+ + + + + + + +
test.boswatch.test_config.getConfig ()
+
+ +

Build a config object.

+
31def getConfig():
+
32 r"""!Build a config object"""
+
33 return ConfigYAML()
+
34
+
35
+
36@pytest.fixture
+
+
+
+ +

◆ getFilledConfig()

+ +
+
+ + + + + + + +
test.boswatch.test_config.getFilledConfig ()
+
+ +

Build a config object and fill it with the config data.

+
37def getFilledConfig():
+
38 r"""!Build a config object and fill it with the config data"""
+
39 filledConfig = ConfigYAML()
+
40 assert filledConfig.loadConfigFile(paths.TEST_PATH + "test_config.yaml") is True
+
41 return filledConfig
+
42
+
43
+
+
+
+ +

◆ test_loadConfigFile()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_loadConfigFile ( getConfig)
+
+ +

load a config file

+
44def test_loadConfigFile(getConfig):
+
45 r"""!load a config file"""
+
46 assert getConfig.loadConfigFile(paths.TEST_PATH + "test_config.yaml") is True
+
47
+
48
+
+
+
+ +

◆ test_loadConfigFileFailed()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_loadConfigFileFailed ( getConfig)
+
+ +

load a config file with syntax error

+
49def test_loadConfigFileFailed(getConfig):
+
50 r"""!load a config file with syntax error"""
+
51 assert getConfig.loadConfigFile(paths.TEST_PATH + "test_configFailed.yaml") is False
+
52
+
53
+
+
+
+ +

◆ test_loadConfigFileNotFound()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_loadConfigFileNotFound ( getConfig)
+
+ +

load a config file where is not available

+
54def test_loadConfigFileNotFound(getConfig):
+
55 r"""!load a config file where is not available"""
+
56 assert getConfig.loadConfigFile(paths.TEST_PATH + "test_configNotFound.yaml") is False
+
57
+
58
+
+
+
+ +

◆ test_getConfigAsString()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_getConfigAsString ( getFilledConfig)
+
+ +

Get the string representation of the config.

+
59def test_getConfigAsString(getFilledConfig):
+
60 r"""!Get the string representation of the config"""
+
61 assert type(str(getFilledConfig)) is str
+
62 logging.debug(getFilledConfig)
+
63
+
64
+
+
+
+ +

◆ test_getTypes()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_getTypes ( getFilledConfig)
+
+ +

Get and check different data types in config.

+
65def test_getTypes(getFilledConfig):
+
66 r"""!Get and check different data types in config"""
+
67 assert type(getFilledConfig.get("types")) is ConfigYAML
+
68 assert type(getFilledConfig.get("types", "string")) is str
+
69 assert type(getFilledConfig.get("types", "bool")) is bool
+
70 assert type(getFilledConfig.get("types", "integer")) is int
+
71 assert type(getFilledConfig.get("types", "float")) is float
+
72
+
73
+
+
+
+ +

◆ test_getDefaultValue()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_getDefaultValue ( getFilledConfig)
+
+ +

Get the default value of an not existent entry.

+
74def test_getDefaultValue(getFilledConfig):
+
75 r"""!Get the default value of an not existent entry"""
+
76 assert getFilledConfig.get("notExistent", default="defaultValue") == "defaultValue"
+
77
+
78
+
+
+
+ +

◆ test_getNestedConfig()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_getNestedConfig ( getFilledConfig)
+
+ +

Work with nested sub-config elements.

+
79def test_getNestedConfig(getFilledConfig):
+
80 r"""!Work with nested sub-config elements"""
+
81 nestedConfig = getFilledConfig.get("types")
+
82 assert type(nestedConfig) is ConfigYAML
+
83 assert nestedConfig.get("string") == "Hello World"
+
84
+
85
+
+
+
+ +

◆ test_configIterationList()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_configIterationList ( getFilledConfig)
+
+ +

Try to iterate over a list in the config.

+
86def test_configIterationList(getFilledConfig):
+
87 r"""!Try to iterate over a list in the config"""
+
88 counter = 0
+
89 for item in getFilledConfig.get("list"):
+
90 assert type(item) is str
+
91 counter += 1
+
92 assert counter == 3
+
93
+
94
+
+
+
+ +

◆ test_configIterationListWithNestedList()

+ +
+
+ + + + + + + +
test.boswatch.test_config.test_configIterationListWithNestedList ( getFilledConfig)
+
+ +

Try to iterate over a list in the config where its elements are lists itself.

+
95def test_configIterationListWithNestedList(getFilledConfig):
+
96 r"""!Try to iterate over a list in the config where its elements are lists itself"""
+
97 listCnt = 0
+
98 strCnt = 0
+
99 for item in getFilledConfig.get("list1"):
+
100 if type(item) is ConfigYAML:
+
101 listCnt += 1
+
102 if type(item) is str:
+
103 strCnt += 1
+
104 assert listCnt == 2
+
105 assert strCnt == 1
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__decoder.html b/api/html/namespacetest_1_1boswatch_1_1test__decoder.html new file mode 100644 index 0000000..bc4bf00 --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__decoder.html @@ -0,0 +1,446 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_decoder Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_decoder Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 test_decoderNoData ()
 Test a empty string.
 
 test_decoderZveiValid ()
 Test valid ZVEI.
 
 test_decoderZveiDoubleTone ()
 Test doubleTone included ZVEI.
 
 test_decoderZveiInvalid ()
 
 test_decoderPocsagValid ()
 Test valid POCSAG.
 
 test_decoderPocsagText ()
 Test POCSAG with text.
 
 test_decoderPocsagShortRic ()
 Test short POCSAG.
 
 test_decoderPocsagInvalid ()
 Test invalid POCSAG.
 
 test_decoderFmsValid ()
 Test valid FMS.
 
 test_decoderFmsInvalid ()
 Test invalid FMS.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.setup_function ( function)
+
+
24def setup_function(function):
+
25 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
26
+
27
+
+
+
+ +

◆ test_decoderNoData()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderNoData ()
+
+ +

Test a empty string.

+
28def test_decoderNoData():
+
29 r"""!Test a empty string"""
+
30 assert Decoder.decode("") is None
+
31
+
32
+
+
+
+ +

◆ test_decoderZveiValid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderZveiValid ()
+
+ +

Test valid ZVEI.

+
33def test_decoderZveiValid():
+
34 r"""!Test valid ZVEI"""
+
35 assert not Decoder.decode("ZVEI1: 12345") is None
+
36 assert not Decoder.decode("ZVEI1: 12838") is None
+
37 assert not Decoder.decode("ZVEI1: 34675") is None
+
38
+
39
+
+
+
+ +

◆ test_decoderZveiDoubleTone()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderZveiDoubleTone ()
+
+ +

Test doubleTone included ZVEI.

+
40def test_decoderZveiDoubleTone():
+
41 r"""!Test doubleTone included ZVEI"""
+
42 assert not Decoder.decode("ZVEI1: 6E789") is None
+
43 assert not Decoder.decode("ZVEI1: 975E7") is None
+
44 assert not Decoder.decode("ZVEI1: 2E87E") is None
+
45
+
46
+
+
+
+ +

◆ test_decoderZveiInvalid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderZveiInvalid ()
+
+
Test invalid ZVEI
47def test_decoderZveiInvalid():
+
48 """Test invalid ZVEI"""
+
49 assert Decoder.decode("ZVEI1: 1245A") is None
+
50 assert Decoder.decode("ZVEI1: 1245") is None
+
51 assert Decoder.decode("ZVEI1: 135") is None
+
52 assert Decoder.decode("ZVEI1: 54") is None
+
53 assert Decoder.decode("ZVEI1: 54") is None
+
54
+
55
+
+
+
+ +

◆ test_decoderPocsagValid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderPocsagValid ()
+
+ +

Test valid POCSAG.

+
56def test_decoderPocsagValid():
+
57 r"""!Test valid POCSAG"""
+
58 assert not Decoder.decode("POCSAG512: Address: 1000000 Function: 0") is None
+
59 assert not Decoder.decode("POCSAG512: Address: 1000001 Function: 1") is None
+
60 assert not Decoder.decode("POCSAG1200: Address: 1000002 Function: 2") is None
+
61 assert not Decoder.decode("POCSAG2400: Address: 1000003 Function: 3") is None
+
62
+
63
+
+
+
+ +

◆ test_decoderPocsagText()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderPocsagText ()
+
+ +

Test POCSAG with text.

+
64def test_decoderPocsagText():
+
65 r"""!Test POCSAG with text"""
+
66 assert not Decoder.decode("POCSAG512: Address: 1000000 Function: 0 Alpha: test") is None
+
67 assert not Decoder.decode("POCSAG512: Address: 1000001 Function: 1 Alpha: test") is None
+
68 assert not Decoder.decode("POCSAG1200: Address: 1000002 Function: 2 Alpha: test") is None
+
69 assert not Decoder.decode("POCSAG2400: Address: 1000003 Function: 3 Alpha: test") is None
+
70
+
71
+
+
+
+ +

◆ test_decoderPocsagShortRic()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderPocsagShortRic ()
+
+ +

Test short POCSAG.

+
72def test_decoderPocsagShortRic():
+
73 r"""!Test short POCSAG"""
+
74 assert not Decoder.decode("POCSAG512: Address: 3 Function: 0 Alpha: test") is None
+
75 assert not Decoder.decode("POCSAG512: Address: 33 Function: 0 Alpha: test") is None
+
76 assert not Decoder.decode("POCSAG1200: Address: 333 Function: 0 Alpha: test") is None
+
77 assert not Decoder.decode("POCSAG1200: Address: 3333 Function: 0 Alpha: test") is None
+
78 assert not Decoder.decode("POCSAG2400: Address: 33333 Function: 0 Alpha: test") is None
+
79 assert not Decoder.decode("POCSAG2400: Address: 333333 Function: 0 Alpha: test") is None
+
80 assert not Decoder.decode("POCSAG2400: Address: 3333333 Function: 0 Alpha: test") is None
+
81
+
82
+
+
+
+ +

◆ test_decoderPocsagInvalid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderPocsagInvalid ()
+
+ +

Test invalid POCSAG.

+
83def test_decoderPocsagInvalid():
+
84 r"""!Test invalid POCSAG"""
+
85 assert Decoder.decode("POCSAG512: Address: 333333F Function: 0 Alpha: invalid") is None
+
86 assert Decoder.decode("POCSAG512: Address: 333333F Function: 1 Alpha: invalid") is None
+
87 assert Decoder.decode("POCSAG512: Address: 3333333 Function: 4 Alpha: invalid") is None
+
88
+
89
+
+
+
+ +

◆ test_decoderFmsValid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderFmsValid ()
+
+ +

Test valid FMS.

+
90def test_decoderFmsValid():
+
91 r"""!Test valid FMS"""
+
92 assert not Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 0=FZG->LST 2=I (ohneNA,ohneSIGNAL)) CRC correct""") is None
+
93 assert not Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 1=LST->FZG 2=I (ohneNA,ohneSIGNAL)) CRC correct""") is None
+
94 assert not Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 0=FZG->LST 2=II (ohneNA,mit SIGNAL)) CRC correct""") is None
+
95 assert not Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 1=LST->FZG 2=III(mit NA,ohneSIGNAL)) CRC correct""") is None
+
96 assert not Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 0=FZG->LST 2=IV (mit NA,mit SIGNAL)) CRC correct""") is None
+
97
+
98
+
+
+
+ +

◆ test_decoderFmsInvalid()

+ +
+
+ + + + + + + +
test.boswatch.test_decoder.test_decoderFmsInvalid ()
+
+ +

Test invalid FMS.

+
99def test_decoderFmsInvalid():
+
100 r"""!Test invalid FMS"""
+
101 assert Decoder.decode("""FMS: 14170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 1=LST->FZG 2=III(mit NA,ohneSIGNAL)) CRC correct""") is None
+
102 assert Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Sta 3=Einsatz Ab 0=FZG->LST 2=IV (mit NA,mit SIGNAL)) CRC correct""") is None
+
103 assert Decoder.decode("""FMS: 14170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Status 3=Einsatz Ab 1=LST->FZG 2=III(mit NA,ohneSIGNAL)) CRC incorrect""") is None
+
104 assert Decoder.decode("""FMS: 43f314170000 (9=Rotkreuz 3=Bayern 1 Ort 0x25=037FZG 7141Sta 3=Einsatz Ab 0=FZG->LST 2=IV (mit NA,mit SIGNAL)) CRC incorrect""") is None
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__header.html b/api/html/namespacetest_1_1boswatch_1_1test__header.html new file mode 100644 index 0000000..4fe24ae --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__header.html @@ -0,0 +1,204 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_header Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_header Namespace Reference
+
+
+ + + + + + + + + + +

+Functions

 setup_function (function)
 
 test_logoToLog ()
 Test logo to log.
 
 test_infoToLog ()
 Test info to log.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_header.setup_function ( function)
+
+
24def setup_function(function):
+
25 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
26
+
27
+
+
+
+ +

◆ test_logoToLog()

+ +
+
+ + + + + + + +
test.boswatch.test_header.test_logoToLog ()
+
+ +

Test logo to log.

+
28def test_logoToLog():
+
29 r"""!Test logo to log"""
+
30 assert header.logoToLog()
+
31
+
32
+
+
+
+ +

◆ test_infoToLog()

+ +
+
+ + + + + + + +
test.boswatch.test_header.test_infoToLog ()
+
+ +

Test info to log.

+
33def test_infoToLog():
+
34 r"""!Test info to log"""
+
35 assert header.infoToLog()
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__packet.html b/api/html/namespacetest_1_1boswatch_1_1test__packet.html new file mode 100644 index 0000000..3672aea --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__packet.html @@ -0,0 +1,316 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_packet Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_packet Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 buildPacket ()
 Build a BOSWatch packet and serve it to each test.
 
 test_createPacket (buildPacket)
 Create a packet.
 
 test_copyPacket (buildPacket)
 Copy a packet to an new instance.
 
 test_getPacketString (buildPacket)
 get the intern packet dict as string
 
 test_getNotSetField (buildPacket)
 try to get a not set field
 
 test_setGetField (buildPacket)
 set and get a field
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.setup_function ( function)
+
+
25def setup_function(function):
+
26 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
27
+
28
+
29@pytest.fixture()
+
+
+
+ +

◆ buildPacket()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.buildPacket ()
+
+ +

Build a BOSWatch packet and serve it to each test.

+
30def buildPacket():
+
31 r"""!Build a BOSWatch packet and serve it to each test"""
+
32 return Packet()
+
33
+
34
+
+
+
+ +

◆ test_createPacket()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.test_createPacket ( buildPacket)
+
+ +

Create a packet.

+
35def test_createPacket(buildPacket):
+
36 r"""!Create a packet"""
+
37 assert buildPacket != ""
+
38
+
39
+
+
+
+ +

◆ test_copyPacket()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.test_copyPacket ( buildPacket)
+
+ +

Copy a packet to an new instance.

+
40def test_copyPacket(buildPacket):
+
41 r"""!Copy a packet to an new instance"""
+
42 bwCopyPacket = Packet(buildPacket.__str__())
+
43 assert bwCopyPacket != ""
+
44
+
45
+
+
+
+ +

◆ test_getPacketString()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.test_getPacketString ( buildPacket)
+
+ +

get the intern packet dict as string

+
46def test_getPacketString(buildPacket):
+
47 r"""!get the intern packet dict as string"""
+
48 assert type(buildPacket.__str__()) is str
+
49 assert buildPacket.__str__() != ""
+
50
+
51
+
+
+
+ +

◆ test_getNotSetField()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.test_getNotSetField ( buildPacket)
+
+ +

try to get a not set field

+
52def test_getNotSetField(buildPacket):
+
53 r"""!try to get a not set field"""
+
54 assert not buildPacket.get("testfield")
+
55
+
56
+
+
+
+ +

◆ test_setGetField()

+ +
+
+ + + + + + + +
test.boswatch.test_packet.test_setGetField ( buildPacket)
+
+ +

set and get a field

+
57def test_setGetField(buildPacket):
+
58 r"""!set and get a field"""
+
59 buildPacket.set("testField", "test")
+
60 assert buildPacket.get("testField") == "test"
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__paths.html b/api/html/namespacetest_1_1boswatch_1_1test__paths.html new file mode 100644 index 0000000..33ecdfc --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__paths.html @@ -0,0 +1,261 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_paths Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_paths Namespace Reference
+
+
+ + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 test_fileExists ()
 load a local config file
 
 test_fileNotExists ()
 load a local config file
 
 test_makeDirNotExisting ()
 load a local config file
 
 test_makeDirExisting ()
 load a local config file
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_paths.setup_function ( function)
+
+
25def setup_function(function):
+
26 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
27
+
28
+
+
+
+ +

◆ test_fileExists()

+ +
+
+ + + + + + + +
test.boswatch.test_paths.test_fileExists ()
+
+ +

load a local config file

+
29def test_fileExists():
+
30 r"""!load a local config file"""
+
31 assert paths.fileExist("README.md")
+
32
+
33
+
+
+
+ +

◆ test_fileNotExists()

+ +
+
+ + + + + + + +
test.boswatch.test_paths.test_fileNotExists ()
+
+ +

load a local config file

+
34def test_fileNotExists():
+
35 r"""!load a local config file"""
+
36 assert not paths.fileExist("notFound.txt")
+
37
+
38
+
+
+
+ +

◆ test_makeDirNotExisting()

+ +
+
+ + + + + + + +
test.boswatch.test_paths.test_makeDirNotExisting ()
+
+ +

load a local config file

+
39def test_makeDirNotExisting():
+
40 r"""!load a local config file"""
+
41 assert paths.makeDirIfNotExist("UnItTeSt")
+
42 os.removedirs("UnItTeSt")
+
43
+
44
+
+
+
+ +

◆ test_makeDirExisting()

+ +
+
+ + + + + + + +
test.boswatch.test_paths.test_makeDirExisting ()
+
+ +

load a local config file

+
45def test_makeDirExisting():
+
46 r"""!load a local config file"""
+
47 paths.makeDirIfNotExist("UnItTeSt")
+
48 assert paths.makeDirIfNotExist("UnItTeSt")
+
49 os.removedirs("UnItTeSt")
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1boswatch_1_1test__timer.html b/api/html/namespacetest_1_1boswatch_1_1test__timer.html new file mode 100644 index 0000000..8d3347c --- /dev/null +++ b/api/html/namespacetest_1_1boswatch_1_1test__timer.html @@ -0,0 +1,474 @@ + + + + + + + +BOSWatch 3: test.boswatch.test_timer Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.boswatch.test_timer Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_function (function)
 
 testTargetFast ()
 Fast worker thread.
 
 testTargetSlow ()
 Slow worker thread.
 
 useTimerFast ()
 Server a RepeatedTimer instance with fast worker.
 
 useTimerSlow ()
 Server a RepeatedTimer instance slow worker.
 
 test_timerStartStop (useTimerFast)
 Try to start and stop a timer.
 
 test_timerDoubleStart (useTimerFast)
 Try to start a timer twice.
 
 test_timerStopNotStarted (useTimerFast)
 Try to stop a timer where is not started.
 
 test_timerIsRunning (useTimerFast)
 Check if a timer is running.
 
 test_timerRun (useTimerFast)
 Run a timer and check overdue and lostEvents.
 
 test_timerOverdue (useTimerSlow)
 Run a timer and check overdue and lostEvents.
 
 test_timerOverdueLong (useTimerSlow)
 Run a timer and check overdue and lostEvents.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_function()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.setup_function ( function)
+
+
26def setup_function(function):
+
27 logging.debug("[TEST] %s.%s", function.__module__, function.__name__)
+
28
+
29
+
+
+
+ +

◆ testTargetFast()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.testTargetFast ()
+
+ +

Fast worker thread.

+
30def testTargetFast():
+
31 r"""!Fast worker thread"""
+
32 logging.debug("run testTargetFast")
+
33
+
34
+
+
+
+ +

◆ testTargetSlow()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.testTargetSlow ()
+
+ +

Slow worker thread.

+
35def testTargetSlow():
+
36 r"""!Slow worker thread"""
+
37 logging.debug("run testTargetSlow start")
+
38 time.sleep(0.51)
+
39 logging.debug("run testTargetSlow end")
+
40
+
41
+
42@pytest.fixture()
+
+
+
+ +

◆ useTimerFast()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.useTimerFast ()
+
+ +

Server a RepeatedTimer instance with fast worker.

+
43def useTimerFast():
+
44 r"""!Server a RepeatedTimer instance with fast worker"""
+
45 testTimer = RepeatedTimer(0.1, testTargetFast)
+
46 yield testTimer
+
47 if testTimer.isRunning:
+
48 assert testTimer.stop()
+
49
+
50
+
51@pytest.fixture()
+
+
+
+ +

◆ useTimerSlow()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.useTimerSlow ()
+
+ +

Server a RepeatedTimer instance slow worker.

+
52def useTimerSlow():
+
53 r"""!Server a RepeatedTimer instance slow worker"""
+
54 testTimer = RepeatedTimer(0.1, testTargetSlow)
+
55 yield testTimer
+
56 if testTimer.isRunning:
+
57 assert testTimer.stop()
+
58
+
59
+
+
+
+ +

◆ test_timerStartStop()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerStartStop ( useTimerFast)
+
+ +

Try to start and stop a timer.

+
60def test_timerStartStop(useTimerFast):
+
61 r"""!Try to start and stop a timer"""
+
62 assert useTimerFast.start()
+
63 assert useTimerFast.stop()
+
64
+
65
+
+
+
+ +

◆ test_timerDoubleStart()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerDoubleStart ( useTimerFast)
+
+ +

Try to start a timer twice.

+
66def test_timerDoubleStart(useTimerFast):
+
67 r"""!Try to start a timer twice"""
+
68 assert useTimerFast.start()
+
69 assert useTimerFast.start()
+
70 assert useTimerFast.stop()
+
71
+
72
+
+
+
+ +

◆ test_timerStopNotStarted()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerStopNotStarted ( useTimerFast)
+
+ +

Try to stop a timer where is not started.

+
73def test_timerStopNotStarted(useTimerFast):
+
74 r"""!Try to stop a timer where is not started"""
+
75 assert useTimerFast.stop()
+
76
+
77
+
+
+
+ +

◆ test_timerIsRunning()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerIsRunning ( useTimerFast)
+
+ +

Check if a timer is running.

+
78def test_timerIsRunning(useTimerFast):
+
79 r"""!Check if a timer is running"""
+
80 assert useTimerFast.start()
+
81 assert useTimerFast.isRunning
+
82 assert useTimerFast.stop()
+
83
+
84
+
+
+
+ +

◆ test_timerRun()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerRun ( useTimerFast)
+
+ +

Run a timer and check overdue and lostEvents.

+
85def test_timerRun(useTimerFast):
+
86 r"""!Run a timer and check overdue and lostEvents"""
+
87 assert useTimerFast.start()
+
88 time.sleep(0.2)
+
89 assert useTimerFast.stop()
+
90 assert useTimerFast.overdueCount == 0
+
91 assert useTimerFast.lostEvents == 0
+
92
+
93
+
+
+
+ +

◆ test_timerOverdue()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerOverdue ( useTimerSlow)
+
+ +

Run a timer and check overdue and lostEvents.

+
94def test_timerOverdue(useTimerSlow):
+
95 r"""!Run a timer and check overdue and lostEvents"""
+
96 assert useTimerSlow.start()
+
97 time.sleep(0.2)
+
98 assert useTimerSlow.stop()
+
99 assert useTimerSlow.overdueCount == 1
+
100 assert useTimerSlow.lostEvents == 5
+
101
+
102
+
+
+
+ +

◆ test_timerOverdueLong()

+ +
+
+ + + + + + + +
test.boswatch.test_timer.test_timerOverdueLong ( useTimerSlow)
+
+ +

Run a timer and check overdue and lostEvents.

+
103def test_timerOverdueLong(useTimerSlow):
+
104 r"""!Run a timer and check overdue and lostEvents"""
+
105 assert useTimerSlow.start()
+
106 time.sleep(1)
+
107 assert useTimerSlow.stop()
+
108 assert useTimerSlow.overdueCount == 2
+
109 assert useTimerSlow.lostEvents == 10
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1module.html b/api/html/namespacetest_1_1module.html new file mode 100644 index 0000000..11c6fa4 --- /dev/null +++ b/api/html/namespacetest_1_1module.html @@ -0,0 +1,127 @@ + + + + + + + +BOSWatch 3: test.module Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.module Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  test_descriptor
 
+
+
+ + + + diff --git a/api/html/namespacetest_1_1module_1_1test__descriptor.html b/api/html/namespacetest_1_1module_1_1test__descriptor.html new file mode 100644 index 0000000..c7cd919 --- /dev/null +++ b/api/html/namespacetest_1_1module_1_1test__descriptor.html @@ -0,0 +1,341 @@ + + + + + + + +BOSWatch 3: test.module.test_descriptor Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.module.test_descriptor Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

 setup_method (method)
 
 makeDescriptor ()
 Build a descriptor object with loaded configuration.
 
 makePacket ()
 Build a BW Packet object.
 
 test_descriptorFoundFirst (makeDescriptor, makePacket)
 Run descriptor on the first entry in list.
 
 test_descriptorFoundSecond (makeDescriptor, makePacket)
 Run descriptor on the second entry in list.
 
 test_descriptorNotFound (makeDescriptor, makePacket)
 Run descriptor no matching data found.
 
 test_descriptorScanFieldNotAvailable (makeDescriptor, makePacket)
 Run descriptor on a non existent scanField.
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_method()

+ +
+
+ + + + + + + +
test.module.test_descriptor.setup_method ( method)
+
+
28def setup_method(method):
+
29 logging.debug("[TEST] %s.%s", method.__module__, method.__name__)
+
30
+
31
+
32@pytest.fixture
+
+
+
+ +

◆ makeDescriptor()

+ +
+
+ + + + + + + +
test.module.test_descriptor.makeDescriptor ()
+
+ +

Build a descriptor object with loaded configuration.

+
33def makeDescriptor():
+
34 r"""!Build a descriptor object with loaded configuration"""
+
35 config = ConfigYAML()
+
36 assert config.loadConfigFile(paths.TEST_PATH + "test_config.yaml") is True
+
37 descriptor = Descriptor(config.get("descriptor_test"))
+
38 return descriptor
+
39
+
40
+
41@pytest.fixture
+
+
+
+ +

◆ makePacket()

+ +
+
+ + + + + + + +
test.module.test_descriptor.makePacket ()
+
+ +

Build a BW Packet object.

+
42def makePacket():
+
43 r"""!Build a BW Packet object"""
+
44 packet = Packet()
+
45 return packet
+
46
+
47
+
+
+
+ +

◆ test_descriptorFoundFirst()

+ +
+
+ + + + + + + + + + + +
test.module.test_descriptor.test_descriptorFoundFirst ( makeDescriptor,
makePacket )
+
+ +

Run descriptor on the first entry in list.

+
48def test_descriptorFoundFirst(makeDescriptor, makePacket):
+
49 r"""!Run descriptor on the first entry in list"""
+
50 makePacket.set("tone", "12345")
+
51 makePacket = makeDescriptor.doWork(makePacket)
+
52 assert makePacket.get("description") == "Test 12345"
+
53
+
54
+
+
+
+ +

◆ test_descriptorFoundSecond()

+ +
+
+ + + + + + + + + + + +
test.module.test_descriptor.test_descriptorFoundSecond ( makeDescriptor,
makePacket )
+
+ +

Run descriptor on the second entry in list.

+
55def test_descriptorFoundSecond(makeDescriptor, makePacket):
+
56 r"""!Run descriptor on the second entry in list"""
+
57 makePacket.set("tone", "23456")
+
58 makePacket = makeDescriptor.doWork(makePacket)
+
59 assert makePacket.get("description") == "Test 23456"
+
60
+
61
+
+
+
+ +

◆ test_descriptorNotFound()

+ +
+
+ + + + + + + + + + + +
test.module.test_descriptor.test_descriptorNotFound ( makeDescriptor,
makePacket )
+
+ +

Run descriptor no matching data found.

+
62def test_descriptorNotFound(makeDescriptor, makePacket):
+
63 r"""!Run descriptor no matching data found"""
+
64 makePacket.set("tone", "99999")
+
65 makePacket = makeDescriptor.doWork(makePacket)
+
66 assert makePacket.get("description") == "99999"
+
67
+
68
+
+
+
+ +

◆ test_descriptorScanFieldNotAvailable()

+ +
+
+ + + + + + + + + + + +
test.module.test_descriptor.test_descriptorScanFieldNotAvailable ( makeDescriptor,
makePacket )
+
+ +

Run descriptor on a non existent scanField.

+
69def test_descriptorScanFieldNotAvailable(makeDescriptor, makePacket):
+
70 r"""!Run descriptor on a non existent scanField"""
+
71 makePacket = makeDescriptor.doWork(makePacket)
+
72 assert makePacket.get("description") is None
+
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1plugin.html b/api/html/namespacetest_1_1plugin.html new file mode 100644 index 0000000..7960f74 --- /dev/null +++ b/api/html/namespacetest_1_1plugin.html @@ -0,0 +1,119 @@ + + + + + + + +BOSWatch 3: test.plugin Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
test.plugin Namespace Reference
+
+
+
+
+ + + + diff --git a/api/html/namespacetest_1_1test__template.html b/api/html/namespacetest_1_1test__template.html new file mode 100644 index 0000000..5c35c38 --- /dev/null +++ b/api/html/namespacetest_1_1test__template.html @@ -0,0 +1,244 @@ + + + + + + + +BOSWatch 3: test.test_template Namespace Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
test.test_template Namespace Reference
+
+
+ + + + + + + + + + + + +

+Functions

 setup_method (method)
 
 fixtureTemplate ()
 
 test_skippedTest ()
 
 test_testName ()
 
 test_withFixture (fixtureTemplate)
 
+

Detailed Description

+

+

/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / / __ / / / /__ | | /| / / __ `/ __/ ___/ __ \ /_ < / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / /_____/____//____/ |__/|__/__,_/__/___/_/ /_/ /____/ German BOS Information Script by Bastian Schroll

+

Function Documentation

+ +

◆ setup_method()

+ +
+
+ + + + + + + +
test.test_template.setup_method ( method)
+
+
23def setup_method(method):
+
24 logging.debug("[TEST] %s.%s", method.__module__, method.__name__)
+
25
+
26
+
27@pytest.fixture
+
+
+
+ +

◆ fixtureTemplate()

+ +
+
+ + + + + + + +
test.test_template.fixtureTemplate ()
+
+
28def fixtureTemplate():
+
29 return None
+
30
+
31
+
32@pytest.mark.skip("Reason why i will skipped")
+
+
+
+ +

◆ test_skippedTest()

+ +
+
+ + + + + + + +
test.test_template.test_skippedTest ()
+
+
33def test_skippedTest():
+
34 pass
+
35
+
36
+
+
+
+ +

◆ test_testName()

+ +
+
+ + + + + + + +
test.test_template.test_testName ()
+
+
37def test_testName():
+
38 pass
+
39
+
40
+
+
+
+ +

◆ test_withFixture()

+ +
+
+ + + + + + + +
test.test_template.test_withFixture ( fixtureTemplate)
+
+
41def test_withFixture(fixtureTemplate):
+
42 assert fixtureTemplate is None
+
+
+
+
+
+ + + + diff --git a/api/html/nav_f.png b/api/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..e865bca922400d18cb1cee52f5c66ae10889dcea GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQgNOxjv*C{Z|_?3H7E$MTxi|7 zTGmZaFyh0tW5=A#MBI{l+$(0Dse9*eyH4R_*95OnW3dWBm$qoH$Hr@BuqGGmTxDrk zl_=bkI%DF+nJYS9h_8JYYg;vYW&iK&@1Lrf)E6tPTYYHmI-pGqp00i_>zopr0JfJm AWB>pF literal 0 HcmV?d00001 diff --git a/api/html/nav_fd.png b/api/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7a3bf8f0c8aff2bbab49e1f79ef0c144a10dc4 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQpuh!jv*C{Z|}x(wJM0PJP1@Y zYOOo5NN$n0i-^mX#ozXKtm*r%+ML1J{+`FU+hK2>Q#g0~-B!Kl!QT6|)Rs%0)R6!8 z?Yi5EHH&pF%S)=QHO_Ncz{CFGt;GJ+XQ}m{U);BPz;MZ3{8fZfwG_}g22WQ%mvv4F FO#s*JI9>n% literal 0 HcmV?d00001 diff --git a/api/html/nav_g.png b/api/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!K=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/-/g,'_')); + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=ARROW_RIGHT; + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + label : document.createTextNode(text), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(node.label); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+11 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaQ)2X zr80*(t=hbI_9rQdue7YL`QT}%qI}@~mfShwA&+iUH|w9bGdd7`E#Z5 Wcx7@kJL7<+F?hQAxvX + + + + + + +BOSWatch 3: Related Pages + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+ + + +
 BOSWatch
 Todo List
+
+
+
+ + + + diff --git a/api/html/plus.svg b/api/html/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/api/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/html/plusd.svg b/api/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/api/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/html/resize.js b/api/html/resize.js new file mode 100644 index 0000000..178d03b --- /dev/null +++ b/api/html/resize.js @@ -0,0 +1,147 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + // workaround for firefox + $("body").css({overflow: "hidden"}); + } + $(window).on('load',function() { resizeHeight(treeview); }); +} +/* @license-end */ diff --git a/api/html/search/all_0.js b/api/html/search/all_0.js new file mode 100644 index 0000000..2f7a65a --- /dev/null +++ b/api/html/search/all_0.js @@ -0,0 +1,83 @@ +var searchData= +[ + ['_5f_5fdel_5f_5f_0',['__del__',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#aa4fcca86240231413885fcd050744152',1,'boswatch.network.broadcast.BroadcastServer.__del__()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a7bd8bbf36dc9e947fd6889b64e66bf79',1,'boswatch.network.server.TCPServer.__del__()'],['../classplugin_1_1telegram_1_1_m_q_bot.html#a83cf2befc52ad0318c6f274a4f4e7106',1,'plugin.telegram.MQBot.__del__()']]], + ['_5f_5finit_5f_5f_1',['__init__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab71fa021f469d6d45d597c0594403c85',1,'boswatch.configYaml.ConfigYAML.__init__()'],['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#af27cd87704982341ab475309db6036aa',1,'boswatch.inputSource.inputBase.InputBase.__init__()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#ab4294fb84142b6c5c7897adbac664bb1',1,'boswatch.network.broadcast.BroadcastClient.__init__()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ae93a0a17a87977e5e675361f513c18d6',1,'boswatch.network.broadcast.BroadcastServer.__init__()'],['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a52dad8d55fb35e07756a5a779deff7fe',1,'boswatch.network.client.TCPClient.__init__()'],['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a93d5881314909255eb8b687a94942526',1,'boswatch.network.netCheck.NetCheck.__init__()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aa7bde82a0490275757eb62cf2245ece8',1,'boswatch.network.server.TCPServer.__init__()'],['../classboswatch_1_1packet_1_1_packet.html#a33f9ad91a87a012e192cd2ef629b536e',1,'boswatch.packet.Packet.__init__()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a932e0d5d67cca47b4e5fc73a25082408',1,'boswatch.processManager.ProcessManager.__init__()'],['../classboswatch_1_1router_1_1route_1_1_route.html#a15d3829220d3bd9ba38fc95d562227e0',1,'boswatch.router.route.Route.__init__()'],['../classboswatch_1_1router_1_1router_1_1_router.html#aa7c921ad0880824595d7fa05bcac6b08',1,'boswatch.router.router.Router.__init__()'],['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a0a84f95c300da38392422533d5782aaf',1,'boswatch.router.routerManager.RouterManager.__init__()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a6456136d21c1cfa45cea27f8e52a6d90',1,'boswatch.timer.RepeatedTimer.__init__()'],['../classmodule_1_1descriptor_1_1_boswatch_module.html#aa1bc2516e337c8fa96ef7e3656435f85',1,'module.descriptor.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a10e2b681c89887ee422f01a1f9ae9dcd',1,'module.filter.doubleFilter.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a40d029c8dc22e315b84237d31055137b',1,'module.filter.modeFilter.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a7d0ba6d5f55296e81be161ffc0cf5f86',1,'module.filter.regexFilter.BoswatchModule.__init__()'],['../classmodule_1_1geocoding_1_1_boswatch_module.html#a0c730c8d45b001e1ddb2ab73400df373',1,'module.geocoding.BoswatchModule.__init__()'],['../classmodule_1_1module_base_1_1_module_base.html#afee02f2e4ef75f43eb819facba9e9bd7',1,'module.moduleBase.ModuleBase.__init__()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a3f001ec829334fde0039cdbfec542588',1,'module.template_module.BoswatchModule.__init__()'],['../classplugin_1_1divera_1_1_boswatch_plugin.html#a15699267f01c1dcf595832ceaf3a717c',1,'plugin.divera.BoswatchPlugin.__init__()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a5a9cebdc7d9bfbb1c4655ce8df99885b',1,'plugin.http.BoswatchPlugin.__init__()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#ab7dc98122deb62b02cab749b3f4fee32',1,'plugin.mysql.BoswatchPlugin.__init__()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#ade82c0cd7c4c180dc62e5e6ca425d063',1,'plugin.pluginBase.PluginBase.__init__()'],['../classplugin_1_1telegram_1_1_m_q_bot.html#a67cb2a543fc2dcf6c8e25493ee3dcd16',1,'plugin.telegram.MQBot.__init__()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a07bd64a5b06e7a16d4438dd4fd231edb',1,'plugin.telegram.BoswatchPlugin.__init__()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#adc94a0cafa6b6ff4d3b837fd6ac874a4',1,'plugin.template_plugin.BoswatchPlugin.__init__()']]], + ['_5f_5fiter_5f_5f_2',['__iter__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab774c33b0a9d2cf9f9a1ecbe28509ed5',1,'boswatch::configYaml::ConfigYAML']]], + ['_5f_5flen_5f_5f_3',['__len__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a3e9d8bb1064df8d4971cb9c53c4df727',1,'boswatch::configYaml::ConfigYAML']]], + ['_5f_5fstr_5f_5f_4',['__str__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a973b5c19761074acf7e59407ecb36e5b',1,'boswatch.configYaml.ConfigYAML.__str__()'],['../classboswatch_1_1packet_1_1_packet.html#aaa72c4726ad47f994e915ad397b89186',1,'boswatch.packet.Packet.__str__()']]], + ['_5fadditionalwildcards_5',['_additionalWildcards',['../namespaceboswatch_1_1wildcard.html#a3bb21b17cf726f8a3ccf52db774a369e',1,'boswatch::wildcard']]], + ['_5falarmerrorcount_6',['_alarmErrorCount',['../classplugin_1_1plugin_base_1_1_plugin_base.html#ab9145f156441739cf1cd9d1b4a5e67c9',1,'plugin::pluginBase::PluginBase']]], + ['_5falarmqueue_7',['_alarmQueue',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a3126636b3ebc15906a02433a9f921cdd',1,'boswatch::network::server::TCPServer']]], + ['_5falarmtime_8',['_alarmTime',['../classplugin_1_1plugin_base_1_1_plugin_base.html#ab8555502760f06321573b32b20a07093',1,'plugin::pluginBase::PluginBase']]], + ['_5fargs_9',['_args',['../classboswatch_1_1process_manager_1_1_process_manager.html#a115b1f84ab38b22275d409a63257c2e9',1,'boswatch.processManager.ProcessManager._args'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a33f78dd48f368e8b2e423b94d8d4f7f0',1,'boswatch.timer.RepeatedTimer._args']]], + ['_5fasyncrequests_10',['_asyncRequests',['../classplugin_1_1divera_1_1_boswatch_plugin.html#ad710304e33432b74c0e1716283bea397',1,'plugin.divera.BoswatchPlugin._asyncRequests()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a5e3200e56a8022a46bc3aaeab915ed74',1,'plugin.http.BoswatchPlugin._asyncRequests()']]], + ['_5fbroadcastport_11',['_broadcastPort',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#acdd370e919a9df510c393bf3cd220760',1,'boswatch::network::broadcast::BroadcastClient']]], + ['_5fbwpacket_12',['_bwPacket',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a049f3c84ba64856a66532d60a7b3c823',1,'plugin::pluginBase::PluginBase']]], + ['_5fcheck_13',['_check',['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a43d03ed47b4c9bdaf34daec40cf094d4',1,'module::filter::doubleFilter::BoswatchModule']]], + ['_5fcleanup_14',['_cleanup',['../classmodule_1_1module_base_1_1_module_base.html#ae43a99376d14379225916bbce74793bd',1,'module.moduleBase.ModuleBase._cleanup()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a176d74cf5854616fc0e716226d29716f',1,'plugin.pluginBase.PluginBase._cleanup()']]], + ['_5fclientsconnected_15',['_clientsConnected',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ad384e027f90c85bd533081c5df69c143',1,'boswatch::network::server::TCPServer']]], + ['_5fclientsconnectedlock_16',['_clientsConnectedLock',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ad7d5a3318dd17eb81d4145b364354b9b',1,'boswatch::network::server::TCPServer']]], + ['_5fconfig_17',['_config',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a099b2cad054f88c4819f4cc0c369b6d6',1,'boswatch::configYaml::ConfigYAML']]], + ['_5fcumtime_18',['_cumTime',['../classboswatch_1_1router_1_1router_1_1_router.html#a12a8f1e03f1ca7d9a10d5b59faf03e02',1,'boswatch.router.router.Router._cumTime'],['../classmodule_1_1module_base_1_1_module_base.html#a96ad0ccc9a2dadf099285b5e938a098a',1,'module.moduleBase.ModuleBase._cumTime'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a69bcc46e64dbaddf524f49adb246a491',1,'plugin.pluginBase.PluginBase._cumTime']]], + ['_5fdecoderconfig_19',['_decoderConfig',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a39c4c74464f0d25c2545270f420c24cd',1,'boswatch::inputSource::inputBase::InputBase']]], + ['_5fevent_20',['_event',['../classboswatch_1_1timer_1_1_repeated_timer.html#ad0dde3339f157e43f191aafab23f03e5',1,'boswatch::timer::RepeatedTimer']]], + ['_5ffetch_21',['_fetch',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a995706093c53e10bd494c98f06c8b8cb',1,'plugin.divera.BoswatchPlugin._fetch()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a201e0da093af49f002c1e6b8b6757480',1,'plugin.http.BoswatchPlugin._fetch()']]], + ['_5ffilterlists_22',['_filterLists',['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#acea4923f42d2b6688455567e1c3f6f2e',1,'module.filter.doubleFilter.BoswatchModule._filterLists'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a8636be116a0033d585673a8c0e3527d0',1,'module.filter.doubleFilter.BoswatchModule._filterLists']]], + ['_5ffunction_23',['_function',['../classboswatch_1_1timer_1_1_repeated_timer.html#a925a7f0f26df28aa88fb69ef192b1deb',1,'boswatch::timer::RepeatedTimer']]], + ['_5fgetbitratericsubric_24',['_getBitrateRicSubric',['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a9c7e70e58eacd1cf556ca02ca5a2d639',1,'boswatch::decoder::pocsagDecoder::PocsagDecoder']]], + ['_5fgetstatistics_25',['_getStatistics',['../classboswatch_1_1router_1_1router_1_1_router.html#a4f0f891fcae507b7f47ec389194d912c',1,'boswatch.router.router.Router._getStatistics()'],['../classmodule_1_1module_base_1_1_module_base.html#a872db7602a8139866730ba79a220314b',1,'module.moduleBase.ModuleBase._getStatistics()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a3689bf4fef985b41df640c79b2eb71b2',1,'plugin.pluginBase.PluginBase._getStatistics()']]], + ['_5fhostname_26',['_hostname',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#abd1284df56696f11553229f48e33379d',1,'boswatch::network::netCheck::NetCheck']]], + ['_5finputconfig_27',['_inputConfig',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a6ef8c7d1da7aa6c0aa391f6391dbc908',1,'boswatch::inputSource::inputBase::InputBase']]], + ['_5finputqueue_28',['_inputQueue',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a16a630736e398371fbb7d9b8a39880cc',1,'boswatch::inputSource::inputBase::InputBase']]], + ['_5finputthread_29',['_inputThread',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a6af1af984a2046a70a73e4ce2d6f1bfe',1,'boswatch.inputSource.inputBase.InputBase._inputThread'],['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#aac7a9d6165202e4f97ba8b8241e74012',1,'boswatch.inputSource.inputBase.InputBase._inputThread']]], + ['_5finterval_30',['_interval',['../classboswatch_1_1timer_1_1_repeated_timer.html#ad1430785a88382edf7f5577060e0d01a',1,'boswatch::timer::RepeatedTimer']]], + ['_5fis_5fmessages_5fqueued_5fdefault_31',['_is_messages_queued_default',['../classplugin_1_1telegram_1_1_m_q_bot.html#a507bb5109a57f3ae4f424deedb44c9c9',1,'plugin::telegram::MQBot']]], + ['_5fisrunning_32',['_isRunning',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#ab32d042b09f11fe44d9d2a213241aa0e',1,'boswatch.inputSource.inputBase.InputBase._isRunning'],['../classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html#a80507ea35abcb897f2b27265ca43f98f',1,'boswatch.inputSource.lineInInput.LineInInput._isRunning'],['../classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html#acf7d29232bad1b330d309f37cb064f65',1,'boswatch.inputSource.pulseaudioInput.PulseAudioInput._isRunning'],['../classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html#a66fdca8f67bc143ad3d087496cb0cb92',1,'boswatch.inputSource.sdrInput.SdrInput._isRunning'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a7ae2d4c2a6d8f17307df85227f3b1085',1,'boswatch.timer.RepeatedTimer._isRunning']]], + ['_5fkwargs_33',['_kwargs',['../classboswatch_1_1timer_1_1_repeated_timer.html#ae92aee50e2a2341581abec6a14c788da',1,'boswatch::timer::RepeatedTimer']]], + ['_5flisten_34',['_listen',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a5155943e9eb814fa38e30838998b0c97',1,'boswatch::network::broadcast::BroadcastServer']]], + ['_5fmakerequests_35',['_makeRequests',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a2bf369f81f8e4aa4497b058ce57fa9b7',1,'plugin.divera.BoswatchPlugin._makeRequests()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#ab0d2721349d465674f27e7fb0ec07f52',1,'plugin.http.BoswatchPlugin._makeRequests()']]], + ['_5fmoduleerrorcount_36',['_moduleErrorCount',['../classmodule_1_1module_base_1_1_module_base.html#ac95033dbbecea6287331a58f4b2fd046',1,'module::moduleBase::ModuleBase']]], + ['_5fmodulename_37',['_moduleName',['../classmodule_1_1module_base_1_1_module_base.html#a667c99040b316d66a00de34ff5cebf3e',1,'module::moduleBase::ModuleBase']]], + ['_5fmodulesactive_38',['_modulesActive',['../classmodule_1_1module_base_1_1_module_base.html#addb1f046325535d8f3036c605429cf14',1,'module::moduleBase::ModuleBase']]], + ['_5fmoduletime_39',['_moduleTime',['../classmodule_1_1module_base_1_1_module_base.html#a9b6aa123432ef49e373f643f5b10a82c',1,'module::moduleBase::ModuleBase']]], + ['_5fmsg_5fqueue_40',['_msg_queue',['../classplugin_1_1telegram_1_1_m_q_bot.html#a9f38fd67d29650b5976e4794b324c6b1',1,'plugin::telegram::MQBot']]], + ['_5fpacket_41',['_packet',['../classboswatch_1_1packet_1_1_packet.html#a3fb27af3d9f25714b715ac313798cbb2',1,'boswatch::packet::Packet']]], + ['_5fpluginname_42',['_pluginName',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a30f6b8fcaef2e480f3c4e270ed400a05',1,'plugin::pluginBase::PluginBase']]], + ['_5fpluginsactive_43',['_pluginsActive',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a115d9600af538a3b7b2cf63225361cfc',1,'plugin::pluginBase::PluginBase']]], + ['_5fprocesshandle_44',['_processHandle',['../classboswatch_1_1process_manager_1_1_process_manager.html#aee5993f601ba3472c92bb06a0b278663',1,'boswatch::processManager::ProcessManager']]], + ['_5frouterdict_45',['_routerDict',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a847bf4d91a11bc22b44977c04f616e73',1,'boswatch.router.routerManager.RouterManager._routerDict'],['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a8a1753d5725c13435417935a7f44a668',1,'boswatch.router.routerManager.RouterManager._routerDict']]], + ['_5froutertime_46',['_routerTime',['../classboswatch_1_1router_1_1router_1_1_router.html#a06691105ddcd06e4f0fcd323a1b8a261',1,'boswatch::router::router::Router']]], + ['_5frun_47',['_run',['../classmodule_1_1module_base_1_1_module_base.html#a1bc0d95375400ac328aaa9c10fd1996a',1,'module.moduleBase.ModuleBase._run()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a845b34feb0883393a1a521407ab37072',1,'plugin.pluginBase.PluginBase._run()']]], + ['_5fruncount_48',['_runCount',['../classboswatch_1_1router_1_1router_1_1_router.html#abc663ec17904868934fa8682aa7859a9',1,'boswatch.router.router.Router._runCount'],['../classmodule_1_1module_base_1_1_module_base.html#a9f55a9dd81ff02426ae9d73ff62f4134',1,'module.moduleBase.ModuleBase._runCount'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#abdb7ee79ffd6c4145fa5240b542c8187',1,'plugin.pluginBase.PluginBase._runCount']]], + ['_5frunthread_49',['_runThread',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a846609a2f9dd8b30009aa1bfd8131437',1,'boswatch.inputSource.inputBase.InputBase._runThread()'],['../classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html#a57e48d2c1329f7c8dc2604a0c88dc8c0',1,'boswatch.inputSource.lineInInput.LineInInput._runThread()'],['../classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html#a343b1c81e6088a31501568c006542ff0',1,'boswatch.inputSource.pulseaudioInput.PulseAudioInput._runThread()'],['../classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html#aaccbce0d6b8c281e71a0c3703e43a704',1,'boswatch.inputSource.sdrInput.SdrInput._runThread()']]], + ['_5fsavestats_50',['_saveStats',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a97f0f4b83877b3c0765e9387048c3429',1,'boswatch::router::routerManager::RouterManager']]], + ['_5fsendlocation_51',['_sendLocation',['../classplugin_1_1telegram_1_1_boswatch_plugin.html#accea7cd16ddb267acd6f393628ec23d6',1,'plugin::telegram::BoswatchPlugin']]], + ['_5fsendmessage_52',['_sendMessage',['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a776065ec08ddb1412c9212a97b054596',1,'plugin::telegram::BoswatchPlugin']]], + ['_5fserveport_53',['_servePort',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a6d220c67297313c9c3523a8aac9669e9',1,'boswatch::network::broadcast::BroadcastServer']]], + ['_5fserver_54',['_server',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a196dd011e76b9ffa269b1d7ae945317f',1,'boswatch::network::server::TCPServer']]], + ['_5fserver_5fthread_55',['_server_thread',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a069063419170444e452c49d4d3226d42',1,'boswatch.network.server.TCPServer._server_thread'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a502b42c4e702a1ef1440d7d156ea4493',1,'boswatch.network.server.TCPServer._server_thread']]], + ['_5fserverip_56',['_serverIP',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a3cdfb326c00a65543c5277f8c0a013af',1,'boswatch::network::broadcast::BroadcastClient']]], + ['_5fserverport_57',['_serverPort',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a52906f01625de0d1a89331265a4ea2c4',1,'boswatch::network::broadcast::BroadcastClient']]], + ['_5fservershutdown_58',['_serverShutdown',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#adeecb8b6c9efbd9752657bc23c0abadb',1,'boswatch::network::broadcast::BroadcastServer']]], + ['_5fserverthread_59',['_serverThread',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a5181654894e310d20de83207e4fc6d07',1,'boswatch.network.broadcast.BroadcastServer._serverThread'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a74f239839968faaed59206bc4f02cdff',1,'boswatch.network.broadcast.BroadcastServer._serverThread']]], + ['_5fsetuperrorcount_60',['_setupErrorCount',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a9968925b171eea70507286142e8a442d',1,'plugin::pluginBase::PluginBase']]], + ['_5fsetuptime_61',['_setupTime',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a55a4a34b3f98ae8162633a0caf77eea6',1,'plugin::pluginBase::PluginBase']]], + ['_5fshowrouterroute_62',['_showRouterRoute',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#ab546d0c2d93ff67032c7ce10be3604cd',1,'boswatch::router::routerManager::RouterManager']]], + ['_5fsock_63',['_sock',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a085df370df1ad97a2ea2b9a510590721',1,'boswatch::network::client::TCPClient']]], + ['_5fsocket_64',['_socket',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#ae5551bfa3d1cc9957c97869ded23fe14',1,'boswatch.network.broadcast.BroadcastClient._socket'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a896370fa8a3adca5e0435d3433a5bfcf',1,'boswatch.network.broadcast.BroadcastServer._socket']]], + ['_5fsolvedoubletone_65',['_solveDoubleTone',['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#af7f14c40e52ebac1349cc31b73928bc9',1,'boswatch::decoder::zveiDecoder::ZveiDecoder']]], + ['_5fstart_66',['_start',['../classboswatch_1_1timer_1_1_repeated_timer.html#a41ace1d4fc64ef5196eea937d5247c1b',1,'boswatch::timer::RepeatedTimer']]], + ['_5fstarttime_67',['_startTime',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a3da3dc3de144cf743f76862eca77e998',1,'boswatch::router::routerManager::RouterManager']]], + ['_5fstderr_68',['_stderr',['../classboswatch_1_1process_manager_1_1_process_manager.html#abb6bac128e56b2167fdf56f5bd3cea2e',1,'boswatch::processManager::ProcessManager']]], + ['_5fstdin_69',['_stdin',['../classboswatch_1_1process_manager_1_1_process_manager.html#a6d4df5612ac7d822144b8198299588f8',1,'boswatch::processManager::ProcessManager']]], + ['_5fstdout_70',['_stdout',['../classboswatch_1_1process_manager_1_1_process_manager.html#a593dfb43e5f701227e166ceb0dc1d930',1,'boswatch::processManager::ProcessManager']]], + ['_5fsumtime_71',['_sumTime',['../classplugin_1_1plugin_base_1_1_plugin_base.html#ae5d1664183b8986df4c61ebc96fb8483',1,'plugin::pluginBase::PluginBase']]], + ['_5ftarget_72',['_target',['../classboswatch_1_1timer_1_1_repeated_timer.html#a0a8c3bc1726ae2a8f43a36a4f2f74165',1,'boswatch::timer::RepeatedTimer']]], + ['_5fteardownerrorcount_73',['_teardownErrorCount',['../classplugin_1_1plugin_base_1_1_plugin_base.html#abb9f93add76f10d02c72f75f1034e2ad',1,'plugin::pluginBase::PluginBase']]], + ['_5fteardowntime_74',['_teardownTime',['../classplugin_1_1plugin_base_1_1_plugin_base.html#aeb241bbb7f19b71ec1d0e64be490f445',1,'plugin::pluginBase::PluginBase']]], + ['_5ftextmode_75',['_textMode',['../classboswatch_1_1process_manager_1_1_process_manager.html#a2c5d6361b9973cc43ed452056bda080b',1,'boswatch::processManager::ProcessManager']]], + ['_5fthread_76',['_thread',['../classboswatch_1_1timer_1_1_repeated_timer.html#a3b492713fbe661683f886f23c0925212',1,'boswatch.timer.RepeatedTimer._thread'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a0ba9bc6b5aea4aa3ecb3670a2ca64b2f',1,'boswatch.timer.RepeatedTimer._thread']]], + ['_5fthreadedtcprequesthandler_77',['_ThreadedTCPRequestHandler',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html',1,'boswatch::network::server']]], + ['_5fthreadedtcpserver_78',['_ThreadedTCPServer',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html',1,'boswatch::network::server']]], + ['_5ftimeout_79',['_timeout',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a3f96032d88c885267d1337c72d14da85',1,'boswatch.network.netCheck.NetCheck._timeout'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a34210569d9aeb0f83e23fda9ac6501c1',1,'boswatch.network.server.TCPServer._timeout']]] +]; diff --git a/api/html/search/all_1.js b/api/html/search/all_1.js new file mode 100644 index 0000000..10f3032 --- /dev/null +++ b/api/html/search/all_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['addargument_0',['addArgument',['../classboswatch_1_1process_manager_1_1_process_manager.html#a83b9d7d3aa926c0cdbe86d4a36873c50',1,'boswatch::processManager::ProcessManager']]], + ['addclientdatatopacket_1',['addClientDataToPacket',['../namespaceboswatch_1_1utils_1_1misc.html#a705227a3e9fbe79ea7e7c2530dfe126a',1,'boswatch::utils::misc']]], + ['addroute_2',['addRoute',['../classboswatch_1_1router_1_1router_1_1_router.html#a561f89ef4e05555ea81cfa5da4551e0d',1,'boswatch::router::router::Router']]], + ['addserverdatatopacket_3',['addServerDataToPacket',['../namespaceboswatch_1_1utils_1_1misc.html#afabe8cfe85ba7758d429e464a2135ec7',1,'boswatch::utils::misc']]], + ['addtoqueue_4',['addToQueue',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a83c2b67af75a860fc71b0424866f8bae',1,'boswatch::inputSource::inputBase::InputBase']]] +]; diff --git a/api/html/search/all_10.js b/api/html/search/all_10.js new file mode 100644 index 0000000..3fb27da --- /dev/null +++ b/api/html/search/all_10.js @@ -0,0 +1,90 @@ +var searchData= +[ + ['tcpclient_0',['TCPClient',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html',1,'boswatch::network::client']]], + ['tcpserver_1',['TCPServer',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html',1,'boswatch::network::server']]], + ['teardown_2',['teardown',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#abfa5c5279cfe58cae60af8272fb50f92',1,'plugin.mysql.BoswatchPlugin.teardown()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afbb808defd32c1cfc2714eba2f79654c',1,'plugin.pluginBase.PluginBase.teardown()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af332cd897823565ab3fbebf16e72c657',1,'plugin.template_plugin.BoswatchPlugin.teardown()']]], + ['test_3',['test',['../namespacetest.html',1,'']]], + ['test_3a_3aboswatch_4',['boswatch',['../namespacetest_1_1boswatch.html',1,'test']]], + ['test_3a_3aboswatch_3a_3atest_5fbroadcast_5',['test_broadcast',['../namespacetest_1_1boswatch_1_1test__broadcast.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fconfig_6',['test_config',['../namespacetest_1_1boswatch_1_1test__config.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fdecoder_7',['test_decoder',['../namespacetest_1_1boswatch_1_1test__decoder.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fheader_8',['test_header',['../namespacetest_1_1boswatch_1_1test__header.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fpacket_9',['test_packet',['../namespacetest_1_1boswatch_1_1test__packet.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fpaths_10',['test_paths',['../namespacetest_1_1boswatch_1_1test__paths.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fserverclient_11',['test_ServerClient',['../namespacetest_1_1boswatch_1_1test___server_client.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5ftimer_12',['test_timer',['../namespacetest_1_1boswatch_1_1test__timer.html',1,'test::boswatch']]], + ['test_3a_3amodule_13',['module',['../namespacetest_1_1module.html',1,'test']]], + ['test_3a_3amodule_3a_3atest_5fdescriptor_14',['test_descriptor',['../namespacetest_1_1module_1_1test__descriptor.html',1,'test::module']]], + ['test_3a_3aplugin_15',['plugin',['../namespacetest_1_1plugin.html',1,'test']]], + ['test_3a_3atest_5ftemplate_16',['test_template',['../namespacetest_1_1test__template.html',1,'test']]], + ['test_5fclientcommunicate_17',['test_clientCommunicate',['../namespacetest_1_1boswatch_1_1test___server_client.html#a53e16aba662adbe0ee440c745420e3c8',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientconnect_18',['test_clientConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#adfb2ec707525faac8c67988da712604a',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientconnectfailed_19',['test_clientConnectFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ab056b8e14f912c4fd86c547ac4b6aaf8',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientdisconnectfailed_20',['test_clientDisconnectFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ac68d64fea12533433a94626e3da6e45d',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientmulticommunicate_21',['test_clientMultiCommunicate',['../namespacetest_1_1boswatch_1_1test___server_client.html#af49d5647c2a61931bc75db21a3fc6713',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientmulticonnect_22',['test_clientMultiConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a8dc17ebce3b733b3f8ba54b4ff915018',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientreceivefailed_23',['test_clientReceiveFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ab5b0baa157d1cc21bdceb44295afd471',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientreconnect_24',['test_clientReconnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a7dddf1aa22861c92b223230d271e10a3',1,'test::boswatch::test_ServerClient']]], + ['test_5fclienttransmitfailed_25',['test_clientTransmitFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#a4f9d5c0058b014033e6a2f171c6b4e03',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientwithoutserver_26',['test_clientWithoutServer',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a1beba8a355f948b974c6eca495688d53',1,'test::boswatch::test_broadcast']]], + ['test_5fconfigiterationlist_27',['test_configIterationList',['../namespacetest_1_1boswatch_1_1test__config.html#ab1bb918fa2db4eef2e78d287523c737c',1,'test::boswatch::test_config']]], + ['test_5fconfigiterationlistwithnestedlist_28',['test_configIterationListWithNestedList',['../namespacetest_1_1boswatch_1_1test__config.html#ab1ebd7a6a4468befcfab36b719d21add',1,'test::boswatch::test_config']]], + ['test_5fcopypacket_29',['test_copyPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#a98582b979644b53581019ba0b6025bc9',1,'test::boswatch::test_packet']]], + ['test_5fcreatepacket_30',['test_createPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#a85110c044237b58d69bc8ba71ef614d9',1,'test::boswatch::test_packet']]], + ['test_5fdecoderfmsinvalid_31',['test_decoderFmsInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a78cf0cd07d79099866e88d0519fd66b2',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderfmsvalid_32',['test_decoderFmsValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a302b9b5e85adac7b3b408c4c16c84f48',1,'test::boswatch::test_decoder']]], + ['test_5fdecodernodata_33',['test_decoderNoData',['../namespacetest_1_1boswatch_1_1test__decoder.html#aca264520be505b58de78ff6865dfda02',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsaginvalid_34',['test_decoderPocsagInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a1942d82ff3c0be5b386a04c4c93d2852',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagshortric_35',['test_decoderPocsagShortRic',['../namespacetest_1_1boswatch_1_1test__decoder.html#a0b6b9f0db1716a8925b66805d6e1149f',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagtext_36',['test_decoderPocsagText',['../namespacetest_1_1boswatch_1_1test__decoder.html#a95e9d856e19b5b1e95b87ab8f9313c54',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagvalid_37',['test_decoderPocsagValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#ab477b786838cd7ec4e3aa16c2329062f',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveidoubletone_38',['test_decoderZveiDoubleTone',['../namespacetest_1_1boswatch_1_1test__decoder.html#a04c58f267d23fc6f2de1a12a9e606aee',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveiinvalid_39',['test_decoderZveiInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a72c83611f4f32d6485976eed69257e06',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveivalid_40',['test_decoderZveiValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a9107c0722a3150ac0143551453699548',1,'test::boswatch::test_decoder']]], + ['test_5fdescriptorfoundfirst_41',['test_descriptorFoundFirst',['../namespacetest_1_1module_1_1test__descriptor.html#a9a7997ce7320161ac68ccbdbe52cc7e3',1,'test::module::test_descriptor']]], + ['test_5fdescriptorfoundsecond_42',['test_descriptorFoundSecond',['../namespacetest_1_1module_1_1test__descriptor.html#af2b796a93343766a8791b20dd773bab5',1,'test::module::test_descriptor']]], + ['test_5fdescriptornotfound_43',['test_descriptorNotFound',['../namespacetest_1_1module_1_1test__descriptor.html#a654c266edff45e6adf0d69d9cf1ce95f',1,'test::module::test_descriptor']]], + ['test_5fdescriptorscanfieldnotavailable_44',['test_descriptorScanFieldNotAvailable',['../namespacetest_1_1module_1_1test__descriptor.html#ad7c1c4f59c5c1992392002b1cbfe1045',1,'test::module::test_descriptor']]], + ['test_5fdoubleconnect_45',['test_doubleConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a6eda50fc0446bd6144eb99bdb4236b12',1,'test::boswatch::test_ServerClient']]], + ['test_5ffileexists_46',['test_fileExists',['../namespacetest_1_1boswatch_1_1test__paths.html#acb35bf68938d6e9d9b964e7e90977500',1,'test::boswatch::test_paths']]], + ['test_5ffilenotexists_47',['test_fileNotExists',['../namespacetest_1_1boswatch_1_1test__paths.html#a7ec7af2a28a781231f40b923edea4a73',1,'test::boswatch::test_paths']]], + ['test_5fgetconfigasstring_48',['test_getConfigAsString',['../namespacetest_1_1boswatch_1_1test__config.html#a2312ded385013e4667e9dc8835984a9c',1,'test::boswatch::test_config']]], + ['test_5fgetdefaultvalue_49',['test_getDefaultValue',['../namespacetest_1_1boswatch_1_1test__config.html#abc3e5ba81f4ef81cee10f7970a84ebe3',1,'test::boswatch::test_config']]], + ['test_5fgetnestedconfig_50',['test_getNestedConfig',['../namespacetest_1_1boswatch_1_1test__config.html#acc781eabff5c119fd7b8ebfe475395c4',1,'test::boswatch::test_config']]], + ['test_5fgetnotsetfield_51',['test_getNotSetField',['../namespacetest_1_1boswatch_1_1test__packet.html#a9f47203586ef1c0d6e1fbc8fe80d3fd7',1,'test::boswatch::test_packet']]], + ['test_5fgetpacketstring_52',['test_getPacketString',['../namespacetest_1_1boswatch_1_1test__packet.html#aea179f6a3180612d1b42b0cf284837f8',1,'test::boswatch::test_packet']]], + ['test_5fgettypes_53',['test_getTypes',['../namespacetest_1_1boswatch_1_1test__config.html#a3c7f597f593254e2e61212807bb99d30',1,'test::boswatch::test_config']]], + ['test_5finfotolog_54',['test_infoToLog',['../namespacetest_1_1boswatch_1_1test__header.html#addb6d05be38f571d02a5df7f2645866f',1,'test::boswatch::test_header']]], + ['test_5floadconfigfile_55',['test_loadConfigFile',['../namespacetest_1_1boswatch_1_1test__config.html#a324ade0ada38618bb28d9437953a2a03',1,'test::boswatch::test_config']]], + ['test_5floadconfigfilefailed_56',['test_loadConfigFileFailed',['../namespacetest_1_1boswatch_1_1test__config.html#aef9f2e1a513a2afc84e14f0a30d52bef',1,'test::boswatch::test_config']]], + ['test_5floadconfigfilenotfound_57',['test_loadConfigFileNotFound',['../namespacetest_1_1boswatch_1_1test__config.html#ad3102474ad53dd0219ae7ea27b84b5fa',1,'test::boswatch::test_config']]], + ['test_5flogotolog_58',['test_logoToLog',['../namespacetest_1_1boswatch_1_1test__header.html#a3307a12dfa411c136bb5d46e1c257962',1,'test::boswatch::test_header']]], + ['test_5fmakedirexisting_59',['test_makeDirExisting',['../namespacetest_1_1boswatch_1_1test__paths.html#a1d6f2579cfa9da2b547fd9d26b1f98a6',1,'test::boswatch::test_paths']]], + ['test_5fmakedirnotexisting_60',['test_makeDirNotExisting',['../namespacetest_1_1boswatch_1_1test__paths.html#aee6cc09779b4f128855872445cfc01cf',1,'test::boswatch::test_paths']]], + ['test_5fpath_61',['TEST_PATH',['../namespaceboswatch_1_1utils_1_1paths.html#ade4311d374a07bf378c543906c1c9a68',1,'boswatch::utils::paths']]], + ['test_5fserverclientfetchconninfo_62',['test_serverClientFetchConnInfo',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ade3b23fe1ea7dc4c21693d3a24320319',1,'test::boswatch::test_broadcast']]], + ['test_5fserverdoublestart_63',['test_serverDoubleStart',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ac9e7df9092c7fd58dc3457ba16832a68',1,'test.boswatch.test_broadcast.test_serverDoubleStart()'],['../namespacetest_1_1boswatch_1_1test___server_client.html#af1167739109b3916cb361ef1aaa38b39',1,'test.boswatch.test_ServerClient.test_serverDoubleStart(getServer)']]], + ['test_5fservergetoutput_64',['test_serverGetOutput',['../namespacetest_1_1boswatch_1_1test___server_client.html#a1271b9db62b50645fb46a4b51adb9923',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverhighload_65',['test_serverHighLoad',['../namespacetest_1_1boswatch_1_1test___server_client.html#a145d0499562f3fbffb487d83f62682a2',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverrestart_66',['test_serverRestart',['../namespacetest_1_1boswatch_1_1test___server_client.html#a575095769f32d0bdb47b2441bb1c9a98',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstartstop_67',['test_serverStartStop',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a6941762a8a30c6f68e7e9048a0eb1fde',1,'test::boswatch::test_broadcast']]], + ['test_5fserverstarttwoinstances_68',['test_serverStartTwoInstances',['../namespacetest_1_1boswatch_1_1test___server_client.html#ad69e19f0e9f05614a9033a8ef462d9df',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstopfailed_69',['test_serverStopFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#a3932473bb96c4478ff02d34da7c64dd7',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstopnotstarted_70',['test_serverStopNotStarted',['../namespacetest_1_1boswatch_1_1test__broadcast.html#abe7c9d4433ecbdfd5ffd3978af0fad18',1,'test::boswatch::test_broadcast']]], + ['test_5fserverstopswhileconnected_71',['test_serverStopsWhileConnected',['../namespacetest_1_1boswatch_1_1test___server_client.html#aab408817266e5b7e486b4c5b3b58f717',1,'test::boswatch::test_ServerClient']]], + ['test_5fsetgetfield_72',['test_setGetField',['../namespacetest_1_1boswatch_1_1test__packet.html#ade58d1d4fadad6f32fd5be502da07040',1,'test::boswatch::test_packet']]], + ['test_5fskippedtest_73',['test_skippedTest',['../namespacetest_1_1test__template.html#a024dd9d0209a37f1f73b353f44a4b23d',1,'test::test_template']]], + ['test_5ftestname_74',['test_testName',['../namespacetest_1_1test__template.html#aed0a8a3bd07e9c6db89e9a4596e27316',1,'test::test_template']]], + ['test_5ftimerdoublestart_75',['test_timerDoubleStart',['../namespacetest_1_1boswatch_1_1test__timer.html#a42d0104d3b764c0e58b3c623bebbdcdf',1,'test::boswatch::test_timer']]], + ['test_5ftimerisrunning_76',['test_timerIsRunning',['../namespacetest_1_1boswatch_1_1test__timer.html#a0138848991e328da81931a6eb145378b',1,'test::boswatch::test_timer']]], + ['test_5ftimeroverdue_77',['test_timerOverdue',['../namespacetest_1_1boswatch_1_1test__timer.html#a762602b6405cfc27f0c3dfd0569e96fe',1,'test::boswatch::test_timer']]], + ['test_5ftimeroverduelong_78',['test_timerOverdueLong',['../namespacetest_1_1boswatch_1_1test__timer.html#ab7d880c3c176579d74c381f7d288e380',1,'test::boswatch::test_timer']]], + ['test_5ftimerrun_79',['test_timerRun',['../namespacetest_1_1boswatch_1_1test__timer.html#a797fb308507d78d2eaef60d07493130a',1,'test::boswatch::test_timer']]], + ['test_5ftimerstartstop_80',['test_timerStartStop',['../namespacetest_1_1boswatch_1_1test__timer.html#a9113cf1f0dca71d596e8d939baf42ecd',1,'test::boswatch::test_timer']]], + ['test_5ftimerstopnotstarted_81',['test_timerStopNotStarted',['../namespacetest_1_1boswatch_1_1test__timer.html#ac923af185a61ed08924bf70dad51b4ed',1,'test::boswatch::test_timer']]], + ['test_5fwithfixture_82',['test_withFixture',['../namespacetest_1_1test__template.html#a3049692c8eb437536ea0c21f51677a1d',1,'test::test_template']]], + ['testtargetfast_83',['testTargetFast',['../namespacetest_1_1boswatch_1_1test__timer.html#a709826d54a0d446157f94fc96c6f73bf',1,'test::boswatch::test_timer']]], + ['testtargetslow_84',['testTargetSlow',['../namespacetest_1_1boswatch_1_1test__timer.html#aa13f9738515b90525e66330cc4919de4',1,'test::boswatch::test_timer']]], + ['todo_20list_85',['Todo List',['../todo.html',1,'']]], + ['transmit_86',['transmit',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a0b220cacacdf690617645c7fefdc4f98',1,'boswatch::network::client::TCPClient']]] +]; diff --git a/api/html/search/all_11.js b/api/html/search/all_11.js new file mode 100644 index 0000000..3052edf --- /dev/null +++ b/api/html/search/all_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usetimerfast_0',['useTimerFast',['../namespacetest_1_1boswatch_1_1test__timer.html#abf32038d45ddda5ba6c027ea0c7e4647',1,'test::boswatch::test_timer']]], + ['usetimerslow_1',['useTimerSlow',['../namespacetest_1_1boswatch_1_1test__timer.html#ab976b93aca683f828ac3831ca5e487ab',1,'test::boswatch::test_timer']]] +]; diff --git a/api/html/search/all_12.js b/api/html/search/all_12.js new file mode 100644 index 0000000..930f36f --- /dev/null +++ b/api/html/search/all_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['zvei_0',['zvei',['../classplugin_1_1divera_1_1_boswatch_plugin.html#ae681c4a8b35f18cce21bab24a9b74f7c',1,'plugin.divera.BoswatchPlugin.zvei()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a35d80b12f07174df5a46c52776df6946',1,'plugin.http.BoswatchPlugin.zvei()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a54fbd13ab387336c4261349bb252ccc3',1,'plugin.mysql.BoswatchPlugin.zvei()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#af2d08ecea66961db0fd70e79927e7b80',1,'plugin.pluginBase.PluginBase.zvei()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#afa8a57888af2b30126ae6826b1873135',1,'plugin.telegram.BoswatchPlugin.zvei()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af5c36cb43b625a31e660b874b4ed03f5',1,'plugin.template_plugin.BoswatchPlugin.zvei()']]], + ['zveidecoder_1',['ZveiDecoder',['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html',1,'boswatch::decoder::zveiDecoder']]] +]; diff --git a/api/html/search/all_2.js b/api/html/search/all_2.js new file mode 100644 index 0000000..85cd663 --- /dev/null +++ b/api/html/search/all_2.js @@ -0,0 +1,45 @@ +var searchData= +[ + ['bin_5fpath_0',['BIN_PATH',['../namespaceboswatch_1_1utils_1_1paths.html#a5c1fbdc05d73387e0bdd376e8fc753b0',1,'boswatch::utils::paths']]], + ['boswatch_1',['BOSWatch',['../md__r_e_a_d_m_e.html',1,'']]], + ['boswatch_2',['boswatch',['../namespaceboswatch.html',1,'']]], + ['boswatch_3a_3aconfigyaml_3',['configYaml',['../namespaceboswatch_1_1config_yaml.html',1,'boswatch']]], + ['boswatch_3a_3adecoder_4',['decoder',['../namespaceboswatch_1_1decoder.html',1,'boswatch']]], + ['boswatch_3a_3adecoder_3a_3adecoder_5',['decoder',['../namespaceboswatch_1_1decoder_1_1decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3afmsdecoder_6',['fmsDecoder',['../namespaceboswatch_1_1decoder_1_1fms_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3apocsagdecoder_7',['pocsagDecoder',['../namespaceboswatch_1_1decoder_1_1pocsag_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3azveidecoder_8',['zveiDecoder',['../namespaceboswatch_1_1decoder_1_1zvei_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3ainputsource_9',['inputSource',['../namespaceboswatch_1_1input_source.html',1,'boswatch']]], + ['boswatch_3a_3ainputsource_3a_3ainputbase_10',['inputBase',['../namespaceboswatch_1_1input_source_1_1input_base.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3alineininput_11',['lineInInput',['../namespaceboswatch_1_1input_source_1_1line_in_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3apulseaudioinput_12',['pulseaudioInput',['../namespaceboswatch_1_1input_source_1_1pulseaudio_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3asdrinput_13',['sdrInput',['../namespaceboswatch_1_1input_source_1_1sdr_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3anetwork_14',['network',['../namespaceboswatch_1_1network.html',1,'boswatch']]], + ['boswatch_3a_3anetwork_3a_3abroadcast_15',['broadcast',['../namespaceboswatch_1_1network_1_1broadcast.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3aclient_16',['client',['../namespaceboswatch_1_1network_1_1client.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3anetcheck_17',['netCheck',['../namespaceboswatch_1_1network_1_1net_check.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3aserver_18',['server',['../namespaceboswatch_1_1network_1_1server.html',1,'boswatch::network']]], + ['boswatch_3a_3apacket_19',['packet',['../namespaceboswatch_1_1packet.html',1,'boswatch']]], + ['boswatch_3a_3aprocessmanager_20',['processManager',['../namespaceboswatch_1_1process_manager.html',1,'boswatch']]], + ['boswatch_3a_3arouter_21',['router',['../namespaceboswatch_1_1router.html',1,'boswatch']]], + ['boswatch_3a_3arouter_3a_3aroute_22',['route',['../namespaceboswatch_1_1router_1_1route.html',1,'boswatch::router']]], + ['boswatch_3a_3arouter_3a_3arouter_23',['router',['../namespaceboswatch_1_1router_1_1router.html',1,'boswatch::router']]], + ['boswatch_3a_3arouter_3a_3aroutermanager_24',['routerManager',['../namespaceboswatch_1_1router_1_1router_manager.html',1,'boswatch::router']]], + ['boswatch_3a_3atimer_25',['timer',['../namespaceboswatch_1_1timer.html',1,'boswatch']]], + ['boswatch_3a_3autils_26',['utils',['../namespaceboswatch_1_1utils.html',1,'boswatch']]], + ['boswatch_3a_3autils_3a_3aheader_27',['header',['../namespaceboswatch_1_1utils_1_1header.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3amisc_28',['misc',['../namespaceboswatch_1_1utils_1_1misc.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3apaths_29',['paths',['../namespaceboswatch_1_1utils_1_1paths.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3aversion_30',['version',['../namespaceboswatch_1_1utils_1_1version.html',1,'boswatch::utils']]], + ['boswatch_3a_3awildcard_31',['wildcard',['../namespaceboswatch_1_1wildcard.html',1,'boswatch']]], + ['boswatchmodule_32',['BoswatchModule',['../classmodule_1_1descriptor_1_1_boswatch_module.html',1,'module.descriptor.BoswatchModule'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html',1,'module.filter.doubleFilter.BoswatchModule'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html',1,'module.filter.modeFilter.BoswatchModule'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html',1,'module.filter.regexFilter.BoswatchModule'],['../classmodule_1_1geocoding_1_1_boswatch_module.html',1,'module.geocoding.BoswatchModule'],['../classmodule_1_1template__module_1_1_boswatch_module.html',1,'module.template_module.BoswatchModule']]], + ['boswatchplugin_33',['BoswatchPlugin',['../classplugin_1_1divera_1_1_boswatch_plugin.html',1,'plugin.divera.BoswatchPlugin'],['../classplugin_1_1http_1_1_boswatch_plugin.html',1,'plugin.http.BoswatchPlugin'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html',1,'plugin.mysql.BoswatchPlugin'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html',1,'plugin.telegram.BoswatchPlugin'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html',1,'plugin.template_plugin.BoswatchPlugin']]], + ['bot_34',['bot',['../classplugin_1_1telegram_1_1_boswatch_plugin.html#ab5d363141b79cd5a3d6c701d091c77b8',1,'plugin::telegram::BoswatchPlugin']]], + ['branch_35',['branch',['../namespaceboswatch_1_1utils_1_1version.html#a7e37117140958fd08c7c23039e79c44f',1,'boswatch::utils::version']]], + ['broadcastclient_36',['BroadcastClient',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html',1,'boswatch::network::broadcast']]], + ['broadcastclient_37',['broadcastClient',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a3c900ba22a0b873a784370d3f02e6a8d',1,'test::boswatch::test_broadcast']]], + ['broadcastserver_38',['BroadcastServer',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html',1,'boswatch::network::broadcast']]], + ['broadcastserver_39',['broadcastServer',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ab5b4c445d8d6e44dd01b04728c518264',1,'test::boswatch::test_broadcast']]], + ['buildpacket_40',['buildPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#ada01cdaa37d9a20cc14a92ad07a1ee37',1,'test::boswatch::test_packet']]], + ['buildrouters_41',['buildRouters',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaff6ed2da859797e18f6c072d7904f87',1,'boswatch::router::routerManager::RouterManager']]] +]; diff --git a/api/html/search/all_3.js b/api/html/search/all_3.js new file mode 100644 index 0000000..12d57e0 --- /dev/null +++ b/api/html/search/all_3.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['callback_0',['callback',['../classboswatch_1_1router_1_1route_1_1_route.html#a5854d6578e8f94a4e47d9b63e54bfda9',1,'boswatch::router::route::Route']]], + ['checkconn_1',['checkConn',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a7e4b0f0b6a16bb9991e8f98f5a0e01d7',1,'boswatch::network::netCheck::NetCheck']]], + ['cleanup_2',['cleanup',['../classboswatch_1_1router_1_1route_1_1_route.html#acf9db2e5e2d24b93eb6bcf0a403c3914',1,'boswatch.router.route.Route.cleanup'],['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaf81a014d86abc76cdc0722d6f71b15e',1,'boswatch.router.routerManager.RouterManager.cleanup()']]], + ['cleararguments_3',['clearArguments',['../classboswatch_1_1process_manager_1_1_process_manager.html#aafaebfc0b133edfad339910f92d941de',1,'boswatch::processManager::ProcessManager']]], + ['client_4',['client',['../namespaceboswatch_1_1utils_1_1version.html#a375960f3bc974ca82fa3425cc8c9e222',1,'boswatch::utils::version']]], + ['config_5',['config',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a4e59d8e534b9be386eec05de3d2fe746',1,'boswatch.router.routerManager.RouterManager.config'],['../classmodule_1_1descriptor_1_1_boswatch_module.html#aaa022ad0b56c3cbd15d2dab38fb99fb7',1,'module.descriptor.BoswatchModule.config'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#ab826f80406d3117525de1e2d4e0615f0',1,'module.filter.regexFilter.BoswatchModule.config'],['../classmodule_1_1module_base_1_1_module_base.html#a7cbca9fa85b9b9bb487ac882d51385c4',1,'module.moduleBase.ModuleBase.config'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a5c82d6def9c98bd482fa88248c4f355c',1,'plugin.pluginBase.PluginBase.config']]], + ['config_5fpath_6',['CONFIG_PATH',['../namespaceboswatch_1_1utils_1_1paths.html#a0a22f5b2e8ba62f83d67af7c42ebaad9',1,'boswatch::utils::paths']]], + ['configyaml_7',['ConfigYAML',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html',1,'boswatch::configYaml']]], + ['connect_8',['connect',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a9cb1cfa9fa1f3e5aeb25329a2406ea50',1,'boswatch::network::client::TCPClient']]], + ['connection_9',['connection',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a9176bb4f142a1ca499851051b2da8684',1,'plugin::mysql::BoswatchPlugin']]], + ['connectionstate_10',['connectionState',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a85861ea00ae1921f47c4addd2b40ce5b',1,'boswatch::network::netCheck::NetCheck']]], + ['countclientsconnected_11',['countClientsConnected',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a96ddddf0a3fbac223d04ef68de9b35cd',1,'boswatch::network::server::TCPServer']]], + ['cursor_12',['cursor',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aa19e53f1b893899662c2510db9cfc4e1',1,'plugin::mysql::BoswatchPlugin']]] +]; diff --git a/api/html/search/all_4.js b/api/html/search/all_4.js new file mode 100644 index 0000000..4b448d9 --- /dev/null +++ b/api/html/search/all_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['date_0',['date',['../namespaceboswatch_1_1utils_1_1version.html#aa6bdd574d92e1ca63115a9ce49a70699',1,'boswatch::utils::version']]], + ['decode_1',['decode',['../classboswatch_1_1decoder_1_1decoder_1_1_decoder.html#addeb065568a99b4bcadb1fb3c6f11bd1',1,'boswatch.decoder.decoder.Decoder.decode()'],['../classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html#a2cf35244ea56127feeaf19e6edfac03f',1,'boswatch.decoder.fmsDecoder.FmsDecoder.decode()'],['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a868542c74621fe5e6238ff92d998a8ce',1,'boswatch.decoder.pocsagDecoder.PocsagDecoder.decode()'],['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#a69957ae8721e3fd8b8d66bac1ba8896e',1,'boswatch.decoder.zveiDecoder.ZveiDecoder.decode()']]], + ['decoder_2',['Decoder',['../classboswatch_1_1decoder_1_1decoder_1_1_decoder.html',1,'boswatch::decoder::decoder']]], + ['disconnect_3',['disconnect',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ac8a3ce9fefc7b8e0b2fbf653f484aac4',1,'boswatch::network::client::TCPClient']]], + ['dowork_4',['doWork',['../classmodule_1_1descriptor_1_1_boswatch_module.html#a2192a35cc94bccc69d1b6a268acc9b94',1,'module.descriptor.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a88c57fc92229358481fa36e98c677c7d',1,'module.filter.doubleFilter.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a720563d78144989697ed24804d554f8d',1,'module.filter.modeFilter.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a887577d5947b9277541d8013e6685103',1,'module.filter.regexFilter.BoswatchModule.doWork()'],['../classmodule_1_1geocoding_1_1_boswatch_module.html#af7f1f53f8f23f091bb12fbb3c5b040eb',1,'module.geocoding.BoswatchModule.doWork()'],['../classmodule_1_1module_base_1_1_module_base.html#a2146259480980a909ee97410cfdc7933',1,'module.moduleBase.ModuleBase.doWork()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a266810ac3b486b4340fe823390a4b866',1,'module.template_module.BoswatchModule.doWork()']]] +]; diff --git a/api/html/search/all_5.js b/api/html/search/all_5.js new file mode 100644 index 0000000..738b2e3 --- /dev/null +++ b/api/html/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['fileexist_0',['fileExist',['../namespaceboswatch_1_1utils_1_1paths.html#afbc68ddf51b2bf31d1d05568c23a829c',1,'boswatch::utils::paths']]], + ['fixturetemplate_1',['fixtureTemplate',['../namespacetest_1_1test__template.html#a13399c6230dfa53d54aa3b535f46b594',1,'test::test_template']]], + ['fms_2',['fms',['../classplugin_1_1divera_1_1_boswatch_plugin.html#aa1c4e66999052f91bb36fb0ab049a591',1,'plugin.divera.BoswatchPlugin.fms()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a9f553a502830180aeb3683c92e5ee695',1,'plugin.http.BoswatchPlugin.fms()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#adef1d378759ea53b9aebb4af72237260',1,'plugin.mysql.BoswatchPlugin.fms()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afbeb6510e88e221358df19636cffe0be',1,'plugin.pluginBase.PluginBase.fms()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#aa118f52c5984d55acddb6823678bd30c',1,'plugin.telegram.BoswatchPlugin.fms()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a101a2602e3dcd19bd70bed75721219e7',1,'plugin.template_plugin.BoswatchPlugin.fms()']]], + ['fmsdecoder_3',['FmsDecoder',['../classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html',1,'boswatch::decoder::fmsDecoder']]] +]; diff --git a/api/html/search/all_6.js b/api/html/search/all_6.js new file mode 100644 index 0000000..811d6a2 --- /dev/null +++ b/api/html/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['geocode_0',['geocode',['../classmodule_1_1geocoding_1_1_boswatch_module.html#a59b6abc9064a3674525563647ed6d8cd',1,'module::geocoding::BoswatchModule']]], + ['get_1',['get',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a7c5fe27e45b2124cb4147727713bfb94',1,'boswatch.configYaml.ConfigYAML.get()'],['../classboswatch_1_1packet_1_1_packet.html#a58fbb3a8a2080ea38a49bb5bead48a44',1,'boswatch.packet.Packet.get()']]], + ['getclient_2',['getClient',['../namespacetest_1_1boswatch_1_1test___server_client.html#ad670dd2e727a291b576bb622cc0dcf94',1,'test::boswatch::test_ServerClient']]], + ['getclientsconnected_3',['getClientsConnected',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ace26dcf01e7072e302d25751cfd35999',1,'boswatch::network::server::TCPServer']]], + ['getconfig_4',['getConfig',['../namespacetest_1_1boswatch_1_1test__config.html#a627a9a0f958deceb1691a905c001ebf0',1,'test::boswatch::test_config']]], + ['getconninfo_5',['getConnInfo',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a020c629a993829463a215a58ddcfac21',1,'boswatch::network::broadcast::BroadcastClient']]], + ['getdecoderinstance_6',['getDecoderInstance',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a9874c16b7000f464b820d1ba831fdb1b',1,'boswatch::inputSource::inputBase::InputBase']]], + ['getfilledconfig_7',['getFilledConfig',['../namespacetest_1_1boswatch_1_1test__config.html#afa3ad3c13e787e232f1d9dc8152556f0',1,'test::boswatch::test_config']]], + ['getrunningserver_8',['getRunningServer',['../namespacetest_1_1boswatch_1_1test___server_client.html#a3922a5d7b3d80c8132c2c57a6338c042',1,'test::boswatch::test_ServerClient']]], + ['getserver_9',['getServer',['../namespacetest_1_1boswatch_1_1test___server_client.html#a60e5ab09df9b95b31bed80deaa4bf608',1,'test::boswatch::test_ServerClient']]] +]; diff --git a/api/html/search/all_7.js b/api/html/search/all_7.js new file mode 100644 index 0000000..c3b343f --- /dev/null +++ b/api/html/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['handle_0',['handle',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html#acb4cb23886abc3c2b3be70ed3127c3b0',1,'boswatch::network::server::_ThreadedTCPRequestHandler']]], + ['headersize_1',['HEADERSIZE',['../namespaceboswatch_1_1network_1_1client.html#a22b15c1baf1863884d6e0291c2513966',1,'boswatch.network.client.HEADERSIZE'],['../namespaceboswatch_1_1network_1_1server.html#ab5d46499a149d27c2ffaf64e588dda82',1,'boswatch.network.server.HEADERSIZE']]] +]; diff --git a/api/html/search/all_8.js b/api/html/search/all_8.js new file mode 100644 index 0000000..e0b5349 --- /dev/null +++ b/api/html/search/all_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['infotolog_0',['infoToLog',['../namespaceboswatch_1_1utils_1_1header.html#abfcfacd6f6ddad16711aa24bbb878064',1,'boswatch::utils::header']]], + ['inputbase_1',['InputBase',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html',1,'boswatch::inputSource::inputBase']]], + ['isconnected_2',['isConnected',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a22e2077708bcd0526c1628b24569a6f9',1,'boswatch.network.client.TCPClient.isConnected'],['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ae913438a3d6370473b87e323fa1afa9b',1,'boswatch.network.client.TCPClient.isConnected(self)']]], + ['isrunning_3',['isRunning',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#abd218c599104e5483936cc64ed2c1eb0',1,'boswatch.network.broadcast.BroadcastServer.isRunning'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ab0b936931fdf4ccc43aa17b78732b207',1,'boswatch.network.server.TCPServer.isRunning'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ab0b936931fdf4ccc43aa17b78732b207',1,'boswatch.network.server.TCPServer.isRunning'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a67863ea2b20617af7d4b54691e75cded',1,'boswatch.processManager.ProcessManager.isRunning'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9fe9bb49f6d72bacdddee6436de7ec91',1,'boswatch.network.broadcast.BroadcastServer.isRunning()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aeba7db2323e57b57d17c05ab9f448370',1,'boswatch.network.server.TCPServer.isRunning()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a31152ee52782cf204c84cb557591f4b8',1,'boswatch.processManager.ProcessManager.isRunning()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a2f693bfc34ab3bff466d1af495ac6524',1,'boswatch.timer.RepeatedTimer.isRunning()']]] +]; diff --git a/api/html/search/all_9.js b/api/html/search/all_9.js new file mode 100644 index 0000000..b978995 --- /dev/null +++ b/api/html/search/all_9.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['lineininput_0',['LineInInput',['../classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html',1,'boswatch::inputSource::lineInInput']]], + ['list_1',['Todo List',['../todo.html',1,'']]], + ['loadconfigfile_2',['loadConfigFile',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a77fa4b800bf837e717b351de2a184cbd',1,'boswatch::configYaml::ConfigYAML']]], + ['log_5fpath_3',['LOG_PATH',['../namespaceboswatch_1_1utils_1_1paths.html#a34c64349179d47a5c4cda34fbd29bf7f',1,'boswatch::utils::paths']]], + ['logotolog_4',['logoToLog',['../namespaceboswatch_1_1utils_1_1header.html#a846f9efff4fb235364f841ec1d791b10',1,'boswatch::utils::header']]], + ['lostevents_5',['lostEvents',['../classboswatch_1_1timer_1_1_repeated_timer.html#ab5cd56124ddbb4e05348624139ed2e75',1,'boswatch::timer::RepeatedTimer']]] +]; diff --git a/api/html/search/all_a.js b/api/html/search/all_a.js new file mode 100644 index 0000000..219955d --- /dev/null +++ b/api/html/search/all_a.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['makedescriptor_0',['makeDescriptor',['../namespacetest_1_1module_1_1test__descriptor.html#a8983a726040e54f7e106efd8045c7279',1,'test::module::test_descriptor']]], + ['makedirifnotexist_1',['makeDirIfNotExist',['../namespaceboswatch_1_1utils_1_1paths.html#aaecc6714269132a12a9d5cf62cbac03e',1,'boswatch::utils::paths']]], + ['makepacket_2',['makePacket',['../namespacetest_1_1module_1_1test__descriptor.html#a17733f97306086e5606a176ce9df7a86',1,'test::module::test_descriptor']]], + ['module_3',['module',['../namespacemodule.html',1,'']]], + ['module_3a_3adescriptor_4',['descriptor',['../namespacemodule_1_1descriptor.html',1,'module']]], + ['module_3a_3afilter_5',['filter',['../namespacemodule_1_1filter.html',1,'module']]], + ['module_3a_3afilter_3a_3adoublefilter_6',['doubleFilter',['../namespacemodule_1_1filter_1_1double_filter.html',1,'module::filter']]], + ['module_3a_3afilter_3a_3amodefilter_7',['modeFilter',['../namespacemodule_1_1filter_1_1mode_filter.html',1,'module::filter']]], + ['module_3a_3afilter_3a_3aregexfilter_8',['regexFilter',['../namespacemodule_1_1filter_1_1regex_filter.html',1,'module::filter']]], + ['module_3a_3ageocoding_9',['geocoding',['../namespacemodule_1_1geocoding.html',1,'module']]], + ['module_3a_3amodulebase_10',['moduleBase',['../namespacemodule_1_1module_base.html',1,'module']]], + ['module_3a_3atemplate_5fmodule_11',['template_module',['../namespacemodule_1_1template__module.html',1,'module']]], + ['modulebase_12',['ModuleBase',['../classmodule_1_1module_base_1_1_module_base.html',1,'module::moduleBase']]], + ['mqbot_13',['MQBot',['../classplugin_1_1telegram_1_1_m_q_bot.html',1,'plugin::telegram']]], + ['msg_14',['msg',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a95a7f19773431bec715f2f293caf8d85',1,'plugin.divera.BoswatchPlugin.msg()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a53ff7d38082e062630f6485476c33ece',1,'plugin.http.BoswatchPlugin.msg()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a2fb3e4559927837551f192cf13754583',1,'plugin.mysql.BoswatchPlugin.msg()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a9b7266a1e9e343c185181ad273a2fde2',1,'plugin.pluginBase.PluginBase.msg()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#aa2cdc668f9e09149417a3481252f50d9',1,'plugin.telegram.BoswatchPlugin.msg()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a58590a4f45b3a56ae86e08988176c884',1,'plugin.template_plugin.BoswatchPlugin.msg()']]] +]; diff --git a/api/html/search/all_b.js b/api/html/search/all_b.js new file mode 100644 index 0000000..0f67cd9 --- /dev/null +++ b/api/html/search/all_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../classboswatch_1_1router_1_1route_1_1_route.html#a63208097fc8bfd4ae4395f238b24f6ec',1,'boswatch.router.route.Route.name'],['../classboswatch_1_1router_1_1router_1_1_router.html#a90d717b6aece9f0a505a0b85eb4dacfa',1,'boswatch.router.router.Router.name']]], + ['netcheck_1',['NetCheck',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html',1,'boswatch::network::netCheck']]] +]; diff --git a/api/html/search/all_c.js b/api/html/search/all_c.js new file mode 100644 index 0000000..7d29b42 --- /dev/null +++ b/api/html/search/all_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['onload_0',['onLoad',['../classmodule_1_1descriptor_1_1_boswatch_module.html#a39d8aef7f47e43c8108813f072785a56',1,'module.descriptor.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#aa5f9d403d03ad71ebacc98d0e05ef0ab',1,'module.filter.doubleFilter.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a316db93e433ec18280dba7c603b6db7f',1,'module.filter.modeFilter.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a636f42c800fd91192e2f683313fc75bf',1,'module.filter.regexFilter.BoswatchModule.onLoad()'],['../classmodule_1_1module_base_1_1_module_base.html#aedd2d0694073eff10a3c0440f487a373',1,'module.moduleBase.ModuleBase.onLoad()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a5fbab9ed6a058b089d39d3f53c7f1527',1,'module.template_module.BoswatchModule.onLoad()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#af4be87c8480d01c0d7f285c5de1ad045',1,'plugin.mysql.BoswatchPlugin.onLoad()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a2fc30d6a8691b7b1c2b7c1431a6dfa67',1,'plugin.pluginBase.PluginBase.onLoad()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a31348dca1c54dfd0dd268ee0c80089a3',1,'plugin.telegram.BoswatchPlugin.onLoad()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#ac2e80b20bc4e7bbdccf6c821207a70ac',1,'plugin.template_plugin.BoswatchPlugin.onLoad()']]], + ['onunload_1',['onUnload',['../classmodule_1_1descriptor_1_1_boswatch_module.html#adf37fd4608e42b4a9335c0d2954d7113',1,'module.descriptor.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a81185d2d81a4959d8a29e5054adf975d',1,'module.filter.doubleFilter.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#af5c6b174721359c9c93ddc29faa9be9b',1,'module.filter.modeFilter.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#afa1a66cb2277360e21841526e41cec5c',1,'module.filter.regexFilter.BoswatchModule.onUnload()'],['../classmodule_1_1module_base_1_1_module_base.html#a4c69727e801ba326aed6963cd9fd6dae',1,'module.moduleBase.ModuleBase.onUnload()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a00f969c06c87ae304c65aee372d95d0a',1,'module.template_module.BoswatchModule.onUnload()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aa421e2a472ac9ac3b9a13ec6bd5a5fca',1,'plugin.mysql.BoswatchPlugin.onUnload()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a3b3164e45d334ca2dab14f28d352334b',1,'plugin.pluginBase.PluginBase.onUnload()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af72d5ae2c1ae6a85c1582addc03aef7e',1,'plugin.template_plugin.BoswatchPlugin.onUnload()']]], + ['overduecount_2',['overdueCount',['../classboswatch_1_1timer_1_1_repeated_timer.html#a840c33f251da10948ba1940f7edae806',1,'boswatch::timer::RepeatedTimer']]] +]; diff --git a/api/html/search/all_d.js b/api/html/search/all_d.js new file mode 100644 index 0000000..4788f3f --- /dev/null +++ b/api/html/search/all_d.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['packet_0',['Packet',['../classboswatch_1_1packet_1_1_packet.html',1,'boswatch::packet']]], + ['parsewildcards_1',['parseWildcards',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a75eb26af5668918fba36fd5fc795a66b',1,'plugin::pluginBase::PluginBase']]], + ['plugin_2',['plugin',['../namespaceplugin.html',1,'']]], + ['plugin_3a_3adivera_3',['divera',['../namespaceplugin_1_1divera.html',1,'plugin']]], + ['plugin_3a_3ahttp_4',['http',['../namespaceplugin_1_1http.html',1,'plugin']]], + ['plugin_3a_3amysql_5',['mysql',['../namespaceplugin_1_1mysql.html',1,'plugin']]], + ['plugin_3a_3apluginbase_6',['pluginBase',['../namespaceplugin_1_1plugin_base.html',1,'plugin']]], + ['plugin_3a_3atelegram_7',['telegram',['../namespaceplugin_1_1telegram.html',1,'plugin']]], + ['plugin_3a_3atemplate_5fplugin_8',['template_plugin',['../namespaceplugin_1_1template__plugin.html',1,'plugin']]], + ['pluginbase_9',['PluginBase',['../classplugin_1_1plugin_base_1_1_plugin_base.html',1,'plugin::pluginBase']]], + ['pocsag_10',['pocsag',['../classplugin_1_1divera_1_1_boswatch_plugin.html#aad60e175ed9d2a6832655d90e38ba179',1,'plugin.divera.BoswatchPlugin.pocsag()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#aebea23ae39e04a4c9becab1405d17f57',1,'plugin.http.BoswatchPlugin.pocsag()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aeaffdab7a2025c51d0af3151c475d1ec',1,'plugin.mysql.BoswatchPlugin.pocsag()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a1a9a3bc59e6e2737839138f098ba4fe5',1,'plugin.pluginBase.PluginBase.pocsag()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#adfc28616ddda41af1b7980fbb1a5b617',1,'plugin.telegram.BoswatchPlugin.pocsag()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a15a07ec58d94ad4e52339d6f5b0bc38b',1,'plugin.template_plugin.BoswatchPlugin.pocsag()']]], + ['pocsagdecoder_11',['PocsagDecoder',['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html',1,'boswatch::decoder::pocsagDecoder']]], + ['printinfo_12',['printInfo',['../classboswatch_1_1packet_1_1_packet.html#a01a4bf1fb3af1e72d5a2da96d296e832',1,'boswatch::packet::Packet']]], + ['processmanager_13',['ProcessManager',['../classboswatch_1_1process_manager_1_1_process_manager.html',1,'boswatch::processManager']]], + ['pulseaudioinput_14',['PulseAudioInput',['../classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html',1,'boswatch::inputSource::pulseaudioInput']]] +]; diff --git a/api/html/search/all_e.js b/api/html/search/all_e.js new file mode 100644 index 0000000..8ad2296 --- /dev/null +++ b/api/html/search/all_e.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['readline_0',['readline',['../classboswatch_1_1process_manager_1_1_process_manager.html#a80143d4751ce9b1cc8a164cd56c8dbca',1,'boswatch::processManager::ProcessManager']]], + ['receive_1',['receive',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ab38ae11d876aed47d12c7f753601b67f',1,'boswatch::network::client::TCPClient']]], + ['registerwildcard_2',['registerWildcard',['../classmodule_1_1module_base_1_1_module_base.html#a75f00bbad4a6905c467e71df1df22f9c',1,'module.moduleBase.ModuleBase.registerWildcard()'],['../namespaceboswatch_1_1wildcard.html#ae98b70e53f0ce7080beda385f2f9e1f7',1,'boswatch.wildcard.registerWildcard()']]], + ['repeatedtimer_3',['RepeatedTimer',['../classboswatch_1_1timer_1_1_repeated_timer.html',1,'boswatch::timer']]], + ['replacewildcards_4',['replaceWildcards',['../namespaceboswatch_1_1wildcard.html#aa05203c39c351fa3983c50fd84aea46b',1,'boswatch::wildcard']]], + ['resttime_5',['restTime',['../classboswatch_1_1timer_1_1_repeated_timer.html#a5b693144e9b2060eff4a30e526f618f8',1,'boswatch.timer.RepeatedTimer.restTime'],['../classboswatch_1_1timer_1_1_repeated_timer.html#afbe5f47ada6c6220e43b6bbec6318a51',1,'boswatch.timer.RepeatedTimer.restTime(self)']]], + ['root_5fpath_6',['ROOT_PATH',['../namespaceboswatch_1_1utils_1_1paths.html#a15d88d3367922c8b9a14558554861238',1,'boswatch::utils::paths']]], + ['route_7',['Route',['../classboswatch_1_1router_1_1route_1_1_route.html',1,'boswatch::router::route']]], + ['routelist_8',['routeList',['../classboswatch_1_1router_1_1router_1_1_router.html#a3ed6cf62a9a5f85205318ff39cb6db8a',1,'boswatch::router::router::Router']]], + ['router_9',['Router',['../classboswatch_1_1router_1_1router_1_1_router.html',1,'boswatch::router::router']]], + ['routermanager_10',['RouterManager',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html',1,'boswatch::router::routerManager']]], + ['runrouter_11',['runRouter',['../classboswatch_1_1router_1_1router_1_1_router.html#a11fab65f0b4e7f2daff58fbd675d8347',1,'boswatch::router::router::Router']]], + ['runrouters_12',['runRouters',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aa54e031529782bd0a7e907c8d7e8f0a9',1,'boswatch::router::routerManager::RouterManager']]] +]; diff --git a/api/html/search/all_f.js b/api/html/search/all_f.js new file mode 100644 index 0000000..338c1bd --- /dev/null +++ b/api/html/search/all_f.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['sdrinput_0',['SdrInput',['../classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html',1,'boswatch::inputSource::sdrInput']]], + ['send_5fmessage_1',['send_message',['../classplugin_1_1telegram_1_1_m_q_bot.html#a792ef18fa266853822ec53862a32264a',1,'plugin::telegram::MQBot']]], + ['sendthread_2',['sendThread',['../namespacetest_1_1boswatch_1_1test___server_client.html#a4000a5f32bab47ae79294c2bc60a2af1',1,'test::boswatch::test_ServerClient']]], + ['server_3',['server',['../namespaceboswatch_1_1utils_1_1version.html#ad97ebccff43c033d4b11a907797e95e7',1,'boswatch::utils::version']]], + ['serverip_4',['serverIP',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#af35a11a41a256de82a65128fb6be70a3',1,'boswatch::network::broadcast::BroadcastClient']]], + ['serverport_5',['serverPort',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a84e39ca725becf9615d186be8430eb92',1,'boswatch::network::broadcast::BroadcastClient']]], + ['set_6',['set',['../classboswatch_1_1packet_1_1_packet.html#ae2562639ea14f5e92fbe5048af72a2f9',1,'boswatch::packet::Packet']]], + ['setstderr_7',['setStderr',['../classboswatch_1_1process_manager_1_1_process_manager.html#a3abb0b2b54f126e46774a0f33fc2980c',1,'boswatch::processManager::ProcessManager']]], + ['setstdin_8',['setStdin',['../classboswatch_1_1process_manager_1_1_process_manager.html#a3872072d62e14aec84d190d5a31626e9',1,'boswatch::processManager::ProcessManager']]], + ['setstdout_9',['setStdout',['../classboswatch_1_1process_manager_1_1_process_manager.html#a8b34c7836cc8947e174d0e0cc84b4cd3',1,'boswatch::processManager::ProcessManager']]], + ['setup_10',['setup',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aec48341c7ba834871813bfdb0c285d86',1,'plugin.mysql.BoswatchPlugin.setup()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afe097ea5f51321784754e168ac1ca6d6',1,'plugin.pluginBase.PluginBase.setup()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a7aa0048b112116e841e7aeac7c6d92a7',1,'plugin.template_plugin.BoswatchPlugin.setup()']]], + ['setup_5ffunction_11',['setup_function',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a628a658523ce85347ebc47af29a1f089',1,'test.boswatch.test_broadcast.setup_function()'],['../namespacetest_1_1boswatch_1_1test__config.html#a06ecf35c7fbac4483e2c5f078fab754c',1,'test.boswatch.test_config.setup_function()'],['../namespacetest_1_1boswatch_1_1test__decoder.html#a3a25cf1893422d00341fb29cbef1cf9c',1,'test.boswatch.test_decoder.setup_function()'],['../namespacetest_1_1boswatch_1_1test__header.html#a86f28f9ff6e2cca5b8da255b5403fcbb',1,'test.boswatch.test_header.setup_function()'],['../namespacetest_1_1boswatch_1_1test__packet.html#a765c3df39bd5263bb4004eabada03fba',1,'test.boswatch.test_packet.setup_function()'],['../namespacetest_1_1boswatch_1_1test__paths.html#af930008a1e70eec4ba2209289a027e0f',1,'test.boswatch.test_paths.setup_function()'],['../namespacetest_1_1boswatch_1_1test___server_client.html#af21668ce2e99a7922852f29b7fcc922c',1,'test.boswatch.test_ServerClient.setup_function()'],['../namespacetest_1_1boswatch_1_1test__timer.html#a14ab4cd8f7881453a4b8996544305e4c',1,'test.boswatch.test_timer.setup_function()']]], + ['setup_5fmethod_12',['setup_method',['../namespacetest_1_1module_1_1test__descriptor.html#ad6fee7ed16ec2287e7095fd16339f4db',1,'test.module.test_descriptor.setup_method()'],['../namespacetest_1_1test__template.html#a38400063d625095e43c26e3249cca422',1,'test.test_template.setup_method()']]], + ['shutdown_13',['shutdown',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a0ab8a4109b818531fc9f79192b045465',1,'boswatch::inputSource::inputBase::InputBase']]], + ['skiplines_14',['skipLines',['../classboswatch_1_1process_manager_1_1_process_manager.html#ac86f2638f1239a188692006699471f1f',1,'boswatch::processManager::ProcessManager']]], + ['skiplinesuntil_15',['skipLinesUntil',['../classboswatch_1_1process_manager_1_1_process_manager.html#af2886ee808fe04cebd36bc72ad8616c3',1,'boswatch::processManager::ProcessManager']]], + ['sqlinserts_16',['sqlInserts',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a15ccdf15153caab4ea4d96e599a0954c',1,'plugin::mysql::BoswatchPlugin']]], + ['start_17',['start',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#ac01b4ac15a033f2df6d3ce95875f15e0',1,'boswatch.inputSource.inputBase.InputBase.start()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9578bab3fdb883c6de357bf513884b2c',1,'boswatch.network.broadcast.BroadcastServer.start()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aef3b308e2d4d28406bdb31be97460e60',1,'boswatch.network.server.TCPServer.start()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a9dddc0c204be55e4391557f2cb1616bf',1,'boswatch.processManager.ProcessManager.start()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a7ac6df54ac53ce43b550ea2fb7f593ba',1,'boswatch.timer.RepeatedTimer.start()']]], + ['statistics_18',['statistics',['../classboswatch_1_1router_1_1route_1_1_route.html#a0576a975ab706dd9bb5cfca8c2ce6e05',1,'boswatch::router::route::Route']]], + ['stderr_19',['stderr',['../classboswatch_1_1process_manager_1_1_process_manager.html#a401b316004c76dea8175e7a879f649d4',1,'boswatch::processManager::ProcessManager']]], + ['stdout_20',['stdout',['../classboswatch_1_1process_manager_1_1_process_manager.html#a68468dd0235a3b0725d70852670e9ac4',1,'boswatch::processManager::ProcessManager']]], + ['stop_21',['stop',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ad4c950fc28b36e52da565856ab61866c',1,'boswatch.network.broadcast.BroadcastServer.stop()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#adcb3af039525e3fd4465f661e985eba1',1,'boswatch.network.server.TCPServer.stop()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a9f0eb14407cf78ab7010bf247c8d6115',1,'boswatch.processManager.ProcessManager.stop()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a5f7c9e59eb302893ede382b3cf36fc6d',1,'boswatch.timer.RepeatedTimer.stop()']]] +]; diff --git a/api/html/search/classes_0.js b/api/html/search/classes_0.js new file mode 100644 index 0000000..f0c4060 --- /dev/null +++ b/api/html/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5fthreadedtcprequesthandler_0',['_ThreadedTCPRequestHandler',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html',1,'boswatch::network::server']]], + ['_5fthreadedtcpserver_1',['_ThreadedTCPServer',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_server.html',1,'boswatch::network::server']]] +]; diff --git a/api/html/search/classes_1.js b/api/html/search/classes_1.js new file mode 100644 index 0000000..419df12 --- /dev/null +++ b/api/html/search/classes_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['boswatchmodule_0',['BoswatchModule',['../classmodule_1_1descriptor_1_1_boswatch_module.html',1,'module.descriptor.BoswatchModule'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html',1,'module.filter.doubleFilter.BoswatchModule'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html',1,'module.filter.modeFilter.BoswatchModule'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html',1,'module.filter.regexFilter.BoswatchModule'],['../classmodule_1_1geocoding_1_1_boswatch_module.html',1,'module.geocoding.BoswatchModule'],['../classmodule_1_1template__module_1_1_boswatch_module.html',1,'module.template_module.BoswatchModule']]], + ['boswatchplugin_1',['BoswatchPlugin',['../classplugin_1_1divera_1_1_boswatch_plugin.html',1,'plugin.divera.BoswatchPlugin'],['../classplugin_1_1http_1_1_boswatch_plugin.html',1,'plugin.http.BoswatchPlugin'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html',1,'plugin.mysql.BoswatchPlugin'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html',1,'plugin.telegram.BoswatchPlugin'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html',1,'plugin.template_plugin.BoswatchPlugin']]], + ['broadcastclient_2',['BroadcastClient',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html',1,'boswatch::network::broadcast']]], + ['broadcastserver_3',['BroadcastServer',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html',1,'boswatch::network::broadcast']]] +]; diff --git a/api/html/search/classes_2.js b/api/html/search/classes_2.js new file mode 100644 index 0000000..d0b7f77 --- /dev/null +++ b/api/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['configyaml_0',['ConfigYAML',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html',1,'boswatch::configYaml']]] +]; diff --git a/api/html/search/classes_3.js b/api/html/search/classes_3.js new file mode 100644 index 0000000..22c7eed --- /dev/null +++ b/api/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['decoder_0',['Decoder',['../classboswatch_1_1decoder_1_1decoder_1_1_decoder.html',1,'boswatch::decoder::decoder']]] +]; diff --git a/api/html/search/classes_4.js b/api/html/search/classes_4.js new file mode 100644 index 0000000..b2e6641 --- /dev/null +++ b/api/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fmsdecoder_0',['FmsDecoder',['../classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html',1,'boswatch::decoder::fmsDecoder']]] +]; diff --git a/api/html/search/classes_5.js b/api/html/search/classes_5.js new file mode 100644 index 0000000..791b8fc --- /dev/null +++ b/api/html/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['inputbase_0',['InputBase',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html',1,'boswatch::inputSource::inputBase']]] +]; diff --git a/api/html/search/classes_6.js b/api/html/search/classes_6.js new file mode 100644 index 0000000..c0996bb --- /dev/null +++ b/api/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lineininput_0',['LineInInput',['../classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html',1,'boswatch::inputSource::lineInInput']]] +]; diff --git a/api/html/search/classes_7.js b/api/html/search/classes_7.js new file mode 100644 index 0000000..9f0cbea --- /dev/null +++ b/api/html/search/classes_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['modulebase_0',['ModuleBase',['../classmodule_1_1module_base_1_1_module_base.html',1,'module::moduleBase']]], + ['mqbot_1',['MQBot',['../classplugin_1_1telegram_1_1_m_q_bot.html',1,'plugin::telegram']]] +]; diff --git a/api/html/search/classes_8.js b/api/html/search/classes_8.js new file mode 100644 index 0000000..7c26fba --- /dev/null +++ b/api/html/search/classes_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['netcheck_0',['NetCheck',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html',1,'boswatch::network::netCheck']]] +]; diff --git a/api/html/search/classes_9.js b/api/html/search/classes_9.js new file mode 100644 index 0000000..e40b55c --- /dev/null +++ b/api/html/search/classes_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['packet_0',['Packet',['../classboswatch_1_1packet_1_1_packet.html',1,'boswatch::packet']]], + ['pluginbase_1',['PluginBase',['../classplugin_1_1plugin_base_1_1_plugin_base.html',1,'plugin::pluginBase']]], + ['pocsagdecoder_2',['PocsagDecoder',['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html',1,'boswatch::decoder::pocsagDecoder']]], + ['processmanager_3',['ProcessManager',['../classboswatch_1_1process_manager_1_1_process_manager.html',1,'boswatch::processManager']]], + ['pulseaudioinput_4',['PulseAudioInput',['../classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html',1,'boswatch::inputSource::pulseaudioInput']]] +]; diff --git a/api/html/search/classes_a.js b/api/html/search/classes_a.js new file mode 100644 index 0000000..2221524 --- /dev/null +++ b/api/html/search/classes_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['repeatedtimer_0',['RepeatedTimer',['../classboswatch_1_1timer_1_1_repeated_timer.html',1,'boswatch::timer']]], + ['route_1',['Route',['../classboswatch_1_1router_1_1route_1_1_route.html',1,'boswatch::router::route']]], + ['router_2',['Router',['../classboswatch_1_1router_1_1router_1_1_router.html',1,'boswatch::router::router']]], + ['routermanager_3',['RouterManager',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html',1,'boswatch::router::routerManager']]] +]; diff --git a/api/html/search/classes_b.js b/api/html/search/classes_b.js new file mode 100644 index 0000000..828d7f7 --- /dev/null +++ b/api/html/search/classes_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sdrinput_0',['SdrInput',['../classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html',1,'boswatch::inputSource::sdrInput']]] +]; diff --git a/api/html/search/classes_c.js b/api/html/search/classes_c.js new file mode 100644 index 0000000..1a5a667 --- /dev/null +++ b/api/html/search/classes_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tcpclient_0',['TCPClient',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html',1,'boswatch::network::client']]], + ['tcpserver_1',['TCPServer',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html',1,'boswatch::network::server']]] +]; diff --git a/api/html/search/classes_d.js b/api/html/search/classes_d.js new file mode 100644 index 0000000..a57b0db --- /dev/null +++ b/api/html/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zveidecoder_0',['ZveiDecoder',['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html',1,'boswatch::decoder::zveiDecoder']]] +]; diff --git a/api/html/search/close.svg b/api/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/api/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/html/search/functions_0.js b/api/html/search/functions_0.js new file mode 100644 index 0000000..12903f2 --- /dev/null +++ b/api/html/search/functions_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['_5f_5fdel_5f_5f_0',['__del__',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#aa4fcca86240231413885fcd050744152',1,'boswatch.network.broadcast.BroadcastServer.__del__()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a7bd8bbf36dc9e947fd6889b64e66bf79',1,'boswatch.network.server.TCPServer.__del__()'],['../classplugin_1_1telegram_1_1_m_q_bot.html#a83cf2befc52ad0318c6f274a4f4e7106',1,'plugin.telegram.MQBot.__del__()']]], + ['_5f_5finit_5f_5f_1',['__init__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab71fa021f469d6d45d597c0594403c85',1,'boswatch.configYaml.ConfigYAML.__init__()'],['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#af27cd87704982341ab475309db6036aa',1,'boswatch.inputSource.inputBase.InputBase.__init__()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#ab4294fb84142b6c5c7897adbac664bb1',1,'boswatch.network.broadcast.BroadcastClient.__init__()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ae93a0a17a87977e5e675361f513c18d6',1,'boswatch.network.broadcast.BroadcastServer.__init__()'],['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a52dad8d55fb35e07756a5a779deff7fe',1,'boswatch.network.client.TCPClient.__init__()'],['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a93d5881314909255eb8b687a94942526',1,'boswatch.network.netCheck.NetCheck.__init__()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aa7bde82a0490275757eb62cf2245ece8',1,'boswatch.network.server.TCPServer.__init__()'],['../classboswatch_1_1packet_1_1_packet.html#a33f9ad91a87a012e192cd2ef629b536e',1,'boswatch.packet.Packet.__init__()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a932e0d5d67cca47b4e5fc73a25082408',1,'boswatch.processManager.ProcessManager.__init__()'],['../classboswatch_1_1router_1_1route_1_1_route.html#a15d3829220d3bd9ba38fc95d562227e0',1,'boswatch.router.route.Route.__init__()'],['../classboswatch_1_1router_1_1router_1_1_router.html#aa7c921ad0880824595d7fa05bcac6b08',1,'boswatch.router.router.Router.__init__()'],['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a0a84f95c300da38392422533d5782aaf',1,'boswatch.router.routerManager.RouterManager.__init__()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a6456136d21c1cfa45cea27f8e52a6d90',1,'boswatch.timer.RepeatedTimer.__init__()'],['../classmodule_1_1descriptor_1_1_boswatch_module.html#aa1bc2516e337c8fa96ef7e3656435f85',1,'module.descriptor.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a10e2b681c89887ee422f01a1f9ae9dcd',1,'module.filter.doubleFilter.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a40d029c8dc22e315b84237d31055137b',1,'module.filter.modeFilter.BoswatchModule.__init__()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a7d0ba6d5f55296e81be161ffc0cf5f86',1,'module.filter.regexFilter.BoswatchModule.__init__()'],['../classmodule_1_1geocoding_1_1_boswatch_module.html#a0c730c8d45b001e1ddb2ab73400df373',1,'module.geocoding.BoswatchModule.__init__()'],['../classmodule_1_1module_base_1_1_module_base.html#afee02f2e4ef75f43eb819facba9e9bd7',1,'module.moduleBase.ModuleBase.__init__()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a3f001ec829334fde0039cdbfec542588',1,'module.template_module.BoswatchModule.__init__()'],['../classplugin_1_1divera_1_1_boswatch_plugin.html#a15699267f01c1dcf595832ceaf3a717c',1,'plugin.divera.BoswatchPlugin.__init__()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a5a9cebdc7d9bfbb1c4655ce8df99885b',1,'plugin.http.BoswatchPlugin.__init__()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#ab7dc98122deb62b02cab749b3f4fee32',1,'plugin.mysql.BoswatchPlugin.__init__()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#ade82c0cd7c4c180dc62e5e6ca425d063',1,'plugin.pluginBase.PluginBase.__init__()'],['../classplugin_1_1telegram_1_1_m_q_bot.html#a67cb2a543fc2dcf6c8e25493ee3dcd16',1,'plugin.telegram.MQBot.__init__()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a07bd64a5b06e7a16d4438dd4fd231edb',1,'plugin.telegram.BoswatchPlugin.__init__()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#adc94a0cafa6b6ff4d3b837fd6ac874a4',1,'plugin.template_plugin.BoswatchPlugin.__init__()']]], + ['_5f_5fiter_5f_5f_2',['__iter__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#ab774c33b0a9d2cf9f9a1ecbe28509ed5',1,'boswatch::configYaml::ConfigYAML']]], + ['_5f_5flen_5f_5f_3',['__len__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a3e9d8bb1064df8d4971cb9c53c4df727',1,'boswatch::configYaml::ConfigYAML']]], + ['_5f_5fstr_5f_5f_4',['__str__',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a973b5c19761074acf7e59407ecb36e5b',1,'boswatch.configYaml.ConfigYAML.__str__()'],['../classboswatch_1_1packet_1_1_packet.html#aaa72c4726ad47f994e915ad397b89186',1,'boswatch.packet.Packet.__str__()']]], + ['_5fasyncrequests_5',['_asyncRequests',['../classplugin_1_1divera_1_1_boswatch_plugin.html#ad710304e33432b74c0e1716283bea397',1,'plugin.divera.BoswatchPlugin._asyncRequests()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a5e3200e56a8022a46bc3aaeab915ed74',1,'plugin.http.BoswatchPlugin._asyncRequests()']]], + ['_5fcheck_6',['_check',['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a43d03ed47b4c9bdaf34daec40cf094d4',1,'module::filter::doubleFilter::BoswatchModule']]], + ['_5fcleanup_7',['_cleanup',['../classmodule_1_1module_base_1_1_module_base.html#ae43a99376d14379225916bbce74793bd',1,'module.moduleBase.ModuleBase._cleanup()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a176d74cf5854616fc0e716226d29716f',1,'plugin.pluginBase.PluginBase._cleanup()']]], + ['_5ffetch_8',['_fetch',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a995706093c53e10bd494c98f06c8b8cb',1,'plugin.divera.BoswatchPlugin._fetch()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a201e0da093af49f002c1e6b8b6757480',1,'plugin.http.BoswatchPlugin._fetch()']]], + ['_5fgetbitratericsubric_9',['_getBitrateRicSubric',['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a9c7e70e58eacd1cf556ca02ca5a2d639',1,'boswatch::decoder::pocsagDecoder::PocsagDecoder']]], + ['_5fgetstatistics_10',['_getStatistics',['../classboswatch_1_1router_1_1router_1_1_router.html#a4f0f891fcae507b7f47ec389194d912c',1,'boswatch.router.router.Router._getStatistics()'],['../classmodule_1_1module_base_1_1_module_base.html#a872db7602a8139866730ba79a220314b',1,'module.moduleBase.ModuleBase._getStatistics()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a3689bf4fef985b41df640c79b2eb71b2',1,'plugin.pluginBase.PluginBase._getStatistics()']]], + ['_5flisten_11',['_listen',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a5155943e9eb814fa38e30838998b0c97',1,'boswatch::network::broadcast::BroadcastServer']]], + ['_5fmakerequests_12',['_makeRequests',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a2bf369f81f8e4aa4497b058ce57fa9b7',1,'plugin.divera.BoswatchPlugin._makeRequests()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#ab0d2721349d465674f27e7fb0ec07f52',1,'plugin.http.BoswatchPlugin._makeRequests()']]], + ['_5frun_13',['_run',['../classmodule_1_1module_base_1_1_module_base.html#a1bc0d95375400ac328aaa9c10fd1996a',1,'module.moduleBase.ModuleBase._run()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a845b34feb0883393a1a521407ab37072',1,'plugin.pluginBase.PluginBase._run()']]], + ['_5frunthread_14',['_runThread',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a846609a2f9dd8b30009aa1bfd8131437',1,'boswatch.inputSource.inputBase.InputBase._runThread()'],['../classboswatch_1_1input_source_1_1line_in_input_1_1_line_in_input.html#a57e48d2c1329f7c8dc2604a0c88dc8c0',1,'boswatch.inputSource.lineInInput.LineInInput._runThread()'],['../classboswatch_1_1input_source_1_1pulseaudio_input_1_1_pulse_audio_input.html#a343b1c81e6088a31501568c006542ff0',1,'boswatch.inputSource.pulseaudioInput.PulseAudioInput._runThread()'],['../classboswatch_1_1input_source_1_1sdr_input_1_1_sdr_input.html#aaccbce0d6b8c281e71a0c3703e43a704',1,'boswatch.inputSource.sdrInput.SdrInput._runThread()']]], + ['_5fsavestats_15',['_saveStats',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#a97f0f4b83877b3c0765e9387048c3429',1,'boswatch::router::routerManager::RouterManager']]], + ['_5fsendlocation_16',['_sendLocation',['../classplugin_1_1telegram_1_1_boswatch_plugin.html#accea7cd16ddb267acd6f393628ec23d6',1,'plugin::telegram::BoswatchPlugin']]], + ['_5fsendmessage_17',['_sendMessage',['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a776065ec08ddb1412c9212a97b054596',1,'plugin::telegram::BoswatchPlugin']]], + ['_5fshowrouterroute_18',['_showRouterRoute',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#ab546d0c2d93ff67032c7ce10be3604cd',1,'boswatch::router::routerManager::RouterManager']]], + ['_5fsolvedoubletone_19',['_solveDoubleTone',['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#af7f14c40e52ebac1349cc31b73928bc9',1,'boswatch::decoder::zveiDecoder::ZveiDecoder']]], + ['_5ftarget_20',['_target',['../classboswatch_1_1timer_1_1_repeated_timer.html#a0a8c3bc1726ae2a8f43a36a4f2f74165',1,'boswatch::timer::RepeatedTimer']]] +]; diff --git a/api/html/search/functions_1.js b/api/html/search/functions_1.js new file mode 100644 index 0000000..10f3032 --- /dev/null +++ b/api/html/search/functions_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['addargument_0',['addArgument',['../classboswatch_1_1process_manager_1_1_process_manager.html#a83b9d7d3aa926c0cdbe86d4a36873c50',1,'boswatch::processManager::ProcessManager']]], + ['addclientdatatopacket_1',['addClientDataToPacket',['../namespaceboswatch_1_1utils_1_1misc.html#a705227a3e9fbe79ea7e7c2530dfe126a',1,'boswatch::utils::misc']]], + ['addroute_2',['addRoute',['../classboswatch_1_1router_1_1router_1_1_router.html#a561f89ef4e05555ea81cfa5da4551e0d',1,'boswatch::router::router::Router']]], + ['addserverdatatopacket_3',['addServerDataToPacket',['../namespaceboswatch_1_1utils_1_1misc.html#afabe8cfe85ba7758d429e464a2135ec7',1,'boswatch::utils::misc']]], + ['addtoqueue_4',['addToQueue',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a83c2b67af75a860fc71b0424866f8bae',1,'boswatch::inputSource::inputBase::InputBase']]] +]; diff --git a/api/html/search/functions_10.js b/api/html/search/functions_10.js new file mode 100644 index 0000000..3052edf --- /dev/null +++ b/api/html/search/functions_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usetimerfast_0',['useTimerFast',['../namespacetest_1_1boswatch_1_1test__timer.html#abf32038d45ddda5ba6c027ea0c7e4647',1,'test::boswatch::test_timer']]], + ['usetimerslow_1',['useTimerSlow',['../namespacetest_1_1boswatch_1_1test__timer.html#ab976b93aca683f828ac3831ca5e487ab',1,'test::boswatch::test_timer']]] +]; diff --git a/api/html/search/functions_11.js b/api/html/search/functions_11.js new file mode 100644 index 0000000..7f38276 --- /dev/null +++ b/api/html/search/functions_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zvei_0',['zvei',['../classplugin_1_1divera_1_1_boswatch_plugin.html#ae681c4a8b35f18cce21bab24a9b74f7c',1,'plugin.divera.BoswatchPlugin.zvei()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a35d80b12f07174df5a46c52776df6946',1,'plugin.http.BoswatchPlugin.zvei()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a54fbd13ab387336c4261349bb252ccc3',1,'plugin.mysql.BoswatchPlugin.zvei()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#af2d08ecea66961db0fd70e79927e7b80',1,'plugin.pluginBase.PluginBase.zvei()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#afa8a57888af2b30126ae6826b1873135',1,'plugin.telegram.BoswatchPlugin.zvei()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af5c36cb43b625a31e660b874b4ed03f5',1,'plugin.template_plugin.BoswatchPlugin.zvei()']]] +]; diff --git a/api/html/search/functions_2.js b/api/html/search/functions_2.js new file mode 100644 index 0000000..9a6898f --- /dev/null +++ b/api/html/search/functions_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['broadcastclient_0',['broadcastClient',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a3c900ba22a0b873a784370d3f02e6a8d',1,'test::boswatch::test_broadcast']]], + ['broadcastserver_1',['broadcastServer',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ab5b4c445d8d6e44dd01b04728c518264',1,'test::boswatch::test_broadcast']]], + ['buildpacket_2',['buildPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#ada01cdaa37d9a20cc14a92ad07a1ee37',1,'test::boswatch::test_packet']]], + ['buildrouters_3',['buildRouters',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaff6ed2da859797e18f6c072d7904f87',1,'boswatch::router::routerManager::RouterManager']]] +]; diff --git a/api/html/search/functions_3.js b/api/html/search/functions_3.js new file mode 100644 index 0000000..94f7612 --- /dev/null +++ b/api/html/search/functions_3.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['checkconn_0',['checkConn',['../classboswatch_1_1network_1_1net_check_1_1_net_check.html#a7e4b0f0b6a16bb9991e8f98f5a0e01d7',1,'boswatch::network::netCheck::NetCheck']]], + ['cleanup_1',['cleanup',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aaf81a014d86abc76cdc0722d6f71b15e',1,'boswatch::router::routerManager::RouterManager']]], + ['cleararguments_2',['clearArguments',['../classboswatch_1_1process_manager_1_1_process_manager.html#aafaebfc0b133edfad339910f92d941de',1,'boswatch::processManager::ProcessManager']]], + ['connect_3',['connect',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a9cb1cfa9fa1f3e5aeb25329a2406ea50',1,'boswatch::network::client::TCPClient']]], + ['countclientsconnected_4',['countClientsConnected',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#a96ddddf0a3fbac223d04ef68de9b35cd',1,'boswatch::network::server::TCPServer']]] +]; diff --git a/api/html/search/functions_4.js b/api/html/search/functions_4.js new file mode 100644 index 0000000..de5d2e9 --- /dev/null +++ b/api/html/search/functions_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['decode_0',['decode',['../classboswatch_1_1decoder_1_1decoder_1_1_decoder.html#addeb065568a99b4bcadb1fb3c6f11bd1',1,'boswatch.decoder.decoder.Decoder.decode()'],['../classboswatch_1_1decoder_1_1fms_decoder_1_1_fms_decoder.html#a2cf35244ea56127feeaf19e6edfac03f',1,'boswatch.decoder.fmsDecoder.FmsDecoder.decode()'],['../classboswatch_1_1decoder_1_1pocsag_decoder_1_1_pocsag_decoder.html#a868542c74621fe5e6238ff92d998a8ce',1,'boswatch.decoder.pocsagDecoder.PocsagDecoder.decode()'],['../classboswatch_1_1decoder_1_1zvei_decoder_1_1_zvei_decoder.html#a69957ae8721e3fd8b8d66bac1ba8896e',1,'boswatch.decoder.zveiDecoder.ZveiDecoder.decode()']]], + ['disconnect_1',['disconnect',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ac8a3ce9fefc7b8e0b2fbf653f484aac4',1,'boswatch::network::client::TCPClient']]], + ['dowork_2',['doWork',['../classmodule_1_1descriptor_1_1_boswatch_module.html#a2192a35cc94bccc69d1b6a268acc9b94',1,'module.descriptor.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a88c57fc92229358481fa36e98c677c7d',1,'module.filter.doubleFilter.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a720563d78144989697ed24804d554f8d',1,'module.filter.modeFilter.BoswatchModule.doWork()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a887577d5947b9277541d8013e6685103',1,'module.filter.regexFilter.BoswatchModule.doWork()'],['../classmodule_1_1geocoding_1_1_boswatch_module.html#af7f1f53f8f23f091bb12fbb3c5b040eb',1,'module.geocoding.BoswatchModule.doWork()'],['../classmodule_1_1module_base_1_1_module_base.html#a2146259480980a909ee97410cfdc7933',1,'module.moduleBase.ModuleBase.doWork()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a266810ac3b486b4340fe823390a4b866',1,'module.template_module.BoswatchModule.doWork()']]] +]; diff --git a/api/html/search/functions_5.js b/api/html/search/functions_5.js new file mode 100644 index 0000000..ad88cf8 --- /dev/null +++ b/api/html/search/functions_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['fileexist_0',['fileExist',['../namespaceboswatch_1_1utils_1_1paths.html#afbc68ddf51b2bf31d1d05568c23a829c',1,'boswatch::utils::paths']]], + ['fixturetemplate_1',['fixtureTemplate',['../namespacetest_1_1test__template.html#a13399c6230dfa53d54aa3b535f46b594',1,'test::test_template']]], + ['fms_2',['fms',['../classplugin_1_1divera_1_1_boswatch_plugin.html#aa1c4e66999052f91bb36fb0ab049a591',1,'plugin.divera.BoswatchPlugin.fms()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a9f553a502830180aeb3683c92e5ee695',1,'plugin.http.BoswatchPlugin.fms()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#adef1d378759ea53b9aebb4af72237260',1,'plugin.mysql.BoswatchPlugin.fms()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afbeb6510e88e221358df19636cffe0be',1,'plugin.pluginBase.PluginBase.fms()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#aa118f52c5984d55acddb6823678bd30c',1,'plugin.telegram.BoswatchPlugin.fms()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a101a2602e3dcd19bd70bed75721219e7',1,'plugin.template_plugin.BoswatchPlugin.fms()']]] +]; diff --git a/api/html/search/functions_6.js b/api/html/search/functions_6.js new file mode 100644 index 0000000..811d6a2 --- /dev/null +++ b/api/html/search/functions_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['geocode_0',['geocode',['../classmodule_1_1geocoding_1_1_boswatch_module.html#a59b6abc9064a3674525563647ed6d8cd',1,'module::geocoding::BoswatchModule']]], + ['get_1',['get',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a7c5fe27e45b2124cb4147727713bfb94',1,'boswatch.configYaml.ConfigYAML.get()'],['../classboswatch_1_1packet_1_1_packet.html#a58fbb3a8a2080ea38a49bb5bead48a44',1,'boswatch.packet.Packet.get()']]], + ['getclient_2',['getClient',['../namespacetest_1_1boswatch_1_1test___server_client.html#ad670dd2e727a291b576bb622cc0dcf94',1,'test::boswatch::test_ServerClient']]], + ['getclientsconnected_3',['getClientsConnected',['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#ace26dcf01e7072e302d25751cfd35999',1,'boswatch::network::server::TCPServer']]], + ['getconfig_4',['getConfig',['../namespacetest_1_1boswatch_1_1test__config.html#a627a9a0f958deceb1691a905c001ebf0',1,'test::boswatch::test_config']]], + ['getconninfo_5',['getConnInfo',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a020c629a993829463a215a58ddcfac21',1,'boswatch::network::broadcast::BroadcastClient']]], + ['getdecoderinstance_6',['getDecoderInstance',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a9874c16b7000f464b820d1ba831fdb1b',1,'boswatch::inputSource::inputBase::InputBase']]], + ['getfilledconfig_7',['getFilledConfig',['../namespacetest_1_1boswatch_1_1test__config.html#afa3ad3c13e787e232f1d9dc8152556f0',1,'test::boswatch::test_config']]], + ['getrunningserver_8',['getRunningServer',['../namespacetest_1_1boswatch_1_1test___server_client.html#a3922a5d7b3d80c8132c2c57a6338c042',1,'test::boswatch::test_ServerClient']]], + ['getserver_9',['getServer',['../namespacetest_1_1boswatch_1_1test___server_client.html#a60e5ab09df9b95b31bed80deaa4bf608',1,'test::boswatch::test_ServerClient']]] +]; diff --git a/api/html/search/functions_7.js b/api/html/search/functions_7.js new file mode 100644 index 0000000..a91381f --- /dev/null +++ b/api/html/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handle_0',['handle',['../classboswatch_1_1network_1_1server_1_1___threaded_t_c_p_request_handler.html#acb4cb23886abc3c2b3be70ed3127c3b0',1,'boswatch::network::server::_ThreadedTCPRequestHandler']]] +]; diff --git a/api/html/search/functions_8.js b/api/html/search/functions_8.js new file mode 100644 index 0000000..c02f6e5 --- /dev/null +++ b/api/html/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['infotolog_0',['infoToLog',['../namespaceboswatch_1_1utils_1_1header.html#abfcfacd6f6ddad16711aa24bbb878064',1,'boswatch::utils::header']]], + ['isconnected_1',['isConnected',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ae913438a3d6370473b87e323fa1afa9b',1,'boswatch::network::client::TCPClient']]], + ['isrunning_2',['isRunning',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9fe9bb49f6d72bacdddee6436de7ec91',1,'boswatch.network.broadcast.BroadcastServer.isRunning()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aeba7db2323e57b57d17c05ab9f448370',1,'boswatch.network.server.TCPServer.isRunning()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a31152ee52782cf204c84cb557591f4b8',1,'boswatch.processManager.ProcessManager.isRunning()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a2f693bfc34ab3bff466d1af495ac6524',1,'boswatch.timer.RepeatedTimer.isRunning()']]] +]; diff --git a/api/html/search/functions_9.js b/api/html/search/functions_9.js new file mode 100644 index 0000000..0d22ae4 --- /dev/null +++ b/api/html/search/functions_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['loadconfigfile_0',['loadConfigFile',['../classboswatch_1_1config_yaml_1_1_config_y_a_m_l.html#a77fa4b800bf837e717b351de2a184cbd',1,'boswatch::configYaml::ConfigYAML']]], + ['logotolog_1',['logoToLog',['../namespaceboswatch_1_1utils_1_1header.html#a846f9efff4fb235364f841ec1d791b10',1,'boswatch::utils::header']]] +]; diff --git a/api/html/search/functions_a.js b/api/html/search/functions_a.js new file mode 100644 index 0000000..8907805 --- /dev/null +++ b/api/html/search/functions_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['makedescriptor_0',['makeDescriptor',['../namespacetest_1_1module_1_1test__descriptor.html#a8983a726040e54f7e106efd8045c7279',1,'test::module::test_descriptor']]], + ['makedirifnotexist_1',['makeDirIfNotExist',['../namespaceboswatch_1_1utils_1_1paths.html#aaecc6714269132a12a9d5cf62cbac03e',1,'boswatch::utils::paths']]], + ['makepacket_2',['makePacket',['../namespacetest_1_1module_1_1test__descriptor.html#a17733f97306086e5606a176ce9df7a86',1,'test::module::test_descriptor']]], + ['msg_3',['msg',['../classplugin_1_1divera_1_1_boswatch_plugin.html#a95a7f19773431bec715f2f293caf8d85',1,'plugin.divera.BoswatchPlugin.msg()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#a53ff7d38082e062630f6485476c33ece',1,'plugin.http.BoswatchPlugin.msg()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#a2fb3e4559927837551f192cf13754583',1,'plugin.mysql.BoswatchPlugin.msg()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a9b7266a1e9e343c185181ad273a2fde2',1,'plugin.pluginBase.PluginBase.msg()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#aa2cdc668f9e09149417a3481252f50d9',1,'plugin.telegram.BoswatchPlugin.msg()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a58590a4f45b3a56ae86e08988176c884',1,'plugin.template_plugin.BoswatchPlugin.msg()']]] +]; diff --git a/api/html/search/functions_b.js b/api/html/search/functions_b.js new file mode 100644 index 0000000..e22ab33 --- /dev/null +++ b/api/html/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['onload_0',['onLoad',['../classmodule_1_1descriptor_1_1_boswatch_module.html#a39d8aef7f47e43c8108813f072785a56',1,'module.descriptor.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#aa5f9d403d03ad71ebacc98d0e05ef0ab',1,'module.filter.doubleFilter.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#a316db93e433ec18280dba7c603b6db7f',1,'module.filter.modeFilter.BoswatchModule.onLoad()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#a636f42c800fd91192e2f683313fc75bf',1,'module.filter.regexFilter.BoswatchModule.onLoad()'],['../classmodule_1_1module_base_1_1_module_base.html#aedd2d0694073eff10a3c0440f487a373',1,'module.moduleBase.ModuleBase.onLoad()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a5fbab9ed6a058b089d39d3f53c7f1527',1,'module.template_module.BoswatchModule.onLoad()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#af4be87c8480d01c0d7f285c5de1ad045',1,'plugin.mysql.BoswatchPlugin.onLoad()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a2fc30d6a8691b7b1c2b7c1431a6dfa67',1,'plugin.pluginBase.PluginBase.onLoad()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#a31348dca1c54dfd0dd268ee0c80089a3',1,'plugin.telegram.BoswatchPlugin.onLoad()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#ac2e80b20bc4e7bbdccf6c821207a70ac',1,'plugin.template_plugin.BoswatchPlugin.onLoad()']]], + ['onunload_1',['onUnload',['../classmodule_1_1descriptor_1_1_boswatch_module.html#adf37fd4608e42b4a9335c0d2954d7113',1,'module.descriptor.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1double_filter_1_1_boswatch_module.html#a81185d2d81a4959d8a29e5054adf975d',1,'module.filter.doubleFilter.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1mode_filter_1_1_boswatch_module.html#af5c6b174721359c9c93ddc29faa9be9b',1,'module.filter.modeFilter.BoswatchModule.onUnload()'],['../classmodule_1_1filter_1_1regex_filter_1_1_boswatch_module.html#afa1a66cb2277360e21841526e41cec5c',1,'module.filter.regexFilter.BoswatchModule.onUnload()'],['../classmodule_1_1module_base_1_1_module_base.html#a4c69727e801ba326aed6963cd9fd6dae',1,'module.moduleBase.ModuleBase.onUnload()'],['../classmodule_1_1template__module_1_1_boswatch_module.html#a00f969c06c87ae304c65aee372d95d0a',1,'module.template_module.BoswatchModule.onUnload()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aa421e2a472ac9ac3b9a13ec6bd5a5fca',1,'plugin.mysql.BoswatchPlugin.onUnload()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a3b3164e45d334ca2dab14f28d352334b',1,'plugin.pluginBase.PluginBase.onUnload()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af72d5ae2c1ae6a85c1582addc03aef7e',1,'plugin.template_plugin.BoswatchPlugin.onUnload()']]] +]; diff --git a/api/html/search/functions_c.js b/api/html/search/functions_c.js new file mode 100644 index 0000000..0208895 --- /dev/null +++ b/api/html/search/functions_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['parsewildcards_0',['parseWildcards',['../classplugin_1_1plugin_base_1_1_plugin_base.html#a75eb26af5668918fba36fd5fc795a66b',1,'plugin::pluginBase::PluginBase']]], + ['pocsag_1',['pocsag',['../classplugin_1_1divera_1_1_boswatch_plugin.html#aad60e175ed9d2a6832655d90e38ba179',1,'plugin.divera.BoswatchPlugin.pocsag()'],['../classplugin_1_1http_1_1_boswatch_plugin.html#aebea23ae39e04a4c9becab1405d17f57',1,'plugin.http.BoswatchPlugin.pocsag()'],['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aeaffdab7a2025c51d0af3151c475d1ec',1,'plugin.mysql.BoswatchPlugin.pocsag()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#a1a9a3bc59e6e2737839138f098ba4fe5',1,'plugin.pluginBase.PluginBase.pocsag()'],['../classplugin_1_1telegram_1_1_boswatch_plugin.html#adfc28616ddda41af1b7980fbb1a5b617',1,'plugin.telegram.BoswatchPlugin.pocsag()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a15a07ec58d94ad4e52339d6f5b0bc38b',1,'plugin.template_plugin.BoswatchPlugin.pocsag()']]], + ['printinfo_2',['printInfo',['../classboswatch_1_1packet_1_1_packet.html#a01a4bf1fb3af1e72d5a2da96d296e832',1,'boswatch::packet::Packet']]] +]; diff --git a/api/html/search/functions_d.js b/api/html/search/functions_d.js new file mode 100644 index 0000000..7a977d3 --- /dev/null +++ b/api/html/search/functions_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['readline_0',['readline',['../classboswatch_1_1process_manager_1_1_process_manager.html#a80143d4751ce9b1cc8a164cd56c8dbca',1,'boswatch::processManager::ProcessManager']]], + ['receive_1',['receive',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#ab38ae11d876aed47d12c7f753601b67f',1,'boswatch::network::client::TCPClient']]], + ['registerwildcard_2',['registerWildcard',['../classmodule_1_1module_base_1_1_module_base.html#a75f00bbad4a6905c467e71df1df22f9c',1,'module.moduleBase.ModuleBase.registerWildcard()'],['../namespaceboswatch_1_1wildcard.html#ae98b70e53f0ce7080beda385f2f9e1f7',1,'boswatch.wildcard.registerWildcard(wildcard, bwPacketField)']]], + ['replacewildcards_3',['replaceWildcards',['../namespaceboswatch_1_1wildcard.html#aa05203c39c351fa3983c50fd84aea46b',1,'boswatch::wildcard']]], + ['resttime_4',['restTime',['../classboswatch_1_1timer_1_1_repeated_timer.html#afbe5f47ada6c6220e43b6bbec6318a51',1,'boswatch::timer::RepeatedTimer']]], + ['runrouter_5',['runRouter',['../classboswatch_1_1router_1_1router_1_1_router.html#a11fab65f0b4e7f2daff58fbd675d8347',1,'boswatch::router::router::Router']]], + ['runrouters_6',['runRouters',['../classboswatch_1_1router_1_1router_manager_1_1_router_manager.html#aa54e031529782bd0a7e907c8d7e8f0a9',1,'boswatch::router::routerManager::RouterManager']]] +]; diff --git a/api/html/search/functions_e.js b/api/html/search/functions_e.js new file mode 100644 index 0000000..0fbcd16 --- /dev/null +++ b/api/html/search/functions_e.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['send_5fmessage_0',['send_message',['../classplugin_1_1telegram_1_1_m_q_bot.html#a792ef18fa266853822ec53862a32264a',1,'plugin::telegram::MQBot']]], + ['sendthread_1',['sendThread',['../namespacetest_1_1boswatch_1_1test___server_client.html#a4000a5f32bab47ae79294c2bc60a2af1',1,'test::boswatch::test_ServerClient']]], + ['serverip_2',['serverIP',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#af35a11a41a256de82a65128fb6be70a3',1,'boswatch::network::broadcast::BroadcastClient']]], + ['serverport_3',['serverPort',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_client.html#a84e39ca725becf9615d186be8430eb92',1,'boswatch::network::broadcast::BroadcastClient']]], + ['set_4',['set',['../classboswatch_1_1packet_1_1_packet.html#ae2562639ea14f5e92fbe5048af72a2f9',1,'boswatch::packet::Packet']]], + ['setstderr_5',['setStderr',['../classboswatch_1_1process_manager_1_1_process_manager.html#a3abb0b2b54f126e46774a0f33fc2980c',1,'boswatch::processManager::ProcessManager']]], + ['setstdin_6',['setStdin',['../classboswatch_1_1process_manager_1_1_process_manager.html#a3872072d62e14aec84d190d5a31626e9',1,'boswatch::processManager::ProcessManager']]], + ['setstdout_7',['setStdout',['../classboswatch_1_1process_manager_1_1_process_manager.html#a8b34c7836cc8947e174d0e0cc84b4cd3',1,'boswatch::processManager::ProcessManager']]], + ['setup_8',['setup',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#aec48341c7ba834871813bfdb0c285d86',1,'plugin.mysql.BoswatchPlugin.setup()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afe097ea5f51321784754e168ac1ca6d6',1,'plugin.pluginBase.PluginBase.setup()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#a7aa0048b112116e841e7aeac7c6d92a7',1,'plugin.template_plugin.BoswatchPlugin.setup()']]], + ['setup_5ffunction_9',['setup_function',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a628a658523ce85347ebc47af29a1f089',1,'test.boswatch.test_broadcast.setup_function()'],['../namespacetest_1_1boswatch_1_1test__config.html#a06ecf35c7fbac4483e2c5f078fab754c',1,'test.boswatch.test_config.setup_function()'],['../namespacetest_1_1boswatch_1_1test__decoder.html#a3a25cf1893422d00341fb29cbef1cf9c',1,'test.boswatch.test_decoder.setup_function()'],['../namespacetest_1_1boswatch_1_1test__header.html#a86f28f9ff6e2cca5b8da255b5403fcbb',1,'test.boswatch.test_header.setup_function()'],['../namespacetest_1_1boswatch_1_1test__packet.html#a765c3df39bd5263bb4004eabada03fba',1,'test.boswatch.test_packet.setup_function()'],['../namespacetest_1_1boswatch_1_1test__paths.html#af930008a1e70eec4ba2209289a027e0f',1,'test.boswatch.test_paths.setup_function()'],['../namespacetest_1_1boswatch_1_1test___server_client.html#af21668ce2e99a7922852f29b7fcc922c',1,'test.boswatch.test_ServerClient.setup_function()'],['../namespacetest_1_1boswatch_1_1test__timer.html#a14ab4cd8f7881453a4b8996544305e4c',1,'test.boswatch.test_timer.setup_function()']]], + ['setup_5fmethod_10',['setup_method',['../namespacetest_1_1module_1_1test__descriptor.html#ad6fee7ed16ec2287e7095fd16339f4db',1,'test.module.test_descriptor.setup_method()'],['../namespacetest_1_1test__template.html#a38400063d625095e43c26e3249cca422',1,'test.test_template.setup_method()']]], + ['shutdown_11',['shutdown',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#a0ab8a4109b818531fc9f79192b045465',1,'boswatch::inputSource::inputBase::InputBase']]], + ['skiplines_12',['skipLines',['../classboswatch_1_1process_manager_1_1_process_manager.html#ac86f2638f1239a188692006699471f1f',1,'boswatch::processManager::ProcessManager']]], + ['skiplinesuntil_13',['skipLinesUntil',['../classboswatch_1_1process_manager_1_1_process_manager.html#af2886ee808fe04cebd36bc72ad8616c3',1,'boswatch::processManager::ProcessManager']]], + ['start_14',['start',['../classboswatch_1_1input_source_1_1input_base_1_1_input_base.html#ac01b4ac15a033f2df6d3ce95875f15e0',1,'boswatch.inputSource.inputBase.InputBase.start()'],['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#a9578bab3fdb883c6de357bf513884b2c',1,'boswatch.network.broadcast.BroadcastServer.start()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#aef3b308e2d4d28406bdb31be97460e60',1,'boswatch.network.server.TCPServer.start()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a9dddc0c204be55e4391557f2cb1616bf',1,'boswatch.processManager.ProcessManager.start()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a7ac6df54ac53ce43b550ea2fb7f593ba',1,'boswatch.timer.RepeatedTimer.start()']]], + ['stderr_15',['stderr',['../classboswatch_1_1process_manager_1_1_process_manager.html#a401b316004c76dea8175e7a879f649d4',1,'boswatch::processManager::ProcessManager']]], + ['stdout_16',['stdout',['../classboswatch_1_1process_manager_1_1_process_manager.html#a68468dd0235a3b0725d70852670e9ac4',1,'boswatch::processManager::ProcessManager']]], + ['stop_17',['stop',['../classboswatch_1_1network_1_1broadcast_1_1_broadcast_server.html#ad4c950fc28b36e52da565856ab61866c',1,'boswatch.network.broadcast.BroadcastServer.stop()'],['../classboswatch_1_1network_1_1server_1_1_t_c_p_server.html#adcb3af039525e3fd4465f661e985eba1',1,'boswatch.network.server.TCPServer.stop()'],['../classboswatch_1_1process_manager_1_1_process_manager.html#a9f0eb14407cf78ab7010bf247c8d6115',1,'boswatch.processManager.ProcessManager.stop()'],['../classboswatch_1_1timer_1_1_repeated_timer.html#a5f7c9e59eb302893ede382b3cf36fc6d',1,'boswatch.timer.RepeatedTimer.stop()']]] +]; diff --git a/api/html/search/functions_f.js b/api/html/search/functions_f.js new file mode 100644 index 0000000..26670e2 --- /dev/null +++ b/api/html/search/functions_f.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['teardown_0',['teardown',['../classplugin_1_1mysql_1_1_boswatch_plugin.html#abfa5c5279cfe58cae60af8272fb50f92',1,'plugin.mysql.BoswatchPlugin.teardown()'],['../classplugin_1_1plugin_base_1_1_plugin_base.html#afbb808defd32c1cfc2714eba2f79654c',1,'plugin.pluginBase.PluginBase.teardown()'],['../classplugin_1_1template__plugin_1_1_boswatch_plugin.html#af332cd897823565ab3fbebf16e72c657',1,'plugin.template_plugin.BoswatchPlugin.teardown()']]], + ['test_5fclientcommunicate_1',['test_clientCommunicate',['../namespacetest_1_1boswatch_1_1test___server_client.html#a53e16aba662adbe0ee440c745420e3c8',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientconnect_2',['test_clientConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#adfb2ec707525faac8c67988da712604a',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientconnectfailed_3',['test_clientConnectFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ab056b8e14f912c4fd86c547ac4b6aaf8',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientdisconnectfailed_4',['test_clientDisconnectFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ac68d64fea12533433a94626e3da6e45d',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientmulticommunicate_5',['test_clientMultiCommunicate',['../namespacetest_1_1boswatch_1_1test___server_client.html#af49d5647c2a61931bc75db21a3fc6713',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientmulticonnect_6',['test_clientMultiConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a8dc17ebce3b733b3f8ba54b4ff915018',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientreceivefailed_7',['test_clientReceiveFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#ab5b0baa157d1cc21bdceb44295afd471',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientreconnect_8',['test_clientReconnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a7dddf1aa22861c92b223230d271e10a3',1,'test::boswatch::test_ServerClient']]], + ['test_5fclienttransmitfailed_9',['test_clientTransmitFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#a4f9d5c0058b014033e6a2f171c6b4e03',1,'test::boswatch::test_ServerClient']]], + ['test_5fclientwithoutserver_10',['test_clientWithoutServer',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a1beba8a355f948b974c6eca495688d53',1,'test::boswatch::test_broadcast']]], + ['test_5fconfigiterationlist_11',['test_configIterationList',['../namespacetest_1_1boswatch_1_1test__config.html#ab1bb918fa2db4eef2e78d287523c737c',1,'test::boswatch::test_config']]], + ['test_5fconfigiterationlistwithnestedlist_12',['test_configIterationListWithNestedList',['../namespacetest_1_1boswatch_1_1test__config.html#ab1ebd7a6a4468befcfab36b719d21add',1,'test::boswatch::test_config']]], + ['test_5fcopypacket_13',['test_copyPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#a98582b979644b53581019ba0b6025bc9',1,'test::boswatch::test_packet']]], + ['test_5fcreatepacket_14',['test_createPacket',['../namespacetest_1_1boswatch_1_1test__packet.html#a85110c044237b58d69bc8ba71ef614d9',1,'test::boswatch::test_packet']]], + ['test_5fdecoderfmsinvalid_15',['test_decoderFmsInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a78cf0cd07d79099866e88d0519fd66b2',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderfmsvalid_16',['test_decoderFmsValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a302b9b5e85adac7b3b408c4c16c84f48',1,'test::boswatch::test_decoder']]], + ['test_5fdecodernodata_17',['test_decoderNoData',['../namespacetest_1_1boswatch_1_1test__decoder.html#aca264520be505b58de78ff6865dfda02',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsaginvalid_18',['test_decoderPocsagInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a1942d82ff3c0be5b386a04c4c93d2852',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagshortric_19',['test_decoderPocsagShortRic',['../namespacetest_1_1boswatch_1_1test__decoder.html#a0b6b9f0db1716a8925b66805d6e1149f',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagtext_20',['test_decoderPocsagText',['../namespacetest_1_1boswatch_1_1test__decoder.html#a95e9d856e19b5b1e95b87ab8f9313c54',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderpocsagvalid_21',['test_decoderPocsagValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#ab477b786838cd7ec4e3aa16c2329062f',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveidoubletone_22',['test_decoderZveiDoubleTone',['../namespacetest_1_1boswatch_1_1test__decoder.html#a04c58f267d23fc6f2de1a12a9e606aee',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveiinvalid_23',['test_decoderZveiInvalid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a72c83611f4f32d6485976eed69257e06',1,'test::boswatch::test_decoder']]], + ['test_5fdecoderzveivalid_24',['test_decoderZveiValid',['../namespacetest_1_1boswatch_1_1test__decoder.html#a9107c0722a3150ac0143551453699548',1,'test::boswatch::test_decoder']]], + ['test_5fdescriptorfoundfirst_25',['test_descriptorFoundFirst',['../namespacetest_1_1module_1_1test__descriptor.html#a9a7997ce7320161ac68ccbdbe52cc7e3',1,'test::module::test_descriptor']]], + ['test_5fdescriptorfoundsecond_26',['test_descriptorFoundSecond',['../namespacetest_1_1module_1_1test__descriptor.html#af2b796a93343766a8791b20dd773bab5',1,'test::module::test_descriptor']]], + ['test_5fdescriptornotfound_27',['test_descriptorNotFound',['../namespacetest_1_1module_1_1test__descriptor.html#a654c266edff45e6adf0d69d9cf1ce95f',1,'test::module::test_descriptor']]], + ['test_5fdescriptorscanfieldnotavailable_28',['test_descriptorScanFieldNotAvailable',['../namespacetest_1_1module_1_1test__descriptor.html#ad7c1c4f59c5c1992392002b1cbfe1045',1,'test::module::test_descriptor']]], + ['test_5fdoubleconnect_29',['test_doubleConnect',['../namespacetest_1_1boswatch_1_1test___server_client.html#a6eda50fc0446bd6144eb99bdb4236b12',1,'test::boswatch::test_ServerClient']]], + ['test_5ffileexists_30',['test_fileExists',['../namespacetest_1_1boswatch_1_1test__paths.html#acb35bf68938d6e9d9b964e7e90977500',1,'test::boswatch::test_paths']]], + ['test_5ffilenotexists_31',['test_fileNotExists',['../namespacetest_1_1boswatch_1_1test__paths.html#a7ec7af2a28a781231f40b923edea4a73',1,'test::boswatch::test_paths']]], + ['test_5fgetconfigasstring_32',['test_getConfigAsString',['../namespacetest_1_1boswatch_1_1test__config.html#a2312ded385013e4667e9dc8835984a9c',1,'test::boswatch::test_config']]], + ['test_5fgetdefaultvalue_33',['test_getDefaultValue',['../namespacetest_1_1boswatch_1_1test__config.html#abc3e5ba81f4ef81cee10f7970a84ebe3',1,'test::boswatch::test_config']]], + ['test_5fgetnestedconfig_34',['test_getNestedConfig',['../namespacetest_1_1boswatch_1_1test__config.html#acc781eabff5c119fd7b8ebfe475395c4',1,'test::boswatch::test_config']]], + ['test_5fgetnotsetfield_35',['test_getNotSetField',['../namespacetest_1_1boswatch_1_1test__packet.html#a9f47203586ef1c0d6e1fbc8fe80d3fd7',1,'test::boswatch::test_packet']]], + ['test_5fgetpacketstring_36',['test_getPacketString',['../namespacetest_1_1boswatch_1_1test__packet.html#aea179f6a3180612d1b42b0cf284837f8',1,'test::boswatch::test_packet']]], + ['test_5fgettypes_37',['test_getTypes',['../namespacetest_1_1boswatch_1_1test__config.html#a3c7f597f593254e2e61212807bb99d30',1,'test::boswatch::test_config']]], + ['test_5finfotolog_38',['test_infoToLog',['../namespacetest_1_1boswatch_1_1test__header.html#addb6d05be38f571d02a5df7f2645866f',1,'test::boswatch::test_header']]], + ['test_5floadconfigfile_39',['test_loadConfigFile',['../namespacetest_1_1boswatch_1_1test__config.html#a324ade0ada38618bb28d9437953a2a03',1,'test::boswatch::test_config']]], + ['test_5floadconfigfilefailed_40',['test_loadConfigFileFailed',['../namespacetest_1_1boswatch_1_1test__config.html#aef9f2e1a513a2afc84e14f0a30d52bef',1,'test::boswatch::test_config']]], + ['test_5floadconfigfilenotfound_41',['test_loadConfigFileNotFound',['../namespacetest_1_1boswatch_1_1test__config.html#ad3102474ad53dd0219ae7ea27b84b5fa',1,'test::boswatch::test_config']]], + ['test_5flogotolog_42',['test_logoToLog',['../namespacetest_1_1boswatch_1_1test__header.html#a3307a12dfa411c136bb5d46e1c257962',1,'test::boswatch::test_header']]], + ['test_5fmakedirexisting_43',['test_makeDirExisting',['../namespacetest_1_1boswatch_1_1test__paths.html#a1d6f2579cfa9da2b547fd9d26b1f98a6',1,'test::boswatch::test_paths']]], + ['test_5fmakedirnotexisting_44',['test_makeDirNotExisting',['../namespacetest_1_1boswatch_1_1test__paths.html#aee6cc09779b4f128855872445cfc01cf',1,'test::boswatch::test_paths']]], + ['test_5fserverclientfetchconninfo_45',['test_serverClientFetchConnInfo',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ade3b23fe1ea7dc4c21693d3a24320319',1,'test::boswatch::test_broadcast']]], + ['test_5fserverdoublestart_46',['test_serverDoubleStart',['../namespacetest_1_1boswatch_1_1test__broadcast.html#ac9e7df9092c7fd58dc3457ba16832a68',1,'test.boswatch.test_broadcast.test_serverDoubleStart()'],['../namespacetest_1_1boswatch_1_1test___server_client.html#af1167739109b3916cb361ef1aaa38b39',1,'test.boswatch.test_ServerClient.test_serverDoubleStart(getServer)']]], + ['test_5fservergetoutput_47',['test_serverGetOutput',['../namespacetest_1_1boswatch_1_1test___server_client.html#a1271b9db62b50645fb46a4b51adb9923',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverhighload_48',['test_serverHighLoad',['../namespacetest_1_1boswatch_1_1test___server_client.html#a145d0499562f3fbffb487d83f62682a2',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverrestart_49',['test_serverRestart',['../namespacetest_1_1boswatch_1_1test___server_client.html#a575095769f32d0bdb47b2441bb1c9a98',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstartstop_50',['test_serverStartStop',['../namespacetest_1_1boswatch_1_1test__broadcast.html#a6941762a8a30c6f68e7e9048a0eb1fde',1,'test::boswatch::test_broadcast']]], + ['test_5fserverstarttwoinstances_51',['test_serverStartTwoInstances',['../namespacetest_1_1boswatch_1_1test___server_client.html#ad69e19f0e9f05614a9033a8ef462d9df',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstopfailed_52',['test_serverStopFailed',['../namespacetest_1_1boswatch_1_1test___server_client.html#a3932473bb96c4478ff02d34da7c64dd7',1,'test::boswatch::test_ServerClient']]], + ['test_5fserverstopnotstarted_53',['test_serverStopNotStarted',['../namespacetest_1_1boswatch_1_1test__broadcast.html#abe7c9d4433ecbdfd5ffd3978af0fad18',1,'test::boswatch::test_broadcast']]], + ['test_5fserverstopswhileconnected_54',['test_serverStopsWhileConnected',['../namespacetest_1_1boswatch_1_1test___server_client.html#aab408817266e5b7e486b4c5b3b58f717',1,'test::boswatch::test_ServerClient']]], + ['test_5fsetgetfield_55',['test_setGetField',['../namespacetest_1_1boswatch_1_1test__packet.html#ade58d1d4fadad6f32fd5be502da07040',1,'test::boswatch::test_packet']]], + ['test_5fskippedtest_56',['test_skippedTest',['../namespacetest_1_1test__template.html#a024dd9d0209a37f1f73b353f44a4b23d',1,'test::test_template']]], + ['test_5ftestname_57',['test_testName',['../namespacetest_1_1test__template.html#aed0a8a3bd07e9c6db89e9a4596e27316',1,'test::test_template']]], + ['test_5ftimerdoublestart_58',['test_timerDoubleStart',['../namespacetest_1_1boswatch_1_1test__timer.html#a42d0104d3b764c0e58b3c623bebbdcdf',1,'test::boswatch::test_timer']]], + ['test_5ftimerisrunning_59',['test_timerIsRunning',['../namespacetest_1_1boswatch_1_1test__timer.html#a0138848991e328da81931a6eb145378b',1,'test::boswatch::test_timer']]], + ['test_5ftimeroverdue_60',['test_timerOverdue',['../namespacetest_1_1boswatch_1_1test__timer.html#a762602b6405cfc27f0c3dfd0569e96fe',1,'test::boswatch::test_timer']]], + ['test_5ftimeroverduelong_61',['test_timerOverdueLong',['../namespacetest_1_1boswatch_1_1test__timer.html#ab7d880c3c176579d74c381f7d288e380',1,'test::boswatch::test_timer']]], + ['test_5ftimerrun_62',['test_timerRun',['../namespacetest_1_1boswatch_1_1test__timer.html#a797fb308507d78d2eaef60d07493130a',1,'test::boswatch::test_timer']]], + ['test_5ftimerstartstop_63',['test_timerStartStop',['../namespacetest_1_1boswatch_1_1test__timer.html#a9113cf1f0dca71d596e8d939baf42ecd',1,'test::boswatch::test_timer']]], + ['test_5ftimerstopnotstarted_64',['test_timerStopNotStarted',['../namespacetest_1_1boswatch_1_1test__timer.html#ac923af185a61ed08924bf70dad51b4ed',1,'test::boswatch::test_timer']]], + ['test_5fwithfixture_65',['test_withFixture',['../namespacetest_1_1test__template.html#a3049692c8eb437536ea0c21f51677a1d',1,'test::test_template']]], + ['testtargetfast_66',['testTargetFast',['../namespacetest_1_1boswatch_1_1test__timer.html#a709826d54a0d446157f94fc96c6f73bf',1,'test::boswatch::test_timer']]], + ['testtargetslow_67',['testTargetSlow',['../namespacetest_1_1boswatch_1_1test__timer.html#aa13f9738515b90525e66330cc4919de4',1,'test::boswatch::test_timer']]], + ['transmit_68',['transmit',['../classboswatch_1_1network_1_1client_1_1_t_c_p_client.html#a0b220cacacdf690617645c7fefdc4f98',1,'boswatch::network::client::TCPClient']]] +]; diff --git a/api/html/search/mag.svg b/api/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/api/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/html/search/mag_d.svg b/api/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/api/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/html/search/mag_sel.svg b/api/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/api/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/html/search/mag_seld.svg b/api/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/api/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/html/search/namespaces_0.js b/api/html/search/namespaces_0.js new file mode 100644 index 0000000..21225ea --- /dev/null +++ b/api/html/search/namespaces_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['boswatch_0',['boswatch',['../namespaceboswatch.html',1,'']]], + ['boswatch_3a_3aconfigyaml_1',['configYaml',['../namespaceboswatch_1_1config_yaml.html',1,'boswatch']]], + ['boswatch_3a_3adecoder_2',['decoder',['../namespaceboswatch_1_1decoder.html',1,'boswatch']]], + ['boswatch_3a_3adecoder_3a_3adecoder_3',['decoder',['../namespaceboswatch_1_1decoder_1_1decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3afmsdecoder_4',['fmsDecoder',['../namespaceboswatch_1_1decoder_1_1fms_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3apocsagdecoder_5',['pocsagDecoder',['../namespaceboswatch_1_1decoder_1_1pocsag_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3adecoder_3a_3azveidecoder_6',['zveiDecoder',['../namespaceboswatch_1_1decoder_1_1zvei_decoder.html',1,'boswatch::decoder']]], + ['boswatch_3a_3ainputsource_7',['inputSource',['../namespaceboswatch_1_1input_source.html',1,'boswatch']]], + ['boswatch_3a_3ainputsource_3a_3ainputbase_8',['inputBase',['../namespaceboswatch_1_1input_source_1_1input_base.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3alineininput_9',['lineInInput',['../namespaceboswatch_1_1input_source_1_1line_in_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3apulseaudioinput_10',['pulseaudioInput',['../namespaceboswatch_1_1input_source_1_1pulseaudio_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3ainputsource_3a_3asdrinput_11',['sdrInput',['../namespaceboswatch_1_1input_source_1_1sdr_input.html',1,'boswatch::inputSource']]], + ['boswatch_3a_3anetwork_12',['network',['../namespaceboswatch_1_1network.html',1,'boswatch']]], + ['boswatch_3a_3anetwork_3a_3abroadcast_13',['broadcast',['../namespaceboswatch_1_1network_1_1broadcast.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3aclient_14',['client',['../namespaceboswatch_1_1network_1_1client.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3anetcheck_15',['netCheck',['../namespaceboswatch_1_1network_1_1net_check.html',1,'boswatch::network']]], + ['boswatch_3a_3anetwork_3a_3aserver_16',['server',['../namespaceboswatch_1_1network_1_1server.html',1,'boswatch::network']]], + ['boswatch_3a_3apacket_17',['packet',['../namespaceboswatch_1_1packet.html',1,'boswatch']]], + ['boswatch_3a_3aprocessmanager_18',['processManager',['../namespaceboswatch_1_1process_manager.html',1,'boswatch']]], + ['boswatch_3a_3arouter_19',['router',['../namespaceboswatch_1_1router.html',1,'boswatch']]], + ['boswatch_3a_3arouter_3a_3aroute_20',['route',['../namespaceboswatch_1_1router_1_1route.html',1,'boswatch::router']]], + ['boswatch_3a_3arouter_3a_3arouter_21',['router',['../namespaceboswatch_1_1router_1_1router.html',1,'boswatch::router']]], + ['boswatch_3a_3arouter_3a_3aroutermanager_22',['routerManager',['../namespaceboswatch_1_1router_1_1router_manager.html',1,'boswatch::router']]], + ['boswatch_3a_3atimer_23',['timer',['../namespaceboswatch_1_1timer.html',1,'boswatch']]], + ['boswatch_3a_3autils_24',['utils',['../namespaceboswatch_1_1utils.html',1,'boswatch']]], + ['boswatch_3a_3autils_3a_3aheader_25',['header',['../namespaceboswatch_1_1utils_1_1header.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3amisc_26',['misc',['../namespaceboswatch_1_1utils_1_1misc.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3apaths_27',['paths',['../namespaceboswatch_1_1utils_1_1paths.html',1,'boswatch::utils']]], + ['boswatch_3a_3autils_3a_3aversion_28',['version',['../namespaceboswatch_1_1utils_1_1version.html',1,'boswatch::utils']]], + ['boswatch_3a_3awildcard_29',['wildcard',['../namespaceboswatch_1_1wildcard.html',1,'boswatch']]] +]; diff --git a/api/html/search/namespaces_1.js b/api/html/search/namespaces_1.js new file mode 100644 index 0000000..645a90c --- /dev/null +++ b/api/html/search/namespaces_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['module_0',['module',['../namespacemodule.html',1,'']]], + ['module_3a_3adescriptor_1',['descriptor',['../namespacemodule_1_1descriptor.html',1,'module']]], + ['module_3a_3afilter_2',['filter',['../namespacemodule_1_1filter.html',1,'module']]], + ['module_3a_3afilter_3a_3adoublefilter_3',['doubleFilter',['../namespacemodule_1_1filter_1_1double_filter.html',1,'module::filter']]], + ['module_3a_3afilter_3a_3amodefilter_4',['modeFilter',['../namespacemodule_1_1filter_1_1mode_filter.html',1,'module::filter']]], + ['module_3a_3afilter_3a_3aregexfilter_5',['regexFilter',['../namespacemodule_1_1filter_1_1regex_filter.html',1,'module::filter']]], + ['module_3a_3ageocoding_6',['geocoding',['../namespacemodule_1_1geocoding.html',1,'module']]], + ['module_3a_3amodulebase_7',['moduleBase',['../namespacemodule_1_1module_base.html',1,'module']]], + ['module_3a_3atemplate_5fmodule_8',['template_module',['../namespacemodule_1_1template__module.html',1,'module']]] +]; diff --git a/api/html/search/namespaces_2.js b/api/html/search/namespaces_2.js new file mode 100644 index 0000000..447671f --- /dev/null +++ b/api/html/search/namespaces_2.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['plugin_0',['plugin',['../namespaceplugin.html',1,'']]], + ['plugin_3a_3adivera_1',['divera',['../namespaceplugin_1_1divera.html',1,'plugin']]], + ['plugin_3a_3ahttp_2',['http',['../namespaceplugin_1_1http.html',1,'plugin']]], + ['plugin_3a_3amysql_3',['mysql',['../namespaceplugin_1_1mysql.html',1,'plugin']]], + ['plugin_3a_3apluginbase_4',['pluginBase',['../namespaceplugin_1_1plugin_base.html',1,'plugin']]], + ['plugin_3a_3atelegram_5',['telegram',['../namespaceplugin_1_1telegram.html',1,'plugin']]], + ['plugin_3a_3atemplate_5fplugin_6',['template_plugin',['../namespaceplugin_1_1template__plugin.html',1,'plugin']]] +]; diff --git a/api/html/search/namespaces_3.js b/api/html/search/namespaces_3.js new file mode 100644 index 0000000..2331599 --- /dev/null +++ b/api/html/search/namespaces_3.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['test_0',['test',['../namespacetest.html',1,'']]], + ['test_3a_3aboswatch_1',['boswatch',['../namespacetest_1_1boswatch.html',1,'test']]], + ['test_3a_3aboswatch_3a_3atest_5fbroadcast_2',['test_broadcast',['../namespacetest_1_1boswatch_1_1test__broadcast.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fconfig_3',['test_config',['../namespacetest_1_1boswatch_1_1test__config.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fdecoder_4',['test_decoder',['../namespacetest_1_1boswatch_1_1test__decoder.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fheader_5',['test_header',['../namespacetest_1_1boswatch_1_1test__header.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fpacket_6',['test_packet',['../namespacetest_1_1boswatch_1_1test__packet.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fpaths_7',['test_paths',['../namespacetest_1_1boswatch_1_1test__paths.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5fserverclient_8',['test_ServerClient',['../namespacetest_1_1boswatch_1_1test___server_client.html',1,'test::boswatch']]], + ['test_3a_3aboswatch_3a_3atest_5ftimer_9',['test_timer',['../namespacetest_1_1boswatch_1_1test__timer.html',1,'test::boswatch']]], + ['test_3a_3amodule_10',['module',['../namespacetest_1_1module.html',1,'test']]], + ['test_3a_3amodule_3a_3atest_5fdescriptor_11',['test_descriptor',['../namespacetest_1_1module_1_1test__descriptor.html',1,'test::module']]], + ['test_3a_3aplugin_12',['plugin',['../namespacetest_1_1plugin.html',1,'test']]], + ['test_3a_3atest_5ftemplate_13',['test_template',['../namespacetest_1_1test__template.html',1,'test']]] +]; diff --git a/api/html/search/pages_0.js b/api/html/search/pages_0.js new file mode 100644 index 0000000..e70b910 --- /dev/null +++ b/api/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boswatch_0',['BOSWatch',['../md__r_e_a_d_m_e.html',1,'']]] +]; diff --git a/api/html/search/pages_1.js b/api/html/search/pages_1.js new file mode 100644 index 0000000..feadd94 --- /dev/null +++ b/api/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['list_0',['Todo List',['../todo.html',1,'']]] +]; diff --git a/api/html/search/pages_2.js b/api/html/search/pages_2.js new file mode 100644 index 0000000..83220ef --- /dev/null +++ b/api/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['todo_20list_0',['Todo List',['../todo.html',1,'']]] +]; diff --git a/api/html/search/search.css b/api/html/search/search.css new file mode 100644 index 0000000..a53214f --- /dev/null +++ b/api/html/search/search.css @@ -0,0 +1,286 @@ +/*---------------- Search Box */ + +#MSearchBox { + position: absolute; + right: 5px; +} +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/html/search/search.js b/api/html/search/search.js new file mode 100644 index 0000000..666af01 --- /dev/null +++ b/api/html/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c-{AmhX=Jf@Vh3$sK6WR8D4 zADWXi!L(aveRo2n%x-tkRZ`o_-0HM%i-6Ml-{z9qiz zc?-Y#p9gym9RB?E>(!^P&hFm)^yKlw*X84M@7p(2F5+0MaY&=fpi8NT80HJP%+F7+ z-~avn>|OgP9hv=itgAMD|8jEi<;l;xf#%FK$0!0!-{AmhX=Jf@Vh8#BcMB-$=c zZc&)U;nmfVq1X||ro%MTfu(w*(3&k}jN%u!TWo5n3c;wkmoA26u?*-JKPY*wT zzh?LMAJ4x1RbO7N=jV66FR@-Eu}jG(utl@Wz*TUW#vu{c8H+fAaS8rowcNj_>f^WH z5AAmStJu+Ax3;gZPkvv`|96L`&NM1N1P1r>mdKI;Vst0MxN^d;kCd literal 0 HcmV?d00001 diff --git a/api/html/sync_off.png b/api/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..11df16141e5d329bfb619ac5ec54a7de595d9b56 GIT binary patch literal 840 zcmV-O1GoH%P)lLq!vWx(zaz78Yq}sAyNc|u%YyUQM3fIM36VN zOYO2-bdeXX>|U%8UPKqWbx}|eu7>QksIZF_qvrNJ)4cDz^UjQDczZZMJn!+$`Jd;U z=i}D##fjem;*lp*3T47NAzN??FNKFfzwn#z6d)FkI09Khn@}Gb1H|K%@S|{E7yu%A zB7lwU!WE$iU>3NAgF>}%T)1KVX98gD4MNWxHn+AV!gZlFp1?NY+c;JM%$AG7e&fSg zQr>K+>&Y_!<^etI9bv?55#T5s2sxhl8Uv`O}sD zOn{h_djj=ugT!tAs@L} zDFAlrRiMH;v#P+&h2~=XC20V&!k3d86!Cu?^_wac@S88QK9e&|D_OoI*<7)yG@Yg$ zIUL;i9-|%jJcpVsUh_L+VG`{PMKZTE!gW<3xT>W(kE46@qwce`(8HbzFT2XT6z8Uz z^SjHvlz$rObWW#(#?O}1)=)TRJhlorg1I4m0lnPl&Q%(L-=+t-tm;)MIr>&b?3y!t@ z5h^~5HTT6Rs{nR>2^~yh3JCXD7FgSAp;p+g*(6j*R8SpWBkFEw)8Ksr*m(zS7pscI SCumLp0000sTJ literal 0 HcmV?d00001 diff --git a/api/html/sync_on.png b/api/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c04f6422b56037dbceace40fb4986cd0fdfeae00 GIT binary patch literal 829 zcmV-D1H$}?P)w{UR-1#8z3L4=JimSjI5id_U* z_NJR^VIyjnE($W)n}qB_x~RMecK1fI0$ofhwp~U??RjSAIOoiqkt}ato*&Gd^YT9D z{k}C0e0>ifm2y!pwu?=oSh&Q57!h~GE%7&i6C*`}LUB^G#C`*$@=9D5XT&IA3pYT5 z260wY0=$77(Jl^(1tZ>m=uG5@%#>pINr z`sH~5%RoQ&nwT_u&?Ec+PFCb3cPcYIadd%rc*QAQL|SW&Xah)O7{*+8lb`xvK7dWN zKZg^C*W$_4RSS@$Nz`b9MyH|idDHo(tuk$oG#;9n1F(7Z|13K<=5hL16>AE!0GzaF zf*pV@Y63a@(6NqS^$LJRRh4B&k_6v(tlOvwg0|V&oX_`1-=nl3bK%*xS|3M0E~9;a z)R+6pXxde@@IEg$ou1Z8dA1s`MS&)W)YM7qJXlWmXa1ydt*!8KXh#vBY>)c1u86u1 z?W5{)8MN&!*P-%-^?$zq zDcA4(1H?m@X>aHH$nVhf92W+jG9U>6Ym8_MLx~B7A3kUNS%|Ni15}iF95 zKo7Zv1Io5K(u}ar>vroLSWC9dK{!0mbU1kv#>${xR%U{Lc%T~?U>RtabOYZt2ltWa z0$3*BYU7DF+9jduQ_pjNxAn95aj`r33(=>024D$vbA4xR+(>m!>I?>@_}d;4Wcl1k!V6)^t!8V#~O`{H$bA-4Y{bmRN{eU00000NkvXX Hu0mjf?evNr literal 0 HcmV?d00001 diff --git a/api/html/tab_a.png b/api/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f3ac9f327b488e7224c54f210289e8e6fc4c7c GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QemDhjv*C{Z(~pLHW=`1_H_`I zXL)qGJ@7{Ta-rox&pRIdIK{Q&p8xB*)w2DI<_6^`sWvQ{c4x&xCy#{&li$aB+`YF; sIOLpMaY1{r^K8rSp=kxjKC}O14wqr>JSojA4YYy5)78&qol`;+0M6Sp(EtDd literal 0 HcmV?d00001 diff --git a/api/html/tab_ad.png b/api/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..52563df3df0cdd1e27402d3c56783805ecbe85fe GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qa+w8jv*C{Z|6GlH8^lECpz>V zTmA9B{niOjAIW=g3Ezs{m#{5sfBd%Bik}Y1>~T?AeRWOj<})Y1s1!uo>^}A9zUKA+ jQ`eiVk=&L4OoX+pRUnIcMjz=J1xS=f8dYz%u!W z@`>wub>2^$uJ)m-Tj$k*MV~w$L{6Qj{?x{$W%nP>WEH~$>wo>FVdQ&MBb@03c6A$N&HU literal 0 HcmV?d00001 diff --git a/api/html/tab_bd.png b/api/html/tab_bd.png new file mode 100644 index 0000000000000000000000000000000000000000..4993947af7b1151b482101dc2644bb1691b1103b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QrVs^jv*C{Z|}x(H93g1JuKdr zKdZ2A%O*}`CqXrhrfC=dg@-I$XrBA%>CQ@V#r98!j%{DyyT;%D*t>%jdyJn+J4Z`= znp$UnE_65Jr^?N@zHMH&^Us>|0)ko`fexjD^?v<_)*Rg7DK(qrSUuwrYp!(GJa!MD OwG5uFelF{r5}E)w|31P1 literal 0 HcmV?d00001 diff --git a/api/html/tab_h.png b/api/html/tab_h.png new file mode 100644 index 0000000000000000000000000000000000000000..fd249053ea24d9f18fe079c028cf87395796e6d1 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|~Z29dZzGczCl? zP^IS<^1BHxbW7hY;H$QR>uq1qSoGf*2ZmF^Z$(2lKQ%blXzm5>YSIKw%ok@xOmFE z7rWV2Sbn7~$afbzd-vVUqYuSeJrd&Lr;Fv)a0j+>ow0bm-=K72fW_=g-tF7$cixSk bk#d#)otIE}q&26qbz;U*o+bMvFB&I{C_7!8 tU$V91oKg;lV#ayrs8`L;bk_W3e6mz&=j7{U%0M?Uc)I$ztaD0e0s!l5N)7-3 literal 0 HcmV?d00001 diff --git a/api/html/tab_sd.png b/api/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..329c7f291a898e12fe3b4a212053519f395e545d GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QjMN2jv*C{Z|~-EH91JQKHP3; z*=J=oD@A##o4f!Et02qO^cjpu;t?fJ5n6gh@bNh@%hj;K6-V=!KKR3li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/html/todo.html b/api/html/todo.html new file mode 100644 index 0000000..2b8517b --- /dev/null +++ b/api/html/todo.html @@ -0,0 +1,123 @@ + + + + + + + +BOSWatch 3: Todo List + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
BOSWatch 3 +
+
Python Script to receive and decode German BOS Information with rtl_fm and multimon-NG
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Todo List
+
+
+
+
Global boswatch.packet.Packet.printInfo (self)
+
not complete yet - must be edit to print nice formatted messages on console
+
+
+
+
+ + + + diff --git a/changelog.html b/changelog.html new file mode 100644 index 0000000..2f19d7d --- /dev/null +++ b/changelog.html @@ -0,0 +1,290 @@ + + + + + + + + + + + Changelog - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

Changelog

+
+

Version [2.9.0] - date

+

Functions implemented in initial version:

+
    +
  • Multithreaded Server/Client infrastructure for alarm handling
  • +
  • Client can auto fetch connection information over bradocast from server
  • +
  • Easy configuration with YAML file for all components
  • +
  • Simple module and plugin system to extend functionality
  • +
  • Alarmpacket routing system for flexible chains of modules nd plugins
  • +
+

Modules

+
    +
  • Mode filter to filter at specific packet types such as FMS, POCSAG, ZVEI or MSG packets
  • +
+

Filter

+
+

Zum schreiben des Changelog's siehe: http://keepachangelog.com/de/1.0.0/

+
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/config.html b/config.html new file mode 100644 index 0000000..e6c993a --- /dev/null +++ b/config.html @@ -0,0 +1,674 @@ + + + + + + + + + + + Konfiguration - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

Konfiguration

+

Die Konfiguration von BOSWatch 3 ist im YAML Format abgelegt und wird nachfolgend beschrieben.
+Immer wenn für eine Einstellung ein Default Wert angegeben ist, muss diese Einstellung nicht +zwingend in die Konfiguration eingetragen werden.

+

Client

+
+

client:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
nameName zur Identifizierung der Client Instanz
inputSourceArt der zu nutzenden Input Quelle (sdr, lineIn oder PulseAudio)
useBroadcastVerbindungsdaten per Broadcast beziehenno
reconnectDelayVerzögerung für erneuten Verbindungsversuch zum Server3
sendTriesAnzahl der Sendeversuche eines Pakets3
sendDelayVerzögerung für einen erneuten Sendeversuch3
+
+

server:

+

Der Abschnitt server: wird nur genutzt, wenn useBroadcast: no gesetzt ist.
+Ansonsten wird versucht die Verbindungsdaten per Broadcast Paket direkt vom Server zu beziehen.

+ + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
ipIP Adresse des Servers127.0.0.1
portPort des Sever8080
+

Beispiel:

+
server:
+  ip: 10.10.10.2
+  port: 9123
+
+
+

inputSource:

+

Es gibt die Auswahl zwischen sdr, lineIn oder PulseAudio als Input Quelle.
+Mit sdr wird direkt per rtl_sdr die zu empfangende Frequenz an Multimon-NG weitergereicht.
+Mit lineIn wird eine Quelle die (per ALSA) direkt an die Soundkarte angeschlossen ist an Multimon-NG weitergereicht.
+Mit PulseAudio wird ein PulseAudio-Sink an Multimon-NG weitergereicht, z.B. in Kombination mit RTLSDR-Airband und/oder Docker.

+

sdr:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
devicertl_fm Device ID0
frequencyZu empfangende Frequenz
errorFrequenz Abweichung in ppm0
squelchEinstellung der Rauschsperre1
gainVerstärkung des Eingangssignals100
fir_sizeniedrig leckagearmen FilterNone
rtlPathPfad zur rtl_fm Binaryrtl_fm
+

Beispiel:

+
inputSource:
+  sdr:
+    device: 0
+    frequency: 85M
+    error: 0
+    squelch: 1
+    gain: 100
+    rtlPath: /usr/bin/rtl-fm
+
+

lineIn:

+ + + + + + + + + + + + + + + +
FeldBeschreibungDefault
devicedie device Id der Soundkarte1
+

Device herausfinden +Durch eingabe des Befehls aplay -l werden alle Soundkarten ausgegeben. Das schaut ungefähr so aus:

+
**** List of PLAYBACK Hardware Devices ****
+card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
+  Subdevices: 7/7
+  Subdevice #0: subdevice #0
+  Subdevice #1: subdevice #1
+  Subdevice #2: subdevice #2
+  Subdevice #3: subdevice #3
+  Subdevice #4: subdevice #4
+  Subdevice #5: subdevice #5
+  Subdevice #6: subdevice #6
+card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
+  Subdevices: 1/1
+  Subdevice #0: subdevice #0
+card 0: ALSA [bcm2835 ALSA], device 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
+  Subdevices: 1/1
+  Subdevice #0: subdevice #0
+card 1: Device [C-Media USB Audio Device], device 0: USB Audio [USB Audio]
+  Subdevices: 1/1
+  Subdevice #0: subdevice #0
+
+

Wir betrachten das letzte Gerät: card 1: Device [C-Media USB Audio Device], device 0: USB Audio [USB Audio]

+

In dem Fall ist das letzte Gerät - card 1 - unsere USB-Audio Schnittstelle die wir verwenden wollen. +In der Konfiguration wird das Feld card nun auf den Wert 1 gesetzt.

+

Nach dem Typ der Soundkarte steht das device, in diesem Fall device 0. +In der Konfiguration wird das Feld device nun auf den Wert 0 gesetzt.

+

Beispiel:

+
inputSource:
+  ...
+  lineIn:
+    card: 1
+    device: 0
+
+

PulseAudio:

+ + + + + + + + + + + + + + + +
FeldBeschreibungDefault
deviceDer Sinks-Name der Quelleboswatch
+

Device herausfinden +Durch eingabe des Befehls pacmd list-sinks | grep name: werden alle Sinks ausgegeben. Beispiel:

+
bash-5.0# pacmd list-sinks | grep name:
+    name: <boswatch>
+
+

In der Konfiguration wird das Feld device nun auf den den Namen des gewünschten Sinks gesetzt (ohne spitze Klammern, <>).

+

Beispiel:

+
inputSource:
+  ...
+  PulseAudio:
+    device: boswatch
+
+
+

decoder:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
fmsFMS Decoderno
zveiZVEI Decoderno
poc512POCSAG Decoder (Bitrate 512)no
poc1200POCSAG Decoder (Bitrate 1200)no
poc2400POCSAG Decoder (Bitrate 2400)no
pathPfad zur multimon-ng Binarymultimon-ng
charmultimon-ng char-Setnot set
+

Beispiel:

+
decoder:
+  fms: yes
+  zvei: yes
+  poc512: no
+  poc1200: no
+  poc2400: yes
+  path: /opt/multimon/multimon-ng
+  char: DE
+
+
+

Server

+

Nachfolgend alle Parameter der Server Konfiguration

+

server:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
portPort auf dem der Server lauscht8080
nameName zur Identifizierung der Server Instanz
useBroadcastVerbindungsdaten per Broadcast Server bereitstellenno
loggingAktivieren / Deaktivieren des Schreibens von Statistik-DateienFalse
+
+

alarmRouter:

+

Enthält eine Liste der Router Namen, welche bei einem Alarm direkt gestartet werden sollen.

+

Beispiel:

+
alarmRouter:
+  - Name des Routers
+  - ein weiter Router
+
+
+

router:

+

Mit den Routern kann der Verarbeitungsweg eines Alarm-Paketes festgelegt werden. Es können beliebig viele Router in Form einer Liste angegeben werden.

+ + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
nameName des Routers
routeDefiniten des Routenverlaufs
+

route:

+

Jeder Router kann eine beliebige Anzahl einzelner Routenpunkte enthalten. Diese werden innerhalb des Routers sequentiel abgearbeitet. Mögliche Typen der Routenpunkte sind dabei ein Modul, ein Plugin oder ein anderer Router. Sie werden ebenfalls in Form einer Liste definiert.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungDefault
typeArt des Routenpunktes (module, plugin, router)
resZu ladende Resource (Siehe entsprechende Kapitel)
nameOptionaler Name des Routenpunktesgleich wie Resource
configKonfigurationseinstellungen des Routenpunktes (Siehe entsprechende Kapitel)
+

Beispiel:

+
router:
+  - name: Router 1
+    route:
+      - type: module
+        res: filter.modeFilter
+        name: Filter Fms/Zvei
+        config:
+          allowed:
+            - fms
+
+
+

Module/Plugins

+

Die möglichen Einstellungen der einzelnen Module und Plugins sind im jeweiligen Kapitel aufgelistet.

+
+

Logging

+

Um den Datenträger, auf dem Boswatch läuft, zu schützen ist das Logging in +Dateien standartmäßig auf Fehlermeldungen begrenzt. +In den Dateien logger_client.ini bzw logger_server.ini kann dies +entsprechend im Bereich handler_file unter level= angepasst werden.

+

Das Schreiben einer Statistik-Datei, welche die Durchläufe aller Module +und Plugins dokumentiert, kann in der Server-Konfiguration über den Parameter +logging aktiviert werden. +(siehe Server-Konfiguration)

+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/css/base.css b/css/base.css new file mode 100644 index 0000000..f5f27ba --- /dev/null +++ b/css/base.css @@ -0,0 +1,366 @@ +html { + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + scroll-padding-top: calc(3.5rem + 20px); +} + +/* Replacement for `body { background-attachment: fixed; }`, which has + performance issues when scrolling on large displays. See #1394. */ +body::before { + content: ' '; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: var(--bs-body-bg); + background: url(../img/grid.png) repeat-x; + will-change: transform; + z-index: -1; +} + +body > .container { + margin-top: 20px; + min-height: 400px; +} + +.navbar.fixed-top { + position: -webkit-sticky; + position: sticky; +} + +.source-links { + float: right; +} + +.col-md-9 img { + max-width: 100%; + display: inline-block; + padding: 4px; + line-height: 1.428571429; + background-color: var(--bs-secondary-bg-subtle); + border: 1px solid var(--bs-secondary-border-subtle); + border-radius: 4px; + margin: 20px auto 30px auto; +} + +h1 { + color: inherit; + font-weight: 400; + font-size: 42px; +} + +h2, h3, h4, h5, h6 { + color: inherit; + font-weight: 300; +} + +hr { + border-top: 1px solid #aaa; + opacity: 1; +} + +pre, .rst-content tt { + max-width: 100%; + background-color: var(--bs-body-bg); + border: solid 1px var(--bs-border-color); + color: var(--bs-body-color); + overflow-x: auto; +} + +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +code { + padding: 2px 5px; + background-color: rgba(var(--bs-body-bg-rgb), 0.75); + border: solid 1px var(--bs-border-color); + color: var(--bs-body-color); + white-space: pre-wrap; + word-wrap: break-word; +} + +pre code { + display: block; + border: none; + white-space: pre; + word-wrap: normal; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 12px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: var(--bs-secondary-text-emphasis); + background-color: var(--bs-secondary-bg-subtle); + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); +} + +a code { + color: inherit; +} + +a:hover code, a:focus code { + color: inherit; +} + +footer { + margin-top: 30px; + margin-bottom: 10px; + text-align: center; + font-weight: 200; +} + +.modal-dialog { + margin-top: 60px; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +.bs-sidebar.affix { + position: -webkit-sticky; + position: sticky; + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + top: calc(3.5rem + 20px); +} + +.bs-sidebar.card { + padding: 0; + max-height: 90%; + overflow-y: auto; +} + +/* Toggle (vertically flip) sidebar collapse icon */ +.bs-sidebar .navbar-toggler span { + -moz-transform: scale(1, -1); + -webkit-transform: scale(1, -1); + -o-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} + +.bs-sidebar .navbar-toggler.collapsed span { + -moz-transform: scale(1, 1); + -webkit-transform: scale(1, 1); + -o-transform: scale(1, 1); + -ms-transform: scale(1, 1); + transform: scale(1, 1); +} + +/* First level of nav */ +.bs-sidebar > .navbar-collapse > .nav { + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; + width: 100%; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; + z-index: 1; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > li > a.active, +.bs-sidebar .nav > li > a.active:hover, +.bs-sidebar .nav > li > a.active:focus { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +.bs-sidebar .nav .nav .nav { + margin-left: 1em; +} + +.bs-sidebar .nav > li > a { + font-weight: bold; +} + +.bs-sidebar .nav .nav > li > a { + font-weight: normal; +} + +.headerlink { + font-family: FontAwesome; + font-size: 14px; + display: none; + padding-left: .5em; + text-decoration: none; + vertical-align: middle; +} + +h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { + display:inline-block; +} + +blockquote { + padding-left: 10px; + border-left: 4px solid #e6e6e6; +} + +.admonition, details { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; + text-align: left; +} + +.admonition.note, details.note { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + border-color: var(--bs-primary-border-subtle); +} + +.admonition.note h1, .admonition.note h2, .admonition.note h3, +.admonition.note h4, .admonition.note h5, .admonition.note h6, +details.note h1, details.note h2, details.note h3, +details.note h4, details.note h5, details.note h6 { + color: var(--bs-primary-text-emphasis); +} + +.admonition.info, details.info { + color: var(--bs-info-text-emphasis); + background-color: var(--bs-info-bg-subtle); + border-color: var(--bs-info-border-subtle); +} + +.admonition.info h1, .admonition.info h2, .admonition.info h3, +.admonition.info h4, .admonition.info h5, .admonition.info h6, +details.info h1, details.info h2, details.info h3, +details.info h4, details.info h5, details.info h6 { + color: var(--bs-info-text-emphasis); +} + +.admonition.warning, details.warning { + color: var(--bs-warning-text-emphasis); + background-color: var(--bs-warning-bg-subtle); + border-color: var(--bs-warning-border-subtle); +} + +.admonition.warning h1, .admonition.warning h2, .admonition.warning h3, +.admonition.warning h4, .admonition.warning h5, .admonition.warning h6, +details.warning h1, details.warning h2, details.warning h3, +details.warning h4, details.warning h5, details.warning h6 { + color: var(--bs-warning-text-emphasis); +} + +.admonition.danger, details.danger { + color: var(--bs-danger-text-emphasis); + background-color: var(--bs-danger-bg-subtle); + border-color: var(--bs-danger-border-subtle); +} + +.admonition.danger h1, .admonition.danger h2, .admonition.danger h3, +.admonition.danger h4, .admonition.danger h5, .admonition.danger h6, +details.danger h1, details.danger h2, details.danger h3, +details.danger h4, details.danger h5, details.danger h6 { + color: var(--bs-danger-text-emphasis); +} + +.admonition, details { + color: var(--bs-light-text-emphasis); + background-color: var(--bs-light-bg-subtle); + border-color: var(--bs-light-border-subtle); +} + +.admonition h1, .admonition h2, .admonition h3, +.admonition h4, .admonition h5, .admonition h6, +details h1, details h2, details h3, +details h4, details h5, details h6 { + color: var(--bs-light-text-emphasis); +} + +.admonition-title, summary { + font-weight: bold; + text-align: left; +} + +.admonition>p:last-child, details>p:last-child { + margin-bottom: 0; +} + +@media (max-width: 991.98px) { + .navbar-collapse.show { + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } +} + +.dropdown-item.open { + color: var(--bs-dropdown-link-active-color); + background-color: var(--bs-dropdown-link-active-bg); +} + +.dropdown-submenu > .dropdown-menu { + margin: 0 0 0 1.5rem; + padding: 0; + border-width: 0; +} + +.dropdown-submenu > a::after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: var(--bs-dropdown-link-active-color); + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover > a::after { + border-left-color: var(--bs-dropdown-link-active-color); +} + +@media (min-width: 992px) { + .dropdown-menu { + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } + + .dropdown-submenu { + position: relative; + } + + .dropdown-submenu > .dropdown-menu { + position: fixed !important; + margin-top: -9px; + margin-left: -2px; + border-width: 1px; + padding: 0.5rem 0; + } + + .dropdown-submenu.pull-left { + float: none; + } + + .dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + } +} + +@media print { + /* Remove sidebar when print */ + .col-md-3 { display: none; } +} diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100644 index 0000000..0eed851 --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,12 @@ +@charset "UTF-8";/*! + * Bootswatch v5.3.2 (https://bootswatch.com) + * Theme: cerulean + * Copyright 2012-2023 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#82c8f1;--bs-link-hover-color:#9bd3f4;--bs-link-color-rgb:130,200,241;--bs-link-hover-color-rgb:155,211,244;--bs-code-color:#f18bba;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#582200;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#abcb88;--bs-form-valid-border-color:#abcb88;--bs-form-invalid-color:#dd777a;--bs-form-invalid-border-color:#dd777a}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.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:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#868e96}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d5edfa;--bs-table-border-color:#aabec8;--bs-table-striped-bg:#cae1ee;--bs-table-striped-color:#000;--bs-table-active-bg:#c0d5e1;--bs-table-active-color:#000;--bs-table-hover-bg:#c5dbe7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fbfbfc;--bs-table-border-color:#c9c9ca;--bs-table-striped-bg:#eeeeef;--bs-table-striped-color:#000;--bs-table-active-bg:#e2e2e3;--bs-table-active-color:#000;--bs-table-hover-bg:#e8e8e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#e3eed7;--bs-table-border-color:#b6beac;--bs-table-striped-bg:#d8e2cc;--bs-table-striped-color:#000;--bs-table-active-bg:#ccd6c2;--bs-table-active-color:#000;--bs-table-hover-bg:#d2dcc7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cdd8e3;--bs-table-border-color:#a4adb6;--bs-table-striped-bg:#c3cdd8;--bs-table-striped-color:#000;--bs-table-active-bg:#b9c2cc;--bs-table-active-color:#000;--bs-table-hover-bg:#bec8d2;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#f8ddcc;--bs-table-border-color:#c6b1a3;--bs-table-striped-bg:#ecd2c2;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc7b8;--bs-table-active-color:#000;--bs-table-hover-bg:#e5ccbd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f4d2d3;--bs-table-border-color:#c3a8a9;--bs-table-striped-bg:#e8c8c8;--bs-table-striped-color:#000;--bs-table-active-bg:#dcbdbe;--bs-table-active-color:#000;--bs-table-hover-bg:#e2c2c3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#343a40;--bs-table-border-color:#5d6166;--bs-table-striped-bg:#3e444a;--bs-table-striped-color:#fff;--bs-table-active-bg:#484e53;--bs-table-active-color:#fff;--bs-table-hover-bg:#43494e;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;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){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-check-input:checked{background-color:#2fa4e7;border-color:#2fa4e7}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#2fa4e7;border-color:#2fa4e7;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2397d2f3'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: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")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#2fa4e7;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c1e4f8}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#2fa4e7;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c1e4f8}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#868e96}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);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='%2373a839' d='M2.3 6.73.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:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.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)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2373a839' d='M2.3 6.73.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");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23c71c22'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23c71c22' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.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)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23c71c22'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23c71c22' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);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:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#288bc4;--bs-btn-hover-border-color:#2683b9;--bs-btn-focus-shadow-rgb:78,178,235;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2683b9;--bs-btn-active-border-color:#237bad;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#2fa4e7;--bs-btn-disabled-border-color:#2fa4e7}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#eceff1;--bs-btn-hover-border-color:#ebeef1;--bs-btn-focus-shadow-rgb:198,201,203;--bs-btn-active-color:#000;--bs-btn-active-bg:#edf0f2;--bs-btn-active-border-color:#ebeef1;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#e9ecef;--bs-btn-disabled-border-color:#e9ecef}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#628f30;--bs-btn-hover-border-color:#5c862e;--bs-btn-focus-shadow-rgb:136,181,87;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5c862e;--bs-btn-active-border-color:#567e2b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#73a839;--bs-btn-disabled-border-color:#73a839}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033362;--bs-btn-hover-border-color:#02305c;--bs-btn-focus-shadow-rgb:41,89,136;--bs-btn-active-color:#fff;--bs-btn-active-bg:#02305c;--bs-btn-active-border-color:#022d56;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#033c73;--bs-btn-disabled-border-color:#033c73}.btn-warning{--bs-btn-color:#fff;--bs-btn-bg:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bc4900;--bs-btn-hover-border-color:#b14500;--bs-btn-focus-shadow-rgb:226,111,38;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b14500;--bs-btn-active-border-color:#a64100;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dd5600;--bs-btn-disabled-border-color:#dd5600}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#a9181d;--bs-btn-hover-border-color:#9f161b;--bs-btn-focus-shadow-rgb:207,62,67;--bs-btn-active-color:#fff;--bs-btn-active-bg:#9f161b;--bs-btn-active-border-color:#95151a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#c71c22;--bs-btn-disabled-border-color:#c71c22}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#52585d;--bs-btn-hover-border-color:#484e53;--bs-btn-focus-shadow-rgb:82,88,93;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5d6166;--bs-btn-active-border-color:#484e53;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#343a40;--bs-btn-disabled-border-color:#343a40}.btn-outline-primary{--bs-btn-color:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#2fa4e7;--bs-btn-hover-border-color:#2fa4e7;--bs-btn-focus-shadow-rgb:47,164,231;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2fa4e7;--bs-btn-active-border-color:#2fa4e7;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#2fa4e7;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#2fa4e7;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#e9ecef;--bs-btn-hover-border-color:#e9ecef;--bs-btn-focus-shadow-rgb:233,236,239;--bs-btn-active-color:#000;--bs-btn-active-bg:#e9ecef;--bs-btn-active-border-color:#e9ecef;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#e9ecef;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#e9ecef;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#73a839;--bs-btn-hover-border-color:#73a839;--bs-btn-focus-shadow-rgb:115,168,57;--bs-btn-active-color:#fff;--bs-btn-active-bg:#73a839;--bs-btn-active-border-color:#73a839;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#73a839;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#73a839;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033c73;--bs-btn-hover-border-color:#033c73;--bs-btn-focus-shadow-rgb:3,60,115;--bs-btn-active-color:#fff;--bs-btn-active-bg:#033c73;--bs-btn-active-border-color:#033c73;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#033c73;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#033c73;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dd5600;--bs-btn-hover-border-color:#dd5600;--bs-btn-focus-shadow-rgb:221,86,0;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dd5600;--bs-btn-active-border-color:#dd5600;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dd5600;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dd5600;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#c71c22;--bs-btn-hover-border-color:#c71c22;--bs-btn-focus-shadow-rgb:199,28,34;--bs-btn-active-color:#fff;--bs-btn-active-bg:#c71c22;--bs-btn-active-border-color:#c71c22;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#c71c22;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#c71c22;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#343a40;--bs-btn-hover-border-color:#343a40;--bs-btn-focus-shadow-rgb:52,58,64;--bs-btn-active-color:#fff;--bs-btn-active-bg:#343a40;--bs-btn-active-border-color:#343a40;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#343a40;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#343a40;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#868e96;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:78,178,235;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{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{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:#fff;--bs-dropdown-link-hover-bg:#2fa4e7;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#868e96;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.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}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .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}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .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}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.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:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .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{flex-direction:column;align-items:flex-start;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:calc(var(--bs-border-width) * -1)}.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~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#2fa4e7}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2873, 80, 87, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.8);--bs-navbar-hover-color:#fff;--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{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}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-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,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23495057'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2313425c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#97d2f3;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#2fa4e7;--bs-pagination-active-border-color:#2fa4e7;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);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){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#2fa4e7;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@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:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#2fa4e7;--bs-list-group-active-border-color:#2fa4e7;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:#2fa4e7;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{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: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-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;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:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#fff!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(38,131,185,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(237,240,242,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(92,134,46,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(2,48,92,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(177,69,0,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(159,22,27,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(42,46,51,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.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}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.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}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.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}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.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}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!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}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!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:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!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:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!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:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!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:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!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:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar.bg-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.navbar.bg-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.navbar.bg-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.navbar.bg-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.navbar.bg-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.navbar.bg-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.navbar.bg-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.navbar.bg-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.nav-link,.navbar-brand{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn-outline-secondary,.btn-secondary{color:#495057}.btn-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.btn-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.btn-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.btn-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.btn-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.btn-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.btn-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.btn-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.text-secondary{color:#adb5bd!important}.bg-danger .h1,.bg-danger .h2,.bg-danger .h3,.bg-danger .h4,.bg-danger .h5,.bg-danger .h6,.bg-danger h1,.bg-danger h2,.bg-danger h3,.bg-danger h4,.bg-danger h5,.bg-danger h6,.bg-dark .h1,.bg-dark .h2,.bg-dark .h3,.bg-dark .h4,.bg-dark .h5,.bg-dark .h6,.bg-dark h1,.bg-dark h2,.bg-dark h3,.bg-dark h4,.bg-dark h5,.bg-dark h6,.bg-info .h1,.bg-info .h2,.bg-info .h3,.bg-info .h4,.bg-info .h5,.bg-info .h6,.bg-info h1,.bg-info h2,.bg-info h3,.bg-info h4,.bg-info h5,.bg-info h6,.bg-primary .h1,.bg-primary .h2,.bg-primary .h3,.bg-primary .h4,.bg-primary .h5,.bg-primary .h6,.bg-primary h1,.bg-primary h2,.bg-primary h3,.bg-primary h4,.bg-primary h5,.bg-primary h6,.bg-success .h1,.bg-success .h2,.bg-success .h3,.bg-success .h4,.bg-success .h5,.bg-success .h6,.bg-success h1,.bg-success h2,.bg-success h3,.bg-success h4,.bg-success h5,.bg-success h6,.bg-warning .h1,.bg-warning .h2,.bg-warning .h3,.bg-warning .h4,.bg-warning .h5,.bg-warning .h6,.bg-warning h1,.bg-warning h2,.bg-warning h3,.bg-warning h4,.bg-warning h5,.bg-warning h6{color:#fff}.dropdown-menu .dropdown-header{color:#868e96}.badge.bg-light,.badge.bg-secondary{color:#343a40} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/css/bootstrap.min.css.map b/css/bootstrap.min.css.map new file mode 100644 index 0000000..45f3248 --- /dev/null +++ b/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["dist/cerulean/bootstrap.css"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/css/brands.min.css b/css/brands.min.css new file mode 100644 index 0000000..93a9a73 --- /dev/null +++ b/css/brands.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/css/fontawesome.min.css b/css/fontawesome.min.css new file mode 100644 index 0000000..688dd75 --- /dev/null +++ b/css/fontawesome.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/css/solid.min.css b/css/solid.min.css new file mode 100644 index 0000000..7e1fb2d --- /dev/null +++ b/css/solid.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/css/v4-font-face.min.css b/css/v4-font-face.min.css new file mode 100644 index 0000000..dadd6c5 --- /dev/null +++ b/css/v4-font-face.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/develop/ModulPlugin.html b/develop/ModulPlugin.html new file mode 100644 index 0000000..415b86c --- /dev/null +++ b/develop/ModulPlugin.html @@ -0,0 +1,415 @@ + + + + + + + + + + + Eigenes Modul/Plugin schreiben - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+ +
+ +

Eigenes Modul/Plugin schreiben

+

Um ein eigenes Modul oder Plugin zu schreiben, sollte man sich am besten zuerst einmal das das template im entsprechenden Ordner ansehen. Dies kann als Vorlage für das eigene Modul oder Plugin genutzt werden.

+
+

Allgemeine Informationen

+

Im ersten Schritt sollte eine Kopie des jeweiligen Templates (Modul oder Plugin) erstellt werden. Nun sollten im Dateikopf die Angaben angepasst werden.

+
+

Benötigte Methoden überschreiben

+

Modul

+

Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben werden können.

+
    +
  • onLoad() wird direkt beim Import des Moduls ausgeführt
  • +
  • doWork(bwPacket) wird bei der Ausführung aufgerufen
  • +
  • onUnload() wird beim Zerstören der Plugin Modul zum Programmende ausgeführt
  • +
+

Plugin

+

Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können.

+
    +
  • onLoad() wird direkt beim Import des Plugins ausgeführt
  • +
  • setup() wird vor jeder Ausführung gerufen
  • +
  • fms(bwPacket) wird bei einem FMS Paket ausgeführt
  • +
  • pocsag(bwPacket) wird bei einem POCSAG Paket ausgeführt
  • +
  • zvei(bwPacket) wird bei einem ZVEI Packet ausgeführt
  • +
  • msg(bwPacket) wird bei einem Nachrichten Packet ausgeführt
  • +
  • teardown() wird nach jeder Ausführung gerufen
  • +
  • onUnload() wird beim Zerstören der Plugin Instanz zum Programmende ausgeführt
  • +
+
+

Konfiguration

+

Konfiguration anlegen

+

Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert:

+
- type: module              # oder 'plugin'
+  res: template_module      # Name der Python Datei (ohne .py)
+  name: Mein Modul          # optionaler Name
+  config:                   # config-Sektion
+    option1: value 1
+    option2:
+      underOption1: value 21
+      underOption2: value 22
+    list:
+      - list 1
+      - list 2
+
+

Eine entsprechende Dokumentation der Parameter muss in der Dokumentation des jeweiligen Moduls oder Plugins hinterleget werden.

+

Konfiguration verwenden

+

Wird der Instanz eine Konfiguration übergeben wird diese in self.config abgelegt und kann wie folgt abgerufen werden:
+(Dies Ergebnisse beziehen sich auf das Konfigurationsbeispiel oben)

+
    +
  • +

    Einzelnes Feld auslesen
    +self.config.get("option1")

    +
    +

    liefert value 1

    +
    +
  • +
  • +

    Verschachteltes Feld auslesen (beliebige tiefe möglich)
    +self.config.get("option2", "underOption1")

    +
    +

    liefert value 21

    +
    +
  • +
  • +

    Es kann ein Default Wert angegeben werden (falls entsprechender Eintrag fehlt)
    +self.config.get("notSet", default="defValue")

    +
    +

    liefert defValue

    +
    +
  • +
  • +

    Über Listen kann einfach iteriert werden
    +for item in self.config.get(FIELD):

    +
    +

    liefert ein Element je Iteration - hier list 1 und list 2

    +
    +
  • +
+

Wird ein End-Wert ausgelesen, wird dieser direkt zurück gegeben.
+Sollten weitere Unterelemente oder eine Liste exisitieren wird erneut ein Objekt der Klasse Config() zurück gegeben, auf welches wiederum nach obigem Schema zugegriffen werden kann.

+
+

Arbeiten mit dem bwPacket

+

An das Modul bzw. Plugin wird eine Instanz eines BOSWatch-Paket Objekts übergeben.
+Aus dieser kann mittels bwPacket.get(FIELDNAME) das entsprechende Feld ausgelesen werden.
+Mittels bwPacket.set(FIELDNAME, VALUE) kann ein Wert hinzugefügt oder modifiziert werden.
+Eine Auflistung der bereitgestellten Informationen findet sich im entsprechenden BOSWatch Paket Dokumentation.

+

Bitte beachten:

+
    +
  • Selbst vom Modul hinzugefügte Felder müssen in der Modul Dokumentation unter Paket Modifikation aufgeführt werden.
  • +
  • Sollte ein Modul oder Plugin Felder benutzen, welche in einem anderen Modul erstellt werden, muss dies im Punkt Abhänigkeiten des jeweiligen Moduls oder Plugins dokumentiert werden.
  • +
+

Rückgabewert bei Modulen

+

Module können Pakete beliebig verändern. Diese Änderungen werden im Router entsprechend weitergeleitet.

+

Mögliche Rückgabewerte eines Moduls:

+
    +
  • return bwPacket Gibt das modifizierte bwPacket an den Router zurück (Paket Modifikation)
  • +
  • return None Der Router fährt mit dem unveränderten bwPacket fort (Input = Output)
  • +
  • return False Der Router stopt sofort die Ausführung (zB. in Filtern verwendet)
  • +
+

Rückgabewert bei Plugins

+

Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt.
+Die Plugin Basisklasse liefert intern immer ein None an den Router zurück, +was zur weiteren Ausführung des Routers mit dem original Paket führt. Daher macht es in Plugins keinen Sinn ein Paket zu modifizieren.

+
+

Nutzung der Wildcards

+

Es gibt einige vordefinierte Wildcards welche in der BOSWatch Paket Dokumentation zu finden sind.

+

Außerdem sind die folgenden allgemeinen Wildcards definiert:

+
    +
  • {BR} - Zeilenumbruch \r\n
  • +
  • {LPAR} - öffnende Klammer (
  • +
  • {RPAR} - schließende Klammer )
  • +
  • {TIME} - Aktueller Zeitstempel im Format %d.%m.%Y %H:%M:%S
  • +
+

Wildcards registrieren [Module]

+

Module können zusätzliche Wildcards registrieren welche anschließend in den Plugins ebenfalls geparst werden können. +Dies kann über die interne Methode self.registerWildcard(newWildcard, bwPacketField) gemacht werden.

+
    +
  • newWildcard muss im folgenden Format angegeben werden: {WILDCARD}
  • +
  • bwPacketField ist der Name des Feldes im bwPacket - gestezt per bwPacket.set(FIELDNAME, VALUE)
  • +
+

Bitte beachten:

+
    +
  • Selbst vom Modul registrierte Wildcards müssen in der Modul Dokumentation unter Zusätzliche Wildcards aufgeführt werden.
  • +
+

Wildcards parsen [Plugins]

+

Das parsen der Wildcars funktioniert komfortabel über die interne Methode msg = self.parseWildcards(msg).

+
    +
  • msg enstrpicht dabei dem String in welchem die Wildcards ersetzt werden sollen
  • +
+

Die Platzhalter der Wildcards findet man in der BOSWatch Paket Dokumentation.

+

Sollten Module zusätzliche Wildcards registrieren, findet man Informationen dazu in der jeweiligen Modul Dokumentation

+
+

Richtiges Logging

+

tbd ...

+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/develop/packet.html b/develop/packet.html new file mode 100644 index 0000000..b022c3b --- /dev/null +++ b/develop/packet.html @@ -0,0 +1,597 @@ + + + + + + + + + + + BOSWatch Alarmpaket Format - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

BOSWatch Paket Format

+

Ein BOSWatch Datenpaket wird in einem Python Dict abgebildet. In der nachfolgenden Tabelle sind die genutzten Felder abgebildet.

+
+

Allgemeine Informationen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldnameFMSPOCSAGZVEIMSGWildcardBeschreibung
serverNameXXXX{SNAME}Name der BOSWatch Server Instanz
serverVersionXXXX{SVERS}
serverBuildDateXXXX{SDATE}
serverBranchXXXX{SBRCH}
clientNameXXXX{CNAME}Name der BOSWatch Client Instanz
clientIPXXXX{CIP}
clientVersionXXXX{CVERS}
clientBuildDateXXXX{CDATE}
clientBranchXXXX{CBRCH}
inputSourceXXXX{INSRC}(sdr, audio)
timestampXXXX{TIMES}
frequencyXXXX{FREQ}
modeXXXX{MODE}(fms, pocsag, zvei, msg)
+
+

Speziell für POCSAG

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldnameFMSPOCSAGZVEIMSGWildcardBeschreibung
bitrateX{BIT}
ricX{RIC}
subricX{SRIC}(1, 2, 3, 4)
subricTextX{SRICT}(a, b, c, d)
messageXX{MSG}Kann außerdem für ein Message Paket genutzt werden
+
+

Speziell für ZVEI

+ + + + + + + + + + + + + + + + + + + + + + + +
FeldnameFMSPOCSAGZVEIMSGWildcardBeschreibung
toneX{TONE}5-Ton Sequenz nach ZVEI
+
+

Speziell für FMS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldnameFMSPOCSAGZVEIMSGWildcardBeschreibung
fmsX{FMS}
serviceX{SERV}
countryX{COUNT}
locationX{LOC}
vehicleX{VEC}
statusX{STAT}
directionX{DIR}
directionTextX{DIRT}(Fhz->Lst, Lst->Fhz)
tacticalInfoX{TACI}(I, II, III, IV)
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/img/broadcast.drawio b/img/broadcast.drawio new file mode 100644 index 0000000..3976119 --- /dev/null +++ b/img/broadcast.drawio @@ -0,0 +1 @@ +7Vpbb9owFP41PK6K49x4bGm3adrWakzaeJpMYsBdEiNjCuzXzybO1VBCExo2WlVqfGyf2N93bnbTg4No/YGh+ewLDXDYM41g3YO3PdMEwLPFHynZJBIHOolgykigBuWCIfmDldBQ0iUJ8KI0kFMacjIvC30ax9jnJRlijK7KwyY0LL91jqZYEwx9FOrSHyTgs0TqmW4u/4jJdJa+GTj9pCdC6WC1k8UMBXRVEMG7HhwwSnnyFK0HOJTgpbgk897v6c0WxnDM60zof3K/umN0jwfcur8fGeNvv27eKS1PKFyqDavF8k2KAKPLOMBSidGDN6sZ4Xg4R77sXQnOhWzGo1C0gHickDAc0JCy7Vw48Xzs+0K+4Iz+xoWesWdbtlSoFoAZx+u9OwMZXsLQMI0wZxsxRE2wHQWxsjFLbWKVEwYsNWRWIMtMhUgZyTRTneMoHhSUR8BqnhbWAGFvshNWx/fweNIOrMA8N1gdDdYhZmKPGrhi07yMYBmpmMa4AqsSoZBMY9H0BUhCMbyREBIRD65VR0SCQL5mJ2VlUpN3pmFjyyONuYpxEvmkrZYNWqCs6gm2VZOyUzHmaYwNiNzLG2G7faxzwqChcYMDkRFVkzI+o1Mao/Aul1ZQfFxG8xQz0cynfKZ0rnB9xJxv1CC05LTMPV4T/lNqu7JVa1TouV2rF20bm7QRi+0XJsnmqNiXT9u2NrU5TwCRKDxPsgCNLpmPn0u3KoJxxKaYPzewv9tsGA4RJ0/llbRuBEAPtAz7T9uqZkr8M/Xe3by1Gk+B7XTtn0BD/80/2/PP9Ihx0D+dTv1TL9sXYsl8Ob9g1zSMjl0TWDorOA4uL2pWixpgu11T099Hjbw3kNcTiKPLIajqO4KxegS5J0tr+gH59dPa4VRTSGLmUVmsfo46mHogbJh61NQHSuRBLHPavnEFCz+WVzIRCCvUJ+tUSorXTrresq25/bKiJClrirZmlG2vwVWMsa+WvUjXr8bm7l3f1IsZPRbEwbW8zJW4hmixIP7RnqtK1rRIHZXK190la5uFpdGwsCzQY+9gJ5U1DQIV64B2hfU9zqorciuKjHrhozWvr3ED255RGUcYVZZCQCl/5IeixhnkoDGadk1jLPyf4s0YGxijdwbFzX97Zjdh3dBqNSycmqU5qEWkizuzawfD7s/senU4ZhQFPlqc6z8pTsALtM7twG7qdylnUhTmMbGz/J1eNB2OeJ3mb7N6Q+e4L8vf2lWf41wBr5//Oq+bzm3NNgPC5McnpvF98NDLPkYhNL7cGGLCzmOI+5ox5B87A6Q3oofPAHaXMUS7qbSsl8WQajDSFJ04aEC9/PNRnMcK8SSjhRFTFiGpbYU2lxM8ALBL7GTBpGBl2amtYfAQzfyju4Te/NNFePcX \ No newline at end of file diff --git a/img/broadcast.png b/img/broadcast.png new file mode 100644 index 0000000000000000000000000000000000000000..4d93707a82bbe35830e972ee1693da87c43b8c02 GIT binary patch literal 52272 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

pWRHI&`7tNiJas@jp)gCi=#c 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 literal 0 HcmV?d00001 diff --git a/img/client.drawio b/img/client.drawio new file mode 100644 index 0000000..efe7227 --- /dev/null +++ b/img/client.drawio @@ -0,0 +1 @@ +7Vjbcts2EP0aPdrDi0gpj5FsJ9Nxpm7VadMnD0iuSNQgwYJLU+rXFzeSoijJlyhOMq09o9EeAIvdPdhDQhN/mW8+CFJmn3gCbOI5yWbiX008bx5M5acCtgbwZ74BUkETA7k9sKL/gAUdi9Y0gWowETlnSMshGPOigBgHGBGCN8Npa86Gu5YkhRGwigkbo3/QBDObljfr8Y9A06zd2Q3fmZGctJNtJlVGEt7sQP71xF8KztF8yzdLYKp2bV3Mupsjo11gAgp8zoKmWa0XC//q4Sf8rYohvZn/vrqY29hw2yYMiczfmlxgxlNeEHbdowvB6yIB5dWRVj/nlvNSgq4E/wLErSWT1MgllGHO7ChsKH5Wyy/DmTX/1GZgrauNda6N7Y5xB4LmgCBarECx/bxr7HhSZu9KW62vcfFsPSteixhOVKw9hESkgCfmeWaeKufOBpaaD8BlFmIrJwhgBOnj8LgRe2rTbl5PrPxiuX0Bz9bvI2G13WlE/CMIpPLgv2c0LSSEis1Fi96SCNgdryhSrkYjjshzOYHtDcSyooqeBbF+OmDnBPAaGS1g2TWt4mRNGVtyxoWOx1/PY4hjiVco+APsjERSVQK1IhUkodL9FRXSjdm/UAeyW9X2rKeQjJQq13yTKqm6LAAbLh6qS+WF3yNvdJhHj4YqBWxOktmqnm15q3mhNZteQILAQNmudjjOV2I//CZd/uat6T2zNYPvqjW9A60ZMlQNwWUFvDBFXRWDRfuAmbTDbfh3zduBi0qz815OcKflph9svfwKMagMZdUyASRpvcpMDu0u4VEAkXgaqUpSPCtI/3SQpEjUuwTE8jVDx6w+E4JEd5dsLi8kuZKtIqrKYdwmhGFY9PUxCWT363yinrndFvS8aetkT8Y/LvQXZJTX8q0q58VFkZ7KaXQy9pRlqBtNRhFWJdF920jZHWrESNod/Td+GNws1f951NkNn5RnN3DeUp9dd1TGNxDo1wvt9NwCapfecarFzBIV7hHlunsEGKW3q/Y46MJ4PS3Tb6nMnwgtvm9ZXoFWYyPCssUfAPXtrMMqELIrVZXXHRbxqiEYZ52M6/HKXJjijCrxsVLu0KKs0aj7C2Xwxxep6fRpkZq9qUjN/hsvkcEzXyLProFfRE5wVKo6YfilBjl2UDH2eG0vSvFWXtISfSl6okUiw/Nt1AFSDlLN/s/mqnesl7q73LHb3xl6yZ8Gg16ajXspPNBK86/VSe8OkPX/Zdxexhu5nEFV3efy4ZCf5wCE+2IajMXUOXQCghefAGn2P+mZF5H+d1H/+l8= \ No newline at end of file diff --git a/img/client.png b/img/client.png new file mode 100644 index 0000000000000000000000000000000000000000..fea551233ea142846c3e2802bf97b6f7a3fd9665 GIT binary patch literal 28358 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 d(uusmTADa^IT_{sVQkIRw+P3{{t@)y5|4@ literal 0 HcmV?d00001 diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e85006a3ce1c6fd81faa6d5a13095519c4a6fc96 GIT binary patch literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` literal 0 HcmV?d00001 diff --git a/img/grid.png b/img/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..878c3ed5c196539c4e2da35b7787ab08e98b9cca GIT binary patch literal 1458 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>MjUKFR#nCEMj*vm;1OBOz`!jG!i)^F=12fl zLsS+C#C9D4%n8IWc}2f)ZEm(l45;BJwtuC;Xu7MDalsFrAb+- z$t7TS!;J%bz$r0ZA4%9oA5*oBKFCE#E`)d=EDH3$9hZ$hJS^?Fp4#&|GB7Z|@^o^SSJTd6tq0S!DeK!2h*Tl*`P5Yzc8-3Bx*#7*P z_lIZyDoaaS`}OwX=Dx>2?#BS1xgR(Q!d=p|X>EOCN` zXA4VQu*xH8*v`wH|7Kg_&!-n1cjuav&3^o%1B-!38l2qsw5vX{)ww9+?vCFTf>ud~ zg*GO3KC`e=!r@T3xzf`*c)d-IUlfFk;PBjy4K6tmi!A&4@cAEP$Px9s?lqTci7~T+ z-}^{4afY_30{uixxSHt*N>9t^Tda&0H5mQ_1`yCs#p`NH*8Km)_~-KFoNo=!_8c#s zWAa>N-HQ`bo%5fbxey)esBZQ2{nIXNu`Os-bmok|{*PU&?;Wq;K7ViC-rR_~+KOL= zH4)jidxUns0>)Izao*FaI~PF{%uT~Dk@j=8|5Dta{K8wv>d|%Hcb{Lgz3+r2sU6kg zmTAw9&-`i8w14I8wx>P5N6NF;+MlVs*O$JfT6WJou)_P>@A@uXTleG5F;Ur%rwkr} z9Cy=jOL!Yh{`u60)j+55f37_IN$UUe9sghL7uuB@5hwlYz5Q2Eoi? z8|G~6tcc3~n|batFcfpX-rfHA^NYK3=QY>WxaPaUGs?d6cXxkJIsW|O^e4z^d}6ZQ z{XhH5lWzwfnEw0KbC6*c*P{6UH^(HL+Z_Lz)%(e&^e>X(pJ#64-W$DObB_40RoL^? hufEOi_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 \ No newline at end of file diff --git a/img/router.png b/img/router.png new file mode 100644 index 0000000000000000000000000000000000000000..61af27570b6f81c6ca6ff7d1ba72a595280d44e3 GIT binary patch literal 48160 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 W;!XrUeK&9d__?QLpovnq3H^W8E|Cxb literal 0 HcmV?d00001 diff --git a/img/server.drawio b/img/server.drawio new file mode 100644 index 0000000..7273c8c --- /dev/null +++ b/img/server.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/img/server.png b/img/server.png new file mode 100644 index 0000000000000000000000000000000000000000..f19189f0729015384f7ecaeca2a55a4721373883 GIT binary patch literal 45722 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 eCPO50U{x56+wYR^bJWm54pH+|i6g}sN4xs*1 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 + + + + + + + + + + BOSWatch3 Core + + + + + + + + + + + + + +

+ +
+
+
+
+ +

BOSWatch 3

+
+
+![BOSWatch](img/bw3.png "BOSWatch 3 Logo") +
+ +

Es wird darauf hingewiesen, dass für die Teilnahme am BOS-Funk nur nach den Technischen Richtlinien der BOS zugelassene Funkanlagen verwendet werden dürfen. +Der BOS-Funk ist ein nichtöffentlicher mobiler Landfunk. Privatpersonen gehören nicht zum Kreis der berechtigten Funkteilnehmer. (Quelle: TR-BOS)

+
+

The intercept of the German BOS radio is strictly prohibited and will be prosecuted. The use is only permitted for authorized personnel.

+
+
+Falls du uns unterstützen möchtest würden wir uns über eine Spende freuen. +Server, Hosting, Domain sowie Kaffee kosten leider Geld ;-) + +[![](https://www.paypalobjects.com/de_DE/DE/i/btn/btn_donate_LG.gif)](https://www.paypal.me/BSchroll) +
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + + + diff --git a/information/broadcast.html b/information/broadcast.html new file mode 100644 index 0000000..b482752 --- /dev/null +++ b/information/broadcast.html @@ -0,0 +1,288 @@ + + + + + + + + + + + Broadcast Service - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

Broadcast Service

+

Durch den Broadcast Service haben Clients die Möglichkeit, automatisch den Server zu finden und sich mit diesem zu verbinden. Dazu stellt der Server die benötigten Verbinungsinformationen per Broadcast Service bereit.

+

Hinweis: Server und Client müssen sich im selben Subnetz befinden.

+
+

Aufbau

+

Der Broadcast Service besteht aus 2 Teilen - einem Server und einem Clienten.
+Nachfolgend soll der Ablauf einer Verbindung des Clienten zum Server mittels des Broadcast Services erklärt werden.

+
![](../img/broadcast.png)
+ +
+

Ablauf

+

Schritt 1 - Broadcast Server starten

+

Im ersten Schritt wird auf dem Server ein zusätzlicher Broadcast Server in einem seperaten Thread gestartet. Dieser lauscht auf einem festgelegten Port auf UDP Broadcast Pakete. Nun kann eine beliebige Anzahl von Clienten mittels des Broadcast Services die Verbindungsgdaten des Servers abfragen.

+

Schritt 2 - Broadcast durch Clienten

+

Die Client Applikation startet nun zur Abfrage der Verbindungsdaten einen BC Clienten und sendet dort auf dem festgelegten Port ein Paket per UDP Boradcast. Der Inhalt des Paketes ist das Magic-Word <BW3-Request> und wird von allen im selben Subnetz befindlichen Gegenstellen empfangen. Nun wartet der Client auf eine Antwort des Broadcast Server mit den Verbindungsdaten.

+

Schritt 3 - Verbindungsdaten senden

+

Wird nun ein Broadcast Paket empfangen, prüft der BC Server die Daten auf das Magic-Word <BW3-Request>. Wird dieses erkannt, liest der Server die Absender-IP-Addresse aus dem Paket aus und sendet eine Antwort direkt an diesen Clienten. Dieses Antwortpaket sieht folgendermaßen aus: <BW3-Result>;8080 wobei die 8080 hier den normalen TCP Kommunikationsport des Servers darstellt.

+

Schritt 4 - Verbindungsdaten empfangen

+

Nachdem der Client das direkt an ihn gerichtete Paket mit den Verbindungsdaten vom Server empfangen hat, prüft er auf das Magic-Word <BW3-Result>. Ist dieses enthalten wird der Port für die TCP Verbindung aus dem Paket extrahiert. Außerdem wird die IP-Addresse des Absenders aus dem Paket gelesen.
+Anschließend stehen dem Clienten die Verbindungsdaten des Servers zur Verfügung und er kann sich per TCP auf den angegebenen Port mit dem BOSWatch Server verbinden um seine Alarmierungs-Pakete abzusetzen.

+

Da der Broadcast Server in einem eigenen Thread, unabhängig vom Hauptprogram läuft, können ganz einfach weitere Clienten per Broadcast Service die Verbindungsdaten des Servers abrufen.

+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/information/router.html b/information/router.html new file mode 100644 index 0000000..a179161 --- /dev/null +++ b/information/router.html @@ -0,0 +1,360 @@ + + + + + + + + + + + Routing Mechanismus - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

Routing Mechanismus

+

BOSWatch 3 hat einen Routing Mechanismus integriert. Mit diesem ist es auf einfache Weise möglich, den Verlauf von Alarmpaketen zu steuern.

+
+

Ablauf

+

Nachfolgender Ablauf soll am Beispiel eines Alarms mit einem Pocsag Paket erklärt werden.

+
![](../img/router.png)
+ +
    +
  • BOSWatch startet alle Router, welche in der config als alarmRouter konfiguriert worden sind (in diesem Fall nur Router1)
  • +
  • Der Router Router1 beginnt seine Ausführung und arbeitet die einzelnen Routenpunkte sequentiell ab
      +
    • Das Modul descriptor wird aufgerufen und fügt ggf. Beschreibungen zum Paket hinzu
    • +
    • Das Modul doubleFilter wird aufgerufen und blockiert doppelte Alarme
      +(hier würde die Ausführung dieses Routers und damit des kompletten Alarmprozesses stoppen wenn der Alarm als doppelter erkannt würde)
    • +
    • Der Router Router2 wir nun aufgerufen (bis zur Rückkehr aus Router2 ist der Router Router1 angehalten)
    • +
    +
  • +
  • Der Router Router2 beginnt seine Ausführung und arbeitet die einzelnen Routenpunkte sequentiell ab
      +
    • Das Modul modeFilter wird aufgerufen und stoppt den Router da es sich nicht um ein FMS Paket handelt
    • +
    • Es wird zur Ausführung von Router1 zurückgekehrt
    • +
    +
  • +
  • Der Router Router3 beginnt seine Ausführung und arbeitet die einzelnen Routenpunkte sequentiell ab
      +
    • Das Modul modeFilter wird aufgerufen und leitet das Paket weiter da es sich um ein Pocsag Paket handelt
    • +
    • Das Plugin Telegram wird aufgerufen
    • +
    • Das Plugin MySQL wird augerufen
    • +
    • Es wird zur Ausführung von Router1 zurückgekehrt
    • +
    +
  • +
  • Der Router Router1 setzt seine Ausführung fort
      +
    • Das Modul modeFilter wird aufgerufen und stoppt den Router da es sich nicht um ein ZVEI Paket handelt
    • +
    +
  • +
+

Jetzt sind alle Routenpunkte abgearbeitet und die Alarmierung damit abgeschlossen.

+
+

Konfiguration

+

Nachfolgend ist die Router Konfiguration des BW3-Servers für das obige Beispiel zu finden:

+
alarmRouter:
+  - Router1
+
+router:
+  - name: Router1
+    route:
+      - type: module
+        res: descriptor
+        config:
+          [...]
+      - type: module
+        res: filter.doubleFilter
+        config:
+          [...]
+      - type: router
+        res: Router2
+      - type: router
+        res: Router3
+      - type: module
+        res: filter.modeFilter
+        config:
+          allowed:
+            - zvei
+      - type: plugin
+        res: sms
+        config:
+          [...]
+
+  - name: Router2
+    route:
+      - type: module
+        res: filter.modeFilter
+        config:
+          allowed:
+            - fms
+      - type: plugin
+        res: mysql
+        config:
+          [...]
+
+  - name: Router3
+    route:
+      - type: module
+        res: filter.modeFilter
+        config:
+          allowed:
+            - pocsag
+      - type: plugin
+        res: telegram
+        config:
+          [...]
+      - type: plugin
+        res: mysql
+        config:
+          [...]
+
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/information/serverclient.html b/information/serverclient.html new file mode 100644 index 0000000..feb56ab --- /dev/null +++ b/information/serverclient.html @@ -0,0 +1,290 @@ + + + + + + + + + + + Server/Cient Prinzip - BOSWatch3 Core + + + + + + + + + + + + + + + +
+
+
+
+ +

Server/Client Prinzip

+

BOSWatch 3 wurde als Server/Client Anwedung entwickelt.

+

Dies ermöglicht es, mehrere Empfangsstationen an einer Auswerte- und Verteilereinheit zu bündeln.

+
+

BOSWatch Client

+

Der BOSWatch Client übernimmt den Empfang und die Dekodierung der Daten. Anschließend werden die Daten mittels der implemetierten +Dekoder ausgewertet und in ein sogenanntes bwPacket verpackt.

+

Dieses Paket wird anschließend in einer Sende-Queue abgelegt. Nun werden Pakete aus der Queue an den BOSWatch Server per TCP-Socket +gesendet. Der Ansatz, Pakete statt dem direkten versenden vorher in einer Queue zwischen zu speichern, verhindert den Verlust von +Paketen, sollte die Verbindung zum Server einmal abreisen. Nach einer erfolgreichen Wiederverbdingun können die wartenden Pakete nun +nachträglich an den Server übermittelt werden.

+

Dabei überwacht der Client selbstständig die benötigten Programme zum Empfang der Daten und startet diese bei einem Fehler ggf. neu.

+
![](../img/client.png)
+ +
+

BOSWatch Server

+

Nachdem die Daten vom Clienten über die TCP-Socket Verbindung empfangen wurden, übernimmt der BOSWatch Server die weitere +Verarbeitung der Daten.

+

Auch hier werden die empfangenen Daten in From von bwPacket's in einer Queue abelegt um zu gewährleisten, das auch während einer länger +dauernden Plugin Ausführung alle Pakete korrekt empfangen werden können und es zu keinen Verlusten kommt. +Die Verarbeitung der Pakete geschieht anschließend in sogenannten Routern, welche aufgrund ihres Umfangs jedoch in einem eigenen Kapitel +erklärt werden. Diese steuern die Verteilung der Daten an die einzelnen Plugins.

+
![](../img/server.png)
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + diff --git a/js/base.js b/js/base.js new file mode 100644 index 0000000..957ccad --- /dev/null +++ b/js/base.js @@ -0,0 +1,287 @@ +function getSearchTerm() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return sParameterName[1]; + } + } +} + +function applyTopPadding() { + // Update various absolute positions to match where the main container + // starts. This is necessary for handling multi-line nav headers, since + // that pushes the main container down. + var container = document.querySelector('body > .container'); + var offset = container.offsetTop; + + document.documentElement.style.scrollPaddingTop = offset + 'px'; + document.querySelectorAll('.bs-sidebar.affix').forEach(function(sidebar) { + sidebar.style.top = offset + 'px'; + }); +} + +document.addEventListener("DOMContentLoaded", function () { + var search_term = getSearchTerm(); + var search_modal = new bootstrap.Modal(document.getElementById('mkdocs_search_modal')); + var keyboard_modal = new bootstrap.Modal(document.getElementById('mkdocs_keyboard_modal')); + + if (search_term) { + search_modal.show(); + } + + // make sure search input gets autofocus every time modal opens. + document.getElementById('mkdocs_search_modal').addEventListener('shown.bs.modal', function() { + document.getElementById('mkdocs-search-query').focus(); + }); + + // Close search modal when result is selected + // The links get added later so listen to parent + document.getElementById('mkdocs-search-results').addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + search_modal.hide(); + } + }); + + // Populate keyboard modal with proper Keys + document.querySelector('.help.shortcut kbd').innerHTML = keyCodes[shortcuts.help]; + document.querySelector('.prev.shortcut kbd').innerHTML = keyCodes[shortcuts.previous]; + document.querySelector('.next.shortcut kbd').innerHTML = keyCodes[shortcuts.next]; + document.querySelector('.search.shortcut kbd').innerHTML = keyCodes[shortcuts.search]; + + // Keyboard navigation + document.addEventListener("keydown", function(e) { + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return true; + var key = e.which || e.keyCode || window.event && window.event.keyCode; + var page; + switch (key) { + case shortcuts.next: + page = document.querySelector('.navbar a[rel="next"]'); + break; + case shortcuts.previous: + page = document.querySelector('.navbar a[rel="prev"]'); + break; + case shortcuts.search: + e.preventDefault(); + keyboard_modal.hide(); + search_modal.show(); + document.getElementById('mkdocs-search-query').focus(); + break; + case shortcuts.help: + search_modal.hide(); + keyboard_modal.show(); + break; + default: break; + } + if (page && page.hasAttribute('href')) { + keyboard_modal.hide(); + window.location.href = page.getAttribute('href'); + } + }); + + document.querySelectorAll('table').forEach(function(table) { + table.classList.add('table', 'table-striped', 'table-hover'); + }); + + function showInnerDropdown(item) { + var popup = item.nextElementSibling; + popup.classList.add('show'); + item.classList.add('open'); + + // First, close any sibling dropdowns. + var container = item.parentElement.parentElement; + container.querySelectorAll(':scope > .dropdown-submenu > a').forEach(function(el) { + if (el !== item) { + hideInnerDropdown(el); + } + }); + + var popupMargin = 10; + var maxBottom = window.innerHeight - popupMargin; + var bounds = item.getBoundingClientRect(); + + popup.style.left = bounds.right + 'px'; + if (bounds.top + popup.clientHeight > maxBottom && + bounds.top > window.innerHeight / 2) { + popup.style.top = (bounds.bottom - popup.clientHeight) + 'px'; + popup.style.maxHeight = (bounds.bottom - popupMargin) + 'px'; + } else { + popup.style.top = bounds.top + 'px'; + popup.style.maxHeight = (maxBottom - bounds.top) + 'px'; + } + } + + function hideInnerDropdown(item) { + var popup = item.nextElementSibling; + popup.classList.remove('show'); + item.classList.remove('open'); + + popup.scrollTop = 0; + var menu = popup.querySelector('.dropdown-menu'); + if (menu) { + menu.scrollTop = 0; + } + var dropdown = popup.querySelector('.dropdown-submenu > a'); + if (dropdown) { + dropdown.classList.remove('open'); + } + } + + document.querySelectorAll('.dropdown-submenu > a').forEach(function(item) { + item.addEventListener('click', function(e) { + if (item.nextElementSibling.classList.contains('show')) { + hideInnerDropdown(item); + } else { + showInnerDropdown(item); + } + + e.stopPropagation(); + e.preventDefault(); + }); + }); + + document.querySelectorAll('.dropdown-menu').forEach(function(menu) { + menu.parentElement.addEventListener('hide.bs.dropdown', function() { + menu.scrollTop = 0; + var dropdown = menu.querySelector('.dropdown-submenu > a'); + if (dropdown) { + dropdown.classList.remove('open'); + } + menu.querySelectorAll('.dropdown-menu .dropdown-menu').forEach(function(submenu) { + submenu.classList.remove('show'); + }); + }); + }); + + applyTopPadding(); +}); + +window.addEventListener('resize', applyTopPadding); + +var scrollSpy = new bootstrap.ScrollSpy(document.body, { + target: '.bs-sidebar' +}); + +/* Prevent disabled links from causing a page reload */ +document.querySelectorAll("li.disabled a").forEach(function(item) { + item.addEventListener("click", function(event) { + event.preventDefault(); + }); +}); + +// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes +// We only list common keys below. Obscure keys are omitted and their use is discouraged. +var keyCodes = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 19: 'pause/break', + 20: 'caps lock', + 27: 'escape', + 32: 'spacebar', + 33: 'page up', + 34: 'page down', + 35: 'end', + 36: 'home', + 37: '←', + 38: '↑', + 39: '→', + 40: '↓', + 45: 'insert', + 46: 'delete', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 91: 'Left Windows Key / Left ⌘', + 92: 'Right Windows Key', + 93: 'Windows Menu / Right ⌘', + 96: 'numpad 0', + 97: 'numpad 1', + 98: 'numpad 2', + 99: 'numpad 3', + 100: 'numpad 4', + 101: 'numpad 5', + 102: 'numpad 6', + 103: 'numpad 7', + 104: 'numpad 8', + 105: 'numpad 9', + 106: 'multiply', + 107: 'add', + 109: 'subtract', + 110: 'decimal point', + 111: 'divide', + 112: 'f1', + 113: 'f2', + 114: 'f3', + 115: 'f4', + 116: 'f5', + 117: 'f6', + 118: 'f7', + 119: 'f8', + 120: 'f9', + 121: 'f10', + 122: 'f11', + 123: 'f12', + 124: 'f13', + 125: 'f14', + 126: 'f15', + 127: 'f16', + 128: 'f17', + 129: 'f18', + 130: 'f19', + 131: 'f20', + 132: 'f21', + 133: 'f22', + 134: 'f23', + 135: 'f24', + 144: 'num lock', + 145: 'scroll lock', + 186: ';', + 187: '=', + 188: ',', + 189: '‐', + 190: '.', + 191: '?', + 192: '`', + 219: '[', + 220: '\', + 221: ']', + 222: ''', +}; diff --git a/js/bootstrap.bundle.min.js b/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..b1999d9 --- /dev/null +++ b/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/js/bootstrap.bundle.min.js.map b/js/bootstrap.bundle.min.js.map new file mode 100644 index 0000000..7cd8480 --- /dev/null +++ b/js/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null\n }\n\n return selector\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and