|
|
|
@ -35,8 +35,11 @@ config_webrx: configuration options for OpenWebRX
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# configuration version. please only modify if you're able to perform the associated migration steps.
|
|
|
|
|
|
|
|
version = 2
|
|
|
|
|
|
|
|
|
|
|
|
# NOTE: you can find additional information about configuring OpenWebRX in the Wiki:
|
|
|
|
# NOTE: you can find additional information about configuring OpenWebRX in the Wiki:
|
|
|
|
# https://github.com/simonyiszk/openwebrx/wiki
|
|
|
|
# https://github.com/jketterl/openwebrx/wiki/Configuration-guide
|
|
|
|
|
|
|
|
|
|
|
|
# ==== Server settings ====
|
|
|
|
# ==== Server settings ====
|
|
|
|
web_port = 8073
|
|
|
|
web_port = 8073
|
|
|
|
@ -48,6 +51,7 @@ receiver_location = "Philadelphia, PA"
|
|
|
|
receiver_asl = 200
|
|
|
|
receiver_asl = 200
|
|
|
|
receiver_admin = "ku2y@amsat.org"
|
|
|
|
receiver_admin = "ku2y@amsat.org"
|
|
|
|
receiver_gps = (40.0376, -75.3492)
|
|
|
|
receiver_gps = (40.0376, -75.3492)
|
|
|
|
|
|
|
|
receiver_gps = {"lat": 40.0376, "lon": -75.3492}
|
|
|
|
photo_title = "ARISS"
|
|
|
|
photo_title = "ARISS"
|
|
|
|
photo_desc = """
|
|
|
|
photo_desc = """
|
|
|
|
You can add your own background photo and receiver information.<br />
|
|
|
|
You can add your own background photo and receiver information.<br />
|
|
|
|
@ -57,15 +61,6 @@ Antenna: <br />
|
|
|
|
Website: <a href="http://ariss-radio:8073" target="_blank">http://ariss-radio:8073</a>
|
|
|
|
Website: <a href="http://ariss-radio:8073" target="_blank">http://ariss-radio:8073</a>
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# ==== sdr.hu listing ====
|
|
|
|
|
|
|
|
# If you want your ham receiver to be listed publicly on sdr.hu, then take the following steps:
|
|
|
|
|
|
|
|
# 1. Register at: http://sdr.hu/register
|
|
|
|
|
|
|
|
# 2. You will get an unique key by email. Copy it and paste here:
|
|
|
|
|
|
|
|
sdrhu_key = ""
|
|
|
|
|
|
|
|
# 3. Set this setting to True to enable listing:
|
|
|
|
|
|
|
|
sdrhu_public_listing = False
|
|
|
|
|
|
|
|
server_hostname = "localhost"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==== DSP/RX settings ====
|
|
|
|
# ==== DSP/RX settings ====
|
|
|
|
fft_fps = 9
|
|
|
|
fft_fps = 9
|
|
|
|
fft_size = 4096 # Should be power of 2
|
|
|
|
fft_size = 4096 # Should be power of 2
|
|
|
|
@ -96,13 +91,14 @@ Note: if you experience audio underruns while CPU usage is 100%, you can:
|
|
|
|
# ==== I/Q sources ====
|
|
|
|
# ==== I/Q sources ====
|
|
|
|
# (Uncomment the appropriate by removing # characters at the beginning of the corresponding lines.)
|
|
|
|
# (Uncomment the appropriate by removing # characters at the beginning of the corresponding lines.)
|
|
|
|
|
|
|
|
|
|
|
|
#################################################################################################
|
|
|
|
###############################################################################
|
|
|
|
# Is my SDR hardware supported? #
|
|
|
|
# Is my SDR hardware supported? #
|
|
|
|
# Check here: https://github.com/simonyiszk/openwebrx/wiki#guides-for-receiver-hardware-support #
|
|
|
|
# Check here: https://github.com/jketterl/openwebrx/wiki/Supported-Hardware #
|
|
|
|
#################################################################################################
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
|
|
|
# Currently supported types of sdr receivers:
|
|
|
|
# Currently supported types of sdr receivers:
|
|
|
|
# "rtl_sdr", "sdrplay", "hackrf", "airspy", "airspyhf", "fifi_sdr"
|
|
|
|
# "rtl_sdr", "rtl_sdr_soapy", "sdrplay", "hackrf", "airspy", "airspyhf", "fifi_sdr",
|
|
|
|
|
|
|
|
# "perseussdr", "lime_sdr", "pluto_sdr", "soapy_remote"
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# In order to use rtl_sdr, you will need to install librtlsdr-dev and the connector.
|
|
|
|
# In order to use rtl_sdr, you will need to install librtlsdr-dev and the connector.
|
|
|
|
# In order to use sdrplay, airspy or airspyhf, you will need to install soapysdr, the corresponding driver, and the
|
|
|
|
# In order to use sdrplay, airspy or airspyhf, you will need to install soapysdr, the corresponding driver, and the
|
|
|
|
@ -110,8 +106,13 @@ Note: if you experience audio underruns while CPU usage is 100%, you can:
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# https://github.com/jketterl/owrx_connector
|
|
|
|
# https://github.com/jketterl/owrx_connector
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# NOTE: The connector sources have replaced the old piped nmux style of reading input. If you still have any sdrs
|
|
|
|
# In order to use Perseus HF you need to install the libperseus-sdr
|
|
|
|
# configured that have type endin in "_connector", simply remove that suffix.
|
|
|
|
#
|
|
|
|
|
|
|
|
# https://github.com/Microtelecom/libperseus-sdr
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
# and do the proper changes to the sdrs object below
|
|
|
|
|
|
|
|
# (see also Wiki in https://github.com/jketterl/openwebrx/wiki/Sample-configuration-for-Perseus-HF-receiver).
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
|
|
sdrs = {
|
|
|
|
sdrs = {
|
|
|
|
"rtlsdr": {
|
|
|
|
"rtlsdr": {
|
|
|
|
@ -684,160 +685,6 @@ sdrs = {
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
# "rtl_sdr_V3": {
|
|
|
|
|
|
|
|
# "name": "RTL-SDR V3 HF+",
|
|
|
|
|
|
|
|
# "type": "rtl_sdr_soapy",
|
|
|
|
|
|
|
|
# "ppm": 0,
|
|
|
|
|
|
|
|
# "direct_sampling": 2,
|
|
|
|
|
|
|
|
# "profiles": {
|
|
|
|
|
|
|
|
# "20m": {
|
|
|
|
|
|
|
|
# "name": "20m",
|
|
|
|
|
|
|
|
# "center_freq": 14150000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 14070000,
|
|
|
|
|
|
|
|
# "start_mod": "usb",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# "30m": {
|
|
|
|
|
|
|
|
# "name": "30m",
|
|
|
|
|
|
|
|
# "center_freq": 10125000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 10142000,
|
|
|
|
|
|
|
|
# "start_mod": "usb",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# "40m": {
|
|
|
|
|
|
|
|
# "name": "40m",
|
|
|
|
|
|
|
|
# "center_freq": 7100000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 7070000,
|
|
|
|
|
|
|
|
# "start_mod": "lsb",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# "80m": {
|
|
|
|
|
|
|
|
# "name": "80m",
|
|
|
|
|
|
|
|
# "center_freq": 3650000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 3570000,
|
|
|
|
|
|
|
|
# "start_mod": "lsb",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# "160m": {
|
|
|
|
|
|
|
|
# "name": "160m",
|
|
|
|
|
|
|
|
# "center_freq": 1900000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 1840000,
|
|
|
|
|
|
|
|
# "start_mod": "lsb",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# "49m": {
|
|
|
|
|
|
|
|
# "name": "49m Broadcast",
|
|
|
|
|
|
|
|
# "center_freq": 6000000,
|
|
|
|
|
|
|
|
# "rf_gain": 10,
|
|
|
|
|
|
|
|
# "samp_rate": 2400000,
|
|
|
|
|
|
|
|
# "start_freq": 6070000,
|
|
|
|
|
|
|
|
# "start_mod": "am",
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
# },
|
|
|
|
|
|
|
|
"airspy": {
|
|
|
|
|
|
|
|
"name": "Airspy HF+",
|
|
|
|
|
|
|
|
"type": "airspyhf",
|
|
|
|
|
|
|
|
"ppm": 0,
|
|
|
|
|
|
|
|
"profiles": {
|
|
|
|
|
|
|
|
"20m": {
|
|
|
|
|
|
|
|
"name": "20m",
|
|
|
|
|
|
|
|
"center_freq": 14150000,
|
|
|
|
|
|
|
|
"rf_gain": 10,
|
|
|
|
|
|
|
|
"samp_rate": 768000,
|
|
|
|
|
|
|
|
"start_freq": 14070000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"30m": {
|
|
|
|
|
|
|
|
"name": "30m",
|
|
|
|
|
|
|
|
"center_freq": 10125000,
|
|
|
|
|
|
|
|
"rf_gain": 10,
|
|
|
|
|
|
|
|
"samp_rate": 192000,
|
|
|
|
|
|
|
|
"start_freq": 10142000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"40m": {
|
|
|
|
|
|
|
|
"name": "40m",
|
|
|
|
|
|
|
|
"center_freq": 7100000,
|
|
|
|
|
|
|
|
"rf_gain": 10,
|
|
|
|
|
|
|
|
"samp_rate": 256000,
|
|
|
|
|
|
|
|
"start_freq": 7070000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"80m": {
|
|
|
|
|
|
|
|
"name": "80m",
|
|
|
|
|
|
|
|
"center_freq": 3650000,
|
|
|
|
|
|
|
|
"rf_gain": 10,
|
|
|
|
|
|
|
|
"samp_rate": 768000,
|
|
|
|
|
|
|
|
"start_freq": 3570000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"49m": {
|
|
|
|
|
|
|
|
"name": "49m Broadcast",
|
|
|
|
|
|
|
|
"center_freq": 6000000,
|
|
|
|
|
|
|
|
"rf_gain": 10,
|
|
|
|
|
|
|
|
"samp_rate": 768000,
|
|
|
|
|
|
|
|
"start_freq": 6070000,
|
|
|
|
|
|
|
|
"start_mod": "am",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"sdrplay": {
|
|
|
|
|
|
|
|
"name": "SDRPlay RSP2",
|
|
|
|
|
|
|
|
"type": "sdrplay",
|
|
|
|
|
|
|
|
"ppm": 0,
|
|
|
|
|
|
|
|
"profiles": {
|
|
|
|
|
|
|
|
"20m": {
|
|
|
|
|
|
|
|
"name": "20m",
|
|
|
|
|
|
|
|
"center_freq": 14150000,
|
|
|
|
|
|
|
|
"rf_gain": 0,
|
|
|
|
|
|
|
|
"samp_rate": 500000,
|
|
|
|
|
|
|
|
"start_freq": 14070000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
"antenna": "Antenna A",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"30m": {
|
|
|
|
|
|
|
|
"name": "30m",
|
|
|
|
|
|
|
|
"center_freq": 10125000,
|
|
|
|
|
|
|
|
"rf_gain": 0,
|
|
|
|
|
|
|
|
"samp_rate": 250000,
|
|
|
|
|
|
|
|
"start_freq": 10142000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"40m": {
|
|
|
|
|
|
|
|
"name": "40m",
|
|
|
|
|
|
|
|
"center_freq": 7100000,
|
|
|
|
|
|
|
|
"rf_gain": 0,
|
|
|
|
|
|
|
|
"samp_rate": 500000,
|
|
|
|
|
|
|
|
"start_freq": 7070000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
"antenna": "Antenna A",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"80m": {
|
|
|
|
|
|
|
|
"name": "80m",
|
|
|
|
|
|
|
|
"center_freq": 3650000,
|
|
|
|
|
|
|
|
"rf_gain": 0,
|
|
|
|
|
|
|
|
"samp_rate": 500000,
|
|
|
|
|
|
|
|
"start_freq": 3570000,
|
|
|
|
|
|
|
|
"start_mod": "usb",
|
|
|
|
|
|
|
|
"antenna": "Antenna A",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"49m": {
|
|
|
|
|
|
|
|
"name": "49m Broadcast",
|
|
|
|
|
|
|
|
"center_freq": 6000000,
|
|
|
|
|
|
|
|
"rf_gain": 0,
|
|
|
|
|
|
|
|
"samp_rate": 500000,
|
|
|
|
|
|
|
|
"start_freq": 6070000,
|
|
|
|
|
|
|
|
"start_mod": "am",
|
|
|
|
|
|
|
|
"antenna": "Antenna A",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# ==== Color themes ====
|
|
|
|
# ==== Color themes ====
|
|
|
|
@ -848,21 +695,21 @@ sdrs = {
|
|
|
|
waterfall_colors = [0x000000FF, 0x0000FFFF, 0x00FFFFFF, 0x00FF00FF, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFFFFFFFF]
|
|
|
|
waterfall_colors = [0x000000FF, 0x0000FFFF, 0x00FFFFFF, 0x00FF00FF, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFFFFFFFF]
|
|
|
|
waterfall_min_level = -88 # in dB
|
|
|
|
waterfall_min_level = -88 # in dB
|
|
|
|
waterfall_max_level = -20
|
|
|
|
waterfall_max_level = -20
|
|
|
|
waterfall_auto_level_margin = (5, 40)
|
|
|
|
waterfall_auto_level_margin = {"min": 5, "max": 40}
|
|
|
|
### old theme by HA7ILM:
|
|
|
|
### old theme by HA7ILM:
|
|
|
|
# waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]"
|
|
|
|
# waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]"
|
|
|
|
# waterfall_min_level = -115 #in dB
|
|
|
|
# waterfall_min_level = -115 #in dB
|
|
|
|
# waterfall_max_level = 0
|
|
|
|
# waterfall_max_level = 0
|
|
|
|
# waterfall_auto_level_margin = (20, 30)
|
|
|
|
# waterfall_auto_level_margin = {"min": 20, "max": 30}
|
|
|
|
##For the old colors, you might also want to set [fft_voverlap_factor] to 0.
|
|
|
|
##For the old colors, you might also want to set [fft_voverlap_factor] to 0.
|
|
|
|
|
|
|
|
|
|
|
|
# Note: When the auto waterfall level button is clicked, the following happens:
|
|
|
|
# Note: When the auto waterfall level button is clicked, the following happens:
|
|
|
|
# [waterfall_min_level] = [current_min_power_level] - [waterfall_auto_level_margin[0]]
|
|
|
|
# [waterfall_min_level] = [current_min_power_level] - [waterfall_auto_level_margin["min"]]
|
|
|
|
# [waterfall_max_level] = [current_max_power_level] + [waterfall_auto_level_margin[1]]
|
|
|
|
# [waterfall_max_level] = [current_max_power_level] + [waterfall_auto_level_margin["max"]]
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# ___|____________________________________|____________________________________|____________________________________|___> signal power
|
|
|
|
# ___|________________________________________|____________________________________|________________________________________|___> signal power
|
|
|
|
# \_waterfall_auto_level_margin[0]_/ |__ current_min_power_level | \_waterfall_auto_level_margin[1]_/
|
|
|
|
# \_waterfall_auto_level_margin["min"]_/ |__ current_min_power_level | \_waterfall_auto_level_margin["max"]_/
|
|
|
|
# current_max_power_level __|
|
|
|
|
# current_max_power_level __|
|
|
|
|
|
|
|
|
|
|
|
|
# === Experimental settings ===
|
|
|
|
# === Experimental settings ===
|
|
|
|
# Warning! The settings below are very experimental.
|
|
|
|
# Warning! The settings below are very experimental.
|
|
|
|
@ -879,23 +726,29 @@ google_maps_api_key = ""
|
|
|
|
# in seconds; default: 2 hours
|
|
|
|
# in seconds; default: 2 hours
|
|
|
|
map_position_retention_time = 2 * 60 * 60
|
|
|
|
map_position_retention_time = 2 * 60 * 60
|
|
|
|
|
|
|
|
|
|
|
|
# wsjt decoder queue configuration
|
|
|
|
# decoder queue configuration
|
|
|
|
# due to the nature of the wsjt operating modes (ft8, ft8, jt9, jt65 and wspr), the data is recorded for a given amount
|
|
|
|
# due to the nature of some operating modes (ft8, ft8, jt9, jt65, wspr and js8), the data is recorded for a given amount
|
|
|
|
# of time (6.5 seconds up to 2 minutes) and decoded at the end. this can lead to very high peak loads.
|
|
|
|
# of time (6 seconds up to 2 minutes) and decoded at the end. this can lead to very high peak loads.
|
|
|
|
# to mitigate this, the recordings will be queued and processed in sequence.
|
|
|
|
# to mitigate this, the recordings will be queued and processed in sequence.
|
|
|
|
# the number of workers will limit the total amount of work (one worker will losely occupy one cpu / thread)
|
|
|
|
# the number of workers will limit the total amount of work (one worker will losely occupy one cpu / thread)
|
|
|
|
wsjt_queue_workers = 2
|
|
|
|
decoding_queue_workers = 2
|
|
|
|
# the maximum queue length will cause decodes to be dumped if the workers cannot keep up
|
|
|
|
# the maximum queue length will cause decodes to be dumped if the workers cannot keep up
|
|
|
|
# if you are running background services, make sure this number is high enough to accept the task influx during peaks
|
|
|
|
# if you are running background services, make sure this number is high enough to accept the task influx during peaks
|
|
|
|
# i.e. this should be higher than the number of wsjt services running at the same time
|
|
|
|
# i.e. this should be higher than the number of decoding services running at the same time
|
|
|
|
wsjt_queue_length = 10
|
|
|
|
decoding_queue_length = 10
|
|
|
|
|
|
|
|
|
|
|
|
# wsjt decoding depth will allow more results, but will also consume more cpu
|
|
|
|
# wsjt decoding depth will allow more results, but will also consume more cpu
|
|
|
|
wsjt_decoding_depth = 3
|
|
|
|
wsjt_decoding_depth = 3
|
|
|
|
# can also be set for each mode separately
|
|
|
|
# can also be set for each mode separately
|
|
|
|
# jt65 seems to be somewhat prone to erroneous decodes, this setting handles that to some extent
|
|
|
|
# jt65 seems to be somewhat prone to erroneous decodes, this setting handles that to some extent
|
|
|
|
wsjt_decoding_depths = {"jt65": 1}
|
|
|
|
wsjt_decoding_depths = {"jt65": 1}
|
|
|
|
|
|
|
|
|
|
|
|
temporary_directory = "/tmp"
|
|
|
|
# JS8 comes in different speeds: normal, slow, fast, turbo. This setting controls which ones are enabled.
|
|
|
|
|
|
|
|
js8_enabled_profiles = ["normal", "slow"]
|
|
|
|
|
|
|
|
# JS8 decoding depth; higher value will get more results, but will also consume more cpu
|
|
|
|
|
|
|
|
js8_decoding_depth = 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temporary_directory = "/tmp/openwebrx"
|
|
|
|
|
|
|
|
|
|
|
|
services_enabled = False
|
|
|
|
services_enabled = False
|
|
|
|
services_decoders = ["ft8", "ft4", "wspr", "packet"]
|
|
|
|
services_decoders = ["ft8", "ft4", "wspr", "packet"]
|
|
|
|
@ -917,3 +770,8 @@ aprs_symbols_path = "/opt/aprs-symbols/png"
|
|
|
|
# this also uses the receiver_gps setting from above, so make sure it contains a correct locator
|
|
|
|
# this also uses the receiver_gps setting from above, so make sure it contains a correct locator
|
|
|
|
pskreporter_enabled = False
|
|
|
|
pskreporter_enabled = False
|
|
|
|
pskreporter_callsign = "N0CALL"
|
|
|
|
pskreporter_callsign = "N0CALL"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# === Web admin settings ===
|
|
|
|
|
|
|
|
# this feature is experimental at the moment. it should not be enabled on shared receivers since it allows remote
|
|
|
|
|
|
|
|
# changes to the receiver settings. enable for testing in controlled environment only.
|
|
|
|
|
|
|
|
# webadmin_enabled = False
|
|
|
|
|